@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,59 @@
1
+ // src/core/sheet-renamer.ts
2
+ import { parseFormula } from "../parser/parser.mjs";
3
+ import { astToString } from "../parser/formatter.mjs";
4
+ import { transformAST } from "./ast-traverser.mjs";
5
+ function renameSheetInFormula(options) {
6
+ const { formula, oldSheetName, newSheetName } = options;
7
+ try {
8
+ const ast = parseFormula(formula);
9
+ const updatedAst = transformAST(ast, (node) => {
10
+ if (node.type === "reference" && node.sheetName === oldSheetName) {
11
+ return {
12
+ ...node,
13
+ sheetName: newSheetName
14
+ };
15
+ }
16
+ if (node.type === "range" && node.sheetName === oldSheetName) {
17
+ return {
18
+ ...node,
19
+ sheetName: newSheetName
20
+ };
21
+ }
22
+ return node;
23
+ });
24
+ return astToString(updatedAst);
25
+ } catch (error) {
26
+ return formula;
27
+ }
28
+ }
29
+ function formulaReferencesSheet(formula, sheetName) {
30
+ try {
31
+ const ast = parseFormula(formula);
32
+ const referencedSheets = getReferencedSheetNames(formula);
33
+ return referencedSheets.includes(sheetName);
34
+ } catch (error) {
35
+ return false;
36
+ }
37
+ }
38
+ function getReferencedSheetNames(formula) {
39
+ try {
40
+ const ast = parseFormula(formula);
41
+ const sheetNames = new Set;
42
+ transformAST(ast, (node) => {
43
+ if ((node.type === "reference" || node.type === "range") && node.sheetName) {
44
+ sheetNames.add(node.sheetName);
45
+ }
46
+ return node;
47
+ });
48
+ return Array.from(sheetNames);
49
+ } catch (error) {
50
+ return [];
51
+ }
52
+ }
53
+ export {
54
+ renameSheetInFormula,
55
+ getReferencedSheetNames,
56
+ formulaReferencesSheet
57
+ };
58
+
59
+ //# debugId=0B6036BCDD11B7B564756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/core/sheet-renamer.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Sheet renamer utility for updating cross-sheet references in formulas\n */\n\nimport { parseFormula } from \"../parser/parser.mjs\";\nimport { astToString } from \"../parser/formatter.mjs\";\nimport { transformAST } from \"./ast-traverser.mjs\";\nimport type { ASTNode } from \"../parser/ast.mjs\";\n\n/**\n * Renames sheet references in a formula string\n * @param formula The formula string (without the leading =)\n * @param oldSheetName The old sheet name to replace\n * @param newSheetName The new sheet name to use\n * @returns The updated formula string\n */\nexport function renameSheetInFormula(options: {\n formula: string,\n oldSheetName: string;\n newSheetName: string;\n}): string {\n const { formula, oldSheetName, newSheetName } = options;\n try {\n const ast = parseFormula(formula);\n \n const updatedAst = transformAST(ast, (node) => {\n // Handle regular cross-sheet references (e.g., Sheet1!A1)\n if (node.type === \"reference\" && node.sheetName === oldSheetName) {\n return {\n ...node,\n sheetName: newSheetName,\n };\n }\n \n // Handle range references with sheet names (e.g., Sheet1!A1:B2)\n if (node.type === \"range\" && node.sheetName === oldSheetName) {\n return {\n ...node,\n sheetName: newSheetName,\n };\n }\n \n return node;\n });\n \n return astToString(updatedAst);\n } catch (error) {\n // If parsing fails, return the original formula\n return formula;\n }\n}\n\n/**\n * Checks if a formula references a specific sheet\n * @param formula The formula string (without the leading =)\n * @param sheetName The sheet name to check for\n * @returns True if the formula references the sheet\n */\nexport function formulaReferencesSheet(formula: string, sheetName: string): boolean {\n try {\n const ast = parseFormula(formula);\n const referencedSheets = getReferencedSheetNames(formula);\n return referencedSheets.includes(sheetName);\n } catch (error) {\n // If parsing fails, assume no reference\n return false;\n }\n}\n\n/**\n * Gets all sheet names referenced in a formula\n * @param formula The formula string (without the leading =)\n * @returns Array of unique sheet names referenced in the formula\n */\nexport function getReferencedSheetNames(formula: string): string[] {\n try {\n const ast = parseFormula(formula);\n const sheetNames = new Set<string>();\n\n transformAST(ast, (node) => {\n // Handle cross-sheet references\n if ((node.type === \"reference\" || node.type === \"range\") && node.sheetName) {\n sheetNames.add(node.sheetName);\n }\n \n return node;\n });\n\n return Array.from(sheetNames);\n } catch (error) {\n // If parsing fails, return empty array\n return [];\n }\n}\n\n"
6
+ ],
7
+ "mappings": ";AAIA;AACA;AACA;AAUO,SAAS,oBAAoB,CAAC,SAI1B;AAAA,EACT,QAAQ,SAAS,cAAc,iBAAiB;AAAA,EAChD,IAAI;AAAA,IACF,MAAM,MAAM,aAAa,OAAO;AAAA,IAEhC,MAAM,aAAa,aAAa,KAAK,CAAC,SAAS;AAAA,MAE7C,IAAI,KAAK,SAAS,eAAe,KAAK,cAAc,cAAc;AAAA,QAChE,OAAO;AAAA,aACF;AAAA,UACH,WAAW;AAAA,QACb;AAAA,MACF;AAAA,MAGA,IAAI,KAAK,SAAS,WAAW,KAAK,cAAc,cAAc;AAAA,QAC5D,OAAO;AAAA,aACF;AAAA,UACH,WAAW;AAAA,QACb;AAAA,MACF;AAAA,MAEA,OAAO;AAAA,KACR;AAAA,IAED,OAAO,YAAY,UAAU;AAAA,IAC7B,OAAO,OAAO;AAAA,IAEd,OAAO;AAAA;AAAA;AAUJ,SAAS,sBAAsB,CAAC,SAAiB,WAA4B;AAAA,EAClF,IAAI;AAAA,IACF,MAAM,MAAM,aAAa,OAAO;AAAA,IAChC,MAAM,mBAAmB,wBAAwB,OAAO;AAAA,IACxD,OAAO,iBAAiB,SAAS,SAAS;AAAA,IAC1C,OAAO,OAAO;AAAA,IAEd,OAAO;AAAA;AAAA;AASJ,SAAS,uBAAuB,CAAC,SAA2B;AAAA,EACjE,IAAI;AAAA,IACF,MAAM,MAAM,aAAa,OAAO;AAAA,IAChC,MAAM,aAAa,IAAI;AAAA,IAEvB,aAAa,KAAK,CAAC,SAAS;AAAA,MAE1B,KAAK,KAAK,SAAS,eAAe,KAAK,SAAS,YAAY,KAAK,WAAW;AAAA,QAC1E,WAAW,IAAI,KAAK,SAAS;AAAA,MAC/B;AAAA,MAEA,OAAO;AAAA,KACR;AAAA,IAED,OAAO,MAAM,KAAK,UAAU;AAAA,IAC5B,OAAO,OAAO;AAAA,IAEd,OAAO,CAAC;AAAA;AAAA;",
8
+ "debugId": "0B6036BCDD11B7B564756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,8 @@
1
+ // src/core/sheet-utils.ts
2
+ class SheetUtils {
3
+ }
4
+ export {
5
+ SheetUtils
6
+ };
7
+
8
+ //# debugId=B68229AE11460E9B64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/core/sheet-utils.ts"],
4
+ "sourcesContent": [
5
+ "export class SheetUtils {\n \n}"
6
+ ],
7
+ "mappings": ";AAAO,MAAM,WAAW;AAExB;",
8
+ "debugId": "B68229AE11460E9B64756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,58 @@
1
+ // src/core/table-renamer.ts
2
+ import { parseFormula } from "../parser/parser.mjs";
3
+ import { astToString } from "../parser/formatter.mjs";
4
+ import { transformAST } from "./ast-traverser.mjs";
5
+ function renameTableInFormula(formula, oldTableName, newTableName) {
6
+ try {
7
+ const ast = parseFormula(formula);
8
+ const transformedAST = transformAST(ast, (node) => {
9
+ if (node.type === "structured-reference" && node.tableName === oldTableName) {
10
+ return {
11
+ ...node,
12
+ tableName: newTableName
13
+ };
14
+ }
15
+ return node;
16
+ });
17
+ return astToString(transformedAST);
18
+ } catch (error) {
19
+ return formula;
20
+ }
21
+ }
22
+ function formulaReferencesTable(formula, tableName) {
23
+ try {
24
+ const ast = parseFormula(formula);
25
+ let hasReference = false;
26
+ transformAST(ast, (node) => {
27
+ if (node.type === "structured-reference" && node.tableName === tableName) {
28
+ hasReference = true;
29
+ }
30
+ return node;
31
+ });
32
+ return hasReference;
33
+ } catch (error) {
34
+ return false;
35
+ }
36
+ }
37
+ function getReferencedTableNames(formula) {
38
+ try {
39
+ const ast = parseFormula(formula);
40
+ const tableNames = new Set;
41
+ transformAST(ast, (node) => {
42
+ if (node.type === "structured-reference" && node.tableName) {
43
+ tableNames.add(node.tableName);
44
+ }
45
+ return node;
46
+ });
47
+ return Array.from(tableNames);
48
+ } catch (error) {
49
+ return [];
50
+ }
51
+ }
52
+ export {
53
+ renameTableInFormula,
54
+ getReferencedTableNames,
55
+ formulaReferencesTable
56
+ };
57
+
58
+ //# debugId=282767C4AEBEE9EC64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/core/table-renamer.ts"],
4
+ "sourcesContent": [
5
+ "import { parseFormula } from \"../parser/parser.mjs\";\nimport { astToString } from \"../parser/formatter.mjs\";\nimport { transformAST } from \"./ast-traverser.mjs\";\n\n/**\n * Renames table references in a formula string\n * @param formula - The formula string (without the leading =)\n * @param oldTableName - The current table name to replace\n * @param newTableName - The new table name\n * @returns The updated formula string, or the original if no changes were made\n */\nexport function renameTableInFormula(\n formula: string,\n oldTableName: string,\n newTableName: string\n): string {\n try {\n const ast = parseFormula(formula);\n \n const transformedAST = transformAST(ast, (node) => {\n if (node.type === \"structured-reference\" && node.tableName === oldTableName) {\n return {\n ...node,\n tableName: newTableName\n };\n }\n return node;\n });\n\n return astToString(transformedAST);\n } catch (error) {\n // If parsing fails, return the original formula\n return formula;\n }\n}\n\n/**\n * Checks if a formula contains references to a specific table\n * @param formula - The formula string (without the leading =)\n * @param tableName - The table name to search for\n * @returns True if the formula contains references to the table\n */\nexport function formulaReferencesTable(formula: string, tableName: string): boolean {\n try {\n const ast = parseFormula(formula);\n let hasReference = false;\n\n transformAST(ast, (node) => {\n if (node.type === \"structured-reference\" && node.tableName === tableName) {\n hasReference = true;\n }\n return node;\n });\n\n return hasReference;\n } catch (error) {\n // If parsing fails, assume no reference\n return false;\n }\n}\n\n/**\n * Gets all table names referenced in a formula\n * @param formula - The formula string (without the leading =)\n * @returns Array of unique table names referenced in the formula\n */\nexport function getReferencedTableNames(formula: string): string[] {\n try {\n const ast = parseFormula(formula);\n const tableNames = new Set<string>();\n\n transformAST(ast, (node) => {\n if (node.type === \"structured-reference\" && node.tableName) {\n tableNames.add(node.tableName);\n }\n return node;\n });\n\n return Array.from(tableNames);\n } catch (error) {\n // If parsing fails, return empty array\n return [];\n }\n}\n"
6
+ ],
7
+ "mappings": ";AAAA;AACA;AACA;AASO,SAAS,oBAAoB,CAClC,SACA,cACA,cACQ;AAAA,EACR,IAAI;AAAA,IACF,MAAM,MAAM,aAAa,OAAO;AAAA,IAEhC,MAAM,iBAAiB,aAAa,KAAK,CAAC,SAAS;AAAA,MACjD,IAAI,KAAK,SAAS,0BAA0B,KAAK,cAAc,cAAc;AAAA,QAC3E,OAAO;AAAA,aACF;AAAA,UACH,WAAW;AAAA,QACb;AAAA,MACF;AAAA,MACA,OAAO;AAAA,KACR;AAAA,IAED,OAAO,YAAY,cAAc;AAAA,IACjC,OAAO,OAAO;AAAA,IAEd,OAAO;AAAA;AAAA;AAUJ,SAAS,sBAAsB,CAAC,SAAiB,WAA4B;AAAA,EAClF,IAAI;AAAA,IACF,MAAM,MAAM,aAAa,OAAO;AAAA,IAChC,IAAI,eAAe;AAAA,IAEnB,aAAa,KAAK,CAAC,SAAS;AAAA,MAC1B,IAAI,KAAK,SAAS,0BAA0B,KAAK,cAAc,WAAW;AAAA,QACxE,eAAe;AAAA,MACjB;AAAA,MACA,OAAO;AAAA,KACR;AAAA,IAED,OAAO;AAAA,IACP,OAAO,OAAO;AAAA,IAEd,OAAO;AAAA;AAAA;AASJ,SAAS,uBAAuB,CAAC,SAA2B;AAAA,EACjE,IAAI;AAAA,IACF,MAAM,MAAM,aAAa,OAAO;AAAA,IAChC,MAAM,aAAa,IAAI;AAAA,IAEvB,aAAa,KAAK,CAAC,SAAS;AAAA,MAC1B,IAAI,KAAK,SAAS,0BAA0B,KAAK,WAAW;AAAA,QAC1D,WAAW,IAAI,KAAK,SAAS;AAAA,MAC/B;AAAA,MACA,OAAO;AAAA,KACR;AAAA,IAED,OAAO,MAAM,KAAK,UAAU;AAAA,IAC5B,OAAO,OAAO;AAAA,IAEd,OAAO,CAAC;AAAA;AAAA;",
8
+ "debugId": "282767C4AEBEE9EC64756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,18 @@
1
+ // src/core/types.ts
2
+ var FormulaError;
3
+ ((FormulaError2) => {
4
+ FormulaError2["DIV0"] = "#DIV/0!";
5
+ FormulaError2["NA"] = "#N/A";
6
+ FormulaError2["NAME"] = "#NAME?";
7
+ FormulaError2["NUM"] = "#NUM!";
8
+ FormulaError2["REF"] = "#REF!";
9
+ FormulaError2["VALUE"] = "#VALUE!";
10
+ FormulaError2["CYCLE"] = "#CYCLE!";
11
+ FormulaError2["ERROR"] = "#ERROR!";
12
+ FormulaError2["SPILL"] = "#SPILL!";
13
+ })(FormulaError ||= {});
14
+ export {
15
+ FormulaError
16
+ };
17
+
18
+ //# debugId=0E7C5AF634572D3964756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/core/types.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Core type definitions for FormulaEngine\n * This file contains all fundamental types used throughout the engine\n */\n\nimport type { ASTNode, FunctionNode } from \"src/parser/ast\";\nimport type { FormulaEngine } from \"./engine.mjs\";\nimport type { FormulaEvaluator } from \"src/evaluator/formula-evaluator\";\nimport type { EvaluationContext } from \"src/evaluator/evaluation-context\";\nimport type { CellValueNode } from \"src/evaluator/dependency-nodes/cell-value-node\";\nimport type { EmptyCellEvaluationNode } from \"src/evaluator/dependency-nodes/empty-cell-evaluation-node\";\nimport type { RangeEvaluationNode } from \"src/evaluator/range-evaluation-node\";\nimport type { DependencyNode } from \"./managers/dependency-node.mjs\";\nimport type { LookupOrder } from \"./managers/range-eval-order-builder.mjs\";\n\n// Cell addressing types\nexport interface CellAddress {\n sheetName: string;\n workbookName: string;\n colIndex: number;\n rowIndex: number;\n}\n\nexport interface RangeAddress {\n sheetName: string;\n workbookName: string;\n range: SpreadsheetRange;\n}\n\nexport interface LocalCellAddress {\n colIndex: number;\n rowIndex: number;\n}\n\nexport type ArethmeticEvaluator = (\n left: CellValue,\n right: CellValue,\n context: EvaluationContext\n) => CellValue | ErrorEvaluationResult;\n\nexport type PositiveInfinity = {\n type: \"infinity\";\n sign: \"positive\";\n};\n\nexport type CellInfinity = {\n type: \"infinity\";\n sign: \"positive\" | \"negative\";\n};\n\nexport type CellNumber = {\n type: \"number\";\n value: number;\n};\n\nexport type SpreadsheetRangeEnd = CellNumber | PositiveInfinity;\n\nexport type SpreadsheetRange = {\n start: {\n col: number;\n row: number;\n };\n end: {\n col: SpreadsheetRangeEnd;\n row: SpreadsheetRangeEnd;\n };\n};\n\nexport type RelativeRange = {\n start: {\n col: number;\n row: number;\n };\n width: SpreadsheetRangeEnd;\n height: SpreadsheetRangeEnd;\n};\n\nexport type FiniteSpreadsheetRange = {\n start: {\n col: number;\n row: number;\n };\n end: {\n col: number;\n row: number;\n };\n};\n\nexport type CellString = {\n type: \"string\";\n value: string;\n};\n\nexport type CellBoolean = {\n type: \"boolean\";\n value: boolean;\n};\n\n// Cell value types\nexport type CellValue = CellNumber | CellString | CellBoolean | CellInfinity;\n/**\n * undefined and \"\" are considered empty values\n * undefineds are converted to \"\" in the engine\n *\n * any empty values are deleted from the sheet content\n */\nexport type SerializedCellValue = string | number | boolean | undefined;\n\n// Named expressions\nexport interface NamedExpression {\n name: string;\n expression: string;\n}\n\nexport interface TableDefinition {\n name: string;\n start: {\n rowIndex: number;\n colIndex: number;\n };\n headers: Map<string, { name: string; index: number }>;\n endRow: SpreadsheetRangeEnd;\n sheetName: string;\n workbookName: string;\n}\n\n// Formula errors\nexport enum FormulaError {\n DIV0 = \"#DIV/0!\",\n NA = \"#N/A\",\n NAME = \"#NAME?\",\n NUM = \"#NUM!\",\n REF = \"#REF!\",\n VALUE = \"#VALUE!\",\n CYCLE = \"#CYCLE!\",\n ERROR = \"#ERROR!\",\n SPILL = \"#SPILL!\",\n}\n\n// Sheet structure\nexport interface Sheet {\n name: string;\n index: number; // 0-based index of the sheet\n content: Map<string, SerializedCellValue>;\n}\n\nexport interface Workbook {\n name: string;\n sheets: Map<string, Sheet>;\n}\n\nexport type ValueEvaluationResult = {\n type: \"value\";\n result: CellValue;\n /**\n * If the terminating evaluation result is a reference (see evaluateReference)\n * then we store information about the source cell for context dependent functions like CELL\n */\n sourceCell?: CellAddress;\n};\n\nexport type AwaitingEvaluationResult = {\n type: \"awaiting-evaluation\";\n waitingFor: DependencyNode;\n errAddress: DependencyNode;\n /**\n * If the terminating evaluation result is a reference (see evaluateReference)\n * then we store information about the source cell for context dependent functions like CELL\n */\n sourceCell?: CellAddress;\n};\n\nexport type DoesNotSpillResult = {\n type: \"does-not-spill\";\n};\n\nexport type ErrorEvaluationResult =\n | {\n type: \"error\";\n err: FormulaError;\n errAddress: DependencyNode;\n message: string;\n /**\n * If the terminating evaluation result is a reference (see evaluateReference)\n * then we store information about the source cell for context dependent functions like CELL\n */\n sourceCell?: CellAddress;\n }\n | AwaitingEvaluationResult;\n\nexport type SingleEvaluationResult =\n | ValueEvaluationResult\n | ErrorEvaluationResult;\n\nexport type SpilledValuesEvaluator = (\n spillOffset: { x: number; y: number },\n context: EvaluationContext\n) => SingleEvaluationResult;\n\nexport type SpilledValuesEvaluationResult = {\n type: \"spilled-values\";\n\n /**\n * When a raw range is evaluated, we will add it to the sourceRange so it can be used e.g. for context dependent functions\n */\n sourceRange?: RangeAddress;\n\n /**\n * If the terminating evaluation result is a reference (see evaluateReference)\n * then we store information about the source cell for context dependent functions like CELL\n * sourceCell will only be defined on a spilledValue when a single value is looked up,\n */\n sourceCell?: CellAddress;\n\n spillArea: (origin: CellAddress) => SpreadsheetRange;\n /**\n * for debugging we add a source string to denote where the spilled values were created\n */\n source: string;\n evaluate: SpilledValuesEvaluator;\n /**\n * evaluateAllCells evaluates all non-empty cells in the spilled range.\n * Because a spilled range can be open-ended, we need to have logic for which cells we should evaluate.\n * e.g. when evaluating a range such as D:D only the cells in the current sheet residing in\n * column D should be evaluated and cells producing spilled values that spill onto D:D.\n *\n * In order to evaluate spilled cells in D:D the range evaluateAllCells need to get all cells in the\n * the intersection of the spilled range and D:D, for that reason evaluateAllCells gets an intersection parameter,\n * where the intersection is relative to the origin.\n *\n * #### Producers:\n * In e.g. SEQUENCE and evaluateRange we have logic for which cells in a spilled range we should evaluate,\n *\n * #### Nesting:\n * e.g. evaluation of scalar operators where we want to nest e.g. `5 * right.evaluate()`\n * can be implemented by calling\n * ```ts\n * const vals = child.evaluateAllCells.call(this, options);\n * return vals.map(val => ({ ...val, result: 5 * val.result }));\n * ```\n *\n * #### Consumers:\n * Only functions that need access to all spilled values in a range end up calling evaluateAllCells, e.g.\n * SUM, MIN, MAX, MATCH. Other types of functions like INDEX doesn't need to evaluate all cells in a range,\n * but does a lookup into a spilled range using the evaluate method.\n *\n */\n evaluateAllCells: (\n this: FormulaEvaluator,\n options: {\n /**\n * an intersection relative to the origin\n */\n intersection?: SpreadsheetRange;\n evaluate: SpilledValuesEvaluator;\n context: EvaluationContext;\n /**\n * origin is the cell address that the spilled range is spilled from\n * e.g. in A3=B2:B4 the origin is A3\n */\n origin: CellAddress;\n\n lookupOrder: LookupOrder;\n }\n ) => EvaluateAllCellsResult;\n};\n\nexport type EvaluateAllCellsResult =\n | ErrorEvaluationResult\n | {\n type: \"values\";\n values: CellInRangeResult[];\n };\n\nexport type CellInRangeResult = {\n result: SingleEvaluationResult;\n relativePos: { x: number; y: number };\n};\n\nexport type FunctionEvaluationResult =\n | SingleEvaluationResult\n | SpilledValuesEvaluationResult;\n\nexport type SpilledValue = {\n /**\n * spillOnto is the range that the spilled value is spilled onto\n */\n spillOnto: SpreadsheetRange;\n /**\n * origin is the cell address that the spilled value is spilled from\n */\n origin: CellAddress;\n};\n\n/**\n * Function definition\n */\nexport interface FunctionDefinition {\n name: string;\n evaluate: (\n this: FormulaEvaluator,\n node: FunctionNode,\n context: EvaluationContext\n ) => FunctionEvaluationResult;\n aliases?: string[];\n}\n\n/**\n * Evaluation result\n */\nexport type EvaluationResult = {\n dependencies: Set<string>;\n} & FunctionEvaluationResult;\n\nexport type SCC = {\n id: number;\n nodes: Set<DependencyNode>; // All nodes considering soft + hard edges\n evaluationOrder: DependencyNode[]; // Flat topologically ordered list\n resolved: boolean;\n hardEdgeSCCs: Set<DependencyNode>[]; // SCCs formed by only hard edges (regular dependencies)\n};\n\nexport type SCCDAG = {\n sccList: SCC[];\n sccGraph: Map<number, Set<number>>; // Adjacency list of SCC dependencies\n};\n\nexport type EvaluationOrder = {\n evaluationOrder: Set<DependencyNode>;\n hasCycle: boolean;\n cycleNodes?: Set<DependencyNode>;\n hash: string;\n sccDAG?: SCCDAG;\n};\n"
6
+ ],
7
+ "mappings": ";AA+HO,IAAK;AAAA,CAAL,CAAK,kBAAL;AAAA,EACL,wBAAO;AAAA,EACP,sBAAK;AAAA,EACL,wBAAO;AAAA,EACP,uBAAM;AAAA,EACN,uBAAM;AAAA,EACN,yBAAQ;AAAA,EACR,yBAAQ;AAAA,EACR,yBAAQ;AAAA,EACR,yBAAQ;AAAA,GATE;",
8
+ "debugId": "0E7C5AF634572D3964756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,35 @@
1
+ // src/core/utils/range-serializer.ts
2
+ import { indexToColumn, getRowNumber } from "../utils.mjs";
3
+ function serializeRange(range) {
4
+ const startCell = `${indexToColumn(range.start.col)}${getRowNumber(range.start.row)}`;
5
+ const endRowIsInfinity = range.end.row.type === "infinity";
6
+ const endColIsInfinity = range.end.col.type === "infinity";
7
+ let rangeEnd;
8
+ if (endRowIsInfinity && endColIsInfinity) {
9
+ rangeEnd = "INFINITY";
10
+ } else if (endRowIsInfinity && range.end.col.type === "number") {
11
+ rangeEnd = indexToColumn(range.end.col.value);
12
+ } else if (range.end.row.type === "number" && endColIsInfinity) {
13
+ rangeEnd = getRowNumber(range.end.row.value).toString();
14
+ } else if (range.end.row.type === "number" && range.end.col.type === "number") {
15
+ rangeEnd = `${indexToColumn(range.end.col.value)}${getRowNumber(range.end.row.value)}`;
16
+ } else {
17
+ throw new Error("Invalid range end configuration");
18
+ }
19
+ return `${startCell}:${rangeEnd}`;
20
+ }
21
+ function serializeRangeWithSheet(range, sheetName) {
22
+ const rangeStr = serializeRange(range);
23
+ if (sheetName) {
24
+ const needsQuotes = /[^A-Za-z0-9_]/.test(sheetName);
25
+ const quotedSheetName = needsQuotes ? `'${sheetName}'` : sheetName;
26
+ return `${quotedSheetName}!${rangeStr}`;
27
+ }
28
+ return rangeStr;
29
+ }
30
+ export {
31
+ serializeRangeWithSheet,
32
+ serializeRange
33
+ };
34
+
35
+ //# debugId=EAB81BB82F22743064756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/core/utils/range-serializer.ts"],
4
+ "sourcesContent": [
5
+ "import type { SpreadsheetRange } from \"../types.mjs\";\nimport { indexToColumn, getRowNumber } from \"../utils.mjs\";\n\n/**\n * Serializes a SpreadsheetRange into a human-readable range string following canonical format.\n * \n * Examples:\n * - Finite range: A2:B10\n * - Column-infinite range: A2:B (row infinite, column bounded)\n * - Row-infinite range: A2:10 (column infinite, row bounded)\n * - Fully infinite range: A2:INFINITY (both infinite)\n * \n * @param range The SpreadsheetRange to serialize\n * @returns A human-readable range string in canonical format\n */\nexport function serializeRange(range: SpreadsheetRange): string {\n // Format start cell\n const startCell = `${indexToColumn(range.start.col)}${getRowNumber(range.start.row)}`;\n \n // Determine end format based on infinity types\n const endRowIsInfinity = range.end.row.type === \"infinity\";\n const endColIsInfinity = range.end.col.type === \"infinity\";\n \n let rangeEnd: string;\n \n if (endRowIsInfinity && endColIsInfinity) {\n // Both infinite: A2:INFINITY\n rangeEnd = \"INFINITY\";\n } else if (endRowIsInfinity && range.end.col.type === \"number\") {\n // Row infinite, col finite: A2:B (column only)\n rangeEnd = indexToColumn(range.end.col.value);\n } else if (range.end.row.type === \"number\" && endColIsInfinity) {\n // Row finite, col infinite: A2:10 (row only)\n rangeEnd = getRowNumber(range.end.row.value).toString();\n } else if (range.end.row.type === \"number\" && range.end.col.type === \"number\") {\n // Both finite: A2:B10\n rangeEnd = `${indexToColumn(range.end.col.value)}${getRowNumber(range.end.row.value)}`;\n } else {\n throw new Error(\"Invalid range end configuration\");\n }\n \n return `${startCell}:${rangeEnd}`;\n}\n\n/**\n * Serializes a SpreadsheetRange with an optional sheet name prefix.\n * \n * @param range The SpreadsheetRange to serialize\n * @param sheetName Optional sheet name to prefix the range\n * @returns A human-readable range string, optionally prefixed with sheet name\n */\nexport function serializeRangeWithSheet(range: SpreadsheetRange, sheetName?: string): string {\n const rangeStr = serializeRange(range);\n \n if (sheetName) {\n // Handle sheet names that need quoting (contain spaces or special characters)\n const needsQuotes = /[^A-Za-z0-9_]/.test(sheetName);\n const quotedSheetName = needsQuotes ? `'${sheetName}'` : sheetName;\n return `${quotedSheetName}!${rangeStr}`;\n }\n \n return rangeStr;\n}\n"
6
+ ],
7
+ "mappings": ";AACA;AAcO,SAAS,cAAc,CAAC,OAAiC;AAAA,EAE9D,MAAM,YAAY,GAAG,cAAc,MAAM,MAAM,GAAG,IAAI,aAAa,MAAM,MAAM,GAAG;AAAA,EAGlF,MAAM,mBAAmB,MAAM,IAAI,IAAI,SAAS;AAAA,EAChD,MAAM,mBAAmB,MAAM,IAAI,IAAI,SAAS;AAAA,EAEhD,IAAI;AAAA,EAEJ,IAAI,oBAAoB,kBAAkB;AAAA,IAExC,WAAW;AAAA,EACb,EAAO,SAAI,oBAAoB,MAAM,IAAI,IAAI,SAAS,UAAU;AAAA,IAE9D,WAAW,cAAc,MAAM,IAAI,IAAI,KAAK;AAAA,EAC9C,EAAO,SAAI,MAAM,IAAI,IAAI,SAAS,YAAY,kBAAkB;AAAA,IAE9D,WAAW,aAAa,MAAM,IAAI,IAAI,KAAK,EAAE,SAAS;AAAA,EACxD,EAAO,SAAI,MAAM,IAAI,IAAI,SAAS,YAAY,MAAM,IAAI,IAAI,SAAS,UAAU;AAAA,IAE7E,WAAW,GAAG,cAAc,MAAM,IAAI,IAAI,KAAK,IAAI,aAAa,MAAM,IAAI,IAAI,KAAK;AAAA,EACrF,EAAO;AAAA,IACL,MAAM,IAAI,MAAM,iCAAiC;AAAA;AAAA,EAGnD,OAAO,GAAG,aAAa;AAAA;AAUlB,SAAS,uBAAuB,CAAC,OAAyB,WAA4B;AAAA,EAC3F,MAAM,WAAW,eAAe,KAAK;AAAA,EAErC,IAAI,WAAW;AAAA,IAEb,MAAM,cAAc,gBAAgB,KAAK,SAAS;AAAA,IAClD,MAAM,kBAAkB,cAAc,IAAI,eAAe;AAAA,IACzD,OAAO,GAAG,mBAAmB;AAAA,EAC/B;AAAA,EAEA,OAAO;AAAA;",
8
+ "debugId": "EAB81BB82F22743064756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,112 @@
1
+ // src/core/utils/spreadsheet-visualizer.ts
2
+ function visualizeSpreadsheet(engine, options) {
3
+ const {
4
+ workbookName,
5
+ numRows,
6
+ numCols,
7
+ startRow = 1,
8
+ startCol = 0,
9
+ sheetName,
10
+ emptyCellChar = ".",
11
+ minColWidth = 3,
12
+ maxColWidth = 20,
13
+ showColumnHeaders = true,
14
+ showRowNumbers = true,
15
+ snapshot = false
16
+ } = options;
17
+ const targetSheetName = sheetName || (() => {
18
+ const sheets = engine.getSheets(workbookName);
19
+ const sheetNames = Array.from(sheets.keys());
20
+ return sheetNames.length > 0 ? sheetNames[0] : null;
21
+ })();
22
+ const cellValues = [];
23
+ const columnWidths = new Array(numCols).fill(minColWidth);
24
+ if (showColumnHeaders) {
25
+ const headerRow = [];
26
+ for (let col = 0;col < numCols; col++) {
27
+ const colLetter = String.fromCharCode(65 + startCol + col);
28
+ headerRow.push(colLetter);
29
+ columnWidths[col] = Math.max(columnWidths[col], colLetter.length);
30
+ }
31
+ cellValues.push(headerRow);
32
+ }
33
+ for (let row = startRow;row < startRow + numRows; row++) {
34
+ const rowValues = [];
35
+ for (let col = 0;col < numCols; col++) {
36
+ let value;
37
+ if (targetSheetName) {
38
+ const cellValue = engine.getCellValue({
39
+ sheetName: targetSheetName,
40
+ workbookName,
41
+ rowIndex: row - 1,
42
+ colIndex: startCol + col
43
+ });
44
+ value = cellValue === "" || cellValue == null ? emptyCellChar : String(cellValue);
45
+ } else {
46
+ value = emptyCellChar;
47
+ }
48
+ rowValues.push(value);
49
+ columnWidths[col] = Math.max(columnWidths[col], Math.min(value.length, maxColWidth));
50
+ }
51
+ cellValues.push(rowValues);
52
+ }
53
+ let totalRowWidth = 0;
54
+ if (showRowNumbers) {
55
+ totalRowWidth += 3;
56
+ }
57
+ for (let col = 0;col < numCols; col++) {
58
+ totalRowWidth += columnWidths[col];
59
+ }
60
+ if (numCols > 0) {
61
+ totalRowWidth += (numCols - 1) * 3;
62
+ if (showRowNumbers) {
63
+ totalRowWidth += 3;
64
+ }
65
+ }
66
+ let result = "";
67
+ for (let i = 0;i < cellValues.length; i++) {
68
+ const rowValues = cellValues[i];
69
+ const formattedCells = [];
70
+ if (showRowNumbers) {
71
+ if (i === 0 && showColumnHeaders) {
72
+ formattedCells.push(" ");
73
+ } else {
74
+ const rowNum = showColumnHeaders ? startRow + i - 1 : startRow + i;
75
+ formattedCells.push(rowNum.toString().padStart(3));
76
+ }
77
+ }
78
+ for (let col = 0;col < rowValues.length; col++) {
79
+ let cellValue = rowValues[col];
80
+ if (cellValue.length > maxColWidth) {
81
+ cellValue = cellValue.substring(0, maxColWidth - 3) + "...";
82
+ }
83
+ formattedCells.push(cellValue.padEnd(columnWidths[col]));
84
+ }
85
+ let rowContent = formattedCells.join(" | ");
86
+ rowContent = rowContent.padEnd(totalRowWidth);
87
+ if (snapshot && i > 0) {
88
+ rowContent = " " + rowContent;
89
+ }
90
+ result += rowContent + `
91
+ `;
92
+ if (i === 0 && showColumnHeaders) {
93
+ const separatorParts = [];
94
+ if (showRowNumbers) {
95
+ separatorParts.push(snapshot ? "----" : "---");
96
+ }
97
+ for (let col = 0;col < numCols; col++) {
98
+ separatorParts.push("-".repeat(columnWidths[col]));
99
+ }
100
+ let separatorLine = separatorParts.join("-+-");
101
+ separatorLine = separatorLine.padEnd(totalRowWidth);
102
+ result += separatorLine + `
103
+ `;
104
+ }
105
+ }
106
+ return result;
107
+ }
108
+ export {
109
+ visualizeSpreadsheet
110
+ };
111
+
112
+ //# debugId=13EB020C0050D77364756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/core/utils/spreadsheet-visualizer.ts"],
4
+ "sourcesContent": [
5
+ "import { FormulaEngine } from \"../engine.mjs\";\n\nexport interface SpreadsheetVisualizerOptions {\n workbookName: string;\n /** Number of rows to display (1-based) */\n numRows: number;\n /** Number of columns to display (0-based, so 11 = A-K) */\n numCols: number;\n /** Starting row (1-based, default: 1) */\n startRow?: number;\n /** Starting column (0-based, default: 0 = A) */\n startCol?: number;\n /** Sheet name to visualize (default: uses engine's current sheet) */\n sheetName?: string;\n /** Character to use for empty cells (default: \".\") */\n emptyCellChar?: string;\n /** Minimum column width (default: 3) */\n minColWidth?: number;\n /** Maximum column width (default: 20) */\n maxColWidth?: number;\n /** Whether to show column headers (A, B, C...) */\n showColumnHeaders?: boolean;\n /** Whether to show row numbers */\n showRowNumbers?: boolean;\n /** If output is used for snapshotting */\n snapshot?: boolean;\n}\n\n/**\n * Generates a visual ASCII representation of a spreadsheet region\n */\nexport function visualizeSpreadsheet(\n engine: FormulaEngine,\n options: SpreadsheetVisualizerOptions\n): string {\n const {\n workbookName,\n numRows,\n numCols,\n startRow = 1,\n startCol = 0,\n sheetName,\n emptyCellChar = \".\",\n minColWidth = 3,\n maxColWidth = 20,\n showColumnHeaders = true,\n showRowNumbers = true,\n snapshot = false,\n } = options;\n\n // Determine the sheet name to use upfront\n const targetSheetName =\n sheetName ||\n (() => {\n const sheets = engine.getSheets(workbookName);\n const sheetNames = Array.from(sheets.keys());\n return sheetNames.length > 0 ? sheetNames[0]! : null;\n })();\n\n // First pass: collect all cell values and calculate column widths\n const cellValues: string[][] = [];\n const columnWidths: number[] = new Array(numCols).fill(minColWidth);\n\n // Collect column headers if needed\n if (showColumnHeaders) {\n const headerRow: string[] = [];\n for (let col = 0; col < numCols; col++) {\n const colLetter = String.fromCharCode(65 + startCol + col);\n headerRow.push(colLetter);\n columnWidths[col] = Math.max(columnWidths[col]!, colLetter.length);\n }\n cellValues.push(headerRow);\n }\n\n // Collect all cell data\n for (let row = startRow; row < startRow + numRows; row++) {\n const rowValues: string[] = [];\n for (let col = 0; col < numCols; col++) {\n let value: string;\n if (targetSheetName) {\n const cellValue = engine.getCellValue({\n sheetName: targetSheetName,\n workbookName,\n rowIndex: row - 1,\n colIndex: startCol + col,\n });\n value =\n cellValue === \"\" || cellValue == null\n ? emptyCellChar\n : String(cellValue);\n } else {\n // No sheets available\n value = emptyCellChar;\n }\n\n rowValues.push(value);\n // Update column width, respecting max width\n columnWidths[col] = Math.max(\n columnWidths[col]!,\n Math.min(value.length, maxColWidth)\n );\n }\n cellValues.push(rowValues);\n }\n\n // Calculate total row width for consistent formatting\n let totalRowWidth = 0;\n if (showRowNumbers) {\n totalRowWidth += 3; // Row number width\n }\n for (let col = 0; col < numCols; col++) {\n totalRowWidth += columnWidths[col]!;\n }\n // Add separator characters: \" | \" between columns (3 chars each, but last column doesn't have trailing separator)\n if (numCols > 0) {\n totalRowWidth += (numCols - 1) * 3; // \" | \" between columns\n if (showRowNumbers) {\n totalRowWidth += 3; // \" | \" after row number\n }\n }\n\n // Second pass: format the output with proper column widths\n let result = \"\";\n\n for (let i = 0; i < cellValues.length; i++) {\n const rowValues = cellValues[i]!;\n const formattedCells: string[] = [];\n\n // Add row number if requested\n if (showRowNumbers) {\n if (i === 0 && showColumnHeaders) {\n formattedCells.push(\" \"); // Empty space for header row\n } else {\n const rowNum = showColumnHeaders ? startRow + i - 1 : startRow + i;\n formattedCells.push(rowNum.toString().padStart(3));\n }\n }\n\n // Format each cell with proper width\n for (let col = 0; col < rowValues.length; col++) {\n let cellValue = rowValues[col]!;\n\n // Truncate if too long\n if (cellValue.length > maxColWidth) {\n cellValue = cellValue.substring(0, maxColWidth - 3) + \"...\";\n }\n\n // Pad to column width\n formattedCells.push(cellValue.padEnd(columnWidths[col]!));\n }\n\n // Join with consistent separators and ensure exact row width\n let rowContent = formattedCells.join(\" | \");\n // Pad the entire row to ensure consistent width\n rowContent = rowContent.padEnd(totalRowWidth);\n if (snapshot && i > 0) {\n rowContent = \" \" + rowContent;\n }\n result += rowContent + \"\\n\";\n\n // Add separator line after header\n if (i === 0 && showColumnHeaders) {\n const separatorParts: string[] = [];\n\n if (showRowNumbers) {\n separatorParts.push(snapshot ? \"----\" : \"---\");\n }\n\n for (let col = 0; col < numCols; col++) {\n separatorParts.push(\"-\".repeat(columnWidths[col]!));\n }\n\n // Create separator line with same width as data rows\n let separatorLine = separatorParts.join(\"-+-\");\n separatorLine = separatorLine.padEnd(totalRowWidth);\n result += separatorLine + \"\\n\";\n }\n }\n\n return result;\n}\n"
6
+ ],
7
+ "mappings": ";AA+BO,SAAS,oBAAoB,CAClC,QACA,SACQ;AAAA,EACR;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,WAAW;AAAA,IACX;AAAA,IACA,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,cAAc;AAAA,IACd,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,WAAW;AAAA,MACT;AAAA,EAGJ,MAAM,kBACJ,cACC,MAAM;AAAA,IACL,MAAM,SAAS,OAAO,UAAU,YAAY;AAAA,IAC5C,MAAM,aAAa,MAAM,KAAK,OAAO,KAAK,CAAC;AAAA,IAC3C,OAAO,WAAW,SAAS,IAAI,WAAW,KAAM;AAAA,KAC/C;AAAA,EAGL,MAAM,aAAyB,CAAC;AAAA,EAChC,MAAM,eAAyB,IAAI,MAAM,OAAO,EAAE,KAAK,WAAW;AAAA,EAGlE,IAAI,mBAAmB;AAAA,IACrB,MAAM,YAAsB,CAAC;AAAA,IAC7B,SAAS,MAAM,EAAG,MAAM,SAAS,OAAO;AAAA,MACtC,MAAM,YAAY,OAAO,aAAa,KAAK,WAAW,GAAG;AAAA,MACzD,UAAU,KAAK,SAAS;AAAA,MACxB,aAAa,OAAO,KAAK,IAAI,aAAa,MAAO,UAAU,MAAM;AAAA,IACnE;AAAA,IACA,WAAW,KAAK,SAAS;AAAA,EAC3B;AAAA,EAGA,SAAS,MAAM,SAAU,MAAM,WAAW,SAAS,OAAO;AAAA,IACxD,MAAM,YAAsB,CAAC;AAAA,IAC7B,SAAS,MAAM,EAAG,MAAM,SAAS,OAAO;AAAA,MACtC,IAAI;AAAA,MACJ,IAAI,iBAAiB;AAAA,QACnB,MAAM,YAAY,OAAO,aAAa;AAAA,UACpC,WAAW;AAAA,UACX;AAAA,UACA,UAAU,MAAM;AAAA,UAChB,UAAU,WAAW;AAAA,QACvB,CAAC;AAAA,QACD,QACE,cAAc,MAAM,aAAa,OAC7B,gBACA,OAAO,SAAS;AAAA,MACxB,EAAO;AAAA,QAEL,QAAQ;AAAA;AAAA,MAGV,UAAU,KAAK,KAAK;AAAA,MAEpB,aAAa,OAAO,KAAK,IACvB,aAAa,MACb,KAAK,IAAI,MAAM,QAAQ,WAAW,CACpC;AAAA,IACF;AAAA,IACA,WAAW,KAAK,SAAS;AAAA,EAC3B;AAAA,EAGA,IAAI,gBAAgB;AAAA,EACpB,IAAI,gBAAgB;AAAA,IAClB,iBAAiB;AAAA,EACnB;AAAA,EACA,SAAS,MAAM,EAAG,MAAM,SAAS,OAAO;AAAA,IACtC,iBAAiB,aAAa;AAAA,EAChC;AAAA,EAEA,IAAI,UAAU,GAAG;AAAA,IACf,kBAAkB,UAAU,KAAK;AAAA,IACjC,IAAI,gBAAgB;AAAA,MAClB,iBAAiB;AAAA,IACnB;AAAA,EACF;AAAA,EAGA,IAAI,SAAS;AAAA,EAEb,SAAS,IAAI,EAAG,IAAI,WAAW,QAAQ,KAAK;AAAA,IAC1C,MAAM,YAAY,WAAW;AAAA,IAC7B,MAAM,iBAA2B,CAAC;AAAA,IAGlC,IAAI,gBAAgB;AAAA,MAClB,IAAI,MAAM,KAAK,mBAAmB;AAAA,QAChC,eAAe,KAAK,KAAK;AAAA,MAC3B,EAAO;AAAA,QACL,MAAM,SAAS,oBAAoB,WAAW,IAAI,IAAI,WAAW;AAAA,QACjE,eAAe,KAAK,OAAO,SAAS,EAAE,SAAS,CAAC,CAAC;AAAA;AAAA,IAErD;AAAA,IAGA,SAAS,MAAM,EAAG,MAAM,UAAU,QAAQ,OAAO;AAAA,MAC/C,IAAI,YAAY,UAAU;AAAA,MAG1B,IAAI,UAAU,SAAS,aAAa;AAAA,QAClC,YAAY,UAAU,UAAU,GAAG,cAAc,CAAC,IAAI;AAAA,MACxD;AAAA,MAGA,eAAe,KAAK,UAAU,OAAO,aAAa,IAAK,CAAC;AAAA,IAC1D;AAAA,IAGA,IAAI,aAAa,eAAe,KAAK,KAAK;AAAA,IAE1C,aAAa,WAAW,OAAO,aAAa;AAAA,IAC5C,IAAI,YAAY,IAAI,GAAG;AAAA,MACrB,aAAa,MAAM;AAAA,IACrB;AAAA,IACA,UAAU,aAAa;AAAA;AAAA,IAGvB,IAAI,MAAM,KAAK,mBAAmB;AAAA,MAChC,MAAM,iBAA2B,CAAC;AAAA,MAElC,IAAI,gBAAgB;AAAA,QAClB,eAAe,KAAK,WAAW,SAAS,KAAK;AAAA,MAC/C;AAAA,MAEA,SAAS,MAAM,EAAG,MAAM,SAAS,OAAO;AAAA,QACtC,eAAe,KAAK,IAAI,OAAO,aAAa,IAAK,CAAC;AAAA,MACpD;AAAA,MAGA,IAAI,gBAAgB,eAAe,KAAK,KAAK;AAAA,MAC7C,gBAAgB,cAAc,OAAO,aAAa;AAAA,MAClD,UAAU,gBAAgB;AAAA;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;",
8
+ "debugId": "13EB020C0050D77364756E2164756E21",
9
+ "names": []
10
+ }