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
@@ -315,9 +315,9 @@ function nextSheetName(workbook, base = "Sheet") {
315
315
  }
316
316
  var nextSheetId = (workbook) => workbook.sheets.reduce((max, sheet) => Math.max(max, sheet.sheetId), 0) + 1;
317
317
 
318
- // xlsx/styles.ts
319
- function styleKey(style3) {
320
- return JSON.stringify(sortKeys(style3));
318
+ // xlsx/stable-key.ts
319
+ function stableKey(value3) {
320
+ return JSON.stringify(sortKeys(value3));
321
321
  }
322
322
  function sortKeys(value3) {
323
323
  if (Array.isArray(value3)) return value3.map(sortKeys);
@@ -331,6 +331,11 @@ function sortKeys(value3) {
331
331
  }
332
332
  return value3;
333
333
  }
334
+
335
+ // xlsx/styles.ts
336
+ function styleKey(style3) {
337
+ return stableKey(style3);
338
+ }
334
339
  function styleAt(workbook, styleId) {
335
340
  const style3 = workbook.styles[styleId ?? 0] ?? workbook.styles[0];
336
341
  if (!style3) throw new Error("Workbook has no default cell style");
@@ -2703,6 +2708,37 @@ function parseArray(c2) {
2703
2708
  return { type: "array", rows: rows2 };
2704
2709
  }
2705
2710
 
2711
+ // xlsx/formula/change-areas.ts
2712
+ function changeAreas(changes) {
2713
+ const out = [];
2714
+ const open = /* @__PURE__ */ new Map();
2715
+ let run2;
2716
+ const close2 = (area) => {
2717
+ const { start, end } = area.range;
2718
+ const key = `${area.sheet}:${start.col}:${end.col}`;
2719
+ const above = open.get(key);
2720
+ if (above && above.range.end.row === start.row - 1) {
2721
+ above.range.end.row = end.row;
2722
+ return;
2723
+ }
2724
+ out.push(area);
2725
+ open.set(key, area);
2726
+ };
2727
+ for (const { sheet, row: row2, col } of changes) {
2728
+ if (run2 && run2.sheet === sheet && run2.range.start.row === row2) {
2729
+ if (col === run2.range.end.col + 1) {
2730
+ run2.range.end.col = col;
2731
+ continue;
2732
+ }
2733
+ if (col >= run2.range.start.col && col <= run2.range.end.col) continue;
2734
+ }
2735
+ if (run2) close2(run2);
2736
+ run2 = { sheet, range: { start: { row: row2, col }, end: { row: row2, col } } };
2737
+ }
2738
+ if (run2) close2(run2);
2739
+ return out;
2740
+ }
2741
+
2706
2742
  // xlsx/formula/date-serial.ts
2707
2743
  var DAY_MS = 864e5;
2708
2744
  var EPOCH_19002 = Date.UTC(1899, 11, 30);
@@ -2929,68 +2965,6 @@ var ReverseIndex = class extends AreaIndex {
2929
2965
  }
2930
2966
  };
2931
2967
 
2932
- // xlsx/formula/engine-prepare.ts
2933
- var CHECK_EVERY = 32;
2934
- var GraphPreparation = class {
2935
- constructor(workbook, create) {
2936
- this.workbook = workbook;
2937
- this.create = create;
2938
- }
2939
- workbook;
2940
- create;
2941
- reverse = new ReverseIndex();
2942
- formulas = { dynamic: [], unvalued: [] };
2943
- sheet = 0;
2944
- rows;
2945
- row = 0;
2946
- cells;
2947
- finished = false;
2948
- /**
2949
- * Adds formulas to the graph until `timeRemaining` (milliseconds, as an idle deadline reports
2950
- * them) reaches zero, or until every formula is in. Returns true when the graph is complete.
2951
- */
2952
- run(timeRemaining) {
2953
- let visited = 0;
2954
- while (!this.finished) {
2955
- const cells = this.cells ?? this.nextRow();
2956
- if (!cells) continue;
2957
- const next = cells.next();
2958
- if (next.done) {
2959
- this.cells = void 0;
2960
- continue;
2961
- }
2962
- const [col, cell] = next.value;
2963
- if (cell.formula) this.add(this.create(this.sheet, this.row, col, cell), cell);
2964
- if (timeRemaining && ++visited % CHECK_EVERY === 0 && timeRemaining() <= 0) break;
2965
- }
2966
- return this.finished;
2967
- }
2968
- add(node2, cell) {
2969
- this.reverse.addNode(node2);
2970
- if (!node2.legacy && !node2.arrayRange) this.formulas.dynamic.push(node2);
2971
- if (cell.value === null && !node2.keepCached) this.formulas.unvalued.push(node2);
2972
- }
2973
- /** Moves to the next stored row (and sheet), or marks the walk finished. */
2974
- nextRow() {
2975
- for (; ; ) {
2976
- const sheet = this.workbook.sheets[this.sheet];
2977
- if (!sheet) {
2978
- this.finished = true;
2979
- return void 0;
2980
- }
2981
- this.rows ??= sheet.rows.entries();
2982
- const next = this.rows.next();
2983
- if (!next.done) {
2984
- this.row = next.value[0];
2985
- this.cells = next.value[1].entries();
2986
- return this.cells;
2987
- }
2988
- this.rows = void 0;
2989
- this.sheet++;
2990
- }
2991
- }
2992
- };
2993
-
2994
2968
  // xlsx/formula/text-number.ts
2995
2969
  var MONTHS2 = [
2996
2970
  "jan",
@@ -3393,6 +3367,311 @@ function finite(value3) {
3393
3367
  return value3;
3394
3368
  }
3395
3369
 
3370
+ // xlsx/formula/operators.ts
3371
+ var signal = (fn) => {
3372
+ try {
3373
+ return fn();
3374
+ } catch (e) {
3375
+ if (e instanceof ErrorSignal) return e.value;
3376
+ throw e;
3377
+ }
3378
+ };
3379
+ function power(base, exponent) {
3380
+ if (base === 0 && exponent === 0) throw new ErrorSignal(ERR.NUM);
3381
+ if (base === 0 && exponent < 0) throw new ErrorSignal(ERR.DIV0);
3382
+ if (base < 0 && !Number.isInteger(exponent)) {
3383
+ const inverse = 1 / exponent;
3384
+ const odd = Math.round(inverse);
3385
+ if (Math.abs(inverse - odd) < 1e-10 && Math.abs(odd) % 2 === 1) {
3386
+ return -Math.pow(-base, exponent);
3387
+ }
3388
+ throw new ErrorSignal(ERR.NUM);
3389
+ }
3390
+ return Math.pow(base, exponent);
3391
+ }
3392
+ function snapToZero(result2, a2, b) {
3393
+ if (result2 !== 0 && Math.abs(result2) <= Math.max(Math.abs(a2), Math.abs(b)) * 1e-15) return 0;
3394
+ return result2;
3395
+ }
3396
+ function arithmetic(op2, x, y, snap) {
3397
+ if (isError(x)) return x;
3398
+ if (isError(y)) return y;
3399
+ return signal(() => {
3400
+ const a2 = toNumber(x);
3401
+ const b = toNumber(y);
3402
+ let r;
3403
+ switch (op2) {
3404
+ case "+":
3405
+ r = a2 + b;
3406
+ if (snap) r = snapToZero(r, a2, b);
3407
+ break;
3408
+ case "-":
3409
+ r = a2 - b;
3410
+ if (snap) r = snapToZero(r, a2, b);
3411
+ break;
3412
+ case "*":
3413
+ r = a2 * b;
3414
+ break;
3415
+ case "/":
3416
+ if (b === 0) return ERR.DIV0;
3417
+ r = a2 / b;
3418
+ break;
3419
+ default:
3420
+ r = power(a2, b);
3421
+ }
3422
+ return Number.isFinite(r) ? r === 0 ? 0 : r : ERR.NUM;
3423
+ });
3424
+ }
3425
+ function comparison(op2, x, y) {
3426
+ if (isError(x)) return x;
3427
+ if (isError(y)) return y;
3428
+ const c2 = compareScalars(x, y);
3429
+ switch (op2) {
3430
+ case "=":
3431
+ return c2 === 0;
3432
+ case "<>":
3433
+ return c2 !== 0;
3434
+ case "<":
3435
+ return c2 < 0;
3436
+ case ">":
3437
+ return c2 > 0;
3438
+ case "<=":
3439
+ return c2 <= 0;
3440
+ default:
3441
+ return c2 >= 0;
3442
+ }
3443
+ }
3444
+ function concat(x, y) {
3445
+ if (isError(x)) return x;
3446
+ if (isError(y)) return y;
3447
+ return toText(x) + toText(y);
3448
+ }
3449
+ function scalarBinary(op2, x, y, snap = false) {
3450
+ if (op2 === "&") return concat(x, y);
3451
+ if (op2 === "+" || op2 === "-" || op2 === "*" || op2 === "/" || op2 === "^") {
3452
+ return arithmetic(op2, x, y, snap);
3453
+ }
3454
+ return comparison(op2, x, y);
3455
+ }
3456
+ function scalarUnary(op2, x) {
3457
+ if (isError(x)) return x;
3458
+ return signal(() => {
3459
+ const n2 = toNumber(x);
3460
+ const r = op2 === "-" ? -n2 : n2 / 100;
3461
+ return r === 0 ? 0 : r;
3462
+ });
3463
+ }
3464
+ function pick(m, row2, col) {
3465
+ const r = m.rows === 1 ? 0 : row2;
3466
+ const c2 = m.cols === 1 ? 0 : col;
3467
+ if (r >= m.rows || c2 >= m.cols) return ERR.NA;
3468
+ return m.get(r, c2);
3469
+ }
3470
+ function broadcastShape(operands, at) {
3471
+ let rows2 = 1;
3472
+ let cols = 1;
3473
+ for (const m of operands) {
3474
+ rows2 = Math.max(rows2, m.rows);
3475
+ cols = Math.max(cols, m.cols);
3476
+ }
3477
+ if (!operands.some((m) => m.isPadded)) return Matrix.build(rows2, cols, at);
3478
+ let blockRows = 1;
3479
+ let blockCols = 1;
3480
+ for (const m of operands) {
3481
+ blockRows = Math.max(blockRows, m.isPadded ? m.blockRows : m.rows);
3482
+ blockCols = Math.max(blockCols, m.isPadded ? m.blockCols : m.cols);
3483
+ }
3484
+ blockRows = Math.min(blockRows, rows2);
3485
+ blockCols = Math.min(blockCols, cols);
3486
+ const varies = operands.some(
3487
+ (m) => blockRows < rows2 && m.rows === 1 && m.cols > 1 || blockCols < cols && m.cols === 1 && m.rows > 1
3488
+ );
3489
+ if (varies) return Matrix.build(rows2, cols, at);
3490
+ return Matrix.padded(Matrix.build(blockRows, blockCols, at), rows2, cols, at(rows2 - 1, cols - 1));
3491
+ }
3492
+ function broadcast2(a2, b, fn) {
3493
+ if (!(a2 instanceof Matrix) && !(b instanceof Matrix)) return fn(a2, b);
3494
+ const ma = a2 instanceof Matrix ? a2 : new Matrix([[a2]]);
3495
+ const mb = b instanceof Matrix ? b : new Matrix([[b]]);
3496
+ return broadcastShape([ma, mb], (r, c2) => fn(pick(ma, r, c2), pick(mb, r, c2)));
3497
+ }
3498
+ function broadcast1(a2, fn) {
3499
+ return a2 instanceof Matrix ? a2.mapValues(fn) : fn(a2);
3500
+ }
3501
+
3502
+ // xlsx/formula/spill.ts
3503
+ var isSpilledCell = (cell) => cell !== void 0 && "spillAnchor" in cell;
3504
+ function releaseSpilledCell(sheet, row2, col) {
3505
+ const cell = getCell(sheet, row2, col);
3506
+ if (!isSpilledCell(cell)) return;
3507
+ delete cell.spillAnchor;
3508
+ cell.value = null;
3509
+ if (!cell.styleId && !cell.formula && !cell.richText && !cell.arrayRange)
3510
+ deleteCell(sheet, row2, col);
3511
+ }
3512
+ function clearFootprint(sheet, footprint, row2, col) {
3513
+ const { start, end } = footprint;
3514
+ const owned = [];
3515
+ const visit2 = (r, c2, cell) => {
3516
+ if (c2 < start.col || c2 > end.col || r === row2 && c2 === col) return;
3517
+ if (isSpilledCell(cell) && cell.spillAnchor.row === row2 && cell.spillAnchor.col === col)
3518
+ owned.push([r, c2]);
3519
+ };
3520
+ const visitRow = (r, cells) => {
3521
+ if (end.col - start.col + 1 <= cells.size)
3522
+ for (let c2 = start.col; c2 <= end.col; c2++) visit2(r, c2, cells.get(c2));
3523
+ else for (const [c2, cell] of cells) visit2(r, c2, cell);
3524
+ };
3525
+ if (end.row - start.row + 1 <= sheet.rows.size) {
3526
+ for (let r = start.row; r <= end.row; r++) {
3527
+ const cells = sheet.rows.get(r);
3528
+ if (cells) visitRow(r, cells);
3529
+ }
3530
+ } else
3531
+ for (const [r, cells] of sheet.rows) if (r >= start.row && r <= end.row) visitRow(r, cells);
3532
+ for (const [r, c2] of owned) releaseSpilledCell(sheet, r, c2);
3533
+ }
3534
+ function footprintFor(row2, col, m) {
3535
+ const end = { row: row2 + m.rows - 1, col: col + m.cols - 1 };
3536
+ if (end.row > MAX_ROW || end.col > MAX_COL) return void 0;
3537
+ return { start: { row: row2, col }, end };
3538
+ }
3539
+ function footprintFree(sheet, footprint, row2, col, claims) {
3540
+ if (sheet.merges.some((m) => rangesIntersect(m, footprint))) return false;
3541
+ for (let r = footprint.start.row; r <= footprint.end.row; r++) {
3542
+ const cells = sheet.rows.get(r);
3543
+ if (!cells) continue;
3544
+ for (let c2 = footprint.start.col; c2 <= footprint.end.col; c2++) {
3545
+ if (r === row2 && c2 === col) continue;
3546
+ const cell = cells.get(c2);
3547
+ if (!cell) continue;
3548
+ if (cell.formula) return false;
3549
+ if (isSpilledCell(cell)) {
3550
+ const a2 = cell.spillAnchor;
3551
+ if (a2.row === row2 && a2.col === col) continue;
3552
+ if (claims(a2, r, c2)) return false;
3553
+ continue;
3554
+ }
3555
+ if (cell.value !== null) return false;
3556
+ }
3557
+ }
3558
+ return true;
3559
+ }
3560
+ function writeFootprint(sheet, footprint, m) {
3561
+ const { row: row2, col } = footprint.start;
3562
+ for (let r = footprint.start.row; r <= footprint.end.row; r++) {
3563
+ for (let c2 = footprint.start.col; c2 <= footprint.end.col; c2++) {
3564
+ const value3 = cellValueOf(m.get(r - row2, c2 - col));
3565
+ const cell = getCell(sheet, r, c2);
3566
+ if (r === row2 && c2 === col) {
3567
+ if (cell) cell.value = value3;
3568
+ continue;
3569
+ }
3570
+ if (cell) {
3571
+ cell.value = value3;
3572
+ if (!isSpilledCell(cell) || cell.spillAnchor.row !== row2 || cell.spillAnchor.col !== col)
3573
+ cell.spillAnchor = { row: row2, col };
3574
+ } else {
3575
+ const spilled = { value: value3, spillAnchor: { row: row2, col } };
3576
+ putCell(sheet, r, c2, spilled);
3577
+ }
3578
+ }
3579
+ }
3580
+ }
3581
+ function fillArrayRange(sheet, range2, m) {
3582
+ const { row: row2, col } = range2.start;
3583
+ for (let r = range2.start.row; r <= range2.end.row; r++) {
3584
+ for (let c2 = range2.start.col; c2 <= range2.end.col; c2++) {
3585
+ const value3 = cellValueOf(pick(m, r - row2, c2 - col));
3586
+ const cell = getCell(sheet, r, c2);
3587
+ if (cell) cell.value = value3;
3588
+ else putCell(sheet, r, c2, { value: value3 });
3589
+ }
3590
+ }
3591
+ }
3592
+ var cellValueOf = (value3) => value3 === null ? 0 : value3;
3593
+
3594
+ // xlsx/formula/engine-prepare.ts
3595
+ var CHECK_EVERY = 32;
3596
+ var GraphPreparation = class {
3597
+ constructor(workbook, create) {
3598
+ this.workbook = workbook;
3599
+ this.create = create;
3600
+ }
3601
+ workbook;
3602
+ create;
3603
+ reverse = new ReverseIndex();
3604
+ formulas = { dynamic: [], unvalued: [] };
3605
+ /**
3606
+ * The spills stored in the file, by sheet and anchor (`cellKey`): from the anchor to the last
3607
+ * row and column of the cells marked as its results. Until the anchor is evaluated they are
3608
+ * the only record of the cells it covers.
3609
+ */
3610
+ spills = /* @__PURE__ */ new Map();
3611
+ sheet = 0;
3612
+ rows;
3613
+ row = 0;
3614
+ cells;
3615
+ finished = false;
3616
+ /**
3617
+ * Adds formulas to the graph until `timeRemaining` (milliseconds, as an idle deadline reports
3618
+ * them) reaches zero, or until every formula is in. Returns true when the graph is complete.
3619
+ */
3620
+ run(timeRemaining) {
3621
+ let visited = 0;
3622
+ while (!this.finished) {
3623
+ const cells = this.cells ?? this.nextRow();
3624
+ if (!cells) continue;
3625
+ const next = cells.next();
3626
+ if (next.done) {
3627
+ this.cells = void 0;
3628
+ continue;
3629
+ }
3630
+ const [col, cell] = next.value;
3631
+ if (cell.formula) this.add(this.create(this.sheet, this.row, col, cell), cell);
3632
+ else if (isSpilledCell(cell)) this.addSpilled(this.row, col, cell.spillAnchor);
3633
+ if (timeRemaining && ++visited % CHECK_EVERY === 0 && timeRemaining() <= 0) break;
3634
+ }
3635
+ return this.finished;
3636
+ }
3637
+ add(node2, cell) {
3638
+ this.reverse.addNode(node2);
3639
+ if (!node2.legacy && !node2.arrayRange) this.formulas.dynamic.push(node2);
3640
+ if (cell.value === null && !node2.keepCached) this.formulas.unvalued.push(node2);
3641
+ }
3642
+ addSpilled(row2, col, anchor) {
3643
+ if (row2 < anchor.row || col < anchor.col) return;
3644
+ let spills = this.spills.get(this.sheet);
3645
+ if (!spills) this.spills.set(this.sheet, spills = /* @__PURE__ */ new Map());
3646
+ const key = cellKey(anchor.row, anchor.col);
3647
+ const range2 = spills.get(key);
3648
+ if (!range2) spills.set(key, { start: { ...anchor }, end: { row: row2, col } });
3649
+ else {
3650
+ range2.end.row = Math.max(range2.end.row, row2);
3651
+ range2.end.col = Math.max(range2.end.col, col);
3652
+ }
3653
+ }
3654
+ /** Moves to the next stored row (and sheet), or marks the walk finished. */
3655
+ nextRow() {
3656
+ for (; ; ) {
3657
+ const sheet = this.workbook.sheets[this.sheet];
3658
+ if (!sheet) {
3659
+ this.finished = true;
3660
+ return void 0;
3661
+ }
3662
+ this.rows ??= sheet.rows.entries();
3663
+ const next = this.rows.next();
3664
+ if (!next.done) {
3665
+ this.row = next.value[0];
3666
+ this.cells = next.value[1].entries();
3667
+ return this.cells;
3668
+ }
3669
+ this.rows = void 0;
3670
+ this.sheet++;
3671
+ }
3672
+ }
3673
+ };
3674
+
3396
3675
  // xlsx/formula/functions/wildcard.ts
3397
3676
  var lower = (ch) => (ch ?? "").toLowerCase();
3398
3677
  var fold = (text4) => Array.from({ length: text4.length }, (_, i2) => lower(text4[i2]));
@@ -6866,138 +7145,6 @@ var INFO_FUNCTIONS = [
6866
7145
  )
6867
7146
  ];
6868
7147
 
6869
- // xlsx/formula/operators.ts
6870
- var signal = (fn) => {
6871
- try {
6872
- return fn();
6873
- } catch (e) {
6874
- if (e instanceof ErrorSignal) return e.value;
6875
- throw e;
6876
- }
6877
- };
6878
- function power(base, exponent) {
6879
- if (base === 0 && exponent === 0) throw new ErrorSignal(ERR.NUM);
6880
- if (base === 0 && exponent < 0) throw new ErrorSignal(ERR.DIV0);
6881
- if (base < 0 && !Number.isInteger(exponent)) {
6882
- const inverse = 1 / exponent;
6883
- const odd = Math.round(inverse);
6884
- if (Math.abs(inverse - odd) < 1e-10 && Math.abs(odd) % 2 === 1) {
6885
- return -Math.pow(-base, exponent);
6886
- }
6887
- throw new ErrorSignal(ERR.NUM);
6888
- }
6889
- return Math.pow(base, exponent);
6890
- }
6891
- function snapToZero(result2, a2, b) {
6892
- if (result2 !== 0 && Math.abs(result2) <= Math.max(Math.abs(a2), Math.abs(b)) * 1e-15) return 0;
6893
- return result2;
6894
- }
6895
- function arithmetic(op2, x, y, snap) {
6896
- if (isError(x)) return x;
6897
- if (isError(y)) return y;
6898
- return signal(() => {
6899
- const a2 = toNumber(x);
6900
- const b = toNumber(y);
6901
- let r;
6902
- switch (op2) {
6903
- case "+":
6904
- r = a2 + b;
6905
- if (snap) r = snapToZero(r, a2, b);
6906
- break;
6907
- case "-":
6908
- r = a2 - b;
6909
- if (snap) r = snapToZero(r, a2, b);
6910
- break;
6911
- case "*":
6912
- r = a2 * b;
6913
- break;
6914
- case "/":
6915
- if (b === 0) return ERR.DIV0;
6916
- r = a2 / b;
6917
- break;
6918
- default:
6919
- r = power(a2, b);
6920
- }
6921
- return Number.isFinite(r) ? r === 0 ? 0 : r : ERR.NUM;
6922
- });
6923
- }
6924
- function comparison(op2, x, y) {
6925
- if (isError(x)) return x;
6926
- if (isError(y)) return y;
6927
- const c2 = compareScalars(x, y);
6928
- switch (op2) {
6929
- case "=":
6930
- return c2 === 0;
6931
- case "<>":
6932
- return c2 !== 0;
6933
- case "<":
6934
- return c2 < 0;
6935
- case ">":
6936
- return c2 > 0;
6937
- case "<=":
6938
- return c2 <= 0;
6939
- default:
6940
- return c2 >= 0;
6941
- }
6942
- }
6943
- function concat(x, y) {
6944
- if (isError(x)) return x;
6945
- if (isError(y)) return y;
6946
- return toText(x) + toText(y);
6947
- }
6948
- function scalarBinary(op2, x, y, snap = false) {
6949
- if (op2 === "&") return concat(x, y);
6950
- if (op2 === "+" || op2 === "-" || op2 === "*" || op2 === "/" || op2 === "^") {
6951
- return arithmetic(op2, x, y, snap);
6952
- }
6953
- return comparison(op2, x, y);
6954
- }
6955
- function scalarUnary(op2, x) {
6956
- if (isError(x)) return x;
6957
- return signal(() => {
6958
- const n2 = toNumber(x);
6959
- const r = op2 === "-" ? -n2 : n2 / 100;
6960
- return r === 0 ? 0 : r;
6961
- });
6962
- }
6963
- function pick(m, row2, col) {
6964
- const r = m.rows === 1 ? 0 : row2;
6965
- const c2 = m.cols === 1 ? 0 : col;
6966
- if (r >= m.rows || c2 >= m.cols) return ERR.NA;
6967
- return m.get(r, c2);
6968
- }
6969
- function broadcastShape(operands, at) {
6970
- let rows2 = 1;
6971
- let cols = 1;
6972
- for (const m of operands) {
6973
- rows2 = Math.max(rows2, m.rows);
6974
- cols = Math.max(cols, m.cols);
6975
- }
6976
- if (!operands.some((m) => m.isPadded)) return Matrix.build(rows2, cols, at);
6977
- let blockRows = 1;
6978
- let blockCols = 1;
6979
- for (const m of operands) {
6980
- blockRows = Math.max(blockRows, m.isPadded ? m.blockRows : m.rows);
6981
- blockCols = Math.max(blockCols, m.isPadded ? m.blockCols : m.cols);
6982
- }
6983
- blockRows = Math.min(blockRows, rows2);
6984
- blockCols = Math.min(blockCols, cols);
6985
- const varies = operands.some(
6986
- (m) => blockRows < rows2 && m.rows === 1 && m.cols > 1 || blockCols < cols && m.cols === 1 && m.rows > 1
6987
- );
6988
- if (varies) return Matrix.build(rows2, cols, at);
6989
- return Matrix.padded(Matrix.build(blockRows, blockCols, at), rows2, cols, at(rows2 - 1, cols - 1));
6990
- }
6991
- function broadcast2(a2, b, fn) {
6992
- if (!(a2 instanceof Matrix) && !(b instanceof Matrix)) return fn(a2, b);
6993
- const ma = a2 instanceof Matrix ? a2 : new Matrix([[a2]]);
6994
- const mb = b instanceof Matrix ? b : new Matrix([[b]]);
6995
- return broadcastShape([ma, mb], (r, c2) => fn(pick(ma, r, c2), pick(mb, r, c2)));
6996
- }
6997
- function broadcast1(a2, fn) {
6998
- return a2 instanceof Matrix ? a2.mapValues(fn) : fn(a2);
6999
- }
7000
-
7001
7148
  // xlsx/formula/functions/lambda.ts
7002
7149
  var C16 = "Logical";
7003
7150
  function lambdaArg(value3) {
@@ -11735,6 +11882,19 @@ var DEFAULT_XML_LIMITS = {
11735
11882
  maxDepth: 512,
11736
11883
  maxNodes: 5e6
11737
11884
  };
11885
+ var XmlLimitError = class extends Error {
11886
+ code = "xml-limit";
11887
+ /** The limit that was exceeded. */
11888
+ limit;
11889
+ /** Its value: the largest depth or element count allowed. */
11890
+ maximum;
11891
+ constructor(message, limit2, maximum) {
11892
+ super(message);
11893
+ this.name = "XmlLimitError";
11894
+ this.limit = limit2;
11895
+ this.maximum = maximum;
11896
+ }
11897
+ };
11738
11898
  var TAG_RE = /<(\/?)([^\s\/><]+)(?:\s+[^\s=\/><]+\s*=\s*(?:"[^"<]*"|'[^'<]*'))*\s*(\/?)>/y;
11739
11899
  var MARKUP_SKIPS = [
11740
11900
  ["<!--", "-->"],
@@ -11768,11 +11928,22 @@ function checkXmlLimits(xml, label2, limits = {}) {
11768
11928
  continue;
11769
11929
  }
11770
11930
  nodes++;
11771
- if (nodes > maxNodes) throw new Error(`${label2} XML exceeds the limit of ${maxNodes} elements`);
11931
+ if (nodes > maxNodes)
11932
+ throw new XmlLimitError(
11933
+ `${label2} XML exceeds the limit of ${maxNodes} elements`,
11934
+ "maxNodes",
11935
+ maxNodes
11936
+ );
11772
11937
  if (!selfClosing && ++depth > maxDepth)
11773
- throw new Error(`${label2} XML exceeds the nesting depth limit of ${maxDepth}`);
11938
+ throw new XmlLimitError(
11939
+ `${label2} XML exceeds the nesting depth limit of ${maxDepth}`,
11940
+ "maxDepth",
11941
+ maxDepth
11942
+ );
11774
11943
  }
11775
11944
  }
11945
+ var CRLF_DECLARATION = /^<\?xml[^>]*\?>\r\n/;
11946
+ var crlfDeclarations = /* @__PURE__ */ new WeakSet();
11776
11947
  function parseXml(xml, options7 = {}) {
11777
11948
  const label2 = options7.label ?? "OOXML";
11778
11949
  if (/<!DOCTYPE|<!ENTITY/i.test(xml))
@@ -11794,9 +11965,13 @@ function parseXml(xml, options7 = {}) {
11794
11965
  }
11795
11966
  if (parseError || !parsed.documentElement)
11796
11967
  throw new Error(`Invalid ${label2} XML: ${parseError || "missing root element"}`);
11968
+ if (CRLF_DECLARATION.test(xml)) crlfDeclarations.add(parsed);
11797
11969
  return parsed;
11798
11970
  }
11799
- var buildXml = (node2) => new XMLSerializer().serializeToString(node2);
11971
+ var buildXml = (node2) => {
11972
+ const xml = new XMLSerializer().serializeToString(node2);
11973
+ return crlfDeclarations.has(node2) ? xml.replace(/^(<\?xml[^>]*\?>)\n/, "$1\r\n") : xml;
11974
+ };
11800
11975
  var isElement = (node2) => node2.nodeType === 1;
11801
11976
  var elements = (parent) => Array.from(parent.childNodes).filter(isElement);
11802
11977
  function named(element2, local, ns, lenient = true) {
@@ -14913,89 +15088,6 @@ function sheetBounds(sheet) {
14913
15088
  return { rows: rows2, cols };
14914
15089
  }
14915
15090
 
14916
- // xlsx/formula/spill.ts
14917
- var isSpilledCell = (cell) => cell !== void 0 && "spillAnchor" in cell;
14918
- function releaseSpilledCell(sheet, row2, col) {
14919
- const cell = getCell(sheet, row2, col);
14920
- if (!isSpilledCell(cell)) return;
14921
- delete cell.spillAnchor;
14922
- cell.value = null;
14923
- if (!cell.styleId && !cell.formula && !cell.richText && !cell.arrayRange)
14924
- deleteCell(sheet, row2, col);
14925
- }
14926
- function clearFootprint(sheet, footprint, row2, col) {
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 (isSpilledCell(cell) && cell.spillAnchor.row === row2 && cell.spillAnchor.col === col) {
14934
- releaseSpilledCell(sheet, r, c2);
14935
- }
14936
- }
14937
- }
14938
- }
14939
- function footprintFor(row2, col, m) {
14940
- const end = { row: row2 + m.rows - 1, col: col + m.cols - 1 };
14941
- if (end.row > MAX_ROW || end.col > MAX_COL) return void 0;
14942
- return { start: { row: row2, col }, end };
14943
- }
14944
- function footprintFree(sheet, footprint, row2, col, claims) {
14945
- if (sheet.merges.some((m) => rangesIntersect(m, footprint))) return false;
14946
- for (let r = footprint.start.row; r <= footprint.end.row; r++) {
14947
- const cells = sheet.rows.get(r);
14948
- if (!cells) continue;
14949
- for (let c2 = footprint.start.col; c2 <= footprint.end.col; c2++) {
14950
- if (r === row2 && c2 === col) continue;
14951
- const cell = cells.get(c2);
14952
- if (!cell) continue;
14953
- if (cell.formula) return false;
14954
- if (isSpilledCell(cell)) {
14955
- const a2 = cell.spillAnchor;
14956
- if (a2.row === row2 && a2.col === col) continue;
14957
- if (claims(a2, r, c2)) return false;
14958
- continue;
14959
- }
14960
- if (cell.value !== null) return false;
14961
- }
14962
- }
14963
- return true;
14964
- }
14965
- function writeFootprint(sheet, footprint, m) {
14966
- const { row: row2, col } = footprint.start;
14967
- for (let r = footprint.start.row; r <= footprint.end.row; r++) {
14968
- for (let c2 = footprint.start.col; c2 <= footprint.end.col; c2++) {
14969
- const value3 = cellValueOf(m.get(r - row2, c2 - col));
14970
- const cell = getCell(sheet, r, c2);
14971
- if (r === row2 && c2 === col) {
14972
- if (cell) cell.value = value3;
14973
- continue;
14974
- }
14975
- if (cell) {
14976
- cell.value = value3;
14977
- if (!isSpilledCell(cell) || cell.spillAnchor.row !== row2 || cell.spillAnchor.col !== col)
14978
- cell.spillAnchor = { row: row2, col };
14979
- } else {
14980
- const spilled = { value: value3, spillAnchor: { row: row2, col } };
14981
- putCell(sheet, r, c2, spilled);
14982
- }
14983
- }
14984
- }
14985
- }
14986
- function fillArrayRange(sheet, range2, m) {
14987
- const { row: row2, col } = range2.start;
14988
- for (let r = range2.start.row; r <= range2.end.row; r++) {
14989
- for (let c2 = range2.start.col; c2 <= range2.end.col; c2++) {
14990
- const value3 = cellValueOf(pick(m, r - row2, c2 - col));
14991
- const cell = getCell(sheet, r, c2);
14992
- if (cell) cell.value = value3;
14993
- else putCell(sheet, r, c2, { value: value3 });
14994
- }
14995
- }
14996
- }
14997
- var cellValueOf = (value3) => value3 === null ? 0 : value3;
14998
-
14999
15091
  // xlsx/formula/engine-host.ts
15000
15092
  var Deferred = class {
15001
15093
  constructor(node2) {
@@ -15920,6 +16012,8 @@ var Engine = class extends EngineStructure {
15920
16012
  preparation;
15921
16013
  /** The prepared formulas the first recalculation checks (see `trustsStoredValues`). */
15922
16014
  prepared;
16015
+ /** Stored spills released when the graph was built: their readers must recalculate. */
16016
+ released = [];
15923
16017
  // ---- the graph ----
15924
16018
  prepare(timeRemaining) {
15925
16019
  if (this.built || this.needsFull) return true;
@@ -15957,10 +16051,33 @@ var Engine = class extends EngineStructure {
15957
16051
  finishPreparation(preparation) {
15958
16052
  this.preparation = void 0;
15959
16053
  this.built = true;
16054
+ this.adoptStoredSpills(preparation.spills);
15960
16055
  this.graphChanged();
15961
16056
  this.reverseIndex = preparation.reverse;
15962
16057
  this.prepared = preparation.formulas;
15963
16058
  }
16059
+ /**
16060
+ * Takes the spills a file stored as their anchors' last footprints, so that overwriting an
16061
+ * anchor or shrinking its result clears the cells it covered before it was ever evaluated here.
16062
+ * Cells marked for an anchor that holds no formula able to spill are released.
16063
+ */
16064
+ adoptStoredSpills(spills) {
16065
+ for (const [s, anchors] of spills)
16066
+ for (const [key, range2] of anchors) {
16067
+ const node2 = this.nodes.get(s)?.get(key);
16068
+ if (node2 && !node2.legacy && !node2.arrayRange) {
16069
+ if (!node2.spill && !node2.blockedSpill) {
16070
+ node2.spill = range2;
16071
+ this.footprints.add(node2);
16072
+ }
16073
+ continue;
16074
+ }
16075
+ const sheet = this.workbook.sheets[s];
16076
+ if (!sheet) continue;
16077
+ clearFootprint(sheet, range2, range2.start.row, range2.start.col);
16078
+ this.released.push({ sheet: s, range: range2 });
16079
+ }
16080
+ }
15964
16081
  // ---- recalculation ----
15965
16082
  recalculateAll() {
15966
16083
  resetArrayBudget();
@@ -15969,6 +16086,7 @@ var Engine = class extends EngineStructure {
15969
16086
  if (this.needsFull) this.releaseAllSpills();
15970
16087
  if (!this.built || this.needsFull) this.build();
15971
16088
  this.needsFull = false;
16089
+ this.released = [];
15972
16090
  this.structuralSeeds.clear();
15973
16091
  this.cycles = /* @__PURE__ */ new Set();
15974
16092
  this.run(new Set(this.allNodes()), true);
@@ -15987,7 +16105,9 @@ var Engine = class extends EngineStructure {
15987
16105
  this.recalculateAll();
15988
16106
  return;
15989
16107
  }
15990
- const changed = [];
16108
+ const changed = this.released;
16109
+ this.released = [];
16110
+ const written = [];
15991
16111
  let structural = false;
15992
16112
  for (const change of changes) {
15993
16113
  const sheet = this.workbook.sheets[change.sheet];
@@ -16007,7 +16127,8 @@ var Engine = class extends EngineStructure {
16007
16127
  seeds.add(this.createNode(change.sheet, row2, col, cell, false));
16008
16128
  structural = true;
16009
16129
  } else if (existing && formula) seeds.add(existing);
16010
- changed.push({ sheet: change.sheet, range: { start: { row: row2, col }, end: { row: row2, col } } });
16130
+ written.push(change);
16131
+ if (!this.footprints.size) continue;
16011
16132
  const anchors = [];
16012
16133
  this.footprintsBy().dependents(
16013
16134
  change.sheet,
@@ -16024,7 +16145,8 @@ var Engine = class extends EngineStructure {
16024
16145
  if (structural) this.graphChanged();
16025
16146
  this.takeStructuralSeeds(seeds);
16026
16147
  const reverse2 = this.reverse();
16027
- for (const area of changed) reverse2.dependents(area.sheet, area.range, seeds);
16148
+ for (const area of [...changed, ...changeAreas(written)])
16149
+ reverse2.dependents(area.sheet, area.range, seeds);
16028
16150
  for (const node2 of this.allNodes()) if (node2.volatile) seeds.add(node2);
16029
16151
  this.run(seeds, false);
16030
16152
  }
@@ -16037,11 +16159,17 @@ var Engine = class extends EngineStructure {
16037
16159
  const prepared = this.prepared;
16038
16160
  this.prepared = void 0;
16039
16161
  if (!prepared) return false;
16040
- const changed = new Set(changes.map((c2) => `${c2.sheet}:${cellKey(c2.row, c2.col)}`));
16041
16162
  const current = (node2) => this.nodes.get(node2.sheet)?.get(cellKey(node2.row, node2.col)) === node2;
16042
- for (const node2 of prepared.dynamic) {
16043
- if (current(node2) && !changed.has(`${node2.sheet}:${cellKey(node2.row, node2.col)}`))
16044
- return false;
16163
+ const dynamic = prepared.dynamic.filter(current);
16164
+ if (dynamic.length) {
16165
+ const changed = /* @__PURE__ */ new Map();
16166
+ for (const c2 of changes) {
16167
+ let keys = changed.get(c2.sheet);
16168
+ if (!keys) changed.set(c2.sheet, keys = /* @__PURE__ */ new Set());
16169
+ keys.add(cellKey(c2.row, c2.col));
16170
+ }
16171
+ for (const node2 of dynamic)
16172
+ if (!changed.get(node2.sheet)?.has(cellKey(node2.row, node2.col))) return false;
16045
16173
  }
16046
16174
  for (const node2 of prepared.unvalued) {
16047
16175
  const cell = this.workbook.sheets[node2.sheet]?.rows.get(node2.row)?.get(node2.col);
@@ -16769,10 +16897,13 @@ var DEFAULT_ZIP_LIMITS = {
16769
16897
  var ZipLimitError = class extends Error {
16770
16898
  code = "ZIP_BOMB";
16771
16899
  limit;
16900
+ /** The check that failed (absent when the error was built without one). */
16901
+ kind;
16772
16902
  constructor(message, details) {
16773
16903
  super(message);
16774
16904
  this.name = "ZipLimitError";
16775
16905
  this.limit = details.limit;
16906
+ this.kind = details.kind;
16776
16907
  }
16777
16908
  };
16778
16909
  var mib = (bytes) => Math.round(bytes / 1048576);
@@ -16795,7 +16926,7 @@ function resolveLimits(limits) {
16795
16926
  maxEntryBytes: limits.maxEntryBytes ?? DEFAULT_ZIP_LIMITS.maxEntryBytes,
16796
16927
  maxTotalBytes: limits.maxTotalBytes ?? DEFAULT_ZIP_LIMITS.maxTotalBytes,
16797
16928
  label: limits.label ?? "ZIP",
16798
- fail: (message, limit2) => create ? create(message, { limit: limit2 }) : new ZipLimitError(message, { limit: limit2 })
16929
+ fail: (message, limit2, kind) => create ? create(message, { limit: limit2, kind }) : new ZipLimitError(message, { limit: limit2, kind })
16799
16930
  };
16800
16931
  }
16801
16932
  function inflateEntryGuarded(entry3, alreadyRead, limits) {
@@ -16818,13 +16949,18 @@ function inflateEntryGuarded(entry3, alreadyRead, limits) {
16818
16949
  size += chunk.byteLength;
16819
16950
  if (size > declared || size > r.maxEntryBytes)
16820
16951
  return abort(
16821
- r.fail(`${r.label} part ${entry3.name} inflates past its declared size`, r.maxEntryBytes)
16952
+ r.fail(
16953
+ `${r.label} part ${entry3.name} inflates past its declared size`,
16954
+ r.maxEntryBytes,
16955
+ size > declared ? "declaredSize" : "maxEntryBytes"
16956
+ )
16822
16957
  );
16823
16958
  if (alreadyRead + size > r.maxTotalBytes)
16824
16959
  return abort(
16825
16960
  r.fail(
16826
16961
  `${r.label} package exceeds the ${mib(r.maxTotalBytes)} MiB uncompressed content limit`,
16827
- r.maxTotalBytes
16962
+ r.maxTotalBytes,
16963
+ "maxTotalBytes"
16828
16964
  )
16829
16965
  );
16830
16966
  chunks.push(chunk);
@@ -16857,26 +16993,29 @@ function guardZip(zip, limits = {}) {
16857
16993
  if (entries.length > r.maxEntries)
16858
16994
  throw r.fail(
16859
16995
  `${r.label} package exceeds the ${r.maxEntries.toLocaleString("en-US")} part limit`,
16860
- r.maxEntries
16996
+ r.maxEntries,
16997
+ "maxEntries"
16861
16998
  );
16862
16999
  let declared = 0;
16863
17000
  for (const entry3 of entries) {
16864
17001
  const original = entry3.unsafeOriginalName;
16865
17002
  if (!isSafePartName(entry3.name) || original !== void 0 && !isSafePartName(original))
16866
- throw r.fail(`${r.label} package has an unsafe part name`, r.maxEntries);
17003
+ throw r.fail(`${r.label} package has an unsafe part name`, r.maxEntries, "partName");
16867
17004
  if (entry3.dir) continue;
16868
17005
  const size = declaredEntrySize(entry3);
16869
17006
  if (size > r.maxEntryBytes)
16870
17007
  throw r.fail(
16871
17008
  `${r.label} part ${entry3.name} exceeds the uncompressed part size limit`,
16872
- r.maxEntryBytes
17009
+ r.maxEntryBytes,
17010
+ "maxEntryBytes"
16873
17011
  );
16874
17012
  declared += size;
16875
17013
  }
16876
17014
  if (declared > r.maxTotalBytes)
16877
17015
  throw r.fail(
16878
17016
  `${r.label} package exceeds the ${mib(r.maxTotalBytes)} MiB uncompressed content limit`,
16879
- r.maxTotalBytes
17017
+ r.maxTotalBytes,
17018
+ "maxTotalBytes"
16880
17019
  );
16881
17020
  const produced = /* @__PURE__ */ new Map();
16882
17021
  let total2 = 0;
@@ -18919,10 +19058,69 @@ function mergeComments(legacy, threaded) {
18919
19058
  (a2, b) => a2.address.row - b.address.row || a2.address.col - b.address.col
18920
19059
  );
18921
19060
  }
18922
- var MAX_INPUT_BYTES = 50 * 1024 * 1024;
18923
- var MAX_PARTS = 1e4;
18924
- var MAX_UNCOMPRESSED_BYTES = 300 * 1024 * 1024;
18925
- var MAX_PART_BYTES = 200 * 1024 * 1024;
19061
+
19062
+ // xlsx/read/limits.ts
19063
+ var DEFAULT_XLSX_LOAD_LIMITS = {
19064
+ maxInputBytes: 50 * 1024 * 1024,
19065
+ maxParts: 1e4,
19066
+ maxPartBytes: 200 * 1024 * 1024,
19067
+ maxTotalBytes: 300 * 1024 * 1024,
19068
+ maxXmlElements: 5e6
19069
+ };
19070
+ var WorkbookTooLargeError = class extends Error {
19071
+ code = "workbook-too-large";
19072
+ /** The limit that was exceeded, as named in {@link XlsxLoadLimits}. */
19073
+ limit;
19074
+ /** The value of that limit when the load failed. */
19075
+ maximum;
19076
+ constructor(message, limit2, maximum, options7) {
19077
+ super(message, options7);
19078
+ this.name = "WorkbookTooLargeError";
19079
+ this.limit = limit2;
19080
+ this.maximum = maximum;
19081
+ }
19082
+ };
19083
+ function resolveLoadLimits(limits = {}) {
19084
+ const resolved = { ...DEFAULT_XLSX_LOAD_LIMITS };
19085
+ for (const name of Object.keys(resolved)) {
19086
+ const value3 = limits[name];
19087
+ if (value3 === void 0) continue;
19088
+ if (!Number.isFinite(value3) || value3 <= 0)
19089
+ throw new RangeError(`limits.${name} must be a positive finite number`);
19090
+ resolved[name] = value3;
19091
+ }
19092
+ return resolved;
19093
+ }
19094
+ var ZIP_LIMIT_NAMES = {
19095
+ maxInputBytes: "maxInputBytes",
19096
+ maxEntries: "maxParts",
19097
+ maxEntryBytes: "maxPartBytes",
19098
+ maxTotalBytes: "maxTotalBytes"
19099
+ };
19100
+ function zipLimitsFor(limits) {
19101
+ return {
19102
+ maxInputBytes: limits.maxInputBytes,
19103
+ maxEntries: limits.maxParts,
19104
+ maxEntryBytes: limits.maxPartBytes,
19105
+ maxTotalBytes: limits.maxTotalBytes,
19106
+ label: "XLSX",
19107
+ createError: (message, { limit: limit2, kind }) => {
19108
+ const name = ZIP_LIMIT_NAMES[kind];
19109
+ return name ? new WorkbookTooLargeError(message, name, limit2) : new ZipLimitError(message, { limit: limit2, kind });
19110
+ }
19111
+ };
19112
+ }
19113
+ function parseDataXml(xml, label2, maxXmlElements = DEFAULT_XLSX_LOAD_LIMITS.maxXmlElements) {
19114
+ try {
19115
+ return parseXml(xml, { label: label2, limits: { maxNodes: maxXmlElements } });
19116
+ } catch (error) {
19117
+ if (error instanceof XmlLimitError && error.limit === "maxNodes")
19118
+ throw new WorkbookTooLargeError(error.message, "maxXmlElements", error.maximum, {
19119
+ cause: error
19120
+ });
19121
+ throw error;
19122
+ }
19123
+ }
18926
19124
  var CONTENT_TYPES = {
18927
19125
  workbook: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
18928
19126
  workbookMacro: "application/vnd.ms-excel.sheet.macroEnabled.main+xml",
@@ -19012,16 +19210,15 @@ var SourceIndex = class {
19012
19210
  };
19013
19211
  var mib2 = (bytes) => Math.round(bytes / 1048576);
19014
19212
  async function readZipParts(input, limits = {}) {
19015
- const maxInput = limits.maxInputBytes ?? MAX_INPUT_BYTES;
19016
- const zipLimits = {
19017
- maxEntries: limits.maxParts ?? MAX_PARTS,
19018
- maxEntryBytes: limits.maxPartBytes ?? MAX_PART_BYTES,
19019
- maxTotalBytes: limits.maxTotalBytes ?? MAX_UNCOMPRESSED_BYTES,
19020
- label: "XLSX"
19021
- };
19213
+ const resolved = resolveLoadLimits(limits);
19214
+ const maxInput = resolved.maxInputBytes;
19022
19215
  const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);
19023
19216
  if (bytes.byteLength > maxInput)
19024
- throw new Error(`XLSX package exceeds the ${mib2(maxInput)} MiB compressed input limit`);
19217
+ throw new WorkbookTooLargeError(
19218
+ `XLSX package exceeds the ${mib2(maxInput)} MiB compressed input limit`,
19219
+ "maxInputBytes",
19220
+ maxInput
19221
+ );
19025
19222
  let loaded;
19026
19223
  try {
19027
19224
  loaded = await JSZip2.loadAsync(bytes);
@@ -19031,7 +19228,7 @@ async function readZipParts(input, limits = {}) {
19031
19228
  { cause: error }
19032
19229
  );
19033
19230
  }
19034
- const zip = guardZip(loaded, zipLimits);
19231
+ const zip = guardZip(loaded, zipLimitsFor(resolved));
19035
19232
  const parts = /* @__PURE__ */ new Map();
19036
19233
  for (const entry3 of Object.values(zip.files)) {
19037
19234
  if (entry3.dir) continue;
@@ -19238,9 +19435,9 @@ function parseRichString(element2, palette) {
19238
19435
  const text4 = parsed.map((run2) => run2.text).join("");
19239
19436
  return { text: text4, runs: parsed };
19240
19437
  }
19241
- function parseSharedStrings(xml, palette) {
19438
+ function parseSharedStrings(xml, palette, maxXmlElements) {
19242
19439
  if (!xml) return [];
19243
- const root = parseXml(xml, { label: "XLSX shared strings" }).documentElement;
19440
+ const root = parseDataXml(xml, "XLSX shared strings", maxXmlElements).documentElement;
19244
19441
  return xChildren(root, "si").map((si) => parseRichString(si, palette));
19245
19442
  }
19246
19443
 
@@ -24861,7 +25058,11 @@ function parseWorksheet(ctx, partName, name, sheetId) {
24861
25058
  return sheet;
24862
25059
  }
24863
25060
  const split = splitSheetData(xml);
24864
- const root = parseXml(split?.xml ?? xml, { label: "XLSX worksheet" }).documentElement;
25061
+ const root = parseDataXml(
25062
+ split?.xml ?? xml,
25063
+ "XLSX worksheet",
25064
+ ctx.maxXmlElements
25065
+ ).documentElement;
24865
25066
  const byName = /* @__PURE__ */ new Map();
24866
25067
  const cfBlocks = [];
24867
25068
  for (const node2 of elements(root)) {
@@ -24935,8 +25136,9 @@ function liftPrintAreas(workbook) {
24935
25136
  return false;
24936
25137
  });
24937
25138
  }
24938
- async function loadXlsx(input) {
24939
- const parts = await readZipParts(input);
25139
+ async function loadXlsx(input, options7 = {}) {
25140
+ const limits = resolveLoadLimits(options7.limits);
25141
+ const parts = await readZipParts(input, limits);
24940
25142
  const source2 = new SourceIndex(parts);
24941
25143
  const workbookPart = source2.workbookPart();
24942
25144
  if (!workbookPart) throw new Error("XLSX package has no workbook part (xl/workbook.xml)");
@@ -24957,7 +25159,8 @@ async function loadXlsx(input) {
24957
25159
  source: source2,
24958
25160
  sharedStrings: parseSharedStrings(
24959
25161
  stringsPart ? source2.text(stringsPart) : void 0,
24960
- styles.palette
25162
+ styles.palette,
25163
+ limits.maxXmlElements
24961
25164
  ),
24962
25165
  xfMap: styles.xfMap,
24963
25166
  date1904: book.date1904,
@@ -24965,7 +25168,8 @@ async function loadXlsx(input) {
24965
25168
  dxfs: styles.dxfs,
24966
25169
  persons: parsePersons(personsPart ? source2.text(personsPart) : void 0),
24967
25170
  dynamicCells: parseDynamicArrayMetadata(metadataPart ? source2.text(metadataPart) : void 0),
24968
- warn
25171
+ warn,
25172
+ maxXmlElements: limits.maxXmlElements
24969
25173
  };
24970
25174
  const rels = source2.rels(workbookPart);
24971
25175
  const sheets = book.sheets.map((entry3) => {
@@ -29277,10 +29481,8 @@ function sheetFormatXml(sheet) {
29277
29481
  const current = { defaultRowHeight: sheet.defaultRowHeight };
29278
29482
  if (sheet.defaultColWidth !== void 0) current.defaultColWidth = sheet.defaultColWidth;
29279
29483
  if (sheet.format && Object.keys(sheet.format).length) current.format = sheet.format;
29280
- const rowLevel = Math.max(
29281
- 0,
29282
- ...[...sheet.rowInfo.values()].map((info) => info.outlineLevel ?? 0)
29283
- );
29484
+ let rowLevel = 0;
29485
+ for (const info of sheet.rowInfo.values()) rowLevel = Math.max(rowLevel, info.outlineLevel ?? 0);
29284
29486
  const colLevel = Math.max(0, ...sheet.columns.map((col) => col.outlineLevel ?? 0));
29285
29487
  if (source2 && sameModel(readSheetFormat(source2), current) && Number(source2.getAttribute("outlineLevelRow") ?? 0) === rowLevel && Number(source2.getAttribute("outlineLevelCol") ?? 0) === colLevel)
29286
29488
  return snapshotXml(sheet, "sheetFormatPr") ?? "";
@@ -29582,11 +29784,10 @@ function pivotCacheDefinitionXml(pivot, workbook, data, recordRel) {
29582
29784
  const items = data.items[index3];
29583
29785
  if (pivot.dateFields?.includes(name) && items.every((v) => typeof v === "number")) {
29584
29786
  const serials = items;
29585
- const latest = Math.max(...serials);
29586
- const maxDate = Number.isInteger(latest) ? latest + 1 : latest;
29787
+ const range2 = dateGroupRange({}, serials);
29587
29788
  const parent = derived.filter((entry3) => entry3.group.field === name).at(-1);
29588
29789
  const link = parent ? `<fieldGroup par="${parent.index}"/>` : "";
29589
- return `<cacheField${attrs({ name: encodeEscapes(name), numFmtId: 14 })}><sharedItems${attrs({ containsSemiMixedTypes: false, containsNonDate: false, containsDate: true, containsString: false, minDate: iso(Math.min(...serials)), maxDate: iso(maxDate), count: serials.length })}>${serials.map((serial) => `<d v="${iso(serial)}"/>`).join("")}</sharedItems>${link}</cacheField>`;
29790
+ return `<cacheField${attrs({ name: encodeEscapes(name), numFmtId: 14 })}><sharedItems${attrs({ containsSemiMixedTypes: false, containsNonDate: false, containsDate: true, containsString: false, minDate: iso(range2.start), maxDate: iso(range2.end), count: serials.length })}>${serials.map((serial) => `<d v="${iso(serial)}"/>`).join("")}</sharedItems>${link}</cacheField>`;
29590
29791
  }
29591
29792
  const types = new Set(
29592
29793
  items.map((value3) => value3 === null || value3 === "" ? "blank" : typeof value3)
@@ -31001,7 +31202,8 @@ function setCellValue(ctx, s, row2, col, value3) {
31001
31202
  }
31002
31203
  function setRangeValues(ctx, s, at, values2) {
31003
31204
  const sheet = sheetAt(ctx.workbook, s);
31004
- const width = Math.max(0, ...values2.map((row2) => row2.length));
31205
+ let width = 0;
31206
+ for (const row2 of values2) width = Math.max(width, row2.length);
31005
31207
  if (!values2.length || !width) return;
31006
31208
  const range2 = cellRange(at.row, at.col, at.row + values2.length - 1, at.col + width - 1);
31007
31209
  ctx.run(
@@ -32325,23 +32527,33 @@ function toHtml(cells, theme2) {
32325
32527
  for (let c2 = m.start.col; c2 <= m.end.col; c2++)
32326
32528
  if (r !== m.start.row || c2 !== m.start.col) covered.add(`${r},${c2}`);
32327
32529
  }
32530
+ const styleAttrs = /* @__PURE__ */ new Map();
32531
+ const styleAttr2 = (style3) => {
32532
+ let attr2 = styleAttrs.get(style3);
32533
+ if (attr2 === void 0) {
32534
+ const css = cssFor(style3, theme2);
32535
+ styleAttrs.set(style3, attr2 = css ? `style="${escapeHtml(css)}"` : "");
32536
+ }
32537
+ return attr2;
32538
+ };
32328
32539
  const rows2 = [];
32329
32540
  for (let r = 0; r < cells.rows; r++) {
32330
32541
  const tds = [];
32331
32542
  for (let c2 = 0; c2 < cells.cols; c2++) {
32332
- if (covered.has(`${r},${c2}`)) continue;
32543
+ const key = covered.size || spans3.size || links.size ? `${r},${c2}` : "";
32544
+ if (covered.has(key)) continue;
32333
32545
  const cell = cells.data[r]?.[c2] ?? null;
32334
32546
  const attrs2 = [];
32335
- const span4 = spans3.get(`${r},${c2}`);
32547
+ const span4 = spans3.get(key);
32336
32548
  if (span4 && span4.end.row > span4.start.row)
32337
32549
  attrs2.push(`rowspan="${span4.end.row - span4.start.row + 1}"`);
32338
32550
  if (span4 && span4.end.col > span4.start.col)
32339
32551
  attrs2.push(`colspan="${span4.end.col - span4.start.col + 1}"`);
32340
32552
  if (cell && typeof cell.value === "number") attrs2.push(`x:num="${cell.value}"`);
32341
- const css = cssFor(cell?.style, theme2);
32342
- if (css) attrs2.push(`style="${escapeHtml(css)}"`);
32553
+ const css = styleAttr2(cell?.style);
32554
+ if (css) attrs2.push(css);
32343
32555
  let text4 = escapeHtml(cell?.text ?? "").replace(/\n/g, "<br>");
32344
- const link = links.get(`${r},${c2}`);
32556
+ const link = links.get(key);
32345
32557
  const href = htmlHref(link);
32346
32558
  if (href)
32347
32559
  text4 = `<a href="${escapeHtml(href)}"${link?.tooltip ? ` title="${escapeHtml(link.tooltip)}"` : ""}>${text4}</a>`;
@@ -32649,7 +32861,8 @@ function parseTsv(text4) {
32649
32861
  }
32650
32862
  row2.push(field);
32651
32863
  rows2.push(row2);
32652
- const width = Math.max(...rows2.map((r) => r.length));
32864
+ let width = 0;
32865
+ for (const r of rows2) width = Math.max(width, r.length);
32653
32866
  for (const r of rows2) while (r.length < width) r.push("");
32654
32867
  return rows2;
32655
32868
  }
@@ -32904,10 +33117,16 @@ function copyRange(workbook, s, range2) {
32904
33117
  { length: rows2 },
32905
33118
  () => Array.from({ length: cols }, () => null)
32906
33119
  );
33120
+ const styles = /* @__PURE__ */ new Map();
33121
+ const styleCopy = (id) => {
33122
+ let style3 = styles.get(id ?? 0);
33123
+ if (!style3) styles.set(id ?? 0, style3 = structuredClone(styleAt(workbook, id)));
33124
+ return style3;
33125
+ };
32907
33126
  forEachCellInRange(sheet, clipped, (cell, row2, col) => {
32908
33127
  const clip = {
32909
33128
  value: cell.value,
32910
- style: structuredClone(styleAt(workbook, cell.styleId)),
33129
+ style: styleCopy(cell.styleId),
32911
33130
  text: displayText(workbook, cell)
32912
33131
  };
32913
33132
  if (cell.formula !== void 0) clip.formula = cell.formula;
@@ -33846,6 +34065,17 @@ function shiftEdgeCells(sheet, spec2, phase) {
33846
34065
  return out;
33847
34066
  }
33848
34067
 
34068
+ // xlsx/edit/clone-cell.ts
34069
+ function cloneCell(cell) {
34070
+ const copy2 = { ...cell };
34071
+ const fields = copy2;
34072
+ for (const key of Object.keys(fields)) {
34073
+ const value3 = fields[key];
34074
+ if (typeof value3 === "object" && value3 !== null) fields[key] = structuredClone(value3);
34075
+ }
34076
+ return copy2;
34077
+ }
34078
+
33849
34079
  // xlsx/edit/history-rows.ts
33850
34080
  function captureRowInfo(sheet, rows2) {
33851
34081
  return [...new Set(rows2)].map((row2) => {
@@ -33886,12 +34116,14 @@ function restoreSettings(workbook, settings) {
33886
34116
  var PROBE_LIMIT = 4096;
33887
34117
  function captureCells(sheet, ranges) {
33888
34118
  const cells = [];
33889
- const seen = /* @__PURE__ */ new Set();
34119
+ const seen = ranges.length > 1 ? /* @__PURE__ */ new Set() : void 0;
33890
34120
  const take2 = (cell, row2, col) => {
33891
- const key = `${row2},${col}`;
33892
- if (seen.has(key)) return;
33893
- seen.add(key);
33894
- cells.push([row2, col, structuredClone(cell)]);
34121
+ if (seen) {
34122
+ const key = cellKey(row2, col);
34123
+ if (seen.has(key)) return;
34124
+ seen.add(key);
34125
+ }
34126
+ cells.push([row2, col, cloneCell(cell)]);
33895
34127
  };
33896
34128
  for (const raw2 of ranges) {
33897
34129
  const range2 = normalizeRange(raw2);
@@ -33968,7 +34200,7 @@ function restoreShift(workbook, snapshot) {
33968
34200
  if (!sheet) return;
33969
34201
  const shift2 = snapshot.phase === "before" ? { ...spec2.shift, count: -spec2.shift.count } : spec2.shift;
33970
34202
  moveCellsRaw(sheet, shift2, spec2.band);
33971
- for (const [row2, col, cell] of snapshot.cells) putCell(sheet, row2, col, structuredClone(cell));
34203
+ for (const [row2, col, cell] of snapshot.cells) putCell(sheet, row2, col, cloneCell(cell));
33972
34204
  restoreRefs(workbook, snapshot.data);
33973
34205
  workbook.activeSheet = snapshot.activeSheet;
33974
34206
  }
@@ -34017,18 +34249,51 @@ function restoreSnapshot(workbook, snapshot) {
34017
34249
  forEachCellInRange(sheet, range2, (_cell, row2, col) => doomed.push([row2, col]));
34018
34250
  for (const [row2, col] of doomed) deleteCell(sheet, row2, col);
34019
34251
  }
34020
- for (const [row2, col, cell] of snapshot.cells) putCell(sheet, row2, col, structuredClone(cell));
34252
+ for (const [row2, col, cell] of snapshot.cells) putCell(sheet, row2, col, cloneCell(cell));
34253
+ }
34254
+ function rowMajor(cells) {
34255
+ for (let i2 = 1; i2 < cells.length; i2++) {
34256
+ const [row0, col0] = cells[i2 - 1];
34257
+ const [row1, col1] = cells[i2];
34258
+ if (row1 < row0 || row1 === row0 && col1 <= col0) return false;
34259
+ }
34260
+ return true;
34021
34261
  }
34022
34262
  function touchedCells(step) {
34023
34263
  const out = [];
34024
- const seen = /* @__PURE__ */ new Set();
34264
+ const lists = step.entries.flatMap((entry3) => [entry3.before, entry3.after]).filter((snapshot) => snapshot.kind === "cells" && snapshot.cells.length > 0);
34265
+ const [first2, second, ...rest] = lists;
34266
+ if (first2 && !rest.length && (!second || second.sheet === first2.sheet)) {
34267
+ const sheet = first2.sheet;
34268
+ for (const [row2, col] of first2.cells) out.push({ sheet, row: row2, col });
34269
+ if (!second) return out;
34270
+ if (rowMajor(first2.cells) && rowMajor(second.cells)) {
34271
+ let i2 = 0;
34272
+ for (const [row2, col] of second.cells) {
34273
+ const key = cellKey(row2, col);
34274
+ while (i2 < first2.cells.length) {
34275
+ const [r, c2] = first2.cells[i2];
34276
+ if (cellKey(r, c2) >= key) break;
34277
+ i2++;
34278
+ }
34279
+ const at = first2.cells[i2];
34280
+ if (at && cellKey(at[0], at[1]) === key) continue;
34281
+ out.push({ sheet, row: row2, col });
34282
+ }
34283
+ return out;
34284
+ }
34285
+ out.length = 0;
34286
+ }
34287
+ const seen = /* @__PURE__ */ new Map();
34025
34288
  for (const entry3 of step.entries)
34026
34289
  for (const snapshot of [entry3.before, entry3.after]) {
34027
34290
  if (snapshot.kind !== "cells") continue;
34291
+ let keys = seen.get(snapshot.sheet);
34292
+ if (!keys) seen.set(snapshot.sheet, keys = /* @__PURE__ */ new Set());
34028
34293
  for (const [row2, col] of snapshot.cells) {
34029
- const key = `${snapshot.sheet},${row2},${col}`;
34030
- if (seen.has(key)) continue;
34031
- seen.add(key);
34294
+ const key = cellKey(row2, col);
34295
+ if (keys.has(key)) continue;
34296
+ keys.add(key);
34032
34297
  out.push({ sheet: snapshot.sheet, row: row2, col });
34033
34298
  }
34034
34299
  }
@@ -34125,7 +34390,7 @@ var SessionCalculator = class {
34125
34390
  }
34126
34391
  this.calc.discardPreparation();
34127
34392
  if (structural) this.staleGraph = true;
34128
- else this.dirty.push(...touchedCells(step));
34393
+ else for (const cell of touchedCells(step)) this.dirty.push(cell);
34129
34394
  return;
34130
34395
  }
34131
34396
  if (hint && !this.staleGraph) {
@@ -34144,7 +34409,7 @@ var SessionCalculator = class {
34144
34409
  this.calc.discardPreparation();
34145
34410
  if (!this.enabled) return;
34146
34411
  if (structural) this.staleGraph = true;
34147
- else this.dirty.push(...cells);
34412
+ else for (const cell of cells) this.dirty.push(cell);
34148
34413
  return;
34149
34414
  }
34150
34415
  this.recalc(structural, () => cells);
@@ -35206,8 +35471,16 @@ function insertTimeline(ctx, s, ref) {
35206
35471
  const pivot = sheet.pivotTables?.find((entry3) => entry3.name === ref.pivot);
35207
35472
  if (!pivot || !pivot.dateFields?.includes(ref.field))
35208
35473
  throw new Error("Choose a PivotTable with a date field.");
35209
- const dates = pivot.records.map((record) => record[pivot.fields.indexOf(ref.field)]).filter((value3) => typeof value3 === "number");
35210
- if (!dates.length) throw new Error("Choose a PivotTable with a date field.");
35474
+ const column2 = pivot.fields.indexOf(ref.field);
35475
+ let earliest = Infinity;
35476
+ let latest = -Infinity;
35477
+ for (const record of pivot.records) {
35478
+ const value3 = record[column2];
35479
+ if (typeof value3 !== "number") continue;
35480
+ earliest = Math.min(earliest, value3);
35481
+ latest = Math.max(latest, value3);
35482
+ }
35483
+ if (earliest > latest) throw new Error("Choose a PivotTable with a date field.");
35211
35484
  const taken = /* @__PURE__ */ new Set([
35212
35485
  ...(workbook.slicers?.slicers ?? []).map((entry3) => entry3.name.toLowerCase()),
35213
35486
  ...(workbook.slicers?.timelines ?? []).map((entry3) => entry3.name.toLowerCase()),
@@ -35225,8 +35498,8 @@ function insertTimeline(ctx, s, ref) {
35225
35498
  "_"
35226
35499
  );
35227
35500
  const bounds = boundsOfSerialRange(
35228
- serialToIso(Math.min(...dates), workbook.date1904),
35229
- serialToIso(Math.max(...dates), workbook.date1904)
35501
+ serialToIso(earliest, workbook.date1904),
35502
+ serialToIso(latest, workbook.date1904)
35230
35503
  );
35231
35504
  const metrics = createGridMetrics(sheet, { zoom: 100 });
35232
35505
  let right2 = 0;
@@ -38640,6 +38913,15 @@ function mergeFont(base, font) {
38640
38913
  if (value3 !== void 0) out[key] = value3;
38641
38914
  return out;
38642
38915
  }
38916
+ function cellFont(font, defaultFont) {
38917
+ const out = { ...font };
38918
+ if (!out.name && !out.scheme) {
38919
+ if (defaultFont.name) out.name = defaultFont.name;
38920
+ if (defaultFont.scheme) out.scheme = defaultFont.scheme;
38921
+ }
38922
+ if (!out.size && defaultFont.size) out.size = defaultFont.size;
38923
+ return out;
38924
+ }
38643
38925
  function fontView(font, theme2) {
38644
38926
  const family = font.scheme === "major" ? theme2.majorFont || font.name || "Calibri Light" : font.scheme === "minor" ? theme2.minorFont || font.name || "Calibri" : font.name || theme2.minorFont || "Calibri";
38645
38927
  const view = {
@@ -38764,14 +39046,7 @@ function cellView(workbook, sheetIndex2, row2, col, cf, options7 = {}) {
38764
39046
  const style3 = styleAt(workbook, effectiveStyleId(sheet, row2, col));
38765
39047
  const conditional = cf?.at(row2, col);
38766
39048
  const dxf = conditional?.style;
38767
- const defaultFont = workbook.styles[0]?.font ?? {};
38768
- const base = { ...style3.font };
38769
- if (!base.name && !base.scheme) {
38770
- if (defaultFont.name) base.name = defaultFont.name;
38771
- if (defaultFont.scheme) base.scheme = defaultFont.scheme;
38772
- }
38773
- if (!base.size && defaultFont.size) base.size = defaultFont.size;
38774
- const font = mergeFont(base, dxf?.font);
39049
+ const font = mergeFont(cellFont(style3.font, workbook.styles[0]?.font ?? {}), dxf?.font);
38775
39050
  const formulaText = sheet.view.showFormulas && cell?.formula !== void 0 ? `=${cell.formula}` : void 0;
38776
39051
  const shown = formulaText !== void 0 ? { text: formulaText } : displayText2(value3, style3, dxf?.numFmt ?? style3.numFmt, workbook, sheet);
38777
39052
  const fontViewResolved = fontView(font, workbook.theme);
@@ -40368,14 +40643,24 @@ function formatAxisValue(value3, percent = false) {
40368
40643
  return `${v < 0 ? "-" : ""}${grouped}${frac ? `.${frac}` : ""}`;
40369
40644
  }
40370
40645
 
40646
+ // chart/extent.ts
40647
+ function extentOf(values2) {
40648
+ let min = Infinity;
40649
+ let max = -Infinity;
40650
+ for (const value3 of values2) {
40651
+ min = Math.min(min, value3);
40652
+ max = Math.max(max, value3);
40653
+ }
40654
+ return { min, max };
40655
+ }
40656
+
40371
40657
  // chart/axis-range.ts
40372
40658
  function computeLogValueRange(series, logBase) {
40373
40659
  const allValues = series.flatMap((item) => item.values).filter((value3) => value3 !== null && Number.isFinite(value3) && value3 > 0);
40374
40660
  if (allValues.length === 0) {
40375
40661
  return { min: 1, max: logBase, span: 1, logScale: true, logBase };
40376
40662
  }
40377
- const dataMin = Math.min(...allValues);
40378
- const dataMax = Math.max(...allValues);
40663
+ const { min: dataMin, max: dataMax } = extentOf(allValues);
40379
40664
  const logMin = Math.floor(Math.log(dataMin) / Math.log(logBase));
40380
40665
  const logMax = Math.ceil(Math.log(dataMax) / Math.log(logBase));
40381
40666
  const min = logBase ** logMin;
@@ -41402,8 +41687,7 @@ function computeHistogramBins(values2, options7, format = String) {
41402
41687
  });
41403
41688
  }
41404
41689
  if (regular.length > 0) {
41405
- const min = Math.min(...regular.map((item) => item.value));
41406
- const max = Math.max(...regular.map((item) => item.value));
41690
+ const { min, max } = extentOf(regular.map((item) => item.value));
41407
41691
  const requestedSize = options7.binSize && options7.binSize > 0 ? options7.binSize : void 0;
41408
41692
  const requestedCount = options7.binCount && options7.binCount > 0 ? options7.binCount : void 0;
41409
41693
  const start = requestedSize ? Math.floor(min / requestedSize) * requestedSize : min;
@@ -41531,8 +41815,9 @@ function waterfallView(chart, model, ctx) {
41531
41815
  colors: { increase: role(0), decrease: role(1), total: role(2) }
41532
41816
  };
41533
41817
  const ends = steps.flatMap((step) => [step.startValue, step.endValue]);
41818
+ const range2 = extentOf(ends);
41534
41819
  model.valueAxis = {
41535
- ...ends.length ? niceScale(Math.min(...ends), Math.max(...ends)) : niceScale(0, 1),
41820
+ ...ends.length ? niceScale(range2.min, range2.max) : niceScale(0, 1),
41536
41821
  percent: false
41537
41822
  };
41538
41823
  const labels = model.categories;
@@ -41648,7 +41933,8 @@ function chartSummaryView(chart, theme2, options7 = {}) {
41648
41933
  s.xValues = s.values.map((_, k) => numeric2 ? toNumber2(cats[k] ?? null) : k + 1);
41649
41934
  });
41650
41935
  const xs = series.flatMap((s) => s.xValues ?? []).filter((x) => x !== null);
41651
- model.xAxis = xs.length ? niceScale(Math.min(...xs), Math.max(...xs)) : niceScale(0, 1);
41936
+ const range2 = extentOf(xs);
41937
+ model.xAxis = xs.length ? niceScale(range2.min, range2.max) : niceScale(0, 1);
41652
41938
  }
41653
41939
  if (type === "stock") model.stock = stockView(chart.stock, ctx);
41654
41940
  if (type === "bubble") bubbleView(chart, model, ctx.evaluateRef);
@@ -41925,8 +42211,9 @@ function fitChartTrendline(options7, xVals, yVals) {
41925
42211
  }
41926
42212
  const model = fitModel(options7, xVals, yVals);
41927
42213
  if (!model) return noFit();
41928
- const startX = Math.min(...xVals) - (options7.backward ?? 0);
41929
- const endX = Math.max(...xVals) + (options7.forward ?? 0);
42214
+ const xRange = extentOf(xVals);
42215
+ const startX = xRange.min - (options7.backward ?? 0);
42216
+ const endX = xRange.max + (options7.forward ?? 0);
41930
42217
  const steps = Math.max(Math.ceil((endX - startX) * 4), 20);
41931
42218
  const points = [];
41932
42219
  for (let step = 0; step <= steps; step++) {
@@ -42495,7 +42782,7 @@ function cartesianAxes(model, area, out) {
42495
42782
  const cats = Math.max(1, model.categories.length);
42496
42783
  const catW = Math.min(
42497
42784
  area.w * 0.3,
42498
- Math.max(...model.categories.map((c2) => textWidth(c2, categorySize)), 8) + 6
42785
+ Math.max(extentOf(model.categories.map((c2) => textWidth(c2, categorySize))).max, 8) + 6
42499
42786
  );
42500
42787
  const second = horizontal2 ? void 0 : model.secondaryAxis;
42501
42788
  const secondLabels = second?.ticks.map((t) => axisTickText(t, model.axes?.secondary, second.percent)) ?? [];
@@ -42684,7 +42971,7 @@ function computeBubbleRadius(sizeVal, maxBubble, medianRadius, options7) {
42684
42971
  return medianRadius * scale2 * 0.5 + ratio * medianRadius * scale2 * 1.5;
42685
42972
  }
42686
42973
  function maxBubbleSize(sizes) {
42687
- return sizes.length > 0 ? Math.max(1, ...sizes.map(Math.abs)) : 1;
42974
+ return Math.max(1, extentOf(sizes.map(Math.abs)).max);
42688
42975
  }
42689
42976
  function medianBubbleRadius(plotWidth, plotHeight) {
42690
42977
  return Math.min(plotWidth, plotHeight) * 0.04;
@@ -43297,13 +43584,11 @@ function chartLegendSvg(model, area, frame, options7) {
43297
43584
  chartAreaRect(model, "legend", { x: manual.x, y: manual.y, w: manual.width, h: manual.height })
43298
43585
  ];
43299
43586
  const baselineOffset = font ? (font.ascent - font.descent) / 2 : size * 0.35;
43587
+ const widest = extentOf(widths).max;
43300
43588
  entries.forEach((entry3, i2) => {
43301
43589
  const available = horizontal2 ? chartTextWidth(entry3.label, attrs2, options7) : Math.max(0, rowWidth - size / 2 - keySize - keyGap);
43302
43590
  const label2 = fitChartText(entry3.label, available, attrs2, options7);
43303
- const contentWidth = Math.min(
43304
- horizontal2 ? widths[i2] ?? 0 : Math.max(...widths),
43305
- rowWidth - size / 2
43306
- );
43591
+ const contentWidth = Math.min(horizontal2 ? widths[i2] ?? 0 : widest, rowWidth - size / 2);
43307
43592
  const x = horizontal2 ? horizontalX : manual.x + Math.max(size / 4, (rowWidth - contentWidth) / 2);
43308
43593
  const centerY = manual.y + (horizontal2 ? 0 : i2 * rowHeight) + rowHeight / 2;
43309
43594
  markup.push(rect(x, centerY - keySize / 2, keySize, keySize, entry3.color));
@@ -43375,7 +43660,7 @@ function automaticLegend(model, area, out, options7, bounds) {
43375
43660
  }
43376
43661
  const width = Math.min(
43377
43662
  area.w * 0.35,
43378
- Math.max(...entries.map((e) => chartTextWidth(e.label, attrs2, options7))) + 22
43663
+ extentOf(entries.map((e) => chartTextWidth(e.label, attrs2, options7))).max + 22
43379
43664
  );
43380
43665
  const height = entries.length * rowH;
43381
43666
  const x = pos === "l" ? area.x + 4 : area.x + area.w - width;
@@ -49900,6 +50185,7 @@ __export(shell_exports, {
49900
50185
  shell: () => shell
49901
50186
  });
49902
50187
  var shell = {
50188
+ "The current cell edit failed validation.": "Die aktuelle Zellbearbeitung hat die \xDCberpr\xFCfung nicht bestanden.",
49903
50189
  "Finish or cancel the current cell edit before saving.": "Beenden oder verwerfen Sie die aktuelle Zellbearbeitung vor dem Speichern.",
49904
50190
  File: "Datei",
49905
50191
  Ribbon: "Men\xFCband",
@@ -50304,6 +50590,7 @@ __export(shell_exports2, {
50304
50590
  shell: () => shell2
50305
50591
  });
50306
50592
  var shell2 = {
50593
+ "The current cell edit failed validation.": "The current cell edit failed validation.",
50307
50594
  "Finish or cancel the current cell edit before saving.": "Finish or cancel the current cell edit before saving.",
50308
50595
  File: "File",
50309
50596
  Ribbon: "Ribbon",
@@ -50708,6 +50995,7 @@ __export(shell_exports3, {
50708
50995
  shell: () => shell3
50709
50996
  });
50710
50997
  var shell3 = {
50998
+ "The current cell edit failed validation.": "La edici\xF3n de la celda actual no super\xF3 la validaci\xF3n.",
50711
50999
  "Finish or cancel the current cell edit before saving.": "Finalice o cancele la edici\xF3n de la celda actual antes de guardar.",
50712
51000
  File: "Archivo",
50713
51001
  Ribbon: "Cinta de opciones",
@@ -51112,6 +51400,7 @@ __export(shell_exports4, {
51112
51400
  shell: () => shell4
51113
51401
  });
51114
51402
  var shell4 = {
51403
+ "The current cell edit failed validation.": "La modification de la cellule en cours a \xE9chou\xE9 \xE0 la validation.",
51115
51404
  "Finish or cancel the current cell edit before saving.": "Terminez ou annulez la modification de la cellule avant de sauvegarder.",
51116
51405
  File: "Fichier",
51117
51406
  Ribbon: "Ruban",
@@ -51516,6 +51805,7 @@ __export(shell_exports5, {
51516
51805
  shell: () => shell5
51517
51806
  });
51518
51807
  var shell5 = {
51808
+ "The current cell edit failed validation.": "\u5F53\u524D\u5355\u5143\u683C\u7684\u7F16\u8F91\u672A\u901A\u8FC7\u9A8C\u8BC1\u3002",
51519
51809
  "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",
51520
51810
  File: "\u6587\u4EF6",
51521
51811
  Ribbon: "\u529F\u80FD\u533A",