@cj-tech-master/excelts 9.2.1 → 9.3.0

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 (383) hide show
  1. package/README.md +25 -2
  2. package/README_zh.md +29 -6
  3. package/dist/browser/index.browser.d.ts +1 -1
  4. package/dist/browser/index.browser.js +4 -0
  5. package/dist/browser/index.d.ts +1 -1
  6. package/dist/browser/index.js +4 -0
  7. package/dist/browser/modules/excel/cell.d.ts +17 -3
  8. package/dist/browser/modules/excel/cell.js +170 -22
  9. package/dist/browser/modules/excel/defined-names.d.ts +96 -1
  10. package/dist/browser/modules/excel/defined-names.js +411 -21
  11. package/dist/browser/modules/excel/image.d.ts +11 -0
  12. package/dist/browser/modules/excel/image.js +24 -1
  13. package/dist/browser/modules/excel/stream/workbook-reader.browser.d.ts +9 -3
  14. package/dist/browser/modules/excel/stream/workbook-reader.browser.js +14 -0
  15. package/dist/browser/modules/excel/stream/workbook-reader.d.ts +2 -1
  16. package/dist/browser/modules/excel/stream/workbook-writer.browser.d.ts +39 -5
  17. package/dist/browser/modules/excel/stream/workbook-writer.browser.js +48 -1
  18. package/dist/browser/modules/excel/stream/workbook-writer.d.ts +3 -2
  19. package/dist/browser/modules/excel/stream/worksheet-reader.js +17 -1
  20. package/dist/browser/modules/excel/stream/worksheet-writer.d.ts +39 -6
  21. package/dist/browser/modules/excel/stream/worksheet-writer.js +45 -5
  22. package/dist/browser/modules/excel/table.js +15 -2
  23. package/dist/browser/modules/excel/types.d.ts +133 -2
  24. package/dist/browser/modules/excel/utils/col-cache.d.ts +1 -0
  25. package/dist/browser/modules/excel/utils/col-cache.js +15 -0
  26. package/dist/browser/modules/excel/utils/drawing-utils.d.ts +3 -3
  27. package/dist/browser/modules/excel/utils/drawing-utils.js +4 -0
  28. package/dist/browser/modules/excel/utils/external-link-formula.d.ts +76 -0
  29. package/dist/browser/modules/excel/utils/external-link-formula.js +208 -0
  30. package/dist/browser/modules/excel/utils/iterate-stream.d.ts +9 -3
  31. package/dist/browser/modules/excel/utils/iterate-stream.js +3 -1
  32. package/dist/browser/modules/excel/utils/ooxml-paths.d.ts +19 -0
  33. package/dist/browser/modules/excel/utils/ooxml-paths.js +37 -2
  34. package/dist/browser/modules/excel/utils/shared-strings.d.ts +8 -3
  35. package/dist/browser/modules/excel/utils/shared-strings.js +21 -2
  36. package/dist/browser/modules/excel/utils/workbook-protection.d.ts +30 -0
  37. package/dist/browser/modules/excel/utils/workbook-protection.js +30 -0
  38. package/dist/browser/modules/excel/workbook.browser.d.ts +257 -6
  39. package/dist/browser/modules/excel/workbook.browser.js +318 -34
  40. package/dist/browser/modules/excel/workbook.d.ts +1 -1
  41. package/dist/browser/modules/excel/worksheet.d.ts +3 -1
  42. package/dist/browser/modules/excel/worksheet.js +21 -2
  43. package/dist/browser/modules/excel/xlsx/rel-type.d.ts +15 -0
  44. package/dist/browser/modules/excel/xlsx/rel-type.js +16 -1
  45. package/dist/browser/modules/excel/xlsx/xform/book/defined-name-xform.d.ts +6 -5
  46. package/dist/browser/modules/excel/xlsx/xform/book/defined-name-xform.js +21 -86
  47. package/dist/browser/modules/excel/xlsx/xform/book/external-link-xform.d.ts +84 -0
  48. package/dist/browser/modules/excel/xlsx/xform/book/external-link-xform.js +330 -0
  49. package/dist/browser/modules/excel/xlsx/xform/book/external-reference-xform.d.ts +17 -0
  50. package/dist/browser/modules/excel/xlsx/xform/book/external-reference-xform.js +24 -0
  51. package/dist/browser/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.d.ts +3 -0
  52. package/dist/browser/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.js +11 -2
  53. package/dist/browser/modules/excel/xlsx/xform/book/workbook-protection-xform.d.ts +20 -0
  54. package/dist/browser/modules/excel/xlsx/xform/book/workbook-protection-xform.js +66 -0
  55. package/dist/browser/modules/excel/xlsx/xform/book/workbook-xform.js +38 -5
  56. package/dist/browser/modules/excel/xlsx/xform/core/content-types-xform.js +19 -1
  57. package/dist/browser/modules/excel/xlsx/xform/core/metadata-xform.d.ts +56 -0
  58. package/dist/browser/modules/excel/xlsx/xform/core/metadata-xform.js +158 -0
  59. package/dist/browser/modules/excel/xlsx/xform/drawing/absolute-anchor-xform.d.ts +26 -0
  60. package/dist/browser/modules/excel/xlsx/xform/drawing/absolute-anchor-xform.js +105 -0
  61. package/dist/browser/modules/excel/xlsx/xform/drawing/base-cell-anchor-xform.js +3 -0
  62. package/dist/browser/modules/excel/xlsx/xform/drawing/drawing-xform.js +10 -2
  63. package/dist/browser/modules/excel/xlsx/xform/sheet/cell-xform.d.ts +1 -1
  64. package/dist/browser/modules/excel/xlsx/xform/sheet/cell-xform.js +166 -8
  65. package/dist/browser/modules/excel/xlsx/xform/sheet/data-validations-xform.js +1 -1
  66. package/dist/browser/modules/excel/xlsx/xform/sheet/ignored-errors-xform.d.ts +21 -0
  67. package/dist/browser/modules/excel/xlsx/xform/sheet/ignored-errors-xform.js +80 -0
  68. package/dist/browser/modules/excel/xlsx/xform/sheet/worksheet-xform.js +9 -4
  69. package/dist/browser/modules/excel/xlsx/xform/style/border-xform.js +4 -1
  70. package/dist/browser/modules/excel/xlsx/xlsx.browser.d.ts +172 -13
  71. package/dist/browser/modules/excel/xlsx/xlsx.browser.js +410 -20
  72. package/dist/browser/modules/excel/xlsx/xlsx.d.ts +7 -4
  73. package/dist/browser/modules/excel/xlsx/xlsx.js +4 -5
  74. package/dist/browser/modules/formula/compile/address-utils.d.ts +62 -0
  75. package/dist/browser/modules/formula/compile/address-utils.js +83 -0
  76. package/dist/browser/modules/formula/compile/binder.d.ts +42 -0
  77. package/dist/browser/modules/formula/compile/binder.js +487 -0
  78. package/dist/browser/modules/formula/compile/bound-ast.d.ts +230 -0
  79. package/dist/browser/modules/formula/compile/bound-ast.js +80 -0
  80. package/dist/browser/modules/formula/compile/compiled-formula.d.ts +137 -0
  81. package/dist/browser/modules/formula/compile/compiled-formula.js +383 -0
  82. package/dist/browser/modules/formula/compile/dependency-analysis.d.ts +93 -0
  83. package/dist/browser/modules/formula/compile/dependency-analysis.js +432 -0
  84. package/dist/browser/modules/formula/compile/structured-ref-utils.d.ts +93 -0
  85. package/dist/browser/modules/formula/compile/structured-ref-utils.js +136 -0
  86. package/dist/browser/modules/formula/default-syntax-probe.d.ts +79 -0
  87. package/dist/browser/modules/formula/default-syntax-probe.js +83 -0
  88. package/dist/browser/modules/formula/functions/_date-context.d.ts +4 -0
  89. package/dist/browser/modules/formula/functions/_date-context.js +29 -0
  90. package/dist/browser/modules/formula/functions/_shared.d.ts +121 -0
  91. package/dist/browser/modules/formula/functions/_shared.js +381 -0
  92. package/dist/browser/modules/formula/functions/conditional.d.ts +27 -0
  93. package/dist/browser/modules/formula/functions/conditional.js +343 -0
  94. package/dist/browser/modules/formula/functions/database.d.ts +37 -0
  95. package/dist/browser/modules/formula/functions/database.js +274 -0
  96. package/dist/browser/modules/formula/functions/date.d.ts +61 -0
  97. package/dist/browser/modules/formula/functions/date.js +855 -0
  98. package/dist/browser/modules/formula/functions/dynamic-array.d.ts +23 -0
  99. package/dist/browser/modules/formula/functions/dynamic-array.js +860 -0
  100. package/dist/browser/modules/formula/functions/engineering.d.ts +57 -0
  101. package/dist/browser/modules/formula/functions/engineering.js +1128 -0
  102. package/dist/browser/modules/formula/functions/financial.d.ts +202 -0
  103. package/dist/browser/modules/formula/functions/financial.js +2296 -0
  104. package/dist/browser/modules/formula/functions/lookup.d.ts +18 -0
  105. package/dist/browser/modules/formula/functions/lookup.js +886 -0
  106. package/dist/browser/modules/formula/functions/math.d.ts +114 -0
  107. package/dist/browser/modules/formula/functions/math.js +1406 -0
  108. package/dist/browser/modules/formula/functions/statistical.d.ts +193 -0
  109. package/dist/browser/modules/formula/functions/statistical.js +3390 -0
  110. package/dist/browser/modules/formula/functions/text.d.ts +86 -0
  111. package/dist/browser/modules/formula/functions/text.js +1845 -0
  112. package/dist/browser/modules/formula/host-registry.d.ts +53 -0
  113. package/dist/browser/modules/formula/host-registry.js +69 -0
  114. package/dist/browser/modules/formula/index.d.ts +39 -0
  115. package/dist/browser/modules/formula/index.js +49 -0
  116. package/dist/browser/modules/formula/install.d.ts +62 -0
  117. package/dist/browser/modules/formula/install.js +88 -0
  118. package/dist/browser/modules/formula/integration/apply-writeback-plan.d.ts +26 -0
  119. package/dist/browser/modules/formula/integration/apply-writeback-plan.js +210 -0
  120. package/dist/browser/modules/formula/integration/calculate-formulas-impl.d.ts +30 -0
  121. package/dist/browser/modules/formula/integration/calculate-formulas-impl.js +616 -0
  122. package/dist/browser/modules/formula/integration/calculate-formulas.d.ts +67 -0
  123. package/dist/browser/modules/formula/integration/calculate-formulas.js +68 -0
  124. package/dist/browser/modules/formula/integration/formula-instance.d.ts +64 -0
  125. package/dist/browser/modules/formula/integration/formula-instance.js +79 -0
  126. package/dist/browser/modules/formula/integration/workbook-adapter.d.ts +26 -0
  127. package/dist/browser/modules/formula/integration/workbook-adapter.js +324 -0
  128. package/dist/browser/modules/formula/integration/workbook-snapshot.d.ts +267 -0
  129. package/dist/browser/modules/formula/integration/workbook-snapshot.js +77 -0
  130. package/dist/browser/modules/formula/materialize/build-writeback-plan.d.ts +34 -0
  131. package/dist/browser/modules/formula/materialize/build-writeback-plan.js +473 -0
  132. package/dist/browser/modules/formula/materialize/spill-engine.d.ts +9 -0
  133. package/dist/browser/modules/formula/materialize/spill-engine.js +38 -0
  134. package/dist/browser/modules/formula/materialize/types.d.ts +179 -0
  135. package/dist/browser/modules/formula/materialize/types.js +29 -0
  136. package/dist/browser/modules/formula/materialize/writeback-plan.d.ts +167 -0
  137. package/dist/browser/modules/formula/materialize/writeback-plan.js +27 -0
  138. package/dist/browser/modules/formula/runtime/evaluator.d.ts +151 -0
  139. package/dist/browser/modules/formula/runtime/evaluator.js +2291 -0
  140. package/dist/browser/modules/formula/runtime/function-registry.d.ts +47 -0
  141. package/dist/browser/modules/formula/runtime/function-registry.js +840 -0
  142. package/dist/browser/modules/formula/runtime/values.d.ts +211 -0
  143. package/dist/browser/modules/formula/runtime/values.js +385 -0
  144. package/dist/browser/modules/formula/syntax/ast.d.ts +129 -0
  145. package/dist/browser/modules/formula/syntax/ast.js +28 -0
  146. package/dist/browser/modules/formula/syntax/parser.d.ts +18 -0
  147. package/dist/browser/modules/formula/syntax/parser.js +439 -0
  148. package/dist/browser/modules/formula/syntax/token-types.d.ts +153 -0
  149. package/dist/browser/modules/formula/syntax/token-types.js +59 -0
  150. package/dist/browser/modules/formula/syntax/tokenizer.d.ts +10 -0
  151. package/dist/browser/modules/formula/syntax/tokenizer.js +1074 -0
  152. package/dist/browser/modules/pdf/excel-bridge.js +9 -0
  153. package/dist/cjs/index.js +4 -0
  154. package/dist/cjs/modules/excel/cell.js +170 -22
  155. package/dist/cjs/modules/excel/defined-names.js +411 -21
  156. package/dist/cjs/modules/excel/image.js +24 -1
  157. package/dist/cjs/modules/excel/stream/workbook-reader.browser.js +14 -0
  158. package/dist/cjs/modules/excel/stream/workbook-writer.browser.js +48 -1
  159. package/dist/cjs/modules/excel/stream/worksheet-reader.js +17 -1
  160. package/dist/cjs/modules/excel/stream/worksheet-writer.js +45 -5
  161. package/dist/cjs/modules/excel/table.js +15 -2
  162. package/dist/cjs/modules/excel/utils/col-cache.js +15 -0
  163. package/dist/cjs/modules/excel/utils/drawing-utils.js +4 -0
  164. package/dist/cjs/modules/excel/utils/external-link-formula.js +212 -0
  165. package/dist/cjs/modules/excel/utils/iterate-stream.js +3 -1
  166. package/dist/cjs/modules/excel/utils/ooxml-paths.js +42 -2
  167. package/dist/cjs/modules/excel/utils/shared-strings.js +21 -2
  168. package/dist/cjs/modules/excel/utils/workbook-protection.js +33 -0
  169. package/dist/cjs/modules/excel/workbook.browser.js +318 -34
  170. package/dist/cjs/modules/excel/worksheet.js +20 -1
  171. package/dist/cjs/modules/excel/xlsx/rel-type.js +16 -1
  172. package/dist/cjs/modules/excel/xlsx/xform/book/defined-name-xform.js +21 -86
  173. package/dist/cjs/modules/excel/xlsx/xform/book/external-link-xform.js +333 -0
  174. package/dist/cjs/modules/excel/xlsx/xform/book/external-reference-xform.js +27 -0
  175. package/dist/cjs/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.js +11 -2
  176. package/dist/cjs/modules/excel/xlsx/xform/book/workbook-protection-xform.js +69 -0
  177. package/dist/cjs/modules/excel/xlsx/xform/book/workbook-xform.js +38 -5
  178. package/dist/cjs/modules/excel/xlsx/xform/core/content-types-xform.js +18 -0
  179. package/dist/cjs/modules/excel/xlsx/xform/core/metadata-xform.js +161 -0
  180. package/dist/cjs/modules/excel/xlsx/xform/drawing/absolute-anchor-xform.js +108 -0
  181. package/dist/cjs/modules/excel/xlsx/xform/drawing/base-cell-anchor-xform.js +3 -0
  182. package/dist/cjs/modules/excel/xlsx/xform/drawing/drawing-xform.js +10 -2
  183. package/dist/cjs/modules/excel/xlsx/xform/sheet/cell-xform.js +166 -8
  184. package/dist/cjs/modules/excel/xlsx/xform/sheet/data-validations-xform.js +1 -1
  185. package/dist/cjs/modules/excel/xlsx/xform/sheet/ignored-errors-xform.js +83 -0
  186. package/dist/cjs/modules/excel/xlsx/xform/sheet/worksheet-xform.js +9 -4
  187. package/dist/cjs/modules/excel/xlsx/xform/style/border-xform.js +4 -1
  188. package/dist/cjs/modules/excel/xlsx/xlsx.browser.js +408 -18
  189. package/dist/cjs/modules/excel/xlsx/xlsx.js +4 -5
  190. package/dist/cjs/modules/formula/compile/address-utils.js +89 -0
  191. package/dist/cjs/modules/formula/compile/binder.js +489 -0
  192. package/dist/cjs/modules/formula/compile/bound-ast.js +68 -0
  193. package/dist/cjs/modules/formula/compile/compiled-formula.js +387 -0
  194. package/dist/cjs/modules/formula/compile/dependency-analysis.js +437 -0
  195. package/dist/cjs/modules/formula/compile/structured-ref-utils.js +141 -0
  196. package/dist/cjs/modules/formula/default-syntax-probe.js +87 -0
  197. package/dist/cjs/modules/formula/functions/_date-context.js +33 -0
  198. package/dist/cjs/modules/formula/functions/_shared.js +396 -0
  199. package/dist/cjs/modules/formula/functions/conditional.js +354 -0
  200. package/dist/cjs/modules/formula/functions/database.js +288 -0
  201. package/dist/cjs/modules/formula/functions/date.js +883 -0
  202. package/dist/cjs/modules/formula/functions/dynamic-array.js +881 -0
  203. package/dist/cjs/modules/formula/functions/engineering.js +1183 -0
  204. package/dist/cjs/modules/formula/functions/financial.js +2348 -0
  205. package/dist/cjs/modules/formula/functions/lookup.js +902 -0
  206. package/dist/cjs/modules/formula/functions/math.js +1487 -0
  207. package/dist/cjs/modules/formula/functions/statistical.js +3488 -0
  208. package/dist/cjs/modules/formula/functions/text.js +1889 -0
  209. package/dist/cjs/modules/formula/host-registry.js +75 -0
  210. package/dist/cjs/modules/formula/index.js +58 -0
  211. package/dist/cjs/modules/formula/install.js +93 -0
  212. package/dist/cjs/modules/formula/integration/apply-writeback-plan.js +213 -0
  213. package/dist/cjs/modules/formula/integration/calculate-formulas-impl.js +619 -0
  214. package/dist/cjs/modules/formula/integration/calculate-formulas.js +71 -0
  215. package/dist/cjs/modules/formula/integration/formula-instance.js +82 -0
  216. package/dist/cjs/modules/formula/integration/workbook-adapter.js +327 -0
  217. package/dist/cjs/modules/formula/integration/workbook-snapshot.js +84 -0
  218. package/dist/cjs/modules/formula/materialize/build-writeback-plan.js +475 -0
  219. package/dist/cjs/modules/formula/materialize/spill-engine.js +42 -0
  220. package/dist/cjs/modules/formula/materialize/types.js +32 -0
  221. package/dist/cjs/modules/formula/materialize/writeback-plan.js +28 -0
  222. package/dist/cjs/modules/formula/runtime/evaluator.js +2298 -0
  223. package/dist/cjs/modules/formula/runtime/function-registry.js +846 -0
  224. package/dist/cjs/modules/formula/runtime/values.js +385 -0
  225. package/dist/cjs/modules/formula/syntax/ast.js +8 -0
  226. package/dist/cjs/modules/formula/syntax/parser.js +440 -0
  227. package/dist/cjs/modules/formula/syntax/token-types.js +32 -0
  228. package/dist/cjs/modules/formula/syntax/tokenizer.js +1076 -0
  229. package/dist/cjs/modules/pdf/excel-bridge.js +9 -0
  230. package/dist/esm/index.browser.js +4 -0
  231. package/dist/esm/index.js +4 -0
  232. package/dist/esm/modules/excel/cell.js +170 -22
  233. package/dist/esm/modules/excel/defined-names.js +411 -21
  234. package/dist/esm/modules/excel/image.js +24 -1
  235. package/dist/esm/modules/excel/stream/workbook-reader.browser.js +14 -0
  236. package/dist/esm/modules/excel/stream/workbook-writer.browser.js +48 -1
  237. package/dist/esm/modules/excel/stream/worksheet-reader.js +17 -1
  238. package/dist/esm/modules/excel/stream/worksheet-writer.js +45 -5
  239. package/dist/esm/modules/excel/table.js +15 -2
  240. package/dist/esm/modules/excel/utils/col-cache.js +15 -0
  241. package/dist/esm/modules/excel/utils/drawing-utils.js +4 -0
  242. package/dist/esm/modules/excel/utils/external-link-formula.js +208 -0
  243. package/dist/esm/modules/excel/utils/iterate-stream.js +3 -1
  244. package/dist/esm/modules/excel/utils/ooxml-paths.js +37 -2
  245. package/dist/esm/modules/excel/utils/shared-strings.js +21 -2
  246. package/dist/esm/modules/excel/utils/workbook-protection.js +30 -0
  247. package/dist/esm/modules/excel/workbook.browser.js +318 -34
  248. package/dist/esm/modules/excel/worksheet.js +21 -2
  249. package/dist/esm/modules/excel/xlsx/rel-type.js +16 -1
  250. package/dist/esm/modules/excel/xlsx/xform/book/defined-name-xform.js +21 -86
  251. package/dist/esm/modules/excel/xlsx/xform/book/external-link-xform.js +330 -0
  252. package/dist/esm/modules/excel/xlsx/xform/book/external-reference-xform.js +24 -0
  253. package/dist/esm/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.js +11 -2
  254. package/dist/esm/modules/excel/xlsx/xform/book/workbook-protection-xform.js +66 -0
  255. package/dist/esm/modules/excel/xlsx/xform/book/workbook-xform.js +38 -5
  256. package/dist/esm/modules/excel/xlsx/xform/core/content-types-xform.js +19 -1
  257. package/dist/esm/modules/excel/xlsx/xform/core/metadata-xform.js +158 -0
  258. package/dist/esm/modules/excel/xlsx/xform/drawing/absolute-anchor-xform.js +105 -0
  259. package/dist/esm/modules/excel/xlsx/xform/drawing/base-cell-anchor-xform.js +3 -0
  260. package/dist/esm/modules/excel/xlsx/xform/drawing/drawing-xform.js +10 -2
  261. package/dist/esm/modules/excel/xlsx/xform/sheet/cell-xform.js +166 -8
  262. package/dist/esm/modules/excel/xlsx/xform/sheet/data-validations-xform.js +1 -1
  263. package/dist/esm/modules/excel/xlsx/xform/sheet/ignored-errors-xform.js +80 -0
  264. package/dist/esm/modules/excel/xlsx/xform/sheet/worksheet-xform.js +9 -4
  265. package/dist/esm/modules/excel/xlsx/xform/style/border-xform.js +4 -1
  266. package/dist/esm/modules/excel/xlsx/xlsx.browser.js +410 -20
  267. package/dist/esm/modules/excel/xlsx/xlsx.js +4 -5
  268. package/dist/esm/modules/formula/compile/address-utils.js +83 -0
  269. package/dist/esm/modules/formula/compile/binder.js +487 -0
  270. package/dist/esm/modules/formula/compile/bound-ast.js +80 -0
  271. package/dist/esm/modules/formula/compile/compiled-formula.js +383 -0
  272. package/dist/esm/modules/formula/compile/dependency-analysis.js +432 -0
  273. package/dist/esm/modules/formula/compile/structured-ref-utils.js +136 -0
  274. package/dist/esm/modules/formula/default-syntax-probe.js +83 -0
  275. package/dist/esm/modules/formula/functions/_date-context.js +29 -0
  276. package/dist/esm/modules/formula/functions/_shared.js +381 -0
  277. package/dist/esm/modules/formula/functions/conditional.js +343 -0
  278. package/dist/esm/modules/formula/functions/database.js +274 -0
  279. package/dist/esm/modules/formula/functions/date.js +855 -0
  280. package/dist/esm/modules/formula/functions/dynamic-array.js +860 -0
  281. package/dist/esm/modules/formula/functions/engineering.js +1128 -0
  282. package/dist/esm/modules/formula/functions/financial.js +2296 -0
  283. package/dist/esm/modules/formula/functions/lookup.js +886 -0
  284. package/dist/esm/modules/formula/functions/math.js +1406 -0
  285. package/dist/esm/modules/formula/functions/statistical.js +3390 -0
  286. package/dist/esm/modules/formula/functions/text.js +1845 -0
  287. package/dist/esm/modules/formula/host-registry.js +69 -0
  288. package/dist/esm/modules/formula/index.js +49 -0
  289. package/dist/esm/modules/formula/install.js +88 -0
  290. package/dist/esm/modules/formula/integration/apply-writeback-plan.js +210 -0
  291. package/dist/esm/modules/formula/integration/calculate-formulas-impl.js +616 -0
  292. package/dist/esm/modules/formula/integration/calculate-formulas.js +68 -0
  293. package/dist/esm/modules/formula/integration/formula-instance.js +79 -0
  294. package/dist/esm/modules/formula/integration/workbook-adapter.js +324 -0
  295. package/dist/esm/modules/formula/integration/workbook-snapshot.js +77 -0
  296. package/dist/esm/modules/formula/materialize/build-writeback-plan.js +473 -0
  297. package/dist/esm/modules/formula/materialize/spill-engine.js +38 -0
  298. package/dist/esm/modules/formula/materialize/types.js +29 -0
  299. package/dist/esm/modules/formula/materialize/writeback-plan.js +27 -0
  300. package/dist/esm/modules/formula/runtime/evaluator.js +2291 -0
  301. package/dist/esm/modules/formula/runtime/function-registry.js +840 -0
  302. package/dist/esm/modules/formula/runtime/values.js +385 -0
  303. package/dist/esm/modules/formula/syntax/ast.js +28 -0
  304. package/dist/esm/modules/formula/syntax/parser.js +439 -0
  305. package/dist/esm/modules/formula/syntax/token-types.js +59 -0
  306. package/dist/esm/modules/formula/syntax/tokenizer.js +1074 -0
  307. package/dist/esm/modules/pdf/excel-bridge.js +9 -0
  308. package/dist/iife/excelts.iife.js +2302 -373
  309. package/dist/iife/excelts.iife.js.map +1 -1
  310. package/dist/iife/excelts.iife.min.js +34 -34
  311. package/dist/types/index.browser.d.ts +1 -1
  312. package/dist/types/index.d.ts +1 -1
  313. package/dist/types/modules/excel/cell.d.ts +17 -3
  314. package/dist/types/modules/excel/defined-names.d.ts +96 -1
  315. package/dist/types/modules/excel/image.d.ts +11 -0
  316. package/dist/types/modules/excel/stream/workbook-reader.browser.d.ts +9 -3
  317. package/dist/types/modules/excel/stream/workbook-reader.d.ts +2 -1
  318. package/dist/types/modules/excel/stream/workbook-writer.browser.d.ts +39 -5
  319. package/dist/types/modules/excel/stream/workbook-writer.d.ts +3 -2
  320. package/dist/types/modules/excel/stream/worksheet-writer.d.ts +39 -6
  321. package/dist/types/modules/excel/types.d.ts +133 -2
  322. package/dist/types/modules/excel/utils/col-cache.d.ts +1 -0
  323. package/dist/types/modules/excel/utils/drawing-utils.d.ts +3 -3
  324. package/dist/types/modules/excel/utils/external-link-formula.d.ts +76 -0
  325. package/dist/types/modules/excel/utils/iterate-stream.d.ts +9 -3
  326. package/dist/types/modules/excel/utils/ooxml-paths.d.ts +19 -0
  327. package/dist/types/modules/excel/utils/shared-strings.d.ts +8 -3
  328. package/dist/types/modules/excel/utils/workbook-protection.d.ts +30 -0
  329. package/dist/types/modules/excel/workbook.browser.d.ts +257 -6
  330. package/dist/types/modules/excel/workbook.d.ts +1 -1
  331. package/dist/types/modules/excel/worksheet.d.ts +3 -1
  332. package/dist/types/modules/excel/xlsx/rel-type.d.ts +15 -0
  333. package/dist/types/modules/excel/xlsx/xform/book/defined-name-xform.d.ts +6 -5
  334. package/dist/types/modules/excel/xlsx/xform/book/external-link-xform.d.ts +84 -0
  335. package/dist/types/modules/excel/xlsx/xform/book/external-reference-xform.d.ts +17 -0
  336. package/dist/types/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.d.ts +3 -0
  337. package/dist/types/modules/excel/xlsx/xform/book/workbook-protection-xform.d.ts +20 -0
  338. package/dist/types/modules/excel/xlsx/xform/core/metadata-xform.d.ts +56 -0
  339. package/dist/types/modules/excel/xlsx/xform/drawing/absolute-anchor-xform.d.ts +26 -0
  340. package/dist/types/modules/excel/xlsx/xform/sheet/cell-xform.d.ts +1 -1
  341. package/dist/types/modules/excel/xlsx/xform/sheet/ignored-errors-xform.d.ts +21 -0
  342. package/dist/types/modules/excel/xlsx/xlsx.browser.d.ts +172 -13
  343. package/dist/types/modules/excel/xlsx/xlsx.d.ts +7 -4
  344. package/dist/types/modules/formula/compile/address-utils.d.ts +62 -0
  345. package/dist/types/modules/formula/compile/binder.d.ts +42 -0
  346. package/dist/types/modules/formula/compile/bound-ast.d.ts +230 -0
  347. package/dist/types/modules/formula/compile/compiled-formula.d.ts +137 -0
  348. package/dist/types/modules/formula/compile/dependency-analysis.d.ts +93 -0
  349. package/dist/types/modules/formula/compile/structured-ref-utils.d.ts +93 -0
  350. package/dist/types/modules/formula/default-syntax-probe.d.ts +79 -0
  351. package/dist/types/modules/formula/functions/_date-context.d.ts +4 -0
  352. package/dist/types/modules/formula/functions/_shared.d.ts +121 -0
  353. package/dist/types/modules/formula/functions/conditional.d.ts +27 -0
  354. package/dist/types/modules/formula/functions/database.d.ts +37 -0
  355. package/dist/types/modules/formula/functions/date.d.ts +61 -0
  356. package/dist/types/modules/formula/functions/dynamic-array.d.ts +23 -0
  357. package/dist/types/modules/formula/functions/engineering.d.ts +57 -0
  358. package/dist/types/modules/formula/functions/financial.d.ts +202 -0
  359. package/dist/types/modules/formula/functions/lookup.d.ts +18 -0
  360. package/dist/types/modules/formula/functions/math.d.ts +114 -0
  361. package/dist/types/modules/formula/functions/statistical.d.ts +193 -0
  362. package/dist/types/modules/formula/functions/text.d.ts +86 -0
  363. package/dist/types/modules/formula/host-registry.d.ts +53 -0
  364. package/dist/types/modules/formula/index.d.ts +39 -0
  365. package/dist/types/modules/formula/install.d.ts +62 -0
  366. package/dist/types/modules/formula/integration/apply-writeback-plan.d.ts +26 -0
  367. package/dist/types/modules/formula/integration/calculate-formulas-impl.d.ts +30 -0
  368. package/dist/types/modules/formula/integration/calculate-formulas.d.ts +67 -0
  369. package/dist/types/modules/formula/integration/formula-instance.d.ts +64 -0
  370. package/dist/types/modules/formula/integration/workbook-adapter.d.ts +26 -0
  371. package/dist/types/modules/formula/integration/workbook-snapshot.d.ts +267 -0
  372. package/dist/types/modules/formula/materialize/build-writeback-plan.d.ts +34 -0
  373. package/dist/types/modules/formula/materialize/spill-engine.d.ts +9 -0
  374. package/dist/types/modules/formula/materialize/types.d.ts +179 -0
  375. package/dist/types/modules/formula/materialize/writeback-plan.d.ts +167 -0
  376. package/dist/types/modules/formula/runtime/evaluator.d.ts +151 -0
  377. package/dist/types/modules/formula/runtime/function-registry.d.ts +47 -0
  378. package/dist/types/modules/formula/runtime/values.d.ts +211 -0
  379. package/dist/types/modules/formula/syntax/ast.d.ts +129 -0
  380. package/dist/types/modules/formula/syntax/parser.d.ts +18 -0
  381. package/dist/types/modules/formula/syntax/token-types.d.ts +153 -0
  382. package/dist/types/modules/formula/syntax/tokenizer.d.ts +10 -0
  383. package/package.json +28 -28
