@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,354 @@
1
+ "use strict";
2
+ /**
3
+ * Conditional Aggregate Functions — Native RuntimeValue Implementation
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.buildCriteriaPredicateRV = buildCriteriaPredicateRV;
7
+ exports.fnSUMIF = fnSUMIF;
8
+ exports.fnSUMIFS = fnSUMIFS;
9
+ exports.fnCOUNTIF = fnCOUNTIF;
10
+ exports.fnCOUNTIFS = fnCOUNTIFS;
11
+ exports.fnAVERAGEIF = fnAVERAGEIF;
12
+ exports.fnAVERAGEIFS = fnAVERAGEIFS;
13
+ exports.fnMAXIFS = fnMAXIFS;
14
+ exports.fnMINIFS = fnMINIFS;
15
+ const values_1 = require("../runtime/values");
16
+ const _shared_1 = require("./_shared");
17
+ // ============================================================================
18
+ // Criteria Predicate Builder (RuntimeValue version)
19
+ // ============================================================================
20
+ /**
21
+ * Build a criteria predicate from a ScalarValue.
22
+ * Matches Excel SUMIF/COUNTIF criteria semantics:
23
+ * - number → exact numeric match
24
+ * - boolean → exact boolean match
25
+ * - string with operator prefix (">5", "<=10", "<>abc") → comparison
26
+ * - string with wildcards (* ?) → pattern match
27
+ * - plain string → case-insensitive exact match (or numeric if parseable)
28
+ */
29
+ function buildCriteriaPredicateRV(criteria) {
30
+ if (criteria.kind === 1 /* RVKind.Number */) {
31
+ const n = criteria.value;
32
+ return v => v.kind === 1 /* RVKind.Number */ && v.value === n;
33
+ }
34
+ if (criteria.kind === 3 /* RVKind.Boolean */) {
35
+ const b = criteria.value;
36
+ return v => v.kind === 3 /* RVKind.Boolean */ && v.value === b;
37
+ }
38
+ if (criteria.kind === 4 /* RVKind.Error */) {
39
+ return () => false;
40
+ }
41
+ // Blank criteria: match blank/empty-string
42
+ if (criteria.kind === 0 /* RVKind.Blank */) {
43
+ return v => v.kind === 0 /* RVKind.Blank */ || (v.kind === 2 /* RVKind.String */ && v.value === "");
44
+ }
45
+ // String criteria
46
+ const s = criteria.kind === 2 /* RVKind.String */ ? criteria.value : "";
47
+ // Operator-prefixed criteria. Order the regex alternatives longest-first
48
+ // so that `<>abc` matches the `<>` branch (not `<` with `>abc` as the
49
+ // value). Without the explicit ordering, `/^[<>]=?/` would greedily
50
+ // consume just `<` and silently mis-route every not-equal criterion to
51
+ // the `<` branch.
52
+ const opMatch = /^(<>|<=|>=|<|>|=)(.*)$/.exec(s);
53
+ if (opMatch) {
54
+ const [, op, valStr] = opMatch;
55
+ const numVal = Number(valStr);
56
+ const isNum = !isNaN(numVal) && valStr.trim() !== "";
57
+ // For numeric comparisons Excel coerces booleans (TRUE→1, FALSE→0) and
58
+ // blank (→0); numeric strings are NOT coerced (COUNTIF stays textual
59
+ // for those). Only real Number / Boolean / Blank cells participate in
60
+ // numeric comparisons; everything else falls back to string compare.
61
+ const numericOf = (v) => {
62
+ if (v.kind === 1 /* RVKind.Number */) {
63
+ return v.value;
64
+ }
65
+ if (v.kind === 3 /* RVKind.Boolean */) {
66
+ return v.value ? 1 : 0;
67
+ }
68
+ if (v.kind === 0 /* RVKind.Blank */) {
69
+ return 0;
70
+ }
71
+ return Number.NaN;
72
+ };
73
+ return (v) => {
74
+ const vn = numericOf(v);
75
+ const vs = (0, values_1.toStringRV)(v).toLowerCase();
76
+ const cs = valStr.toLowerCase();
77
+ switch (op) {
78
+ case "=":
79
+ return isNum ? vn === numVal : vs === cs;
80
+ case "<>":
81
+ return isNum ? vn !== numVal : vs !== cs;
82
+ case ">":
83
+ return isNum ? vn > numVal : vs > cs;
84
+ case "<":
85
+ return isNum ? vn < numVal : vs < cs;
86
+ case ">=":
87
+ return isNum ? vn >= numVal : vs >= cs;
88
+ case "<=":
89
+ return isNum ? vn <= numVal : vs <= cs;
90
+ default:
91
+ return false;
92
+ }
93
+ };
94
+ }
95
+ // Wildcard match (case-insensitive). Excel treats `~*`, `~?`, `~~` as
96
+ // literal `*`, `?`, `~` and everything else as a regex special character
97
+ // that must be escaped. Only an unescaped `*` or `?` triggers the wildcard
98
+ // path; a pattern like `~*` matches a literal asterisk.
99
+ if ((0, _shared_1.hasUnescapedWildcard)(s)) {
100
+ try {
101
+ const re = new RegExp("^" + (0, _shared_1.excelWildcardToRegex)(s) + "$", "i");
102
+ return v => re.test((0, values_1.toStringRV)(v));
103
+ }
104
+ catch {
105
+ const literal = (0, _shared_1.unescapeExcelWildcard)(s).toLowerCase();
106
+ return v => (0, values_1.toStringRV)(v).toLowerCase() === literal;
107
+ }
108
+ }
109
+ // No wildcards: strip any `~` escapes and do a literal case-insensitive compare.
110
+ const literal = (0, _shared_1.unescapeExcelWildcard)(s);
111
+ // Exact match (case-insensitive for strings, numeric for numbers)
112
+ const numCriteria = Number(literal);
113
+ if (!isNaN(numCriteria) && literal.trim() !== "") {
114
+ return v => v.kind === 1 /* RVKind.Number */ && v.value === numCriteria;
115
+ }
116
+ const literalLc = literal.toLowerCase();
117
+ return v => (0, values_1.toStringRV)(v).toLowerCase() === literalLc;
118
+ }
119
+ /**
120
+ * Scan a criteria string for an unescaped `*` or `?`. A backslash-style
121
+ * escape in Excel is `~`; so `~*` and `~?` are literals, while `*` and `?`
122
+ * on their own or at a position not preceded by `~` count as wildcards.
123
+ */
124
+ // ── Wildcard helpers live in `_shared.ts` and are re-used by SEARCH / MATCH /
125
+ // XLOOKUP / SUMIF / COUNTIF so every function agrees on the same escape
126
+ // semantics (`~*`, `~?`, `~~`). See `excelWildcardToRegex`,
127
+ // `hasUnescapedWildcard`, and `unescapeExcelWildcard`.
128
+ // ============================================================================
129
+ // Functions
130
+ // ============================================================================
131
+ function fnSUMIF(args) {
132
+ const rangeArr = (0, _shared_1.asArray)(args[0]);
133
+ if (!rangeArr) {
134
+ return values_1.ERRORS.VALUE;
135
+ }
136
+ const criteriaScalar = (0, values_1.topLeft)(args[1]);
137
+ if ((0, values_1.isError)(criteriaScalar)) {
138
+ return criteriaScalar;
139
+ }
140
+ const pred = buildCriteriaPredicateRV(criteriaScalar);
141
+ const sumArr = args.length > 2 ? ((0, _shared_1.asArray)(args[2]) ?? rangeArr) : rangeArr;
142
+ let sum = 0;
143
+ for (let r = 0; r < rangeArr.height; r++) {
144
+ for (let c = 0; c < rangeArr.width; c++) {
145
+ if (pred((0, _shared_1.getCell)(rangeArr, r, c))) {
146
+ const sv = (0, _shared_1.getCell)(sumArr, r, c);
147
+ if (sv.kind === 1 /* RVKind.Number */) {
148
+ sum += sv.value;
149
+ }
150
+ }
151
+ }
152
+ }
153
+ return (0, values_1.rvNumber)(sum);
154
+ }
155
+ /**
156
+ * Scan successive `(range, criteria)` argument pairs starting at
157
+ * `startIdx`. Returns a list of `{ arr, pred }` ready for iteration, or
158
+ * an `{ error }` sentinel when a range argument is missing, a criteria
159
+ * value is itself an error, or a criteria range's shape does not match
160
+ * `target`'s shape (Excel's SUMIFS/COUNTIFS require identical shapes —
161
+ * silently zero-extending with `BLANK` produced wrong counts).
162
+ *
163
+ * Used by SUMIFS/COUNTIFS/AVERAGEIFS/MAXIFS/MINIFS which share the
164
+ * "target array + N criteria pairs" shape.
165
+ */
166
+ function collectCriteriaPairs(args, startIdx, target) {
167
+ const pairs = [];
168
+ for (let i = startIdx; i < args.length - 1; i += 2) {
169
+ const critRange = (0, _shared_1.asArray)(args[i]);
170
+ if (!critRange) {
171
+ return { error: values_1.ERRORS.VALUE };
172
+ }
173
+ if (critRange.height !== target.height || critRange.width !== target.width) {
174
+ return { error: values_1.ERRORS.VALUE };
175
+ }
176
+ const cs = (0, values_1.topLeft)(args[i + 1]);
177
+ if ((0, values_1.isError)(cs)) {
178
+ return { error: cs };
179
+ }
180
+ pairs.push({ arr: critRange, pred: buildCriteriaPredicateRV(cs) });
181
+ }
182
+ return { pairs };
183
+ }
184
+ /**
185
+ * Walk every (row, col) position in `target` and invoke `onMatch(r, c)`
186
+ * whenever all criteria predicates evaluate true at that position. The
187
+ * criteria arrays are expected to share `target`'s shape — Excel returns
188
+ * `#VALUE!` at the call site if they don't, which callers can detect by
189
+ * checking `target.height` / `target.width` before invoking this helper.
190
+ */
191
+ function iterateMultiCriteria(target, pairs, onMatch) {
192
+ const rows = target.height;
193
+ const cols = target.width;
194
+ for (let r = 0; r < rows; r++) {
195
+ for (let c = 0; c < cols; c++) {
196
+ let allMatch = true;
197
+ for (const p of pairs) {
198
+ if (!p.pred((0, _shared_1.getCell)(p.arr, r, c))) {
199
+ allMatch = false;
200
+ break;
201
+ }
202
+ }
203
+ if (allMatch) {
204
+ onMatch(r, c);
205
+ }
206
+ }
207
+ }
208
+ }
209
+ function fnSUMIFS(args) {
210
+ const sumArr = (0, _shared_1.asArray)(args[0]);
211
+ if (!sumArr || args.length < 3) {
212
+ return values_1.ERRORS.VALUE;
213
+ }
214
+ const pairs = collectCriteriaPairs(args, 1, sumArr);
215
+ if ("error" in pairs) {
216
+ return pairs.error;
217
+ }
218
+ let sum = 0;
219
+ iterateMultiCriteria(sumArr, pairs.pairs, (r, c) => {
220
+ const sv = (0, _shared_1.getCell)(sumArr, r, c);
221
+ if (sv.kind === 1 /* RVKind.Number */) {
222
+ sum += sv.value;
223
+ }
224
+ });
225
+ return (0, values_1.rvNumber)(sum);
226
+ }
227
+ function fnCOUNTIF(args) {
228
+ const rangeArr = (0, _shared_1.asArray)(args[0]);
229
+ if (!rangeArr) {
230
+ return values_1.ERRORS.VALUE;
231
+ }
232
+ const cs = (0, values_1.topLeft)(args[1]);
233
+ if ((0, values_1.isError)(cs)) {
234
+ return cs;
235
+ }
236
+ const pred = buildCriteriaPredicateRV(cs);
237
+ let count = 0;
238
+ for (let r = 0; r < rangeArr.height; r++) {
239
+ for (let c = 0; c < rangeArr.width; c++) {
240
+ if (pred((0, _shared_1.getCell)(rangeArr, r, c))) {
241
+ count++;
242
+ }
243
+ }
244
+ }
245
+ return (0, values_1.rvNumber)(count);
246
+ }
247
+ function fnCOUNTIFS(args) {
248
+ if (args.length < 2 || !(0, values_1.isArray)(args[0])) {
249
+ return values_1.ERRORS.VALUE;
250
+ }
251
+ // The first range defines the target shape; every subsequent criteria
252
+ // range must match. `collectCriteriaPairs` also validates args[0]
253
+ // against itself (trivially passes) as a nice-to-have for consistency.
254
+ const target = args[0];
255
+ const pairs = collectCriteriaPairs(args, 0, target);
256
+ if ("error" in pairs) {
257
+ return pairs.error;
258
+ }
259
+ let count = 0;
260
+ iterateMultiCriteria(target, pairs.pairs, () => {
261
+ count++;
262
+ });
263
+ return (0, values_1.rvNumber)(count);
264
+ }
265
+ function fnAVERAGEIF(args) {
266
+ const rangeArr = (0, _shared_1.asArray)(args[0]);
267
+ if (!rangeArr) {
268
+ return values_1.ERRORS.VALUE;
269
+ }
270
+ const cs = (0, values_1.topLeft)(args[1]);
271
+ if ((0, values_1.isError)(cs)) {
272
+ return cs;
273
+ }
274
+ const pred = buildCriteriaPredicateRV(cs);
275
+ const avgArr = args.length > 2 ? ((0, _shared_1.asArray)(args[2]) ?? rangeArr) : rangeArr;
276
+ let sum = 0;
277
+ let count = 0;
278
+ for (let r = 0; r < rangeArr.height; r++) {
279
+ for (let c = 0; c < rangeArr.width; c++) {
280
+ if (pred((0, _shared_1.getCell)(rangeArr, r, c))) {
281
+ const sv = (0, _shared_1.getCell)(avgArr, r, c);
282
+ if (sv.kind === 1 /* RVKind.Number */) {
283
+ sum += sv.value;
284
+ count++;
285
+ }
286
+ }
287
+ }
288
+ }
289
+ return count === 0 ? values_1.ERRORS.DIV0 : (0, values_1.rvNumber)(sum / count);
290
+ }
291
+ function fnAVERAGEIFS(args) {
292
+ const avgArr = (0, _shared_1.asArray)(args[0]);
293
+ if (!avgArr || args.length < 3) {
294
+ return values_1.ERRORS.VALUE;
295
+ }
296
+ const pairs = collectCriteriaPairs(args, 1, avgArr);
297
+ if ("error" in pairs) {
298
+ return pairs.error;
299
+ }
300
+ let sum = 0;
301
+ let count = 0;
302
+ iterateMultiCriteria(avgArr, pairs.pairs, (r, c) => {
303
+ const sv = (0, _shared_1.getCell)(avgArr, r, c);
304
+ if (sv.kind === 1 /* RVKind.Number */) {
305
+ sum += sv.value;
306
+ count++;
307
+ }
308
+ });
309
+ return count === 0 ? values_1.ERRORS.DIV0 : (0, values_1.rvNumber)(sum / count);
310
+ }
311
+ function fnMAXIFS(args) {
312
+ const maxArr = (0, _shared_1.asArray)(args[0]);
313
+ if (!maxArr || args.length < 3) {
314
+ return values_1.ERRORS.VALUE;
315
+ }
316
+ const pairs = collectCriteriaPairs(args, 1, maxArr);
317
+ if ("error" in pairs) {
318
+ return pairs.error;
319
+ }
320
+ let result = -Infinity;
321
+ let found = false;
322
+ iterateMultiCriteria(maxArr, pairs.pairs, (r, c) => {
323
+ const sv = (0, _shared_1.getCell)(maxArr, r, c);
324
+ if (sv.kind === 1 /* RVKind.Number */) {
325
+ if (sv.value > result) {
326
+ result = sv.value;
327
+ }
328
+ found = true;
329
+ }
330
+ });
331
+ return (0, values_1.rvNumber)(found ? result : 0);
332
+ }
333
+ function fnMINIFS(args) {
334
+ const minArr = (0, _shared_1.asArray)(args[0]);
335
+ if (!minArr || args.length < 3) {
336
+ return values_1.ERRORS.VALUE;
337
+ }
338
+ const pairs = collectCriteriaPairs(args, 1, minArr);
339
+ if ("error" in pairs) {
340
+ return pairs.error;
341
+ }
342
+ let result = Infinity;
343
+ let found = false;
344
+ iterateMultiCriteria(minArr, pairs.pairs, (r, c) => {
345
+ const sv = (0, _shared_1.getCell)(minArr, r, c);
346
+ if (sv.kind === 1 /* RVKind.Number */) {
347
+ if (sv.value < result) {
348
+ result = sv.value;
349
+ }
350
+ found = true;
351
+ }
352
+ });
353
+ return (0, values_1.rvNumber)(found ? result : 0);
354
+ }
@@ -0,0 +1,288 @@
1
+ "use strict";
2
+ /**
3
+ * Database Functions — Native RuntimeValue Implementation
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.fnDSUM = fnDSUM;
7
+ exports.fnDAVERAGE = fnDAVERAGE;
8
+ exports.fnDCOUNT = fnDCOUNT;
9
+ exports.fnDMAX = fnDMAX;
10
+ exports.fnDMIN = fnDMIN;
11
+ exports.fnDPRODUCT = fnDPRODUCT;
12
+ exports.fnDGET = fnDGET;
13
+ exports.fnDCOUNTA = fnDCOUNTA;
14
+ exports.fnDSTDEV = fnDSTDEV;
15
+ exports.fnDSTDEVP = fnDSTDEVP;
16
+ exports.fnDVAR = fnDVAR;
17
+ exports.fnDVARP = fnDVARP;
18
+ const values_1 = require("../runtime/values");
19
+ const _shared_1 = require("./_shared");
20
+ const conditional_1 = require("./conditional");
21
+ /**
22
+ * Collect the field-column values from every database row that satisfies the
23
+ * criteria range. The returned list preserves each matching cell's original
24
+ * `ScalarValue` (numbers, strings, booleans, blanks, errors) so that callers
25
+ * can decide how to aggregate — numeric aggregators filter to numbers while
26
+ * DGET inspects the raw value.
27
+ *
28
+ * Returns an error RuntimeValue when the inputs are malformed (invalid array
29
+ * shapes, unknown field name, etc.). On success, returns `ScalarValue[]`.
30
+ */
31
+ function collectDatabaseMatches(args) {
32
+ const dbArr = (0, _shared_1.asArray)(args[0]);
33
+ const critArr = (0, _shared_1.asArray)(args[2]);
34
+ if (!dbArr || !critArr) {
35
+ return values_1.ERRORS.VALUE;
36
+ }
37
+ const fieldArg = (0, values_1.topLeft)(args[1]);
38
+ if (dbArr.height < 2 || critArr.height < 2) {
39
+ return values_1.ERRORS.VALUE;
40
+ }
41
+ // Determine field column index.
42
+ //
43
+ // Excel accepts the field argument as:
44
+ // - a 1-based integer column index (or TRUE/FALSE coerced to 1/0)
45
+ // - a string that matches one of the header cells (case-insensitive,
46
+ // and trimmed so imported data with stray whitespace still matches)
47
+ let fieldIdx = -1;
48
+ if (fieldArg.kind === 1 /* RVKind.Number */) {
49
+ fieldIdx = Math.trunc(fieldArg.value) - 1;
50
+ }
51
+ else if (fieldArg.kind === 3 /* RVKind.Boolean */) {
52
+ // TRUE → 1-based column 1 (index 0); FALSE → 0 → invalid (Excel
53
+ // rejects FALSE with #VALUE!). Match that routing explicitly.
54
+ fieldIdx = fieldArg.value ? 0 : -1;
55
+ }
56
+ else if (fieldArg.kind === 2 /* RVKind.String */) {
57
+ const want = fieldArg.value.trim().toLowerCase();
58
+ for (let c = 0; c < dbArr.width; c++) {
59
+ if ((0, values_1.toStringRV)((0, _shared_1.getCell)(dbArr, 0, c))
60
+ .trim()
61
+ .toLowerCase() === want) {
62
+ fieldIdx = c;
63
+ break;
64
+ }
65
+ }
66
+ }
67
+ if (fieldIdx < 0 || fieldIdx >= dbArr.width) {
68
+ return values_1.ERRORS.VALUE;
69
+ }
70
+ // Parse criteria: columns map to database header columns (trimmed,
71
+ // case-insensitive, same as the field-name path above).
72
+ const critColIndices = [];
73
+ for (let cc = 0; cc < critArr.width; cc++) {
74
+ const name = (0, values_1.toStringRV)((0, _shared_1.getCell)(critArr, 0, cc))
75
+ .trim()
76
+ .toLowerCase();
77
+ let idx = -1;
78
+ for (let hc = 0; hc < dbArr.width; hc++) {
79
+ if ((0, values_1.toStringRV)((0, _shared_1.getCell)(dbArr, 0, hc))
80
+ .trim()
81
+ .toLowerCase() === name) {
82
+ idx = hc;
83
+ break;
84
+ }
85
+ }
86
+ critColIndices.push(idx);
87
+ }
88
+ // Collect matching rows' field values
89
+ const matches = [];
90
+ for (let r = 1; r < dbArr.height; r++) {
91
+ let matchesAnyCritRow = false;
92
+ for (let cr = 1; cr < critArr.height; cr++) {
93
+ let allMatch = true;
94
+ for (let cc = 0; cc < critArr.width; cc++) {
95
+ const critVal = (0, _shared_1.getCell)(critArr, cr, cc);
96
+ if (critVal.kind === 0 /* RVKind.Blank */ ||
97
+ (critVal.kind === 2 /* RVKind.String */ && critVal.value === "")) {
98
+ continue;
99
+ }
100
+ const dbCol = critColIndices[cc];
101
+ if (dbCol < 0) {
102
+ allMatch = false;
103
+ break;
104
+ }
105
+ const pred = (0, conditional_1.buildCriteriaPredicateRV)(critVal);
106
+ if (!pred((0, _shared_1.getCell)(dbArr, r, dbCol))) {
107
+ allMatch = false;
108
+ break;
109
+ }
110
+ }
111
+ if (allMatch) {
112
+ matchesAnyCritRow = true;
113
+ break;
114
+ }
115
+ }
116
+ if (matchesAnyCritRow) {
117
+ matches.push((0, _shared_1.getCell)(dbArr, r, fieldIdx));
118
+ }
119
+ }
120
+ return matches;
121
+ }
122
+ /**
123
+ * Shared wrapper for numeric aggregators (DSUM, DAVERAGE, DCOUNT, DMAX, DMIN,
124
+ * DPRODUCT). Collects matches, filters to numeric values, and delegates to the
125
+ * caller-supplied reducer.
126
+ */
127
+ function databaseNumericAggregate(args, aggregator) {
128
+ const matches = collectDatabaseMatches(args);
129
+ if (!Array.isArray(matches)) {
130
+ return matches;
131
+ }
132
+ const values = [];
133
+ for (const v of matches) {
134
+ if (v.kind === 1 /* RVKind.Number */) {
135
+ values.push(v.value);
136
+ }
137
+ }
138
+ return aggregator(values);
139
+ }
140
+ function fnDSUM(args) {
141
+ return databaseNumericAggregate(args, vals => (0, values_1.rvNumber)(vals.reduce((a, b) => a + b, 0)));
142
+ }
143
+ function fnDAVERAGE(args) {
144
+ return databaseNumericAggregate(args, vals => vals.length === 0 ? values_1.ERRORS.DIV0 : (0, values_1.rvNumber)(vals.reduce((a, b) => a + b, 0) / vals.length));
145
+ }
146
+ function fnDCOUNT(args) {
147
+ return databaseNumericAggregate(args, vals => (0, values_1.rvNumber)(vals.length));
148
+ }
149
+ function fnDMAX(args) {
150
+ return databaseNumericAggregate(args, vals => {
151
+ if (vals.length === 0) {
152
+ return (0, values_1.rvNumber)(0);
153
+ }
154
+ // Avoid `Math.max(...vals)` — spreading a large numeric array onto the
155
+ // call stack throws `RangeError: Maximum call stack size exceeded` on
156
+ // databases with more than ~65k matching rows.
157
+ let m = vals[0];
158
+ for (let i = 1; i < vals.length; i++) {
159
+ if (vals[i] > m) {
160
+ m = vals[i];
161
+ }
162
+ }
163
+ return (0, values_1.rvNumber)(m);
164
+ });
165
+ }
166
+ function fnDMIN(args) {
167
+ return databaseNumericAggregate(args, vals => {
168
+ if (vals.length === 0) {
169
+ return (0, values_1.rvNumber)(0);
170
+ }
171
+ let m = vals[0];
172
+ for (let i = 1; i < vals.length; i++) {
173
+ if (vals[i] < m) {
174
+ m = vals[i];
175
+ }
176
+ }
177
+ return (0, values_1.rvNumber)(m);
178
+ });
179
+ }
180
+ function fnDPRODUCT(args) {
181
+ return databaseNumericAggregate(args, vals => (0, values_1.rvNumber)(vals.length === 0 ? 0 : vals.reduce((a, b) => a * b, 1)));
182
+ }
183
+ function fnDGET(args) {
184
+ const matches = collectDatabaseMatches(args);
185
+ if (!Array.isArray(matches)) {
186
+ return matches;
187
+ }
188
+ // DGET aggregator semantics: 0 matches → #VALUE!, exactly 1 → the value,
189
+ // >1 → #NUM!.
190
+ if (matches.length === 0) {
191
+ return values_1.ERRORS.VALUE;
192
+ }
193
+ if (matches.length > 1) {
194
+ return values_1.ERRORS.NUM;
195
+ }
196
+ return matches[0];
197
+ }
198
+ /**
199
+ * DCOUNTA(database, field, criteria) — count non-empty cells that match
200
+ * the criteria, in the specified field. Unlike DCOUNT (numeric-only),
201
+ * DCOUNTA counts any non-blank cell including text and booleans.
202
+ */
203
+ function fnDCOUNTA(args) {
204
+ const matches = collectDatabaseMatches(args);
205
+ if (!Array.isArray(matches)) {
206
+ return matches;
207
+ }
208
+ let count = 0;
209
+ for (const v of matches) {
210
+ // Count anything that is not Blank and not an empty string.
211
+ if (v.kind === 0 /* RVKind.Blank */) {
212
+ continue;
213
+ }
214
+ if (v.kind === 2 /* RVKind.String */ && v.value === "") {
215
+ continue;
216
+ }
217
+ count++;
218
+ }
219
+ return (0, values_1.rvNumber)(count);
220
+ }
221
+ /**
222
+ * DSTDEV(database, field, criteria) — sample standard deviation of
223
+ * numeric cells matching criteria in the specified field.
224
+ */
225
+ function fnDSTDEV(args) {
226
+ return databaseNumericAggregate(args, vals => {
227
+ if (vals.length < 2) {
228
+ return values_1.ERRORS.DIV0;
229
+ }
230
+ const mean = vals.reduce((a, b) => a + b, 0) / vals.length;
231
+ let ss = 0;
232
+ for (const v of vals) {
233
+ ss += (v - mean) * (v - mean);
234
+ }
235
+ return (0, values_1.rvNumber)(Math.sqrt(ss / (vals.length - 1)));
236
+ });
237
+ }
238
+ /**
239
+ * DSTDEVP(database, field, criteria) — population standard deviation
240
+ * of numeric cells matching criteria.
241
+ */
242
+ function fnDSTDEVP(args) {
243
+ return databaseNumericAggregate(args, vals => {
244
+ if (vals.length === 0) {
245
+ return values_1.ERRORS.DIV0;
246
+ }
247
+ const mean = vals.reduce((a, b) => a + b, 0) / vals.length;
248
+ let ss = 0;
249
+ for (const v of vals) {
250
+ ss += (v - mean) * (v - mean);
251
+ }
252
+ return (0, values_1.rvNumber)(Math.sqrt(ss / vals.length));
253
+ });
254
+ }
255
+ /**
256
+ * DVAR(database, field, criteria) — sample variance of matching numeric
257
+ * cells.
258
+ */
259
+ function fnDVAR(args) {
260
+ return databaseNumericAggregate(args, vals => {
261
+ if (vals.length < 2) {
262
+ return values_1.ERRORS.DIV0;
263
+ }
264
+ const mean = vals.reduce((a, b) => a + b, 0) / vals.length;
265
+ let ss = 0;
266
+ for (const v of vals) {
267
+ ss += (v - mean) * (v - mean);
268
+ }
269
+ return (0, values_1.rvNumber)(ss / (vals.length - 1));
270
+ });
271
+ }
272
+ /**
273
+ * DVARP(database, field, criteria) — population variance of matching
274
+ * numeric cells.
275
+ */
276
+ function fnDVARP(args) {
277
+ return databaseNumericAggregate(args, vals => {
278
+ if (vals.length === 0) {
279
+ return values_1.ERRORS.DIV0;
280
+ }
281
+ const mean = vals.reduce((a, b) => a + b, 0) / vals.length;
282
+ let ss = 0;
283
+ for (const v of vals) {
284
+ ss += (v - mean) * (v - mean);
285
+ }
286
+ return (0, values_1.rvNumber)(ss / vals.length);
287
+ });
288
+ }