ooxml-core 1.20.0 → 1.22.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 (422) hide show
  1. package/README.md +35 -0
  2. package/dist/{PptxHandler-TEKISCJO.cjs → PptxHandler-DNSXWTQV.cjs} +3 -3
  3. package/dist/{PptxHandler-FYD7IYXT.mjs → PptxHandler-FSKKPZZC.mjs} +3 -3
  4. package/dist/PptxHandler-H7MEWJJJ.mjs +4 -0
  5. package/dist/{PresentationBuilder-IMB4DVRN.mjs → PresentationBuilder-7TSENZTX.mjs} +2 -2
  6. package/dist/{PresentationBuilder-NCKASKXU.cjs → PresentationBuilder-A5NI35VN.cjs} +5 -5
  7. package/dist/{PresentationBuilder-EYI6Z2JP.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 +39159 -14352
  11. package/dist/automation/index.d.ts +5 -0
  12. package/dist/automation/index.d.ts.map +1 -1
  13. package/dist/automation/index.mjs +39145 -14353
  14. package/dist/automation/node.cjs +37 -0
  15. package/dist/automation/node.d.ts +32 -1
  16. package/dist/automation/node.d.ts.map +1 -1
  17. package/dist/automation/node.mjs +36 -1
  18. package/dist/automation/proposal.d.ts +25 -0
  19. package/dist/automation/proposal.d.ts.map +1 -0
  20. package/dist/automation/tools/define.d.ts +27 -0
  21. package/dist/automation/tools/define.d.ts.map +1 -0
  22. package/dist/automation/tools/docx-tools.d.ts +4 -0
  23. package/dist/automation/tools/docx-tools.d.ts.map +1 -0
  24. package/dist/automation/tools/index.d.ts +16 -0
  25. package/dist/automation/tools/index.d.ts.map +1 -0
  26. package/dist/automation/tools/types.d.ts +52 -0
  27. package/dist/automation/tools/types.d.ts.map +1 -0
  28. package/dist/automation/tools/visio-tools.d.ts +4 -0
  29. package/dist/automation/tools/visio-tools.d.ts.map +1 -0
  30. package/dist/automation/tools/xlsx-tools.d.ts +8 -0
  31. package/dist/automation/tools/xlsx-tools.d.ts.map +1 -0
  32. package/dist/automation/xlsx-edits.d.ts +88 -0
  33. package/dist/automation/xlsx-edits.d.ts.map +1 -0
  34. package/dist/automation/xlsx-proposal.d.ts +34 -0
  35. package/dist/automation/xlsx-proposal.d.ts.map +1 -0
  36. package/dist/automation/xlsx.d.ts +10 -5
  37. package/dist/automation/xlsx.d.ts.map +1 -1
  38. package/dist/chart/axis-range.d.ts.map +1 -1
  39. package/dist/chart/bubble-radius.d.ts +0 -5
  40. package/dist/chart/bubble-radius.d.ts.map +1 -1
  41. package/dist/chart/extent.d.ts +9 -0
  42. package/dist/chart/extent.d.ts.map +1 -0
  43. package/dist/chart/histogram-binning.d.ts.map +1 -1
  44. package/dist/chart/index.cjs +56 -18
  45. package/dist/chart/index.mjs +56 -18
  46. package/dist/chart/render/chart-svg-cartesian.d.ts.map +1 -1
  47. package/dist/chart/render/chart-svg-legend.d.ts.map +1 -1
  48. package/dist/chart/render/chart-view-ex.d.ts.map +1 -1
  49. package/dist/chart/render/chart-view.d.ts.map +1 -1
  50. package/dist/chart/trendline-fit.d.ts.map +1 -1
  51. package/dist/{chunk-3IENHIFD.cjs → chunk-4LZIUJI3.cjs} +52 -12
  52. package/dist/{chunk-LEV2SVMK.mjs → chunk-4QPOJCJG.mjs} +45 -8
  53. package/dist/{chunk-CC5UNZOO.mjs → chunk-6IIMI5RS.mjs} +52 -12
  54. package/dist/{chunk-MN27HKHM.mjs → chunk-BA7Z6ATM.mjs} +5 -5
  55. package/dist/{chunk-LVM3IZJ2.mjs → chunk-DLFMCZZT.mjs} +1 -1
  56. package/dist/{chunk-M4XLF4R7.mjs → chunk-GBKBR4CX.mjs} +20 -8
  57. package/dist/{chunk-NXKATFM5.cjs → chunk-HL3FBJ6X.cjs} +1065 -1016
  58. package/dist/{chunk-WXY5EDGT.mjs → chunk-LF5E5ZOH.mjs} +51 -2
  59. package/dist/chunk-MHNETXQB.mjs +1 -0
  60. package/dist/{chunk-MNXKRXFB.mjs → chunk-Q5PKBQXH.mjs} +52 -3
  61. package/dist/{chunk-GQYQQ3GA.mjs → chunk-VQF6HQEE.mjs} +1 -1
  62. package/dist/collab/embedding.d.ts +108 -0
  63. package/dist/collab/embedding.d.ts.map +1 -0
  64. package/dist/collab/index.cjs +423 -293
  65. package/dist/collab/index.d.ts +2 -0
  66. package/dist/collab/index.d.ts.map +1 -1
  67. package/dist/collab/index.mjs +415 -294
  68. package/dist/collab/webrtc-provider.d.ts +21 -0
  69. package/dist/collab/webrtc-provider.d.ts.map +1 -0
  70. package/dist/color/theme-palette.d.ts +5 -1
  71. package/dist/color/theme-palette.d.ts.map +1 -1
  72. package/dist/crypto/index.cjs +27 -2
  73. package/dist/crypto/index.mjs +27 -2
  74. package/dist/diagram/index.cjs +31 -3
  75. package/dist/diagram/index.mjs +31 -3
  76. package/dist/docx/block-parser.d.ts.map +1 -1
  77. package/dist/docx/cell-blocks.d.ts +7 -1
  78. package/dist/docx/cell-blocks.d.ts.map +1 -1
  79. package/dist/docx/content-control-edit.d.ts +14 -0
  80. package/dist/docx/content-control-edit.d.ts.map +1 -1
  81. package/dist/docx/content-control-model.d.ts +8 -0
  82. package/dist/docx/content-control-model.d.ts.map +1 -1
  83. package/dist/docx/content-control-values.d.ts +20 -0
  84. package/dist/docx/content-control-values.d.ts.map +1 -0
  85. package/dist/docx/content-control.d.ts +7 -1
  86. package/dist/docx/content-control.d.ts.map +1 -1
  87. package/dist/docx/element-order.d.ts +10 -5
  88. package/dist/docx/element-order.d.ts.map +1 -1
  89. package/dist/docx/embedded.cjs +3861 -1379
  90. package/dist/docx/embedded.mjs +3861 -1379
  91. package/dist/docx/field-instruction.d.ts +22 -0
  92. package/dist/docx/field-instruction.d.ts.map +1 -0
  93. package/dist/docx/form-field-model.d.ts +48 -0
  94. package/dist/docx/form-field-model.d.ts.map +1 -0
  95. package/dist/docx/form-fields.d.ts +31 -0
  96. package/dist/docx/form-fields.d.ts.map +1 -0
  97. package/dist/docx/form-fill-fields.d.ts +61 -0
  98. package/dist/docx/form-fill-fields.d.ts.map +1 -0
  99. package/dist/docx/form-fill-labels.d.ts +8 -0
  100. package/dist/docx/form-fill-labels.d.ts.map +1 -0
  101. package/dist/docx/form-fill-sites.d.ts +59 -0
  102. package/dist/docx/form-fill-sites.d.ts.map +1 -0
  103. package/dist/docx/form-fill-values.d.ts +28 -0
  104. package/dist/docx/form-fill-values.d.ts.map +1 -0
  105. package/dist/docx/form-fill-write.d.ts +26 -0
  106. package/dist/docx/form-fill-write.d.ts.map +1 -0
  107. package/dist/docx/glossary.d.ts +15 -0
  108. package/dist/docx/glossary.d.ts.map +1 -0
  109. package/dist/docx/index.cjs +5929 -3153
  110. package/dist/docx/index.d.ts +7 -0
  111. package/dist/docx/index.d.ts.map +1 -1
  112. package/dist/docx/index.mjs +5913 -3154
  113. package/dist/docx/inline-annotations.d.ts +21 -0
  114. package/dist/docx/inline-annotations.d.ts.map +1 -0
  115. package/dist/docx/inline-container-markers.d.ts +14 -0
  116. package/dist/docx/inline-container-markers.d.ts.map +1 -0
  117. package/dist/docx/inline-containers.d.ts +54 -0
  118. package/dist/docx/inline-containers.d.ts.map +1 -0
  119. package/dist/docx/inline-form-field-bookmarks.d.ts +15 -0
  120. package/dist/docx/inline-form-field-bookmarks.d.ts.map +1 -0
  121. package/dist/docx/inline-marker-positions.d.ts +15 -0
  122. package/dist/docx/inline-marker-positions.d.ts.map +1 -0
  123. package/dist/docx/inline-markers.d.ts +63 -0
  124. package/dist/docx/inline-markers.d.ts.map +1 -0
  125. package/dist/docx/inline-slots.d.ts +24 -0
  126. package/dist/docx/inline-slots.d.ts.map +1 -0
  127. package/dist/docx/layout/adapter.d.ts.map +1 -1
  128. package/dist/docx/layout/index.cjs +1176 -563
  129. package/dist/docx/layout/index.d.ts +2 -1
  130. package/dist/docx/layout/index.d.ts.map +1 -1
  131. package/dist/docx/layout/index.mjs +1175 -564
  132. package/dist/docx/layout/input.d.ts +5 -1
  133. package/dist/docx/layout/input.d.ts.map +1 -1
  134. package/dist/docx/layout/page-style-refs.d.ts +21 -0
  135. package/dist/docx/layout/page-style-refs.d.ts.map +1 -0
  136. package/dist/docx/layout/paragraph-fragments.d.ts.map +1 -1
  137. package/dist/docx/layout/result.d.ts +1 -0
  138. package/dist/docx/layout/result.d.ts.map +1 -1
  139. package/dist/docx/layout/tab-stops.d.ts +8 -1
  140. package/dist/docx/layout/tab-stops.d.ts.map +1 -1
  141. package/dist/docx/load/index.cjs +3969 -1487
  142. package/dist/docx/load/index.mjs +3969 -1487
  143. package/dist/docx/model-run.d.ts +24 -2
  144. package/dist/docx/model-run.d.ts.map +1 -1
  145. package/dist/docx/model.d.ts +5 -0
  146. package/dist/docx/model.d.ts.map +1 -1
  147. package/dist/docx/numbering-format.d.ts.map +1 -1
  148. package/dist/docx/parse-warnings.d.ts.map +1 -1
  149. package/dist/docx/parse.d.ts.map +1 -1
  150. package/dist/docx/run-segmentation.d.ts +11 -0
  151. package/dist/docx/run-segmentation.d.ts.map +1 -0
  152. package/dist/docx/save.d.ts.map +1 -1
  153. package/dist/docx/section-model.d.ts +5 -0
  154. package/dist/docx/section-model.d.ts.map +1 -1
  155. package/dist/docx/sections.d.ts +4 -2
  156. package/dist/docx/sections.d.ts.map +1 -1
  157. package/dist/docx/settings.d.ts +9 -0
  158. package/dist/docx/settings.d.ts.map +1 -1
  159. package/dist/docx/special-characters.d.ts +34 -0
  160. package/dist/docx/special-characters.d.ts.map +1 -0
  161. package/dist/docx/style-ref-fields.d.ts +40 -0
  162. package/dist/docx/style-ref-fields.d.ts.map +1 -0
  163. package/dist/docx/style-ref.d.ts +85 -0
  164. package/dist/docx/style-ref.d.ts.map +1 -0
  165. package/dist/docx/table-model.d.ts +2 -2
  166. package/dist/docx/table-model.d.ts.map +1 -1
  167. package/dist/docx/ui/break-note-schema.d.ts.map +1 -1
  168. package/dist/docx/ui/content-control-commands.d.ts +20 -8
  169. package/dist/docx/ui/content-control-commands.d.ts.map +1 -1
  170. package/dist/docx/ui/content-control-guard.d.ts +4 -1
  171. package/dist/docx/ui/content-control-guard.d.ts.map +1 -1
  172. package/dist/docx/ui/content-control-paste.d.ts +23 -0
  173. package/dist/docx/ui/content-control-paste.d.ts.map +1 -0
  174. package/dist/docx/ui/content-control-rows.d.ts +15 -0
  175. package/dist/docx/ui/content-control-rows.d.ts.map +1 -0
  176. package/dist/docx/ui/content-control-sources.d.ts +12 -0
  177. package/dist/docx/ui/content-control-sources.d.ts.map +1 -0
  178. package/dist/docx/ui/content-control-spans.d.ts +29 -6
  179. package/dist/docx/ui/content-control-spans.d.ts.map +1 -1
  180. package/dist/docx/ui/content-control-temporary.d.ts +10 -0
  181. package/dist/docx/ui/content-control-temporary.d.ts.map +1 -0
  182. package/dist/docx/ui/form-field-commands.d.ts +41 -0
  183. package/dist/docx/ui/form-field-commands.d.ts.map +1 -0
  184. package/dist/docx/ui/form-field-guard.d.ts +24 -0
  185. package/dist/docx/ui/form-field-guard.d.ts.map +1 -0
  186. package/dist/docx/ui/form-text-blank.d.ts +18 -0
  187. package/dist/docx/ui/form-text-blank.d.ts.map +1 -0
  188. package/dist/docx/ui/index.cjs +9276 -7132
  189. package/dist/docx/ui/index.d.ts +5 -0
  190. package/dist/docx/ui/index.d.ts.map +1 -1
  191. package/dist/docx/ui/index.mjs +9259 -7137
  192. package/dist/docx/ui/positional-tab-input.d.ts +7 -0
  193. package/dist/docx/ui/positional-tab-input.d.ts.map +1 -0
  194. package/dist/docx/ui/run-compare.d.ts.map +1 -1
  195. package/dist/docx/ui/run-extra-mark.d.ts +1 -1
  196. package/dist/docx/ui/run-extra-mark.d.ts.map +1 -1
  197. package/dist/docx/ui/schema-marks.d.ts +1 -1
  198. package/dist/docx/ui/schema-marks.d.ts.map +1 -1
  199. package/dist/docx/ui/symbol-font.d.ts +4 -0
  200. package/dist/docx/ui/symbol-font.d.ts.map +1 -0
  201. package/dist/docx/ui/yjs-collaboration.d.ts +12 -1
  202. package/dist/docx/ui/yjs-collaboration.d.ts.map +1 -1
  203. package/dist/docx/write-block-placement.d.ts +7 -0
  204. package/dist/docx/write-block-placement.d.ts.map +1 -1
  205. package/dist/docx/write-content-control.d.ts +6 -0
  206. package/dist/docx/write-content-control.d.ts.map +1 -1
  207. package/dist/docx/write-header-footer.d.ts +6 -2
  208. package/dist/docx/write-header-footer.d.ts.map +1 -1
  209. package/dist/docx/write-inline.d.ts +12 -16
  210. package/dist/docx/write-inline.d.ts.map +1 -1
  211. package/dist/docx/write-paragraph.d.ts.map +1 -1
  212. package/dist/docx/write-revisions.d.ts.map +1 -1
  213. package/dist/docx/write-run.d.ts.map +1 -1
  214. package/dist/docx/write-section-properties.d.ts +5 -0
  215. package/dist/docx/write-section-properties.d.ts.map +1 -0
  216. package/dist/docx/write-sections.d.ts.map +1 -1
  217. package/dist/docx/write-table-controls.d.ts +15 -0
  218. package/dist/docx/write-table-controls.d.ts.map +1 -0
  219. package/dist/docx/write-table-properties.d.ts.map +1 -1
  220. package/dist/docx/write-table.d.ts.map +1 -1
  221. package/dist/docx/write.d.ts.map +1 -1
  222. package/dist/docx/xml.d.ts +6 -0
  223. package/dist/docx/xml.d.ts.map +1 -1
  224. package/dist/drawingml/index.cjs +31 -3
  225. package/dist/drawingml/index.mjs +31 -3
  226. package/dist/index.cjs +77 -26
  227. package/dist/index.mjs +77 -26
  228. package/dist/math/index.cjs +27 -2
  229. package/dist/math/index.mjs +27 -2
  230. package/dist/opc/index.cjs +51 -11
  231. package/dist/opc/index.mjs +51 -11
  232. package/dist/opc/zip-folders.d.ts +11 -0
  233. package/dist/opc/zip-folders.d.ts.map +1 -0
  234. package/dist/opc/zip-limits.d.ts +9 -0
  235. package/dist/opc/zip-limits.d.ts.map +1 -1
  236. package/dist/pptx/automation/index.cjs +28818 -7388
  237. package/dist/pptx/automation/index.d.ts +93 -3
  238. package/dist/pptx/automation/index.d.ts.map +1 -1
  239. package/dist/pptx/automation/index.mjs +740 -63
  240. package/dist/pptx/automation/schemas/chart-formatting-schemas.d.ts +1 -1
  241. package/dist/pptx/automation/schemas/chart-schemas.d.ts +1 -1
  242. package/dist/pptx/automation/schemas/chart-user-shape-schemas.d.ts +1 -1
  243. package/dist/pptx/automation/schemas/element-schemas.d.ts +1 -1
  244. package/dist/pptx/automation/schemas/export-schemas.d.ts +1 -1
  245. package/dist/pptx/automation/schemas/geometry-schemas.d.ts +1 -1
  246. package/dist/pptx/automation/schemas/hyperlink-schemas.d.ts +1 -1
  247. package/dist/pptx/automation/schemas/index.mjs +1 -0
  248. package/dist/pptx/automation/schemas/json-schemas.d.ts +1 -1
  249. package/dist/pptx/automation/schemas/layout-schemas.d.ts +1 -1
  250. package/dist/pptx/automation/schemas/lock-schemas.d.ts +1 -1
  251. package/dist/pptx/automation/schemas/metadata-schemas.d.ts +1 -1
  252. package/dist/pptx/automation/schemas/ole-schemas.d.ts +1 -1
  253. package/dist/pptx/automation/schemas/presentation-schemas.d.ts +1 -1
  254. package/dist/pptx/automation/schemas/section-schemas.d.ts +1 -1
  255. package/dist/pptx/automation/schemas/slide-schemas.d.ts +1 -1
  256. package/dist/pptx/automation/schemas/smartart-schemas.d.ts +1 -1
  257. package/dist/pptx/automation/schemas/table-style-schemas.d.ts +1 -1
  258. package/dist/pptx/automation/schemas/template-schemas.d.ts +1 -1
  259. package/dist/pptx/automation/schemas/theme-schemas.d.ts +1 -1
  260. package/dist/pptx/automation/schemas/validation-schemas.d.ts +1 -1
  261. package/dist/pptx/chunks/{index-CgFX0T7b.d.ts → index-CPhsd7Df.d.ts} +9 -1
  262. package/dist/pptx/chunks/{index-CgFX0T7b.d.ts.map → index-CPhsd7Df.d.ts.map} +1 -1
  263. package/dist/pptx/chunks/{index-qwVYoFn6.d.ts → index-Q5mM8kIR.d.ts} +2 -2
  264. package/dist/pptx/chunks/{index-qwVYoFn6.d.ts.map → index-Q5mM8kIR.d.ts.map} +1 -1
  265. package/dist/pptx/chunks/{schemas-CWr181Wx.d.ts → schemas-fuDGetRe.d.ts} +2 -2
  266. package/dist/pptx/chunks/{schemas-CWr181Wx.d.ts.map → schemas-fuDGetRe.d.ts.map} +1 -1
  267. package/dist/pptx/cli/index.cjs +116 -17
  268. package/dist/pptx/cli/index.mjs +5 -5
  269. package/dist/pptx/converter/index.cjs +12 -3
  270. package/dist/pptx/converter/index.d.ts +1 -1
  271. package/dist/pptx/converter/index.mjs +3 -3
  272. package/dist/pptx/editor/render/find-replace.cjs +14 -14
  273. package/dist/pptx/editor/render/find-replace.d.ts +1 -1
  274. package/dist/pptx/editor/render/find-replace.mjs +1 -1
  275. package/dist/pptx/editor/render/slide-operations.cjs +8 -8
  276. package/dist/pptx/editor/render/slide-operations.mjs +2 -2
  277. package/dist/pptx/index.cjs +116 -17
  278. package/dist/pptx/index.d.ts +2 -2
  279. package/dist/pptx/index.mjs +6 -6
  280. package/dist/pptx/signature-node/index.cjs +20 -8
  281. package/dist/pptx/signature-node/index.mjs +2 -2
  282. package/dist/teams/index.cjs +105 -70
  283. package/dist/teams/index.mjs +105 -70
  284. package/dist/text/text-diff.d.ts +15 -0
  285. package/dist/text/text-diff.d.ts.map +1 -0
  286. package/dist/visio/collab/bind.d.ts +44 -0
  287. package/dist/visio/collab/bind.d.ts.map +1 -0
  288. package/dist/visio/collab/compose.d.ts +15 -0
  289. package/dist/visio/collab/compose.d.ts.map +1 -0
  290. package/dist/visio/collab/index.cjs +1194 -0
  291. package/dist/visio/collab/index.d.ts +8 -0
  292. package/dist/visio/collab/index.d.ts.map +1 -0
  293. package/dist/visio/collab/index.mjs +1152 -0
  294. package/dist/visio/collab/keys.d.ts +22 -0
  295. package/dist/visio/collab/keys.d.ts.map +1 -0
  296. package/dist/visio/collab/order.d.ts +11 -0
  297. package/dist/visio/collab/order.d.ts.map +1 -0
  298. package/dist/visio/collab/package.d.ts +37 -0
  299. package/dist/visio/collab/package.d.ts.map +1 -0
  300. package/dist/visio/collab/read.d.ts +41 -0
  301. package/dist/visio/collab/read.d.ts.map +1 -0
  302. package/dist/visio/collab/scan.d.ts +28 -0
  303. package/dist/visio/collab/scan.d.ts.map +1 -0
  304. package/dist/visio/collab/schema.d.ts +70 -0
  305. package/dist/visio/collab/schema.d.ts.map +1 -0
  306. package/dist/visio/collab/snapshot.d.ts +61 -0
  307. package/dist/visio/collab/snapshot.d.ts.map +1 -0
  308. package/dist/visio/collab/write.d.ts +20 -0
  309. package/dist/visio/collab/write.d.ts.map +1 -0
  310. package/dist/visio/index.cjs +159 -39
  311. package/dist/visio/index.mjs +159 -39
  312. package/dist/visio/ui/collab-options.d.ts +24 -0
  313. package/dist/visio/ui/collab-options.d.ts.map +1 -0
  314. package/dist/visio/ui/collab-presence.d.ts +31 -0
  315. package/dist/visio/ui/collab-presence.d.ts.map +1 -0
  316. package/dist/visio/ui/contract.d.ts +9 -3
  317. package/dist/visio/ui/contract.d.ts.map +1 -1
  318. package/dist/visio/ui/document-history.d.ts +3 -1
  319. package/dist/visio/ui/document-history.d.ts.map +1 -1
  320. package/dist/visio/ui/index.cjs +284 -95
  321. package/dist/visio/ui/index.d.ts +2 -0
  322. package/dist/visio/ui/index.d.ts.map +1 -1
  323. package/dist/visio/ui/index.mjs +278 -95
  324. package/dist/xlsx/collab/index.cjs +8 -3
  325. package/dist/xlsx/collab/index.mjs +8 -3
  326. package/dist/xlsx/compare/cells.d.ts +22 -0
  327. package/dist/xlsx/compare/cells.d.ts.map +1 -0
  328. package/dist/xlsx/compare/compare.d.ts +12 -0
  329. package/dist/xlsx/compare/compare.d.ts.map +1 -0
  330. package/dist/xlsx/compare/conditional.d.ts +7 -0
  331. package/dist/xlsx/compare/conditional.d.ts.map +1 -0
  332. package/dist/xlsx/compare/format-key.d.ts +34 -0
  333. package/dist/xlsx/compare/format-key.d.ts.map +1 -0
  334. package/dist/xlsx/compare/group.d.ts +8 -0
  335. package/dist/xlsx/compare/group.d.ts.map +1 -0
  336. package/dist/xlsx/compare/index.d.ts +5 -0
  337. package/dist/xlsx/compare/index.d.ts.map +1 -0
  338. package/dist/xlsx/compare/rich-text.d.ts +7 -0
  339. package/dist/xlsx/compare/rich-text.d.ts.map +1 -0
  340. package/dist/xlsx/compare/sheets.d.ts +22 -0
  341. package/dist/xlsx/compare/sheets.d.ts.map +1 -0
  342. package/dist/xlsx/compare/structure.d.ts +11 -0
  343. package/dist/xlsx/compare/structure.d.ts.map +1 -0
  344. package/dist/xlsx/compare/text.d.ts +8 -0
  345. package/dist/xlsx/compare/text.d.ts.map +1 -0
  346. package/dist/xlsx/compare/types.d.ts +173 -0
  347. package/dist/xlsx/compare/types.d.ts.map +1 -0
  348. package/dist/xlsx/edit/cell-values.d.ts.map +1 -1
  349. package/dist/xlsx/edit/clipboard-html.d.ts.map +1 -1
  350. package/dist/xlsx/edit/clipboard-text.d.ts.map +1 -1
  351. package/dist/xlsx/edit/clipboard.d.ts.map +1 -1
  352. package/dist/xlsx/edit/clone-cell.d.ts +9 -0
  353. package/dist/xlsx/edit/clone-cell.d.ts.map +1 -0
  354. package/dist/xlsx/edit/history.d.ts +8 -3
  355. package/dist/xlsx/edit/history.d.ts.map +1 -1
  356. package/dist/xlsx/edit/timelines.d.ts.map +1 -1
  357. package/dist/xlsx/formula/change-areas.d.ts +9 -0
  358. package/dist/xlsx/formula/change-areas.d.ts.map +1 -0
  359. package/dist/xlsx/formula/engine-prepare.d.ts +8 -0
  360. package/dist/xlsx/formula/engine-prepare.d.ts.map +1 -1
  361. package/dist/xlsx/formula/engine.d.ts.map +1 -1
  362. package/dist/xlsx/formula/spill.d.ts +5 -1
  363. package/dist/xlsx/formula/spill.d.ts.map +1 -1
  364. package/dist/xlsx/index.cjs +2461 -1192
  365. package/dist/xlsx/index.d.ts +1 -0
  366. package/dist/xlsx/index.d.ts.map +1 -1
  367. package/dist/xlsx/index.mjs +2454 -1193
  368. package/dist/xlsx/layout/cell-view.d.ts.map +1 -1
  369. package/dist/xlsx/layout/navigate.d.ts.map +1 -1
  370. package/dist/xlsx/layout/style-view.d.ts +5 -0
  371. package/dist/xlsx/layout/style-view.d.ts.map +1 -1
  372. package/dist/xlsx/load/csv-dates.d.ts +22 -0
  373. package/dist/xlsx/load/csv-dates.d.ts.map +1 -0
  374. package/dist/xlsx/load/csv-import.d.ts +64 -0
  375. package/dist/xlsx/load/csv-import.d.ts.map +1 -0
  376. package/dist/xlsx/load/csv-separators.d.ts +13 -0
  377. package/dist/xlsx/load/csv-separators.d.ts.map +1 -0
  378. package/dist/xlsx/load/csv-traits.d.ts +20 -0
  379. package/dist/xlsx/load/csv-traits.d.ts.map +1 -0
  380. package/dist/xlsx/load/csv.d.ts +8 -4
  381. package/dist/xlsx/load/csv.d.ts.map +1 -1
  382. package/dist/xlsx/load/detect.d.ts +13 -0
  383. package/dist/xlsx/load/detect.d.ts.map +1 -1
  384. package/dist/xlsx/load/errors.d.ts +1 -0
  385. package/dist/xlsx/load/errors.d.ts.map +1 -1
  386. package/dist/xlsx/load/index.cjs +537 -91
  387. package/dist/xlsx/load/index.d.ts +3 -1
  388. package/dist/xlsx/load/index.d.ts.map +1 -1
  389. package/dist/xlsx/load/index.mjs +536 -92
  390. package/dist/xlsx/numfmt/input-date.d.ts +2 -0
  391. package/dist/xlsx/numfmt/input-date.d.ts.map +1 -1
  392. package/dist/xlsx/pivot/cache-xml.d.ts.map +1 -1
  393. package/dist/xlsx/pivot/groups.d.ts.map +1 -1
  394. package/dist/xlsx/read/index.d.ts +2 -1
  395. package/dist/xlsx/read/index.d.ts.map +1 -1
  396. package/dist/xlsx/read/limits.d.ts +50 -0
  397. package/dist/xlsx/read/limits.d.ts.map +1 -0
  398. package/dist/xlsx/read/load.d.ts +11 -1
  399. package/dist/xlsx/read/load.d.ts.map +1 -1
  400. package/dist/xlsx/read/package.d.ts +5 -23
  401. package/dist/xlsx/read/package.d.ts.map +1 -1
  402. package/dist/xlsx/read/shared-strings.d.ts +2 -2
  403. package/dist/xlsx/read/shared-strings.d.ts.map +1 -1
  404. package/dist/xlsx/read/worksheet.d.ts +2 -0
  405. package/dist/xlsx/read/worksheet.d.ts.map +1 -1
  406. package/dist/xlsx/stable-key.d.ts +3 -0
  407. package/dist/xlsx/stable-key.d.ts.map +1 -0
  408. package/dist/xlsx/styles.d.ts.map +1 -1
  409. package/dist/xlsx/ui/index.cjs +662 -372
  410. package/dist/xlsx/ui/index.mjs +662 -372
  411. package/dist/xlsx/ui/locales/de/shell.d.ts.map +1 -1
  412. package/dist/xlsx/ui/locales/en/shell.d.ts.map +1 -1
  413. package/dist/xlsx/ui/locales/es/shell.d.ts.map +1 -1
  414. package/dist/xlsx/ui/locales/fr/shell.d.ts.map +1 -1
  415. package/dist/xlsx/ui/locales/zh-CN/shell.d.ts.map +1 -1
  416. package/dist/xlsx/write/sheet-props.d.ts.map +1 -1
  417. package/dist/xml/index.cjs +32 -3
  418. package/dist/xml/index.mjs +32 -4
  419. package/dist/xml/xml.d.ts +11 -1
  420. package/dist/xml/xml.d.ts.map +1 -1
  421. package/package.json +6 -1
  422. package/dist/PptxHandler-SITN3K3F.mjs +0 -4
@@ -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) {
@@ -14919,89 +15094,6 @@ function sheetBounds(sheet) {
14919
15094
  return { rows: rows2, cols };
14920
15095
  }
14921
15096
 
14922
- // xlsx/formula/spill.ts
14923
- var isSpilledCell = (cell) => cell !== void 0 && "spillAnchor" in cell;
14924
- function releaseSpilledCell(sheet, row2, col) {
14925
- const cell = getCell(sheet, row2, col);
14926
- if (!isSpilledCell(cell)) return;
14927
- delete cell.spillAnchor;
14928
- cell.value = null;
14929
- if (!cell.styleId && !cell.formula && !cell.richText && !cell.arrayRange)
14930
- deleteCell(sheet, row2, col);
14931
- }
14932
- function clearFootprint(sheet, footprint, row2, col) {
14933
- for (let r = footprint.start.row; r <= footprint.end.row; r++) {
14934
- const cells = sheet.rows.get(r);
14935
- if (!cells) continue;
14936
- for (let c2 = footprint.start.col; c2 <= footprint.end.col; c2++) {
14937
- if (r === row2 && c2 === col) continue;
14938
- const cell = cells.get(c2);
14939
- if (isSpilledCell(cell) && cell.spillAnchor.row === row2 && cell.spillAnchor.col === col) {
14940
- releaseSpilledCell(sheet, r, c2);
14941
- }
14942
- }
14943
- }
14944
- }
14945
- function footprintFor(row2, col, m) {
14946
- const end = { row: row2 + m.rows - 1, col: col + m.cols - 1 };
14947
- if (end.row > MAX_ROW || end.col > MAX_COL) return void 0;
14948
- return { start: { row: row2, col }, end };
14949
- }
14950
- function footprintFree(sheet, footprint, row2, col, claims) {
14951
- if (sheet.merges.some((m) => rangesIntersect(m, footprint))) return false;
14952
- for (let r = footprint.start.row; r <= footprint.end.row; r++) {
14953
- const cells = sheet.rows.get(r);
14954
- if (!cells) continue;
14955
- for (let c2 = footprint.start.col; c2 <= footprint.end.col; c2++) {
14956
- if (r === row2 && c2 === col) continue;
14957
- const cell = cells.get(c2);
14958
- if (!cell) continue;
14959
- if (cell.formula) return false;
14960
- if (isSpilledCell(cell)) {
14961
- const a2 = cell.spillAnchor;
14962
- if (a2.row === row2 && a2.col === col) continue;
14963
- if (claims(a2, r, c2)) return false;
14964
- continue;
14965
- }
14966
- if (cell.value !== null) return false;
14967
- }
14968
- }
14969
- return true;
14970
- }
14971
- function writeFootprint(sheet, footprint, m) {
14972
- const { row: row2, col } = footprint.start;
14973
- for (let r = footprint.start.row; r <= footprint.end.row; r++) {
14974
- for (let c2 = footprint.start.col; c2 <= footprint.end.col; c2++) {
14975
- const value3 = cellValueOf(m.get(r - row2, c2 - col));
14976
- const cell = getCell(sheet, r, c2);
14977
- if (r === row2 && c2 === col) {
14978
- if (cell) cell.value = value3;
14979
- continue;
14980
- }
14981
- if (cell) {
14982
- cell.value = value3;
14983
- if (!isSpilledCell(cell) || cell.spillAnchor.row !== row2 || cell.spillAnchor.col !== col)
14984
- cell.spillAnchor = { row: row2, col };
14985
- } else {
14986
- const spilled = { value: value3, spillAnchor: { row: row2, col } };
14987
- putCell(sheet, r, c2, spilled);
14988
- }
14989
- }
14990
- }
14991
- }
14992
- function fillArrayRange(sheet, range2, m) {
14993
- const { row: row2, col } = range2.start;
14994
- for (let r = range2.start.row; r <= range2.end.row; r++) {
14995
- for (let c2 = range2.start.col; c2 <= range2.end.col; c2++) {
14996
- const value3 = cellValueOf(pick(m, r - row2, c2 - col));
14997
- const cell = getCell(sheet, r, c2);
14998
- if (cell) cell.value = value3;
14999
- else putCell(sheet, r, c2, { value: value3 });
15000
- }
15001
- }
15002
- }
15003
- var cellValueOf = (value3) => value3 === null ? 0 : value3;
15004
-
15005
15097
  // xlsx/formula/engine-host.ts
15006
15098
  var Deferred = class {
15007
15099
  constructor(node2) {
@@ -15926,6 +16018,8 @@ var Engine = class extends EngineStructure {
15926
16018
  preparation;
15927
16019
  /** The prepared formulas the first recalculation checks (see `trustsStoredValues`). */
15928
16020
  prepared;
16021
+ /** Stored spills released when the graph was built: their readers must recalculate. */
16022
+ released = [];
15929
16023
  // ---- the graph ----
15930
16024
  prepare(timeRemaining) {
15931
16025
  if (this.built || this.needsFull) return true;
@@ -15963,10 +16057,33 @@ var Engine = class extends EngineStructure {
15963
16057
  finishPreparation(preparation) {
15964
16058
  this.preparation = void 0;
15965
16059
  this.built = true;
16060
+ this.adoptStoredSpills(preparation.spills);
15966
16061
  this.graphChanged();
15967
16062
  this.reverseIndex = preparation.reverse;
15968
16063
  this.prepared = preparation.formulas;
15969
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
+ }
15970
16087
  // ---- recalculation ----
15971
16088
  recalculateAll() {
15972
16089
  resetArrayBudget();
@@ -15975,6 +16092,7 @@ var Engine = class extends EngineStructure {
15975
16092
  if (this.needsFull) this.releaseAllSpills();
15976
16093
  if (!this.built || this.needsFull) this.build();
15977
16094
  this.needsFull = false;
16095
+ this.released = [];
15978
16096
  this.structuralSeeds.clear();
15979
16097
  this.cycles = /* @__PURE__ */ new Set();
15980
16098
  this.run(new Set(this.allNodes()), true);
@@ -15993,7 +16111,9 @@ var Engine = class extends EngineStructure {
15993
16111
  this.recalculateAll();
15994
16112
  return;
15995
16113
  }
15996
- const changed = [];
16114
+ const changed = this.released;
16115
+ this.released = [];
16116
+ const written = [];
15997
16117
  let structural = false;
15998
16118
  for (const change of changes) {
15999
16119
  const sheet = this.workbook.sheets[change.sheet];
@@ -16013,7 +16133,8 @@ var Engine = class extends EngineStructure {
16013
16133
  seeds.add(this.createNode(change.sheet, row2, col, cell, false));
16014
16134
  structural = true;
16015
16135
  } else if (existing && formula) seeds.add(existing);
16016
- changed.push({ sheet: change.sheet, range: { start: { row: row2, col }, end: { row: row2, col } } });
16136
+ written.push(change);
16137
+ if (!this.footprints.size) continue;
16017
16138
  const anchors = [];
16018
16139
  this.footprintsBy().dependents(
16019
16140
  change.sheet,
@@ -16030,7 +16151,8 @@ var Engine = class extends EngineStructure {
16030
16151
  if (structural) this.graphChanged();
16031
16152
  this.takeStructuralSeeds(seeds);
16032
16153
  const reverse2 = this.reverse();
16033
- 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);
16034
16156
  for (const node2 of this.allNodes()) if (node2.volatile) seeds.add(node2);
16035
16157
  this.run(seeds, false);
16036
16158
  }
@@ -16043,11 +16165,17 @@ var Engine = class extends EngineStructure {
16043
16165
  const prepared = this.prepared;
16044
16166
  this.prepared = void 0;
16045
16167
  if (!prepared) return false;
16046
- const changed = new Set(changes.map((c2) => `${c2.sheet}:${cellKey(c2.row, c2.col)}`));
16047
16168
  const current = (node2) => this.nodes.get(node2.sheet)?.get(cellKey(node2.row, node2.col)) === node2;
16048
- for (const node2 of prepared.dynamic) {
16049
- if (current(node2) && !changed.has(`${node2.sheet}:${cellKey(node2.row, node2.col)}`))
16050
- 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;
16051
16179
  }
16052
16180
  for (const node2 of prepared.unvalued) {
16053
16181
  const cell = this.workbook.sheets[node2.sheet]?.rows.get(node2.row)?.get(node2.col);
@@ -16775,10 +16903,13 @@ var DEFAULT_ZIP_LIMITS = {
16775
16903
  var ZipLimitError = class extends Error {
16776
16904
  code = "ZIP_BOMB";
16777
16905
  limit;
16906
+ /** The check that failed (absent when the error was built without one). */
16907
+ kind;
16778
16908
  constructor(message, details) {
16779
16909
  super(message);
16780
16910
  this.name = "ZipLimitError";
16781
16911
  this.limit = details.limit;
16912
+ this.kind = details.kind;
16782
16913
  }
16783
16914
  };
16784
16915
  var mib = (bytes) => Math.round(bytes / 1048576);
@@ -16801,7 +16932,7 @@ function resolveLimits(limits) {
16801
16932
  maxEntryBytes: limits.maxEntryBytes ?? DEFAULT_ZIP_LIMITS.maxEntryBytes,
16802
16933
  maxTotalBytes: limits.maxTotalBytes ?? DEFAULT_ZIP_LIMITS.maxTotalBytes,
16803
16934
  label: limits.label ?? "ZIP",
16804
- 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 })
16805
16936
  };
16806
16937
  }
16807
16938
  function inflateEntryGuarded(entry3, alreadyRead, limits) {
@@ -16824,13 +16955,18 @@ function inflateEntryGuarded(entry3, alreadyRead, limits) {
16824
16955
  size += chunk.byteLength;
16825
16956
  if (size > declared || size > r.maxEntryBytes)
16826
16957
  return abort(
16827
- 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
+ )
16828
16963
  );
16829
16964
  if (alreadyRead + size > r.maxTotalBytes)
16830
16965
  return abort(
16831
16966
  r.fail(
16832
16967
  `${r.label} package exceeds the ${mib(r.maxTotalBytes)} MiB uncompressed content limit`,
16833
- r.maxTotalBytes
16968
+ r.maxTotalBytes,
16969
+ "maxTotalBytes"
16834
16970
  )
16835
16971
  );
16836
16972
  chunks.push(chunk);
@@ -16863,26 +16999,29 @@ function guardZip(zip, limits = {}) {
16863
16999
  if (entries.length > r.maxEntries)
16864
17000
  throw r.fail(
16865
17001
  `${r.label} package exceeds the ${r.maxEntries.toLocaleString("en-US")} part limit`,
16866
- r.maxEntries
17002
+ r.maxEntries,
17003
+ "maxEntries"
16867
17004
  );
16868
17005
  let declared = 0;
16869
17006
  for (const entry3 of entries) {
16870
17007
  const original = entry3.unsafeOriginalName;
16871
17008
  if (!isSafePartName(entry3.name) || original !== void 0 && !isSafePartName(original))
16872
- 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");
16873
17010
  if (entry3.dir) continue;
16874
17011
  const size = declaredEntrySize(entry3);
16875
17012
  if (size > r.maxEntryBytes)
16876
17013
  throw r.fail(
16877
17014
  `${r.label} part ${entry3.name} exceeds the uncompressed part size limit`,
16878
- r.maxEntryBytes
17015
+ r.maxEntryBytes,
17016
+ "maxEntryBytes"
16879
17017
  );
16880
17018
  declared += size;
16881
17019
  }
16882
17020
  if (declared > r.maxTotalBytes)
16883
17021
  throw r.fail(
16884
17022
  `${r.label} package exceeds the ${mib(r.maxTotalBytes)} MiB uncompressed content limit`,
16885
- r.maxTotalBytes
17023
+ r.maxTotalBytes,
17024
+ "maxTotalBytes"
16886
17025
  );
16887
17026
  const produced = /* @__PURE__ */ new Map();
16888
17027
  let total2 = 0;
@@ -18925,10 +19064,69 @@ function mergeComments(legacy, threaded) {
18925
19064
  (a2, b) => a2.address.row - b.address.row || a2.address.col - b.address.col
18926
19065
  );
18927
19066
  }
18928
- var MAX_INPUT_BYTES = 50 * 1024 * 1024;
18929
- var MAX_PARTS = 1e4;
18930
- var MAX_UNCOMPRESSED_BYTES = 300 * 1024 * 1024;
18931
- 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
+ }
18932
19130
  var CONTENT_TYPES = {
18933
19131
  workbook: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
18934
19132
  workbookMacro: "application/vnd.ms-excel.sheet.macroEnabled.main+xml",
@@ -19018,16 +19216,15 @@ var SourceIndex = class {
19018
19216
  };
19019
19217
  var mib2 = (bytes) => Math.round(bytes / 1048576);
19020
19218
  async function readZipParts(input, limits = {}) {
19021
- const maxInput = limits.maxInputBytes ?? MAX_INPUT_BYTES;
19022
- const zipLimits = {
19023
- maxEntries: limits.maxParts ?? MAX_PARTS,
19024
- maxEntryBytes: limits.maxPartBytes ?? MAX_PART_BYTES,
19025
- maxTotalBytes: limits.maxTotalBytes ?? MAX_UNCOMPRESSED_BYTES,
19026
- label: "XLSX"
19027
- };
19219
+ const resolved = resolveLoadLimits(limits);
19220
+ const maxInput = resolved.maxInputBytes;
19028
19221
  const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);
19029
19222
  if (bytes.byteLength > maxInput)
19030
- 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
+ );
19031
19228
  let loaded;
19032
19229
  try {
19033
19230
  loaded = await JSZip2__default.default.loadAsync(bytes);
@@ -19037,7 +19234,7 @@ async function readZipParts(input, limits = {}) {
19037
19234
  { cause: error }
19038
19235
  );
19039
19236
  }
19040
- const zip = guardZip(loaded, zipLimits);
19237
+ const zip = guardZip(loaded, zipLimitsFor(resolved));
19041
19238
  const parts = /* @__PURE__ */ new Map();
19042
19239
  for (const entry3 of Object.values(zip.files)) {
19043
19240
  if (entry3.dir) continue;
@@ -19244,9 +19441,9 @@ function parseRichString(element2, palette) {
19244
19441
  const text4 = parsed.map((run2) => run2.text).join("");
19245
19442
  return { text: text4, runs: parsed };
19246
19443
  }
19247
- function parseSharedStrings(xml, palette) {
19444
+ function parseSharedStrings(xml, palette, maxXmlElements) {
19248
19445
  if (!xml) return [];
19249
- const root = parseXml(xml, { label: "XLSX shared strings" }).documentElement;
19446
+ const root = parseDataXml(xml, "XLSX shared strings", maxXmlElements).documentElement;
19250
19447
  return xChildren(root, "si").map((si) => parseRichString(si, palette));
19251
19448
  }
19252
19449
 
@@ -24867,7 +25064,11 @@ function parseWorksheet(ctx, partName, name, sheetId) {
24867
25064
  return sheet;
24868
25065
  }
24869
25066
  const split = splitSheetData(xml);
24870
- 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;
24871
25072
  const byName = /* @__PURE__ */ new Map();
24872
25073
  const cfBlocks = [];
24873
25074
  for (const node2 of elements(root)) {
@@ -24941,8 +25142,9 @@ function liftPrintAreas(workbook) {
24941
25142
  return false;
24942
25143
  });
24943
25144
  }
24944
- async function loadXlsx(input) {
24945
- const parts = await readZipParts(input);
25145
+ async function loadXlsx(input, options7 = {}) {
25146
+ const limits = resolveLoadLimits(options7.limits);
25147
+ const parts = await readZipParts(input, limits);
24946
25148
  const source2 = new SourceIndex(parts);
24947
25149
  const workbookPart = source2.workbookPart();
24948
25150
  if (!workbookPart) throw new Error("XLSX package has no workbook part (xl/workbook.xml)");
@@ -24963,7 +25165,8 @@ async function loadXlsx(input) {
24963
25165
  source: source2,
24964
25166
  sharedStrings: parseSharedStrings(
24965
25167
  stringsPart ? source2.text(stringsPart) : void 0,
24966
- styles.palette
25168
+ styles.palette,
25169
+ limits.maxXmlElements
24967
25170
  ),
24968
25171
  xfMap: styles.xfMap,
24969
25172
  date1904: book.date1904,
@@ -24971,7 +25174,8 @@ async function loadXlsx(input) {
24971
25174
  dxfs: styles.dxfs,
24972
25175
  persons: parsePersons(personsPart ? source2.text(personsPart) : void 0),
24973
25176
  dynamicCells: parseDynamicArrayMetadata(metadataPart ? source2.text(metadataPart) : void 0),
24974
- warn
25177
+ warn,
25178
+ maxXmlElements: limits.maxXmlElements
24975
25179
  };
24976
25180
  const rels = source2.rels(workbookPart);
24977
25181
  const sheets = book.sheets.map((entry3) => {
@@ -29283,10 +29487,8 @@ function sheetFormatXml(sheet) {
29283
29487
  const current = { defaultRowHeight: sheet.defaultRowHeight };
29284
29488
  if (sheet.defaultColWidth !== void 0) current.defaultColWidth = sheet.defaultColWidth;
29285
29489
  if (sheet.format && Object.keys(sheet.format).length) current.format = sheet.format;
29286
- const rowLevel = Math.max(
29287
- 0,
29288
- ...[...sheet.rowInfo.values()].map((info) => info.outlineLevel ?? 0)
29289
- );
29490
+ let rowLevel = 0;
29491
+ for (const info of sheet.rowInfo.values()) rowLevel = Math.max(rowLevel, info.outlineLevel ?? 0);
29290
29492
  const colLevel = Math.max(0, ...sheet.columns.map((col) => col.outlineLevel ?? 0));
29291
29493
  if (source2 && sameModel(readSheetFormat(source2), current) && Number(source2.getAttribute("outlineLevelRow") ?? 0) === rowLevel && Number(source2.getAttribute("outlineLevelCol") ?? 0) === colLevel)
29292
29494
  return snapshotXml(sheet, "sheetFormatPr") ?? "";
@@ -29588,11 +29790,10 @@ function pivotCacheDefinitionXml(pivot, workbook, data, recordRel) {
29588
29790
  const items = data.items[index3];
29589
29791
  if (pivot.dateFields?.includes(name) && items.every((v) => typeof v === "number")) {
29590
29792
  const serials = items;
29591
- const latest = Math.max(...serials);
29592
- const maxDate = Number.isInteger(latest) ? latest + 1 : latest;
29793
+ const range2 = dateGroupRange({}, serials);
29593
29794
  const parent = derived.filter((entry3) => entry3.group.field === name).at(-1);
29594
29795
  const link = parent ? `<fieldGroup par="${parent.index}"/>` : "";
29595
- 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>`;
29596
29797
  }
29597
29798
  const types = new Set(
29598
29799
  items.map((value3) => value3 === null || value3 === "" ? "blank" : typeof value3)
@@ -31007,7 +31208,8 @@ function setCellValue(ctx, s, row2, col, value3) {
31007
31208
  }
31008
31209
  function setRangeValues(ctx, s, at, values2) {
31009
31210
  const sheet = sheetAt(ctx.workbook, s);
31010
- 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);
31011
31213
  if (!values2.length || !width) return;
31012
31214
  const range2 = cellRange(at.row, at.col, at.row + values2.length - 1, at.col + width - 1);
31013
31215
  ctx.run(
@@ -32331,23 +32533,33 @@ function toHtml(cells, theme2) {
32331
32533
  for (let c2 = m.start.col; c2 <= m.end.col; c2++)
32332
32534
  if (r !== m.start.row || c2 !== m.start.col) covered.add(`${r},${c2}`);
32333
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
+ };
32334
32545
  const rows2 = [];
32335
32546
  for (let r = 0; r < cells.rows; r++) {
32336
32547
  const tds = [];
32337
32548
  for (let c2 = 0; c2 < cells.cols; c2++) {
32338
- if (covered.has(`${r},${c2}`)) continue;
32549
+ const key = covered.size || spans3.size || links.size ? `${r},${c2}` : "";
32550
+ if (covered.has(key)) continue;
32339
32551
  const cell = cells.data[r]?.[c2] ?? null;
32340
32552
  const attrs2 = [];
32341
- const span4 = spans3.get(`${r},${c2}`);
32553
+ const span4 = spans3.get(key);
32342
32554
  if (span4 && span4.end.row > span4.start.row)
32343
32555
  attrs2.push(`rowspan="${span4.end.row - span4.start.row + 1}"`);
32344
32556
  if (span4 && span4.end.col > span4.start.col)
32345
32557
  attrs2.push(`colspan="${span4.end.col - span4.start.col + 1}"`);
32346
32558
  if (cell && typeof cell.value === "number") attrs2.push(`x:num="${cell.value}"`);
32347
- const css = cssFor(cell?.style, theme2);
32348
- if (css) attrs2.push(`style="${escapeHtml(css)}"`);
32559
+ const css = styleAttr2(cell?.style);
32560
+ if (css) attrs2.push(css);
32349
32561
  let text4 = escapeHtml(cell?.text ?? "").replace(/\n/g, "<br>");
32350
- const link = links.get(`${r},${c2}`);
32562
+ const link = links.get(key);
32351
32563
  const href = htmlHref(link);
32352
32564
  if (href)
32353
32565
  text4 = `<a href="${escapeHtml(href)}"${link?.tooltip ? ` title="${escapeHtml(link.tooltip)}"` : ""}>${text4}</a>`;
@@ -32655,7 +32867,8 @@ function parseTsv(text4) {
32655
32867
  }
32656
32868
  row2.push(field);
32657
32869
  rows2.push(row2);
32658
- 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);
32659
32872
  for (const r of rows2) while (r.length < width) r.push("");
32660
32873
  return rows2;
32661
32874
  }
@@ -32910,10 +33123,16 @@ function copyRange(workbook, s, range2) {
32910
33123
  { length: rows2 },
32911
33124
  () => Array.from({ length: cols }, () => null)
32912
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
+ };
32913
33132
  forEachCellInRange(sheet, clipped, (cell, row2, col) => {
32914
33133
  const clip = {
32915
33134
  value: cell.value,
32916
- style: structuredClone(styleAt(workbook, cell.styleId)),
33135
+ style: styleCopy(cell.styleId),
32917
33136
  text: displayText(workbook, cell)
32918
33137
  };
32919
33138
  if (cell.formula !== void 0) clip.formula = cell.formula;
@@ -33852,6 +34071,17 @@ function shiftEdgeCells(sheet, spec2, phase) {
33852
34071
  return out;
33853
34072
  }
33854
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
+
33855
34085
  // xlsx/edit/history-rows.ts
33856
34086
  function captureRowInfo(sheet, rows2) {
33857
34087
  return [...new Set(rows2)].map((row2) => {
@@ -33892,12 +34122,14 @@ function restoreSettings(workbook, settings) {
33892
34122
  var PROBE_LIMIT = 4096;
33893
34123
  function captureCells(sheet, ranges) {
33894
34124
  const cells = [];
33895
- const seen = /* @__PURE__ */ new Set();
34125
+ const seen = ranges.length > 1 ? /* @__PURE__ */ new Set() : void 0;
33896
34126
  const take2 = (cell, row2, col) => {
33897
- const key = `${row2},${col}`;
33898
- if (seen.has(key)) return;
33899
- seen.add(key);
33900
- 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)]);
33901
34133
  };
33902
34134
  for (const raw2 of ranges) {
33903
34135
  const range2 = normalizeRange(raw2);
@@ -33974,7 +34206,7 @@ function restoreShift(workbook, snapshot) {
33974
34206
  if (!sheet) return;
33975
34207
  const shift2 = snapshot.phase === "before" ? { ...spec2.shift, count: -spec2.shift.count } : spec2.shift;
33976
34208
  moveCellsRaw(sheet, shift2, spec2.band);
33977
- 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));
33978
34210
  restoreRefs(workbook, snapshot.data);
33979
34211
  workbook.activeSheet = snapshot.activeSheet;
33980
34212
  }
@@ -34023,18 +34255,51 @@ function restoreSnapshot(workbook, snapshot) {
34023
34255
  forEachCellInRange(sheet, range2, (_cell, row2, col) => doomed.push([row2, col]));
34024
34256
  for (const [row2, col] of doomed) deleteCell(sheet, row2, col);
34025
34257
  }
34026
- 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;
34027
34267
  }
34028
34268
  function touchedCells(step) {
34029
34269
  const out = [];
34030
- 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();
34031
34294
  for (const entry3 of step.entries)
34032
34295
  for (const snapshot of [entry3.before, entry3.after]) {
34033
34296
  if (snapshot.kind !== "cells") continue;
34297
+ let keys = seen.get(snapshot.sheet);
34298
+ if (!keys) seen.set(snapshot.sheet, keys = /* @__PURE__ */ new Set());
34034
34299
  for (const [row2, col] of snapshot.cells) {
34035
- const key = `${snapshot.sheet},${row2},${col}`;
34036
- if (seen.has(key)) continue;
34037
- seen.add(key);
34300
+ const key = cellKey(row2, col);
34301
+ if (keys.has(key)) continue;
34302
+ keys.add(key);
34038
34303
  out.push({ sheet: snapshot.sheet, row: row2, col });
34039
34304
  }
34040
34305
  }
@@ -34131,7 +34396,7 @@ var SessionCalculator = class {
34131
34396
  }
34132
34397
  this.calc.discardPreparation();
34133
34398
  if (structural) this.staleGraph = true;
34134
- else this.dirty.push(...touchedCells(step));
34399
+ else for (const cell of touchedCells(step)) this.dirty.push(cell);
34135
34400
  return;
34136
34401
  }
34137
34402
  if (hint && !this.staleGraph) {
@@ -34150,7 +34415,7 @@ var SessionCalculator = class {
34150
34415
  this.calc.discardPreparation();
34151
34416
  if (!this.enabled) return;
34152
34417
  if (structural) this.staleGraph = true;
34153
- else this.dirty.push(...cells);
34418
+ else for (const cell of cells) this.dirty.push(cell);
34154
34419
  return;
34155
34420
  }
34156
34421
  this.recalc(structural, () => cells);
@@ -35212,8 +35477,16 @@ function insertTimeline(ctx, s, ref) {
35212
35477
  const pivot = sheet.pivotTables?.find((entry3) => entry3.name === ref.pivot);
35213
35478
  if (!pivot || !pivot.dateFields?.includes(ref.field))
35214
35479
  throw new Error("Choose a PivotTable with a date field.");
35215
- const dates = pivot.records.map((record) => record[pivot.fields.indexOf(ref.field)]).filter((value3) => typeof value3 === "number");
35216
- 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.");
35217
35490
  const taken = /* @__PURE__ */ new Set([
35218
35491
  ...(workbook.slicers?.slicers ?? []).map((entry3) => entry3.name.toLowerCase()),
35219
35492
  ...(workbook.slicers?.timelines ?? []).map((entry3) => entry3.name.toLowerCase()),
@@ -35231,8 +35504,8 @@ function insertTimeline(ctx, s, ref) {
35231
35504
  "_"
35232
35505
  );
35233
35506
  const bounds = boundsOfSerialRange(
35234
- serialToIso(Math.min(...dates), workbook.date1904),
35235
- serialToIso(Math.max(...dates), workbook.date1904)
35507
+ serialToIso(earliest, workbook.date1904),
35508
+ serialToIso(latest, workbook.date1904)
35236
35509
  );
35237
35510
  const metrics = createGridMetrics(sheet, { zoom: 100 });
35238
35511
  let right2 = 0;
@@ -38646,6 +38919,15 @@ function mergeFont(base, font) {
38646
38919
  if (value3 !== void 0) out[key] = value3;
38647
38920
  return out;
38648
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
+ }
38649
38931
  function fontView(font, theme2) {
38650
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";
38651
38933
  const view = {
@@ -38770,14 +39052,7 @@ function cellView(workbook, sheetIndex2, row2, col, cf, options7 = {}) {
38770
39052
  const style3 = styleAt(workbook, effectiveStyleId(sheet, row2, col));
38771
39053
  const conditional = cf?.at(row2, col);
38772
39054
  const dxf = conditional?.style;
38773
- const defaultFont = workbook.styles[0]?.font ?? {};
38774
- const base = { ...style3.font };
38775
- if (!base.name && !base.scheme) {
38776
- if (defaultFont.name) base.name = defaultFont.name;
38777
- if (defaultFont.scheme) base.scheme = defaultFont.scheme;
38778
- }
38779
- if (!base.size && defaultFont.size) base.size = defaultFont.size;
38780
- const font = mergeFont(base, dxf?.font);
39055
+ const font = mergeFont(cellFont(style3.font, workbook.styles[0]?.font ?? {}), dxf?.font);
38781
39056
  const formulaText = sheet.view.showFormulas && cell?.formula !== void 0 ? `=${cell.formula}` : void 0;
38782
39057
  const shown = formulaText !== void 0 ? { text: formulaText } : displayText2(value3, style3, dxf?.numFmt ?? style3.numFmt, workbook, sheet);
38783
39058
  const fontViewResolved = fontView(font, workbook.theme);
@@ -40374,14 +40649,24 @@ function formatAxisValue(value3, percent = false) {
40374
40649
  return `${v < 0 ? "-" : ""}${grouped}${frac ? `.${frac}` : ""}`;
40375
40650
  }
40376
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
+
40377
40663
  // chart/axis-range.ts
40378
40664
  function computeLogValueRange(series, logBase) {
40379
40665
  const allValues = series.flatMap((item) => item.values).filter((value3) => value3 !== null && Number.isFinite(value3) && value3 > 0);
40380
40666
  if (allValues.length === 0) {
40381
40667
  return { min: 1, max: logBase, span: 1, logScale: true, logBase };
40382
40668
  }
40383
- const dataMin = Math.min(...allValues);
40384
- const dataMax = Math.max(...allValues);
40669
+ const { min: dataMin, max: dataMax } = extentOf(allValues);
40385
40670
  const logMin = Math.floor(Math.log(dataMin) / Math.log(logBase));
40386
40671
  const logMax = Math.ceil(Math.log(dataMax) / Math.log(logBase));
40387
40672
  const min = logBase ** logMin;
@@ -41408,8 +41693,7 @@ function computeHistogramBins(values2, options7, format = String) {
41408
41693
  });
41409
41694
  }
41410
41695
  if (regular.length > 0) {
41411
- const min = Math.min(...regular.map((item) => item.value));
41412
- const max = Math.max(...regular.map((item) => item.value));
41696
+ const { min, max } = extentOf(regular.map((item) => item.value));
41413
41697
  const requestedSize = options7.binSize && options7.binSize > 0 ? options7.binSize : void 0;
41414
41698
  const requestedCount = options7.binCount && options7.binCount > 0 ? options7.binCount : void 0;
41415
41699
  const start = requestedSize ? Math.floor(min / requestedSize) * requestedSize : min;
@@ -41537,8 +41821,9 @@ function waterfallView(chart, model, ctx) {
41537
41821
  colors: { increase: role(0), decrease: role(1), total: role(2) }
41538
41822
  };
41539
41823
  const ends = steps.flatMap((step) => [step.startValue, step.endValue]);
41824
+ const range2 = extentOf(ends);
41540
41825
  model.valueAxis = {
41541
- ...ends.length ? niceScale(Math.min(...ends), Math.max(...ends)) : niceScale(0, 1),
41826
+ ...ends.length ? niceScale(range2.min, range2.max) : niceScale(0, 1),
41542
41827
  percent: false
41543
41828
  };
41544
41829
  const labels = model.categories;
@@ -41654,7 +41939,8 @@ function chartSummaryView(chart, theme2, options7 = {}) {
41654
41939
  s.xValues = s.values.map((_, k) => numeric2 ? toNumber2(cats[k] ?? null) : k + 1);
41655
41940
  });
41656
41941
  const xs = series.flatMap((s) => s.xValues ?? []).filter((x) => x !== null);
41657
- 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);
41658
41944
  }
41659
41945
  if (type === "stock") model.stock = stockView(chart.stock, ctx);
41660
41946
  if (type === "bubble") bubbleView(chart, model, ctx.evaluateRef);
@@ -41931,8 +42217,9 @@ function fitChartTrendline(options7, xVals, yVals) {
41931
42217
  }
41932
42218
  const model = fitModel(options7, xVals, yVals);
41933
42219
  if (!model) return noFit();
41934
- const startX = Math.min(...xVals) - (options7.backward ?? 0);
41935
- 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);
41936
42223
  const steps = Math.max(Math.ceil((endX - startX) * 4), 20);
41937
42224
  const points = [];
41938
42225
  for (let step = 0; step <= steps; step++) {
@@ -42501,7 +42788,7 @@ function cartesianAxes(model, area, out) {
42501
42788
  const cats = Math.max(1, model.categories.length);
42502
42789
  const catW = Math.min(
42503
42790
  area.w * 0.3,
42504
- 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
42505
42792
  );
42506
42793
  const second = horizontal2 ? void 0 : model.secondaryAxis;
42507
42794
  const secondLabels = second?.ticks.map((t) => axisTickText(t, model.axes?.secondary, second.percent)) ?? [];
@@ -42690,7 +42977,7 @@ function computeBubbleRadius(sizeVal, maxBubble, medianRadius, options7) {
42690
42977
  return medianRadius * scale2 * 0.5 + ratio * medianRadius * scale2 * 1.5;
42691
42978
  }
42692
42979
  function maxBubbleSize(sizes) {
42693
- return sizes.length > 0 ? Math.max(1, ...sizes.map(Math.abs)) : 1;
42980
+ return Math.max(1, extentOf(sizes.map(Math.abs)).max);
42694
42981
  }
42695
42982
  function medianBubbleRadius(plotWidth, plotHeight) {
42696
42983
  return Math.min(plotWidth, plotHeight) * 0.04;
@@ -43303,13 +43590,11 @@ function chartLegendSvg(model, area, frame, options7) {
43303
43590
  chartAreaRect(model, "legend", { x: manual.x, y: manual.y, w: manual.width, h: manual.height })
43304
43591
  ];
43305
43592
  const baselineOffset = font ? (font.ascent - font.descent) / 2 : size * 0.35;
43593
+ const widest = extentOf(widths).max;
43306
43594
  entries.forEach((entry3, i2) => {
43307
43595
  const available = horizontal2 ? chartTextWidth(entry3.label, attrs2, options7) : Math.max(0, rowWidth - size / 2 - keySize - keyGap);
43308
43596
  const label2 = fitChartText(entry3.label, available, attrs2, options7);
43309
- const contentWidth = Math.min(
43310
- horizontal2 ? widths[i2] ?? 0 : Math.max(...widths),
43311
- rowWidth - size / 2
43312
- );
43597
+ const contentWidth = Math.min(horizontal2 ? widths[i2] ?? 0 : widest, rowWidth - size / 2);
43313
43598
  const x = horizontal2 ? horizontalX : manual.x + Math.max(size / 4, (rowWidth - contentWidth) / 2);
43314
43599
  const centerY = manual.y + (horizontal2 ? 0 : i2 * rowHeight) + rowHeight / 2;
43315
43600
  markup.push(rect(x, centerY - keySize / 2, keySize, keySize, entry3.color));
@@ -43381,7 +43666,7 @@ function automaticLegend(model, area, out, options7, bounds) {
43381
43666
  }
43382
43667
  const width = Math.min(
43383
43668
  area.w * 0.35,
43384
- Math.max(...entries.map((e) => chartTextWidth(e.label, attrs2, options7))) + 22
43669
+ extentOf(entries.map((e) => chartTextWidth(e.label, attrs2, options7))).max + 22
43385
43670
  );
43386
43671
  const height = entries.length * rowH;
43387
43672
  const x = pos === "l" ? area.x + 4 : area.x + area.w - width;
@@ -49906,6 +50191,7 @@ __export(shell_exports, {
49906
50191
  shell: () => shell
49907
50192
  });
49908
50193
  var shell = {
50194
+ "The current cell edit failed validation.": "Die aktuelle Zellbearbeitung hat die \xDCberpr\xFCfung nicht bestanden.",
49909
50195
  "Finish or cancel the current cell edit before saving.": "Beenden oder verwerfen Sie die aktuelle Zellbearbeitung vor dem Speichern.",
49910
50196
  File: "Datei",
49911
50197
  Ribbon: "Men\xFCband",
@@ -50310,6 +50596,7 @@ __export(shell_exports2, {
50310
50596
  shell: () => shell2
50311
50597
  });
50312
50598
  var shell2 = {
50599
+ "The current cell edit failed validation.": "The current cell edit failed validation.",
50313
50600
  "Finish or cancel the current cell edit before saving.": "Finish or cancel the current cell edit before saving.",
50314
50601
  File: "File",
50315
50602
  Ribbon: "Ribbon",
@@ -50714,6 +51001,7 @@ __export(shell_exports3, {
50714
51001
  shell: () => shell3
50715
51002
  });
50716
51003
  var shell3 = {
51004
+ "The current cell edit failed validation.": "La edici\xF3n de la celda actual no super\xF3 la validaci\xF3n.",
50717
51005
  "Finish or cancel the current cell edit before saving.": "Finalice o cancele la edici\xF3n de la celda actual antes de guardar.",
50718
51006
  File: "Archivo",
50719
51007
  Ribbon: "Cinta de opciones",
@@ -51118,6 +51406,7 @@ __export(shell_exports4, {
51118
51406
  shell: () => shell4
51119
51407
  });
51120
51408
  var shell4 = {
51409
+ "The current cell edit failed validation.": "La modification de la cellule en cours a \xE9chou\xE9 \xE0 la validation.",
51121
51410
  "Finish or cancel the current cell edit before saving.": "Terminez ou annulez la modification de la cellule avant de sauvegarder.",
51122
51411
  File: "Fichier",
51123
51412
  Ribbon: "Ruban",
@@ -51522,6 +51811,7 @@ __export(shell_exports5, {
51522
51811
  shell: () => shell5
51523
51812
  });
51524
51813
  var shell5 = {
51814
+ "The current cell edit failed validation.": "\u5F53\u524D\u5355\u5143\u683C\u7684\u7F16\u8F91\u672A\u901A\u8FC7\u9A8C\u8BC1\u3002",
51525
51815
  "Finish or cancel the current cell edit before saving.": "\u8BF7\u5148\u5B8C\u6210\u6216\u53D6\u6D88\u5F53\u524D\u5355\u5143\u683C\u7684\u7F16\u8F91\uFF0C\u518D\u4FDD\u5B58\u3002",
51526
51816
  File: "\u6587\u4EF6",
51527
51817
  Ribbon: "\u529F\u80FD\u533A",