@@ -0,0 +1,383 @@
1
+ /**
2
+ * Compiled Formula — The output of the full compilation pipeline.
3
+ *
4
+ * A `CompiledFormula` packages together:
5
+ * - The original `FormulaInstance` metadata
6
+ * - The bound expression tree (from the binder)
7
+ * - Static dependency information
8
+ * - Metadata flags (volatile, dynamic refs, etc.)
9
+ *
10
+ * ## Static Dependency Extraction
11
+ *
12
+ * Dependencies are extracted from the `BoundExpr` tree. Since names and
13
+ * structured refs are already resolved by the binder, the dependency
14
+ * extraction is a simple tree walk that collects `BoundCellRef` and
15
+ * `BoundAreaRef` nodes.
16
+ *
17
+ * Runtime-dependent references (INDIRECT, OFFSET) cannot be captured
18
+ * statically — the `hasDynamicRefs` flag marks formulas that may have
19
+ * additional runtime dependencies. Those functions re-parse their dynamic
20
+ * arguments at evaluation time using their own parser invocation (the raw
21
+ * AST is not retained on the CompiledFormula).
22
+ */
23
+ import { NodeType } from "../syntax/ast.js";
24
+ import { stripFunctionPrefix } from "../syntax/token-types.js";
25
+ import { BoundExprKind } from "./bound-ast.js";
26
+ import { resolveStructuredRefRows, buildTableGeometry, resolveStructuredRefColumns } from "./structured-ref-utils.js";
27
+ /**
28
+ * Extract static dependencies from a bound expression tree.
29
+ *
30
+ * @param expr - The bound expression tree to analyze
31
+ * @param snapshot - Optional snapshot for resolving structured references
32
+ * @param nameResolver - Optional resolver for formula-based defined name dependencies
33
+ */
34
+ export function extractStaticDeps(expr, snapshot, nameResolver) {
35
+ const cells = [];
36
+ const areas = [];
37
+ walkDeps(expr, cells, areas, snapshot?.tablesByName, nameResolver, new Set());
38
+ // Deduplicate — a formula like `=A1+A1+A1` would otherwise add three
39
+ // copies of A1 to the dep list, bloating both the dependency graph's
40
+ // intermediate storage and the `expandRefsToKeys` pass downstream. We
41
+ // use positional keys that mirror the Set<string> dedup logic that the
42
+ // graph builder already applies, so we can pay the cost here once
43
+ // instead of in every consumer. (R6 architectural note #5)
44
+ return { cells: dedupeCells(cells), areas: dedupeAreas(areas) };
45
+ }
46
+ function dedupeCells(cells) {
47
+ if (cells.length < 2) {
48
+ return cells;
49
+ }
50
+ const seen = new Set();
51
+ const out = [];
52
+ for (const c of cells) {
53
+ const key = `${c.sheet}\u0000${c.row}\u0001${c.col}`;
54
+ if (seen.has(key)) {
55
+ continue;
56
+ }
57
+ seen.add(key);
58
+ out.push(c);
59
+ }
60
+ return out;
61
+ }
62
+ function dedupeAreas(areas) {
63
+ if (areas.length < 2) {
64
+ return areas;
65
+ }
66
+ const seen = new Set();
67
+ const out = [];
68
+ for (const a of areas) {
69
+ const key = `${a.sheet}\u0000${a.top}\u0001${a.left}\u0002${a.bottom}\u0003${a.right}`;
70
+ if (seen.has(key)) {
71
+ continue;
72
+ }
73
+ seen.add(key);
74
+ out.push(a);
75
+ }
76
+ return out;
77
+ }
78
+ function walkDeps(expr, cells, areas, tablesByName, nameResolver, visitedNames) {
79
+ switch (expr.kind) {
80
+ case BoundExprKind.CellRef:
81
+ cells.push({ sheet: expr.sheet, row: expr.row, col: expr.col });
82
+ break;
83
+ case BoundExprKind.AreaRef:
84
+ areas.push({
85
+ sheet: expr.sheet,
86
+ top: expr.top,
87
+ left: expr.left,
88
+ bottom: expr.bottom,
89
+ right: expr.right
90
+ });
91
+ break;
92
+ case BoundExprKind.ColRangeRef:
93
+ areas.push({
94
+ sheet: expr.sheet,
95
+ top: 1,
96
+ left: expr.leftCol,
97
+ bottom: 1048576,
98
+ right: expr.rightCol
99
+ });
100
+ break;
101
+ case BoundExprKind.RowRangeRef:
102
+ areas.push({
103
+ sheet: expr.sheet,
104
+ top: expr.topRow,
105
+ left: 1,
106
+ bottom: expr.bottomRow,
107
+ right: 16384
108
+ });
109
+ break;
110
+ case BoundExprKind.Ref3D:
111
+ for (const sheet of expr.sheets) {
112
+ if (expr.inner.kind === BoundExprKind.CellRef) {
113
+ cells.push({ sheet, row: expr.inner.row, col: expr.inner.col });
114
+ }
115
+ else {
116
+ areas.push({
117
+ sheet,
118
+ top: expr.inner.top,
119
+ left: expr.inner.left,
120
+ bottom: expr.inner.bottom,
121
+ right: expr.inner.right
122
+ });
123
+ }
124
+ }
125
+ break;
126
+ case BoundExprKind.BinaryOp:
127
+ walkDeps(expr.left, cells, areas, tablesByName, nameResolver, visitedNames);
128
+ walkDeps(expr.right, cells, areas, tablesByName, nameResolver, visitedNames);
129
+ break;
130
+ case BoundExprKind.UnaryOp:
131
+ walkDeps(expr.operand, cells, areas, tablesByName, nameResolver, visitedNames);
132
+ break;
133
+ case BoundExprKind.Percent:
134
+ walkDeps(expr.operand, cells, areas, tablesByName, nameResolver, visitedNames);
135
+ break;
136
+ case BoundExprKind.Call:
137
+ for (const arg of expr.args) {
138
+ walkDeps(arg, cells, areas, tablesByName, nameResolver, visitedNames);
139
+ }
140
+ break;
141
+ case BoundExprKind.SpecialCall:
142
+ for (const arg of expr.args) {
143
+ walkDeps(arg, cells, areas, tablesByName, nameResolver, visitedNames);
144
+ }
145
+ break;
146
+ case BoundExprKind.Array:
147
+ for (const row of expr.rows) {
148
+ for (const elem of row) {
149
+ walkDeps(elem, cells, areas, tablesByName, nameResolver, visitedNames);
150
+ }
151
+ }
152
+ break;
153
+ case BoundExprKind.Lambda:
154
+ walkDeps(expr.body, cells, areas, tablesByName, nameResolver, visitedNames);
155
+ break;
156
+ case BoundExprKind.StructuredRef:
157
+ // Try to resolve structured reference to static deps using the table index.
158
+ // Only possible when we have the table name and the table exists in the snapshot.
159
+ if (tablesByName && expr.tableName) {
160
+ const resolved = tablesByName.get(expr.tableName.toLowerCase());
161
+ if (resolved) {
162
+ const t = resolved.table;
163
+ const geo = buildTableGeometry(t);
164
+ // Permissive column resolution — static-deps is conservative, so
165
+ // unknown column names fall back to the full table width rather
166
+ // than being treated as errors.
167
+ const colRange = resolveStructuredRefColumns(expr.columns, t, "permissive");
168
+ if (colRange === "error") {
169
+ // Not reachable in permissive mode, but guard for exhaustiveness.
170
+ break;
171
+ }
172
+ // #This Row can't be resolved statically; we still record the data
173
+ // range as a conservative dependency bound.
174
+ const rowRange = resolveStructuredRefRows(expr.specials, geo);
175
+ let rowTop = geo.dataRowStart;
176
+ let rowBottom = geo.dataRowEnd;
177
+ if (rowRange !== "thisRow" && rowRange !== "error") {
178
+ rowTop = rowRange.rowTop;
179
+ rowBottom = rowRange.rowBottom;
180
+ }
181
+ areas.push({
182
+ sheet: resolved.sheetName,
183
+ top: rowTop,
184
+ left: colRange.colLeft,
185
+ bottom: rowBottom,
186
+ right: colRange.colRight
187
+ });
188
+ break;
189
+ }
190
+ }
191
+ // Cannot resolve — no static deps (will be handled at runtime)
192
+ break;
193
+ case BoundExprKind.Literal:
194
+ // No static dependencies
195
+ break;
196
+ case BoundExprKind.NameExpr:
197
+ // Try to resolve the defined name and extract its dependencies.
198
+ // Guard against infinite recursion with visitedNames.
199
+ if (nameResolver && visitedNames && !visitedNames.has(expr.upperName)) {
200
+ visitedNames.add(expr.upperName);
201
+ const resolved = nameResolver(expr.upperName);
202
+ if (resolved) {
203
+ for (const c of resolved.deps.cells) {
204
+ cells.push(c);
205
+ }
206
+ for (const a of resolved.deps.areas) {
207
+ areas.push(a);
208
+ }
209
+ }
210
+ }
211
+ break;
212
+ }
213
+ }
214
+ // ============================================================================
215
+ // Volatility / Dynamic Ref / Dynamic Array Detection
216
+ // ============================================================================
217
+ // Excel's volatile-function list: any formula containing one of these
218
+ // must be re-evaluated on every calc pass, because the result can change
219
+ // without any explicit input change. INDIRECT / OFFSET are additionally
220
+ // flagged as "dynamic ref" (their dependency set isn't known at compile
221
+ // time), but they're also volatile in the usual sense — the target
222
+ // cell's value may change even when the INDIRECT string itself is
223
+ // constant. INFO and CELL with the "row"/"col" info-type also qualify
224
+ // but those require per-invocation arg inspection; the coarse opt-in
225
+ // below is intentionally conservative.
226
+ const VOLATILE_FUNCTIONS = new Set([
227
+ "RAND",
228
+ "RANDBETWEEN",
229
+ "RANDARRAY",
230
+ "NOW",
231
+ "TODAY",
232
+ "INDIRECT",
233
+ "OFFSET",
234
+ "INFO",
235
+ "CELL"
236
+ ]);
237
+ const DYNAMIC_REF_FUNCTIONS = new Set(["INDIRECT", "OFFSET"]);
238
+ /**
239
+ * Function names that naturally produce arrays and should trigger spill
240
+ * behavior even when `isDynamicArray` is not explicitly set in the XLSX model.
241
+ */
242
+ const DYNAMIC_ARRAY_FUNCTION_NAMES = new Set([
243
+ "FILTER",
244
+ "SORT",
245
+ "UNIQUE",
246
+ "SORTBY",
247
+ "SEQUENCE",
248
+ "RANDARRAY",
249
+ "TOCOL",
250
+ "TOROW",
251
+ "CHOOSEROWS",
252
+ "CHOOSECOLS",
253
+ "VSTACK",
254
+ "HSTACK",
255
+ "WRAPROWS",
256
+ "WRAPCOLS",
257
+ "EXPAND",
258
+ "TAKE",
259
+ "DROP"
260
+ ]);
261
+ /**
262
+ * Check if the formula's top-level expression is a known dynamic array
263
+ * function. Checks both the raw AST (for prefixed names like `_XLFN.FILTER`)
264
+ * and the bound expression (for the canonical uppercase name).
265
+ */
266
+ export function detectDynamicArrayFunction(ast, bound) {
267
+ // Check AST level (handles _XLFN. prefixed names)
268
+ if (ast.type === NodeType.FunctionCall) {
269
+ const upper = ast.name.toUpperCase();
270
+ if (DYNAMIC_ARRAY_FUNCTION_NAMES.has(upper)) {
271
+ return true;
272
+ }
273
+ const canonical = stripFunctionPrefix(upper);
274
+ if (DYNAMIC_ARRAY_FUNCTION_NAMES.has(canonical)) {
275
+ return true;
276
+ }
277
+ }
278
+ // Check bound expression level
279
+ if (bound.kind === BoundExprKind.Call && DYNAMIC_ARRAY_FUNCTION_NAMES.has(bound.name)) {
280
+ return true;
281
+ }
282
+ return false;
283
+ }
284
+ /**
285
+ * Check if the formula's top-level expression is SUBTOTAL or AGGREGATE.
286
+ *
287
+ * Excel's SUBTOTAL/AGGREGATE functions deliberately skip any cell whose
288
+ * own source formula is itself a SUBTOTAL or AGGREGATE call — this is
289
+ * what makes the classic "totals row inside a filtered range" case not
290
+ * double-count. `buildRangeArray` reads this flag off the compiled
291
+ * formula to decide whether to set `subtotalMask[r][c]`.
292
+ */
293
+ export function detectSubtotalOutput(ast, bound) {
294
+ if (ast.type === NodeType.FunctionCall) {
295
+ const upper = ast.name.toUpperCase();
296
+ const canonical = stripFunctionPrefix(upper);
297
+ if (canonical === "SUBTOTAL" || canonical === "AGGREGATE") {
298
+ return true;
299
+ }
300
+ }
301
+ if (bound.kind === BoundExprKind.Call &&
302
+ (bound.name === "SUBTOTAL" || bound.name === "AGGREGATE")) {
303
+ return true;
304
+ }
305
+ return false;
306
+ }
307
+ /**
308
+ * Analyze a bound expression for volatile functions and dynamic references.
309
+ *
310
+ * @param nameResolver - Optional; if a NameExpr resolves to a formula-based
311
+ * defined name containing INDIRECT/OFFSET, the outer formula inherits
312
+ * `hasDynamicRefs = true`.
313
+ */
314
+ export function analyzeExpr(expr, nameResolver) {
315
+ let isVolatile = false;
316
+ let hasDynamicRefs = false;
317
+ let containsLambda = false;
318
+ walkAnalyze(expr);
319
+ return { isVolatile, hasDynamicRefs, containsLambda };
320
+ function walkAnalyze(e) {
321
+ switch (e.kind) {
322
+ case BoundExprKind.Call:
323
+ if (VOLATILE_FUNCTIONS.has(e.name)) {
324
+ isVolatile = true;
325
+ }
326
+ for (const arg of e.args) {
327
+ walkAnalyze(arg);
328
+ }
329
+ break;
330
+ case BoundExprKind.SpecialCall:
331
+ if (DYNAMIC_REF_FUNCTIONS.has(e.name)) {
332
+ hasDynamicRefs = true;
333
+ }
334
+ if (VOLATILE_FUNCTIONS.has(e.name)) {
335
+ isVolatile = true;
336
+ }
337
+ for (const arg of e.args) {
338
+ walkAnalyze(arg);
339
+ }
340
+ break;
341
+ case BoundExprKind.Lambda:
342
+ containsLambda = true;
343
+ walkAnalyze(e.body);
344
+ break;
345
+ case BoundExprKind.NameExpr:
346
+ // If the name resolves to a formula that contains dynamic refs
347
+ // or volatile functions, the outer formula inherits both flags.
348
+ // Forgetting to propagate `isVolatile` meant that a defined name
349
+ // pointing at `NOW()` stayed cached between calculations — the
350
+ // bug drove R5-P0-5.
351
+ if (nameResolver) {
352
+ const resolved = nameResolver(e.upperName);
353
+ if (resolved?.hasDynamicRefs) {
354
+ hasDynamicRefs = true;
355
+ }
356
+ if (resolved?.isVolatile) {
357
+ isVolatile = true;
358
+ }
359
+ }
360
+ break;
361
+ case BoundExprKind.BinaryOp:
362
+ walkAnalyze(e.left);
363
+ walkAnalyze(e.right);
364
+ break;
365
+ case BoundExprKind.UnaryOp:
366
+ walkAnalyze(e.operand);
367
+ break;
368
+ case BoundExprKind.Percent:
369
+ walkAnalyze(e.operand);
370
+ break;
371
+ case BoundExprKind.Array:
372
+ for (const row of e.rows) {
373
+ for (const elem of row) {
374
+ walkAnalyze(elem);
375
+ }
376
+ }
377
+ break;
378
+ default:
379
+ // Literal, CellRef, AreaRef, etc. — no children to analyze
380
+ break;
381
+ }
382
+ }
383
+ }
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Dependency Graph for Formula Calculation
3
+ *
4
+ * Builds a dependency graph from compiled formulas' static dependencies,
5
+ * then produces a topological evaluation order with circular reference
6
+ * detection.
7
+ *
8
+ * Key exports:
9
+ * - `buildDependencyGraphFromDeps()` — build graph from CompiledFormula static deps
10
+ * - `topologicalSort()` — produce evaluation order, detecting circular refs
11
+ */
12
+ /**
13
+ * The dependency graph structure.
14
+ *
15
+ * - `dependsOn`: formula cell key → set of cell keys it reads from
16
+ * - `dependedBy`: cell key → set of formula cell keys that read from it
17
+ * - `formulaKeys`: ordered list of all formula cell keys
18
+ * - `circularKeys`: set of formula cell keys involved in circular references
19
+ */
20
+ export interface DependencyGraph {
21
+ /** Forward edges: formula → cells it depends on */
22
+ readonly dependsOn: ReadonlyMap<string, ReadonlySet<string>>;
23
+ /** Reverse edges: cell → formulas that depend on it */
24
+ readonly dependedBy: ReadonlyMap<string, ReadonlySet<string>>;
25
+ /** All formula cell keys in insertion order */
26
+ readonly formulaKeys: readonly string[];
27
+ /** Formula cell keys that are part of a circular reference cycle */
28
+ readonly circularKeys: ReadonlySet<string>;
29
+ }
30
+ /**
31
+ * Build a dependency graph from compiled formulas' static dependencies.
32
+ *
33
+ * Operates on the already-resolved `StaticDependencySet` from each compiled
34
+ * formula. Since names and structured references are already resolved by
35
+ * the binder, the dependency edges are complete.
36
+ *
37
+ * @param compiled - Map from formula cell key to compiled formula with static deps
38
+ * @param producerMap - Optional map from cell key → formula key that produces
39
+ * that cell's value (via CSE distribution or dynamic-array spill). Allows
40
+ * dependency edges to be added to the producer even when the target cell
41
+ * isn't itself a formula.
42
+ * @returns The complete dependency graph
43
+ */
44
+ export declare function buildDependencyGraphFromDeps(compiled: ReadonlyMap<string, {
45
+ instance: {
46
+ sheetName: string;
47
+ row: number;
48
+ col: number;
49
+ isDynamicArray?: boolean;
50
+ };
51
+ /**
52
+ * Whether this formula's top-level function is a known dynamic-
53
+ * array producer (SEQUENCE / FILTER / SORT / …). Used to collapse
54
+ * downstream `A1:A5`-style range dependencies into a single edge
55
+ * on the master so dependency ordering stays correct on the first
56
+ * calc pass (before ghost cells exist in the snapshot).
57
+ */
58
+ isDynamicArrayFunction?: boolean;
59
+ staticDeps: {
60
+ cells: readonly {
61
+ sheet: string;
62
+ row: number;
63
+ col: number;
64
+ }[];
65
+ areas: readonly {
66
+ sheet: string;
67
+ top: number;
68
+ left: number;
69
+ bottom: number;
70
+ right: number;
71
+ }[];
72
+ };
73
+ }>, producerMap?: ReadonlyMap<string, string>): DependencyGraph;
74
+ /**
75
+ * Merge runtime-discovered dynamic dependencies into a dependency graph.
76
+ *
77
+ * After evaluating formulas that contain INDIRECT/OFFSET, the runtime
78
+ * dependency recorder has collected the actual cell accesses. This function
79
+ * incorporates those dynamic edges into the graph and re-detects cycles.
80
+ *
81
+ * Returns a new graph if edges were added, or the original graph if no
82
+ * dynamic deps were recorded.
83
+ */
84
+ export declare function mergeDynamicDeps(graph: DependencyGraph, dynamicDeps: ReadonlyMap<string, ReadonlySet<string>>): {
85
+ graph: DependencyGraph;
86
+ changed: boolean;
87
+ };
88
+ /**
89
+ * Produce a topological evaluation order for formula cells using Kahn's algorithm.
90
+ * Cells with no dependencies are evaluated first. Circular references are
91
+ * appended at the end in their original order.
92
+ */
93
+ export declare function topologicalSort(graph: DependencyGraph): string[];