ooxml-core 1.19.2 → 1.21.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 (352) hide show
  1. package/README.md +47 -1
  2. package/dist/{PptxHandler-6TNIQ7S5.cjs → PptxHandler-DNSXWTQV.cjs} +3 -3
  3. package/dist/{PptxHandler-2V4PQL6O.mjs → PptxHandler-FSKKPZZC.mjs} +3 -3
  4. package/dist/PptxHandler-H7MEWJJJ.mjs +4 -0
  5. package/dist/{PresentationBuilder-G7MPEGXJ.mjs → PresentationBuilder-7TSENZTX.mjs} +2 -2
  6. package/dist/{PresentationBuilder-RM52LCVN.cjs → PresentationBuilder-A5NI35VN.cjs} +5 -5
  7. package/dist/{PresentationBuilder-HQ6C7L4V.mjs → PresentationBuilder-RIJWQSEU.mjs} +3 -3
  8. package/dist/automation/docx-forms.d.ts +26 -0
  9. package/dist/automation/docx-forms.d.ts.map +1 -0
  10. package/dist/automation/index.cjs +6280 -2506
  11. package/dist/automation/index.d.ts +1 -0
  12. package/dist/automation/index.d.ts.map +1 -1
  13. package/dist/automation/index.mjs +6277 -2507
  14. package/dist/automation/xlsx-read.d.ts +56 -0
  15. package/dist/automation/xlsx-read.d.ts.map +1 -0
  16. package/dist/automation/xlsx.d.ts +105 -4
  17. package/dist/automation/xlsx.d.ts.map +1 -1
  18. package/dist/chart/axis-range.d.ts.map +1 -1
  19. package/dist/chart/bubble-radius.d.ts +0 -5
  20. package/dist/chart/bubble-radius.d.ts.map +1 -1
  21. package/dist/chart/extent.d.ts +9 -0
  22. package/dist/chart/extent.d.ts.map +1 -0
  23. package/dist/chart/histogram-binning.d.ts.map +1 -1
  24. package/dist/chart/index.cjs +56 -18
  25. package/dist/chart/index.mjs +56 -18
  26. package/dist/chart/render/chart-svg-cartesian.d.ts.map +1 -1
  27. package/dist/chart/render/chart-svg-legend.d.ts.map +1 -1
  28. package/dist/chart/render/chart-view-ex.d.ts.map +1 -1
  29. package/dist/chart/render/chart-view.d.ts.map +1 -1
  30. package/dist/chart/trendline-fit.d.ts.map +1 -1
  31. package/dist/{chunk-NYTR4UZ5.cjs → chunk-4LZIUJI3.cjs} +52 -12
  32. package/dist/{chunk-SLNQNVQM.mjs → chunk-4QPOJCJG.mjs} +45 -8
  33. package/dist/{chunk-XTSHZGSM.mjs → chunk-6IIMI5RS.mjs} +52 -12
  34. package/dist/{chunk-TJPUAUWL.mjs → chunk-BA7Z6ATM.mjs} +9 -195
  35. package/dist/{chunk-JUABSM7C.mjs → chunk-DLFMCZZT.mjs} +1 -1
  36. package/dist/{chunk-M4XLF4R7.mjs → chunk-GBKBR4CX.mjs} +20 -8
  37. package/dist/{chunk-R5FIHHGB.cjs → chunk-HL3FBJ6X.cjs} +1648 -1205
  38. package/dist/{chunk-ZJ2OKIJN.mjs → chunk-LF5E5ZOH.mjs} +642 -199
  39. package/dist/{chunk-4FTUAD2B.mjs → chunk-Q5PKBQXH.mjs} +766 -202
  40. package/dist/{chunk-M6GDBVQ7.mjs → chunk-VQF6HQEE.mjs} +1 -1
  41. package/dist/collab/embedding.d.ts +103 -0
  42. package/dist/collab/embedding.d.ts.map +1 -0
  43. package/dist/collab/index.cjs +450 -342
  44. package/dist/collab/index.d.ts +1 -0
  45. package/dist/collab/index.d.ts.map +1 -1
  46. package/dist/collab/index.mjs +443 -343
  47. package/dist/color/theme-palette.d.ts +5 -1
  48. package/dist/color/theme-palette.d.ts.map +1 -1
  49. package/dist/crypto/index.cjs +27 -2
  50. package/dist/crypto/index.mjs +27 -2
  51. package/dist/diagram/index.cjs +31 -3
  52. package/dist/diagram/index.mjs +31 -3
  53. package/dist/docx/block-parser.d.ts.map +1 -1
  54. package/dist/docx/cell-blocks.d.ts +7 -1
  55. package/dist/docx/cell-blocks.d.ts.map +1 -1
  56. package/dist/docx/content-control-edit.d.ts +14 -0
  57. package/dist/docx/content-control-edit.d.ts.map +1 -1
  58. package/dist/docx/content-control-model.d.ts +8 -0
  59. package/dist/docx/content-control-model.d.ts.map +1 -1
  60. package/dist/docx/content-control-values.d.ts +20 -0
  61. package/dist/docx/content-control-values.d.ts.map +1 -0
  62. package/dist/docx/content-control.d.ts +7 -1
  63. package/dist/docx/content-control.d.ts.map +1 -1
  64. package/dist/docx/element-order.d.ts +10 -5
  65. package/dist/docx/element-order.d.ts.map +1 -1
  66. package/dist/docx/embedded.cjs +3861 -1379
  67. package/dist/docx/embedded.mjs +3861 -1379
  68. package/dist/docx/field-instruction.d.ts +22 -0
  69. package/dist/docx/field-instruction.d.ts.map +1 -0
  70. package/dist/docx/form-field-model.d.ts +48 -0
  71. package/dist/docx/form-field-model.d.ts.map +1 -0
  72. package/dist/docx/form-fields.d.ts +31 -0
  73. package/dist/docx/form-fields.d.ts.map +1 -0
  74. package/dist/docx/form-fill-fields.d.ts +61 -0
  75. package/dist/docx/form-fill-fields.d.ts.map +1 -0
  76. package/dist/docx/form-fill-labels.d.ts +8 -0
  77. package/dist/docx/form-fill-labels.d.ts.map +1 -0
  78. package/dist/docx/form-fill-sites.d.ts +59 -0
  79. package/dist/docx/form-fill-sites.d.ts.map +1 -0
  80. package/dist/docx/form-fill-values.d.ts +28 -0
  81. package/dist/docx/form-fill-values.d.ts.map +1 -0
  82. package/dist/docx/form-fill-write.d.ts +26 -0
  83. package/dist/docx/form-fill-write.d.ts.map +1 -0
  84. package/dist/docx/glossary.d.ts +15 -0
  85. package/dist/docx/glossary.d.ts.map +1 -0
  86. package/dist/docx/index.cjs +5929 -3153
  87. package/dist/docx/index.d.ts +7 -0
  88. package/dist/docx/index.d.ts.map +1 -1
  89. package/dist/docx/index.mjs +5913 -3154
  90. package/dist/docx/inline-annotations.d.ts +21 -0
  91. package/dist/docx/inline-annotations.d.ts.map +1 -0
  92. package/dist/docx/inline-container-markers.d.ts +14 -0
  93. package/dist/docx/inline-container-markers.d.ts.map +1 -0
  94. package/dist/docx/inline-containers.d.ts +54 -0
  95. package/dist/docx/inline-containers.d.ts.map +1 -0
  96. package/dist/docx/inline-form-field-bookmarks.d.ts +15 -0
  97. package/dist/docx/inline-form-field-bookmarks.d.ts.map +1 -0
  98. package/dist/docx/inline-marker-positions.d.ts +15 -0
  99. package/dist/docx/inline-marker-positions.d.ts.map +1 -0
  100. package/dist/docx/inline-markers.d.ts +63 -0
  101. package/dist/docx/inline-markers.d.ts.map +1 -0
  102. package/dist/docx/inline-slots.d.ts +24 -0
  103. package/dist/docx/inline-slots.d.ts.map +1 -0
  104. package/dist/docx/layout/adapter.d.ts.map +1 -1
  105. package/dist/docx/layout/index.cjs +1176 -563
  106. package/dist/docx/layout/index.d.ts +2 -1
  107. package/dist/docx/layout/index.d.ts.map +1 -1
  108. package/dist/docx/layout/index.mjs +1175 -564
  109. package/dist/docx/layout/input.d.ts +5 -1
  110. package/dist/docx/layout/input.d.ts.map +1 -1
  111. package/dist/docx/layout/page-style-refs.d.ts +21 -0
  112. package/dist/docx/layout/page-style-refs.d.ts.map +1 -0
  113. package/dist/docx/layout/paragraph-fragments.d.ts.map +1 -1
  114. package/dist/docx/layout/result.d.ts +1 -0
  115. package/dist/docx/layout/result.d.ts.map +1 -1
  116. package/dist/docx/layout/tab-stops.d.ts +8 -1
  117. package/dist/docx/layout/tab-stops.d.ts.map +1 -1
  118. package/dist/docx/load/index.cjs +3969 -1487
  119. package/dist/docx/load/index.mjs +3969 -1487
  120. package/dist/docx/model-run.d.ts +24 -2
  121. package/dist/docx/model-run.d.ts.map +1 -1
  122. package/dist/docx/model.d.ts +5 -0
  123. package/dist/docx/model.d.ts.map +1 -1
  124. package/dist/docx/numbering-format.d.ts.map +1 -1
  125. package/dist/docx/parse-warnings.d.ts.map +1 -1
  126. package/dist/docx/parse.d.ts.map +1 -1
  127. package/dist/docx/run-segmentation.d.ts +11 -0
  128. package/dist/docx/run-segmentation.d.ts.map +1 -0
  129. package/dist/docx/save.d.ts.map +1 -1
  130. package/dist/docx/section-model.d.ts +5 -0
  131. package/dist/docx/section-model.d.ts.map +1 -1
  132. package/dist/docx/sections.d.ts +4 -2
  133. package/dist/docx/sections.d.ts.map +1 -1
  134. package/dist/docx/settings.d.ts +9 -0
  135. package/dist/docx/settings.d.ts.map +1 -1
  136. package/dist/docx/special-characters.d.ts +34 -0
  137. package/dist/docx/special-characters.d.ts.map +1 -0
  138. package/dist/docx/style-ref-fields.d.ts +40 -0
  139. package/dist/docx/style-ref-fields.d.ts.map +1 -0
  140. package/dist/docx/style-ref.d.ts +85 -0
  141. package/dist/docx/style-ref.d.ts.map +1 -0
  142. package/dist/docx/table-model.d.ts +2 -2
  143. package/dist/docx/table-model.d.ts.map +1 -1
  144. package/dist/docx/ui/break-note-schema.d.ts.map +1 -1
  145. package/dist/docx/ui/content-control-commands.d.ts +20 -8
  146. package/dist/docx/ui/content-control-commands.d.ts.map +1 -1
  147. package/dist/docx/ui/content-control-guard.d.ts +4 -1
  148. package/dist/docx/ui/content-control-guard.d.ts.map +1 -1
  149. package/dist/docx/ui/content-control-paste.d.ts +23 -0
  150. package/dist/docx/ui/content-control-paste.d.ts.map +1 -0
  151. package/dist/docx/ui/content-control-rows.d.ts +15 -0
  152. package/dist/docx/ui/content-control-rows.d.ts.map +1 -0
  153. package/dist/docx/ui/content-control-sources.d.ts +12 -0
  154. package/dist/docx/ui/content-control-sources.d.ts.map +1 -0
  155. package/dist/docx/ui/content-control-spans.d.ts +29 -6
  156. package/dist/docx/ui/content-control-spans.d.ts.map +1 -1
  157. package/dist/docx/ui/content-control-temporary.d.ts +10 -0
  158. package/dist/docx/ui/content-control-temporary.d.ts.map +1 -0
  159. package/dist/docx/ui/form-field-commands.d.ts +41 -0
  160. package/dist/docx/ui/form-field-commands.d.ts.map +1 -0
  161. package/dist/docx/ui/form-field-guard.d.ts +24 -0
  162. package/dist/docx/ui/form-field-guard.d.ts.map +1 -0
  163. package/dist/docx/ui/form-text-blank.d.ts +18 -0
  164. package/dist/docx/ui/form-text-blank.d.ts.map +1 -0
  165. package/dist/docx/ui/index.cjs +9276 -7132
  166. package/dist/docx/ui/index.d.ts +5 -0
  167. package/dist/docx/ui/index.d.ts.map +1 -1
  168. package/dist/docx/ui/index.mjs +9259 -7137
  169. package/dist/docx/ui/positional-tab-input.d.ts +7 -0
  170. package/dist/docx/ui/positional-tab-input.d.ts.map +1 -0
  171. package/dist/docx/ui/run-compare.d.ts.map +1 -1
  172. package/dist/docx/ui/run-extra-mark.d.ts +1 -1
  173. package/dist/docx/ui/run-extra-mark.d.ts.map +1 -1
  174. package/dist/docx/ui/schema-marks.d.ts +1 -1
  175. package/dist/docx/ui/schema-marks.d.ts.map +1 -1
  176. package/dist/docx/ui/symbol-font.d.ts +4 -0
  177. package/dist/docx/ui/symbol-font.d.ts.map +1 -0
  178. package/dist/docx/ui/yjs-collaboration.d.ts +12 -1
  179. package/dist/docx/ui/yjs-collaboration.d.ts.map +1 -1
  180. package/dist/docx/write-block-placement.d.ts +7 -0
  181. package/dist/docx/write-block-placement.d.ts.map +1 -1
  182. package/dist/docx/write-content-control.d.ts +6 -0
  183. package/dist/docx/write-content-control.d.ts.map +1 -1
  184. package/dist/docx/write-header-footer.d.ts +6 -2
  185. package/dist/docx/write-header-footer.d.ts.map +1 -1
  186. package/dist/docx/write-inline.d.ts +12 -16
  187. package/dist/docx/write-inline.d.ts.map +1 -1
  188. package/dist/docx/write-paragraph.d.ts.map +1 -1
  189. package/dist/docx/write-revisions.d.ts.map +1 -1
  190. package/dist/docx/write-run.d.ts.map +1 -1
  191. package/dist/docx/write-section-properties.d.ts +5 -0
  192. package/dist/docx/write-section-properties.d.ts.map +1 -0
  193. package/dist/docx/write-sections.d.ts.map +1 -1
  194. package/dist/docx/write-table-controls.d.ts +15 -0
  195. package/dist/docx/write-table-controls.d.ts.map +1 -0
  196. package/dist/docx/write-table-properties.d.ts.map +1 -1
  197. package/dist/docx/write-table.d.ts.map +1 -1
  198. package/dist/docx/write.d.ts.map +1 -1
  199. package/dist/docx/xml.d.ts +6 -0
  200. package/dist/docx/xml.d.ts.map +1 -1
  201. package/dist/drawingml/index.cjs +31 -3
  202. package/dist/drawingml/index.mjs +31 -3
  203. package/dist/index.cjs +102 -26
  204. package/dist/index.mjs +102 -26
  205. package/dist/math/index.cjs +27 -2
  206. package/dist/math/index.mjs +27 -2
  207. package/dist/opc/index.cjs +51 -11
  208. package/dist/opc/index.mjs +51 -11
  209. package/dist/opc/zip-folders.d.ts +11 -0
  210. package/dist/opc/zip-folders.d.ts.map +1 -0
  211. package/dist/opc/zip-limits.d.ts +9 -0
  212. package/dist/opc/zip-limits.d.ts.map +1 -1
  213. package/dist/pptx/automation/index.cjs +995 -462
  214. package/dist/pptx/automation/index.d.ts +2 -2
  215. package/dist/pptx/automation/index.mjs +6 -6
  216. package/dist/pptx/chunks/{index-Bqm-jFG-.d.ts → index-CPhsd7Df.d.ts} +7580 -7507
  217. package/dist/pptx/chunks/index-CPhsd7Df.d.ts.map +1 -0
  218. package/dist/pptx/chunks/{index-B9x557hr.d.ts → index-Q5mM8kIR.d.ts} +2 -2
  219. package/dist/pptx/chunks/{index-B9x557hr.d.ts.map → index-Q5mM8kIR.d.ts.map} +1 -1
  220. package/dist/pptx/cli/index.cjs +770 -238
  221. package/dist/pptx/cli/index.mjs +5 -5
  222. package/dist/pptx/converter/index.cjs +12 -3
  223. package/dist/pptx/converter/index.d.ts +1 -1
  224. package/dist/pptx/converter/index.mjs +3 -3
  225. package/dist/pptx/editor/render/find-replace.cjs +14 -14
  226. package/dist/pptx/editor/render/find-replace.d.ts +1 -1
  227. package/dist/pptx/editor/render/find-replace.mjs +1 -1
  228. package/dist/pptx/editor/render/slide-operations.cjs +8 -8
  229. package/dist/pptx/editor/render/slide-operations.mjs +2 -2
  230. package/dist/pptx/index.cjs +1099 -628
  231. package/dist/pptx/index.d.ts +3 -3
  232. package/dist/pptx/index.mjs +6 -6
  233. package/dist/pptx/signature-node/index.cjs +20 -8
  234. package/dist/pptx/signature-node/index.mjs +2 -2
  235. package/dist/teams/index.cjs +105 -70
  236. package/dist/teams/index.mjs +105 -70
  237. package/dist/text/text-diff.d.ts +15 -0
  238. package/dist/text/text-diff.d.ts.map +1 -0
  239. package/dist/visio/index.cjs +220 -46
  240. package/dist/visio/index.mjs +220 -46
  241. package/dist/visio/ui/contract.d.ts +8 -2
  242. package/dist/visio/ui/contract.d.ts.map +1 -1
  243. package/dist/visio/ui/index.cjs +227 -50
  244. package/dist/visio/ui/index.mjs +227 -50
  245. package/dist/xlsx/collab/index.cjs +8 -3
  246. package/dist/xlsx/collab/index.mjs +8 -3
  247. package/dist/xlsx/compare/cells.d.ts +22 -0
  248. package/dist/xlsx/compare/cells.d.ts.map +1 -0
  249. package/dist/xlsx/compare/compare.d.ts +12 -0
  250. package/dist/xlsx/compare/compare.d.ts.map +1 -0
  251. package/dist/xlsx/compare/conditional.d.ts +7 -0
  252. package/dist/xlsx/compare/conditional.d.ts.map +1 -0
  253. package/dist/xlsx/compare/format-key.d.ts +34 -0
  254. package/dist/xlsx/compare/format-key.d.ts.map +1 -0
  255. package/dist/xlsx/compare/group.d.ts +8 -0
  256. package/dist/xlsx/compare/group.d.ts.map +1 -0
  257. package/dist/xlsx/compare/index.d.ts +5 -0
  258. package/dist/xlsx/compare/index.d.ts.map +1 -0
  259. package/dist/xlsx/compare/rich-text.d.ts +7 -0
  260. package/dist/xlsx/compare/rich-text.d.ts.map +1 -0
  261. package/dist/xlsx/compare/sheets.d.ts +22 -0
  262. package/dist/xlsx/compare/sheets.d.ts.map +1 -0
  263. package/dist/xlsx/compare/structure.d.ts +11 -0
  264. package/dist/xlsx/compare/structure.d.ts.map +1 -0
  265. package/dist/xlsx/compare/text.d.ts +8 -0
  266. package/dist/xlsx/compare/text.d.ts.map +1 -0
  267. package/dist/xlsx/compare/types.d.ts +173 -0
  268. package/dist/xlsx/compare/types.d.ts.map +1 -0
  269. package/dist/xlsx/edit/cell-values.d.ts.map +1 -1
  270. package/dist/xlsx/edit/clipboard-html.d.ts.map +1 -1
  271. package/dist/xlsx/edit/clipboard-text.d.ts.map +1 -1
  272. package/dist/xlsx/edit/clipboard.d.ts.map +1 -1
  273. package/dist/xlsx/edit/clone-cell.d.ts +9 -0
  274. package/dist/xlsx/edit/clone-cell.d.ts.map +1 -0
  275. package/dist/xlsx/edit/dimensions.d.ts.map +1 -1
  276. package/dist/xlsx/edit/history-rows.d.ts +7 -0
  277. package/dist/xlsx/edit/history-rows.d.ts.map +1 -0
  278. package/dist/xlsx/edit/history.d.ts +19 -4
  279. package/dist/xlsx/edit/history.d.ts.map +1 -1
  280. package/dist/xlsx/edit/outline.d.ts.map +1 -1
  281. package/dist/xlsx/edit/row-autofit.d.ts.map +1 -1
  282. package/dist/xlsx/edit/timelines.d.ts.map +1 -1
  283. package/dist/xlsx/formula/change-areas.d.ts +9 -0
  284. package/dist/xlsx/formula/change-areas.d.ts.map +1 -0
  285. package/dist/xlsx/formula/engine-prepare.d.ts +8 -0
  286. package/dist/xlsx/formula/engine-prepare.d.ts.map +1 -1
  287. package/dist/xlsx/formula/engine.d.ts.map +1 -1
  288. package/dist/xlsx/formula/spill.d.ts +5 -1
  289. package/dist/xlsx/formula/spill.d.ts.map +1 -1
  290. package/dist/xlsx/index.cjs +2551 -1208
  291. package/dist/xlsx/index.d.ts +1 -0
  292. package/dist/xlsx/index.d.ts.map +1 -1
  293. package/dist/xlsx/index.mjs +2544 -1209
  294. package/dist/xlsx/layout/cell-view.d.ts.map +1 -1
  295. package/dist/xlsx/layout/navigate.d.ts.map +1 -1
  296. package/dist/xlsx/layout/style-view.d.ts +5 -0
  297. package/dist/xlsx/layout/style-view.d.ts.map +1 -1
  298. package/dist/xlsx/load/csv-dates.d.ts +22 -0
  299. package/dist/xlsx/load/csv-dates.d.ts.map +1 -0
  300. package/dist/xlsx/load/csv-import.d.ts +64 -0
  301. package/dist/xlsx/load/csv-import.d.ts.map +1 -0
  302. package/dist/xlsx/load/csv-separators.d.ts +13 -0
  303. package/dist/xlsx/load/csv-separators.d.ts.map +1 -0
  304. package/dist/xlsx/load/csv-traits.d.ts +20 -0
  305. package/dist/xlsx/load/csv-traits.d.ts.map +1 -0
  306. package/dist/xlsx/load/csv.d.ts +8 -4
  307. package/dist/xlsx/load/csv.d.ts.map +1 -1
  308. package/dist/xlsx/load/detect.d.ts +13 -0
  309. package/dist/xlsx/load/detect.d.ts.map +1 -1
  310. package/dist/xlsx/load/errors.d.ts +1 -0
  311. package/dist/xlsx/load/errors.d.ts.map +1 -1
  312. package/dist/xlsx/load/index.cjs +598 -98
  313. package/dist/xlsx/load/index.d.ts +3 -1
  314. package/dist/xlsx/load/index.d.ts.map +1 -1
  315. package/dist/xlsx/load/index.mjs +597 -99
  316. package/dist/xlsx/numfmt/format.d.ts +8 -0
  317. package/dist/xlsx/numfmt/format.d.ts.map +1 -1
  318. package/dist/xlsx/numfmt/input-date.d.ts +2 -0
  319. package/dist/xlsx/numfmt/input-date.d.ts.map +1 -1
  320. package/dist/xlsx/pivot/cache-xml.d.ts.map +1 -1
  321. package/dist/xlsx/pivot/groups.d.ts.map +1 -1
  322. package/dist/xlsx/read/index.d.ts +2 -1
  323. package/dist/xlsx/read/index.d.ts.map +1 -1
  324. package/dist/xlsx/read/limits.d.ts +50 -0
  325. package/dist/xlsx/read/limits.d.ts.map +1 -0
  326. package/dist/xlsx/read/load.d.ts +11 -1
  327. package/dist/xlsx/read/load.d.ts.map +1 -1
  328. package/dist/xlsx/read/package.d.ts +5 -23
  329. package/dist/xlsx/read/package.d.ts.map +1 -1
  330. package/dist/xlsx/read/shared-strings.d.ts +2 -2
  331. package/dist/xlsx/read/shared-strings.d.ts.map +1 -1
  332. package/dist/xlsx/read/sheet-data-source.d.ts.map +1 -1
  333. package/dist/xlsx/read/worksheet.d.ts +2 -0
  334. package/dist/xlsx/read/worksheet.d.ts.map +1 -1
  335. package/dist/xlsx/stable-key.d.ts +3 -0
  336. package/dist/xlsx/stable-key.d.ts.map +1 -0
  337. package/dist/xlsx/styles.d.ts.map +1 -1
  338. package/dist/xlsx/ui/index.cjs +795 -388
  339. package/dist/xlsx/ui/index.d.ts +1 -0
  340. package/dist/xlsx/ui/index.d.ts.map +1 -1
  341. package/dist/xlsx/ui/index.mjs +795 -389
  342. package/dist/xlsx/ui/selection-format.d.ts +13 -0
  343. package/dist/xlsx/ui/selection-format.d.ts.map +1 -0
  344. package/dist/xlsx/write/sheet-props.d.ts.map +1 -1
  345. package/dist/xml/index.cjs +57 -3
  346. package/dist/xml/index.mjs +57 -4
  347. package/dist/xml/lite.d.ts.map +1 -1
  348. package/dist/xml/xml.d.ts +11 -1
  349. package/dist/xml/xml.d.ts.map +1 -1
  350. package/package.json +1 -1
  351. package/dist/PptxHandler-HSPKEP5E.mjs +0 -4
  352. package/dist/pptx/chunks/index-Bqm-jFG-.d.ts.map +0 -1
