@ricsam/formula-engine 0.2.2 → 0.2.3

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 (337) hide show
  1. package/dist/cjs/core/ast-traverser.cjs +19 -9
  2. package/dist/cjs/core/ast-traverser.cjs.map +2 -2
  3. package/dist/cjs/core/autofill-utils.cjs +19 -9
  4. package/dist/cjs/core/autofill-utils.cjs.map +2 -2
  5. package/dist/cjs/core/cell-mover.cjs +19 -9
  6. package/dist/cjs/core/cell-mover.cjs.map +2 -2
  7. package/dist/cjs/core/commands/command-executor.cjs +24 -13
  8. package/dist/cjs/core/commands/command-executor.cjs.map +3 -3
  9. package/dist/cjs/core/commands/content-commands.cjs +292 -9
  10. package/dist/cjs/core/commands/content-commands.cjs.map +3 -3
  11. package/dist/cjs/core/commands/metadata-commands.cjs +19 -9
  12. package/dist/cjs/core/commands/metadata-commands.cjs.map +2 -2
  13. package/dist/cjs/core/commands/named-expression-commands.cjs +138 -13
  14. package/dist/cjs/core/commands/named-expression-commands.cjs.map +3 -3
  15. package/dist/cjs/core/commands/structure-commands.cjs +216 -15
  16. package/dist/cjs/core/commands/structure-commands.cjs.map +3 -3
  17. package/dist/cjs/core/commands/style-commands.cjs +19 -9
  18. package/dist/cjs/core/commands/style-commands.cjs.map +2 -2
  19. package/dist/cjs/core/commands/table-commands.cjs +134 -13
  20. package/dist/cjs/core/commands/table-commands.cjs.map +3 -3
  21. package/dist/cjs/core/commands/types.cjs +36 -9
  22. package/dist/cjs/core/commands/types.cjs.map +3 -3
  23. package/dist/cjs/core/engine-snapshot.cjs +51 -0
  24. package/dist/cjs/core/engine-snapshot.cjs.map +10 -0
  25. package/dist/cjs/core/engine.cjs +51 -34
  26. package/dist/cjs/core/engine.cjs.map +3 -3
  27. package/dist/cjs/core/managers/cache-manager.cjs +123 -9
  28. package/dist/cjs/core/managers/cache-manager.cjs.map +3 -3
  29. package/dist/cjs/core/managers/copy-manager.cjs +19 -9
  30. package/dist/cjs/core/managers/copy-manager.cjs.map +2 -2
  31. package/dist/cjs/core/managers/dependency-manager.cjs +697 -9
  32. package/dist/cjs/core/managers/dependency-manager.cjs.map +3 -3
  33. package/dist/cjs/core/managers/dependency-node.cjs +14 -8
  34. package/dist/cjs/core/managers/dependency-node.cjs.map +1 -1
  35. package/dist/cjs/core/managers/evaluation-manager.cjs +296 -11
  36. package/dist/cjs/core/managers/evaluation-manager.cjs.map +3 -3
  37. package/dist/cjs/core/managers/event-manager.cjs +19 -9
  38. package/dist/cjs/core/managers/event-manager.cjs.map +2 -2
  39. package/dist/cjs/core/managers/frontier-dependency-manager.cjs +65 -12
  40. package/dist/cjs/core/managers/frontier-dependency-manager.cjs.map +3 -3
  41. package/dist/cjs/core/managers/isDependencyNode.cjs +19 -9
  42. package/dist/cjs/core/managers/isDependencyNode.cjs.map +2 -2
  43. package/dist/cjs/core/managers/named-expression-manager.cjs +121 -29
  44. package/dist/cjs/core/managers/named-expression-manager.cjs.map +3 -3
  45. package/dist/cjs/core/managers/range-eval-order-builder.cjs +19 -9
  46. package/dist/cjs/core/managers/range-eval-order-builder.cjs.map +2 -2
  47. package/dist/cjs/core/managers/reference-manager.cjs +25 -9
  48. package/dist/cjs/core/managers/reference-manager.cjs.map +3 -3
  49. package/dist/cjs/core/managers/schema-manager.cjs +19 -9
  50. package/dist/cjs/core/managers/schema-manager.cjs.map +2 -2
  51. package/dist/cjs/core/managers/style-manager.cjs +28 -9
  52. package/dist/cjs/core/managers/style-manager.cjs.map +3 -3
  53. package/dist/cjs/core/managers/table-manager.cjs +25 -9
  54. package/dist/cjs/core/managers/table-manager.cjs.map +3 -3
  55. package/dist/cjs/core/managers/workbook-manager.cjs +38 -13
  56. package/dist/cjs/core/managers/workbook-manager.cjs.map +3 -3
  57. package/dist/cjs/core/map-serializer.cjs +19 -9
  58. package/dist/cjs/core/map-serializer.cjs.map +2 -2
  59. package/dist/cjs/core/named-expression-renamer.cjs +19 -9
  60. package/dist/cjs/core/named-expression-renamer.cjs.map +2 -2
  61. package/dist/cjs/core/resource-keys.cjs +67 -0
  62. package/dist/cjs/core/resource-keys.cjs.map +10 -0
  63. package/dist/cjs/core/schema/cell-orm.cjs +19 -9
  64. package/dist/cjs/core/schema/cell-orm.cjs.map +2 -2
  65. package/dist/cjs/core/schema/grid-orm.cjs +19 -9
  66. package/dist/cjs/core/schema/grid-orm.cjs.map +2 -2
  67. package/dist/cjs/core/schema/schema-builder.cjs +19 -9
  68. package/dist/cjs/core/schema/schema-builder.cjs.map +2 -2
  69. package/dist/cjs/core/schema/schema-helpers.cjs +19 -9
  70. package/dist/cjs/core/schema/schema-helpers.cjs.map +2 -2
  71. package/dist/cjs/core/schema/schema.cjs +19 -9
  72. package/dist/cjs/core/schema/schema.cjs.map +2 -2
  73. package/dist/cjs/core/schema/table-orm.cjs +19 -9
  74. package/dist/cjs/core/schema/table-orm.cjs.map +2 -2
  75. package/dist/cjs/core/sheet-renamer.cjs +19 -9
  76. package/dist/cjs/core/sheet-renamer.cjs.map +2 -2
  77. package/dist/cjs/core/sheet-utils.cjs +19 -9
  78. package/dist/cjs/core/sheet-utils.cjs.map +2 -2
  79. package/dist/cjs/core/table-renamer.cjs +19 -9
  80. package/dist/cjs/core/table-renamer.cjs.map +2 -2
  81. package/dist/cjs/core/types.cjs +19 -9
  82. package/dist/cjs/core/types.cjs.map +2 -2
  83. package/dist/cjs/core/utils/color-utils.cjs +19 -9
  84. package/dist/cjs/core/utils/color-utils.cjs.map +2 -2
  85. package/dist/cjs/core/utils/range-serializer.cjs +19 -9
  86. package/dist/cjs/core/utils/range-serializer.cjs.map +2 -2
  87. package/dist/cjs/core/utils/range-utils.cjs +19 -9
  88. package/dist/cjs/core/utils/range-utils.cjs.map +2 -2
  89. package/dist/cjs/core/utils/spreadsheet-visualizer.cjs +19 -9
  90. package/dist/cjs/core/utils/spreadsheet-visualizer.cjs.map +2 -2
  91. package/dist/cjs/core/utils.cjs +19 -9
  92. package/dist/cjs/core/utils.cjs.map +2 -2
  93. package/dist/cjs/core/workbook-renamer.cjs +19 -9
  94. package/dist/cjs/core/workbook-renamer.cjs.map +2 -2
  95. package/dist/cjs/debug/flags.cjs +19 -9
  96. package/dist/cjs/debug/flags.cjs.map +2 -2
  97. package/dist/cjs/evaluator/arithmetic/add/add.cjs +19 -9
  98. package/dist/cjs/evaluator/arithmetic/add/add.cjs.map +2 -2
  99. package/dist/cjs/evaluator/arithmetic/divide/divide.cjs +19 -9
  100. package/dist/cjs/evaluator/arithmetic/divide/divide.cjs.map +2 -2
  101. package/dist/cjs/evaluator/arithmetic/multiply/multiply.cjs +19 -9
  102. package/dist/cjs/evaluator/arithmetic/multiply/multiply.cjs.map +2 -2
  103. package/dist/cjs/evaluator/arithmetic/power/power.cjs +19 -9
  104. package/dist/cjs/evaluator/arithmetic/power/power.cjs.map +2 -2
  105. package/dist/cjs/evaluator/arithmetic/subtract/subtract.cjs +19 -9
  106. package/dist/cjs/evaluator/arithmetic/subtract/subtract.cjs.map +2 -2
  107. package/dist/cjs/evaluator/comparison/equals.cjs +19 -9
  108. package/dist/cjs/evaluator/comparison/equals.cjs.map +2 -2
  109. package/dist/cjs/evaluator/comparison/greater-than-or-equal.cjs +19 -9
  110. package/dist/cjs/evaluator/comparison/greater-than-or-equal.cjs.map +2 -2
  111. package/dist/cjs/evaluator/comparison/greater-than.cjs +19 -9
  112. package/dist/cjs/evaluator/comparison/greater-than.cjs.map +2 -2
  113. package/dist/cjs/evaluator/comparison/less-than-or-equal.cjs +19 -9
  114. package/dist/cjs/evaluator/comparison/less-than-or-equal.cjs.map +2 -2
  115. package/dist/cjs/evaluator/comparison/less-than.cjs +19 -9
  116. package/dist/cjs/evaluator/comparison/less-than.cjs.map +2 -2
  117. package/dist/cjs/evaluator/comparison/not-equals.cjs +19 -9
  118. package/dist/cjs/evaluator/comparison/not-equals.cjs.map +2 -2
  119. package/dist/cjs/evaluator/concatenation/concatenate.cjs +19 -9
  120. package/dist/cjs/evaluator/concatenation/concatenate.cjs.map +2 -2
  121. package/dist/cjs/evaluator/dependency-nodes/ast-evaluation-node.cjs +19 -9
  122. package/dist/cjs/evaluator/dependency-nodes/ast-evaluation-node.cjs.map +2 -2
  123. package/dist/cjs/evaluator/dependency-nodes/base-eval-node.cjs +35 -9
  124. package/dist/cjs/evaluator/dependency-nodes/base-eval-node.cjs.map +3 -3
  125. package/dist/cjs/evaluator/dependency-nodes/cell-value-node.cjs +22 -9
  126. package/dist/cjs/evaluator/dependency-nodes/cell-value-node.cjs.map +3 -3
  127. package/dist/cjs/evaluator/dependency-nodes/empty-cell-evaluation-node.cjs +35 -11
  128. package/dist/cjs/evaluator/dependency-nodes/empty-cell-evaluation-node.cjs.map +3 -3
  129. package/dist/cjs/evaluator/dependency-nodes/resource-dependency-node.cjs +61 -0
  130. package/dist/cjs/evaluator/dependency-nodes/resource-dependency-node.cjs.map +10 -0
  131. package/dist/cjs/evaluator/dependency-nodes/spill-meta-node.cjs +19 -9
  132. package/dist/cjs/evaluator/dependency-nodes/spill-meta-node.cjs.map +2 -2
  133. package/dist/cjs/evaluator/dependency-nodes/virtual-cell-value-node.cjs +22 -9
  134. package/dist/cjs/evaluator/dependency-nodes/virtual-cell-value-node.cjs.map +3 -3
  135. package/dist/cjs/evaluator/evaluate-scalar-operator.cjs +19 -9
  136. package/dist/cjs/evaluator/evaluate-scalar-operator.cjs.map +2 -2
  137. package/dist/cjs/evaluator/evaluation-context.cjs +19 -9
  138. package/dist/cjs/evaluator/evaluation-context.cjs.map +2 -2
  139. package/dist/cjs/evaluator/evaluation-error.cjs +19 -9
  140. package/dist/cjs/evaluator/evaluation-error.cjs.map +2 -2
  141. package/dist/cjs/evaluator/formula-evaluator.cjs +55 -12
  142. package/dist/cjs/evaluator/formula-evaluator.cjs.map +3 -3
  143. package/dist/cjs/evaluator/range-evaluation-node.cjs +35 -11
  144. package/dist/cjs/evaluator/range-evaluation-node.cjs.map +3 -3
  145. package/dist/cjs/functions/_template/template.cjs +19 -9
  146. package/dist/cjs/functions/_template/template.cjs.map +2 -2
  147. package/dist/cjs/functions/array/sequence/sequence.cjs +19 -9
  148. package/dist/cjs/functions/array/sequence/sequence.cjs.map +2 -2
  149. package/dist/cjs/functions/criteria-parser.cjs +19 -9
  150. package/dist/cjs/functions/criteria-parser.cjs.map +2 -2
  151. package/dist/cjs/functions/criteria-utils.cjs +19 -9
  152. package/dist/cjs/functions/criteria-utils.cjs.map +2 -2
  153. package/dist/cjs/functions/function-registry.cjs +19 -9
  154. package/dist/cjs/functions/function-registry.cjs.map +2 -2
  155. package/dist/cjs/functions/function-utils.cjs +19 -9
  156. package/dist/cjs/functions/function-utils.cjs.map +2 -2
  157. package/dist/cjs/functions/information/cell/cell.cjs +19 -9
  158. package/dist/cjs/functions/information/cell/cell.cjs.map +2 -2
  159. package/dist/cjs/functions/information/column/column.cjs +19 -9
  160. package/dist/cjs/functions/information/column/column.cjs.map +2 -2
  161. package/dist/cjs/functions/information/row/row.cjs +19 -9
  162. package/dist/cjs/functions/information/row/row.cjs.map +2 -2
  163. package/dist/cjs/functions/logical/and/and.cjs +19 -9
  164. package/dist/cjs/functions/logical/and/and.cjs.map +2 -2
  165. package/dist/cjs/functions/logical/if/if.cjs +19 -9
  166. package/dist/cjs/functions/logical/if/if.cjs.map +2 -2
  167. package/dist/cjs/functions/logical/iferror/iferror.cjs +19 -9
  168. package/dist/cjs/functions/logical/iferror/iferror.cjs.map +2 -2
  169. package/dist/cjs/functions/logical/or/or.cjs +19 -9
  170. package/dist/cjs/functions/logical/or/or.cjs.map +2 -2
  171. package/dist/cjs/functions/lookup/count/count-utils.cjs +19 -9
  172. package/dist/cjs/functions/lookup/count/count-utils.cjs.map +2 -2
  173. package/dist/cjs/functions/lookup/count/count.cjs +19 -9
  174. package/dist/cjs/functions/lookup/count/count.cjs.map +2 -2
  175. package/dist/cjs/functions/lookup/count/countif.cjs +19 -9
  176. package/dist/cjs/functions/lookup/count/countif.cjs.map +2 -2
  177. package/dist/cjs/functions/lookup/count/countifs.cjs +19 -9
  178. package/dist/cjs/functions/lookup/count/countifs.cjs.map +2 -2
  179. package/dist/cjs/functions/lookup/index-lookup/index-lookup.cjs +19 -9
  180. package/dist/cjs/functions/lookup/index-lookup/index-lookup.cjs.map +2 -2
  181. package/dist/cjs/functions/lookup/match/match.cjs +21 -10
  182. package/dist/cjs/functions/lookup/match/match.cjs.map +3 -3
  183. package/dist/cjs/functions/lookup/xlookup/xlookup.cjs +19 -9
  184. package/dist/cjs/functions/lookup/xlookup/xlookup.cjs.map +2 -2
  185. package/dist/cjs/functions/math/average/average-utils.cjs +19 -9
  186. package/dist/cjs/functions/math/average/average-utils.cjs.map +2 -2
  187. package/dist/cjs/functions/math/average/average.cjs +19 -9
  188. package/dist/cjs/functions/math/average/average.cjs.map +2 -2
  189. package/dist/cjs/functions/math/average/averageif.cjs +19 -9
  190. package/dist/cjs/functions/math/average/averageif.cjs.map +2 -2
  191. package/dist/cjs/functions/math/average/averageifs.cjs +19 -9
  192. package/dist/cjs/functions/math/average/averageifs.cjs.map +2 -2
  193. package/dist/cjs/functions/math/ceiling/ceiling.cjs +19 -9
  194. package/dist/cjs/functions/math/ceiling/ceiling.cjs.map +2 -2
  195. package/dist/cjs/functions/math/max/max-utils.cjs +19 -9
  196. package/dist/cjs/functions/math/max/max-utils.cjs.map +2 -2
  197. package/dist/cjs/functions/math/max/max.cjs +19 -9
  198. package/dist/cjs/functions/math/max/max.cjs.map +2 -2
  199. package/dist/cjs/functions/math/max/maxif.cjs +19 -9
  200. package/dist/cjs/functions/math/max/maxif.cjs.map +2 -2
  201. package/dist/cjs/functions/math/max/maxifs.cjs +19 -9
  202. package/dist/cjs/functions/math/max/maxifs.cjs.map +2 -2
  203. package/dist/cjs/functions/math/min/min-utils.cjs +19 -9
  204. package/dist/cjs/functions/math/min/min-utils.cjs.map +2 -2
  205. package/dist/cjs/functions/math/min/min.cjs +19 -9
  206. package/dist/cjs/functions/math/min/min.cjs.map +2 -2
  207. package/dist/cjs/functions/math/min/minif.cjs +19 -9
  208. package/dist/cjs/functions/math/min/minif.cjs.map +2 -2
  209. package/dist/cjs/functions/math/min/minifs.cjs +19 -9
  210. package/dist/cjs/functions/math/min/minifs.cjs.map +2 -2
  211. package/dist/cjs/functions/math/sum/sum.cjs +19 -9
  212. package/dist/cjs/functions/math/sum/sum.cjs.map +2 -2
  213. package/dist/cjs/functions/math/sum/sumif.cjs +19 -9
  214. package/dist/cjs/functions/math/sum/sumif.cjs.map +2 -2
  215. package/dist/cjs/functions/math/sum/sumifs.cjs +19 -9
  216. package/dist/cjs/functions/math/sum/sumifs.cjs.map +2 -2
  217. package/dist/cjs/functions/math/sum/summation-utils.cjs +19 -9
  218. package/dist/cjs/functions/math/sum/summation-utils.cjs.map +2 -2
  219. package/dist/cjs/functions/reference/address/address.cjs +19 -9
  220. package/dist/cjs/functions/reference/address/address.cjs.map +2 -2
  221. package/dist/cjs/functions/reference/indirect/indirect.cjs +19 -9
  222. package/dist/cjs/functions/reference/indirect/indirect.cjs.map +2 -2
  223. package/dist/cjs/functions/reference/offset/offset.cjs +19 -9
  224. package/dist/cjs/functions/reference/offset/offset.cjs.map +2 -2
  225. package/dist/cjs/functions/text/concatenate/concatenate.cjs +21 -9
  226. package/dist/cjs/functions/text/concatenate/concatenate.cjs.map +3 -3
  227. package/dist/cjs/functions/text/exact/exact.cjs +19 -9
  228. package/dist/cjs/functions/text/exact/exact.cjs.map +2 -2
  229. package/dist/cjs/functions/text/find/find.cjs +19 -9
  230. package/dist/cjs/functions/text/find/find.cjs.map +2 -2
  231. package/dist/cjs/functions/text/left/left.cjs +19 -9
  232. package/dist/cjs/functions/text/left/left.cjs.map +2 -2
  233. package/dist/cjs/functions/text/len/len.cjs +19 -9
  234. package/dist/cjs/functions/text/len/len.cjs.map +2 -2
  235. package/dist/cjs/functions/text/mid/mid.cjs +19 -9
  236. package/dist/cjs/functions/text/mid/mid.cjs.map +2 -2
  237. package/dist/cjs/functions/text/right/right.cjs +19 -9
  238. package/dist/cjs/functions/text/right/right.cjs.map +2 -2
  239. package/dist/cjs/functions/text/text-helpers.cjs +19 -9
  240. package/dist/cjs/functions/text/text-helpers.cjs.map +2 -2
  241. package/dist/cjs/functions/text/textjoin/textjoin.cjs +19 -9
  242. package/dist/cjs/functions/text/textjoin/textjoin.cjs.map +2 -2
  243. package/dist/cjs/lib.cjs +24 -13
  244. package/dist/cjs/lib.cjs.map +2 -2
  245. package/dist/cjs/package.json +1 -1
  246. package/dist/cjs/parser/ast.cjs +19 -9
  247. package/dist/cjs/parser/ast.cjs.map +2 -2
  248. package/dist/cjs/parser/formatter.cjs +19 -9
  249. package/dist/cjs/parser/formatter.cjs.map +2 -2
  250. package/dist/cjs/parser/grammar.cjs +19 -9
  251. package/dist/cjs/parser/grammar.cjs.map +2 -2
  252. package/dist/cjs/parser/lexer.cjs +19 -9
  253. package/dist/cjs/parser/lexer.cjs.map +2 -2
  254. package/dist/cjs/parser/parser.cjs +19 -9
  255. package/dist/cjs/parser/parser.cjs.map +2 -2
  256. package/dist/cjs/react/hooks.cjs +31 -10
  257. package/dist/cjs/react/hooks.cjs.map +2 -2
  258. package/dist/mjs/core/commands/command-executor.mjs +7 -5
  259. package/dist/mjs/core/commands/command-executor.mjs.map +3 -3
  260. package/dist/mjs/core/commands/content-commands.mjs +279 -2
  261. package/dist/mjs/core/commands/content-commands.mjs.map +3 -3
  262. package/dist/mjs/core/commands/named-expression-commands.mjs +121 -6
  263. package/dist/mjs/core/commands/named-expression-commands.mjs.map +3 -3
  264. package/dist/mjs/core/commands/structure-commands.mjs +204 -8
  265. package/dist/mjs/core/commands/structure-commands.mjs.map +3 -3
  266. package/dist/mjs/core/commands/table-commands.mjs +117 -6
  267. package/dist/mjs/core/commands/table-commands.mjs.map +3 -3
  268. package/dist/mjs/core/commands/types.mjs +18 -1
  269. package/dist/mjs/core/commands/types.mjs.map +3 -3
  270. package/dist/mjs/core/engine-snapshot.mjs +11 -0
  271. package/dist/mjs/core/engine-snapshot.mjs.map +10 -0
  272. package/dist/mjs/core/engine.mjs +35 -26
  273. package/dist/mjs/core/engine.mjs.map +3 -3
  274. package/dist/mjs/core/managers/cache-manager.mjs +105 -1
  275. package/dist/mjs/core/managers/cache-manager.mjs.map +3 -3
  276. package/dist/mjs/core/managers/dependency-manager.mjs +687 -2
  277. package/dist/mjs/core/managers/dependency-manager.mjs.map +3 -3
  278. package/dist/mjs/core/managers/evaluation-manager.mjs +283 -4
  279. package/dist/mjs/core/managers/evaluation-manager.mjs.map +3 -3
  280. package/dist/mjs/core/managers/frontier-dependency-manager.mjs +47 -4
  281. package/dist/mjs/core/managers/frontier-dependency-manager.mjs.map +3 -3
  282. package/dist/mjs/core/managers/named-expression-manager.mjs +104 -21
  283. package/dist/mjs/core/managers/named-expression-manager.mjs.map +3 -3
  284. package/dist/mjs/core/managers/reference-manager.mjs +7 -1
  285. package/dist/mjs/core/managers/reference-manager.mjs.map +3 -3
  286. package/dist/mjs/core/managers/style-manager.mjs +10 -1
  287. package/dist/mjs/core/managers/style-manager.mjs.map +3 -3
  288. package/dist/mjs/core/managers/table-manager.mjs +7 -1
  289. package/dist/mjs/core/managers/table-manager.mjs.map +3 -3
  290. package/dist/mjs/core/managers/workbook-manager.mjs +20 -5
  291. package/dist/mjs/core/managers/workbook-manager.mjs.map +3 -3
  292. package/dist/mjs/core/resource-keys.mjs +27 -0
  293. package/dist/mjs/core/resource-keys.mjs.map +10 -0
  294. package/dist/mjs/evaluator/dependency-nodes/base-eval-node.mjs +17 -1
  295. package/dist/mjs/evaluator/dependency-nodes/base-eval-node.mjs.map +3 -3
  296. package/dist/mjs/evaluator/dependency-nodes/cell-value-node.mjs +4 -1
  297. package/dist/mjs/evaluator/dependency-nodes/cell-value-node.mjs.map +3 -3
  298. package/dist/mjs/evaluator/dependency-nodes/empty-cell-evaluation-node.mjs +17 -3
  299. package/dist/mjs/evaluator/dependency-nodes/empty-cell-evaluation-node.mjs.map +3 -3
  300. package/dist/mjs/evaluator/dependency-nodes/resource-dependency-node.mjs +21 -0
  301. package/dist/mjs/evaluator/dependency-nodes/resource-dependency-node.mjs.map +10 -0
  302. package/dist/mjs/evaluator/dependency-nodes/virtual-cell-value-node.mjs +4 -1
  303. package/dist/mjs/evaluator/dependency-nodes/virtual-cell-value-node.mjs.map +3 -3
  304. package/dist/mjs/evaluator/formula-evaluator.mjs +42 -4
  305. package/dist/mjs/evaluator/formula-evaluator.mjs.map +3 -3
  306. package/dist/mjs/evaluator/range-evaluation-node.mjs +17 -3
  307. package/dist/mjs/evaluator/range-evaluation-node.mjs.map +3 -3
  308. package/dist/mjs/functions/lookup/match/match.mjs +3 -2
  309. package/dist/mjs/functions/lookup/match/match.mjs.map +3 -3
  310. package/dist/mjs/functions/text/concatenate/concatenate.mjs +3 -1
  311. package/dist/mjs/functions/text/concatenate/concatenate.mjs.map +3 -3
  312. package/dist/mjs/package.json +1 -1
  313. package/dist/types/core/commands/content-commands.d.ts +31 -1
  314. package/dist/types/core/commands/named-expression-commands.d.ts +16 -1
  315. package/dist/types/core/commands/structure-commands.d.ts +24 -1
  316. package/dist/types/core/commands/table-commands.d.ts +16 -1
  317. package/dist/types/core/commands/types.d.ts +25 -1
  318. package/dist/types/core/engine-snapshot.d.ts +138 -0
  319. package/dist/types/core/engine.d.ts +1 -0
  320. package/dist/types/core/managers/cache-manager.d.ts +9 -0
  321. package/dist/types/core/managers/dependency-manager.d.ts +56 -1
  322. package/dist/types/core/managers/dependency-node.d.ts +2 -1
  323. package/dist/types/core/managers/evaluation-manager.d.ts +21 -1
  324. package/dist/types/core/managers/frontier-dependency-manager.d.ts +12 -2
  325. package/dist/types/core/managers/named-expression-manager.d.ts +17 -1
  326. package/dist/types/core/managers/reference-manager.d.ts +3 -0
  327. package/dist/types/core/managers/style-manager.d.ts +3 -0
  328. package/dist/types/core/managers/table-manager.d.ts +3 -0
  329. package/dist/types/core/managers/workbook-manager.d.ts +4 -1
  330. package/dist/types/core/resource-keys.d.ts +14 -0
  331. package/dist/types/evaluator/dependency-nodes/base-eval-node.d.ts +5 -0
  332. package/dist/types/evaluator/dependency-nodes/cell-value-node.d.ts +1 -0
  333. package/dist/types/evaluator/dependency-nodes/empty-cell-evaluation-node.d.ts +8 -1
  334. package/dist/types/evaluator/dependency-nodes/resource-dependency-node.d.ts +8 -0
  335. package/dist/types/evaluator/dependency-nodes/virtual-cell-value-node.d.ts +1 -0
  336. package/dist/types/evaluator/range-evaluation-node.d.ts +8 -1
  337. package/package.json +6 -2
