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
@@ -321,9 +321,9 @@ function nextSheetName(workbook, base = "Sheet") {
321
321
  }
322
322
  var nextSheetId = (workbook) => workbook.sheets.reduce((max, sheet) => Math.max(max, sheet.sheetId), 0) + 1;
323
323
 
324
- // xlsx/styles.ts
325
- function styleKey(style3) {
326
- return JSON.stringify(sortKeys(style3));
324
+ // xlsx/stable-key.ts
325
+ function stableKey(value3) {
326
+ return JSON.stringify(sortKeys(value3));
327
327
  }
328
328
  function sortKeys(value3) {
329
329
  if (Array.isArray(value3)) return value3.map(sortKeys);
@@ -337,6 +337,11 @@ function sortKeys(value3) {
337
337
  }
338
338
  return value3;
339
339
  }
340
+
341
+ // xlsx/styles.ts
342
+ function styleKey(style3) {
343
+ return stableKey(style3);
344
+ }
340
345
  function styleAt(workbook, styleId) {
341
346
  const style3 = workbook.styles[styleId ?? 0] ?? workbook.styles[0];
342
347
  if (!style3) throw new Error("Workbook has no default cell style");
@@ -2709,6 +2714,37 @@ function parseArray(c2) {
2709
2714
  return { type: "array", rows: rows2 };
2710
2715
  }
2711
2716
 
2717
+ // xlsx/formula/change-areas.ts
2718
+ function changeAreas(changes) {
2719
+ const out = [];
2720
+ const open = /* @__PURE__ */ new Map();
2721
+ let run2;
2722
+ const close2 = (area) => {
2723
+ const { start, end } = area.range;
2724
+ const key = `${area.sheet}:${start.col}:${end.col}`;
2725
+ const above = open.get(key);
2726
+ if (above && above.range.end.row === start.row - 1) {
2727
+ above.range.end.row = end.row;
2728
+ return;
2729
+ }
2730
+ out.push(area);
2731
+ open.set(key, area);
2732
+ };
2733
+ for (const { sheet, row: row2, col } of changes) {
2734
+ if (run2 && run2.sheet === sheet && run2.range.start.row === row2) {
2735
+ if (col === run2.range.end.col + 1) {
2736
+ run2.range.end.col = col;
2737
+ continue;
2738
+ }
2739
+ if (col >= run2.range.start.col && col <= run2.range.end.col) continue;
2740
+ }
2741
+ if (run2) close2(run2);
2742
+ run2 = { sheet, range: { start: { row: row2, col }, end: { row: row2, col } } };
2743
+ }
2744
+ if (run2) close2(run2);
2745
+ return out;
2746
+ }
2747
+
2712
2748
  // xlsx/formula/date-serial.ts
2713
2749
  var DAY_MS = 864e5;
2714
2750
  var EPOCH_19002 = Date.UTC(1899, 11, 30);
@@ -2935,68 +2971,6 @@ var ReverseIndex = class extends AreaIndex {
2935
2971
  }
2936
2972
  };
2937
2973
 
2938
- // xlsx/formula/engine-prepare.ts
2939
- var CHECK_EVERY = 32;
2940
- var GraphPreparation = class {
2941
- constructor(workbook, create) {
2942
- this.workbook = workbook;
2943
- this.create = create;
2944
- }
2945
- workbook;
2946
- create;
2947
- reverse = new ReverseIndex();
2948
- formulas = { dynamic: [], unvalued: [] };
2949
- sheet = 0;
2950
- rows;
2951
- row = 0;
2952
- cells;
2953
- finished = false;
2954
- /**
2955
- * Adds formulas to the graph until `timeRemaining` (milliseconds, as an idle deadline reports
2956
- * them) reaches zero, or until every formula is in. Returns true when the graph is complete.
2957
- */
2958
- run(timeRemaining) {
2959
- let visited = 0;
2960
- while (!this.finished) {
2961
- const cells = this.cells ?? this.nextRow();
2962
- if (!cells) continue;
2963
- const next = cells.next();
2964
- if (next.done) {
2965
- this.cells = void 0;
2966
- continue;
2967
- }
2968
- const [col, cell] = next.value;
2969
- if (cell.formula) this.add(this.create(this.sheet, this.row, col, cell), cell);
2970
- if (timeRemaining && ++visited % CHECK_EVERY === 0 && timeRemaining() <= 0) break;
2971
- }
2972
- return this.finished;
2973
- }
2974
- add(node2, cell) {
2975
- this.reverse.addNode(node2);
2976
- if (!node2.legacy && !node2.arrayRange) this.formulas.dynamic.push(node2);
2977
- if (cell.value === null && !node2.keepCached) this.formulas.unvalued.push(node2);
2978
- }
2979
- /** Moves to the next stored row (and sheet), or marks the walk finished. */
2980
- nextRow() {
2981
- for (; ; ) {
2982
- const sheet = this.workbook.sheets[this.sheet];
2983
- if (!sheet) {
2984
- this.finished = true;
2985
- return void 0;
2986
- }
2987
- this.rows ??= sheet.rows.entries();
2988
- const next = this.rows.next();
2989
- if (!next.done) {
2990
- this.row = next.value[0];
2991
- this.cells = next.value[1].entries();
2992
- return this.cells;
2993
- }
2994
- this.rows = void 0;
2995
- this.sheet++;
2996
- }
2997
- }
2998
- };
2999
-
3000
2974
  // xlsx/formula/text-number.ts
3001
2975
  var MONTHS2 = [
3002
2976
  "jan",
@@ -3399,6 +3373,311 @@ function finite(value3) {
3399
3373
  return value3;
3400
3374
  }
3401
3375
 
3376
+ // xlsx/formula/operators.ts
3377
+ var signal = (fn) => {
3378
+ try {
3379
+ return fn();
3380
+ } catch (e) {
3381
+ if (e instanceof ErrorSignal) return e.value;
3382
+ throw e;
3383
+ }
3384
+ };
3385
+ function power(base, exponent) {
3386
+ if (base === 0 && exponent === 0) throw new ErrorSignal(ERR.NUM);
3387
+ if (base === 0 && exponent < 0) throw new ErrorSignal(ERR.DIV0);
3388
+ if (base < 0 && !Number.isInteger(exponent)) {
3389
+ const inverse = 1 / exponent;
3390
+ const odd = Math.round(inverse);
3391
+ if (Math.abs(inverse - odd) < 1e-10 && Math.abs(odd) % 2 === 1) {
3392
+ return -Math.pow(-base, exponent);
3393
+ }
3394
+ throw new ErrorSignal(ERR.NUM);
3395
+ }
3396
+ return Math.pow(base, exponent);
3397
+ }
3398
+ function snapToZero(result2, a2, b) {
3399
+ if (result2 !== 0 && Math.abs(result2) <= Math.max(Math.abs(a2), Math.abs(b)) * 1e-15) return 0;
3400
+ return result2;
3401
+ }
3402
+ function arithmetic(op2, x, y, snap) {
3403
+ if (isError(x)) return x;
3404
+ if (isError(y)) return y;
3405
+ return signal(() => {
3406
+ const a2 = toNumber(x);
3407
+ const b = toNumber(y);
3408
+ let r;
3409
+ switch (op2) {
3410
+ case "+":
3411
+ r = a2 + b;
3412
+ if (snap) r = snapToZero(r, a2, b);
3413
+ break;
3414
+ case "-":
3415
+ r = a2 - b;
3416
+ if (snap) r = snapToZero(r, a2, b);
3417
+ break;
3418
+ case "*":
3419
+ r = a2 * b;
3420
+ break;
3421
+ case "/":
3422
+ if (b === 0) return ERR.DIV0;
3423
+ r = a2 / b;
3424
+ break;
3425
+ default:
3426
+ r = power(a2, b);
3427
+ }
3428
+ return Number.isFinite(r) ? r === 0 ? 0 : r : ERR.NUM;
3429
+ });
3430
+ }
3431
+ function comparison(op2, x, y) {
3432
+ if (isError(x)) return x;
3433
+ if (isError(y)) return y;
3434
+ const c2 = compareScalars(x, y);
3435
+ switch (op2) {
3436
+ case "=":
3437
+ return c2 === 0;
3438
+ case "<>":
3439
+ return c2 !== 0;
3440
+ case "<":
3441
+ return c2 < 0;
3442
+ case ">":
3443
+ return c2 > 0;
3444
+ case "<=":
3445
+ return c2 <= 0;
3446
+ default:
3447
+ return c2 >= 0;
3448
+ }
3449
+ }
3450
+ function concat(x, y) {
3451
+ if (isError(x)) return x;
3452
+ if (isError(y)) return y;
3453
+ return toText(x) + toText(y);
3454
+ }
3455
+ function scalarBinary(op2, x, y, snap = false) {
3456
+ if (op2 === "&") return concat(x, y);
3457
+ if (op2 === "+" || op2 === "-" || op2 === "*" || op2 === "/" || op2 === "^") {
3458
+ return arithmetic(op2, x, y, snap);
3459
+ }
3460
+ return comparison(op2, x, y);
3461
+ }
3462
+ function scalarUnary(op2, x) {
3463
+ if (isError(x)) return x;
3464
+ return signal(() => {
3465
+ const n2 = toNumber(x);
3466
+ const r = op2 === "-" ? -n2 : n2 / 100;
3467
+ return r === 0 ? 0 : r;
3468
+ });
3469
+ }
3470
+ function pick(m, row2, col) {
3471
+ const r = m.rows === 1 ? 0 : row2;
3472
+ const c2 = m.cols === 1 ? 0 : col;
3473
+ if (r >= m.rows || c2 >= m.cols) return ERR.NA;
3474
+ return m.get(r, c2);
3475
+ }
3476
+ function broadcastShape(operands, at) {
3477
+ let rows2 = 1;
3478
+ let cols = 1;
3479
+ for (const m of operands) {
3480
+ rows2 = Math.max(rows2, m.rows);
3481
+ cols = Math.max(cols, m.cols);
3482
+ }
3483
+ if (!operands.some((m) => m.isPadded)) return Matrix.build(rows2, cols, at);
3484
+ let blockRows = 1;
3485
+ let blockCols = 1;
3486
+ for (const m of operands) {
3487
+ blockRows = Math.max(blockRows, m.isPadded ? m.blockRows : m.rows);
3488
+ blockCols = Math.max(blockCols, m.isPadded ? m.blockCols : m.cols);
3489
+ }
3490
+ blockRows = Math.min(blockRows, rows2);
3491
+ blockCols = Math.min(blockCols, cols);
3492
+ const varies = operands.some(
3493
+ (m) => blockRows < rows2 && m.rows === 1 && m.cols > 1 || blockCols < cols && m.cols === 1 && m.rows > 1
3494
+ );
3495
+ if (varies) return Matrix.build(rows2, cols, at);
3496
+ return Matrix.padded(Matrix.build(blockRows, blockCols, at), rows2, cols, at(rows2 - 1, cols - 1));
3497
+ }
3498
+ function broadcast2(a2, b, fn) {
3499
+ if (!(a2 instanceof Matrix) && !(b instanceof Matrix)) return fn(a2, b);
3500
+ const ma = a2 instanceof Matrix ? a2 : new Matrix([[a2]]);
3501
+ const mb = b instanceof Matrix ? b : new Matrix([[b]]);
3502
+ return broadcastShape([ma, mb], (r, c2) => fn(pick(ma, r, c2), pick(mb, r, c2)));
3503
+ }
3504
+ function broadcast1(a2, fn) {
3505
+ return a2 instanceof Matrix ? a2.mapValues(fn) : fn(a2);
3506
+ }
3507
+
3508
+ // xlsx/formula/spill.ts
3509
+ var isSpilledCell = (cell) => cell !== void 0 && "spillAnchor" in cell;
3510
+ function releaseSpilledCell(sheet, row2, col) {
3511
+ const cell = getCell(sheet, row2, col);
3512
+ if (!isSpilledCell(cell)) return;
3513
+ delete cell.spillAnchor;
3514
+ cell.value = null;
3515
+ if (!cell.styleId && !cell.formula && !cell.richText && !cell.arrayRange)
3516
+ deleteCell(sheet, row2, col);
3517
+ }
3518
+ function clearFootprint(sheet, footprint, row2, col) {
3519
+ const { start, end } = footprint;
3520
+ const owned = [];
3521
+ const visit2 = (r, c2, cell) => {
3522
+ if (c2 < start.col || c2 > end.col || r === row2 && c2 === col) return;
3523
+ if (isSpilledCell(cell) && cell.spillAnchor.row === row2 && cell.spillAnchor.col === col)
3524
+ owned.push([r, c2]);
3525
+ };
3526
+ const visitRow = (r, cells) => {
3527
+ if (end.col - start.col + 1 <= cells.size)
3528
+ for (let c2 = start.col; c2 <= end.col; c2++) visit2(r, c2, cells.get(c2));
3529
+ else for (const [c2, cell] of cells) visit2(r, c2, cell);
3530
+ };
3531
+ if (end.row - start.row + 1 <= sheet.rows.size) {
3532
+ for (let r = start.row; r <= end.row; r++) {
3533
+ const cells = sheet.rows.get(r);
3534
+ if (cells) visitRow(r, cells);
3535
+ }
3536
+ } else
3537
+ for (const [r, cells] of sheet.rows) if (r >= start.row && r <= end.row) visitRow(r, cells);
3538
+ for (const [r, c2] of owned) releaseSpilledCell(sheet, r, c2);
3539
+ }
3540
+ function footprintFor(row2, col, m) {
3541
+ const end = { row: row2 + m.rows - 1, col: col + m.cols - 1 };
3542
+ if (end.row > MAX_ROW || end.col > MAX_COL) return void 0;
3543
+ return { start: { row: row2, col }, end };
3544
+ }
3545
+ function footprintFree(sheet, footprint, row2, col, claims) {
3546
+ if (sheet.merges.some((m) => rangesIntersect(m, footprint))) return false;
3547
+ for (let r = footprint.start.row; r <= footprint.end.row; r++) {
3548
+ const cells = sheet.rows.get(r);
3549
+ if (!cells) continue;
3550
+ for (let c2 = footprint.start.col; c2 <= footprint.end.col; c2++) {
3551
+ if (r === row2 && c2 === col) continue;
3552
+ const cell = cells.get(c2);
3553
+ if (!cell) continue;
3554
+ if (cell.formula) return false;
3555
+ if (isSpilledCell(cell)) {
3556
+ const a2 = cell.spillAnchor;
3557
+ if (a2.row === row2 && a2.col === col) continue;
3558
+ if (claims(a2, r, c2)) return false;
3559
+ continue;
3560
+ }
3561
+ if (cell.value !== null) return false;
3562
+ }
3563
+ }
3564
+ return true;
3565
+ }
3566
+ function writeFootprint(sheet, footprint, m) {
3567
+ const { row: row2, col } = footprint.start;
3568
+ for (let r = footprint.start.row; r <= footprint.end.row; r++) {
3569
+ for (let c2 = footprint.start.col; c2 <= footprint.end.col; c2++) {
3570
+ const value3 = cellValueOf(m.get(r - row2, c2 - col));
3571
+ const cell = getCell(sheet, r, c2);
3572
+ if (r === row2 && c2 === col) {
3573
+ if (cell) cell.value = value3;
3574
+ continue;
3575
+ }
3576
+ if (cell) {
3577
+ cell.value = value3;
3578
+ if (!isSpilledCell(cell) || cell.spillAnchor.row !== row2 || cell.spillAnchor.col !== col)
3579
+ cell.spillAnchor = { row: row2, col };
3580
+ } else {
3581
+ const spilled = { value: value3, spillAnchor: { row: row2, col } };
3582
+ putCell(sheet, r, c2, spilled);
3583
+ }
3584
+ }
3585
+ }
3586
+ }
3587
+ function fillArrayRange(sheet, range2, m) {
3588
+ const { row: row2, col } = range2.start;
3589
+ for (let r = range2.start.row; r <= range2.end.row; r++) {
3590
+ for (let c2 = range2.start.col; c2 <= range2.end.col; c2++) {
3591
+ const value3 = cellValueOf(pick(m, r - row2, c2 - col));
3592
+ const cell = getCell(sheet, r, c2);
3593
+ if (cell) cell.value = value3;
3594
+ else putCell(sheet, r, c2, { value: value3 });
3595
+ }
3596
+ }
3597
+ }
3598
+ var cellValueOf = (value3) => value3 === null ? 0 : value3;
3599
+
3600
+ // xlsx/formula/engine-prepare.ts
3601
+ var CHECK_EVERY = 32;
3602
+ var GraphPreparation = class {
3603
+ constructor(workbook, create) {
3604
+ this.workbook = workbook;
3605
+ this.create = create;
3606
+ }
3607
+ workbook;
3608
+ create;
3609
+ reverse = new ReverseIndex();
3610
+ formulas = { dynamic: [], unvalued: [] };
3611
+ /**
3612
+ * The spills stored in the file, by sheet and anchor (`cellKey`): from the anchor to the last
3613
+ * row and column of the cells marked as its results. Until the anchor is evaluated they are
3614
+ * the only record of the cells it covers.
3615
+ */
3616
+ spills = /* @__PURE__ */ new Map();
3617
+ sheet = 0;
3618
+ rows;
3619
+ row = 0;
3620
+ cells;
3621
+ finished = false;
3622
+ /**
3623
+ * Adds formulas to the graph until `timeRemaining` (milliseconds, as an idle deadline reports
3624
+ * them) reaches zero, or until every formula is in. Returns true when the graph is complete.
3625
+ */
3626
+ run(timeRemaining) {
3627
+ let visited = 0;
3628
+ while (!this.finished) {
3629
+ const cells = this.cells ?? this.nextRow();
3630
+ if (!cells) continue;
3631
+ const next = cells.next();
3632
+ if (next.done) {
3633
+ this.cells = void 0;
3634
+ continue;
3635
+ }
3636
+ const [col, cell] = next.value;
3637
+ if (cell.formula) this.add(this.create(this.sheet, this.row, col, cell), cell);
3638
+ else if (isSpilledCell(cell)) this.addSpilled(this.row, col, cell.spillAnchor);
3639
+ if (timeRemaining && ++visited % CHECK_EVERY === 0 && timeRemaining() <= 0) break;
3640
+ }
3641
+ return this.finished;
3642
+ }
3643
+ add(node2, cell) {
3644
+ this.reverse.addNode(node2);
3645
+ if (!node2.legacy && !node2.arrayRange) this.formulas.dynamic.push(node2);
3646
+ if (cell.value === null && !node2.keepCached) this.formulas.unvalued.push(node2);
3647
+ }
3648
+ addSpilled(row2, col, anchor) {
3649
+ if (row2 < anchor.row || col < anchor.col) return;
3650
+ let spills = this.spills.get(this.sheet);
3651
+ if (!spills) this.spills.set(this.sheet, spills = /* @__PURE__ */ new Map());
3652
+ const key = cellKey(anchor.row, anchor.col);
3653
+ const range2 = spills.get(key);
3654
+ if (!range2) spills.set(key, { start: { ...anchor }, end: { row: row2, col } });
3655
+ else {
3656
+ range2.end.row = Math.max(range2.end.row, row2);
3657
+ range2.end.col = Math.max(range2.end.col, col);
3658
+ }
3659
+ }
3660
+ /** Moves to the next stored row (and sheet), or marks the walk finished. */
3661
+ nextRow() {
3662
+ for (; ; ) {
3663
+ const sheet = this.workbook.sheets[this.sheet];
3664
+ if (!sheet) {
3665
+ this.finished = true;
3666
+ return void 0;
3667
+ }
3668
+ this.rows ??= sheet.rows.entries();
3669
+ const next = this.rows.next();
3670
+ if (!next.done) {
3671
+ this.row = next.value[0];
3672
+ this.cells = next.value[1].entries();
3673
+ return this.cells;
3674
+ }
3675
+ this.rows = void 0;
3676
+ this.sheet++;
3677
+ }
3678
+ }
3679
+ };
3680
+
3402
3681
  // xlsx/formula/functions/wildcard.ts
3403
3682
  var lower = (ch) => (ch ?? "").toLowerCase();
3404
3683
  var fold = (text4) => Array.from({ length: text4.length }, (_, i2) => lower(text4[i2]));
@@ -6872,138 +7151,6 @@ var INFO_FUNCTIONS = [
6872
7151
  )
6873
7152
  ];
6874
7153
 
6875
- // xlsx/formula/operators.ts
6876
- var signal = (fn) => {
6877
- try {
6878
- return fn();
6879
- } catch (e) {
6880
- if (e instanceof ErrorSignal) return e.value;
6881
- throw e;
6882
- }
6883
- };
6884
- function power(base, exponent) {
6885
- if (base === 0 && exponent === 0) throw new ErrorSignal(ERR.NUM);
6886
- if (base === 0 && exponent < 0) throw new ErrorSignal(ERR.DIV0);
6887
- if (base < 0 && !Number.isInteger(exponent)) {
6888
- const inverse = 1 / exponent;
6889
- const odd = Math.round(inverse);
6890
- if (Math.abs(inverse - odd) < 1e-10 && Math.abs(odd) % 2 === 1) {
6891
- return -Math.pow(-base, exponent);
6892
- }
6893
- throw new ErrorSignal(ERR.NUM);
6894
- }
6895
- return Math.pow(base, exponent);
6896
- }
6897
- function snapToZero(result2, a2, b) {
6898
- if (result2 !== 0 && Math.abs(result2) <= Math.max(Math.abs(a2), Math.abs(b)) * 1e-15) return 0;
6899
- return result2;
6900
- }
6901
- function arithmetic(op2, x, y, snap) {
6902
- if (isError(x)) return x;
6903
- if (isError(y)) return y;
6904
- return signal(() => {
6905
- const a2 = toNumber(x);
6906
- const b = toNumber(y);
6907
- let r;
6908
- switch (op2) {
6909
- case "+":
6910
- r = a2 + b;
6911
- if (snap) r = snapToZero(r, a2, b);
6912
- break;
6913
- case "-":
6914
- r = a2 - b;
6915
- if (snap) r = snapToZero(r, a2, b);
6916
- break;
6917
- case "*":
6918
- r = a2 * b;
6919
- break;
6920
- case "/":
6921
- if (b === 0) return ERR.DIV0;
6922
- r = a2 / b;
6923
- break;
6924
- default:
6925
- r = power(a2, b);
6926
- }
6927
- return Number.isFinite(r) ? r === 0 ? 0 : r : ERR.NUM;
6928
- });
6929
- }
6930
- function comparison(op2, x, y) {
6931
- if (isError(x)) return x;
6932
- if (isError(y)) return y;
6933
- const c2 = compareScalars(x, y);
6934
- switch (op2) {
6935
- case "=":
6936
- return c2 === 0;
6937
- case "<>":
6938
- return c2 !== 0;
6939
- case "<":
6940
- return c2 < 0;
6941
- case ">":
6942
- return c2 > 0;
6943
- case "<=":
6944
- return c2 <= 0;
6945
- default:
6946
- return c2 >= 0;
6947
- }
6948
- }
6949
- function concat(x, y) {
6950
- if (isError(x)) return x;
6951
- if (isError(y)) return y;
6952
- return toText(x) + toText(y);
6953
- }
6954
- function scalarBinary(op2, x, y, snap = false) {
6955
- if (op2 === "&") return concat(x, y);
6956
- if (op2 === "+" || op2 === "-" || op2 === "*" || op2 === "/" || op2 === "^") {
6957
- return arithmetic(op2, x, y, snap);
6958
- }
6959
- return comparison(op2, x, y);
6960
- }
6961
- function scalarUnary(op2, x) {
6962
- if (isError(x)) return x;
6963
- return signal(() => {
6964
- const n2 = toNumber(x);
6965
- const r = op2 === "-" ? -n2 : n2 / 100;
6966
- return r === 0 ? 0 : r;
6967
- });
6968
- }
6969
- function pick(m, row2, col) {
6970
- const r = m.rows === 1 ? 0 : row2;
6971
- const c2 = m.cols === 1 ? 0 : col;
6972
- if (r >= m.rows || c2 >= m.cols) return ERR.NA;
6973
- return m.get(r, c2);
6974
- }
6975
- function broadcastShape(operands, at) {
6976
- let rows2 = 1;
6977
- let cols = 1;
6978
- for (const m of operands) {
6979
- rows2 = Math.max(rows2, m.rows);
6980
- cols = Math.max(cols, m.cols);
6981
- }
6982
- if (!operands.some((m) => m.isPadded)) return Matrix.build(rows2, cols, at);
6983
- let blockRows = 1;
6984
- let blockCols = 1;
6985
- for (const m of operands) {
6986
- blockRows = Math.max(blockRows, m.isPadded ? m.blockRows : m.rows);
6987
- blockCols = Math.max(blockCols, m.isPadded ? m.blockCols : m.cols);
6988
- }
6989
- blockRows = Math.min(blockRows, rows2);
6990
- blockCols = Math.min(blockCols, cols);
6991
- const varies = operands.some(
6992
- (m) => blockRows < rows2 && m.rows === 1 && m.cols > 1 || blockCols < cols && m.cols === 1 && m.rows > 1
6993
- );
6994
- if (varies) return Matrix.build(rows2, cols, at);
6995
- return Matrix.padded(Matrix.build(blockRows, blockCols, at), rows2, cols, at(rows2 - 1, cols - 1));
6996
- }
6997
- function broadcast2(a2, b, fn) {
6998
- if (!(a2 instanceof Matrix) && !(b instanceof Matrix)) return fn(a2, b);
6999
- const ma = a2 instanceof Matrix ? a2 : new Matrix([[a2]]);
7000
- const mb = b instanceof Matrix ? b : new Matrix([[b]]);
7001
- return broadcastShape([ma, mb], (r, c2) => fn(pick(ma, r, c2), pick(mb, r, c2)));
7002
- }
7003
- function broadcast1(a2, fn) {
7004
- return a2 instanceof Matrix ? a2.mapValues(fn) : fn(a2);
7005
- }
7006
-
7007
7154
  // xlsx/formula/functions/lambda.ts
7008
7155
  var C16 = "Logical";
7009
7156
  function lambdaArg(value3) {
@@ -11741,6 +11888,19 @@ var DEFAULT_XML_LIMITS = {
11741
11888
  maxDepth: 512,
11742
11889
  maxNodes: 5e6
11743
11890
  };
11891
+ var XmlLimitError = class extends Error {
11892
+ code = "xml-limit";
11893
+ /** The limit that was exceeded. */
11894
+ limit;
11895
+ /** Its value: the largest depth or element count allowed. */
11896
+ maximum;
11897
+ constructor(message, limit2, maximum) {
11898
+ super(message);
11899
+ this.name = "XmlLimitError";
11900
+ this.limit = limit2;
11901
+ this.maximum = maximum;
11902
+ }
11903
+ };
11744
11904
  var TAG_RE = /<(\/?)([^\s\/><]+)(?:\s+[^\s=\/><]+\s*=\s*(?:"[^"<]*"|'[^'<]*'))*\s*(\/?)>/y;
11745
11905
  var MARKUP_SKIPS = [
11746
11906
  ["<!--", "-->"],
@@ -11774,11 +11934,22 @@ function checkXmlLimits(xml, label2, limits = {}) {
11774
11934
  continue;
11775
11935
  }
11776
11936
  nodes++;
11777
- if (nodes > maxNodes) throw new Error(`${label2} XML exceeds the limit of ${maxNodes} elements`);
11937
+ if (nodes > maxNodes)
11938
+ throw new XmlLimitError(
11939
+ `${label2} XML exceeds the limit of ${maxNodes} elements`,
11940
+ "maxNodes",
11941
+ maxNodes
11942
+ );
11778
11943
  if (!selfClosing && ++depth > maxDepth)
11779
- throw new Error(`${label2} XML exceeds the nesting depth limit of ${maxDepth}`);
11944
+ throw new XmlLimitError(
11945
+ `${label2} XML exceeds the nesting depth limit of ${maxDepth}`,
11946
+ "maxDepth",
11947
+ maxDepth
11948
+ );
11780
11949
  }
11781
11950
  }
11951
+ var CRLF_DECLARATION = /^<\?xml[^>]*\?>\r\n/;
11952
+ var crlfDeclarations = /* @__PURE__ */ new WeakSet();
11782
11953
  function parseXml(xml, options7 = {}) {
11783
11954
  const label2 = options7.label ?? "OOXML";
11784
11955
  if (/<!DOCTYPE|<!ENTITY/i.test(xml))
@@ -11800,9 +11971,13 @@ function parseXml(xml, options7 = {}) {
11800
11971
  }
11801
11972
  if (parseError || !parsed.documentElement)
11802
11973
  throw new Error(`Invalid ${label2} XML: ${parseError || "missing root element"}`);
11974
+ if (CRLF_DECLARATION.test(xml)) crlfDeclarations.add(parsed);
11803
11975
  return parsed;
11804
11976
  }
11805
- var buildXml = (node2) => new xmldom.XMLSerializer().serializeToString(node2);
11977
+ var buildXml = (node2) => {
11978
+ const xml = new xmldom.XMLSerializer().serializeToString(node2);
11979
+ return crlfDeclarations.has(node2) ? xml.replace(/^(<\?xml[^>]*\?>)\n/, "$1\r\n") : xml;
11980
+ };
11806
11981
  var isElement = (node2) => node2.nodeType === 1;
11807
11982
  var elements = (parent) => Array.from(parent.childNodes).filter(isElement);
11808
11983
  function named(element2, local, ns, lenient = true) {
@@ -11901,6 +12076,12 @@ function parseLiteFragment(xml, container, namespaces) {
11901
12076
  }
11902
12077
  if (lt < 0) break;
11903
12078
  const next = source2.charCodeAt(lt + 1);
12079
+ if (next === 33) {
12080
+ const after = skipCommentOrCdata(source2, lt, top);
12081
+ if (after < 0) return void 0;
12082
+ pos = after;
12083
+ continue;
12084
+ }
11904
12085
  if (next === 47) {
11905
12086
  const gt = source2.indexOf(">", lt);
11906
12087
  if (gt < 0 || stack2.length < 2 || source2.slice(lt + 2, gt).trimEnd() !== top.tagName)
@@ -11921,6 +12102,25 @@ function parseLiteFragment(xml, container, namespaces) {
11921
12102
  }
11922
12103
  return stack2.length === 1 ? root : void 0;
11923
12104
  }
12105
+ var DECLARATIONS = /<!DOCTYPE|<!ENTITY/i;
12106
+ function skipCommentOrCdata(source2, lt, parent) {
12107
+ if (source2.startsWith("<!--", lt)) {
12108
+ const end = source2.indexOf("-->", lt + 4);
12109
+ if (end < 0) return -1;
12110
+ const body2 = source2.slice(lt + 4, end);
12111
+ if (body2.includes("--") || body2.endsWith("-") || DECLARATIONS.test(body2)) return -1;
12112
+ return end + 3;
12113
+ }
12114
+ if (source2.startsWith("<![CDATA[", lt)) {
12115
+ const end = source2.indexOf("]]>", lt + 9);
12116
+ if (end < 0) return -1;
12117
+ const text4 = source2.slice(lt + 9, end);
12118
+ if (DECLARATIONS.test(text4)) return -1;
12119
+ parent.childNodes.push(text4);
12120
+ return end + 3;
12121
+ }
12122
+ return -1;
12123
+ }
11924
12124
  function startTag(source2, from, namespaces) {
11925
12125
  const n2 = source2.length;
11926
12126
  let i2 = from;
@@ -14894,89 +15094,6 @@ function sheetBounds(sheet) {
14894
15094
  return { rows: rows2, cols };
14895
15095
  }
14896
15096
 
14897
- // xlsx/formula/spill.ts
14898
- var isSpilledCell = (cell) => cell !== void 0 && "spillAnchor" in cell;
14899
- function releaseSpilledCell(sheet, row2, col) {
14900
- const cell = getCell(sheet, row2, col);
14901
- if (!isSpilledCell(cell)) return;
14902
- delete cell.spillAnchor;
14903
- cell.value = null;
14904
- if (!cell.styleId && !cell.formula && !cell.richText && !cell.arrayRange)
14905
- deleteCell(sheet, row2, col);
14906
- }
14907
- function clearFootprint(sheet, footprint, row2, col) {
14908
- for (let r = footprint.start.row; r <= footprint.end.row; r++) {
14909
- const cells = sheet.rows.get(r);
14910
- if (!cells) continue;
14911
- for (let c2 = footprint.start.col; c2 <= footprint.end.col; c2++) {
14912
- if (r === row2 && c2 === col) continue;
14913
- const cell = cells.get(c2);
14914
- if (isSpilledCell(cell) && cell.spillAnchor.row === row2 && cell.spillAnchor.col === col) {
14915
- releaseSpilledCell(sheet, r, c2);
14916
- }
14917
- }
14918
- }
14919
- }
14920
- function footprintFor(row2, col, m) {
14921
- const end = { row: row2 + m.rows - 1, col: col + m.cols - 1 };
14922
- if (end.row > MAX_ROW || end.col > MAX_COL) return void 0;
14923
- return { start: { row: row2, col }, end };
14924
- }
14925
- function footprintFree(sheet, footprint, row2, col, claims) {
14926
- if (sheet.merges.some((m) => rangesIntersect(m, footprint))) return false;
14927
- for (let r = footprint.start.row; r <= footprint.end.row; r++) {
14928
- const cells = sheet.rows.get(r);
14929
- if (!cells) continue;
14930
- for (let c2 = footprint.start.col; c2 <= footprint.end.col; c2++) {
14931
- if (r === row2 && c2 === col) continue;
14932
- const cell = cells.get(c2);
14933
- if (!cell) continue;
14934
- if (cell.formula) return false;
14935
- if (isSpilledCell(cell)) {
14936
- const a2 = cell.spillAnchor;
14937
- if (a2.row === row2 && a2.col === col) continue;
14938
- if (claims(a2, r, c2)) return false;
14939
- continue;
14940
- }
14941
- if (cell.value !== null) return false;
14942
- }
14943
- }
14944
- return true;
14945
- }
14946
- function writeFootprint(sheet, footprint, m) {
14947
- const { row: row2, col } = footprint.start;
14948
- for (let r = footprint.start.row; r <= footprint.end.row; r++) {
14949
- for (let c2 = footprint.start.col; c2 <= footprint.end.col; c2++) {
14950
- const value3 = cellValueOf(m.get(r - row2, c2 - col));
14951
- const cell = getCell(sheet, r, c2);
14952
- if (r === row2 && c2 === col) {
14953
- if (cell) cell.value = value3;
14954
- continue;
14955
- }
14956
- if (cell) {
14957
- cell.value = value3;
14958
- if (!isSpilledCell(cell) || cell.spillAnchor.row !== row2 || cell.spillAnchor.col !== col)
14959
- cell.spillAnchor = { row: row2, col };
14960
- } else {
14961
- const spilled = { value: value3, spillAnchor: { row: row2, col } };
14962
- putCell(sheet, r, c2, spilled);
14963
- }
14964
- }
14965
- }
14966
- }
14967
- function fillArrayRange(sheet, range2, m) {
14968
- const { row: row2, col } = range2.start;
14969
- for (let r = range2.start.row; r <= range2.end.row; r++) {
14970
- for (let c2 = range2.start.col; c2 <= range2.end.col; c2++) {
14971
- const value3 = cellValueOf(pick(m, r - row2, c2 - col));
14972
- const cell = getCell(sheet, r, c2);
14973
- if (cell) cell.value = value3;
14974
- else putCell(sheet, r, c2, { value: value3 });
14975
- }
14976
- }
14977
- }
14978
- var cellValueOf = (value3) => value3 === null ? 0 : value3;
14979
-
14980
15097
  // xlsx/formula/engine-host.ts
14981
15098
  var Deferred = class {
14982
15099
  constructor(node2) {
@@ -15901,6 +16018,8 @@ var Engine = class extends EngineStructure {
15901
16018
  preparation;
15902
16019
  /** The prepared formulas the first recalculation checks (see `trustsStoredValues`). */
15903
16020
  prepared;
16021
+ /** Stored spills released when the graph was built: their readers must recalculate. */
16022
+ released = [];
15904
16023
  // ---- the graph ----
15905
16024
  prepare(timeRemaining) {
15906
16025
  if (this.built || this.needsFull) return true;
@@ -15938,10 +16057,33 @@ var Engine = class extends EngineStructure {
15938
16057
  finishPreparation(preparation) {
15939
16058
  this.preparation = void 0;
15940
16059
  this.built = true;
16060
+ this.adoptStoredSpills(preparation.spills);
15941
16061
  this.graphChanged();
15942
16062
  this.reverseIndex = preparation.reverse;
15943
16063
  this.prepared = preparation.formulas;
15944
16064
  }
16065
+ /**
16066
+ * Takes the spills a file stored as their anchors' last footprints, so that overwriting an
16067
+ * anchor or shrinking its result clears the cells it covered before it was ever evaluated here.
16068
+ * Cells marked for an anchor that holds no formula able to spill are released.
16069
+ */
16070
+ adoptStoredSpills(spills) {
16071
+ for (const [s, anchors] of spills)
16072
+ for (const [key, range2] of anchors) {
16073
+ const node2 = this.nodes.get(s)?.get(key);
16074
+ if (node2 && !node2.legacy && !node2.arrayRange) {
16075
+ if (!node2.spill && !node2.blockedSpill) {
16076
+ node2.spill = range2;
16077
+ this.footprints.add(node2);
16078
+ }
16079
+ continue;
16080
+ }
16081
+ const sheet = this.workbook.sheets[s];
16082
+ if (!sheet) continue;
16083
+ clearFootprint(sheet, range2, range2.start.row, range2.start.col);
16084
+ this.released.push({ sheet: s, range: range2 });
16085
+ }
16086
+ }
15945
16087
  // ---- recalculation ----
15946
16088
  recalculateAll() {
15947
16089
  resetArrayBudget();
@@ -15950,6 +16092,7 @@ var Engine = class extends EngineStructure {
15950
16092
  if (this.needsFull) this.releaseAllSpills();
15951
16093
  if (!this.built || this.needsFull) this.build();
15952
16094
  this.needsFull = false;
16095
+ this.released = [];
15953
16096
  this.structuralSeeds.clear();
15954
16097
  this.cycles = /* @__PURE__ */ new Set();
15955
16098
  this.run(new Set(this.allNodes()), true);
@@ -15968,7 +16111,9 @@ var Engine = class extends EngineStructure {
15968
16111
  this.recalculateAll();
15969
16112
  return;
15970
16113
  }
15971
- const changed = [];
16114
+ const changed = this.released;
16115
+ this.released = [];
16116
+ const written = [];
15972
16117
  let structural = false;
15973
16118
  for (const change of changes) {
15974
16119
  const sheet = this.workbook.sheets[change.sheet];
@@ -15988,7 +16133,8 @@ var Engine = class extends EngineStructure {
15988
16133
  seeds.add(this.createNode(change.sheet, row2, col, cell, false));
15989
16134
  structural = true;
15990
16135
  } else if (existing && formula) seeds.add(existing);
15991
- changed.push({ sheet: change.sheet, range: { start: { row: row2, col }, end: { row: row2, col } } });
16136
+ written.push(change);
16137
+ if (!this.footprints.size) continue;
15992
16138
  const anchors = [];
15993
16139
  this.footprintsBy().dependents(
15994
16140
  change.sheet,
@@ -16005,7 +16151,8 @@ var Engine = class extends EngineStructure {
16005
16151
  if (structural) this.graphChanged();
16006
16152
  this.takeStructuralSeeds(seeds);
16007
16153
  const reverse2 = this.reverse();
16008
- for (const area of changed) reverse2.dependents(area.sheet, area.range, seeds);
16154
+ for (const area of [...changed, ...changeAreas(written)])
16155
+ reverse2.dependents(area.sheet, area.range, seeds);
16009
16156
  for (const node2 of this.allNodes()) if (node2.volatile) seeds.add(node2);
16010
16157
  this.run(seeds, false);
16011
16158
  }
@@ -16018,11 +16165,17 @@ var Engine = class extends EngineStructure {
16018
16165
  const prepared = this.prepared;
16019
16166
  this.prepared = void 0;
16020
16167
  if (!prepared) return false;
16021
- const changed = new Set(changes.map((c2) => `${c2.sheet}:${cellKey(c2.row, c2.col)}`));
16022
16168
  const current = (node2) => this.nodes.get(node2.sheet)?.get(cellKey(node2.row, node2.col)) === node2;
16023
- for (const node2 of prepared.dynamic) {
16024
- if (current(node2) && !changed.has(`${node2.sheet}:${cellKey(node2.row, node2.col)}`))
16025
- return false;
16169
+ const dynamic = prepared.dynamic.filter(current);
16170
+ if (dynamic.length) {
16171
+ const changed = /* @__PURE__ */ new Map();
16172
+ for (const c2 of changes) {
16173
+ let keys = changed.get(c2.sheet);
16174
+ if (!keys) changed.set(c2.sheet, keys = /* @__PURE__ */ new Set());
16175
+ keys.add(cellKey(c2.row, c2.col));
16176
+ }
16177
+ for (const node2 of dynamic)
16178
+ if (!changed.get(node2.sheet)?.has(cellKey(node2.row, node2.col))) return false;
16026
16179
  }
16027
16180
  for (const node2 of prepared.unvalued) {
16028
16181
  const cell = this.workbook.sheets[node2.sheet]?.rows.get(node2.row)?.get(node2.col);
@@ -16750,10 +16903,13 @@ var DEFAULT_ZIP_LIMITS = {
16750
16903
  var ZipLimitError = class extends Error {
16751
16904
  code = "ZIP_BOMB";
16752
16905
  limit;
16906
+ /** The check that failed (absent when the error was built without one). */
16907
+ kind;
16753
16908
  constructor(message, details) {
16754
16909
  super(message);
16755
16910
  this.name = "ZipLimitError";
16756
16911
  this.limit = details.limit;
16912
+ this.kind = details.kind;
16757
16913
  }
16758
16914
  };
16759
16915
  var mib = (bytes) => Math.round(bytes / 1048576);
@@ -16776,7 +16932,7 @@ function resolveLimits(limits) {
16776
16932
  maxEntryBytes: limits.maxEntryBytes ?? DEFAULT_ZIP_LIMITS.maxEntryBytes,
16777
16933
  maxTotalBytes: limits.maxTotalBytes ?? DEFAULT_ZIP_LIMITS.maxTotalBytes,
16778
16934
  label: limits.label ?? "ZIP",
16779
- fail: (message, limit2) => create ? create(message, { limit: limit2 }) : new ZipLimitError(message, { limit: limit2 })
16935
+ fail: (message, limit2, kind) => create ? create(message, { limit: limit2, kind }) : new ZipLimitError(message, { limit: limit2, kind })
16780
16936
  };
16781
16937
  }
16782
16938
  function inflateEntryGuarded(entry3, alreadyRead, limits) {
@@ -16799,13 +16955,18 @@ function inflateEntryGuarded(entry3, alreadyRead, limits) {
16799
16955
  size += chunk.byteLength;
16800
16956
  if (size > declared || size > r.maxEntryBytes)
16801
16957
  return abort(
16802
- r.fail(`${r.label} part ${entry3.name} inflates past its declared size`, r.maxEntryBytes)
16958
+ r.fail(
16959
+ `${r.label} part ${entry3.name} inflates past its declared size`,
16960
+ r.maxEntryBytes,
16961
+ size > declared ? "declaredSize" : "maxEntryBytes"
16962
+ )
16803
16963
  );
16804
16964
  if (alreadyRead + size > r.maxTotalBytes)
16805
16965
  return abort(
16806
16966
  r.fail(
16807
16967
  `${r.label} package exceeds the ${mib(r.maxTotalBytes)} MiB uncompressed content limit`,
16808
- r.maxTotalBytes
16968
+ r.maxTotalBytes,
16969
+ "maxTotalBytes"
16809
16970
  )
16810
16971
  );
16811
16972
  chunks.push(chunk);
@@ -16838,26 +16999,29 @@ function guardZip(zip, limits = {}) {
16838
16999
  if (entries.length > r.maxEntries)
16839
17000
  throw r.fail(
16840
17001
  `${r.label} package exceeds the ${r.maxEntries.toLocaleString("en-US")} part limit`,
16841
- r.maxEntries
17002
+ r.maxEntries,
17003
+ "maxEntries"
16842
17004
  );
16843
17005
  let declared = 0;
16844
17006
  for (const entry3 of entries) {
16845
17007
  const original = entry3.unsafeOriginalName;
16846
17008
  if (!isSafePartName(entry3.name) || original !== void 0 && !isSafePartName(original))
16847
- throw r.fail(`${r.label} package has an unsafe part name`, r.maxEntries);
17009
+ throw r.fail(`${r.label} package has an unsafe part name`, r.maxEntries, "partName");
16848
17010
  if (entry3.dir) continue;
16849
17011
  const size = declaredEntrySize(entry3);
16850
17012
  if (size > r.maxEntryBytes)
16851
17013
  throw r.fail(
16852
17014
  `${r.label} part ${entry3.name} exceeds the uncompressed part size limit`,
16853
- r.maxEntryBytes
17015
+ r.maxEntryBytes,
17016
+ "maxEntryBytes"
16854
17017
  );
16855
17018
  declared += size;
16856
17019
  }
16857
17020
  if (declared > r.maxTotalBytes)
16858
17021
  throw r.fail(
16859
17022
  `${r.label} package exceeds the ${mib(r.maxTotalBytes)} MiB uncompressed content limit`,
16860
- r.maxTotalBytes
17023
+ r.maxTotalBytes,
17024
+ "maxTotalBytes"
16861
17025
  );
16862
17026
  const produced = /* @__PURE__ */ new Map();
16863
17027
  let total2 = 0;
@@ -18900,10 +19064,69 @@ function mergeComments(legacy, threaded) {
18900
19064
  (a2, b) => a2.address.row - b.address.row || a2.address.col - b.address.col
18901
19065
  );
18902
19066
  }
18903
- var MAX_INPUT_BYTES = 50 * 1024 * 1024;
18904
- var MAX_PARTS = 1e4;
18905
- var MAX_UNCOMPRESSED_BYTES = 300 * 1024 * 1024;
18906
- var MAX_PART_BYTES = 200 * 1024 * 1024;
19067
+
19068
+ // xlsx/read/limits.ts
19069
+ var DEFAULT_XLSX_LOAD_LIMITS = {
19070
+ maxInputBytes: 50 * 1024 * 1024,
19071
+ maxParts: 1e4,
19072
+ maxPartBytes: 200 * 1024 * 1024,
19073
+ maxTotalBytes: 300 * 1024 * 1024,
19074
+ maxXmlElements: 5e6
19075
+ };
19076
+ var WorkbookTooLargeError = class extends Error {
19077
+ code = "workbook-too-large";
19078
+ /** The limit that was exceeded, as named in {@link XlsxLoadLimits}. */
19079
+ limit;
19080
+ /** The value of that limit when the load failed. */
19081
+ maximum;
19082
+ constructor(message, limit2, maximum, options7) {
19083
+ super(message, options7);
19084
+ this.name = "WorkbookTooLargeError";
19085
+ this.limit = limit2;
19086
+ this.maximum = maximum;
19087
+ }
19088
+ };
19089
+ function resolveLoadLimits(limits = {}) {
19090
+ const resolved = { ...DEFAULT_XLSX_LOAD_LIMITS };
19091
+ for (const name of Object.keys(resolved)) {
19092
+ const value3 = limits[name];
19093
+ if (value3 === void 0) continue;
19094
+ if (!Number.isFinite(value3) || value3 <= 0)
19095
+ throw new RangeError(`limits.${name} must be a positive finite number`);
19096
+ resolved[name] = value3;
19097
+ }
19098
+ return resolved;
19099
+ }
19100
+ var ZIP_LIMIT_NAMES = {
19101
+ maxInputBytes: "maxInputBytes",
19102
+ maxEntries: "maxParts",
19103
+ maxEntryBytes: "maxPartBytes",
19104
+ maxTotalBytes: "maxTotalBytes"
19105
+ };
19106
+ function zipLimitsFor(limits) {
19107
+ return {
19108
+ maxInputBytes: limits.maxInputBytes,
19109
+ maxEntries: limits.maxParts,
19110
+ maxEntryBytes: limits.maxPartBytes,
19111
+ maxTotalBytes: limits.maxTotalBytes,
19112
+ label: "XLSX",
19113
+ createError: (message, { limit: limit2, kind }) => {
19114
+ const name = ZIP_LIMIT_NAMES[kind];
19115
+ return name ? new WorkbookTooLargeError(message, name, limit2) : new ZipLimitError(message, { limit: limit2, kind });
19116
+ }
19117
+ };
19118
+ }
19119
+ function parseDataXml(xml, label2, maxXmlElements = DEFAULT_XLSX_LOAD_LIMITS.maxXmlElements) {
19120
+ try {
19121
+ return parseXml(xml, { label: label2, limits: { maxNodes: maxXmlElements } });
19122
+ } catch (error) {
19123
+ if (error instanceof XmlLimitError && error.limit === "maxNodes")
19124
+ throw new WorkbookTooLargeError(error.message, "maxXmlElements", error.maximum, {
19125
+ cause: error
19126
+ });
19127
+ throw error;
19128
+ }
19129
+ }
18907
19130
  var CONTENT_TYPES = {
18908
19131
  workbook: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
18909
19132
  workbookMacro: "application/vnd.ms-excel.sheet.macroEnabled.main+xml",
@@ -18993,16 +19216,15 @@ var SourceIndex = class {
18993
19216
  };
18994
19217
  var mib2 = (bytes) => Math.round(bytes / 1048576);
18995
19218
  async function readZipParts(input, limits = {}) {
18996
- const maxInput = limits.maxInputBytes ?? MAX_INPUT_BYTES;
18997
- const zipLimits = {
18998
- maxEntries: limits.maxParts ?? MAX_PARTS,
18999
- maxEntryBytes: limits.maxPartBytes ?? MAX_PART_BYTES,
19000
- maxTotalBytes: limits.maxTotalBytes ?? MAX_UNCOMPRESSED_BYTES,
19001
- label: "XLSX"
19002
- };
19219
+ const resolved = resolveLoadLimits(limits);
19220
+ const maxInput = resolved.maxInputBytes;
19003
19221
  const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);
19004
19222
  if (bytes.byteLength > maxInput)
19005
- throw new Error(`XLSX package exceeds the ${mib2(maxInput)} MiB compressed input limit`);
19223
+ throw new WorkbookTooLargeError(
19224
+ `XLSX package exceeds the ${mib2(maxInput)} MiB compressed input limit`,
19225
+ "maxInputBytes",
19226
+ maxInput
19227
+ );
19006
19228
  let loaded;
19007
19229
  try {
19008
19230
  loaded = await JSZip2__default.default.loadAsync(bytes);
@@ -19012,7 +19234,7 @@ async function readZipParts(input, limits = {}) {
19012
19234
  { cause: error }
19013
19235
  );
19014
19236
  }
19015
- const zip = guardZip(loaded, zipLimits);
19237
+ const zip = guardZip(loaded, zipLimitsFor(resolved));
19016
19238
  const parts = /* @__PURE__ */ new Map();
19017
19239
  for (const entry3 of Object.values(zip.files)) {
19018
19240
  if (entry3.dir) continue;
@@ -19219,9 +19441,9 @@ function parseRichString(element2, palette) {
19219
19441
  const text4 = parsed.map((run2) => run2.text).join("");
19220
19442
  return { text: text4, runs: parsed };
19221
19443
  }
19222
- function parseSharedStrings(xml, palette) {
19444
+ function parseSharedStrings(xml, palette, maxXmlElements) {
19223
19445
  if (!xml) return [];
19224
- const root = parseXml(xml, { label: "XLSX shared strings" }).documentElement;
19446
+ const root = parseDataXml(xml, "XLSX shared strings", maxXmlElements).documentElement;
19225
19447
  return xChildren(root, "si").map((si) => parseRichString(si, palette));
19226
19448
  }
19227
19449
 
@@ -24594,21 +24816,50 @@ function rootNamespaces(xml) {
24594
24816
  for (const match2 of (root[2] ?? "").matchAll(DECLARATION2)) out[match2[1] ?? ""] = match2[3] ?? "";
24595
24817
  return out;
24596
24818
  }
24819
+ var SPECIAL = /<[!?]/g;
24820
+ var SECTIONS = [
24821
+ ["<!--", "-->"],
24822
+ ["<![CDATA[", "]]>"],
24823
+ ["<?", "?>"]
24824
+ ];
24825
+ function blankComments(xml) {
24826
+ if (!xml.includes("<!--") && !xml.includes("<![CDATA[")) return xml;
24827
+ const pieces = [];
24828
+ let copied = 0;
24829
+ SPECIAL.lastIndex = 0;
24830
+ for (let match2 = SPECIAL.exec(xml); match2; match2 = SPECIAL.exec(xml)) {
24831
+ const at = match2.index;
24832
+ const section = SECTIONS.find(([open2]) => xml.startsWith(open2, at));
24833
+ if (!section) return void 0;
24834
+ const [open, close2] = section;
24835
+ const end = xml.indexOf(close2, at + open.length);
24836
+ if (end < 0) return void 0;
24837
+ const after = end + close2.length;
24838
+ if (open !== "<?") {
24839
+ pieces.push(xml.slice(copied, at), " ".repeat(after - at));
24840
+ copied = after;
24841
+ }
24842
+ SPECIAL.lastIndex = after;
24843
+ }
24844
+ pieces.push(xml.slice(copied));
24845
+ return pieces.join("");
24846
+ }
24597
24847
  function splitSheetData(xml) {
24598
- if (xml.includes("<!--") || xml.includes("<![CDATA[")) return void 0;
24599
- const namespaces = rootNamespaces(xml);
24600
- const open = OPEN.exec(xml);
24848
+ const plain3 = blankComments(xml);
24849
+ if (plain3 === void 0) return void 0;
24850
+ const namespaces = rootNamespaces(plain3);
24851
+ const open = OPEN.exec(plain3);
24601
24852
  if (!namespaces || !open) return void 0;
24602
24853
  const prefix = (open[1] ?? "").slice(0, -1);
24603
24854
  const ns = namespaces[prefix];
24604
24855
  if (prefix && ns === void 0) return void 0;
24605
24856
  const tagName = `${open[1] ?? ""}sheetData`;
24606
- const openEnd = xml.indexOf(">", open.index);
24857
+ const openEnd = plain3.indexOf(">", open.index);
24607
24858
  if (openEnd < 0) return void 0;
24608
- const attributes = xml.slice(open.index + tagName.length + 1, openEnd);
24859
+ const attributes = plain3.slice(open.index + tagName.length + 1, openEnd);
24609
24860
  if (attributes.trimEnd().endsWith("/") || attributes.includes("xmlns")) return void 0;
24610
- const close2 = xml.indexOf(`</${tagName}`, openEnd);
24611
- if (close2 < 0 || OPEN.test(xml.slice(openEnd))) return void 0;
24861
+ const close2 = plain3.indexOf(`</${tagName}`, openEnd);
24862
+ if (close2 < 0 || OPEN.test(plain3.slice(openEnd))) return void 0;
24612
24863
  const container = new LiteElement(tagName, "sheetData", ns || null);
24613
24864
  const data = parseLiteFragment(xml.slice(openEnd + 1, close2), container, namespaces);
24614
24865
  if (!data) return void 0;
@@ -24813,7 +25064,11 @@ function parseWorksheet(ctx, partName, name, sheetId) {
24813
25064
  return sheet;
24814
25065
  }
24815
25066
  const split = splitSheetData(xml);
24816
- const root = parseXml(split?.xml ?? xml, { label: "XLSX worksheet" }).documentElement;
25067
+ const root = parseDataXml(
25068
+ split?.xml ?? xml,
25069
+ "XLSX worksheet",
25070
+ ctx.maxXmlElements
25071
+ ).documentElement;
24817
25072
  const byName = /* @__PURE__ */ new Map();
24818
25073
  const cfBlocks = [];
24819
25074
  for (const node2 of elements(root)) {
@@ -24887,8 +25142,9 @@ function liftPrintAreas(workbook) {
24887
25142
  return false;
24888
25143
  });
24889
25144
  }
24890
- async function loadXlsx(input) {
24891
- const parts = await readZipParts(input);
25145
+ async function loadXlsx(input, options7 = {}) {
25146
+ const limits = resolveLoadLimits(options7.limits);
25147
+ const parts = await readZipParts(input, limits);
24892
25148
  const source2 = new SourceIndex(parts);
24893
25149
  const workbookPart = source2.workbookPart();
24894
25150
  if (!workbookPart) throw new Error("XLSX package has no workbook part (xl/workbook.xml)");
@@ -24909,7 +25165,8 @@ async function loadXlsx(input) {
24909
25165
  source: source2,
24910
25166
  sharedStrings: parseSharedStrings(
24911
25167
  stringsPart ? source2.text(stringsPart) : void 0,
24912
- styles.palette
25168
+ styles.palette,
25169
+ limits.maxXmlElements
24913
25170
  ),
24914
25171
  xfMap: styles.xfMap,
24915
25172
  date1904: book.date1904,
@@ -24917,7 +25174,8 @@ async function loadXlsx(input) {
24917
25174
  dxfs: styles.dxfs,
24918
25175
  persons: parsePersons(personsPart ? source2.text(personsPart) : void 0),
24919
25176
  dynamicCells: parseDynamicArrayMetadata(metadataPart ? source2.text(metadataPart) : void 0),
24920
- warn
25177
+ warn,
25178
+ maxXmlElements: limits.maxXmlElements
24921
25179
  };
24922
25180
  const rels = source2.rels(workbookPart);
24923
25181
  const sheets = book.sheets.map((entry3) => {
@@ -29229,10 +29487,8 @@ function sheetFormatXml(sheet) {
29229
29487
  const current = { defaultRowHeight: sheet.defaultRowHeight };
29230
29488
  if (sheet.defaultColWidth !== void 0) current.defaultColWidth = sheet.defaultColWidth;
29231
29489
  if (sheet.format && Object.keys(sheet.format).length) current.format = sheet.format;
29232
- const rowLevel = Math.max(
29233
- 0,
29234
- ...[...sheet.rowInfo.values()].map((info) => info.outlineLevel ?? 0)
29235
- );
29490
+ let rowLevel = 0;
29491
+ for (const info of sheet.rowInfo.values()) rowLevel = Math.max(rowLevel, info.outlineLevel ?? 0);
29236
29492
  const colLevel = Math.max(0, ...sheet.columns.map((col) => col.outlineLevel ?? 0));
29237
29493
  if (source2 && sameModel(readSheetFormat(source2), current) && Number(source2.getAttribute("outlineLevelRow") ?? 0) === rowLevel && Number(source2.getAttribute("outlineLevelCol") ?? 0) === colLevel)
29238
29494
  return snapshotXml(sheet, "sheetFormatPr") ?? "";
@@ -29534,11 +29790,10 @@ function pivotCacheDefinitionXml(pivot, workbook, data, recordRel) {
29534
29790
  const items = data.items[index3];
29535
29791
  if (pivot.dateFields?.includes(name) && items.every((v) => typeof v === "number")) {
29536
29792
  const serials = items;
29537
- const latest = Math.max(...serials);
29538
- const maxDate = Number.isInteger(latest) ? latest + 1 : latest;
29793
+ const range2 = dateGroupRange({}, serials);
29539
29794
  const parent = derived.filter((entry3) => entry3.group.field === name).at(-1);
29540
29795
  const link = parent ? `<fieldGroup par="${parent.index}"/>` : "";
29541
- 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>`;
29796
+ 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>`;
29542
29797
  }
29543
29798
  const types = new Set(
29544
29799
  items.map((value3) => value3 === null || value3 === "" ? "blank" : typeof value3)
@@ -30953,7 +31208,8 @@ function setCellValue(ctx, s, row2, col, value3) {
30953
31208
  }
30954
31209
  function setRangeValues(ctx, s, at, values2) {
30955
31210
  const sheet = sheetAt(ctx.workbook, s);
30956
- const width = Math.max(0, ...values2.map((row2) => row2.length));
31211
+ let width = 0;
31212
+ for (const row2 of values2) width = Math.max(width, row2.length);
30957
31213
  if (!values2.length || !width) return;
30958
31214
  const range2 = cellRange(at.row, at.col, at.row + values2.length - 1, at.col + width - 1);
30959
31215
  ctx.run(
@@ -32277,23 +32533,33 @@ function toHtml(cells, theme2) {
32277
32533
  for (let c2 = m.start.col; c2 <= m.end.col; c2++)
32278
32534
  if (r !== m.start.row || c2 !== m.start.col) covered.add(`${r},${c2}`);
32279
32535
  }
32536
+ const styleAttrs = /* @__PURE__ */ new Map();
32537
+ const styleAttr2 = (style3) => {
32538
+ let attr2 = styleAttrs.get(style3);
32539
+ if (attr2 === void 0) {
32540
+ const css = cssFor(style3, theme2);
32541
+ styleAttrs.set(style3, attr2 = css ? `style="${escapeHtml(css)}"` : "");
32542
+ }
32543
+ return attr2;
32544
+ };
32280
32545
  const rows2 = [];
32281
32546
  for (let r = 0; r < cells.rows; r++) {
32282
32547
  const tds = [];
32283
32548
  for (let c2 = 0; c2 < cells.cols; c2++) {
32284
- if (covered.has(`${r},${c2}`)) continue;
32549
+ const key = covered.size || spans3.size || links.size ? `${r},${c2}` : "";
32550
+ if (covered.has(key)) continue;
32285
32551
  const cell = cells.data[r]?.[c2] ?? null;
32286
32552
  const attrs2 = [];
32287
- const span4 = spans3.get(`${r},${c2}`);
32553
+ const span4 = spans3.get(key);
32288
32554
  if (span4 && span4.end.row > span4.start.row)
32289
32555
  attrs2.push(`rowspan="${span4.end.row - span4.start.row + 1}"`);
32290
32556
  if (span4 && span4.end.col > span4.start.col)
32291
32557
  attrs2.push(`colspan="${span4.end.col - span4.start.col + 1}"`);
32292
32558
  if (cell && typeof cell.value === "number") attrs2.push(`x:num="${cell.value}"`);
32293
- const css = cssFor(cell?.style, theme2);
32294
- if (css) attrs2.push(`style="${escapeHtml(css)}"`);
32559
+ const css = styleAttr2(cell?.style);
32560
+ if (css) attrs2.push(css);
32295
32561
  let text4 = escapeHtml(cell?.text ?? "").replace(/\n/g, "<br>");
32296
- const link = links.get(`${r},${c2}`);
32562
+ const link = links.get(key);
32297
32563
  const href = htmlHref(link);
32298
32564
  if (href)
32299
32565
  text4 = `<a href="${escapeHtml(href)}"${link?.tooltip ? ` title="${escapeHtml(link.tooltip)}"` : ""}>${text4}</a>`;
@@ -32601,7 +32867,8 @@ function parseTsv(text4) {
32601
32867
  }
32602
32868
  row2.push(field);
32603
32869
  rows2.push(row2);
32604
- const width = Math.max(...rows2.map((r) => r.length));
32870
+ let width = 0;
32871
+ for (const r of rows2) width = Math.max(width, r.length);
32605
32872
  for (const r of rows2) while (r.length < width) r.push("");
32606
32873
  return rows2;
32607
32874
  }
@@ -32856,10 +33123,16 @@ function copyRange(workbook, s, range2) {
32856
33123
  { length: rows2 },
32857
33124
  () => Array.from({ length: cols }, () => null)
32858
33125
  );
33126
+ const styles = /* @__PURE__ */ new Map();
33127
+ const styleCopy = (id) => {
33128
+ let style3 = styles.get(id ?? 0);
33129
+ if (!style3) styles.set(id ?? 0, style3 = structuredClone(styleAt(workbook, id)));
33130
+ return style3;
33131
+ };
32859
33132
  forEachCellInRange(sheet, clipped, (cell, row2, col) => {
32860
33133
  const clip = {
32861
33134
  value: cell.value,
32862
- style: structuredClone(styleAt(workbook, cell.styleId)),
33135
+ style: styleCopy(cell.styleId),
32863
33136
  text: displayText(workbook, cell)
32864
33137
  };
32865
33138
  if (cell.formula !== void 0) clip.formula = cell.formula;
@@ -33137,7 +33410,7 @@ function setColumnWidth(ctx, s, cols, width, measure3) {
33137
33410
  ctx.run(
33138
33411
  "Column width",
33139
33412
  "view",
33140
- [{ kind: "sheet", sheet: s }],
33413
+ [{ kind: "parts", sheet: s, parts: ["columns"] }],
33141
33414
  () => editColumns(sheet, cols, (info) => {
33142
33415
  const next = widths.get(info.min);
33143
33416
  if (next === void 0) {
@@ -33172,7 +33445,7 @@ function setRowHeight(ctx, s, rows2, height) {
33172
33445
  ctx.run(
33173
33446
  "Row height",
33174
33447
  "view",
33175
- [{ kind: "sheet", sheet: s }],
33448
+ [{ kind: "rowInfo", sheet: s, rows: rows2 }],
33176
33449
  () => {
33177
33450
  for (const row2 of rows2) {
33178
33451
  const info = { ...sheet.rowInfo.get(row2) };
@@ -33202,7 +33475,9 @@ function setHidden(ctx, s, axis, indices, hidden) {
33202
33475
  ctx.run(
33203
33476
  `${hidden ? "Hide" : "Unhide"} ${noun}`,
33204
33477
  "view",
33205
- [{ kind: "sheet", sheet: s }],
33478
+ [
33479
+ axis === "col" ? { kind: "parts", sheet: s, parts: ["columns"] } : { kind: "rowInfo", sheet: s, rows: indices }
33480
+ ],
33206
33481
  () => {
33207
33482
  if (axis === "col") {
33208
33483
  editColumns(sheet, indices, (info) => {
@@ -33796,6 +34071,30 @@ function shiftEdgeCells(sheet, spec2, phase) {
33796
34071
  return out;
33797
34072
  }
33798
34073
 
34074
+ // xlsx/edit/clone-cell.ts
34075
+ function cloneCell(cell) {
34076
+ const copy2 = { ...cell };
34077
+ const fields = copy2;
34078
+ for (const key of Object.keys(fields)) {
34079
+ const value3 = fields[key];
34080
+ if (typeof value3 === "object" && value3 !== null) fields[key] = structuredClone(value3);
34081
+ }
34082
+ return copy2;
34083
+ }
34084
+
34085
+ // xlsx/edit/history-rows.ts
34086
+ function captureRowInfo(sheet, rows2) {
34087
+ return [...new Set(rows2)].map((row2) => {
34088
+ const info = sheet.rowInfo.get(row2);
34089
+ return [row2, info && structuredClone(info)];
34090
+ });
34091
+ }
34092
+ function restoreRowInfo(sheet, entries) {
34093
+ for (const [row2, info] of entries)
34094
+ if (info) sheet.rowInfo.set(row2, structuredClone(info));
34095
+ else sheet.rowInfo.delete(row2);
34096
+ }
34097
+
33799
34098
  // xlsx/edit/history.ts
33800
34099
  var SETTING_KEYS = [
33801
34100
  "structureLocked",
@@ -33823,12 +34122,14 @@ function restoreSettings(workbook, settings) {
33823
34122
  var PROBE_LIMIT = 4096;
33824
34123
  function captureCells(sheet, ranges) {
33825
34124
  const cells = [];
33826
- const seen = /* @__PURE__ */ new Set();
34125
+ const seen = ranges.length > 1 ? /* @__PURE__ */ new Set() : void 0;
33827
34126
  const take2 = (cell, row2, col) => {
33828
- const key = `${row2},${col}`;
33829
- if (seen.has(key)) return;
33830
- seen.add(key);
33831
- cells.push([row2, col, structuredClone(cell)]);
34127
+ if (seen) {
34128
+ const key = cellKey(row2, col);
34129
+ if (seen.has(key)) return;
34130
+ seen.add(key);
34131
+ }
34132
+ cells.push([row2, col, cloneCell(cell)]);
33832
34133
  };
33833
34134
  for (const raw2 of ranges) {
33834
34135
  const range2 = normalizeRange(raw2);
@@ -33880,6 +34181,8 @@ function captureScope(workbook, scope, before) {
33880
34181
  if (!sheet) throw new RangeError(`No sheet at index ${scope.sheet}`);
33881
34182
  if (scope.kind === "sheet")
33882
34183
  return { kind: "sheet", sheet: scope.sheet, data: structuredClone(sheet) };
34184
+ if (scope.kind === "rowInfo")
34185
+ return { kind: "rowInfo", sheet: scope.sheet, rows: captureRowInfo(sheet, scope.rows) };
33883
34186
  if (scope.kind === "parts") {
33884
34187
  const data = {};
33885
34188
  for (const part of scope.parts) if (sheet[part] !== void 0) data[part] = sheet[part];
@@ -33903,7 +34206,7 @@ function restoreShift(workbook, snapshot) {
33903
34206
  if (!sheet) return;
33904
34207
  const shift2 = snapshot.phase === "before" ? { ...spec2.shift, count: -spec2.shift.count } : spec2.shift;
33905
34208
  moveCellsRaw(sheet, shift2, spec2.band);
33906
- for (const [row2, col, cell] of snapshot.cells) putCell(sheet, row2, col, structuredClone(cell));
34209
+ for (const [row2, col, cell] of snapshot.cells) putCell(sheet, row2, col, cloneCell(cell));
33907
34210
  restoreRefs(workbook, snapshot.data);
33908
34211
  workbook.activeSheet = snapshot.activeSheet;
33909
34212
  }
@@ -33931,6 +34234,7 @@ function restoreSnapshot(workbook, snapshot) {
33931
34234
  }
33932
34235
  const sheet = workbook.sheets[snapshot.sheet];
33933
34236
  if (!sheet) return;
34237
+ if (snapshot.kind === "rowInfo") return restoreRowInfo(sheet, snapshot.rows);
33934
34238
  if (snapshot.kind === "parts") {
33935
34239
  const target2 = sheet;
33936
34240
  const data = structuredClone(snapshot.data);
@@ -33951,18 +34255,51 @@ function restoreSnapshot(workbook, snapshot) {
33951
34255
  forEachCellInRange(sheet, range2, (_cell, row2, col) => doomed.push([row2, col]));
33952
34256
  for (const [row2, col] of doomed) deleteCell(sheet, row2, col);
33953
34257
  }
33954
- for (const [row2, col, cell] of snapshot.cells) putCell(sheet, row2, col, structuredClone(cell));
34258
+ for (const [row2, col, cell] of snapshot.cells) putCell(sheet, row2, col, cloneCell(cell));
34259
+ }
34260
+ function rowMajor(cells) {
34261
+ for (let i2 = 1; i2 < cells.length; i2++) {
34262
+ const [row0, col0] = cells[i2 - 1];
34263
+ const [row1, col1] = cells[i2];
34264
+ if (row1 < row0 || row1 === row0 && col1 <= col0) return false;
34265
+ }
34266
+ return true;
33955
34267
  }
33956
34268
  function touchedCells(step) {
33957
34269
  const out = [];
33958
- const seen = /* @__PURE__ */ new Set();
34270
+ const lists = step.entries.flatMap((entry3) => [entry3.before, entry3.after]).filter((snapshot) => snapshot.kind === "cells" && snapshot.cells.length > 0);
34271
+ const [first2, second, ...rest] = lists;
34272
+ if (first2 && !rest.length && (!second || second.sheet === first2.sheet)) {
34273
+ const sheet = first2.sheet;
34274
+ for (const [row2, col] of first2.cells) out.push({ sheet, row: row2, col });
34275
+ if (!second) return out;
34276
+ if (rowMajor(first2.cells) && rowMajor(second.cells)) {
34277
+ let i2 = 0;
34278
+ for (const [row2, col] of second.cells) {
34279
+ const key = cellKey(row2, col);
34280
+ while (i2 < first2.cells.length) {
34281
+ const [r, c2] = first2.cells[i2];
34282
+ if (cellKey(r, c2) >= key) break;
34283
+ i2++;
34284
+ }
34285
+ const at = first2.cells[i2];
34286
+ if (at && cellKey(at[0], at[1]) === key) continue;
34287
+ out.push({ sheet, row: row2, col });
34288
+ }
34289
+ return out;
34290
+ }
34291
+ out.length = 0;
34292
+ }
34293
+ const seen = /* @__PURE__ */ new Map();
33959
34294
  for (const entry3 of step.entries)
33960
34295
  for (const snapshot of [entry3.before, entry3.after]) {
33961
34296
  if (snapshot.kind !== "cells") continue;
34297
+ let keys = seen.get(snapshot.sheet);
34298
+ if (!keys) seen.set(snapshot.sheet, keys = /* @__PURE__ */ new Set());
33962
34299
  for (const [row2, col] of snapshot.cells) {
33963
- const key = `${snapshot.sheet},${row2},${col}`;
33964
- if (seen.has(key)) continue;
33965
- seen.add(key);
34300
+ const key = cellKey(row2, col);
34301
+ if (keys.has(key)) continue;
34302
+ keys.add(key);
33966
34303
  out.push({ sheet: snapshot.sheet, row: row2, col });
33967
34304
  }
33968
34305
  }
@@ -34059,7 +34396,7 @@ var SessionCalculator = class {
34059
34396
  }
34060
34397
  this.calc.discardPreparation();
34061
34398
  if (structural) this.staleGraph = true;
34062
- else this.dirty.push(...touchedCells(step));
34399
+ else for (const cell of touchedCells(step)) this.dirty.push(cell);
34063
34400
  return;
34064
34401
  }
34065
34402
  if (hint && !this.staleGraph) {
@@ -34078,7 +34415,7 @@ var SessionCalculator = class {
34078
34415
  this.calc.discardPreparation();
34079
34416
  if (!this.enabled) return;
34080
34417
  if (structural) this.staleGraph = true;
34081
- else this.dirty.push(...cells);
34418
+ else for (const cell of cells) this.dirty.push(cell);
34082
34419
  return;
34083
34420
  }
34084
34421
  this.recalc(structural, () => cells);
@@ -35140,8 +35477,16 @@ function insertTimeline(ctx, s, ref) {
35140
35477
  const pivot = sheet.pivotTables?.find((entry3) => entry3.name === ref.pivot);
35141
35478
  if (!pivot || !pivot.dateFields?.includes(ref.field))
35142
35479
  throw new Error("Choose a PivotTable with a date field.");
35143
- const dates = pivot.records.map((record) => record[pivot.fields.indexOf(ref.field)]).filter((value3) => typeof value3 === "number");
35144
- if (!dates.length) throw new Error("Choose a PivotTable with a date field.");
35480
+ const column2 = pivot.fields.indexOf(ref.field);
35481
+ let earliest = Infinity;
35482
+ let latest = -Infinity;
35483
+ for (const record of pivot.records) {
35484
+ const value3 = record[column2];
35485
+ if (typeof value3 !== "number") continue;
35486
+ earliest = Math.min(earliest, value3);
35487
+ latest = Math.max(latest, value3);
35488
+ }
35489
+ if (earliest > latest) throw new Error("Choose a PivotTable with a date field.");
35145
35490
  const taken = /* @__PURE__ */ new Set([
35146
35491
  ...(workbook.slicers?.slicers ?? []).map((entry3) => entry3.name.toLowerCase()),
35147
35492
  ...(workbook.slicers?.timelines ?? []).map((entry3) => entry3.name.toLowerCase()),
@@ -35159,8 +35504,8 @@ function insertTimeline(ctx, s, ref) {
35159
35504
  "_"
35160
35505
  );
35161
35506
  const bounds = boundsOfSerialRange(
35162
- serialToIso(Math.min(...dates), workbook.date1904),
35163
- serialToIso(Math.max(...dates), workbook.date1904)
35507
+ serialToIso(earliest, workbook.date1904),
35508
+ serialToIso(latest, workbook.date1904)
35164
35509
  );
35165
35510
  const metrics = createGridMetrics(sheet, { zoom: 100 });
35166
35511
  let right2 = 0;
@@ -36323,12 +36668,13 @@ function span2(from, to) {
36323
36668
  }
36324
36669
  function outlineRows(ctx, s, from, to, delta) {
36325
36670
  const sheet = sheetAt(ctx.workbook, s);
36671
+ const rows2 = span2(from, to);
36326
36672
  ctx.run(
36327
36673
  delta > 0 ? "Group rows" : "Ungroup rows",
36328
36674
  "structure",
36329
- [{ kind: "sheet", sheet: s }],
36675
+ [{ kind: "rowInfo", sheet: s, rows: rows2 }],
36330
36676
  () => {
36331
- for (const row2 of span2(from, to)) {
36677
+ for (const row2 of rows2) {
36332
36678
  const info = { ...sheet.rowInfo.get(row2) };
36333
36679
  const level2 = nextLevel(info.outlineLevel, delta);
36334
36680
  if (level2) info.outlineLevel = level2;
@@ -36348,7 +36694,7 @@ function outlineColumns(ctx, s, from, to, delta) {
36348
36694
  ctx.run(
36349
36695
  delta > 0 ? "Group columns" : "Ungroup columns",
36350
36696
  "structure",
36351
- [{ kind: "sheet", sheet: s }],
36697
+ [{ kind: "parts", sheet: s, parts: ["columns"] }],
36352
36698
  () => editColumns(sheet, span2(from, to), (info) => {
36353
36699
  const level2 = nextLevel(info.outlineLevel, delta);
36354
36700
  if (level2) info.outlineLevel = level2;
@@ -36371,7 +36717,7 @@ function setDefaultColumnWidth(ctx, s, width) {
36371
36717
  ctx.run(
36372
36718
  "Standard width",
36373
36719
  "format",
36374
- [{ kind: "sheet", sheet: s }],
36720
+ [{ kind: "parts", sheet: s, parts: ["defaultColWidth"] }],
36375
36721
  () => {
36376
36722
  if (width === void 0) Reflect.deleteProperty(sheet, "defaultColWidth");
36377
36723
  else sheet.defaultColWidth = width;
@@ -38573,6 +38919,15 @@ function mergeFont(base, font) {
38573
38919
  if (value3 !== void 0) out[key] = value3;
38574
38920
  return out;
38575
38921
  }
38922
+ function cellFont(font, defaultFont) {
38923
+ const out = { ...font };
38924
+ if (!out.name && !out.scheme) {
38925
+ if (defaultFont.name) out.name = defaultFont.name;
38926
+ if (defaultFont.scheme) out.scheme = defaultFont.scheme;
38927
+ }
38928
+ if (!out.size && defaultFont.size) out.size = defaultFont.size;
38929
+ return out;
38930
+ }
38576
38931
  function fontView(font, theme2) {
38577
38932
  const family = font.scheme === "major" ? theme2.majorFont || font.name || "Calibri Light" : font.scheme === "minor" ? theme2.minorFont || font.name || "Calibri" : font.name || theme2.minorFont || "Calibri";
38578
38933
  const view = {
@@ -38697,14 +39052,7 @@ function cellView(workbook, sheetIndex2, row2, col, cf, options7 = {}) {
38697
39052
  const style3 = styleAt(workbook, effectiveStyleId(sheet, row2, col));
38698
39053
  const conditional = cf?.at(row2, col);
38699
39054
  const dxf = conditional?.style;
38700
- const defaultFont = workbook.styles[0]?.font ?? {};
38701
- const base = { ...style3.font };
38702
- if (!base.name && !base.scheme) {
38703
- if (defaultFont.name) base.name = defaultFont.name;
38704
- if (defaultFont.scheme) base.scheme = defaultFont.scheme;
38705
- }
38706
- if (!base.size && defaultFont.size) base.size = defaultFont.size;
38707
- const font = mergeFont(base, dxf?.font);
39055
+ const font = mergeFont(cellFont(style3.font, workbook.styles[0]?.font ?? {}), dxf?.font);
38708
39056
  const formulaText = sheet.view.showFormulas && cell?.formula !== void 0 ? `=${cell.formula}` : void 0;
38709
39057
  const shown = formulaText !== void 0 ? { text: formulaText } : displayText2(value3, style3, dxf?.numFmt ?? style3.numFmt, workbook, sheet);
38710
39058
  const fontViewResolved = fontView(font, workbook.theme);
@@ -38955,10 +39303,11 @@ function autoGrowRows(ctx, s, rows2, measure3 = approximateMeasure) {
38955
39303
  updates.push([row2, next]);
38956
39304
  }
38957
39305
  if (!updates.length) return [];
39306
+ const changed = updates.map(([row2]) => row2);
38958
39307
  ctx.run(
38959
39308
  "Row height",
38960
39309
  "view",
38961
- [{ kind: "sheet", sheet: s }],
39310
+ [{ kind: "rowInfo", sheet: s, rows: changed }],
38962
39311
  () => {
38963
39312
  for (const [row2, height] of updates) {
38964
39313
  const info = { ...sheet.rowInfo.get(row2) };
@@ -38970,7 +39319,7 @@ function autoGrowRows(ctx, s, rows2, measure3 = approximateMeasure) {
38970
39319
  },
38971
39320
  { sheet: s, structural: true }
38972
39321
  );
38973
- return updates.map(([row2]) => row2);
39322
+ return changed;
38974
39323
  }
38975
39324
  var MAX_REFIT_ROWS = 1e4;
38976
39325
  function rowsToRefit(sheet, ranges) {
@@ -40300,14 +40649,24 @@ function formatAxisValue(value3, percent = false) {
40300
40649
  return `${v < 0 ? "-" : ""}${grouped}${frac ? `.${frac}` : ""}`;
40301
40650
  }
40302
40651
 
40652
+ // chart/extent.ts
40653
+ function extentOf(values2) {
40654
+ let min = Infinity;
40655
+ let max = -Infinity;
40656
+ for (const value3 of values2) {
40657
+ min = Math.min(min, value3);
40658
+ max = Math.max(max, value3);
40659
+ }
40660
+ return { min, max };
40661
+ }
40662
+
40303
40663
  // chart/axis-range.ts
40304
40664
  function computeLogValueRange(series, logBase) {
40305
40665
  const allValues = series.flatMap((item) => item.values).filter((value3) => value3 !== null && Number.isFinite(value3) && value3 > 0);
40306
40666
  if (allValues.length === 0) {
40307
40667
  return { min: 1, max: logBase, span: 1, logScale: true, logBase };
40308
40668
  }
40309
- const dataMin = Math.min(...allValues);
40310
- const dataMax = Math.max(...allValues);
40669
+ const { min: dataMin, max: dataMax } = extentOf(allValues);
40311
40670
  const logMin = Math.floor(Math.log(dataMin) / Math.log(logBase));
40312
40671
  const logMax = Math.ceil(Math.log(dataMax) / Math.log(logBase));
40313
40672
  const min = logBase ** logMin;
@@ -41334,8 +41693,7 @@ function computeHistogramBins(values2, options7, format = String) {
41334
41693
  });
41335
41694
  }
41336
41695
  if (regular.length > 0) {
41337
- const min = Math.min(...regular.map((item) => item.value));
41338
- const max = Math.max(...regular.map((item) => item.value));
41696
+ const { min, max } = extentOf(regular.map((item) => item.value));
41339
41697
  const requestedSize = options7.binSize && options7.binSize > 0 ? options7.binSize : void 0;
41340
41698
  const requestedCount = options7.binCount && options7.binCount > 0 ? options7.binCount : void 0;
41341
41699
  const start = requestedSize ? Math.floor(min / requestedSize) * requestedSize : min;
@@ -41463,8 +41821,9 @@ function waterfallView(chart, model, ctx) {
41463
41821
  colors: { increase: role(0), decrease: role(1), total: role(2) }
41464
41822
  };
41465
41823
  const ends = steps.flatMap((step) => [step.startValue, step.endValue]);
41824
+ const range2 = extentOf(ends);
41466
41825
  model.valueAxis = {
41467
- ...ends.length ? niceScale(Math.min(...ends), Math.max(...ends)) : niceScale(0, 1),
41826
+ ...ends.length ? niceScale(range2.min, range2.max) : niceScale(0, 1),
41468
41827
  percent: false
41469
41828
  };
41470
41829
  const labels = model.categories;
@@ -41580,7 +41939,8 @@ function chartSummaryView(chart, theme2, options7 = {}) {
41580
41939
  s.xValues = s.values.map((_, k) => numeric2 ? toNumber2(cats[k] ?? null) : k + 1);
41581
41940
  });
41582
41941
  const xs = series.flatMap((s) => s.xValues ?? []).filter((x) => x !== null);
41583
- model.xAxis = xs.length ? niceScale(Math.min(...xs), Math.max(...xs)) : niceScale(0, 1);
41942
+ const range2 = extentOf(xs);
41943
+ model.xAxis = xs.length ? niceScale(range2.min, range2.max) : niceScale(0, 1);
41584
41944
  }
41585
41945
  if (type === "stock") model.stock = stockView(chart.stock, ctx);
41586
41946
  if (type === "bubble") bubbleView(chart, model, ctx.evaluateRef);
@@ -41857,8 +42217,9 @@ function fitChartTrendline(options7, xVals, yVals) {
41857
42217
  }
41858
42218
  const model = fitModel(options7, xVals, yVals);
41859
42219
  if (!model) return noFit();
41860
- const startX = Math.min(...xVals) - (options7.backward ?? 0);
41861
- const endX = Math.max(...xVals) + (options7.forward ?? 0);
42220
+ const xRange = extentOf(xVals);
42221
+ const startX = xRange.min - (options7.backward ?? 0);
42222
+ const endX = xRange.max + (options7.forward ?? 0);
41862
42223
  const steps = Math.max(Math.ceil((endX - startX) * 4), 20);
41863
42224
  const points = [];
41864
42225
  for (let step = 0; step <= steps; step++) {
@@ -42427,7 +42788,7 @@ function cartesianAxes(model, area, out) {
42427
42788
  const cats = Math.max(1, model.categories.length);
42428
42789
  const catW = Math.min(
42429
42790
  area.w * 0.3,
42430
- Math.max(...model.categories.map((c2) => textWidth(c2, categorySize)), 8) + 6
42791
+ Math.max(extentOf(model.categories.map((c2) => textWidth(c2, categorySize))).max, 8) + 6
42431
42792
  );
42432
42793
  const second = horizontal2 ? void 0 : model.secondaryAxis;
42433
42794
  const secondLabels = second?.ticks.map((t) => axisTickText(t, model.axes?.secondary, second.percent)) ?? [];
@@ -42616,7 +42977,7 @@ function computeBubbleRadius(sizeVal, maxBubble, medianRadius, options7) {
42616
42977
  return medianRadius * scale2 * 0.5 + ratio * medianRadius * scale2 * 1.5;
42617
42978
  }
42618
42979
  function maxBubbleSize(sizes) {
42619
- return sizes.length > 0 ? Math.max(1, ...sizes.map(Math.abs)) : 1;
42980
+ return Math.max(1, extentOf(sizes.map(Math.abs)).max);
42620
42981
  }
42621
42982
  function medianBubbleRadius(plotWidth, plotHeight) {
42622
42983
  return Math.min(plotWidth, plotHeight) * 0.04;
@@ -43229,13 +43590,11 @@ function chartLegendSvg(model, area, frame, options7) {
43229
43590
  chartAreaRect(model, "legend", { x: manual.x, y: manual.y, w: manual.width, h: manual.height })
43230
43591
  ];
43231
43592
  const baselineOffset = font ? (font.ascent - font.descent) / 2 : size * 0.35;
43593
+ const widest = extentOf(widths).max;
43232
43594
  entries.forEach((entry3, i2) => {
43233
43595
  const available = horizontal2 ? chartTextWidth(entry3.label, attrs2, options7) : Math.max(0, rowWidth - size / 2 - keySize - keyGap);
43234
43596
  const label2 = fitChartText(entry3.label, available, attrs2, options7);
43235
- const contentWidth = Math.min(
43236
- horizontal2 ? widths[i2] ?? 0 : Math.max(...widths),
43237
- rowWidth - size / 2
43238
- );
43597
+ const contentWidth = Math.min(horizontal2 ? widths[i2] ?? 0 : widest, rowWidth - size / 2);
43239
43598
  const x = horizontal2 ? horizontalX : manual.x + Math.max(size / 4, (rowWidth - contentWidth) / 2);
43240
43599
  const centerY = manual.y + (horizontal2 ? 0 : i2 * rowHeight) + rowHeight / 2;
43241
43600
  markup.push(rect(x, centerY - keySize / 2, keySize, keySize, entry3.color));
@@ -43307,7 +43666,7 @@ function automaticLegend(model, area, out, options7, bounds) {
43307
43666
  }
43308
43667
  const width = Math.min(
43309
43668
  area.w * 0.35,
43310
- Math.max(...entries.map((e) => chartTextWidth(e.label, attrs2, options7))) + 22
43669
+ extentOf(entries.map((e) => chartTextWidth(e.label, attrs2, options7))).max + 22
43311
43670
  );
43312
43671
  const height = entries.length * rowH;
43313
43672
  const x = pos === "l" ? area.x + 4 : area.x + area.w - width;
@@ -55333,6 +55692,53 @@ function applyThemeColors(host, previous, colors) {
55333
55692
  return Object.keys(vars);
55334
55693
  }
55335
55694
 
55695
+ // xlsx/ui/selection-format.ts
55696
+ function selectionFormatting(workbook, sheetIndex2, ranges) {
55697
+ const values2 = {
55698
+ bold: /* @__PURE__ */ new Set(),
55699
+ italic: /* @__PURE__ */ new Set(),
55700
+ underline: /* @__PURE__ */ new Set(),
55701
+ fontFamily: /* @__PURE__ */ new Set(),
55702
+ fontSize: /* @__PURE__ */ new Set(),
55703
+ alignment: /* @__PURE__ */ new Set(),
55704
+ numberFormat: /* @__PURE__ */ new Set()
55705
+ };
55706
+ const sheet = workbook?.sheets[sheetIndex2];
55707
+ let remaining = 4096;
55708
+ let complete = true;
55709
+ if (workbook && sheet)
55710
+ outer: for (const raw2 of ranges) {
55711
+ const range2 = normalizeRange(raw2);
55712
+ for (let row2 = range2.start.row; row2 <= range2.end.row; row2++) {
55713
+ for (let col = range2.start.col; col <= range2.end.col; col++) {
55714
+ if (--remaining < 0) {
55715
+ complete = false;
55716
+ break outer;
55717
+ }
55718
+ const style3 = styleAt(workbook, effectiveStyleId(sheet, row2, col));
55719
+ values2.bold.add(Boolean(style3.font.bold));
55720
+ values2.italic.add(Boolean(style3.font.italic));
55721
+ values2.underline.add(Boolean(style3.font.underline));
55722
+ values2.fontFamily.add(style3.font.name ?? "Aptos");
55723
+ values2.fontSize.add(style3.font.size ?? 11);
55724
+ values2.alignment.add(style3.alignment?.horizontal ?? "general");
55725
+ values2.numberFormat.add(style3.numFmt ?? "General");
55726
+ }
55727
+ }
55728
+ }
55729
+ const single = (set) => complete && set.size === 1 ? [...set][0] : null;
55730
+ return {
55731
+ bold: single(values2.bold),
55732
+ italic: single(values2.italic),
55733
+ underline: single(values2.underline),
55734
+ fontFamily: single(values2.fontFamily),
55735
+ fontSize: single(values2.fontSize),
55736
+ alignment: single(values2.alignment),
55737
+ numberFormat: single(values2.numberFormat),
55738
+ formattingComplete: complete
55739
+ };
55740
+ }
55741
+
55336
55742
  exports.ACCOUNTING_FORMATS = ACCOUNTING_FORMATS;
55337
55743
  exports.ALL_RANGE = ALL_RANGE;
55338
55744
  exports.AUTOSUM_FUNCTIONS = AUTOSUM_FUNCTIONS;
@@ -55514,6 +55920,7 @@ exports.selectCell = selectCell;
55514
55920
  exports.selectSpecial = selectSpecial;
55515
55921
  exports.selectTab = selectTab;
55516
55922
  exports.selectionCellCount = selectionCellCount;
55923
+ exports.selectionFormatting = selectionFormatting;
55517
55924
  exports.selectionRef = selectionRef;
55518
55925
  exports.setTabHidden = setTabHidden;
55519
55926
  exports.sheetBaseName = sheetBaseName;