@@ -315,9 +315,9 @@ function nextSheetName(workbook, base = "Sheet") {
315
315
  }
316
316
  var nextSheetId = (workbook) => workbook.sheets.reduce((max, sheet) => Math.max(max, sheet.sheetId), 0) + 1;
317
317
 
318
- // xlsx/styles.ts
319
- function styleKey(style3) {
320
- return JSON.stringify(sortKeys(style3));
318
+ // xlsx/stable-key.ts
319
+ function stableKey(value3) {
320
+ return JSON.stringify(sortKeys(value3));
321
321
  }
322
322
  function sortKeys(value3) {
323
323
  if (Array.isArray(value3)) return value3.map(sortKeys);
@@ -331,6 +331,11 @@ function sortKeys(value3) {
331
331
  }
332
332
  return value3;
333
333
  }
334
+
335
+ // xlsx/styles.ts
336
+ function styleKey(style3) {
337
+ return stableKey(style3);
338
+ }
334
339
  function styleAt(workbook, styleId) {
335
340
  const style3 = workbook.styles[styleId ?? 0] ?? workbook.styles[0];
336
341
  if (!style3) throw new Error("Workbook has no default cell style");
@@ -2703,6 +2708,37 @@ function parseArray(c2) {
2703
2708
  return { type: "array", rows: rows2 };
2704
2709
  }
2705
2710
 
2711
+ // xlsx/formula/change-areas.ts
2712
+ function changeAreas(changes) {
2713
+ const out = [];
2714
+ const open = /* @__PURE__ */ new Map();
2715
+ let run2;
2716
+ const close2 = (area) => {
2717
+ const { start, end } = area.range;
2718
+ const key = `${area.sheet}:${start.col}:${end.col}`;
2719
+ const above = open.get(key);
2720
+ if (above && above.range.end.row === start.row - 1) {
2721
+ above.range.end.row = end.row;
2722
+ return;
2723
+ }
2724
+ out.push(area);
2725
+ open.set(key, area);
2726
+ };
2727
+ for (const { sheet, row: row2, col } of changes) {
2728
+ if (run2 && run2.sheet === sheet && run2.range.start.row === row2) {
2729
+ if (col === run2.range.end.col + 1) {
2730
+ run2.range.end.col = col;
2731
+ continue;
2732
+ }
2733
+ if (col >= run2.range.start.col && col <= run2.range.end.col) continue;
2734
+ }
2735
+ if (run2) close2(run2);
2736
+ run2 = { sheet, range: { start: { row: row2, col }, end: { row: row2, col } } };
2737
+ }
2738
+ if (run2) close2(run2);
2739
+ return out;
2740
+ }
2741
+
2706
2742
  // xlsx/formula/date-serial.ts
2707
2743
  var DAY_MS = 864e5;
2708
2744
  var EPOCH_19002 = Date.UTC(1899, 11, 30);
@@ -2929,68 +2965,6 @@ var ReverseIndex = class extends AreaIndex {
2929
2965
  }
2930
2966
  };
2931
2967
 
2932
- // xlsx/formula/engine-prepare.ts
2933
- var CHECK_EVERY = 32;
2934
- var GraphPreparation = class {
2935
- constructor(workbook, create) {
2936
- this.workbook = workbook;
2937
- this.create = create;
2938
- }
2939
- workbook;
2940
- create;
2941
- reverse = new ReverseIndex();
2942
- formulas = { dynamic: [], unvalued: [] };
2943
- sheet = 0;
2944
- rows;
2945
- row = 0;
2946
- cells;
2947
- finished = false;
2948
- /**
2949
- * Adds formulas to the graph until `timeRemaining` (milliseconds, as an idle deadline reports
2950
- * them) reaches zero, or until every formula is in. Returns true when the graph is complete.
2951
- */
2952
- run(timeRemaining) {
2953
- let visited = 0;
2954
- while (!this.finished) {
2955
- const cells = this.cells ?? this.nextRow();
2956
- if (!cells) continue;
2957
- const next = cells.next();
2958
- if (next.done) {
2959
- this.cells = void 0;
2960
- continue;
2961
- }
2962
- const [col, cell] = next.value;
2963
- if (cell.formula) this.add(this.create(this.sheet, this.row, col, cell), cell);
2964
- if (timeRemaining && ++visited % CHECK_EVERY === 0 && timeRemaining() <= 0) break;
2965
- }
2966
- return this.finished;
2967
- }
2968
- add(node2, cell) {
2969
- this.reverse.addNode(node2);
2970
- if (!node2.legacy && !node2.arrayRange) this.formulas.dynamic.push(node2);
2971
- if (cell.value === null && !node2.keepCached) this.formulas.unvalued.push(node2);
2972
- }
2973
- /** Moves to the next stored row (and sheet), or marks the walk finished. */
2974
- nextRow() {
2975
- for (; ; ) {
2976
- const sheet = this.workbook.sheets[this.sheet];
2977
- if (!sheet) {
2978
- this.finished = true;
2979
- return void 0;
2980
- }
2981
- this.rows ??= sheet.rows.entries();
2982
- const next = this.rows.next();
2983
- if (!next.done) {
2984
- this.row = next.value[0];
2985
- this.cells = next.value[1].entries();
2986
- return this.cells;
2987
- }
2988
- this.rows = void 0;
2989
- this.sheet++;
2990
- }
2991
- }
2992
- };
2993
-
2994
2968
  // xlsx/formula/text-number.ts
2995
2969
  var MONTHS2 = [
2996
2970
  "jan",
@@ -3393,6 +3367,311 @@ function finite(value3) {
3393
3367
  return value3;
3394
3368
  }
3395
3369
 
3370
+ // xlsx/formula/operators.ts
3371
+ var signal = (fn) => {
3372
+ try {
3373
+ return fn();
3374
+ } catch (e) {
3375
+ if (e instanceof ErrorSignal) return e.value;
3376
+ throw e;
3377
+ }
3378
+ };
3379
+ function power(base, exponent) {
3380
+ if (base === 0 && exponent === 0) throw new ErrorSignal(ERR.NUM);
3381
+ if (base === 0 && exponent < 0) throw new ErrorSignal(ERR.DIV0);
3382
+ if (base < 0 && !Number.isInteger(exponent)) {
3383
+ const inverse = 1 / exponent;
3384
+ const odd = Math.round(inverse);
3385
+ if (Math.abs(inverse - odd) < 1e-10 && Math.abs(odd) % 2 === 1) {
3386
+ return -Math.pow(-base, exponent);
3387
+ }
3388
+ throw new ErrorSignal(ERR.NUM);
3389
+ }
3390
+ return Math.pow(base, exponent);
3391
+ }
3392
+ function snapToZero(result2, a2, b) {
3393
+ if (result2 !== 0 && Math.abs(result2) <= Math.max(Math.abs(a2), Math.abs(b)) * 1e-15) return 0;
3394
+ return result2;
3395
+ }
3396
+ function arithmetic(op2, x, y, snap) {
3397
+ if (isError(x)) return x;
3398
+ if (isError(y)) return y;
3399
+ return signal(() => {
3400
+ const a2 = toNumber(x);
3401
+ const b = toNumber(y);
3402
+ let r;
3403
+ switch (op2) {
3404
+ case "+":
3405
+ r = a2 + b;
3406
+ if (snap) r = snapToZero(r, a2, b);
3407
+ break;
3408
+ case "-":
3409
+ r = a2 - b;
3410
+ if (snap) r = snapToZero(r, a2, b);
3411
+ break;
3412
+ case "*":
3413
+ r = a2 * b;
3414
+ break;
3415
+ case "/":
3416
+ if (b === 0) return ERR.DIV0;
3417
+ r = a2 / b;
3418
+ break;
3419
+ default:
3420
+ r = power(a2, b);
3421
+ }
3422
+ return Number.isFinite(r) ? r === 0 ? 0 : r : ERR.NUM;
3423
+ });
3424
+ }
3425
+ function comparison(op2, x, y) {
3426
+ if (isError(x)) return x;
3427
+ if (isError(y)) return y;
3428
+ const c2 = compareScalars(x, y);
3429
+ switch (op2) {
3430
+ case "=":
3431
+ return c2 === 0;
3432
+ case "<>":
3433
+ return c2 !== 0;
3434
+ case "<":
3435
+ return c2 < 0;
3436
+ case ">":
3437
+ return c2 > 0;
3438
+ case "<=":
3439
+ return c2 <= 0;
3440
+ default:
3441
+ return c2 >= 0;
3442
+ }
3443
+ }
3444
+ function concat(x, y) {
3445
+ if (isError(x)) return x;
3446
+ if (isError(y)) return y;
3447
+ return toText(x) + toText(y);
3448
+ }
3449
+ function scalarBinary(op2, x, y, snap = false) {
3450
+ if (op2 === "&") return concat(x, y);
3451
+ if (op2 === "+" || op2 === "-" || op2 === "*" || op2 === "/" || op2 === "^") {
3452
+ return arithmetic(op2, x, y, snap);
3453
+ }
3454
+ return comparison(op2, x, y);
3455
+ }
3456
+ function scalarUnary(op2, x) {
3457
+ if (isError(x)) return x;
3458
+ return signal(() => {
3459
+ const n2 = toNumber(x);
3460
+ const r = op2 === "-" ? -n2 : n2 / 100;
3461
+ return r === 0 ? 0 : r;
3462
+ });
3463
+ }
3464
+ function pick(m, row2, col) {
3465
+ const r = m.rows === 1 ? 0 : row2;
3466
+ const c2 = m.cols === 1 ? 0 : col;
3467
+ if (r >= m.rows || c2 >= m.cols) return ERR.NA;
3468
+ return m.get(r, c2);
3469
+ }
3470
+ function broadcastShape(operands, at) {
3471
+ let rows2 = 1;
3472
+ let cols = 1;
3473
+ for (const m of operands) {
3474
+ rows2 = Math.max(rows2, m.rows);
3475
+ cols = Math.max(cols, m.cols);
3476
+ }
3477
+ if (!operands.some((m) => m.isPadded)) return Matrix.build(rows2, cols, at);
3478
+ let blockRows = 1;
3479
+ let blockCols = 1;
3480
+ for (const m of operands) {
3481
+ blockRows = Math.max(blockRows, m.isPadded ? m.blockRows : m.rows);
3482
+ blockCols = Math.max(blockCols, m.isPadded ? m.blockCols : m.cols);
3483
+ }
3484
+ blockRows = Math.min(blockRows, rows2);
3485
+ blockCols = Math.min(blockCols, cols);
3486
+ const varies = operands.some(
3487
+ (m) => blockRows < rows2 && m.rows === 1 && m.cols > 1 || blockCols < cols && m.cols === 1 && m.rows > 1
3488
+ );
3489
+ if (varies) return Matrix.build(rows2, cols, at);
3490
+ return Matrix.padded(Matrix.build(blockRows, blockCols, at), rows2, cols, at(rows2 - 1, cols - 1));
3491
+ }
3492
+ function broadcast2(a2, b, fn) {
3493
+ if (!(a2 instanceof Matrix) && !(b instanceof Matrix)) return fn(a2, b);
3494
+ const ma = a2 instanceof Matrix ? a2 : new Matrix([[a2]]);
3495
+ const mb = b instanceof Matrix ? b : new Matrix([[b]]);
3496
+ return broadcastShape([ma, mb], (r, c2) => fn(pick(ma, r, c2), pick(mb, r, c2)));
3497
+ }
3498
+ function broadcast1(a2, fn) {
3499
+ return a2 instanceof Matrix ? a2.mapValues(fn) : fn(a2);
3500
+ }
3501
+
3502
+ // xlsx/formula/spill.ts
3503
+ var isSpilledCell = (cell) => cell !== void 0 && "spillAnchor" in cell;
3504
+ function releaseSpilledCell(sheet, row2, col) {
3505
+ const cell = getCell(sheet, row2, col);
3506
+ if (!isSpilledCell(cell)) return;
3507
+ delete cell.spillAnchor;
3508
+ cell.value = null;
3509
+ if (!cell.styleId && !cell.formula && !cell.richText && !cell.arrayRange)
3510
+ deleteCell(sheet, row2, col);
3511
+ }
3512
+ function clearFootprint(sheet, footprint, row2, col) {
3513
+ const { start, end } = footprint;
3514
+ const owned = [];
3515
+ const visit2 = (r, c2, cell) => {
3516
+ if (c2 < start.col || c2 > end.col || r === row2 && c2 === col) return;
3517
+ if (isSpilledCell(cell) && cell.spillAnchor.row === row2 && cell.spillAnchor.col === col)
3518
+ owned.push([r, c2]);
3519
+ };
3520
+ const visitRow = (r, cells) => {
3521
+ if (end.col - start.col + 1 <= cells.size)
3522
+ for (let c2 = start.col; c2 <= end.col; c2++) visit2(r, c2, cells.get(c2));
3523
+ else for (const [c2, cell] of cells) visit2(r, c2, cell);
3524
+ };
3525
+ if (end.row - start.row + 1 <= sheet.rows.size) {
3526
+ for (let r = start.row; r <= end.row; r++) {
3527
+ const cells = sheet.rows.get(r);
3528
+ if (cells) visitRow(r, cells);
3529
+ }
3530
+ } else
3531
+ for (const [r, cells] of sheet.rows) if (r >= start.row && r <= end.row) visitRow(r, cells);
3532
+ for (const [r, c2] of owned) releaseSpilledCell(sheet, r, c2);
3533
+ }
3534
+ function footprintFor(row2, col, m) {
3535
+ const end = { row: row2 + m.rows - 1, col: col + m.cols - 1 };
3536
+ if (end.row > MAX_ROW || end.col > MAX_COL) return void 0;
3537
+ return { start: { row: row2, col }, end };
3538
+ }
3539
+ function footprintFree(sheet, footprint, row2, col, claims) {
3540
+ if (sheet.merges.some((m) => rangesIntersect(m, footprint))) return false;
3541
+ for (let r = footprint.start.row; r <= footprint.end.row; r++) {
3542
+ const cells = sheet.rows.get(r);
3543
+ if (!cells) continue;
3544
+ for (let c2 = footprint.start.col; c2 <= footprint.end.col; c2++) {
3545
+ if (r === row2 && c2 === col) continue;
3546
+ const cell = cells.get(c2);
3547
+ if (!cell) continue;
3548
+ if (cell.formula) return false;
3549
+ if (isSpilledCell(cell)) {
3550
+ const a2 = cell.spillAnchor;
3551
+ if (a2.row === row2 && a2.col === col) continue;
3552
+ if (claims(a2, r, c2)) return false;
3553
+ continue;
3554
+ }
3555
+ if (cell.value !== null) return false;
3556
+ }
3557
+ }
3558
+ return true;
3559
+ }
3560
+ function writeFootprint(sheet, footprint, m) {
3561
+ const { row: row2, col } = footprint.start;
3562
+ for (let r = footprint.start.row; r <= footprint.end.row; r++) {
3563
+ for (let c2 = footprint.start.col; c2 <= footprint.end.col; c2++) {
3564
+ const value3 = cellValueOf(m.get(r - row2, c2 - col));
3565
+ const cell = getCell(sheet, r, c2);
3566
+ if (r === row2 && c2 === col) {
3567
+ if (cell) cell.value = value3;
3568
+ continue;
3569
+ }
3570
+ if (cell) {
3571
+ cell.value = value3;
3572
+ if (!isSpilledCell(cell) || cell.spillAnchor.row !== row2 || cell.spillAnchor.col !== col)
3573
+ cell.spillAnchor = { row: row2, col };
3574
+ } else {
3575
+ const spilled = { value: value3, spillAnchor: { row: row2, col } };
3576
+ putCell(sheet, r, c2, spilled);
3577
+ }
3578
+ }
3579
+ }
3580
+ }
3581
+ function fillArrayRange(sheet, range2, m) {
3582
+ const { row: row2, col } = range2.start;
3583
+ for (let r = range2.start.row; r <= range2.end.row; r++) {
3584
+ for (let c2 = range2.start.col; c2 <= range2.end.col; c2++) {
3585
+ const value3 = cellValueOf(pick(m, r - row2, c2 - col));
3586
+ const cell = getCell(sheet, r, c2);
3587
+ if (cell) cell.value = value3;
3588
+ else putCell(sheet, r, c2, { value: value3 });
3589
+ }
3590
+ }
3591
+ }
3592
+ var cellValueOf = (value3) => value3 === null ? 0 : value3;
3593
+
3594
+ // xlsx/formula/engine-prepare.ts
3595
+ var CHECK_EVERY = 32;
3596
+ var GraphPreparation = class {
3597
+ constructor(workbook, create) {
3598
+ this.workbook = workbook;
3599
+ this.create = create;
3600
+ }
3601
+ workbook;
3602
+ create;
3603
+ reverse = new ReverseIndex();
3604
+ formulas = { dynamic: [], unvalued: [] };
3605
+ /**
3606
+ * The spills stored in the file, by sheet and anchor (`cellKey`): from the anchor to the last
3607
+ * row and column of the cells marked as its results. Until the anchor is evaluated they are
3608
+ * the only record of the cells it covers.
3609
+ */
3610
+ spills = /* @__PURE__ */ new Map();
3611
+ sheet = 0;
3612
+ rows;
3613
+ row = 0;
3614
+ cells;
3615
+ finished = false;
3616
+ /**
3617
+ * Adds formulas to the graph until `timeRemaining` (milliseconds, as an idle deadline reports
3618
+ * them) reaches zero, or until every formula is in. Returns true when the graph is complete.
3619
+ */
3620
+ run(timeRemaining) {
3621
+ let visited = 0;
3622
+ while (!this.finished) {
3623
+ const cells = this.cells ?? this.nextRow();
3624
+ if (!cells) continue;
3625
+ const next = cells.next();
3626
+ if (next.done) {
3627
+ this.cells = void 0;
3628
+ continue;
3629
+ }
3630
+ const [col, cell] = next.value;
3631
+ if (cell.formula) this.add(this.create(this.sheet, this.row, col, cell), cell);
3632
+ else if (isSpilledCell(cell)) this.addSpilled(this.row, col, cell.spillAnchor);
3633
+ if (timeRemaining && ++visited % CHECK_EVERY === 0 && timeRemaining() <= 0) break;
3634
+ }
3635
+ return this.finished;
3636
+ }
3637
+ add(node2, cell) {
3638
+ this.reverse.addNode(node2);
3639
+ if (!node2.legacy && !node2.arrayRange) this.formulas.dynamic.push(node2);
3640
+ if (cell.value === null && !node2.keepCached) this.formulas.unvalued.push(node2);
3641
+ }
3642
+ addSpilled(row2, col, anchor) {
3643
+ if (row2 < anchor.row || col < anchor.col) return;
3644
+ let spills = this.spills.get(this.sheet);
3645
+ if (!spills) this.spills.set(this.sheet, spills = /* @__PURE__ */ new Map());
3646
+ const key = cellKey(anchor.row, anchor.col);
3647
+ const range2 = spills.get(key);
3648
+ if (!range2) spills.set(key, { start: { ...anchor }, end: { row: row2, col } });
3649
+ else {
3650
+ range2.end.row = Math.max(range2.end.row, row2);
3651
+ range2.end.col = Math.max(range2.end.col, col);
3652
+ }
3653
+ }
3654
+ /** Moves to the next stored row (and sheet), or marks the walk finished. */
3655
+ nextRow() {
3656
+ for (; ; ) {
3657
+ const sheet = this.workbook.sheets[this.sheet];
3658
+ if (!sheet) {
3659
+ this.finished = true;
3660
+ return void 0;
3661
+ }
3662
+ this.rows ??= sheet.rows.entries();
3663
+ const next = this.rows.next();
3664
+ if (!next.done) {
3665
+ this.row = next.value[0];
3666
+ this.cells = next.value[1].entries();
3667
+ return this.cells;
3668
+ }
3669
+ this.rows = void 0;
3670
+ this.sheet++;
3671
+ }
3672
+ }
3673
+ };
3674
+
3396
3675
  // xlsx/formula/functions/wildcard.ts
3397
3676
  var lower = (ch) => (ch ?? "").toLowerCase();
3398
3677
  var fold = (text4) => Array.from({ length: text4.length }, (_, i2) => lower(text4[i2]));
@@ -6866,138 +7145,6 @@ var INFO_FUNCTIONS = [
6866
7145
  )
6867
7146
  ];
6868
7147
 
6869
- // xlsx/formula/operators.ts
6870
- var signal = (fn) => {
6871
- try {
6872
- return fn();
6873
- } catch (e) {
6874
- if (e instanceof ErrorSignal) return e.value;
6875
- throw e;
6876
- }
6877
- };
6878
- function power(base, exponent) {
6879
- if (base === 0 && exponent === 0) throw new ErrorSignal(ERR.NUM);
6880
- if (base === 0 && exponent < 0) throw new ErrorSignal(ERR.DIV0);
6881
- if (base < 0 && !Number.isInteger(exponent)) {
6882
- const inverse = 1 / exponent;
6883
- const odd = Math.round(inverse);
6884
- if (Math.abs(inverse - odd) < 1e-10 && Math.abs(odd) % 2 === 1) {
6885
- return -Math.pow(-base, exponent);
6886
- }
6887
- throw new ErrorSignal(ERR.NUM);
6888
- }
6889
- return Math.pow(base, exponent);
6890
- }
6891
- function snapToZero(result2, a2, b) {
6892
- if (result2 !== 0 && Math.abs(result2) <= Math.max(Math.abs(a2), Math.abs(b)) * 1e-15) return 0;
6893
- return result2;
6894
- }
6895
- function arithmetic(op2, x, y, snap) {
6896
- if (isError(x)) return x;
6897
- if (isError(y)) return y;
6898
- return signal(() => {
6899
- const a2 = toNumber(x);
6900
- const b = toNumber(y);
6901
- let r;
6902
- switch (op2) {
6903
- case "+":
6904
- r = a2 + b;
6905
- if (snap) r = snapToZero(r, a2, b);
6906
- break;
6907
- case "-":
6908
- r = a2 - b;
6909
- if (snap) r = snapToZero(r, a2, b);
6910
- break;
6911
- case "*":
6912
- r = a2 * b;
6913
- break;
6914
- case "/":
6915
- if (b === 0) return ERR.DIV0;
6916
- r = a2 / b;
6917
- break;
6918
- default:
6919
- r = power(a2, b);
6920
- }
6921
- return Number.isFinite(r) ? r === 0 ? 0 : r : ERR.NUM;
6922
- });
6923
- }
6924
- function comparison(op2, x, y) {
6925
- if (isError(x)) return x;
6926
- if (isError(y)) return y;
6927
- const c2 = compareScalars(x, y);
6928
- switch (op2) {
6929
- case "=":
6930
- return c2 === 0;
6931
- case "<>":
6932
- return c2 !== 0;
6933
- case "<":
6934
- return c2 < 0;
6935
- case ">":
6936
- return c2 > 0;
6937
- case "<=":
6938
- return c2 <= 0;
6939
- default:
6940
- return c2 >= 0;
6941
- }
6942
- }
6943
- function concat(x, y) {
6944
- if (isError(x)) return x;
6945
- if (isError(y)) return y;
6946
- return toText(x) + toText(y);
6947
- }
6948
- function scalarBinary(op2, x, y, snap = false) {
6949
- if (op2 === "&") return concat(x, y);
6950
- if (op2 === "+" || op2 === "-" || op2 === "*" || op2 === "/" || op2 === "^") {
6951
- return arithmetic(op2, x, y, snap);
6952
- }
6953
- return comparison(op2, x, y);
6954
- }
6955
- function scalarUnary(op2, x) {
6956
- if (isError(x)) return x;
6957
- return signal(() => {
6958
- const n2 = toNumber(x);
6959
- const r = op2 === "-" ? -n2 : n2 / 100;
6960
- return r === 0 ? 0 : r;
6961
- });
6962
- }
6963
- function pick(m, row2, col) {
6964
- const r = m.rows === 1 ? 0 : row2;
6965
- const c2 = m.cols === 1 ? 0 : col;
6966
- if (r >= m.rows || c2 >= m.cols) return ERR.NA;
6967
- return m.get(r, c2);
6968
- }
6969
- function broadcastShape(operands, at) {
6970
- let rows2 = 1;
6971
- let cols = 1;
6972
- for (const m of operands) {
6973
- rows2 = Math.max(rows2, m.rows);
6974
- cols = Math.max(cols, m.cols);
6975
- }
6976
- if (!operands.some((m) => m.isPadded)) return Matrix.build(rows2, cols, at);
6977
- let blockRows = 1;
6978
- let blockCols = 1;
6979
- for (const m of operands) {
6980
- blockRows = Math.max(blockRows, m.isPadded ? m.blockRows : m.rows);
6981
- blockCols = Math.max(blockCols, m.isPadded ? m.blockCols : m.cols);
6982
- }
6983
- blockRows = Math.min(blockRows, rows2);
6984
- blockCols = Math.min(blockCols, cols);
6985
- const varies = operands.some(
6986
- (m) => blockRows < rows2 && m.rows === 1 && m.cols > 1 || blockCols < cols && m.cols === 1 && m.rows > 1
6987
- );
6988
- if (varies) return Matrix.build(rows2, cols, at);
6989
- return Matrix.padded(Matrix.build(blockRows, blockCols, at), rows2, cols, at(rows2 - 1, cols - 1));
6990
- }
6991
- function broadcast2(a2, b, fn) {
6992
- if (!(a2 instanceof Matrix) && !(b instanceof Matrix)) return fn(a2, b);
6993
- const ma = a2 instanceof Matrix ? a2 : new Matrix([[a2]]);
6994
- const mb = b instanceof Matrix ? b : new Matrix([[b]]);
6995
- return broadcastShape([ma, mb], (r, c2) => fn(pick(ma, r, c2), pick(mb, r, c2)));
6996
- }
6997
- function broadcast1(a2, fn) {
6998
- return a2 instanceof Matrix ? a2.mapValues(fn) : fn(a2);
6999
- }
7000
-
7001
7148
  // xlsx/formula/functions/lambda.ts
7002
7149
  var C16 = "Logical";
7003
7150
  function lambdaArg(value3) {
@@ -11735,6 +11882,19 @@ var DEFAULT_XML_LIMITS = {
11735
11882
  maxDepth: 512,
11736
11883
  maxNodes: 5e6
11737
11884
  };
11885
+ var XmlLimitError = class extends Error {
11886
+ code = "xml-limit";
11887
+ /** The limit that was exceeded. */
11888
+ limit;
11889
+ /** Its value: the largest depth or element count allowed. */
11890
+ maximum;
11891
+ constructor(message, limit2, maximum) {
11892
+ super(message);
11893
+ this.name = "XmlLimitError";
11894
+ this.limit = limit2;
11895
+ this.maximum = maximum;
11896
+ }
11897
+ };
11738
11898
  var TAG_RE = /<(\/?)([^\s\/><]+)(?:\s+[^\s=\/><]+\s*=\s*(?:"[^"<]*"|'[^'<]*'))*\s*(\/?)>/y;
11739
11899
  var MARKUP_SKIPS = [
11740
11900
  ["<!--", "-->"],
@@ -11768,11 +11928,22 @@ function checkXmlLimits(xml, label2, limits = {}) {
11768
11928
  continue;
11769
11929
  }
11770
11930
  nodes++;
11771
- if (nodes > maxNodes) throw new Error(`${label2} XML exceeds the limit of ${maxNodes} elements`);
11931
+ if (nodes > maxNodes)
11932
+ throw new XmlLimitError(
11933
+ `${label2} XML exceeds the limit of ${maxNodes} elements`,
11934
+ "maxNodes",
11935
+ maxNodes
11936
+ );
11772
11937
  if (!selfClosing && ++depth > maxDepth)
11773
- throw new Error(`${label2} XML exceeds the nesting depth limit of ${maxDepth}`);
11938
+ throw new XmlLimitError(
11939
+ `${label2} XML exceeds the nesting depth limit of ${maxDepth}`,
11940
+ "maxDepth",
11941
+ maxDepth
11942
+ );
11774
11943
  }
11775
11944
  }
11945
+ var CRLF_DECLARATION = /^<\?xml[^>]*\?>\r\n/;
11946
+ var crlfDeclarations = /* @__PURE__ */ new WeakSet();
11776
11947
  function parseXml(xml, options7 = {}) {
11777
11948
  const label2 = options7.label ?? "OOXML";
11778
11949
  if (/<!DOCTYPE|<!ENTITY/i.test(xml))
@@ -11794,9 +11965,13 @@ function parseXml(xml, options7 = {}) {
11794
11965
  }
11795
11966
  if (parseError || !parsed.documentElement)
11796
11967
  throw new Error(`Invalid ${label2} XML: ${parseError || "missing root element"}`);
11968
+ if (CRLF_DECLARATION.test(xml)) crlfDeclarations.add(parsed);
11797
11969
  return parsed;
11798
11970
  }
11799
- var buildXml = (node2) => new XMLSerializer().serializeToString(node2);
11971
+ var buildXml = (node2) => {
11972
+ const xml = new XMLSerializer().serializeToString(node2);
11973
+ return crlfDeclarations.has(node2) ? xml.replace(/^(<\?xml[^>]*\?>)\n/, "$1\r\n") : xml;
11974
+ };
11800
11975
  var isElement = (node2) => node2.nodeType === 1;
11801
11976
  var elements = (parent) => Array.from(parent.childNodes).filter(isElement);
11802
11977
  function named(element2, local, ns, lenient = true) {
@@ -11895,6 +12070,12 @@ function parseLiteFragment(xml, container, namespaces) {
11895
12070
  }
11896
12071
  if (lt < 0) break;
11897
12072
  const next = source2.charCodeAt(lt + 1);
12073
+ if (next === 33) {
12074
+ const after = skipCommentOrCdata(source2, lt, top);
12075
+ if (after < 0) return void 0;
12076
+ pos = after;
12077
+ continue;
12078
+ }
11898
12079
  if (next === 47) {
11899
12080
  const gt = source2.indexOf(">", lt);
11900
12081
  if (gt < 0 || stack2.length < 2 || source2.slice(lt + 2, gt).trimEnd() !== top.tagName)
@@ -11915,6 +12096,25 @@ function parseLiteFragment(xml, container, namespaces) {
11915
12096
  }
11916
12097
  return stack2.length === 1 ? root : void 0;
11917
12098
  }
12099
+ var DECLARATIONS = /<!DOCTYPE|<!ENTITY/i;
12100
+ function skipCommentOrCdata(source2, lt, parent) {
12101
+ if (source2.startsWith("<!--", lt)) {
12102
+ const end = source2.indexOf("-->", lt + 4);
12103
+ if (end < 0) return -1;
12104
+ const body2 = source2.slice(lt + 4, end);
12105
+ if (body2.includes("--") || body2.endsWith("-") || DECLARATIONS.test(body2)) return -1;
12106
+ return end + 3;
12107
+ }
12108
+ if (source2.startsWith("<![CDATA[", lt)) {
12109
+ const end = source2.indexOf("]]>", lt + 9);
12110
+ if (end < 0) return -1;
12111
+ const text4 = source2.slice(lt + 9, end);
12112
+ if (DECLARATIONS.test(text4)) return -1;
12113
+ parent.childNodes.push(text4);
12114
+ return end + 3;
12115
+ }
12116
+ return -1;
12117
+ }
11918
12118
  function startTag(source2, from, namespaces) {
11919
12119
  const n2 = source2.length;
11920
12120
  let i2 = from;
@@ -14888,89 +15088,6 @@ function sheetBounds(sheet) {
14888
15088
  return { rows: rows2, cols };
14889
15089
  }
14890
15090
 
14891
- // xlsx/formula/spill.ts
14892
- var isSpilledCell = (cell) => cell !== void 0 && "spillAnchor" in cell;
14893
- function releaseSpilledCell(sheet, row2, col) {
14894
- const cell = getCell(sheet, row2, col);
14895
- if (!isSpilledCell(cell)) return;
14896
- delete cell.spillAnchor;
14897
- cell.value = null;
14898
- if (!cell.styleId && !cell.formula && !cell.richText && !cell.arrayRange)
14899
- deleteCell(sheet, row2, col);
14900
- }
14901
- function clearFootprint(sheet, footprint, row2, col) {
14902
- for (let r = footprint.start.row; r <= footprint.end.row; r++) {
14903
- const cells = sheet.rows.get(r);
14904
- if (!cells) continue;
14905
- for (let c2 = footprint.start.col; c2 <= footprint.end.col; c2++) {
14906
- if (r === row2 && c2 === col) continue;
14907
- const cell = cells.get(c2);
14908
- if (isSpilledCell(cell) && cell.spillAnchor.row === row2 && cell.spillAnchor.col === col) {
14909
- releaseSpilledCell(sheet, r, c2);
14910
- }
14911
- }
14912
- }
14913
- }
14914
- function footprintFor(row2, col, m) {
14915
- const end = { row: row2 + m.rows - 1, col: col + m.cols - 1 };
14916
- if (end.row > MAX_ROW || end.col > MAX_COL) return void 0;
14917
- return { start: { row: row2, col }, end };
14918
- }
14919
- function footprintFree(sheet, footprint, row2, col, claims) {
14920
- if (sheet.merges.some((m) => rangesIntersect(m, footprint))) return false;
14921
- for (let r = footprint.start.row; r <= footprint.end.row; r++) {
14922
- const cells = sheet.rows.get(r);
14923
- if (!cells) continue;
14924
- for (let c2 = footprint.start.col; c2 <= footprint.end.col; c2++) {
14925
- if (r === row2 && c2 === col) continue;
14926
- const cell = cells.get(c2);
14927
- if (!cell) continue;
14928
- if (cell.formula) return false;
14929
- if (isSpilledCell(cell)) {
14930
- const a2 = cell.spillAnchor;
14931
- if (a2.row === row2 && a2.col === col) continue;
14932
- if (claims(a2, r, c2)) return false;
14933
- continue;
14934
- }
14935
- if (cell.value !== null) return false;
14936
- }
14937
- }
14938
- return true;
14939
- }
14940
- function writeFootprint(sheet, footprint, m) {
14941
- const { row: row2, col } = footprint.start;
14942
- for (let r = footprint.start.row; r <= footprint.end.row; r++) {
14943
- for (let c2 = footprint.start.col; c2 <= footprint.end.col; c2++) {
14944
- const value3 = cellValueOf(m.get(r - row2, c2 - col));
14945
- const cell = getCell(sheet, r, c2);
14946
- if (r === row2 && c2 === col) {
14947
- if (cell) cell.value = value3;
14948
- continue;
14949
- }
14950
- if (cell) {
14951
- cell.value = value3;
14952
- if (!isSpilledCell(cell) || cell.spillAnchor.row !== row2 || cell.spillAnchor.col !== col)
14953
- cell.spillAnchor = { row: row2, col };
14954
- } else {
14955
- const spilled = { value: value3, spillAnchor: { row: row2, col } };
14956
- putCell(sheet, r, c2, spilled);
14957
- }
14958
- }
14959
- }
14960
- }
14961
- function fillArrayRange(sheet, range2, m) {
14962
- const { row: row2, col } = range2.start;
14963
- for (let r = range2.start.row; r <= range2.end.row; r++) {
14964
- for (let c2 = range2.start.col; c2 <= range2.end.col; c2++) {
14965
- const value3 = cellValueOf(pick(m, r - row2, c2 - col));
14966
- const cell = getCell(sheet, r, c2);
14967
- if (cell) cell.value = value3;
14968
- else putCell(sheet, r, c2, { value: value3 });
14969
- }
14970
- }
14971
- }
14972
- var cellValueOf = (value3) => value3 === null ? 0 : value3;
14973
-
14974
15091
  // xlsx/formula/engine-host.ts
14975
15092
  var Deferred = class {
14976
15093
  constructor(node2) {
@@ -15895,6 +16012,8 @@ var Engine = class extends EngineStructure {
15895
16012
  preparation;
15896
16013
  /** The prepared formulas the first recalculation checks (see `trustsStoredValues`). */
15897
16014
  prepared;
16015
+ /** Stored spills released when the graph was built: their readers must recalculate. */
16016
+ released = [];
15898
16017
  // ---- the graph ----
15899
16018
  prepare(timeRemaining) {
15900
16019
  if (this.built || this.needsFull) return true;
@@ -15932,10 +16051,33 @@ var Engine = class extends EngineStructure {
15932
16051
  finishPreparation(preparation) {
15933
16052
  this.preparation = void 0;
15934
16053
  this.built = true;
16054
+ this.adoptStoredSpills(preparation.spills);
15935
16055
  this.graphChanged();
15936
16056
  this.reverseIndex = preparation.reverse;
15937
16057
  this.prepared = preparation.formulas;
15938
16058
  }
16059
+ /**
16060
+ * Takes the spills a file stored as their anchors' last footprints, so that overwriting an
16061
+ * anchor or shrinking its result clears the cells it covered before it was ever evaluated here.
16062
+ * Cells marked for an anchor that holds no formula able to spill are released.
16063
+ */
16064
+ adoptStoredSpills(spills) {
16065
+ for (const [s, anchors] of spills)
16066
+ for (const [key, range2] of anchors) {
16067
+ const node2 = this.nodes.get(s)?.get(key);
16068
+ if (node2 && !node2.legacy && !node2.arrayRange) {
16069
+ if (!node2.spill && !node2.blockedSpill) {
16070
+ node2.spill = range2;
16071
+ this.footprints.add(node2);
16072
+ }
16073
+ continue;
16074
+ }
16075
+ const sheet = this.workbook.sheets[s];
16076
+ if (!sheet) continue;
16077
+ clearFootprint(sheet, range2, range2.start.row, range2.start.col);
16078
+ this.released.push({ sheet: s, range: range2 });
16079
+ }
16080
+ }
15939
16081
  // ---- recalculation ----
15940
16082
  recalculateAll() {
15941
16083
  resetArrayBudget();
@@ -15944,6 +16086,7 @@ var Engine = class extends EngineStructure {
15944
16086
  if (this.needsFull) this.releaseAllSpills();
15945
16087
  if (!this.built || this.needsFull) this.build();
15946
16088
  this.needsFull = false;
16089
+ this.released = [];
15947
16090
  this.structuralSeeds.clear();
15948
16091
  this.cycles = /* @__PURE__ */ new Set();
15949
16092
  this.run(new Set(this.allNodes()), true);
@@ -15962,7 +16105,9 @@ var Engine = class extends EngineStructure {
15962
16105
  this.recalculateAll();
15963
16106
  return;
15964
16107
  }
15965
- const changed = [];
16108
+ const changed = this.released;
16109
+ this.released = [];
16110
+ const written = [];
15966
16111
  let structural = false;
15967
16112
  for (const change of changes) {
15968
16113
  const sheet = this.workbook.sheets[change.sheet];
@@ -15982,7 +16127,8 @@ var Engine = class extends EngineStructure {
15982
16127
  seeds.add(this.createNode(change.sheet, row2, col, cell, false));
15983
16128
  structural = true;
15984
16129
  } else if (existing && formula) seeds.add(existing);
15985
- changed.push({ sheet: change.sheet, range: { start: { row: row2, col }, end: { row: row2, col } } });
16130
+ written.push(change);
16131
+ if (!this.footprints.size) continue;
15986
16132
  const anchors = [];
15987
16133
  this.footprintsBy().dependents(
15988
16134
  change.sheet,
@@ -15999,7 +16145,8 @@ var Engine = class extends EngineStructure {
15999
16145
  if (structural) this.graphChanged();
16000
16146
  this.takeStructuralSeeds(seeds);
16001
16147
  const reverse2 = this.reverse();
16002
- for (const area of changed) reverse2.dependents(area.sheet, area.range, seeds);
16148
+ for (const area of [...changed, ...changeAreas(written)])
16149
+ reverse2.dependents(area.sheet, area.range, seeds);
16003
16150
  for (const node2 of this.allNodes()) if (node2.volatile) seeds.add(node2);
16004
16151
  this.run(seeds, false);
16005
16152
  }
@@ -16012,11 +16159,17 @@ var Engine = class extends EngineStructure {
16012
16159
  const prepared = this.prepared;
16013
16160
  this.prepared = void 0;
16014
16161
  if (!prepared) return false;
16015
- const changed = new Set(changes.map((c2) => `${c2.sheet}:${cellKey(c2.row, c2.col)}`));
16016
16162
  const current = (node2) => this.nodes.get(node2.sheet)?.get(cellKey(node2.row, node2.col)) === node2;
16017
- for (const node2 of prepared.dynamic) {
16018
- if (current(node2) && !changed.has(`${node2.sheet}:${cellKey(node2.row, node2.col)}`))
16019
- return false;
16163
+ const dynamic = prepared.dynamic.filter(current);
16164
+ if (dynamic.length) {
16165
+ const changed = /* @__PURE__ */ new Map();
16166
+ for (const c2 of changes) {
16167
+ let keys = changed.get(c2.sheet);
16168
+ if (!keys) changed.set(c2.sheet, keys = /* @__PURE__ */ new Set());
16169
+ keys.add(cellKey(c2.row, c2.col));
16170
+ }
16171
+ for (const node2 of dynamic)
16172
+ if (!changed.get(node2.sheet)?.has(cellKey(node2.row, node2.col))) return false;
16020
16173
  }
16021
16174
  for (const node2 of prepared.unvalued) {
16022
16175
  const cell = this.workbook.sheets[node2.sheet]?.rows.get(node2.row)?.get(node2.col);
@@ -16744,10 +16897,13 @@ var DEFAULT_ZIP_LIMITS = {
16744
16897
  var ZipLimitError = class extends Error {
16745
16898
  code = "ZIP_BOMB";
16746
16899
  limit;
16900
+ /** The check that failed (absent when the error was built without one). */
16901
+ kind;
16747
16902
  constructor(message, details) {
16748
16903
  super(message);
16749
16904
  this.name = "ZipLimitError";
16750
16905
  this.limit = details.limit;
16906
+ this.kind = details.kind;
16751
16907
  }
16752
16908
  };
16753
16909
  var mib = (bytes) => Math.round(bytes / 1048576);
@@ -16770,7 +16926,7 @@ function resolveLimits(limits) {
16770
16926
  maxEntryBytes: limits.maxEntryBytes ?? DEFAULT_ZIP_LIMITS.maxEntryBytes,
16771
16927
  maxTotalBytes: limits.maxTotalBytes ?? DEFAULT_ZIP_LIMITS.maxTotalBytes,
16772
16928
  label: limits.label ?? "ZIP",
16773
- fail: (message, limit2) => create ? create(message, { limit: limit2 }) : new ZipLimitError(message, { limit: limit2 })
16929
+ fail: (message, limit2, kind) => create ? create(message, { limit: limit2, kind }) : new ZipLimitError(message, { limit: limit2, kind })
16774
16930
  };
16775
16931
  }
16776
16932
  function inflateEntryGuarded(entry3, alreadyRead, limits) {
@@ -16793,13 +16949,18 @@ function inflateEntryGuarded(entry3, alreadyRead, limits) {
16793
16949
  size += chunk.byteLength;
16794
16950
  if (size > declared || size > r.maxEntryBytes)
16795
16951
  return abort(
16796
- r.fail(`${r.label} part ${entry3.name} inflates past its declared size`, r.maxEntryBytes)
16952
+ r.fail(
16953
+ `${r.label} part ${entry3.name} inflates past its declared size`,
16954
+ r.maxEntryBytes,
16955
+ size > declared ? "declaredSize" : "maxEntryBytes"
16956
+ )
16797
16957
  );
16798
16958
  if (alreadyRead + size > r.maxTotalBytes)
16799
16959
  return abort(
16800
16960
  r.fail(
16801
16961
  `${r.label} package exceeds the ${mib(r.maxTotalBytes)} MiB uncompressed content limit`,
16802
- r.maxTotalBytes
16962
+ r.maxTotalBytes,
16963
+ "maxTotalBytes"
16803
16964
  )
16804
16965
  );
16805
16966
  chunks.push(chunk);
@@ -16832,26 +16993,29 @@ function guardZip(zip, limits = {}) {
16832
16993
  if (entries.length > r.maxEntries)
16833
16994
  throw r.fail(
16834
16995
  `${r.label} package exceeds the ${r.maxEntries.toLocaleString("en-US")} part limit`,
16835
- r.maxEntries
16996
+ r.maxEntries,
16997
+ "maxEntries"
16836
16998
  );
16837
16999
  let declared = 0;
16838
17000
  for (const entry3 of entries) {
16839
17001
  const original = entry3.unsafeOriginalName;
16840
17002
  if (!isSafePartName(entry3.name) || original !== void 0 && !isSafePartName(original))
16841
- throw r.fail(`${r.label} package has an unsafe part name`, r.maxEntries);
17003
+ throw r.fail(`${r.label} package has an unsafe part name`, r.maxEntries, "partName");
16842
17004
  if (entry3.dir) continue;
16843
17005
  const size = declaredEntrySize(entry3);
16844
17006
  if (size > r.maxEntryBytes)
16845
17007
  throw r.fail(
16846
17008
  `${r.label} part ${entry3.name} exceeds the uncompressed part size limit`,
16847
- r.maxEntryBytes
17009
+ r.maxEntryBytes,
17010
+ "maxEntryBytes"
16848
17011
  );
16849
17012
  declared += size;
16850
17013
  }
16851
17014
  if (declared > r.maxTotalBytes)
16852
17015
  throw r.fail(
16853
17016
  `${r.label} package exceeds the ${mib(r.maxTotalBytes)} MiB uncompressed content limit`,
16854
- r.maxTotalBytes
17017
+ r.maxTotalBytes,
17018
+ "maxTotalBytes"
16855
17019
  );
16856
17020
  const produced = /* @__PURE__ */ new Map();
16857
17021
  let total2 = 0;
@@ -18894,10 +19058,69 @@ function mergeComments(legacy, threaded) {
18894
19058
  (a2, b) => a2.address.row - b.address.row || a2.address.col - b.address.col
18895
19059
  );
18896
19060
  }
18897
- var MAX_INPUT_BYTES = 50 * 1024 * 1024;
18898
- var MAX_PARTS = 1e4;
18899
- var MAX_UNCOMPRESSED_BYTES = 300 * 1024 * 1024;
18900
- var MAX_PART_BYTES = 200 * 1024 * 1024;
19061
+
19062
+ // xlsx/read/limits.ts
19063
+ var DEFAULT_XLSX_LOAD_LIMITS = {
19064
+ maxInputBytes: 50 * 1024 * 1024,
19065
+ maxParts: 1e4,
19066
+ maxPartBytes: 200 * 1024 * 1024,
19067
+ maxTotalBytes: 300 * 1024 * 1024,
19068
+ maxXmlElements: 5e6
19069
+ };
19070
+ var WorkbookTooLargeError = class extends Error {
19071
+ code = "workbook-too-large";
19072
+ /** The limit that was exceeded, as named in {@link XlsxLoadLimits}. */
19073
+ limit;
19074
+ /** The value of that limit when the load failed. */
19075
+ maximum;
19076
+ constructor(message, limit2, maximum, options7) {
19077
+ super(message, options7);
19078
+ this.name = "WorkbookTooLargeError";
19079
+ this.limit = limit2;
19080
+ this.maximum = maximum;
19081
+ }
19082
+ };
19083
+ function resolveLoadLimits(limits = {}) {
19084
+ const resolved = { ...DEFAULT_XLSX_LOAD_LIMITS };
19085
+ for (const name of Object.keys(resolved)) {
19086
+ const value3 = limits[name];
19087
+ if (value3 === void 0) continue;
19088
+ if (!Number.isFinite(value3) || value3 <= 0)
19089
+ throw new RangeError(`limits.${name} must be a positive finite number`);
19090
+ resolved[name] = value3;
19091
+ }
19092
+ return resolved;
19093
+ }
19094
+ var ZIP_LIMIT_NAMES = {
19095
+ maxInputBytes: "maxInputBytes",
19096
+ maxEntries: "maxParts",
19097
+ maxEntryBytes: "maxPartBytes",
19098
+ maxTotalBytes: "maxTotalBytes"
19099
+ };
19100
+ function zipLimitsFor(limits) {
19101
+ return {
19102
+ maxInputBytes: limits.maxInputBytes,
19103
+ maxEntries: limits.maxParts,
19104
+ maxEntryBytes: limits.maxPartBytes,
19105
+ maxTotalBytes: limits.maxTotalBytes,
19106
+ label: "XLSX",
19107
+ createError: (message, { limit: limit2, kind }) => {
19108
+ const name = ZIP_LIMIT_NAMES[kind];
19109
+ return name ? new WorkbookTooLargeError(message, name, limit2) : new ZipLimitError(message, { limit: limit2, kind });
19110
+ }
19111
+ };
19112
+ }
19113
+ function parseDataXml(xml, label2, maxXmlElements = DEFAULT_XLSX_LOAD_LIMITS.maxXmlElements) {
19114
+ try {
19115
+ return parseXml(xml, { label: label2, limits: { maxNodes: maxXmlElements } });
19116
+ } catch (error) {
19117
+ if (error instanceof XmlLimitError && error.limit === "maxNodes")
19118
+ throw new WorkbookTooLargeError(error.message, "maxXmlElements", error.maximum, {
19119
+ cause: error
19120
+ });
19121
+ throw error;
19122
+ }
19123
+ }
18901
19124
  var CONTENT_TYPES = {
18902
19125
  workbook: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
18903
19126
  workbookMacro: "application/vnd.ms-excel.sheet.macroEnabled.main+xml",
@@ -18987,16 +19210,15 @@ var SourceIndex = class {
18987
19210
  };
18988
19211
  var mib2 = (bytes) => Math.round(bytes / 1048576);
18989
19212
  async function readZipParts(input, limits = {}) {
18990
- const maxInput = limits.maxInputBytes ?? MAX_INPUT_BYTES;
18991
- const zipLimits = {
18992
- maxEntries: limits.maxParts ?? MAX_PARTS,
18993
- maxEntryBytes: limits.maxPartBytes ?? MAX_PART_BYTES,
18994
- maxTotalBytes: limits.maxTotalBytes ?? MAX_UNCOMPRESSED_BYTES,
18995
- label: "XLSX"
18996
- };
19213
+ const resolved = resolveLoadLimits(limits);
19214
+ const maxInput = resolved.maxInputBytes;
18997
19215
  const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);
18998
19216
  if (bytes.byteLength > maxInput)
18999
- throw new Error(`XLSX package exceeds the ${mib2(maxInput)} MiB compressed input limit`);
19217
+ throw new WorkbookTooLargeError(
19218
+ `XLSX package exceeds the ${mib2(maxInput)} MiB compressed input limit`,
19219
+ "maxInputBytes",
19220
+ maxInput
19221
+ );
19000
19222
  let loaded;
19001
19223
  try {
19002
19224
  loaded = await JSZip2.loadAsync(bytes);
@@ -19006,7 +19228,7 @@ async function readZipParts(input, limits = {}) {
19006
19228
  { cause: error }
19007
19229
  );
19008
19230
  }
19009
- const zip = guardZip(loaded, zipLimits);
19231
+ const zip = guardZip(loaded, zipLimitsFor(resolved));
19010
19232
  const parts = /* @__PURE__ */ new Map();
19011
19233
  for (const entry3 of Object.values(zip.files)) {
19012
19234
  if (entry3.dir) continue;
@@ -19213,9 +19435,9 @@ function parseRichString(element2, palette) {
19213
19435
  const text4 = parsed.map((run2) => run2.text).join("");
19214
19436
  return { text: text4, runs: parsed };
19215
19437
  }
19216
- function parseSharedStrings(xml, palette) {
19438
+ function parseSharedStrings(xml, palette, maxXmlElements) {
19217
19439
  if (!xml) return [];
19218
- const root = parseXml(xml, { label: "XLSX shared strings" }).documentElement;
19440
+ const root = parseDataXml(xml, "XLSX shared strings", maxXmlElements).documentElement;
19219
19441
  return xChildren(root, "si").map((si) => parseRichString(si, palette));
19220
19442
  }
19221
19443
 
@@ -24588,21 +24810,50 @@ function rootNamespaces(xml) {
24588
24810
  for (const match2 of (root[2] ?? "").matchAll(DECLARATION2)) out[match2[1] ?? ""] = match2[3] ?? "";
24589
24811
  return out;
24590
24812
  }
24813
+ var SPECIAL = /<[!?]/g;
24814
+ var SECTIONS = [
24815
+ ["<!--", "-->"],
24816
+ ["<![CDATA[", "]]>"],
24817
+ ["<?", "?>"]
24818
+ ];
24819
+ function blankComments(xml) {
24820
+ if (!xml.includes("<!--") && !xml.includes("<![CDATA[")) return xml;
24821
+ const pieces = [];
24822
+ let copied = 0;
24823
+ SPECIAL.lastIndex = 0;
24824
+ for (let match2 = SPECIAL.exec(xml); match2; match2 = SPECIAL.exec(xml)) {
24825
+ const at = match2.index;
24826
+ const section = SECTIONS.find(([open2]) => xml.startsWith(open2, at));
24827
+ if (!section) return void 0;
24828
+ const [open, close2] = section;
24829
+ const end = xml.indexOf(close2, at + open.length);
24830
+ if (end < 0) return void 0;
24831
+ const after = end + close2.length;
24832
+ if (open !== "<?") {
24833
+ pieces.push(xml.slice(copied, at), " ".repeat(after - at));
24834
+ copied = after;
24835
+ }
24836
+ SPECIAL.lastIndex = after;
24837
+ }
24838
+ pieces.push(xml.slice(copied));
24839
+ return pieces.join("");
24840
+ }
24591
24841
  function splitSheetData(xml) {
24592
- if (xml.includes("<!--") || xml.includes("<![CDATA[")) return void 0;
24593
- const namespaces = rootNamespaces(xml);
24594
- const open = OPEN.exec(xml);
24842
+ const plain3 = blankComments(xml);
24843
+ if (plain3 === void 0) return void 0;
24844
+ const namespaces = rootNamespaces(plain3);
24845
+ const open = OPEN.exec(plain3);
24595
24846
  if (!namespaces || !open) return void 0;
24596
24847
  const prefix = (open[1] ?? "").slice(0, -1);
24597
24848
  const ns = namespaces[prefix];
24598
24849
  if (prefix && ns === void 0) return void 0;
24599
24850
  const tagName = `${open[1] ?? ""}sheetData`;
24600
- const openEnd = xml.indexOf(">", open.index);
24851
+ const openEnd = plain3.indexOf(">", open.index);
24601
24852
  if (openEnd < 0) return void 0;
24602
- const attributes = xml.slice(open.index + tagName.length + 1, openEnd);
24853
+ const attributes = plain3.slice(open.index + tagName.length + 1, openEnd);
24603
24854
  if (attributes.trimEnd().endsWith("/") || attributes.includes("xmlns")) return void 0;
24604
- const close2 = xml.indexOf(`</${tagName}`, openEnd);
24605
- if (close2 < 0 || OPEN.test(xml.slice(openEnd))) return void 0;
24855
+ const close2 = plain3.indexOf(`</${tagName}`, openEnd);
24856
+ if (close2 < 0 || OPEN.test(plain3.slice(openEnd))) return void 0;
24606
24857
  const container = new LiteElement(tagName, "sheetData", ns || null);
24607
24858
  const data = parseLiteFragment(xml.slice(openEnd + 1, close2), container, namespaces);
24608
24859
  if (!data) return void 0;
@@ -24807,7 +25058,11 @@ function parseWorksheet(ctx, partName, name, sheetId) {
24807
25058
  return sheet;
24808
25059
  }
24809
25060
  const split = splitSheetData(xml);
24810
- const root = parseXml(split?.xml ?? xml, { label: "XLSX worksheet" }).documentElement;
25061
+ const root = parseDataXml(
25062
+ split?.xml ?? xml,
25063
+ "XLSX worksheet",
25064
+ ctx.maxXmlElements
25065
+ ).documentElement;
24811
25066
  const byName = /* @__PURE__ */ new Map();
24812
25067
  const cfBlocks = [];
24813
25068
  for (const node2 of elements(root)) {
@@ -24881,8 +25136,9 @@ function liftPrintAreas(workbook) {
24881
25136
  return false;
24882
25137
  });
24883
25138
  }
24884
- async function loadXlsx(input) {
24885
- const parts = await readZipParts(input);
25139
+ async function loadXlsx(input, options7 = {}) {
25140
+ const limits = resolveLoadLimits(options7.limits);
25141
+ const parts = await readZipParts(input, limits);
24886
25142
  const source2 = new SourceIndex(parts);
24887
25143
  const workbookPart = source2.workbookPart();
24888
25144
  if (!workbookPart) throw new Error("XLSX package has no workbook part (xl/workbook.xml)");
@@ -24903,7 +25159,8 @@ async function loadXlsx(input) {
24903
25159
  source: source2,
24904
25160
  sharedStrings: parseSharedStrings(
24905
25161
  stringsPart ? source2.text(stringsPart) : void 0,
24906
- styles.palette
25162
+ styles.palette,
25163
+ limits.maxXmlElements
24907
25164
  ),
24908
25165
  xfMap: styles.xfMap,
24909
25166
  date1904: book.date1904,
@@ -24911,7 +25168,8 @@ async function loadXlsx(input) {
24911
25168
  dxfs: styles.dxfs,
24912
25169
  persons: parsePersons(personsPart ? source2.text(personsPart) : void 0),
24913
25170
  dynamicCells: parseDynamicArrayMetadata(metadataPart ? source2.text(metadataPart) : void 0),
24914
- warn
25171
+ warn,
25172
+ maxXmlElements: limits.maxXmlElements
24915
25173
  };
24916
25174
  const rels = source2.rels(workbookPart);
24917
25175
  const sheets = book.sheets.map((entry3) => {
@@ -29223,10 +29481,8 @@ function sheetFormatXml(sheet) {
29223
29481
  const current = { defaultRowHeight: sheet.defaultRowHeight };
29224
29482
  if (sheet.defaultColWidth !== void 0) current.defaultColWidth = sheet.defaultColWidth;
29225
29483
  if (sheet.format && Object.keys(sheet.format).length) current.format = sheet.format;
29226
- const rowLevel = Math.max(
29227
- 0,
29228
- ...[...sheet.rowInfo.values()].map((info) => info.outlineLevel ?? 0)
29229
- );
29484
+ let rowLevel = 0;
29485
+ for (const info of sheet.rowInfo.values()) rowLevel = Math.max(rowLevel, info.outlineLevel ?? 0);
29230
29486
  const colLevel = Math.max(0, ...sheet.columns.map((col) => col.outlineLevel ?? 0));
29231
29487
  if (source2 && sameModel(readSheetFormat(source2), current) && Number(source2.getAttribute("outlineLevelRow") ?? 0) === rowLevel && Number(source2.getAttribute("outlineLevelCol") ?? 0) === colLevel)
29232
29488
  return snapshotXml(sheet, "sheetFormatPr") ?? "";
@@ -29528,11 +29784,10 @@ function pivotCacheDefinitionXml(pivot, workbook, data, recordRel) {
29528
29784
  const items = data.items[index3];
29529
29785
  if (pivot.dateFields?.includes(name) && items.every((v) => typeof v === "number")) {
29530
29786
  const serials = items;
29531
- const latest = Math.max(...serials);
29532
- const maxDate = Number.isInteger(latest) ? latest + 1 : latest;
29787
+ const range2 = dateGroupRange({}, serials);
29533
29788
  const parent = derived.filter((entry3) => entry3.group.field === name).at(-1);
29534
29789
  const link = parent ? `<fieldGroup par="${parent.index}"/>` : "";
29535
- return `<cacheField${attrs({ name: encodeEscapes(name), numFmtId: 14 })}><sharedItems${attrs({ containsSemiMixedTypes: false, containsNonDate: false, containsDate: true, containsString: false, minDate: iso(Math.min(...serials)), maxDate: iso(maxDate), count: serials.length })}>${serials.map((serial) => `<d v="${iso(serial)}"/>`).join("")}</sharedItems>${link}</cacheField>`;
29790
+ return `<cacheField${attrs({ name: encodeEscapes(name), numFmtId: 14 })}><sharedItems${attrs({ containsSemiMixedTypes: false, containsNonDate: false, containsDate: true, containsString: false, minDate: iso(range2.start), maxDate: iso(range2.end), count: serials.length })}>${serials.map((serial) => `<d v="${iso(serial)}"/>`).join("")}</sharedItems>${link}</cacheField>`;
29536
29791
  }
29537
29792
  const types = new Set(
29538
29793
  items.map((value3) => value3 === null || value3 === "" ? "blank" : typeof value3)
@@ -30947,7 +31202,8 @@ function setCellValue(ctx, s, row2, col, value3) {
30947
31202
  }
30948
31203
  function setRangeValues(ctx, s, at, values2) {
30949
31204
  const sheet = sheetAt(ctx.workbook, s);
30950
- const width = Math.max(0, ...values2.map((row2) => row2.length));
31205
+ let width = 0;
31206
+ for (const row2 of values2) width = Math.max(width, row2.length);
30951
31207
  if (!values2.length || !width) return;
30952
31208
  const range2 = cellRange(at.row, at.col, at.row + values2.length - 1, at.col + width - 1);
30953
31209
  ctx.run(
@@ -32271,23 +32527,33 @@ function toHtml(cells, theme2) {
32271
32527
  for (let c2 = m.start.col; c2 <= m.end.col; c2++)
32272
32528
  if (r !== m.start.row || c2 !== m.start.col) covered.add(`${r},${c2}`);
32273
32529
  }
32530
+ const styleAttrs = /* @__PURE__ */ new Map();
32531
+ const styleAttr2 = (style3) => {
32532
+ let attr2 = styleAttrs.get(style3);
32533
+ if (attr2 === void 0) {
32534
+ const css = cssFor(style3, theme2);
32535
+ styleAttrs.set(style3, attr2 = css ? `style="${escapeHtml(css)}"` : "");
32536
+ }
32537
+ return attr2;
32538
+ };
32274
32539
  const rows2 = [];
32275
32540
  for (let r = 0; r < cells.rows; r++) {
32276
32541
  const tds = [];
32277
32542
  for (let c2 = 0; c2 < cells.cols; c2++) {
32278
- if (covered.has(`${r},${c2}`)) continue;
32543
+ const key = covered.size || spans3.size || links.size ? `${r},${c2}` : "";
32544
+ if (covered.has(key)) continue;
32279
32545
  const cell = cells.data[r]?.[c2] ?? null;
32280
32546
  const attrs2 = [];
32281
- const span4 = spans3.get(`${r},${c2}`);
32547
+ const span4 = spans3.get(key);
32282
32548
  if (span4 && span4.end.row > span4.start.row)
32283
32549
  attrs2.push(`rowspan="${span4.end.row - span4.start.row + 1}"`);
32284
32550
  if (span4 && span4.end.col > span4.start.col)
32285
32551
  attrs2.push(`colspan="${span4.end.col - span4.start.col + 1}"`);
32286
32552
  if (cell && typeof cell.value === "number") attrs2.push(`x:num="${cell.value}"`);
32287
- const css = cssFor(cell?.style, theme2);
32288
- if (css) attrs2.push(`style="${escapeHtml(css)}"`);
32553
+ const css = styleAttr2(cell?.style);
32554
+ if (css) attrs2.push(css);
32289
32555
  let text4 = escapeHtml(cell?.text ?? "").replace(/\n/g, "<br>");
32290
- const link = links.get(`${r},${c2}`);
32556
+ const link = links.get(key);
32291
32557
  const href = htmlHref(link);
32292
32558
  if (href)
32293
32559
  text4 = `<a href="${escapeHtml(href)}"${link?.tooltip ? ` title="${escapeHtml(link.tooltip)}"` : ""}>${text4}</a>`;
@@ -32595,7 +32861,8 @@ function parseTsv(text4) {
32595
32861
  }
32596
32862
  row2.push(field);
32597
32863
  rows2.push(row2);
32598
- const width = Math.max(...rows2.map((r) => r.length));
32864
+ let width = 0;
32865
+ for (const r of rows2) width = Math.max(width, r.length);
32599
32866
  for (const r of rows2) while (r.length < width) r.push("");
32600
32867
  return rows2;
32601
32868
  }
@@ -32850,10 +33117,16 @@ function copyRange(workbook, s, range2) {
32850
33117
  { length: rows2 },
32851
33118
  () => Array.from({ length: cols }, () => null)
32852
33119
  );
33120
+ const styles = /* @__PURE__ */ new Map();
33121
+ const styleCopy = (id) => {
33122
+ let style3 = styles.get(id ?? 0);
33123
+ if (!style3) styles.set(id ?? 0, style3 = structuredClone(styleAt(workbook, id)));
33124
+ return style3;
33125
+ };
32853
33126
  forEachCellInRange(sheet, clipped, (cell, row2, col) => {
32854
33127
  const clip = {
32855
33128
  value: cell.value,
32856
- style: structuredClone(styleAt(workbook, cell.styleId)),
33129
+ style: styleCopy(cell.styleId),
32857
33130
  text: displayText(workbook, cell)
32858
33131
  };
32859
33132
  if (cell.formula !== void 0) clip.formula = cell.formula;
@@ -33131,7 +33404,7 @@ function setColumnWidth(ctx, s, cols, width, measure3) {
33131
33404
  ctx.run(
33132
33405
  "Column width",
33133
33406
  "view",
33134
- [{ kind: "sheet", sheet: s }],
33407
+ [{ kind: "parts", sheet: s, parts: ["columns"] }],
33135
33408
  () => editColumns(sheet, cols, (info) => {
33136
33409
  const next = widths.get(info.min);
33137
33410
  if (next === void 0) {
@@ -33166,7 +33439,7 @@ function setRowHeight(ctx, s, rows2, height) {
33166
33439
  ctx.run(
33167
33440
  "Row height",
33168
33441
  "view",
33169
- [{ kind: "sheet", sheet: s }],
33442
+ [{ kind: "rowInfo", sheet: s, rows: rows2 }],
33170
33443
  () => {
33171
33444
  for (const row2 of rows2) {
33172
33445
  const info = { ...sheet.rowInfo.get(row2) };
@@ -33196,7 +33469,9 @@ function setHidden(ctx, s, axis, indices, hidden) {
33196
33469
  ctx.run(
33197
33470
  `${hidden ? "Hide" : "Unhide"} ${noun}`,
33198
33471
  "view",
33199
- [{ kind: "sheet", sheet: s }],
33472
+ [
33473
+ axis === "col" ? { kind: "parts", sheet: s, parts: ["columns"] } : { kind: "rowInfo", sheet: s, rows: indices }
33474
+ ],
33200
33475
  () => {
33201
33476
  if (axis === "col") {
33202
33477
  editColumns(sheet, indices, (info) => {
@@ -33790,6 +34065,30 @@ function shiftEdgeCells(sheet, spec2, phase) {
33790
34065
  return out;
33791
34066
  }
33792
34067
 
34068
+ // xlsx/edit/clone-cell.ts
34069
+ function cloneCell(cell) {
34070
+ const copy2 = { ...cell };
34071
+ const fields = copy2;
34072
+ for (const key of Object.keys(fields)) {
34073
+ const value3 = fields[key];
34074
+ if (typeof value3 === "object" && value3 !== null) fields[key] = structuredClone(value3);
34075
+ }
34076
+ return copy2;
34077
+ }
34078
+
34079
+ // xlsx/edit/history-rows.ts
34080
+ function captureRowInfo(sheet, rows2) {
34081
+ return [...new Set(rows2)].map((row2) => {
34082
+ const info = sheet.rowInfo.get(row2);
34083
+ return [row2, info && structuredClone(info)];
34084
+ });
34085
+ }
34086
+ function restoreRowInfo(sheet, entries) {
34087
+ for (const [row2, info] of entries)
34088
+ if (info) sheet.rowInfo.set(row2, structuredClone(info));
34089
+ else sheet.rowInfo.delete(row2);
34090
+ }
34091
+
33793
34092
  // xlsx/edit/history.ts
33794
34093
  var SETTING_KEYS = [
33795
34094
  "structureLocked",
@@ -33817,12 +34116,14 @@ function restoreSettings(workbook, settings) {
33817
34116
  var PROBE_LIMIT = 4096;
33818
34117
  function captureCells(sheet, ranges) {
33819
34118
  const cells = [];
33820
- const seen = /* @__PURE__ */ new Set();
34119
+ const seen = ranges.length > 1 ? /* @__PURE__ */ new Set() : void 0;
33821
34120
  const take2 = (cell, row2, col) => {
33822
- const key = `${row2},${col}`;
33823
- if (seen.has(key)) return;
33824
- seen.add(key);
33825
- cells.push([row2, col, structuredClone(cell)]);
34121
+ if (seen) {
34122
+ const key = cellKey(row2, col);
34123
+ if (seen.has(key)) return;
34124
+ seen.add(key);
34125
+ }
34126
+ cells.push([row2, col, cloneCell(cell)]);
33826
34127
  };
33827
34128
  for (const raw2 of ranges) {
33828
34129
  const range2 = normalizeRange(raw2);
@@ -33874,6 +34175,8 @@ function captureScope(workbook, scope, before) {
33874
34175
  if (!sheet) throw new RangeError(`No sheet at index ${scope.sheet}`);
33875
34176
  if (scope.kind === "sheet")
33876
34177
  return { kind: "sheet", sheet: scope.sheet, data: structuredClone(sheet) };
34178
+ if (scope.kind === "rowInfo")
34179
+ return { kind: "rowInfo", sheet: scope.sheet, rows: captureRowInfo(sheet, scope.rows) };
33877
34180
  if (scope.kind === "parts") {
33878
34181
  const data = {};
33879
34182
  for (const part of scope.parts) if (sheet[part] !== void 0) data[part] = sheet[part];
@@ -33897,7 +34200,7 @@ function restoreShift(workbook, snapshot) {
33897
34200
  if (!sheet) return;
33898
34201
  const shift2 = snapshot.phase === "before" ? { ...spec2.shift, count: -spec2.shift.count } : spec2.shift;
33899
34202
  moveCellsRaw(sheet, shift2, spec2.band);
33900
- for (const [row2, col, cell] of snapshot.cells) putCell(sheet, row2, col, structuredClone(cell));
34203
+ for (const [row2, col, cell] of snapshot.cells) putCell(sheet, row2, col, cloneCell(cell));
33901
34204
  restoreRefs(workbook, snapshot.data);
33902
34205
  workbook.activeSheet = snapshot.activeSheet;
33903
34206
  }
@@ -33925,6 +34228,7 @@ function restoreSnapshot(workbook, snapshot) {
33925
34228
  }
33926
34229
  const sheet = workbook.sheets[snapshot.sheet];
33927
34230
  if (!sheet) return;
34231
+ if (snapshot.kind === "rowInfo") return restoreRowInfo(sheet, snapshot.rows);
33928
34232
  if (snapshot.kind === "parts") {
33929
34233
  const target2 = sheet;
33930
34234
  const data = structuredClone(snapshot.data);
@@ -33945,18 +34249,51 @@ function restoreSnapshot(workbook, snapshot) {
33945
34249
  forEachCellInRange(sheet, range2, (_cell, row2, col) => doomed.push([row2, col]));
33946
34250
  for (const [row2, col] of doomed) deleteCell(sheet, row2, col);
33947
34251
  }
33948
- for (const [row2, col, cell] of snapshot.cells) putCell(sheet, row2, col, structuredClone(cell));
34252
+ for (const [row2, col, cell] of snapshot.cells) putCell(sheet, row2, col, cloneCell(cell));
34253
+ }
34254
+ function rowMajor(cells) {
34255
+ for (let i2 = 1; i2 < cells.length; i2++) {
34256
+ const [row0, col0] = cells[i2 - 1];
34257
+ const [row1, col1] = cells[i2];
34258
+ if (row1 < row0 || row1 === row0 && col1 <= col0) return false;
34259
+ }
34260
+ return true;
33949
34261
  }
33950
34262
  function touchedCells(step) {
33951
34263
  const out = [];
33952
- const seen = /* @__PURE__ */ new Set();
34264
+ const lists = step.entries.flatMap((entry3) => [entry3.before, entry3.after]).filter((snapshot) => snapshot.kind === "cells" && snapshot.cells.length > 0);
34265
+ const [first2, second, ...rest] = lists;
34266
+ if (first2 && !rest.length && (!second || second.sheet === first2.sheet)) {
34267
+ const sheet = first2.sheet;
34268
+ for (const [row2, col] of first2.cells) out.push({ sheet, row: row2, col });
34269
+ if (!second) return out;
34270
+ if (rowMajor(first2.cells) && rowMajor(second.cells)) {
34271
+ let i2 = 0;
34272
+ for (const [row2, col] of second.cells) {
34273
+ const key = cellKey(row2, col);
34274
+ while (i2 < first2.cells.length) {
34275
+ const [r, c2] = first2.cells[i2];
34276
+ if (cellKey(r, c2) >= key) break;
34277
+ i2++;
34278
+ }
34279
+ const at = first2.cells[i2];
34280
+ if (at && cellKey(at[0], at[1]) === key) continue;
34281
+ out.push({ sheet, row: row2, col });
34282
+ }
34283
+ return out;
34284
+ }
34285
+ out.length = 0;
34286
+ }
34287
+ const seen = /* @__PURE__ */ new Map();
33953
34288
  for (const entry3 of step.entries)
33954
34289
  for (const snapshot of [entry3.before, entry3.after]) {
33955
34290
  if (snapshot.kind !== "cells") continue;
34291
+ let keys = seen.get(snapshot.sheet);
34292
+ if (!keys) seen.set(snapshot.sheet, keys = /* @__PURE__ */ new Set());
33956
34293
  for (const [row2, col] of snapshot.cells) {
33957
- const key = `${snapshot.sheet},${row2},${col}`;
33958
- if (seen.has(key)) continue;
33959
- seen.add(key);
34294
+ const key = cellKey(row2, col);
34295
+ if (keys.has(key)) continue;
34296
+ keys.add(key);
33960
34297
  out.push({ sheet: snapshot.sheet, row: row2, col });
33961
34298
  }
33962
34299
  }
@@ -34053,7 +34390,7 @@ var SessionCalculator = class {
34053
34390
  }
34054
34391
  this.calc.discardPreparation();
34055
34392
  if (structural) this.staleGraph = true;
34056
- else this.dirty.push(...touchedCells(step));
34393
+ else for (const cell of touchedCells(step)) this.dirty.push(cell);
34057
34394
  return;
34058
34395
  }
34059
34396
  if (hint && !this.staleGraph) {
@@ -34072,7 +34409,7 @@ var SessionCalculator = class {
34072
34409
  this.calc.discardPreparation();
34073
34410
  if (!this.enabled) return;
34074
34411
  if (structural) this.staleGraph = true;
34075
- else this.dirty.push(...cells);
34412
+ else for (const cell of cells) this.dirty.push(cell);
34076
34413
  return;
34077
34414
  }
34078
34415
  this.recalc(structural, () => cells);
@@ -35134,8 +35471,16 @@ function insertTimeline(ctx, s, ref) {
35134
35471
  const pivot = sheet.pivotTables?.find((entry3) => entry3.name === ref.pivot);
35135
35472
  if (!pivot || !pivot.dateFields?.includes(ref.field))
35136
35473
  throw new Error("Choose a PivotTable with a date field.");
35137
- const dates = pivot.records.map((record) => record[pivot.fields.indexOf(ref.field)]).filter((value3) => typeof value3 === "number");
35138
- if (!dates.length) throw new Error("Choose a PivotTable with a date field.");
35474
+ const column2 = pivot.fields.indexOf(ref.field);
35475
+ let earliest = Infinity;
35476
+ let latest = -Infinity;
35477
+ for (const record of pivot.records) {
35478
+ const value3 = record[column2];
35479
+ if (typeof value3 !== "number") continue;
35480
+ earliest = Math.min(earliest, value3);
35481
+ latest = Math.max(latest, value3);
35482
+ }
35483
+ if (earliest > latest) throw new Error("Choose a PivotTable with a date field.");
35139
35484
  const taken = /* @__PURE__ */ new Set([
35140
35485
  ...(workbook.slicers?.slicers ?? []).map((entry3) => entry3.name.toLowerCase()),
35141
35486
  ...(workbook.slicers?.timelines ?? []).map((entry3) => entry3.name.toLowerCase()),
@@ -35153,8 +35498,8 @@ function insertTimeline(ctx, s, ref) {
35153
35498
  "_"
35154
35499
  );
35155
35500
  const bounds = boundsOfSerialRange(
35156
- serialToIso(Math.min(...dates), workbook.date1904),
35157
- serialToIso(Math.max(...dates), workbook.date1904)
35501
+ serialToIso(earliest, workbook.date1904),
35502
+ serialToIso(latest, workbook.date1904)
35158
35503
  );
35159
35504
  const metrics = createGridMetrics(sheet, { zoom: 100 });
35160
35505
  let right2 = 0;
@@ -36317,12 +36662,13 @@ function span2(from, to) {
36317
36662
  }
36318
36663
  function outlineRows(ctx, s, from, to, delta) {
36319
36664
  const sheet = sheetAt(ctx.workbook, s);
36665
+ const rows2 = span2(from, to);
36320
36666
  ctx.run(
36321
36667
  delta > 0 ? "Group rows" : "Ungroup rows",
36322
36668
  "structure",
36323
- [{ kind: "sheet", sheet: s }],
36669
+ [{ kind: "rowInfo", sheet: s, rows: rows2 }],
36324
36670
  () => {
36325
- for (const row2 of span2(from, to)) {
36671
+ for (const row2 of rows2) {
36326
36672
  const info = { ...sheet.rowInfo.get(row2) };
36327
36673
  const level2 = nextLevel(info.outlineLevel, delta);
36328
36674
  if (level2) info.outlineLevel = level2;
@@ -36342,7 +36688,7 @@ function outlineColumns(ctx, s, from, to, delta) {
36342
36688
  ctx.run(
36343
36689
  delta > 0 ? "Group columns" : "Ungroup columns",
36344
36690
  "structure",
36345
- [{ kind: "sheet", sheet: s }],
36691
+ [{ kind: "parts", sheet: s, parts: ["columns"] }],
36346
36692
  () => editColumns(sheet, span2(from, to), (info) => {
36347
36693
  const level2 = nextLevel(info.outlineLevel, delta);
36348
36694
  if (level2) info.outlineLevel = level2;
@@ -36365,7 +36711,7 @@ function setDefaultColumnWidth(ctx, s, width) {
36365
36711
  ctx.run(
36366
36712
  "Standard width",
36367
36713
  "format",
36368
- [{ kind: "sheet", sheet: s }],
36714
+ [{ kind: "parts", sheet: s, parts: ["defaultColWidth"] }],
36369
36715
  () => {
36370
36716
  if (width === void 0) Reflect.deleteProperty(sheet, "defaultColWidth");
36371
36717
  else sheet.defaultColWidth = width;
@@ -38567,6 +38913,15 @@ function mergeFont(base, font) {
38567
38913
  if (value3 !== void 0) out[key] = value3;
38568
38914
  return out;
38569
38915
  }
38916
+ function cellFont(font, defaultFont) {
38917
+ const out = { ...font };
38918
+ if (!out.name && !out.scheme) {
38919
+ if (defaultFont.name) out.name = defaultFont.name;
38920
+ if (defaultFont.scheme) out.scheme = defaultFont.scheme;
38921
+ }
38922
+ if (!out.size && defaultFont.size) out.size = defaultFont.size;
38923
+ return out;
38924
+ }
38570
38925
  function fontView(font, theme2) {
38571
38926
  const family = font.scheme === "major" ? theme2.majorFont || font.name || "Calibri Light" : font.scheme === "minor" ? theme2.minorFont || font.name || "Calibri" : font.name || theme2.minorFont || "Calibri";
38572
38927
  const view = {
@@ -38691,14 +39046,7 @@ function cellView(workbook, sheetIndex2, row2, col, cf, options7 = {}) {
38691
39046
  const style3 = styleAt(workbook, effectiveStyleId(sheet, row2, col));
38692
39047
  const conditional = cf?.at(row2, col);
38693
39048
  const dxf = conditional?.style;
38694
- const defaultFont = workbook.styles[0]?.font ?? {};
38695
- const base = { ...style3.font };
38696
- if (!base.name && !base.scheme) {
38697
- if (defaultFont.name) base.name = defaultFont.name;
38698
- if (defaultFont.scheme) base.scheme = defaultFont.scheme;
38699
- }
38700
- if (!base.size && defaultFont.size) base.size = defaultFont.size;
38701
- const font = mergeFont(base, dxf?.font);
39049
+ const font = mergeFont(cellFont(style3.font, workbook.styles[0]?.font ?? {}), dxf?.font);
38702
39050
  const formulaText = sheet.view.showFormulas && cell?.formula !== void 0 ? `=${cell.formula}` : void 0;
38703
39051
  const shown = formulaText !== void 0 ? { text: formulaText } : displayText2(value3, style3, dxf?.numFmt ?? style3.numFmt, workbook, sheet);
38704
39052
  const fontViewResolved = fontView(font, workbook.theme);
@@ -38949,10 +39297,11 @@ function autoGrowRows(ctx, s, rows2, measure3 = approximateMeasure) {
38949
39297
  updates.push([row2, next]);
38950
39298
  }
38951
39299
  if (!updates.length) return [];
39300
+ const changed = updates.map(([row2]) => row2);
38952
39301
  ctx.run(
38953
39302
  "Row height",
38954
39303
  "view",
38955
- [{ kind: "sheet", sheet: s }],
39304
+ [{ kind: "rowInfo", sheet: s, rows: changed }],
38956
39305
  () => {
38957
39306
  for (const [row2, height] of updates) {
38958
39307
  const info = { ...sheet.rowInfo.get(row2) };
@@ -38964,7 +39313,7 @@ function autoGrowRows(ctx, s, rows2, measure3 = approximateMeasure) {
38964
39313
  },
38965
39314
  { sheet: s, structural: true }
38966
39315
  );
38967
- return updates.map(([row2]) => row2);
39316
+ return changed;
38968
39317
  }
38969
39318
  var MAX_REFIT_ROWS = 1e4;
38970
39319
  function rowsToRefit(sheet, ranges) {
@@ -40294,14 +40643,24 @@ function formatAxisValue(value3, percent = false) {
40294
40643
  return `${v < 0 ? "-" : ""}${grouped}${frac ? `.${frac}` : ""}`;
40295
40644
  }
40296
40645
 
40646
+ // chart/extent.ts
40647
+ function extentOf(values2) {
40648
+ let min = Infinity;
40649
+ let max = -Infinity;
40650
+ for (const value3 of values2) {
40651
+ min = Math.min(min, value3);
40652
+ max = Math.max(max, value3);
40653
+ }
40654
+ return { min, max };
40655
+ }
40656
+
40297
40657
  // chart/axis-range.ts
40298
40658
  function computeLogValueRange(series, logBase) {
40299
40659
  const allValues = series.flatMap((item) => item.values).filter((value3) => value3 !== null && Number.isFinite(value3) && value3 > 0);
40300
40660
  if (allValues.length === 0) {
40301
40661
  return { min: 1, max: logBase, span: 1, logScale: true, logBase };
40302
40662
  }
40303
- const dataMin = Math.min(...allValues);
40304
- const dataMax = Math.max(...allValues);
40663
+ const { min: dataMin, max: dataMax } = extentOf(allValues);
40305
40664
  const logMin = Math.floor(Math.log(dataMin) / Math.log(logBase));
40306
40665
  const logMax = Math.ceil(Math.log(dataMax) / Math.log(logBase));
40307
40666
  const min = logBase ** logMin;
@@ -41328,8 +41687,7 @@ function computeHistogramBins(values2, options7, format = String) {
41328
41687
  });
41329
41688
  }
41330
41689
  if (regular.length > 0) {
41331
- const min = Math.min(...regular.map((item) => item.value));
41332
- const max = Math.max(...regular.map((item) => item.value));
41690
+ const { min, max } = extentOf(regular.map((item) => item.value));
41333
41691
  const requestedSize = options7.binSize && options7.binSize > 0 ? options7.binSize : void 0;
41334
41692
  const requestedCount = options7.binCount && options7.binCount > 0 ? options7.binCount : void 0;
41335
41693
  const start = requestedSize ? Math.floor(min / requestedSize) * requestedSize : min;
@@ -41457,8 +41815,9 @@ function waterfallView(chart, model, ctx) {
41457
41815
  colors: { increase: role(0), decrease: role(1), total: role(2) }
41458
41816
  };
41459
41817
  const ends = steps.flatMap((step) => [step.startValue, step.endValue]);
41818
+ const range2 = extentOf(ends);
41460
41819
  model.valueAxis = {
41461
- ...ends.length ? niceScale(Math.min(...ends), Math.max(...ends)) : niceScale(0, 1),
41820
+ ...ends.length ? niceScale(range2.min, range2.max) : niceScale(0, 1),
41462
41821
  percent: false
41463
41822
  };
41464
41823
  const labels = model.categories;
@@ -41574,7 +41933,8 @@ function chartSummaryView(chart, theme2, options7 = {}) {
41574
41933
  s.xValues = s.values.map((_, k) => numeric2 ? toNumber2(cats[k] ?? null) : k + 1);
41575
41934
  });
41576
41935
  const xs = series.flatMap((s) => s.xValues ?? []).filter((x) => x !== null);
41577
- model.xAxis = xs.length ? niceScale(Math.min(...xs), Math.max(...xs)) : niceScale(0, 1);
41936
+ const range2 = extentOf(xs);
41937
+ model.xAxis = xs.length ? niceScale(range2.min, range2.max) : niceScale(0, 1);
41578
41938
  }
41579
41939
  if (type === "stock") model.stock = stockView(chart.stock, ctx);
41580
41940
  if (type === "bubble") bubbleView(chart, model, ctx.evaluateRef);
@@ -41851,8 +42211,9 @@ function fitChartTrendline(options7, xVals, yVals) {
41851
42211
  }
41852
42212
  const model = fitModel(options7, xVals, yVals);
41853
42213
  if (!model) return noFit();
41854
- const startX = Math.min(...xVals) - (options7.backward ?? 0);
41855
- const endX = Math.max(...xVals) + (options7.forward ?? 0);
42214
+ const xRange = extentOf(xVals);
42215
+ const startX = xRange.min - (options7.backward ?? 0);
42216
+ const endX = xRange.max + (options7.forward ?? 0);
41856
42217
  const steps = Math.max(Math.ceil((endX - startX) * 4), 20);
41857
42218
  const points = [];
41858
42219
  for (let step = 0; step <= steps; step++) {
@@ -42421,7 +42782,7 @@ function cartesianAxes(model, area, out) {
42421
42782
  const cats = Math.max(1, model.categories.length);
42422
42783
  const catW = Math.min(
42423
42784
  area.w * 0.3,
42424
- Math.max(...model.categories.map((c2) => textWidth(c2, categorySize)), 8) + 6
42785
+ Math.max(extentOf(model.categories.map((c2) => textWidth(c2, categorySize))).max, 8) + 6
42425
42786
  );
42426
42787
  const second = horizontal2 ? void 0 : model.secondaryAxis;
42427
42788
  const secondLabels = second?.ticks.map((t) => axisTickText(t, model.axes?.secondary, second.percent)) ?? [];
@@ -42610,7 +42971,7 @@ function computeBubbleRadius(sizeVal, maxBubble, medianRadius, options7) {
42610
42971
  return medianRadius * scale2 * 0.5 + ratio * medianRadius * scale2 * 1.5;
42611
42972
  }
42612
42973
  function maxBubbleSize(sizes) {
42613
- return sizes.length > 0 ? Math.max(1, ...sizes.map(Math.abs)) : 1;
42974
+ return Math.max(1, extentOf(sizes.map(Math.abs)).max);
42614
42975
  }
42615
42976
  function medianBubbleRadius(plotWidth, plotHeight) {
42616
42977
  return Math.min(plotWidth, plotHeight) * 0.04;
@@ -43223,13 +43584,11 @@ function chartLegendSvg(model, area, frame, options7) {
43223
43584
  chartAreaRect(model, "legend", { x: manual.x, y: manual.y, w: manual.width, h: manual.height })
43224
43585
  ];
43225
43586
  const baselineOffset = font ? (font.ascent - font.descent) / 2 : size * 0.35;
43587
+ const widest = extentOf(widths).max;
43226
43588
  entries.forEach((entry3, i2) => {
43227
43589
  const available = horizontal2 ? chartTextWidth(entry3.label, attrs2, options7) : Math.max(0, rowWidth - size / 2 - keySize - keyGap);
43228
43590
  const label2 = fitChartText(entry3.label, available, attrs2, options7);
43229
- const contentWidth = Math.min(
43230
- horizontal2 ? widths[i2] ?? 0 : Math.max(...widths),
43231
- rowWidth - size / 2
43232
- );
43591
+ const contentWidth = Math.min(horizontal2 ? widths[i2] ?? 0 : widest, rowWidth - size / 2);
43233
43592
  const x = horizontal2 ? horizontalX : manual.x + Math.max(size / 4, (rowWidth - contentWidth) / 2);
43234
43593
  const centerY = manual.y + (horizontal2 ? 0 : i2 * rowHeight) + rowHeight / 2;
43235
43594
  markup.push(rect(x, centerY - keySize / 2, keySize, keySize, entry3.color));
@@ -43301,7 +43660,7 @@ function automaticLegend(model, area, out, options7, bounds) {
43301
43660
  }
43302
43661
  const width = Math.min(
43303
43662
  area.w * 0.35,
43304
- Math.max(...entries.map((e) => chartTextWidth(e.label, attrs2, options7))) + 22
43663
+ extentOf(entries.map((e) => chartTextWidth(e.label, attrs2, options7))).max + 22
43305
43664
  );
43306
43665
  const height = entries.length * rowH;
43307
43666
  const x = pos === "l" ? area.x + 4 : area.x + area.w - width;
@@ -55327,4 +55686,51 @@ function applyThemeColors(host, previous, colors) {
55327
55686
  return Object.keys(vars);
55328
55687
  }
55329
55688
 
55330
- export { ACCOUNTING_FORMATS, ALL_RANGE, AUTOSUM_FUNCTIONS, BORDER_PRESETS, CATEGORIES, COLOR_SCALES, COMMAND_TABLES, CORE_FEATURE_STRINGS, CellViewCache, DATA_BAR_COLORS, DATE_CODES, DEFAULT_OPTIONS, DirtyState, EDITOR_LOCALES, EDITOR_THEME_MODES, EMBED_ASPECT, FONT_NAMES, FONT_SIZES, FORECAST_UNAVAILABLE, FORMAT_CELLS_STRINGS, FRACTION_CODES, FUNCTION_MENUS, GROUPED_CHART_TYPES, GridGeometry, HIGHLIGHT_STYLES, ICON_ACCENTS, ICON_PATHS, ICON_SETS, INSERT_CHART_TYPES, MARGIN_PRESETS, MAX_GRID_COLS, MAX_GRID_ROWS, MESSAGE_STRINGS, MORE_FUNCTION_CATEGORIES, NAVIGATION_STRINGS, ORIENTATIONS2 as ORIENTATIONS, PAPER_SIZES, QUADRANTS, RIBBON_HOME_STRINGS, RIBBON_TAB_STRINGS, RULES_STRINGS, SHEET_ICONS, SPECIAL_CODES, STRINGS, SYMBOLS, SheetSelections, TABLE_STYLES, TEMPLATES, THEME_KEYS, TIME_CODES, TOOLS_STRINGS, UNSET, absoluteReference, activeChart, activeRef, activeSlicer, activeStyle, activeTable, activeTimeline, addRange, alignItems, alignmentCommands, applyThemeColors, autoSumRange, buildChart, buildCode, buildItems, cellCommands, cellMenu, cellRange3 as cellRange, cellStyleItems, chartGridText, clampAddress, clipState, clipboardCommands, colSelected, colorScaleRule, colsOf, colsRange, columnHeaderHeight, columnHeaderMenu, commandStrings, contextualCommands, createCommandRegistry, createDialogRegistry, createEditBridge, createSelectionModel, createTemplateWorkbook, cssFont2 as cssFont, cssFontFamily, darkTheme, dataBarRule, dataCommands, detectCategory, diagonalSvg, dxfCss, edgeCss, editBridge, editChart, editing, editingCommands, evaluateRef, expandForMerges, extendSelection, fillPaint, fillSource, fillTemplate, findDefinedName2 as findDefinedName, findSpecial, fitNumber2 as fitNumber, fontCommands, formatNumber2 as formatNumber, formulaCommands, functionsIn, gridChart, gridChartSvg, gridChartWorkbook, guessHeader, hasBorders, hasWorkbook, hashes, helpTab, historyOf, icon, iconCount, iconSetRule, iconSvg, iconThresholds, initialSelection, insertFunctionCall, installFormatPainter, isBlankView, isMenuSeparator, isSingleCell, isTabHidden, isWholeCols, isWholeRows2 as isWholeRows, justify, lightTheme, measure2 as measure, moveWithinSelection, movingEnd, nameForRange, negativeCodes, normalizeEditorLocale, normalizeThemeMode, noteFunctionUse, numberCommands, numberFormatOptions, onRibbonTabsChange, pageBreakCommands, pageLayoutCommands, parseBorderArg, parseChartGrid, parseSelectionRef, parseSheetReference, pasteWith, patternImage, pickColor, rangeRef, readEmbeddedChart, recentFunctions, refresh, regionOf, registerRibbonTabs, repeatToFill, resetRibbonTabs, resolveNameBox, reviewTab, ribbonTabs, rowHeaderMenu, rowHeaderWidth, rowSelected, rowsOf, rowsRange, scrollToReveal, searchCommands, selectCell, selectSpecial, selectTab, selectionCellCount, selectionRef, setTabHidden, sheetBaseName, sheetLocked, slicerSourceAt, sortCommands, span3 as span, spanRange, stepFontSize, structureLocked, style2 as style, styleCssFont, tabButton, tabMenu, tableAt, tableStyleColor, tableStylePreview, target, textAlign, textDecoration, themePaletteItems, themeToCssVars, timelineSourceAt, translate, translator, viewTab, viewing, whatIfCommands, wholeColumns, wholeRows, withTarget };
55689
+ // xlsx/ui/selection-format.ts
55690
+ function selectionFormatting(workbook, sheetIndex2, ranges) {
55691
+ const values2 = {
55692
+ bold: /* @__PURE__ */ new Set(),
55693
+ italic: /* @__PURE__ */ new Set(),
55694
+ underline: /* @__PURE__ */ new Set(),
55695
+ fontFamily: /* @__PURE__ */ new Set(),
55696
+ fontSize: /* @__PURE__ */ new Set(),
55697
+ alignment: /* @__PURE__ */ new Set(),
55698
+ numberFormat: /* @__PURE__ */ new Set()
55699
+ };
55700
+ const sheet = workbook?.sheets[sheetIndex2];
55701
+ let remaining = 4096;
55702
+ let complete = true;
55703
+ if (workbook && sheet)
55704
+ outer: for (const raw2 of ranges) {
55705
+ const range2 = normalizeRange(raw2);
55706
+ for (let row2 = range2.start.row; row2 <= range2.end.row; row2++) {
55707
+ for (let col = range2.start.col; col <= range2.end.col; col++) {
55708
+ if (--remaining < 0) {
55709
+ complete = false;
55710
+ break outer;
55711
+ }
55712
+ const style3 = styleAt(workbook, effectiveStyleId(sheet, row2, col));
55713
+ values2.bold.add(Boolean(style3.font.bold));
55714
+ values2.italic.add(Boolean(style3.font.italic));
55715
+ values2.underline.add(Boolean(style3.font.underline));
55716
+ values2.fontFamily.add(style3.font.name ?? "Aptos");
55717
+ values2.fontSize.add(style3.font.size ?? 11);
55718
+ values2.alignment.add(style3.alignment?.horizontal ?? "general");
55719
+ values2.numberFormat.add(style3.numFmt ?? "General");
55720
+ }
55721
+ }
55722
+ }
55723
+ const single = (set) => complete && set.size === 1 ? [...set][0] : null;
55724
+ return {
55725
+ bold: single(values2.bold),
55726
+ italic: single(values2.italic),
55727
+ underline: single(values2.underline),
55728
+ fontFamily: single(values2.fontFamily),
55729
+ fontSize: single(values2.fontSize),
55730
+ alignment: single(values2.alignment),
55731
+ numberFormat: single(values2.numberFormat),
55732
+ formattingComplete: complete
55733
+ };
55734
+ }
55735
+
55736
+ export { ACCOUNTING_FORMATS, ALL_RANGE, AUTOSUM_FUNCTIONS, BORDER_PRESETS, CATEGORIES, COLOR_SCALES, COMMAND_TABLES, CORE_FEATURE_STRINGS, CellViewCache, DATA_BAR_COLORS, DATE_CODES, DEFAULT_OPTIONS, DirtyState, EDITOR_LOCALES, EDITOR_THEME_MODES, EMBED_ASPECT, FONT_NAMES, FONT_SIZES, FORECAST_UNAVAILABLE, FORMAT_CELLS_STRINGS, FRACTION_CODES, FUNCTION_MENUS, GROUPED_CHART_TYPES, GridGeometry, HIGHLIGHT_STYLES, ICON_ACCENTS, ICON_PATHS, ICON_SETS, INSERT_CHART_TYPES, MARGIN_PRESETS, MAX_GRID_COLS, MAX_GRID_ROWS, MESSAGE_STRINGS, MORE_FUNCTION_CATEGORIES, NAVIGATION_STRINGS, ORIENTATIONS2 as ORIENTATIONS, PAPER_SIZES, QUADRANTS, RIBBON_HOME_STRINGS, RIBBON_TAB_STRINGS, RULES_STRINGS, SHEET_ICONS, SPECIAL_CODES, STRINGS, SYMBOLS, SheetSelections, TABLE_STYLES, TEMPLATES, THEME_KEYS, TIME_CODES, TOOLS_STRINGS, UNSET, absoluteReference, activeChart, activeRef, activeSlicer, activeStyle, activeTable, activeTimeline, addRange, alignItems, alignmentCommands, applyThemeColors, autoSumRange, buildChart, buildCode, buildItems, cellCommands, cellMenu, cellRange3 as cellRange, cellStyleItems, chartGridText, clampAddress, clipState, clipboardCommands, colSelected, colorScaleRule, colsOf, colsRange, columnHeaderHeight, columnHeaderMenu, commandStrings, contextualCommands, createCommandRegistry, createDialogRegistry, createEditBridge, createSelectionModel, createTemplateWorkbook, cssFont2 as cssFont, cssFontFamily, darkTheme, dataBarRule, dataCommands, detectCategory, diagonalSvg, dxfCss, edgeCss, editBridge, editChart, editing, editingCommands, evaluateRef, expandForMerges, extendSelection, fillPaint, fillSource, fillTemplate, findDefinedName2 as findDefinedName, findSpecial, fitNumber2 as fitNumber, fontCommands, formatNumber2 as formatNumber, formulaCommands, functionsIn, gridChart, gridChartSvg, gridChartWorkbook, guessHeader, hasBorders, hasWorkbook, hashes, helpTab, historyOf, icon, iconCount, iconSetRule, iconSvg, iconThresholds, initialSelection, insertFunctionCall, installFormatPainter, isBlankView, isMenuSeparator, isSingleCell, isTabHidden, isWholeCols, isWholeRows2 as isWholeRows, justify, lightTheme, measure2 as measure, moveWithinSelection, movingEnd, nameForRange, negativeCodes, normalizeEditorLocale, normalizeThemeMode, noteFunctionUse, numberCommands, numberFormatOptions, onRibbonTabsChange, pageBreakCommands, pageLayoutCommands, parseBorderArg, parseChartGrid, parseSelectionRef, parseSheetReference, pasteWith, patternImage, pickColor, rangeRef, readEmbeddedChart, recentFunctions, refresh, regionOf, registerRibbonTabs, repeatToFill, resetRibbonTabs, resolveNameBox, reviewTab, ribbonTabs, rowHeaderMenu, rowHeaderWidth, rowSelected, rowsOf, rowsRange, scrollToReveal, searchCommands, selectCell, selectSpecial, selectTab, selectionCellCount, selectionFormatting, selectionRef, setTabHidden, sheetBaseName, sheetLocked, slicerSourceAt, sortCommands, span3 as span, spanRange, stepFontSize, structureLocked, style2 as style, styleCssFont, tabButton, tabMenu, tableAt, tableStyleColor, tableStylePreview, target, textAlign, textDecoration, themePaletteItems, themeToCssVars, timelineSourceAt, translate, translator, viewTab, viewing, whatIfCommands, wholeColumns, wholeRows, withTarget };