@@ -7,9 +7,9 @@ class RangeEvaluationNode extends FrontierDependencyManager {
7
7
  key;
8
8
  address;
9
9
  _result;
10
- constructor(rangeKey, dependencyManager, workbookManager) {
10
+ constructor(rangeKey, dependencyManager, workbookManager, options) {
11
11
  const rangeAddress = keyToRangeAddress(rangeKey);
12
- super(rangeAddress, workbookManager, dependencyManager);
12
+ super(rangeAddress, workbookManager, dependencyManager, options);
13
13
  this.rangeKey = rangeKey;
14
14
  this.address = rangeAddress;
15
15
  this.key = rangeKey;
@@ -28,6 +28,20 @@ class RangeEvaluationNode extends FrontierDependencyManager {
28
28
  canResolve() {
29
29
  return super.canResolve() && this._result.type !== "awaiting-evaluation";
30
30
  }
31
+ restoreResolvedSnapshot(options) {
32
+ super.restoreResolvedSnapshot({
33
+ dependencies: options.dependencies
34
+ });
35
+ this._result = options.result;
36
+ }
37
+ invalidate() {
38
+ super.invalidate();
39
+ this._result = {
40
+ type: "awaiting-evaluation",
41
+ waitingFor: this,
42
+ errAddress: this
43
+ };
44
+ }
31
45
  toJSON(visitor = new Set) {
32
46
  const hasVisited = visitor?.has(this.key);
33
47
  visitor?.add(this.key);
@@ -55,4 +69,4 @@ export {
55
69
  RangeEvaluationNode
56
70
  };
57
71
 
58
- //# debugId=E7418D30D9D7EAAD64756E2164756E21
72
+ //# debugId=CB41D7681035F56A64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/evaluator/range-evaluation-node.ts"],
4
4
  "sourcesContent": [
5
- "import type { DependencyManager } from \"../core/managers/dependency-manager.mjs\";\nimport { FrontierDependencyManager } from \"../core/managers/frontier-dependency-manager.mjs\";\nimport type { WorkbookManager } from \"../core/managers/workbook-manager.mjs\";\nimport type { EvaluateAllCellsResult, RangeAddress } from \"../core/types.mjs\";\nimport { getRangeKey, keyToRangeAddress } from \"../core/utils.mjs\";\n\nexport class RangeEvaluationNode extends FrontierDependencyManager {\n public key: string;\n public address: RangeAddress;\n\n private _result: EvaluateAllCellsResult;\n\n constructor(\n public rangeKey: string,\n dependencyManager: DependencyManager,\n workbookManager: WorkbookManager\n ) {\n const rangeAddress = keyToRangeAddress(rangeKey);\n super(rangeAddress, workbookManager, dependencyManager);\n\n this.address = rangeAddress;\n this.key = rangeKey;\n this._result = {\n type: \"awaiting-evaluation\",\n waitingFor: this,\n errAddress: this,\n };\n }\n\n setResult(result: EvaluateAllCellsResult): void {\n this._result = result;\n }\n\n public get result(): EvaluateAllCellsResult {\n return this._result;\n }\n\n public override canResolve(): boolean {\n return super.canResolve() && this._result.type !== \"awaiting-evaluation\";\n }\n\n toJSON(visitor: Set<string> = new Set()): any {\n const hasVisited = visitor?.has(this.key);\n visitor?.add(this.key);\n if (hasVisited) {\n return {\n key: this.key,\n resolved: this.resolved,\n cycle: true,\n dependencies: [],\n frontierDependencies: [],\n };\n }\n return {\n key: this.key,\n resolved: this.resolved,\n dependencies: Array.from(this.getDependencies()).map((node) =>\n node.toJSON(visitor)\n ),\n frontierDependencies: Array.from(this.getFrontierDependencies()).map(\n (node) => node.toJSON(visitor)\n ),\n };\n }\n\n public override toString(): string {\n return getRangeKey(this.address.range);\n }\n}\n"
5
+ "import type { DependencyManager } from \"../core/managers/dependency-manager.mjs\";\nimport { FrontierDependencyManager } from \"../core/managers/frontier-dependency-manager.mjs\";\nimport type { WorkbookManager } from \"../core/managers/workbook-manager.mjs\";\nimport type { EvaluateAllCellsResult, RangeAddress } from \"../core/types.mjs\";\nimport { getRangeKey, keyToRangeAddress } from \"../core/utils.mjs\";\n\nexport class RangeEvaluationNode extends FrontierDependencyManager {\n public key: string;\n public address: RangeAddress;\n\n private _result: EvaluateAllCellsResult;\n\n constructor(\n public rangeKey: string,\n dependencyManager: DependencyManager,\n workbookManager: WorkbookManager,\n options?: { skipInitialBuild?: boolean }\n ) {\n const rangeAddress = keyToRangeAddress(rangeKey);\n super(rangeAddress, workbookManager, dependencyManager, options);\n\n this.address = rangeAddress;\n this.key = rangeKey;\n this._result = {\n type: \"awaiting-evaluation\",\n waitingFor: this,\n errAddress: this,\n };\n }\n\n setResult(result: EvaluateAllCellsResult): void {\n this._result = result;\n }\n\n public get result(): EvaluateAllCellsResult {\n return this._result;\n }\n\n public override canResolve(): boolean {\n return super.canResolve() && this._result.type !== \"awaiting-evaluation\";\n }\n\n public override restoreResolvedSnapshot(options: {\n dependencies: Set<import(\"../core/managers/dependency-node.mjs\").DependencyNode>;\n result: EvaluateAllCellsResult;\n }) {\n super.restoreResolvedSnapshot({\n dependencies: options.dependencies,\n });\n this._result = options.result;\n }\n\n public override invalidate() {\n super.invalidate();\n this._result = {\n type: \"awaiting-evaluation\",\n waitingFor: this,\n errAddress: this,\n };\n }\n\n toJSON(visitor: Set<string> = new Set()): any {\n const hasVisited = visitor?.has(this.key);\n visitor?.add(this.key);\n if (hasVisited) {\n return {\n key: this.key,\n resolved: this.resolved,\n cycle: true,\n dependencies: [],\n frontierDependencies: [],\n };\n }\n return {\n key: this.key,\n resolved: this.resolved,\n dependencies: Array.from(this.getDependencies()).map((node) =>\n node.toJSON(visitor)\n ),\n frontierDependencies: Array.from(this.getFrontierDependencies()).map(\n (node) => node.toJSON(visitor)\n ),\n };\n }\n\n public override toString(): string {\n return getRangeKey(this.address.range);\n }\n}\n"
6
6
  ],
7
- "mappings": ";AACA;AAGA;AAAA;AAEO,MAAM,4BAA4B,0BAA0B;AAAA,EAOxD;AAAA,EANF;AAAA,EACA;AAAA,EAEC;AAAA,EAER,WAAW,CACF,UACP,mBACA,iBACA;AAAA,IACA,MAAM,eAAe,kBAAkB,QAAQ;AAAA,IAC/C,MAAM,cAAc,iBAAiB,iBAAiB;AAAA,IAL/C;AAAA,IAOP,KAAK,UAAU;AAAA,IACf,KAAK,MAAM;AAAA,IACX,KAAK,UAAU;AAAA,MACb,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,IACd;AAAA;AAAA,EAGF,SAAS,CAAC,QAAsC;AAAA,IAC9C,KAAK,UAAU;AAAA;AAAA,MAGN,MAAM,GAA2B;AAAA,IAC1C,OAAO,KAAK;AAAA;AAAA,EAGE,UAAU,GAAY;AAAA,IACpC,OAAO,MAAM,WAAW,KAAK,KAAK,QAAQ,SAAS;AAAA;AAAA,EAGrD,MAAM,CAAC,UAAuB,IAAI,KAAY;AAAA,IAC5C,MAAM,aAAa,SAAS,IAAI,KAAK,GAAG;AAAA,IACxC,SAAS,IAAI,KAAK,GAAG;AAAA,IACrB,IAAI,YAAY;AAAA,MACd,OAAO;AAAA,QACL,KAAK,KAAK;AAAA,QACV,UAAU,KAAK;AAAA,QACf,OAAO;AAAA,QACP,cAAc,CAAC;AAAA,QACf,sBAAsB,CAAC;AAAA,MACzB;AAAA,IACF;AAAA,IACA,OAAO;AAAA,MACL,KAAK,KAAK;AAAA,MACV,UAAU,KAAK;AAAA,MACf,cAAc,MAAM,KAAK,KAAK,gBAAgB,CAAC,EAAE,IAAI,CAAC,SACpD,KAAK,OAAO,OAAO,CACrB;AAAA,MACA,sBAAsB,MAAM,KAAK,KAAK,wBAAwB,CAAC,EAAE,IAC/D,CAAC,SAAS,KAAK,OAAO,OAAO,CAC/B;AAAA,IACF;AAAA;AAAA,EAGc,QAAQ,GAAW;AAAA,IACjC,OAAO,YAAY,KAAK,QAAQ,KAAK;AAAA;AAEzC;",
8
- "debugId": "E7418D30D9D7EAAD64756E2164756E21",
7
+ "mappings": ";AACA;AAGA;AAAA;AAEO,MAAM,4BAA4B,0BAA0B;AAAA,EAOxD;AAAA,EANF;AAAA,EACA;AAAA,EAEC;AAAA,EAER,WAAW,CACF,UACP,mBACA,iBACA,SACA;AAAA,IACA,MAAM,eAAe,kBAAkB,QAAQ;AAAA,IAC/C,MAAM,cAAc,iBAAiB,mBAAmB,OAAO;AAAA,IANxD;AAAA,IAQP,KAAK,UAAU;AAAA,IACf,KAAK,MAAM;AAAA,IACX,KAAK,UAAU;AAAA,MACb,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,IACd;AAAA;AAAA,EAGF,SAAS,CAAC,QAAsC;AAAA,IAC9C,KAAK,UAAU;AAAA;AAAA,MAGN,MAAM,GAA2B;AAAA,IAC1C,OAAO,KAAK;AAAA;AAAA,EAGE,UAAU,GAAY;AAAA,IACpC,OAAO,MAAM,WAAW,KAAK,KAAK,QAAQ,SAAS;AAAA;AAAA,EAGrC,uBAAuB,CAAC,SAGrC;AAAA,IACD,MAAM,wBAAwB;AAAA,MAC5B,cAAc,QAAQ;AAAA,IACxB,CAAC;AAAA,IACD,KAAK,UAAU,QAAQ;AAAA;AAAA,EAGT,UAAU,GAAG;AAAA,IAC3B,MAAM,WAAW;AAAA,IACjB,KAAK,UAAU;AAAA,MACb,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,IACd;AAAA;AAAA,EAGF,MAAM,CAAC,UAAuB,IAAI,KAAY;AAAA,IAC5C,MAAM,aAAa,SAAS,IAAI,KAAK,GAAG;AAAA,IACxC,SAAS,IAAI,KAAK,GAAG;AAAA,IACrB,IAAI,YAAY;AAAA,MACd,OAAO;AAAA,QACL,KAAK,KAAK;AAAA,QACV,UAAU,KAAK;AAAA,QACf,OAAO;AAAA,QACP,cAAc,CAAC;AAAA,QACf,sBAAsB,CAAC;AAAA,MACzB;AAAA,IACF;AAAA,IACA,OAAO;AAAA,MACL,KAAK,KAAK;AAAA,MACV,UAAU,KAAK;AAAA,MACf,cAAc,MAAM,KAAK,KAAK,gBAAgB,CAAC,EAAE,IAAI,CAAC,SACpD,KAAK,OAAO,OAAO,CACrB;AAAA,MACA,sBAAsB,MAAM,KAAK,KAAK,wBAAwB,CAAC,EAAE,IAC/D,CAAC,SAAS,KAAK,OAAO,OAAO,CAC/B;AAAA,IACF;AAAA;AAAA,EAGc,QAAQ,GAAW;AAAA,IACjC,OAAO,YAAY,KAAK,QAAQ,KAAK;AAAA;AAEzC;",
8
+ "debugId": "CB41D7681035F56A64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -26,7 +26,8 @@ function matchOperation(lookupValue, lookupArray, matchType, context, isHorizont
26
26
  if (value.result.type === "value") {
27
27
  if (matchType === 0) {
28
28
  const arrayValue = value.result.result;
29
- if (arrayValue.type === lookupValue.type && arrayValue.value === lookupValue.value) {
29
+ const isMatch = arrayValue.type === lookupValue.type && (arrayValue.type === "string" && lookupValue.type === "string" ? arrayValue.value.toLowerCase() === lookupValue.value.toLowerCase() : arrayValue.value === lookupValue.value);
30
+ if (isMatch) {
30
31
  const position = isHorizontal ? value.relativePos.x + 1 : value.relativePos.y + 1;
31
32
  return {
32
33
  type: "value",
@@ -137,4 +138,4 @@ export {
137
138
  MATCH
138
139
  };
139
140
 
140
- //# debugId=BA7EA11C6CC1796964756E2164756E21
141
+ //# debugId=E8B4E1E3709915CB64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/functions/lookup/match/match.ts"],
4
4
  "sourcesContent": [
5
- "import {\n FormulaError,\n type CellValue,\n type EvaluateAllCellsResult,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n} from \"../../../core/types.mjs\";\nimport type { EvaluationContext } from \"../../../evaluator/evaluation-context.mjs\";\n\n/**\n * MATCH function - Returns the position of a value in an array\n * MATCH(lookup_value, lookup_array, [match_type])\n * match_type: 1 = less than or equal (default), 0 = exact match, -1 = greater than or equal\n *\n * STRICT TYPE CHECKING:\n * - lookup_value: string or number only\n * - lookup_array: array of strings or numbers only\n * - match_type: number only (must be -1, 0, or 1)\n */\n\n// Helper function to perform MATCH operation\nfunction matchOperation(\n lookupValue: CellValue,\n lookupArray: EvaluateAllCellsResult,\n matchType: number,\n context: EvaluationContext,\n isHorizontal: boolean\n): FunctionEvaluationResult {\n // Strict type checking for lookup_value\n if (lookupValue.type !== \"string\" && lookupValue.type !== \"number\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: `MATCH lookup_value must be string or number, got ${lookupValue.type}`,\n errAddress: context.dependencyNode,\n };\n }\n\n // Validate match_type\n if (matchType !== -1 && matchType !== 0 && matchType !== 1) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: `MATCH match_type must be -1, 0, or 1, got ${matchType}`,\n errAddress: context.dependencyNode,\n };\n }\n if (\n lookupArray.type === \"awaiting-evaluation\" ||\n lookupArray.type === \"error\"\n ) {\n return lookupArray;\n }\n\n for (const value of lookupArray.values) {\n if (value.result.type === \"value\") {\n if (matchType === 0) {\n // Exact match\n const arrayValue = value.result.result;\n\n if (\n arrayValue.type === lookupValue.type &&\n arrayValue.value === lookupValue.value\n ) {\n // For horizontal arrays (single row), use x position (column index)\n // For vertical arrays (single/multiple columns), use y position (row index)\n const position = isHorizontal\n ? value.relativePos.x + 1\n : value.relativePos.y + 1;\n\n return {\n type: \"value\",\n result: { type: \"number\", value: position },\n }; // 1-based index\n }\n } else {\n // Approximate match (1 or -1) - requires sorted array\n // For now, throw an error until we add sorting validation\n // TODO: Add proper approximate match logic with sorted array validation\n throw new Error(\"MATCH: approximate match not fully implemented\");\n }\n }\n }\n\n return {\n type: \"error\",\n err: FormulaError.NA,\n message: \"MATCH: lookup_value not found in lookup_array\",\n errAddress: context.dependencyNode,\n };\n}\n\nexport const MATCH: FunctionDefinition = {\n name: \"MATCH\",\n evaluate: function (node, context): FunctionEvaluationResult {\n if (node.args.length < 2 || node.args.length > 3) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"MATCH function takes 2 or 3 arguments\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Evaluate lookup_value\n const lookupValueResult = this.evaluateNode(node.args[0]!, context);\n if (\n lookupValueResult.type === \"error\" ||\n lookupValueResult.type === \"awaiting-evaluation\"\n ) {\n return lookupValueResult;\n }\n\n // Evaluate lookup_array\n const lookupArrayResult = this.evaluateNode(node.args[1]!, context);\n if (\n lookupArrayResult.type === \"error\" ||\n lookupArrayResult.type === \"awaiting-evaluation\"\n ) {\n return lookupArrayResult;\n }\n\n // Evaluate match_type (optional, defaults to 1)\n let matchTypeResult: FunctionEvaluationResult = {\n type: \"value\",\n result: { type: \"number\", value: 1 },\n };\n\n if (node.args[2]) {\n matchTypeResult = this.evaluateNode(node.args[2], context);\n if (\n matchTypeResult.type === \"error\" ||\n matchTypeResult.type === \"awaiting-evaluation\"\n ) {\n return matchTypeResult;\n }\n }\n\n // Handle spilled arrays for lookup_value and match_type (not lookup_array which is expected to be a range)\n if (\n lookupValueResult.type === \"spilled-values\" ||\n matchTypeResult.type === \"spilled-values\"\n ) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"MATCH: Spilled array arguments not yet implemented\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Strict type checking for match_type\n if (matchTypeResult.result.type !== \"number\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: `MATCH match_type must be number, got ${matchTypeResult.result.type}`,\n errAddress: context.dependencyNode,\n };\n }\n\n // Extract lookup_array values\n let lookupArray: EvaluateAllCellsResult = {\n type: \"awaiting-evaluation\",\n waitingFor: context.dependencyNode,\n errAddress: context.dependencyNode,\n };\n let isHorizontal = false;\n\n // Handle direct range arguments (like A:A) before extracting lookup_array values\n\n // Extract lookup_array values for non-infinite ranges\n if (lookupArrayResult.type === \"value\") {\n // Single value case - treat as array with one element\n lookupArray = {\n type: \"values\",\n values: [{ result: lookupArrayResult, relativePos: { x: 0, y: 0 } }],\n };\n isHorizontal = false; // Single value, treat as vertical\n } else if (lookupArrayResult.type === \"spilled-values\") {\n // Validate that lookup_array is 1D (either single row OR single column)\n const spillArea = lookupArrayResult.spillArea(context.cellAddress);\n const startRow = spillArea.start.row;\n const endRow = spillArea.end.row;\n const startCol = spillArea.start.col;\n const endCol = spillArea.end.col;\n\n // Check if it's a single row (horizontal)\n const isSingleRow = endRow.type === \"number\" && startRow === endRow.value;\n\n // Check if it's a single column (vertical)\n const isSingleCol = endCol.type === \"number\" && startCol === endCol.value;\n\n // MATCH requires a 1D array - either single row OR single column, not both or neither\n if (!isSingleRow && !isSingleCol) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message:\n \"MATCH lookup_array must be a single row or single column (1D array)\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Cannot be both single row AND single column (that would be a single cell, which is handled)\n if (isSingleRow && isSingleCol) {\n // This is actually a single cell, which is fine\n isHorizontal = false; // Treat single cell as vertical\n } else {\n // Horizontal if it's a single row\n isHorizontal = isSingleRow;\n }\n\n // Extract values from spilled array\n lookupArray = lookupArrayResult.evaluateAllCells.call(this, {\n context,\n evaluate: lookupArrayResult.evaluate,\n origin: context.cellAddress,\n lookupOrder: \"col-major\",\n });\n }\n\n // Perform MATCH operation\n return matchOperation(\n lookupValueResult.result,\n lookupArray,\n Math.floor(matchTypeResult.result.value), // Floor to handle decimal inputs\n context,\n isHorizontal\n );\n },\n};\n"
5
+ "import {\n FormulaError,\n type CellValue,\n type EvaluateAllCellsResult,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n} from \"../../../core/types.mjs\";\nimport type { EvaluationContext } from \"../../../evaluator/evaluation-context.mjs\";\n\n/**\n * MATCH function - Returns the position of a value in an array\n * MATCH(lookup_value, lookup_array, [match_type])\n * match_type: 1 = less than or equal (default), 0 = exact match, -1 = greater than or equal\n *\n * STRICT TYPE CHECKING:\n * - lookup_value: string or number only\n * - lookup_array: array of strings or numbers only\n * - match_type: number only (must be -1, 0, or 1)\n */\n\n// Helper function to perform MATCH operation\nfunction matchOperation(\n lookupValue: CellValue,\n lookupArray: EvaluateAllCellsResult,\n matchType: number,\n context: EvaluationContext,\n isHorizontal: boolean\n): FunctionEvaluationResult {\n // Strict type checking for lookup_value\n if (lookupValue.type !== \"string\" && lookupValue.type !== \"number\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: `MATCH lookup_value must be string or number, got ${lookupValue.type}`,\n errAddress: context.dependencyNode,\n };\n }\n\n // Validate match_type\n if (matchType !== -1 && matchType !== 0 && matchType !== 1) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: `MATCH match_type must be -1, 0, or 1, got ${matchType}`,\n errAddress: context.dependencyNode,\n };\n }\n if (\n lookupArray.type === \"awaiting-evaluation\" ||\n lookupArray.type === \"error\"\n ) {\n return lookupArray;\n }\n\n for (const value of lookupArray.values) {\n if (value.result.type === \"value\") {\n if (matchType === 0) {\n // Exact match (case-insensitive for strings, matching Excel behavior)\n const arrayValue = value.result.result;\n\n const isMatch =\n arrayValue.type === lookupValue.type &&\n (arrayValue.type === \"string\" && lookupValue.type === \"string\"\n ? arrayValue.value.toLowerCase() === lookupValue.value.toLowerCase()\n : arrayValue.value === lookupValue.value);\n\n if (isMatch) {\n // For horizontal arrays (single row), use x position (column index)\n // For vertical arrays (single/multiple columns), use y position (row index)\n const position = isHorizontal\n ? value.relativePos.x + 1\n : value.relativePos.y + 1;\n\n return {\n type: \"value\",\n result: { type: \"number\", value: position },\n }; // 1-based index\n }\n } else {\n // Approximate match (1 or -1) - requires sorted array\n // For now, throw an error until we add sorting validation\n // TODO: Add proper approximate match logic with sorted array validation\n throw new Error(\"MATCH: approximate match not fully implemented\");\n }\n }\n }\n\n return {\n type: \"error\",\n err: FormulaError.NA,\n message: \"MATCH: lookup_value not found in lookup_array\",\n errAddress: context.dependencyNode,\n };\n}\n\nexport const MATCH: FunctionDefinition = {\n name: \"MATCH\",\n evaluate: function (node, context): FunctionEvaluationResult {\n if (node.args.length < 2 || node.args.length > 3) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"MATCH function takes 2 or 3 arguments\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Evaluate lookup_value\n const lookupValueResult = this.evaluateNode(node.args[0]!, context);\n if (\n lookupValueResult.type === \"error\" ||\n lookupValueResult.type === \"awaiting-evaluation\"\n ) {\n return lookupValueResult;\n }\n\n // Evaluate lookup_array\n const lookupArrayResult = this.evaluateNode(node.args[1]!, context);\n if (\n lookupArrayResult.type === \"error\" ||\n lookupArrayResult.type === \"awaiting-evaluation\"\n ) {\n return lookupArrayResult;\n }\n\n // Evaluate match_type (optional, defaults to 1)\n let matchTypeResult: FunctionEvaluationResult = {\n type: \"value\",\n result: { type: \"number\", value: 1 },\n };\n\n if (node.args[2]) {\n matchTypeResult = this.evaluateNode(node.args[2], context);\n if (\n matchTypeResult.type === \"error\" ||\n matchTypeResult.type === \"awaiting-evaluation\"\n ) {\n return matchTypeResult;\n }\n }\n\n // Handle spilled arrays for lookup_value and match_type (not lookup_array which is expected to be a range)\n if (\n lookupValueResult.type === \"spilled-values\" ||\n matchTypeResult.type === \"spilled-values\"\n ) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"MATCH: Spilled array arguments not yet implemented\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Strict type checking for match_type\n if (matchTypeResult.result.type !== \"number\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: `MATCH match_type must be number, got ${matchTypeResult.result.type}`,\n errAddress: context.dependencyNode,\n };\n }\n\n // Extract lookup_array values\n let lookupArray: EvaluateAllCellsResult = {\n type: \"awaiting-evaluation\",\n waitingFor: context.dependencyNode,\n errAddress: context.dependencyNode,\n };\n let isHorizontal = false;\n\n // Handle direct range arguments (like A:A) before extracting lookup_array values\n\n // Extract lookup_array values for non-infinite ranges\n if (lookupArrayResult.type === \"value\") {\n // Single value case - treat as array with one element\n lookupArray = {\n type: \"values\",\n values: [{ result: lookupArrayResult, relativePos: { x: 0, y: 0 } }],\n };\n isHorizontal = false; // Single value, treat as vertical\n } else if (lookupArrayResult.type === \"spilled-values\") {\n // Validate that lookup_array is 1D (either single row OR single column)\n const spillArea = lookupArrayResult.spillArea(context.cellAddress);\n const startRow = spillArea.start.row;\n const endRow = spillArea.end.row;\n const startCol = spillArea.start.col;\n const endCol = spillArea.end.col;\n\n // Check if it's a single row (horizontal)\n const isSingleRow = endRow.type === \"number\" && startRow === endRow.value;\n\n // Check if it's a single column (vertical)\n const isSingleCol = endCol.type === \"number\" && startCol === endCol.value;\n\n // MATCH requires a 1D array - either single row OR single column, not both or neither\n if (!isSingleRow && !isSingleCol) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message:\n \"MATCH lookup_array must be a single row or single column (1D array)\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Cannot be both single row AND single column (that would be a single cell, which is handled)\n if (isSingleRow && isSingleCol) {\n // This is actually a single cell, which is fine\n isHorizontal = false; // Treat single cell as vertical\n } else {\n // Horizontal if it's a single row\n isHorizontal = isSingleRow;\n }\n\n // Extract values from spilled array\n lookupArray = lookupArrayResult.evaluateAllCells.call(this, {\n context,\n evaluate: lookupArrayResult.evaluate,\n origin: context.cellAddress,\n lookupOrder: \"col-major\",\n });\n }\n\n // Perform MATCH operation\n return matchOperation(\n lookupValueResult.result,\n lookupArray,\n Math.floor(matchTypeResult.result.value), // Floor to handle decimal inputs\n context,\n isHorizontal\n );\n },\n};\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "BA7EA11C6CC1796964756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "E8B4E1E3709915CB64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -26,6 +26,8 @@ function coerceToString(result, context) {
26
26
  }
27
27
  case "boolean":
28
28
  return result.result.value ? "TRUE" : "FALSE";
29
+ case "infinity":
30
+ return result.result.sign === "positive" ? "INFINITY" : "-INFINITY";
29
31
  default:
30
32
  return {
31
33
  type: "error",
@@ -136,4 +138,4 @@ export {
136
138
  CONCATENATE
137
139
  };
138
140
 
139
- //# debugId=51EDA2D25EB87B1F64756E2164756E21
141
+ //# debugId=E486EB6FD50D339A64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/functions/text/concatenate/concatenate.ts"],
4
4
  "sourcesContent": [
5
- "import {\n FormulaError,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n type CellString,\n type CellAddress,\n type SpreadsheetRange,\n type SpilledValuesEvaluationResult,\n type ErrorEvaluationResult,\n type SingleEvaluationResult,\n} from \"../../../core/types.mjs\";\nimport { FormulaEvaluator } from \"../../../evaluator/formula-evaluator.mjs\";\nimport type { FunctionNode } from \"../../../parser/ast.mjs\";\nimport type { EvaluationContext } from \"../../../evaluator/evaluation-context.mjs\";\n\n/**\n * CONCATENATE function - Joins several text strings into one text string\n *\n * Usage: CONCATENATE(text1, text2, ...)\n *\n * text1, text2, ...: Text strings to be joined together.\n *\n * Example: CONCATENATE(\"Hello\", \" \", \"World\") returns \"Hello World\"\n *\n * Note:\n * - Takes 1 or more arguments\n * - Supports type coercion: strings, numbers, and booleans are converted to strings\n * - Numbers: converted to string representation (123 -> \"123\", Infinity -> \"INFINITY\")\n * - Booleans: TRUE -> \"TRUE\", FALSE -> \"FALSE\"\n * - Supports dynamic arrays (spilled values) for arguments\n * - If any argument is a spilled value, the result will be spilled\n */\n\n/**\n * Helper function to convert a cell value to string with type coercion\n */\nfunction coerceToString(\n result: FunctionEvaluationResult,\n context: EvaluationContext\n): string | ErrorEvaluationResult {\n if (result.type !== \"value\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Invalid argument type\",\n errAddress: context.dependencyNode,\n };\n }\n\n switch (result.result.type) {\n case \"string\":\n return result.result.value;\n case \"number\":\n // Convert number to string\n if (result.result.value === Infinity) {\n return \"INFINITY\";\n } else if (result.result.value === -Infinity) {\n return \"-INFINITY\";\n } else if (isNaN(result.result.value)) {\n return \"NaN\";\n } else {\n return result.result.value.toString();\n }\n case \"boolean\":\n // Convert boolean to string\n return result.result.value ? \"TRUE\" : \"FALSE\";\n default:\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Cannot convert argument to string\",\n errAddress: context.dependencyNode,\n };\n }\n}\n\n/**\n * Helper function to perform CONCATENATE operation on evaluated arguments\n */\nfunction concatenateOperation(\n textResults: FunctionEvaluationResult[],\n context: EvaluationContext\n): { type: \"value\"; result: CellString } | ErrorEvaluationResult {\n let result = \"\";\n for (const textResult of textResults) {\n const stringValue = coerceToString(textResult, context);\n if (typeof stringValue === \"object\" && stringValue.type === \"error\") {\n return stringValue;\n }\n result += stringValue;\n }\n return { type: \"value\", result: { type: \"string\", value: result } };\n}\n\n/**\n * Helper for creating spilled-values result for CONCATENATE function\n */\nfunction createConcatenateSpilledResult(\n this: FormulaEvaluator,\n {\n textResults,\n context,\n }: {\n textResults: FunctionEvaluationResult[];\n context: EvaluationContext;\n }\n): SpilledValuesEvaluationResult | ErrorEvaluationResult {\n const spilledResults = textResults.filter(\n (result) => result.type === \"spilled-values\"\n );\n\n if (spilledResults.length === 0) {\n throw new Error(\n \"createConcatenateSpilledResult called without spilled values\"\n );\n }\n\n return {\n type: \"spilled-values\",\n spillArea: (origin: CellAddress): SpreadsheetRange => {\n // Calculate spill area (union of all spilled ranges)\n let spillArea: SpreadsheetRange | undefined;\n\n for (const result of textResults) {\n if (result.type === \"spilled-values\") {\n const currentSpillArea = result.spillArea(origin);\n if (!spillArea) {\n spillArea = currentSpillArea;\n } else {\n spillArea = this.unionRanges(\n this.projectRange(spillArea, origin),\n this.projectRange(currentSpillArea, origin)\n );\n }\n }\n }\n\n if (!spillArea) {\n throw new Error(\"No spilled values found\");\n }\n return spillArea;\n },\n source: \"CONCATENATE with spilled values\",\n evaluate: (spilledCell, evalContext): SingleEvaluationResult => {\n // Evaluate all arguments at this spilled position\n const spilledTextResults: FunctionEvaluationResult[] = [];\n\n for (const textResult of textResults) {\n if (textResult.type === \"spilled-values\") {\n const spillResult = textResult.evaluate(spilledCell, evalContext);\n if (spillResult === undefined) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"The spilled results have not been evaluated\",\n errAddress: context.dependencyNode,\n };\n }\n if (spillResult.type === \"error\") {\n return spillResult;\n }\n spilledTextResults.push(spillResult);\n } else {\n spilledTextResults.push(textResult);\n }\n }\n\n return concatenateOperation(spilledTextResults, context);\n },\n evaluateAllCells: (intersectingRange) => {\n throw new Error(\n \"WIP: evaluateAllCells for CONCATENATE is not implemented\"\n );\n },\n };\n}\n\n/**\n * CONCATENATE function implementation\n */\nexport const CONCATENATE: FunctionDefinition = {\n name: \"CONCATENATE\",\n evaluate: function (\n node: FunctionNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n if (node.args.length < 1) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"CONCATENATE function requires at least 1 argument\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Evaluate all arguments\n const textResults: FunctionEvaluationResult[] = [];\n for (const arg of node.args) {\n const result = this.evaluateNode(arg, context);\n if (result.type === \"error\" || result.type === \"awaiting-evaluation\") {\n return result;\n }\n textResults.push(result);\n }\n\n // Check if any arguments are spilled values\n const hasSpilledValues = textResults.some(\n (result) => result.type === \"spilled-values\"\n );\n\n if (hasSpilledValues) {\n return createConcatenateSpilledResult.call(this, {\n textResults,\n context,\n });\n }\n\n // All arguments are single values - type coercion will be handled in concatenateOperation\n\n // Perform concatenation\n return concatenateOperation(textResults, context);\n },\n aliases: [\"CONCAT\"],\n};\n"
5
+ "import {\n FormulaError,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n type CellString,\n type CellAddress,\n type SpreadsheetRange,\n type SpilledValuesEvaluationResult,\n type ErrorEvaluationResult,\n type SingleEvaluationResult,\n} from \"../../../core/types.mjs\";\nimport { FormulaEvaluator } from \"../../../evaluator/formula-evaluator.mjs\";\nimport type { FunctionNode } from \"../../../parser/ast.mjs\";\nimport type { EvaluationContext } from \"../../../evaluator/evaluation-context.mjs\";\n\n/**\n * CONCATENATE function - Joins several text strings into one text string\n *\n * Usage: CONCATENATE(text1, text2, ...)\n *\n * text1, text2, ...: Text strings to be joined together.\n *\n * Example: CONCATENATE(\"Hello\", \" \", \"World\") returns \"Hello World\"\n *\n * Note:\n * - Takes 1 or more arguments\n * - Supports type coercion: strings, numbers, and booleans are converted to strings\n * - Numbers: converted to string representation (123 -> \"123\", Infinity -> \"INFINITY\")\n * - Booleans: TRUE -> \"TRUE\", FALSE -> \"FALSE\"\n * - Supports dynamic arrays (spilled values) for arguments\n * - If any argument is a spilled value, the result will be spilled\n */\n\n/**\n * Helper function to convert a cell value to string with type coercion\n */\nfunction coerceToString(\n result: FunctionEvaluationResult,\n context: EvaluationContext\n): string | ErrorEvaluationResult {\n if (result.type !== \"value\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Invalid argument type\",\n errAddress: context.dependencyNode,\n };\n }\n\n switch (result.result.type) {\n case \"string\":\n return result.result.value;\n case \"number\":\n // Convert number to string\n if (result.result.value === Infinity) {\n return \"INFINITY\";\n } else if (result.result.value === -Infinity) {\n return \"-INFINITY\";\n } else if (isNaN(result.result.value)) {\n return \"NaN\";\n } else {\n return result.result.value.toString();\n }\n case \"boolean\":\n // Convert boolean to string\n return result.result.value ? \"TRUE\" : \"FALSE\";\n case \"infinity\":\n return result.result.sign === \"positive\" ? \"INFINITY\" : \"-INFINITY\";\n default:\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Cannot convert argument to string\",\n errAddress: context.dependencyNode,\n };\n }\n}\n\n/**\n * Helper function to perform CONCATENATE operation on evaluated arguments\n */\nfunction concatenateOperation(\n textResults: FunctionEvaluationResult[],\n context: EvaluationContext\n): { type: \"value\"; result: CellString } | ErrorEvaluationResult {\n let result = \"\";\n for (const textResult of textResults) {\n const stringValue = coerceToString(textResult, context);\n if (typeof stringValue === \"object\" && stringValue.type === \"error\") {\n return stringValue;\n }\n result += stringValue;\n }\n return { type: \"value\", result: { type: \"string\", value: result } };\n}\n\n/**\n * Helper for creating spilled-values result for CONCATENATE function\n */\nfunction createConcatenateSpilledResult(\n this: FormulaEvaluator,\n {\n textResults,\n context,\n }: {\n textResults: FunctionEvaluationResult[];\n context: EvaluationContext;\n }\n): SpilledValuesEvaluationResult | ErrorEvaluationResult {\n const spilledResults = textResults.filter(\n (result) => result.type === \"spilled-values\"\n );\n\n if (spilledResults.length === 0) {\n throw new Error(\n \"createConcatenateSpilledResult called without spilled values\"\n );\n }\n\n return {\n type: \"spilled-values\",\n spillArea: (origin: CellAddress): SpreadsheetRange => {\n // Calculate spill area (union of all spilled ranges)\n let spillArea: SpreadsheetRange | undefined;\n\n for (const result of textResults) {\n if (result.type === \"spilled-values\") {\n const currentSpillArea = result.spillArea(origin);\n if (!spillArea) {\n spillArea = currentSpillArea;\n } else {\n spillArea = this.unionRanges(\n this.projectRange(spillArea, origin),\n this.projectRange(currentSpillArea, origin)\n );\n }\n }\n }\n\n if (!spillArea) {\n throw new Error(\"No spilled values found\");\n }\n return spillArea;\n },\n source: \"CONCATENATE with spilled values\",\n evaluate: (spilledCell, evalContext): SingleEvaluationResult => {\n // Evaluate all arguments at this spilled position\n const spilledTextResults: FunctionEvaluationResult[] = [];\n\n for (const textResult of textResults) {\n if (textResult.type === \"spilled-values\") {\n const spillResult = textResult.evaluate(spilledCell, evalContext);\n if (spillResult === undefined) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"The spilled results have not been evaluated\",\n errAddress: context.dependencyNode,\n };\n }\n if (spillResult.type === \"error\") {\n return spillResult;\n }\n spilledTextResults.push(spillResult);\n } else {\n spilledTextResults.push(textResult);\n }\n }\n\n return concatenateOperation(spilledTextResults, context);\n },\n evaluateAllCells: (intersectingRange) => {\n throw new Error(\n \"WIP: evaluateAllCells for CONCATENATE is not implemented\"\n );\n },\n };\n}\n\n/**\n * CONCATENATE function implementation\n */\nexport const CONCATENATE: FunctionDefinition = {\n name: \"CONCATENATE\",\n evaluate: function (\n node: FunctionNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n if (node.args.length < 1) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"CONCATENATE function requires at least 1 argument\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Evaluate all arguments\n const textResults: FunctionEvaluationResult[] = [];\n for (const arg of node.args) {\n const result = this.evaluateNode(arg, context);\n if (result.type === \"error\" || result.type === \"awaiting-evaluation\") {\n return result;\n }\n textResults.push(result);\n }\n\n // Check if any arguments are spilled values\n const hasSpilledValues = textResults.some(\n (result) => result.type === \"spilled-values\"\n );\n\n if (hasSpilledValues) {\n return createConcatenateSpilledResult.call(this, {\n textResults,\n context,\n });\n }\n\n // All arguments are single values - type coercion will be handled in concatenateOperation\n\n // Perform concatenation\n return concatenateOperation(textResults, context);\n },\n aliases: [\"CONCAT\"],\n};\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "51EDA2D25EB87B1F64756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "E486EB6FD50D339A64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@ricsam/formula-engine",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
4
4
  "type": "module"
5
5
  }
@@ -6,7 +6,7 @@
6
6
  import type { WorkbookManager } from "../managers/workbook-manager";
7
7
  import type { CopyManager } from "../managers/copy-manager";
8
8
  import type { CellAddress, CopyCellsOptions, RangeAddress, SerializedCellValue } from "../types";
9
- import type { EngineCommand, EngineAction } from "./types";
9
+ import type { EngineCommand, EngineAction, MutationInvalidation } from "./types";
10
10
  /**
11
11
  * Command to set a single cell's content.
12
12
  */
@@ -17,9 +17,12 @@ export declare class SetCellContentCommand implements EngineCommand {
17
17
  readonly requiresReevaluation = true;
18
18
  private previousValue;
19
19
  private hadPreviousValue;
20
+ private executeFootprint;
21
+ private undoFootprint;
20
22
  constructor(workbookManager: WorkbookManager, address: CellAddress, newContent: SerializedCellValue);
21
23
  execute(): void;
22
24
  undo(): void;
25
+ getInvalidationFootprint(phase: "execute" | "undo"): MutationInvalidation;
23
26
  toAction(): EngineAction;
24
27
  }
25
28
  /**
@@ -31,12 +34,15 @@ export declare class SetSheetContentCommand implements EngineCommand {
31
34
  private newContent;
32
35
  readonly requiresReevaluation = true;
33
36
  private previousContent;
37
+ private executeFootprint;
38
+ private undoFootprint;
34
39
  constructor(workbookManager: WorkbookManager, opts: {
35
40
  workbookName: string;
36
41
  sheetName: string;
37
42
  }, newContent: Map<string, SerializedCellValue>);
38
43
  execute(): void;
39
44
  undo(): void;
45
+ getInvalidationFootprint(phase: "execute" | "undo"): MutationInvalidation;
40
46
  toAction(): EngineAction;
41
47
  }
42
48
  /**
@@ -47,9 +53,12 @@ export declare class ClearRangeCommand implements EngineCommand {
47
53
  private address;
48
54
  readonly requiresReevaluation = true;
49
55
  private clearedCells;
56
+ private executeFootprint;
57
+ private undoFootprint;
50
58
  constructor(workbookManager: WorkbookManager, address: RangeAddress);
51
59
  execute(): void;
52
60
  undo(): void;
61
+ getInvalidationFootprint(phase: "execute" | "undo"): MutationInvalidation;
53
62
  toAction(): EngineAction;
54
63
  }
55
64
  /**
@@ -64,9 +73,13 @@ export declare class PasteCellsCommand implements EngineCommand {
64
73
  readonly requiresReevaluation = true;
65
74
  private targetSnapshots;
66
75
  private sourceSnapshots;
76
+ private executeFootprint;
77
+ private undoFootprint;
78
+ private executedContents;
67
79
  constructor(workbookManager: WorkbookManager, copyManager: CopyManager, source: CellAddress[], target: CellAddress, options: CopyCellsOptions);
68
80
  execute(): void;
69
81
  undo(): void;
82
+ getInvalidationFootprint(phase: "execute" | "undo"): MutationInvalidation;
70
83
  toAction(): EngineAction;
71
84
  }
72
85
  /**
@@ -80,9 +93,13 @@ export declare class FillAreasCommand implements EngineCommand {
80
93
  private options;
81
94
  readonly requiresReevaluation = true;
82
95
  private targetSnapshots;
96
+ private executeFootprint;
97
+ private undoFootprint;
98
+ private executedContents;
83
99
  constructor(workbookManager: WorkbookManager, copyManager: CopyManager, seedRange: RangeAddress, targetRanges: RangeAddress[], options: CopyCellsOptions);
84
100
  execute(): void;
85
101
  undo(): void;
102
+ getInvalidationFootprint(phase: "execute" | "undo"): MutationInvalidation;
86
103
  toAction(): EngineAction;
87
104
  }
88
105
  /**
@@ -96,9 +113,13 @@ export declare class MoveCellCommand implements EngineCommand {
96
113
  readonly requiresReevaluation = true;
97
114
  private sourceSnapshot;
98
115
  private targetSnapshot;
116
+ private executeFootprint;
117
+ private undoFootprint;
118
+ private executedContents;
99
119
  constructor(workbookManager: WorkbookManager, copyManager: CopyManager, source: CellAddress, target: CellAddress);
100
120
  execute(): void;
101
121
  undo(): void;
122
+ getInvalidationFootprint(phase: "execute" | "undo"): MutationInvalidation;
102
123
  toAction(): EngineAction;
103
124
  }
104
125
  /**
@@ -112,9 +133,13 @@ export declare class MoveRangeCommand implements EngineCommand {
112
133
  readonly requiresReevaluation = true;
113
134
  private sourceSnapshots;
114
135
  private targetSnapshots;
136
+ private executeFootprint;
137
+ private undoFootprint;
138
+ private executedContents;
115
139
  constructor(workbookManager: WorkbookManager, copyManager: CopyManager, sourceRange: RangeAddress, target: CellAddress);
116
140
  execute(): void;
117
141
  undo(): void;
142
+ getInvalidationFootprint(phase: "execute" | "undo"): MutationInvalidation;
118
143
  toAction(): EngineAction;
119
144
  }
120
145
  /**
@@ -132,11 +157,16 @@ export declare class AutoFillCommand implements EngineCommand {
132
157
  readonly requiresReevaluation = true;
133
158
  private previousContent;
134
159
  private previousMetadata;
160
+ private executeFootprint;
161
+ private undoFootprint;
162
+ private touchedAddresses;
163
+ private executedContents;
135
164
  constructor(workbookManager: WorkbookManager, styleManager: import("../managers/style-manager").StyleManager, autoFillManager: import("../autofill-utils").AutoFill, opts: {
136
165
  sheetName: string;
137
166
  workbookName: string;
138
167
  }, seedRange: import("../types").SpreadsheetRange, fillRanges: import("../types").SpreadsheetRange[], direction: import("@ricsam/selection-manager").FillDirection);
139
168
  execute(): void;
140
169
  undo(): void;
170
+ getInvalidationFootprint(phase: "execute" | "undo"): MutationInvalidation;
141
171
  toAction(): EngineAction;
142
172
  }
@@ -6,7 +6,7 @@
6
6
  import type { NamedExpressionManager } from "../managers/named-expression-manager";
7
7
  import type { WorkbookManager } from "../managers/workbook-manager";
8
8
  import type { NamedExpression } from "../types";
9
- import type { EngineCommand, EngineAction } from "./types";
9
+ import type { EngineCommand, EngineAction, MutationInvalidation } from "./types";
10
10
  /**
11
11
  * Dependencies needed for named expression commands.
12
12
  */
@@ -22,6 +22,8 @@ export declare class AddNamedExpressionCommand implements EngineCommand {
22
22
  private deps;
23
23
  private opts;
24
24
  readonly requiresReevaluation = true;
25
+ private executeFootprint;
26
+ private undoFootprint;
25
27
  constructor(deps: NamedExpressionCommandDeps, opts: {
26
28
  expression: string;
27
29
  expressionName: string;
@@ -30,6 +32,7 @@ export declare class AddNamedExpressionCommand implements EngineCommand {
30
32
  });
31
33
  execute(): void;
32
34
  undo(): void;
35
+ getInvalidationFootprint(phase: "execute" | "undo"): MutationInvalidation;
33
36
  toAction(): EngineAction;
34
37
  }
35
38
  /**
@@ -40,6 +43,8 @@ export declare class RemoveNamedExpressionCommand implements EngineCommand {
40
43
  private opts;
41
44
  readonly requiresReevaluation = true;
42
45
  private removedExpression;
46
+ private executeFootprint;
47
+ private undoFootprint;
43
48
  constructor(deps: NamedExpressionCommandDeps, opts: {
44
49
  expressionName: string;
45
50
  sheetName?: string;
@@ -47,6 +52,7 @@ export declare class RemoveNamedExpressionCommand implements EngineCommand {
47
52
  });
48
53
  execute(): void;
49
54
  undo(): void;
55
+ getInvalidationFootprint(phase: "execute" | "undo"): MutationInvalidation;
50
56
  toAction(): EngineAction;
51
57
  }
52
58
  /**
@@ -57,6 +63,8 @@ export declare class UpdateNamedExpressionCommand implements EngineCommand {
57
63
  private opts;
58
64
  readonly requiresReevaluation = true;
59
65
  private previousExpression;
66
+ private executeFootprint;
67
+ private undoFootprint;
60
68
  constructor(deps: NamedExpressionCommandDeps, opts: {
61
69
  expression: string;
62
70
  expressionName: string;
@@ -65,6 +73,7 @@ export declare class UpdateNamedExpressionCommand implements EngineCommand {
65
73
  });
66
74
  execute(): void;
67
75
  undo(): void;
76
+ getInvalidationFootprint(phase: "execute" | "undo"): MutationInvalidation;
68
77
  toAction(): EngineAction;
69
78
  }
70
79
  /**
@@ -74,6 +83,8 @@ export declare class RenameNamedExpressionCommand implements EngineCommand {
74
83
  private deps;
75
84
  private opts;
76
85
  readonly requiresReevaluation = true;
86
+ private executeFootprint;
87
+ private undoFootprint;
77
88
  constructor(deps: NamedExpressionCommandDeps, opts: {
78
89
  expressionName: string;
79
90
  sheetName?: string;
@@ -82,6 +93,7 @@ export declare class RenameNamedExpressionCommand implements EngineCommand {
82
93
  });
83
94
  execute(): void;
84
95
  undo(): void;
96
+ getInvalidationFootprint(phase: "execute" | "undo"): MutationInvalidation;
85
97
  toAction(): EngineAction;
86
98
  }
87
99
  /**
@@ -107,9 +119,12 @@ export declare class SetNamedExpressionsCommand implements EngineCommand {
107
119
  private opts;
108
120
  readonly requiresReevaluation = true;
109
121
  private previousExpressions;
122
+ private executeFootprint;
123
+ private undoFootprint;
110
124
  constructor(deps: NamedExpressionCommandDeps, opts: SetNamedExpressionsOpts);
111
125
  execute(): void;
112
126
  undo(): void;
127
+ getInvalidationFootprint(phase: "execute" | "undo"): MutationInvalidation;
113
128
  toAction(): EngineAction;
114
129
  }
115
130
  export {};
@@ -9,7 +9,7 @@ import type { ReferenceManager } from "../managers/reference-manager";
9
9
  import type { StyleManager } from "../managers/style-manager";
10
10
  import type { TableManager } from "../managers/table-manager";
11
11
  import type { WorkbookManager } from "../managers/workbook-manager";
12
- import type { EngineAction, EngineCommand } from "./types";
12
+ import type { EngineAction, EngineCommand, MutationInvalidation } from "./types";
13
13
  /**
14
14
  * Dependencies needed for structure commands.
15
15
  */
@@ -38,9 +38,12 @@ export declare class AddWorkbookCommand implements EngineCommand {
38
38
  private deps;
39
39
  private workbookName;
40
40
  readonly requiresReevaluation = true;
41
+ private executeFootprint;
42
+ private undoFootprint;
41
43
  constructor(deps: StructureCommandDeps, workbookName: string);
42
44
  execute(): void;
43
45
  undo(): void;
46
+ getInvalidationFootprint(phase: "execute" | "undo"): MutationInvalidation;
44
47
  toAction(): EngineAction;
45
48
  }
46
49
  /**
@@ -51,9 +54,12 @@ export declare class RemoveWorkbookCommand implements EngineCommand {
51
54
  private workbookName;
52
55
  readonly requiresReevaluation = true;
53
56
  private snapshot;
57
+ private executeFootprint;
58
+ private undoFootprint;
54
59
  constructor(deps: StructureCommandDeps, workbookName: string);
55
60
  execute(): void;
56
61
  undo(): void;
62
+ getInvalidationFootprint(phase: "execute" | "undo"): MutationInvalidation;
57
63
  toAction(): EngineAction;
58
64
  }
59
65
  /**
@@ -64,9 +70,13 @@ export declare class RenameWorkbookCommand implements EngineCommand {
64
70
  private workbookName;
65
71
  private newWorkbookName;
66
72
  readonly requiresReevaluation = true;
73
+ private snapshot;
74
+ private executeFootprint;
75
+ private undoFootprint;
67
76
  constructor(deps: StructureCommandDeps, workbookName: string, newWorkbookName: string);
68
77
  execute(): void;
69
78
  undo(): void;
79
+ getInvalidationFootprint(phase: "execute" | "undo"): MutationInvalidation;
70
80
  toAction(): EngineAction;
71
81
  }
72
82
  /**
@@ -78,9 +88,12 @@ export declare class CloneWorkbookCommand implements EngineCommand {
78
88
  private fromWorkbookName;
79
89
  private toWorkbookName;
80
90
  readonly requiresReevaluation = true;
91
+ private executeFootprint;
92
+ private undoFootprint;
81
93
  constructor(deps: StructureCommandDeps, fromWorkbookName: string, toWorkbookName: string);
82
94
  execute(): void;
83
95
  undo(): void;
96
+ getInvalidationFootprint(phase: "execute" | "undo"): MutationInvalidation;
84
97
  toAction(): EngineAction;
85
98
  }
86
99
  /**
@@ -90,12 +103,15 @@ export declare class AddSheetCommand implements EngineCommand {
90
103
  private deps;
91
104
  private opts;
92
105
  readonly requiresReevaluation = true;
106
+ private executeFootprint;
107
+ private undoFootprint;
93
108
  constructor(deps: StructureCommandDeps, opts: {
94
109
  workbookName: string;
95
110
  sheetName: string;
96
111
  });
97
112
  execute(): void;
98
113
  undo(): void;
114
+ getInvalidationFootprint(phase: "execute" | "undo"): MutationInvalidation;
99
115
  toAction(): EngineAction;
100
116
  }
101
117
  /**
@@ -106,12 +122,15 @@ export declare class RemoveSheetCommand implements EngineCommand {
106
122
  private opts;
107
123
  readonly requiresReevaluation = true;
108
124
  private snapshot;
125
+ private executeFootprint;
126
+ private undoFootprint;
109
127
  constructor(deps: StructureCommandDeps, opts: {
110
128
  workbookName: string;
111
129
  sheetName: string;
112
130
  });
113
131
  execute(): void;
114
132
  undo(): void;
133
+ getInvalidationFootprint(phase: "execute" | "undo"): MutationInvalidation;
115
134
  toAction(): EngineAction;
116
135
  }
117
136
  /**
@@ -121,6 +140,9 @@ export declare class RenameSheetCommand implements EngineCommand {
121
140
  private deps;
122
141
  private opts;
123
142
  readonly requiresReevaluation = true;
143
+ private snapshot;
144
+ private executeFootprint;
145
+ private undoFootprint;
124
146
  constructor(deps: StructureCommandDeps, opts: {
125
147
  workbookName: string;
126
148
  sheetName: string;
@@ -128,5 +150,6 @@ export declare class RenameSheetCommand implements EngineCommand {
128
150
  });
129
151
  execute(): void;
130
152
  undo(): void;
153
+ getInvalidationFootprint(phase: "execute" | "undo"): MutationInvalidation;
131
154
  toAction(): EngineAction;
132
155
  }
@@ -8,7 +8,7 @@ import type { NamedExpressionManager } from "../managers/named-expression-manage
8
8
  import type { WorkbookManager } from "../managers/workbook-manager";
9
9
  import type { SchemaManager } from "../managers/schema-manager";
10
10
  import type { CellAddress, SerializedCellValue, SpreadsheetRangeEnd, TableDefinition } from "../types";
11
- import type { EngineCommand, EngineAction } from "./types";
11
+ import type { EngineCommand, EngineAction, MutationInvalidation } from "./types";
12
12
  /**
13
13
  * Dependencies needed for table commands.
14
14
  */
@@ -27,6 +27,8 @@ export declare class AddTableCommand implements EngineCommand {
27
27
  private deps;
28
28
  private props;
29
29
  readonly requiresReevaluation = true;
30
+ private executeFootprint;
31
+ private undoFootprint;
30
32
  constructor(deps: TableCommandDeps, props: {
31
33
  tableName: string;
32
34
  sheetName: string;
@@ -37,6 +39,7 @@ export declare class AddTableCommand implements EngineCommand {
37
39
  });
38
40
  execute(): void;
39
41
  undo(): void;
42
+ getInvalidationFootprint(phase: "execute" | "undo"): MutationInvalidation;
40
43
  toAction(): EngineAction;
41
44
  }
42
45
  /**
@@ -47,12 +50,15 @@ export declare class RemoveTableCommand implements EngineCommand {
47
50
  private opts;
48
51
  readonly requiresReevaluation = true;
49
52
  private removedTable;
53
+ private executeFootprint;
54
+ private undoFootprint;
50
55
  constructor(deps: TableCommandDeps, opts: {
51
56
  tableName: string;
52
57
  workbookName: string;
53
58
  });
54
59
  execute(): void;
55
60
  undo(): void;
61
+ getInvalidationFootprint(phase: "execute" | "undo"): MutationInvalidation;
56
62
  toAction(): EngineAction;
57
63
  }
58
64
  /**
@@ -64,9 +70,12 @@ export declare class RenameTableCommand implements EngineCommand {
64
70
  private oldName;
65
71
  private newName;
66
72
  readonly requiresReevaluation = true;
73
+ private executeFootprint;
74
+ private undoFootprint;
67
75
  constructor(deps: TableCommandDeps, workbookName: string, oldName: string, newName: string);
68
76
  execute(): void;
69
77
  undo(): void;
78
+ getInvalidationFootprint(phase: "execute" | "undo"): MutationInvalidation;
70
79
  toAction(): EngineAction;
71
80
  }
72
81
  /**
@@ -77,6 +86,8 @@ export declare class UpdateTableCommand implements EngineCommand {
77
86
  private opts;
78
87
  readonly requiresReevaluation = true;
79
88
  private previousTable;
89
+ private executeFootprint;
90
+ private undoFootprint;
80
91
  constructor(deps: TableCommandDeps, opts: {
81
92
  tableName: string;
82
93
  sheetName?: string;
@@ -87,6 +98,7 @@ export declare class UpdateTableCommand implements EngineCommand {
87
98
  });
88
99
  execute(): void;
89
100
  undo(): void;
101
+ getInvalidationFootprint(phase: "execute" | "undo"): MutationInvalidation;
90
102
  toAction(): EngineAction;
91
103
  }
92
104
  /**
@@ -97,8 +109,11 @@ export declare class ResetTablesCommand implements EngineCommand {
97
109
  private newTables;
98
110
  readonly requiresReevaluation = true;
99
111
  private previousTables;
112
+ private executeFootprint;
113
+ private undoFootprint;
100
114
  constructor(deps: TableCommandDeps, newTables: Map<string, Map<string, TableDefinition>>);
101
115
  execute(): void;
102
116
  undo(): void;
117
+ getInvalidationFootprint(phase: "execute" | "undo"): MutationInvalidation;
103
118
  toAction(): EngineAction;
104
119
  }