ooxml-core 1.19.2 → 1.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (352) hide show
  1. package/README.md +47 -1
  2. package/dist/{PptxHandler-6TNIQ7S5.cjs → PptxHandler-DNSXWTQV.cjs} +3 -3
  3. package/dist/{PptxHandler-2V4PQL6O.mjs → PptxHandler-FSKKPZZC.mjs} +3 -3
  4. package/dist/PptxHandler-H7MEWJJJ.mjs +4 -0
  5. package/dist/{PresentationBuilder-G7MPEGXJ.mjs → PresentationBuilder-7TSENZTX.mjs} +2 -2
  6. package/dist/{PresentationBuilder-RM52LCVN.cjs → PresentationBuilder-A5NI35VN.cjs} +5 -5
  7. package/dist/{PresentationBuilder-HQ6C7L4V.mjs → PresentationBuilder-RIJWQSEU.mjs} +3 -3
  8. package/dist/automation/docx-forms.d.ts +26 -0
  9. package/dist/automation/docx-forms.d.ts.map +1 -0
  10. package/dist/automation/index.cjs +6280 -2506
  11. package/dist/automation/index.d.ts +1 -0
  12. package/dist/automation/index.d.ts.map +1 -1
  13. package/dist/automation/index.mjs +6277 -2507
  14. package/dist/automation/xlsx-read.d.ts +56 -0
  15. package/dist/automation/xlsx-read.d.ts.map +1 -0
  16. package/dist/automation/xlsx.d.ts +105 -4
  17. package/dist/automation/xlsx.d.ts.map +1 -1
  18. package/dist/chart/axis-range.d.ts.map +1 -1
  19. package/dist/chart/bubble-radius.d.ts +0 -5
  20. package/dist/chart/bubble-radius.d.ts.map +1 -1
  21. package/dist/chart/extent.d.ts +9 -0
  22. package/dist/chart/extent.d.ts.map +1 -0
  23. package/dist/chart/histogram-binning.d.ts.map +1 -1
  24. package/dist/chart/index.cjs +56 -18
  25. package/dist/chart/index.mjs +56 -18
  26. package/dist/chart/render/chart-svg-cartesian.d.ts.map +1 -1
  27. package/dist/chart/render/chart-svg-legend.d.ts.map +1 -1
  28. package/dist/chart/render/chart-view-ex.d.ts.map +1 -1
  29. package/dist/chart/render/chart-view.d.ts.map +1 -1
  30. package/dist/chart/trendline-fit.d.ts.map +1 -1
  31. package/dist/{chunk-NYTR4UZ5.cjs → chunk-4LZIUJI3.cjs} +52 -12
  32. package/dist/{chunk-SLNQNVQM.mjs → chunk-4QPOJCJG.mjs} +45 -8
  33. package/dist/{chunk-XTSHZGSM.mjs → chunk-6IIMI5RS.mjs} +52 -12
  34. package/dist/{chunk-TJPUAUWL.mjs → chunk-BA7Z6ATM.mjs} +9 -195
  35. package/dist/{chunk-JUABSM7C.mjs → chunk-DLFMCZZT.mjs} +1 -1
  36. package/dist/{chunk-M4XLF4R7.mjs → chunk-GBKBR4CX.mjs} +20 -8
  37. package/dist/{chunk-R5FIHHGB.cjs → chunk-HL3FBJ6X.cjs} +1648 -1205
  38. package/dist/{chunk-ZJ2OKIJN.mjs → chunk-LF5E5ZOH.mjs} +642 -199
  39. package/dist/{chunk-4FTUAD2B.mjs → chunk-Q5PKBQXH.mjs} +766 -202
  40. package/dist/{chunk-M6GDBVQ7.mjs → chunk-VQF6HQEE.mjs} +1 -1
  41. package/dist/collab/embedding.d.ts +103 -0
  42. package/dist/collab/embedding.d.ts.map +1 -0
  43. package/dist/collab/index.cjs +450 -342
  44. package/dist/collab/index.d.ts +1 -0
  45. package/dist/collab/index.d.ts.map +1 -1
  46. package/dist/collab/index.mjs +443 -343
  47. package/dist/color/theme-palette.d.ts +5 -1
  48. package/dist/color/theme-palette.d.ts.map +1 -1
  49. package/dist/crypto/index.cjs +27 -2
  50. package/dist/crypto/index.mjs +27 -2
  51. package/dist/diagram/index.cjs +31 -3
  52. package/dist/diagram/index.mjs +31 -3
  53. package/dist/docx/block-parser.d.ts.map +1 -1
  54. package/dist/docx/cell-blocks.d.ts +7 -1
  55. package/dist/docx/cell-blocks.d.ts.map +1 -1
  56. package/dist/docx/content-control-edit.d.ts +14 -0
  57. package/dist/docx/content-control-edit.d.ts.map +1 -1
  58. package/dist/docx/content-control-model.d.ts +8 -0
  59. package/dist/docx/content-control-model.d.ts.map +1 -1
  60. package/dist/docx/content-control-values.d.ts +20 -0
  61. package/dist/docx/content-control-values.d.ts.map +1 -0
  62. package/dist/docx/content-control.d.ts +7 -1
  63. package/dist/docx/content-control.d.ts.map +1 -1
  64. package/dist/docx/element-order.d.ts +10 -5
  65. package/dist/docx/element-order.d.ts.map +1 -1
  66. package/dist/docx/embedded.cjs +3861 -1379
  67. package/dist/docx/embedded.mjs +3861 -1379
  68. package/dist/docx/field-instruction.d.ts +22 -0
  69. package/dist/docx/field-instruction.d.ts.map +1 -0
  70. package/dist/docx/form-field-model.d.ts +48 -0
  71. package/dist/docx/form-field-model.d.ts.map +1 -0
  72. package/dist/docx/form-fields.d.ts +31 -0
  73. package/dist/docx/form-fields.d.ts.map +1 -0
  74. package/dist/docx/form-fill-fields.d.ts +61 -0
  75. package/dist/docx/form-fill-fields.d.ts.map +1 -0
  76. package/dist/docx/form-fill-labels.d.ts +8 -0
  77. package/dist/docx/form-fill-labels.d.ts.map +1 -0
  78. package/dist/docx/form-fill-sites.d.ts +59 -0
  79. package/dist/docx/form-fill-sites.d.ts.map +1 -0
  80. package/dist/docx/form-fill-values.d.ts +28 -0
  81. package/dist/docx/form-fill-values.d.ts.map +1 -0
  82. package/dist/docx/form-fill-write.d.ts +26 -0
  83. package/dist/docx/form-fill-write.d.ts.map +1 -0
  84. package/dist/docx/glossary.d.ts +15 -0
  85. package/dist/docx/glossary.d.ts.map +1 -0
  86. package/dist/docx/index.cjs +5929 -3153
  87. package/dist/docx/index.d.ts +7 -0
  88. package/dist/docx/index.d.ts.map +1 -1
  89. package/dist/docx/index.mjs +5913 -3154
  90. package/dist/docx/inline-annotations.d.ts +21 -0
  91. package/dist/docx/inline-annotations.d.ts.map +1 -0
  92. package/dist/docx/inline-container-markers.d.ts +14 -0
  93. package/dist/docx/inline-container-markers.d.ts.map +1 -0
  94. package/dist/docx/inline-containers.d.ts +54 -0
  95. package/dist/docx/inline-containers.d.ts.map +1 -0
  96. package/dist/docx/inline-form-field-bookmarks.d.ts +15 -0
  97. package/dist/docx/inline-form-field-bookmarks.d.ts.map +1 -0
  98. package/dist/docx/inline-marker-positions.d.ts +15 -0
  99. package/dist/docx/inline-marker-positions.d.ts.map +1 -0
  100. package/dist/docx/inline-markers.d.ts +63 -0
  101. package/dist/docx/inline-markers.d.ts.map +1 -0
  102. package/dist/docx/inline-slots.d.ts +24 -0
  103. package/dist/docx/inline-slots.d.ts.map +1 -0
  104. package/dist/docx/layout/adapter.d.ts.map +1 -1
  105. package/dist/docx/layout/index.cjs +1176 -563
  106. package/dist/docx/layout/index.d.ts +2 -1
  107. package/dist/docx/layout/index.d.ts.map +1 -1
  108. package/dist/docx/layout/index.mjs +1175 -564
  109. package/dist/docx/layout/input.d.ts +5 -1
  110. package/dist/docx/layout/input.d.ts.map +1 -1
  111. package/dist/docx/layout/page-style-refs.d.ts +21 -0
  112. package/dist/docx/layout/page-style-refs.d.ts.map +1 -0
  113. package/dist/docx/layout/paragraph-fragments.d.ts.map +1 -1
  114. package/dist/docx/layout/result.d.ts +1 -0
  115. package/dist/docx/layout/result.d.ts.map +1 -1
  116. package/dist/docx/layout/tab-stops.d.ts +8 -1
  117. package/dist/docx/layout/tab-stops.d.ts.map +1 -1
  118. package/dist/docx/load/index.cjs +3969 -1487
  119. package/dist/docx/load/index.mjs +3969 -1487
  120. package/dist/docx/model-run.d.ts +24 -2
  121. package/dist/docx/model-run.d.ts.map +1 -1
  122. package/dist/docx/model.d.ts +5 -0
  123. package/dist/docx/model.d.ts.map +1 -1
  124. package/dist/docx/numbering-format.d.ts.map +1 -1
  125. package/dist/docx/parse-warnings.d.ts.map +1 -1
  126. package/dist/docx/parse.d.ts.map +1 -1
  127. package/dist/docx/run-segmentation.d.ts +11 -0
  128. package/dist/docx/run-segmentation.d.ts.map +1 -0
  129. package/dist/docx/save.d.ts.map +1 -1
  130. package/dist/docx/section-model.d.ts +5 -0
  131. package/dist/docx/section-model.d.ts.map +1 -1
  132. package/dist/docx/sections.d.ts +4 -2
  133. package/dist/docx/sections.d.ts.map +1 -1
  134. package/dist/docx/settings.d.ts +9 -0
  135. package/dist/docx/settings.d.ts.map +1 -1
  136. package/dist/docx/special-characters.d.ts +34 -0
  137. package/dist/docx/special-characters.d.ts.map +1 -0
  138. package/dist/docx/style-ref-fields.d.ts +40 -0
  139. package/dist/docx/style-ref-fields.d.ts.map +1 -0
  140. package/dist/docx/style-ref.d.ts +85 -0
  141. package/dist/docx/style-ref.d.ts.map +1 -0
  142. package/dist/docx/table-model.d.ts +2 -2
  143. package/dist/docx/table-model.d.ts.map +1 -1
  144. package/dist/docx/ui/break-note-schema.d.ts.map +1 -1
  145. package/dist/docx/ui/content-control-commands.d.ts +20 -8
  146. package/dist/docx/ui/content-control-commands.d.ts.map +1 -1
  147. package/dist/docx/ui/content-control-guard.d.ts +4 -1
  148. package/dist/docx/ui/content-control-guard.d.ts.map +1 -1
  149. package/dist/docx/ui/content-control-paste.d.ts +23 -0
  150. package/dist/docx/ui/content-control-paste.d.ts.map +1 -0
  151. package/dist/docx/ui/content-control-rows.d.ts +15 -0
  152. package/dist/docx/ui/content-control-rows.d.ts.map +1 -0
  153. package/dist/docx/ui/content-control-sources.d.ts +12 -0
  154. package/dist/docx/ui/content-control-sources.d.ts.map +1 -0
  155. package/dist/docx/ui/content-control-spans.d.ts +29 -6
  156. package/dist/docx/ui/content-control-spans.d.ts.map +1 -1
  157. package/dist/docx/ui/content-control-temporary.d.ts +10 -0
  158. package/dist/docx/ui/content-control-temporary.d.ts.map +1 -0
  159. package/dist/docx/ui/form-field-commands.d.ts +41 -0
  160. package/dist/docx/ui/form-field-commands.d.ts.map +1 -0
  161. package/dist/docx/ui/form-field-guard.d.ts +24 -0
  162. package/dist/docx/ui/form-field-guard.d.ts.map +1 -0
  163. package/dist/docx/ui/form-text-blank.d.ts +18 -0
  164. package/dist/docx/ui/form-text-blank.d.ts.map +1 -0
  165. package/dist/docx/ui/index.cjs +9276 -7132
  166. package/dist/docx/ui/index.d.ts +5 -0
  167. package/dist/docx/ui/index.d.ts.map +1 -1
  168. package/dist/docx/ui/index.mjs +9259 -7137
  169. package/dist/docx/ui/positional-tab-input.d.ts +7 -0
  170. package/dist/docx/ui/positional-tab-input.d.ts.map +1 -0
  171. package/dist/docx/ui/run-compare.d.ts.map +1 -1
  172. package/dist/docx/ui/run-extra-mark.d.ts +1 -1
  173. package/dist/docx/ui/run-extra-mark.d.ts.map +1 -1
  174. package/dist/docx/ui/schema-marks.d.ts +1 -1
  175. package/dist/docx/ui/schema-marks.d.ts.map +1 -1
  176. package/dist/docx/ui/symbol-font.d.ts +4 -0
  177. package/dist/docx/ui/symbol-font.d.ts.map +1 -0
  178. package/dist/docx/ui/yjs-collaboration.d.ts +12 -1
  179. package/dist/docx/ui/yjs-collaboration.d.ts.map +1 -1
  180. package/dist/docx/write-block-placement.d.ts +7 -0
  181. package/dist/docx/write-block-placement.d.ts.map +1 -1
  182. package/dist/docx/write-content-control.d.ts +6 -0
  183. package/dist/docx/write-content-control.d.ts.map +1 -1
  184. package/dist/docx/write-header-footer.d.ts +6 -2
  185. package/dist/docx/write-header-footer.d.ts.map +1 -1
  186. package/dist/docx/write-inline.d.ts +12 -16
  187. package/dist/docx/write-inline.d.ts.map +1 -1
  188. package/dist/docx/write-paragraph.d.ts.map +1 -1
  189. package/dist/docx/write-revisions.d.ts.map +1 -1
  190. package/dist/docx/write-run.d.ts.map +1 -1
  191. package/dist/docx/write-section-properties.d.ts +5 -0
  192. package/dist/docx/write-section-properties.d.ts.map +1 -0
  193. package/dist/docx/write-sections.d.ts.map +1 -1
  194. package/dist/docx/write-table-controls.d.ts +15 -0
  195. package/dist/docx/write-table-controls.d.ts.map +1 -0
  196. package/dist/docx/write-table-properties.d.ts.map +1 -1
  197. package/dist/docx/write-table.d.ts.map +1 -1
  198. package/dist/docx/write.d.ts.map +1 -1
  199. package/dist/docx/xml.d.ts +6 -0
  200. package/dist/docx/xml.d.ts.map +1 -1
  201. package/dist/drawingml/index.cjs +31 -3
  202. package/dist/drawingml/index.mjs +31 -3
  203. package/dist/index.cjs +102 -26
  204. package/dist/index.mjs +102 -26
  205. package/dist/math/index.cjs +27 -2
  206. package/dist/math/index.mjs +27 -2
  207. package/dist/opc/index.cjs +51 -11
  208. package/dist/opc/index.mjs +51 -11
  209. package/dist/opc/zip-folders.d.ts +11 -0
  210. package/dist/opc/zip-folders.d.ts.map +1 -0
  211. package/dist/opc/zip-limits.d.ts +9 -0
  212. package/dist/opc/zip-limits.d.ts.map +1 -1
  213. package/dist/pptx/automation/index.cjs +995 -462
  214. package/dist/pptx/automation/index.d.ts +2 -2
  215. package/dist/pptx/automation/index.mjs +6 -6
  216. package/dist/pptx/chunks/{index-Bqm-jFG-.d.ts → index-CPhsd7Df.d.ts} +7580 -7507
  217. package/dist/pptx/chunks/index-CPhsd7Df.d.ts.map +1 -0
  218. package/dist/pptx/chunks/{index-B9x557hr.d.ts → index-Q5mM8kIR.d.ts} +2 -2
  219. package/dist/pptx/chunks/{index-B9x557hr.d.ts.map → index-Q5mM8kIR.d.ts.map} +1 -1
  220. package/dist/pptx/cli/index.cjs +770 -238
  221. package/dist/pptx/cli/index.mjs +5 -5
  222. package/dist/pptx/converter/index.cjs +12 -3
  223. package/dist/pptx/converter/index.d.ts +1 -1
  224. package/dist/pptx/converter/index.mjs +3 -3
  225. package/dist/pptx/editor/render/find-replace.cjs +14 -14
  226. package/dist/pptx/editor/render/find-replace.d.ts +1 -1
  227. package/dist/pptx/editor/render/find-replace.mjs +1 -1
  228. package/dist/pptx/editor/render/slide-operations.cjs +8 -8
  229. package/dist/pptx/editor/render/slide-operations.mjs +2 -2
  230. package/dist/pptx/index.cjs +1099 -628
  231. package/dist/pptx/index.d.ts +3 -3
  232. package/dist/pptx/index.mjs +6 -6
  233. package/dist/pptx/signature-node/index.cjs +20 -8
  234. package/dist/pptx/signature-node/index.mjs +2 -2
  235. package/dist/teams/index.cjs +105 -70
  236. package/dist/teams/index.mjs +105 -70
  237. package/dist/text/text-diff.d.ts +15 -0
  238. package/dist/text/text-diff.d.ts.map +1 -0
  239. package/dist/visio/index.cjs +220 -46
  240. package/dist/visio/index.mjs +220 -46
  241. package/dist/visio/ui/contract.d.ts +8 -2
  242. package/dist/visio/ui/contract.d.ts.map +1 -1
  243. package/dist/visio/ui/index.cjs +227 -50
  244. package/dist/visio/ui/index.mjs +227 -50
  245. package/dist/xlsx/collab/index.cjs +8 -3
  246. package/dist/xlsx/collab/index.mjs +8 -3
  247. package/dist/xlsx/compare/cells.d.ts +22 -0
  248. package/dist/xlsx/compare/cells.d.ts.map +1 -0
  249. package/dist/xlsx/compare/compare.d.ts +12 -0
  250. package/dist/xlsx/compare/compare.d.ts.map +1 -0
  251. package/dist/xlsx/compare/conditional.d.ts +7 -0
  252. package/dist/xlsx/compare/conditional.d.ts.map +1 -0
  253. package/dist/xlsx/compare/format-key.d.ts +34 -0
  254. package/dist/xlsx/compare/format-key.d.ts.map +1 -0
  255. package/dist/xlsx/compare/group.d.ts +8 -0
  256. package/dist/xlsx/compare/group.d.ts.map +1 -0
  257. package/dist/xlsx/compare/index.d.ts +5 -0
  258. package/dist/xlsx/compare/index.d.ts.map +1 -0
  259. package/dist/xlsx/compare/rich-text.d.ts +7 -0
  260. package/dist/xlsx/compare/rich-text.d.ts.map +1 -0
  261. package/dist/xlsx/compare/sheets.d.ts +22 -0
  262. package/dist/xlsx/compare/sheets.d.ts.map +1 -0
  263. package/dist/xlsx/compare/structure.d.ts +11 -0
  264. package/dist/xlsx/compare/structure.d.ts.map +1 -0
  265. package/dist/xlsx/compare/text.d.ts +8 -0
  266. package/dist/xlsx/compare/text.d.ts.map +1 -0
  267. package/dist/xlsx/compare/types.d.ts +173 -0
  268. package/dist/xlsx/compare/types.d.ts.map +1 -0
  269. package/dist/xlsx/edit/cell-values.d.ts.map +1 -1
  270. package/dist/xlsx/edit/clipboard-html.d.ts.map +1 -1
  271. package/dist/xlsx/edit/clipboard-text.d.ts.map +1 -1
  272. package/dist/xlsx/edit/clipboard.d.ts.map +1 -1
  273. package/dist/xlsx/edit/clone-cell.d.ts +9 -0
  274. package/dist/xlsx/edit/clone-cell.d.ts.map +1 -0
  275. package/dist/xlsx/edit/dimensions.d.ts.map +1 -1
  276. package/dist/xlsx/edit/history-rows.d.ts +7 -0
  277. package/dist/xlsx/edit/history-rows.d.ts.map +1 -0
  278. package/dist/xlsx/edit/history.d.ts +19 -4
  279. package/dist/xlsx/edit/history.d.ts.map +1 -1
  280. package/dist/xlsx/edit/outline.d.ts.map +1 -1
  281. package/dist/xlsx/edit/row-autofit.d.ts.map +1 -1
  282. package/dist/xlsx/edit/timelines.d.ts.map +1 -1
  283. package/dist/xlsx/formula/change-areas.d.ts +9 -0
  284. package/dist/xlsx/formula/change-areas.d.ts.map +1 -0
  285. package/dist/xlsx/formula/engine-prepare.d.ts +8 -0
  286. package/dist/xlsx/formula/engine-prepare.d.ts.map +1 -1
  287. package/dist/xlsx/formula/engine.d.ts.map +1 -1
  288. package/dist/xlsx/formula/spill.d.ts +5 -1
  289. package/dist/xlsx/formula/spill.d.ts.map +1 -1
  290. package/dist/xlsx/index.cjs +2551 -1208
  291. package/dist/xlsx/index.d.ts +1 -0
  292. package/dist/xlsx/index.d.ts.map +1 -1
  293. package/dist/xlsx/index.mjs +2544 -1209
  294. package/dist/xlsx/layout/cell-view.d.ts.map +1 -1
  295. package/dist/xlsx/layout/navigate.d.ts.map +1 -1
  296. package/dist/xlsx/layout/style-view.d.ts +5 -0
  297. package/dist/xlsx/layout/style-view.d.ts.map +1 -1
  298. package/dist/xlsx/load/csv-dates.d.ts +22 -0
  299. package/dist/xlsx/load/csv-dates.d.ts.map +1 -0
  300. package/dist/xlsx/load/csv-import.d.ts +64 -0
  301. package/dist/xlsx/load/csv-import.d.ts.map +1 -0
  302. package/dist/xlsx/load/csv-separators.d.ts +13 -0
  303. package/dist/xlsx/load/csv-separators.d.ts.map +1 -0
  304. package/dist/xlsx/load/csv-traits.d.ts +20 -0
  305. package/dist/xlsx/load/csv-traits.d.ts.map +1 -0
  306. package/dist/xlsx/load/csv.d.ts +8 -4
  307. package/dist/xlsx/load/csv.d.ts.map +1 -1
  308. package/dist/xlsx/load/detect.d.ts +13 -0
  309. package/dist/xlsx/load/detect.d.ts.map +1 -1
  310. package/dist/xlsx/load/errors.d.ts +1 -0
  311. package/dist/xlsx/load/errors.d.ts.map +1 -1
  312. package/dist/xlsx/load/index.cjs +598 -98
  313. package/dist/xlsx/load/index.d.ts +3 -1
  314. package/dist/xlsx/load/index.d.ts.map +1 -1
  315. package/dist/xlsx/load/index.mjs +597 -99
  316. package/dist/xlsx/numfmt/format.d.ts +8 -0
  317. package/dist/xlsx/numfmt/format.d.ts.map +1 -1
  318. package/dist/xlsx/numfmt/input-date.d.ts +2 -0
  319. package/dist/xlsx/numfmt/input-date.d.ts.map +1 -1
  320. package/dist/xlsx/pivot/cache-xml.d.ts.map +1 -1
  321. package/dist/xlsx/pivot/groups.d.ts.map +1 -1
  322. package/dist/xlsx/read/index.d.ts +2 -1
  323. package/dist/xlsx/read/index.d.ts.map +1 -1
  324. package/dist/xlsx/read/limits.d.ts +50 -0
  325. package/dist/xlsx/read/limits.d.ts.map +1 -0
  326. package/dist/xlsx/read/load.d.ts +11 -1
  327. package/dist/xlsx/read/load.d.ts.map +1 -1
  328. package/dist/xlsx/read/package.d.ts +5 -23
  329. package/dist/xlsx/read/package.d.ts.map +1 -1
  330. package/dist/xlsx/read/shared-strings.d.ts +2 -2
  331. package/dist/xlsx/read/shared-strings.d.ts.map +1 -1
  332. package/dist/xlsx/read/sheet-data-source.d.ts.map +1 -1
  333. package/dist/xlsx/read/worksheet.d.ts +2 -0
  334. package/dist/xlsx/read/worksheet.d.ts.map +1 -1
  335. package/dist/xlsx/stable-key.d.ts +3 -0
  336. package/dist/xlsx/stable-key.d.ts.map +1 -0
  337. package/dist/xlsx/styles.d.ts.map +1 -1
  338. package/dist/xlsx/ui/index.cjs +795 -388
  339. package/dist/xlsx/ui/index.d.ts +1 -0
  340. package/dist/xlsx/ui/index.d.ts.map +1 -1
  341. package/dist/xlsx/ui/index.mjs +795 -389
  342. package/dist/xlsx/ui/selection-format.d.ts +13 -0
  343. package/dist/xlsx/ui/selection-format.d.ts.map +1 -0
  344. package/dist/xlsx/write/sheet-props.d.ts.map +1 -1
  345. package/dist/xml/index.cjs +57 -3
  346. package/dist/xml/index.mjs +57 -4
  347. package/dist/xml/lite.d.ts.map +1 -1
  348. package/dist/xml/xml.d.ts +11 -1
  349. package/dist/xml/xml.d.ts.map +1 -1
  350. package/package.json +1 -1
  351. package/dist/PptxHandler-HSPKEP5E.mjs +0 -4
  352. package/dist/pptx/chunks/index-Bqm-jFG-.d.ts.map +0 -1
@@ -3254,6 +3254,19 @@ var DEFAULT_XML_LIMITS = {
3254
3254
  maxDepth: 512,
3255
3255
  maxNodes: 5e6
3256
3256
  };
3257
+ var XmlLimitError = class extends Error {
3258
+ code = "xml-limit";
3259
+ /** The limit that was exceeded. */
3260
+ limit;
3261
+ /** Its value: the largest depth or element count allowed. */
3262
+ maximum;
3263
+ constructor(message, limit2, maximum) {
3264
+ super(message);
3265
+ this.name = "XmlLimitError";
3266
+ this.limit = limit2;
3267
+ this.maximum = maximum;
3268
+ }
3269
+ };
3257
3270
  var TAG_RE = /<(\/?)([^\s\/><]+)(?:\s+[^\s=\/><]+\s*=\s*(?:"[^"<]*"|'[^'<]*'))*\s*(\/?)>/y;
3258
3271
  var MARKUP_SKIPS = [
3259
3272
  ["<!--", "-->"],
@@ -3287,11 +3300,22 @@ function checkXmlLimits(xml, label2, limits = {}) {
3287
3300
  continue;
3288
3301
  }
3289
3302
  nodes++;
3290
- if (nodes > maxNodes) throw new Error(`${label2} XML exceeds the limit of ${maxNodes} elements`);
3303
+ if (nodes > maxNodes)
3304
+ throw new XmlLimitError(
3305
+ `${label2} XML exceeds the limit of ${maxNodes} elements`,
3306
+ "maxNodes",
3307
+ maxNodes
3308
+ );
3291
3309
  if (!selfClosing && ++depth > maxDepth)
3292
- throw new Error(`${label2} XML exceeds the nesting depth limit of ${maxDepth}`);
3310
+ throw new XmlLimitError(
3311
+ `${label2} XML exceeds the nesting depth limit of ${maxDepth}`,
3312
+ "maxDepth",
3313
+ maxDepth
3314
+ );
3293
3315
  }
3294
3316
  }
3317
+ var CRLF_DECLARATION = /^<\?xml[^>]*\?>\r\n/;
3318
+ var crlfDeclarations = /* @__PURE__ */ new WeakSet();
3295
3319
  function parseXml(xml, options = {}) {
3296
3320
  const label2 = options.label ?? "OOXML";
3297
3321
  if (/<!DOCTYPE|<!ENTITY/i.test(xml))
@@ -3313,9 +3337,13 @@ function parseXml(xml, options = {}) {
3313
3337
  }
3314
3338
  if (parseError || !parsed.documentElement)
3315
3339
  throw new Error(`Invalid ${label2} XML: ${parseError || "missing root element"}`);
3340
+ if (CRLF_DECLARATION.test(xml)) crlfDeclarations.add(parsed);
3316
3341
  return parsed;
3317
3342
  }
3318
- var buildXml = (node2) => new xmldom.XMLSerializer().serializeToString(node2);
3343
+ var buildXml = (node2) => {
3344
+ const xml = new xmldom.XMLSerializer().serializeToString(node2);
3345
+ return crlfDeclarations.has(node2) ? xml.replace(/^(<\?xml[^>]*\?>)\n/, "$1\r\n") : xml;
3346
+ };
3319
3347
  var isElement = (node2) => node2.nodeType === 1;
3320
3348
  var elements = (parent) => Array.from(parent.childNodes).filter(isElement);
3321
3349
  function named(element2, local, ns, lenient = true) {
@@ -3641,6 +3669,12 @@ function parseLiteFragment(xml, container2, namespaces) {
3641
3669
  }
3642
3670
  if (lt < 0) break;
3643
3671
  const next = source2.charCodeAt(lt + 1);
3672
+ if (next === 33) {
3673
+ const after = skipCommentOrCdata(source2, lt, top);
3674
+ if (after < 0) return void 0;
3675
+ pos = after;
3676
+ continue;
3677
+ }
3644
3678
  if (next === 47) {
3645
3679
  const gt = source2.indexOf(">", lt);
3646
3680
  if (gt < 0 || stack2.length < 2 || source2.slice(lt + 2, gt).trimEnd() !== top.tagName)
@@ -3661,6 +3695,25 @@ function parseLiteFragment(xml, container2, namespaces) {
3661
3695
  }
3662
3696
  return stack2.length === 1 ? root : void 0;
3663
3697
  }
3698
+ var DECLARATIONS = /<!DOCTYPE|<!ENTITY/i;
3699
+ function skipCommentOrCdata(source2, lt, parent) {
3700
+ if (source2.startsWith("<!--", lt)) {
3701
+ const end = source2.indexOf("-->", lt + 4);
3702
+ if (end < 0) return -1;
3703
+ const body = source2.slice(lt + 4, end);
3704
+ if (body.includes("--") || body.endsWith("-") || DECLARATIONS.test(body)) return -1;
3705
+ return end + 3;
3706
+ }
3707
+ if (source2.startsWith("<![CDATA[", lt)) {
3708
+ const end = source2.indexOf("]]>", lt + 9);
3709
+ if (end < 0) return -1;
3710
+ const text2 = source2.slice(lt + 9, end);
3711
+ if (DECLARATIONS.test(text2)) return -1;
3712
+ parent.childNodes.push(text2);
3713
+ return end + 3;
3714
+ }
3715
+ return -1;
3716
+ }
3664
3717
  function startTag(source2, from, namespaces) {
3665
3718
  const n = source2.length;
3666
3719
  let i2 = from;
@@ -3802,10 +3855,13 @@ var DEFAULT_ZIP_LIMITS = {
3802
3855
  var ZipLimitError = class extends Error {
3803
3856
  code = "ZIP_BOMB";
3804
3857
  limit;
3858
+ /** The check that failed (absent when the error was built without one). */
3859
+ kind;
3805
3860
  constructor(message, details) {
3806
3861
  super(message);
3807
3862
  this.name = "ZipLimitError";
3808
3863
  this.limit = details.limit;
3864
+ this.kind = details.kind;
3809
3865
  }
3810
3866
  };
3811
3867
  var mib = (bytes) => Math.round(bytes / 1048576);
@@ -3828,7 +3884,7 @@ function resolveLimits(limits) {
3828
3884
  maxEntryBytes: limits.maxEntryBytes ?? DEFAULT_ZIP_LIMITS.maxEntryBytes,
3829
3885
  maxTotalBytes: limits.maxTotalBytes ?? DEFAULT_ZIP_LIMITS.maxTotalBytes,
3830
3886
  label: limits.label ?? "ZIP",
3831
- fail: (message, limit2) => create ? create(message, { limit: limit2 }) : new ZipLimitError(message, { limit: limit2 })
3887
+ fail: (message, limit2, kind) => create ? create(message, { limit: limit2, kind }) : new ZipLimitError(message, { limit: limit2, kind })
3832
3888
  };
3833
3889
  }
3834
3890
  function inflateEntryGuarded(entry3, alreadyRead, limits) {
@@ -3851,13 +3907,18 @@ function inflateEntryGuarded(entry3, alreadyRead, limits) {
3851
3907
  size += chunk.byteLength;
3852
3908
  if (size > declared || size > r.maxEntryBytes)
3853
3909
  return abort(
3854
- r.fail(`${r.label} part ${entry3.name} inflates past its declared size`, r.maxEntryBytes)
3910
+ r.fail(
3911
+ `${r.label} part ${entry3.name} inflates past its declared size`,
3912
+ r.maxEntryBytes,
3913
+ size > declared ? "declaredSize" : "maxEntryBytes"
3914
+ )
3855
3915
  );
3856
3916
  if (alreadyRead + size > r.maxTotalBytes)
3857
3917
  return abort(
3858
3918
  r.fail(
3859
3919
  `${r.label} package exceeds the ${mib(r.maxTotalBytes)} MiB uncompressed content limit`,
3860
- r.maxTotalBytes
3920
+ r.maxTotalBytes,
3921
+ "maxTotalBytes"
3861
3922
  )
3862
3923
  );
3863
3924
  chunks.push(chunk);
@@ -3890,26 +3951,29 @@ function guardZip(zip, limits = {}) {
3890
3951
  if (entries.length > r.maxEntries)
3891
3952
  throw r.fail(
3892
3953
  `${r.label} package exceeds the ${r.maxEntries.toLocaleString("en-US")} part limit`,
3893
- r.maxEntries
3954
+ r.maxEntries,
3955
+ "maxEntries"
3894
3956
  );
3895
3957
  let declared = 0;
3896
3958
  for (const entry3 of entries) {
3897
3959
  const original = entry3.unsafeOriginalName;
3898
3960
  if (!isSafePartName(entry3.name) || original !== void 0 && !isSafePartName(original))
3899
- throw r.fail(`${r.label} package has an unsafe part name`, r.maxEntries);
3961
+ throw r.fail(`${r.label} package has an unsafe part name`, r.maxEntries, "partName");
3900
3962
  if (entry3.dir) continue;
3901
3963
  const size = declaredEntrySize(entry3);
3902
3964
  if (size > r.maxEntryBytes)
3903
3965
  throw r.fail(
3904
3966
  `${r.label} part ${entry3.name} exceeds the uncompressed part size limit`,
3905
- r.maxEntryBytes
3967
+ r.maxEntryBytes,
3968
+ "maxEntryBytes"
3906
3969
  );
3907
3970
  declared += size;
3908
3971
  }
3909
3972
  if (declared > r.maxTotalBytes)
3910
3973
  throw r.fail(
3911
3974
  `${r.label} package exceeds the ${mib(r.maxTotalBytes)} MiB uncompressed content limit`,
3912
- r.maxTotalBytes
3975
+ r.maxTotalBytes,
3976
+ "maxTotalBytes"
3913
3977
  );
3914
3978
  const produced = /* @__PURE__ */ new Map();
3915
3979
  let total2 = 0;
@@ -5599,6 +5663,9 @@ function formatValue(value2, format, options = {}) {
5599
5663
  if (options.width !== void 0) return fitNumber(value2, format, options);
5600
5664
  return formatNumber(value2, format, options.date1904 ?? false);
5601
5665
  }
5666
+ function isDateFormat(format) {
5667
+ return compileFormat(format).isDate;
5668
+ }
5602
5669
 
5603
5670
  // xlsx/numfmt/input-date.ts
5604
5671
  var MONTH_NAMES = [
@@ -5821,9 +5888,9 @@ function parseCellInput(text2, options = {}) {
5821
5888
  return parsed.numFmt ? { value: parsed.value, numFmt: parsed.numFmt } : { value: parsed.value };
5822
5889
  }
5823
5890
 
5824
- // xlsx/styles.ts
5825
- function styleKey(style2) {
5826
- return JSON.stringify(sortKeys(style2));
5891
+ // xlsx/stable-key.ts
5892
+ function stableKey(value2) {
5893
+ return JSON.stringify(sortKeys(value2));
5827
5894
  }
5828
5895
  function sortKeys(value2) {
5829
5896
  if (Array.isArray(value2)) return value2.map(sortKeys);
@@ -5837,6 +5904,11 @@ function sortKeys(value2) {
5837
5904
  }
5838
5905
  return value2;
5839
5906
  }
5907
+
5908
+ // xlsx/styles.ts
5909
+ function styleKey(style2) {
5910
+ return stableKey(style2);
5911
+ }
5840
5912
  function styleAt(workbook, styleId) {
5841
5913
  const style2 = workbook.styles[styleId ?? 0] ?? workbook.styles[0];
5842
5914
  if (!style2) throw new Error("Workbook has no default cell style");
@@ -9289,10 +9361,72 @@ function mergeComments(legacy, threaded) {
9289
9361
  (a2, b) => a2.address.row - b.address.row || a2.address.col - b.address.col
9290
9362
  );
9291
9363
  }
9292
- var MAX_INPUT_BYTES = 50 * 1024 * 1024;
9293
- var MAX_PARTS = 1e4;
9294
- var MAX_UNCOMPRESSED_BYTES = 300 * 1024 * 1024;
9295
- var MAX_PART_BYTES = 200 * 1024 * 1024;
9364
+
9365
+ // xlsx/read/limits.ts
9366
+ var DEFAULT_XLSX_LOAD_LIMITS = {
9367
+ maxInputBytes: 50 * 1024 * 1024,
9368
+ maxParts: 1e4,
9369
+ maxPartBytes: 200 * 1024 * 1024,
9370
+ maxTotalBytes: 300 * 1024 * 1024,
9371
+ maxXmlElements: 5e6
9372
+ };
9373
+ var WorkbookTooLargeError = class extends Error {
9374
+ code = "workbook-too-large";
9375
+ /** The limit that was exceeded, as named in {@link XlsxLoadLimits}. */
9376
+ limit;
9377
+ /** The value of that limit when the load failed. */
9378
+ maximum;
9379
+ constructor(message, limit2, maximum, options) {
9380
+ super(message, options);
9381
+ this.name = "WorkbookTooLargeError";
9382
+ this.limit = limit2;
9383
+ this.maximum = maximum;
9384
+ }
9385
+ };
9386
+ function isWorkbookTooLargeError(error) {
9387
+ return error instanceof Error && error.code === "workbook-too-large";
9388
+ }
9389
+ function resolveLoadLimits(limits = {}) {
9390
+ const resolved = { ...DEFAULT_XLSX_LOAD_LIMITS };
9391
+ for (const name of Object.keys(resolved)) {
9392
+ const value2 = limits[name];
9393
+ if (value2 === void 0) continue;
9394
+ if (!Number.isFinite(value2) || value2 <= 0)
9395
+ throw new RangeError(`limits.${name} must be a positive finite number`);
9396
+ resolved[name] = value2;
9397
+ }
9398
+ return resolved;
9399
+ }
9400
+ var ZIP_LIMIT_NAMES = {
9401
+ maxInputBytes: "maxInputBytes",
9402
+ maxEntries: "maxParts",
9403
+ maxEntryBytes: "maxPartBytes",
9404
+ maxTotalBytes: "maxTotalBytes"
9405
+ };
9406
+ function zipLimitsFor(limits) {
9407
+ return {
9408
+ maxInputBytes: limits.maxInputBytes,
9409
+ maxEntries: limits.maxParts,
9410
+ maxEntryBytes: limits.maxPartBytes,
9411
+ maxTotalBytes: limits.maxTotalBytes,
9412
+ label: "XLSX",
9413
+ createError: (message, { limit: limit2, kind }) => {
9414
+ const name = ZIP_LIMIT_NAMES[kind];
9415
+ return name ? new WorkbookTooLargeError(message, name, limit2) : new ZipLimitError(message, { limit: limit2, kind });
9416
+ }
9417
+ };
9418
+ }
9419
+ function parseDataXml(xml, label2, maxXmlElements = DEFAULT_XLSX_LOAD_LIMITS.maxXmlElements) {
9420
+ try {
9421
+ return parseXml(xml, { label: label2, limits: { maxNodes: maxXmlElements } });
9422
+ } catch (error) {
9423
+ if (error instanceof XmlLimitError && error.limit === "maxNodes")
9424
+ throw new WorkbookTooLargeError(error.message, "maxXmlElements", error.maximum, {
9425
+ cause: error
9426
+ });
9427
+ throw error;
9428
+ }
9429
+ }
9296
9430
  var CONTENT_TYPES = {
9297
9431
  workbook: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
9298
9432
  workbookMacro: "application/vnd.ms-excel.sheet.macroEnabled.main+xml",
@@ -9382,16 +9516,15 @@ var SourceIndex = class {
9382
9516
  };
9383
9517
  var mib2 = (bytes) => Math.round(bytes / 1048576);
9384
9518
  async function readZipParts(input, limits = {}) {
9385
- const maxInput = limits.maxInputBytes ?? MAX_INPUT_BYTES;
9386
- const zipLimits = {
9387
- maxEntries: limits.maxParts ?? MAX_PARTS,
9388
- maxEntryBytes: limits.maxPartBytes ?? MAX_PART_BYTES,
9389
- maxTotalBytes: limits.maxTotalBytes ?? MAX_UNCOMPRESSED_BYTES,
9390
- label: "XLSX"
9391
- };
9519
+ const resolved = resolveLoadLimits(limits);
9520
+ const maxInput = resolved.maxInputBytes;
9392
9521
  const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);
9393
9522
  if (bytes.byteLength > maxInput)
9394
- throw new Error(`XLSX package exceeds the ${mib2(maxInput)} MiB compressed input limit`);
9523
+ throw new WorkbookTooLargeError(
9524
+ `XLSX package exceeds the ${mib2(maxInput)} MiB compressed input limit`,
9525
+ "maxInputBytes",
9526
+ maxInput
9527
+ );
9395
9528
  let loaded;
9396
9529
  try {
9397
9530
  loaded = await JSZip2__default.default.loadAsync(bytes);
@@ -9401,7 +9534,7 @@ async function readZipParts(input, limits = {}) {
9401
9534
  { cause: error }
9402
9535
  );
9403
9536
  }
9404
- const zip = guardZip(loaded, zipLimits);
9537
+ const zip = guardZip(loaded, zipLimitsFor(resolved));
9405
9538
  const parts = /* @__PURE__ */ new Map();
9406
9539
  for (const entry3 of Object.values(zip.files)) {
9407
9540
  if (entry3.dir) continue;
@@ -9608,9 +9741,9 @@ function parseRichString(element2, palette) {
9608
9741
  const text2 = parsed.map((run2) => run2.text).join("");
9609
9742
  return { text: text2, runs: parsed };
9610
9743
  }
9611
- function parseSharedStrings(xml, palette) {
9744
+ function parseSharedStrings(xml, palette, maxXmlElements) {
9612
9745
  if (!xml) return [];
9613
- const root = parseXml(xml, { label: "XLSX shared strings" }).documentElement;
9746
+ const root = parseDataXml(xml, "XLSX shared strings", maxXmlElements).documentElement;
9614
9747
  return xChildren(root, "si").map((si) => parseRichString(si, palette));
9615
9748
  }
9616
9749
 
@@ -14002,21 +14135,50 @@ function rootNamespaces(xml) {
14002
14135
  for (const match2 of (root[2] ?? "").matchAll(DECLARATION2)) out[match2[1] ?? ""] = match2[3] ?? "";
14003
14136
  return out;
14004
14137
  }
14138
+ var SPECIAL = /<[!?]/g;
14139
+ var SECTIONS = [
14140
+ ["<!--", "-->"],
14141
+ ["<![CDATA[", "]]>"],
14142
+ ["<?", "?>"]
14143
+ ];
14144
+ function blankComments(xml) {
14145
+ if (!xml.includes("<!--") && !xml.includes("<![CDATA[")) return xml;
14146
+ const pieces = [];
14147
+ let copied = 0;
14148
+ SPECIAL.lastIndex = 0;
14149
+ for (let match2 = SPECIAL.exec(xml); match2; match2 = SPECIAL.exec(xml)) {
14150
+ const at = match2.index;
14151
+ const section = SECTIONS.find(([open2]) => xml.startsWith(open2, at));
14152
+ if (!section) return void 0;
14153
+ const [open, close2] = section;
14154
+ const end = xml.indexOf(close2, at + open.length);
14155
+ if (end < 0) return void 0;
14156
+ const after = end + close2.length;
14157
+ if (open !== "<?") {
14158
+ pieces.push(xml.slice(copied, at), " ".repeat(after - at));
14159
+ copied = after;
14160
+ }
14161
+ SPECIAL.lastIndex = after;
14162
+ }
14163
+ pieces.push(xml.slice(copied));
14164
+ return pieces.join("");
14165
+ }
14005
14166
  function splitSheetData(xml) {
14006
- if (xml.includes("<!--") || xml.includes("<![CDATA[")) return void 0;
14007
- const namespaces = rootNamespaces(xml);
14008
- const open = OPEN.exec(xml);
14167
+ const plain3 = blankComments(xml);
14168
+ if (plain3 === void 0) return void 0;
14169
+ const namespaces = rootNamespaces(plain3);
14170
+ const open = OPEN.exec(plain3);
14009
14171
  if (!namespaces || !open) return void 0;
14010
14172
  const prefix = (open[1] ?? "").slice(0, -1);
14011
14173
  const ns = namespaces[prefix];
14012
14174
  if (prefix && ns === void 0) return void 0;
14013
14175
  const tagName = `${open[1] ?? ""}sheetData`;
14014
- const openEnd = xml.indexOf(">", open.index);
14176
+ const openEnd = plain3.indexOf(">", open.index);
14015
14177
  if (openEnd < 0) return void 0;
14016
- const attributes = xml.slice(open.index + tagName.length + 1, openEnd);
14178
+ const attributes = plain3.slice(open.index + tagName.length + 1, openEnd);
14017
14179
  if (attributes.trimEnd().endsWith("/") || attributes.includes("xmlns")) return void 0;
14018
- const close2 = xml.indexOf(`</${tagName}`, openEnd);
14019
- if (close2 < 0 || OPEN.test(xml.slice(openEnd))) return void 0;
14180
+ const close2 = plain3.indexOf(`</${tagName}`, openEnd);
14181
+ if (close2 < 0 || OPEN.test(plain3.slice(openEnd))) return void 0;
14020
14182
  const container2 = new LiteElement(tagName, "sheetData", ns || null);
14021
14183
  const data = parseLiteFragment(xml.slice(openEnd + 1, close2), container2, namespaces);
14022
14184
  if (!data) return void 0;
@@ -14221,7 +14383,11 @@ function parseWorksheet(ctx, partName, name, sheetId) {
14221
14383
  return sheet;
14222
14384
  }
14223
14385
  const split = splitSheetData(xml);
14224
- const root = parseXml(split?.xml ?? xml, { label: "XLSX worksheet" }).documentElement;
14386
+ const root = parseDataXml(
14387
+ split?.xml ?? xml,
14388
+ "XLSX worksheet",
14389
+ ctx.maxXmlElements
14390
+ ).documentElement;
14225
14391
  const byName = /* @__PURE__ */ new Map();
14226
14392
  const cfBlocks = [];
14227
14393
  for (const node2 of elements(root)) {
@@ -14295,8 +14461,9 @@ function liftPrintAreas(workbook) {
14295
14461
  return false;
14296
14462
  });
14297
14463
  }
14298
- async function loadXlsx(input) {
14299
- const parts = await readZipParts(input);
14464
+ async function loadXlsx(input, options = {}) {
14465
+ const limits = resolveLoadLimits(options.limits);
14466
+ const parts = await readZipParts(input, limits);
14300
14467
  const source2 = new SourceIndex(parts);
14301
14468
  const workbookPart = source2.workbookPart();
14302
14469
  if (!workbookPart) throw new Error("XLSX package has no workbook part (xl/workbook.xml)");
@@ -14317,7 +14484,8 @@ async function loadXlsx(input) {
14317
14484
  source: source2,
14318
14485
  sharedStrings: parseSharedStrings(
14319
14486
  stringsPart ? source2.text(stringsPart) : void 0,
14320
- styles.palette
14487
+ styles.palette,
14488
+ limits.maxXmlElements
14321
14489
  ),
14322
14490
  xfMap: styles.xfMap,
14323
14491
  date1904: book.date1904,
@@ -14325,7 +14493,8 @@ async function loadXlsx(input) {
14325
14493
  dxfs: styles.dxfs,
14326
14494
  persons: parsePersons(personsPart ? source2.text(personsPart) : void 0),
14327
14495
  dynamicCells: parseDynamicArrayMetadata(metadataPart ? source2.text(metadataPart) : void 0),
14328
- warn
14496
+ warn,
14497
+ maxXmlElements: limits.maxXmlElements
14329
14498
  };
14330
14499
  const rels = source2.rels(workbookPart);
14331
14500
  const sheets = book.sheets.map((entry3) => {
@@ -16542,6 +16711,52 @@ function finite(value2) {
16542
16711
  return value2;
16543
16712
  }
16544
16713
 
16714
+ // xlsx/formula/operators.ts
16715
+ function power(base, exponent) {
16716
+ if (base === 0 && exponent === 0) throw new ErrorSignal(ERR.NUM);
16717
+ if (base === 0 && exponent < 0) throw new ErrorSignal(ERR.DIV0);
16718
+ if (base < 0 && !Number.isInteger(exponent)) {
16719
+ const inverse = 1 / exponent;
16720
+ const odd = Math.round(inverse);
16721
+ if (Math.abs(inverse - odd) < 1e-10 && Math.abs(odd) % 2 === 1) {
16722
+ return -Math.pow(-base, exponent);
16723
+ }
16724
+ throw new ErrorSignal(ERR.NUM);
16725
+ }
16726
+ return Math.pow(base, exponent);
16727
+ }
16728
+ function pick(m, row2, col) {
16729
+ const r = m.rows === 1 ? 0 : row2;
16730
+ const c2 = m.cols === 1 ? 0 : col;
16731
+ if (r >= m.rows || c2 >= m.cols) return ERR.NA;
16732
+ return m.get(r, c2);
16733
+ }
16734
+ function broadcastShape(operands, at) {
16735
+ let rows = 1;
16736
+ let cols = 1;
16737
+ for (const m of operands) {
16738
+ rows = Math.max(rows, m.rows);
16739
+ cols = Math.max(cols, m.cols);
16740
+ }
16741
+ if (!operands.some((m) => m.isPadded)) return Matrix.build(rows, cols, at);
16742
+ let blockRows = 1;
16743
+ let blockCols = 1;
16744
+ for (const m of operands) {
16745
+ blockRows = Math.max(blockRows, m.isPadded ? m.blockRows : m.rows);
16746
+ blockCols = Math.max(blockCols, m.isPadded ? m.blockCols : m.cols);
16747
+ }
16748
+ blockRows = Math.min(blockRows, rows);
16749
+ blockCols = Math.min(blockCols, cols);
16750
+ const varies = operands.some(
16751
+ (m) => blockRows < rows && m.rows === 1 && m.cols > 1 || blockCols < cols && m.cols === 1 && m.rows > 1
16752
+ );
16753
+ if (varies) return Matrix.build(rows, cols, at);
16754
+ return Matrix.padded(Matrix.build(blockRows, blockCols, at), rows, cols, at(rows - 1, cols - 1));
16755
+ }
16756
+
16757
+ // xlsx/formula/spill.ts
16758
+ var isSpilledCell = (cell) => cell !== void 0 && "spillAnchor" in cell;
16759
+
16545
16760
  // xlsx/formula/functions/wildcard.ts
16546
16761
  var lower = (ch) => (ch ?? "").toLowerCase();
16547
16762
  var fold = (text2) => Array.from({ length: text2.length }, (_, i2) => lower(text2[i2]));
@@ -19826,49 +20041,6 @@ var INFO_FUNCTIONS = [
19826
20041
  )
19827
20042
  ];
19828
20043
 
19829
- // xlsx/formula/operators.ts
19830
- function power(base, exponent) {
19831
- if (base === 0 && exponent === 0) throw new ErrorSignal(ERR.NUM);
19832
- if (base === 0 && exponent < 0) throw new ErrorSignal(ERR.DIV0);
19833
- if (base < 0 && !Number.isInteger(exponent)) {
19834
- const inverse = 1 / exponent;
19835
- const odd = Math.round(inverse);
19836
- if (Math.abs(inverse - odd) < 1e-10 && Math.abs(odd) % 2 === 1) {
19837
- return -Math.pow(-base, exponent);
19838
- }
19839
- throw new ErrorSignal(ERR.NUM);
19840
- }
19841
- return Math.pow(base, exponent);
19842
- }
19843
- function pick(m, row2, col) {
19844
- const r = m.rows === 1 ? 0 : row2;
19845
- const c2 = m.cols === 1 ? 0 : col;
19846
- if (r >= m.rows || c2 >= m.cols) return ERR.NA;
19847
- return m.get(r, c2);
19848
- }
19849
- function broadcastShape(operands, at) {
19850
- let rows = 1;
19851
- let cols = 1;
19852
- for (const m of operands) {
19853
- rows = Math.max(rows, m.rows);
19854
- cols = Math.max(cols, m.cols);
19855
- }
19856
- if (!operands.some((m) => m.isPadded)) return Matrix.build(rows, cols, at);
19857
- let blockRows = 1;
19858
- let blockCols = 1;
19859
- for (const m of operands) {
19860
- blockRows = Math.max(blockRows, m.isPadded ? m.blockRows : m.rows);
19861
- blockCols = Math.max(blockCols, m.isPadded ? m.blockCols : m.cols);
19862
- }
19863
- blockRows = Math.min(blockRows, rows);
19864
- blockCols = Math.min(blockCols, cols);
19865
- const varies = operands.some(
19866
- (m) => blockRows < rows && m.rows === 1 && m.cols > 1 || blockCols < cols && m.cols === 1 && m.rows > 1
19867
- );
19868
- if (varies) return Matrix.build(rows, cols, at);
19869
- return Matrix.padded(Matrix.build(blockRows, blockCols, at), rows, cols, at(rows - 1, cols - 1));
19870
- }
19871
-
19872
20044
  // xlsx/formula/functions/lambda.ts
19873
20045
  var C17 = "Logical";
19874
20046
  function lambdaArg(value2) {
@@ -25128,9 +25300,6 @@ var paramKind = (spec2, index3) => {
25128
25300
  return params[Math.min(index3, params.length - 1)] ?? "value";
25129
25301
  };
25130
25302
 
25131
- // xlsx/formula/spill.ts
25132
- var isSpilledCell = (cell) => cell !== void 0 && "spillAnchor" in cell;
25133
-
25134
25303
  // xlsx/formula/move.ts
25135
25304
  var same3 = (a2, b) => a2.toLowerCase() === b.toLowerCase();
25136
25305
  function deleteSheetInFormula(formula, sheetName, tableNames = []) {
@@ -27159,10 +27328,8 @@ function sheetFormatXml(sheet) {
27159
27328
  const current = { defaultRowHeight: sheet.defaultRowHeight };
27160
27329
  if (sheet.defaultColWidth !== void 0) current.defaultColWidth = sheet.defaultColWidth;
27161
27330
  if (sheet.format && Object.keys(sheet.format).length) current.format = sheet.format;
27162
- const rowLevel = Math.max(
27163
- 0,
27164
- ...[...sheet.rowInfo.values()].map((info) => info.outlineLevel ?? 0)
27165
- );
27331
+ let rowLevel = 0;
27332
+ for (const info of sheet.rowInfo.values()) rowLevel = Math.max(rowLevel, info.outlineLevel ?? 0);
27166
27333
  const colLevel = Math.max(0, ...sheet.columns.map((col) => col.outlineLevel ?? 0));
27167
27334
  if (source2 && sameModel(readSheetFormat(source2), current) && Number(source2.getAttribute("outlineLevelRow") ?? 0) === rowLevel && Number(source2.getAttribute("outlineLevelCol") ?? 0) === colLevel)
27168
27335
  return snapshotXml(sheet, "sheetFormatPr") ?? "";
@@ -27464,11 +27631,10 @@ function pivotCacheDefinitionXml(pivot, workbook, data, recordRel) {
27464
27631
  const items = data.items[index3];
27465
27632
  if (pivot.dateFields?.includes(name) && items.every((v) => typeof v === "number")) {
27466
27633
  const serials = items;
27467
- const latest = Math.max(...serials);
27468
- const maxDate = Number.isInteger(latest) ? latest + 1 : latest;
27634
+ const range = dateGroupRange({}, serials);
27469
27635
  const parent = derived.filter((entry3) => entry3.group.field === name).at(-1);
27470
27636
  const link = parent ? `<fieldGroup par="${parent.index}"/>` : "";
27471
- 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>`;
27637
+ return `<cacheField${attrs({ name: encodeEscapes(name), numFmtId: 14 })}><sharedItems${attrs({ containsSemiMixedTypes: false, containsNonDate: false, containsDate: true, containsString: false, minDate: iso(range.start), maxDate: iso(range.end), count: serials.length })}>${serials.map((serial) => `<d v="${iso(serial)}"/>`).join("")}</sharedItems>${link}</cacheField>`;
27472
27638
  }
27473
27639
  const types = new Set(
27474
27640
  items.map((value2) => value2 === null || value2 === "" ? "blank" : typeof value2)
@@ -28339,6 +28505,332 @@ async function saveXlsx(workbook) {
28339
28505
  return writer.build();
28340
28506
  }
28341
28507
 
28508
+ // xlsx/load/csv-dates.ts
28509
+ var DAY_RE = /^(\d{1,4})([-/. ])(\d{1,4})\2(\d{1,4})$/;
28510
+ var COMPACT_RE = /^\d{8}$/;
28511
+ var PAIR_RE = /^(\d{1,2})\/(\d{1,2})$/;
28512
+ var FRACTION_RE = /\.(\d+)/;
28513
+ var TIME_RE3 = /^(\d{1,2}:\d{1,2}(?::\d{1,2}(?:\.\d+)?)?(?:\s*[ap]m?)?)\s*(Z|[+-]\d{2}(?::?\d{2})?)?$/i;
28514
+ var SPACE_RE = /\s/;
28515
+ var MAX_DATE_TEXT = 64;
28516
+ function splitTime(text2) {
28517
+ const colon = text2.indexOf(":");
28518
+ if (colon < 0) return [text2, void 0];
28519
+ let start = colon;
28520
+ while (start > 0 && colon - start < 2) {
28521
+ const code = text2.charCodeAt(start - 1);
28522
+ if (code < 48 || code > 57) break;
28523
+ start--;
28524
+ }
28525
+ const before = text2[start - 1] ?? "";
28526
+ if (start === colon || !before) return void 0;
28527
+ if (before === "T" || before === "t") return [text2.slice(0, start - 1), text2.slice(start)];
28528
+ return SPACE_RE.test(before) ? [text2.slice(0, start).trimEnd(), text2.slice(start)] : void 0;
28529
+ }
28530
+ function compactParts(text2, order) {
28531
+ const parts = [];
28532
+ let at = 0;
28533
+ for (const kind of order) {
28534
+ const size = kind === "Y" ? 4 : 2;
28535
+ parts.push(text2.slice(at, at + size));
28536
+ at += size;
28537
+ }
28538
+ return parts;
28539
+ }
28540
+ function pairParts(pair, order) {
28541
+ let next = 0;
28542
+ return [...order].map(
28543
+ (kind) => kind === "Y" ? String((/* @__PURE__ */ new Date()).getFullYear()) : pair[next++] ?? ""
28544
+ );
28545
+ }
28546
+ function dayParts(text2, order) {
28547
+ const match2 = DAY_RE.exec(text2);
28548
+ if (match2) return [match2[1] ?? "", match2[3] ?? "", match2[4] ?? ""];
28549
+ if (COMPACT_RE.test(text2)) return compactParts(text2, order);
28550
+ const pair = PAIR_RE.exec(text2);
28551
+ return pair ? pairParts([pair[1] ?? "", pair[2] ?? ""], order) : void 0;
28552
+ }
28553
+ function inOrder(parts, order) {
28554
+ const date = [0, 0, 0];
28555
+ for (let i2 = 0; i2 < 3; i2++) {
28556
+ const part = parts[i2] ?? "";
28557
+ const kind = order[i2];
28558
+ if (kind === "Y") {
28559
+ if (part.length === 3 || part.length > 4) return void 0;
28560
+ date[0] = fullYear(part);
28561
+ } else if (part.length > 2) return void 0;
28562
+ else date[kind === "M" ? 1 : 2] = Number(part);
28563
+ }
28564
+ return date;
28565
+ }
28566
+ function offsetMinutes(zone) {
28567
+ if (zone === "Z" || zone === "z") return 0;
28568
+ const hours = Number(zone.slice(1, 3));
28569
+ const minutes = zone.length > 3 ? Number(zone.slice(-2)) : 0;
28570
+ if (hours > 23 || minutes > 59) return void 0;
28571
+ return (zone.startsWith("-") ? -1 : 1) * (hours * 60 + minutes);
28572
+ }
28573
+ function parseOrderedDate(text2, order, date1904, decimal = ".") {
28574
+ if (text2.length > MAX_DATE_TEXT) return void 0;
28575
+ const split = splitTime(text2);
28576
+ if (!split) return void 0;
28577
+ let clock = split[1];
28578
+ if (clock !== void 0 && decimal !== ".")
28579
+ clock = clock.includes(".") ? "" : clock.replace(decimal, ".");
28580
+ const tail = clock === void 0 ? void 0 : TIME_RE3.exec(clock);
28581
+ if (clock !== void 0 && !tail) return void 0;
28582
+ const parts = dayParts(split[0], order);
28583
+ const date = parts && inOrder(parts, order);
28584
+ if (!date) return void 0;
28585
+ const serial = serialOf(date[0], date[1], date[2], date1904);
28586
+ if (serial === void 0) return void 0;
28587
+ if (!tail) return { value: serial, numFmt: "yyyy-mm-dd", zoned: false };
28588
+ const time = parseTime(tail[1] ?? "");
28589
+ if (!time || time.fraction >= 1) return void 0;
28590
+ const zone = tail[2];
28591
+ const offset2 = zone === void 0 ? 0 : offsetMinutes(zone);
28592
+ if (offset2 === void 0) return void 0;
28593
+ const value2 = serial + time.fraction - offset2 / 1440;
28594
+ if (value2 < (date1904 ? 0 : 1)) return void 0;
28595
+ const digits2 = Math.min(3, FRACTION_RE.exec(tail[1] ?? "")?.[1]?.length ?? 0);
28596
+ const format = digits2 ? `h:mm:ss.${"0".repeat(digits2)}` : time.format;
28597
+ return { value: value2, numFmt: `yyyy-mm-dd ${format}`, zoned: zone !== void 0 };
28598
+ }
28599
+
28600
+ // xlsx/load/csv-separators.ts
28601
+ function separatorsOf(decimal = ".", thousands = decimal === "," ? "." : ",") {
28602
+ for (const separator of [decimal, thousands])
28603
+ if (separator.length !== 1 || /[\d+-]/.test(separator))
28604
+ throw new RangeError(`"${separator}" cannot be a decimal or thousands separator.`);
28605
+ if (decimal === thousands)
28606
+ throw new RangeError("The decimal and thousands separators must differ.");
28607
+ return { decimal, thousands };
28608
+ }
28609
+ function separatorNormalizer({
28610
+ decimal,
28611
+ thousands
28612
+ }) {
28613
+ if (decimal === "." && thousands === ",") return void 0;
28614
+ const escape2 = (char) => char.replace(/[\\^$.*+?()[\]{}|]/g, "\\$&");
28615
+ const pattern = new RegExp(`(${escape2(decimal)})|(\\d)${escape2(thousands)}(?=\\d)|[.,]`, "g");
28616
+ const swap = (_, point, digit) => {
28617
+ if (point !== void 0) return ".";
28618
+ if (digit !== void 0) return `${digit},`;
28619
+ return "";
28620
+ };
28621
+ return (text2) => text2.replace(pattern, swap);
28622
+ }
28623
+
28624
+ // xlsx/load/csv-traits.ts
28625
+ var LEADING_ZEROS = 1;
28626
+ var LONG_NUMBER = 2;
28627
+ var SCIENTIFIC = 4;
28628
+ var LETTER_DATE = 8;
28629
+ var TIME_ZONE = 16;
28630
+ var DATE_FALLBACK = 32;
28631
+ var isDigit4 = (code) => code >= 48 && code <= 57;
28632
+ var isLetter2 = (code) => (code | 32) >= 97 && (code | 32) <= 122;
28633
+ function numberTraits(text2, decimal, thousands) {
28634
+ let traits = 0;
28635
+ let digits2 = 0;
28636
+ let first2 = true;
28637
+ for (let i2 = 0; i2 < text2.length; i2++) {
28638
+ const code = text2.charCodeAt(i2);
28639
+ if (isDigit4(code)) {
28640
+ if (first2 && code === 48) {
28641
+ const next = text2.charCodeAt(i2 + 1);
28642
+ if (isDigit4(next) || next === thousands && isDigit4(text2.charCodeAt(i2 + 2)))
28643
+ traits |= LEADING_ZEROS;
28644
+ }
28645
+ first2 = false;
28646
+ if (digits2 > 0 || code !== 48) digits2++;
28647
+ } else if (code === decimal) first2 = false;
28648
+ else if (code === 69 || code === 101) {
28649
+ traits |= SCIENTIFIC;
28650
+ break;
28651
+ }
28652
+ }
28653
+ return digits2 > 15 ? traits | LONG_NUMBER : traits;
28654
+ }
28655
+ function significantDigits(text2) {
28656
+ let digits2 = "";
28657
+ for (const char of text2) {
28658
+ if (char === "e" || char === "E") break;
28659
+ if (char >= "0" && char <= "9" && (digits2 !== "" || char !== "0")) digits2 += char;
28660
+ }
28661
+ let end = digits2.length;
28662
+ while (end > 0 && digits2[end - 1] === "0") end--;
28663
+ return digits2.slice(0, end);
28664
+ }
28665
+ var keepsDigits = (field, value2) => significantDigits(field) === significantDigits(String(Math.abs(value2)));
28666
+ function dateTraits(field) {
28667
+ const text2 = field.trimStart();
28668
+ let i2 = 0;
28669
+ while (isLetter2(text2.charCodeAt(i2))) i2++;
28670
+ return i2 > 0 && isDigit4(text2.charCodeAt(i2)) ? LETTER_DATE : 0;
28671
+ }
28672
+
28673
+ // xlsx/load/csv-import.ts
28674
+ var KINDS2 = [
28675
+ {
28676
+ conversion: "leadingZeros",
28677
+ one: "value lost its leading zeros when converted to a number",
28678
+ many: "values lost their leading zeros when converted to numbers"
28679
+ },
28680
+ {
28681
+ conversion: "longNumbers",
28682
+ one: "value with more than 15 digits lost digits when converted to a number",
28683
+ many: "values with more than 15 digits lost digits when converted to numbers"
28684
+ },
28685
+ {
28686
+ conversion: "scientific",
28687
+ one: "value with the letter E lost digits when converted to a number",
28688
+ many: "values with the letter E lost digits when converted to numbers"
28689
+ },
28690
+ {
28691
+ conversion: "letterDates",
28692
+ one: "value of letters and digits such as JAN1 was converted to a date",
28693
+ many: "values of letters and digits such as JAN1 were converted to dates"
28694
+ },
28695
+ {
28696
+ conversion: void 0,
28697
+ one: "date-time with a time zone was converted to UTC",
28698
+ many: "date-times with a time zone were converted to UTC"
28699
+ },
28700
+ {
28701
+ conversion: void 0,
28702
+ one: "value could not be read as a date in {order} order and was read as General",
28703
+ many: "values could not be read as dates in {order} order and were read as General"
28704
+ }
28705
+ ];
28706
+ var FORMATS = /* @__PURE__ */ new Set(["general", "text", "skip", "MDY", "DMY", "YMD", "MYD", "DYM", "YDM"]);
28707
+ var DAY_FIRST = /* @__PURE__ */ new Set(["DMY", "DYM", "YDM"]);
28708
+ var MONTH_FIRST_RE = /^\d{1,2}[-/]\d{1,2}(?:[-/]\d{1,4})?(?:$|[\sT])/;
28709
+ var FRACTION_FORMATS = /* @__PURE__ */ new Set(["# ?/?", "# ??/??"]);
28710
+ var EN_US_SEPARATORS_RE = /[.,]/;
28711
+ var SIGNED_RE = /^\s*(?:[$€£]\s*)?[-+(]/;
28712
+ function columnFormats(columns) {
28713
+ const formats = [];
28714
+ for (const [key, format] of Object.entries(columns ?? {})) {
28715
+ const col = Number(key);
28716
+ if (!Number.isInteger(col) || col < 0 || col > MAX_COL)
28717
+ throw new RangeError(`CSV column ${key} is not a zero-based column index.`);
28718
+ if (!FORMATS.has(format))
28719
+ throw new RangeError(`Unknown CSV column format "${String(format)}" for column ${col}.`);
28720
+ formats[col] = format;
28721
+ }
28722
+ return formats;
28723
+ }
28724
+ function createFieldReader(options, date1904) {
28725
+ const formats = columnFormats(options.columns);
28726
+ const targets = [];
28727
+ let skipped = 0;
28728
+ for (let col = 0; col < formats.length; col++) {
28729
+ if (formats[col] === "skip") {
28730
+ targets.push(-1);
28731
+ skipped++;
28732
+ } else targets.push(col - skipped);
28733
+ }
28734
+ const target = (col) => col < targets.length ? targets[col] ?? -1 : col - skipped;
28735
+ let keepText = 0;
28736
+ KINDS2.forEach(({ conversion }, kind) => {
28737
+ if (conversion && options.conversions?.[conversion] === false) keepText |= 1 << kind;
28738
+ });
28739
+ const separators = separatorsOf(options.decimalSeparator, options.thousandsSeparator);
28740
+ const normalize = separatorNormalizer(separators);
28741
+ const decimal = separators.decimal.charCodeAt(0);
28742
+ const thousands = separators.thousands.charCodeAt(0);
28743
+ const { formulas = false, trailingMinus = false } = options;
28744
+ const counts = [];
28745
+ const firstRows = [];
28746
+ const report = (traits, row2, col) => {
28747
+ if (options.reportConversions === false) return;
28748
+ for (let kind = 0; kind < KINDS2.length; kind++) {
28749
+ if (!(traits & 1 << kind)) continue;
28750
+ const key = col * KINDS2.length + kind;
28751
+ const count2 = counts[key];
28752
+ if (count2 === void 0) firstRows[key] = row2;
28753
+ counts[key] = (count2 ?? 0) + 1;
28754
+ }
28755
+ };
28756
+ const dateFormats = /* @__PURE__ */ new Map();
28757
+ const isDate = (numFmt) => {
28758
+ if (numFmt === void 0) return false;
28759
+ let known = dateFormats.get(numFmt);
28760
+ if (known === void 0) {
28761
+ known = isDateFormat(numFmt);
28762
+ dateFormats.set(numFmt, known);
28763
+ }
28764
+ return known;
28765
+ };
28766
+ const isNumber = (parsed) => typeof parsed.value === "number" && parsed.formula === void 0 && !isDate(parsed.numFmt);
28767
+ const localized = (text2, normalized) => {
28768
+ const parsed = parseCellInput(normalized);
28769
+ if (normalized === text2 || isNumber(parsed)) return parsed;
28770
+ const plain3 = parseCellInput(text2);
28771
+ if (isNumber(plain3) && EN_US_SEPARATORS_RE.test(text2)) return { value: text2 };
28772
+ const dated = typeof parsed.value === "number" && parsed.formula === void 0;
28773
+ return dated && typeof plain3.value === "string" ? parsed : plain3;
28774
+ };
28775
+ const type = normalize ? (text2) => localized(text2, normalize(text2)) : (text2) => parseCellInput(text2);
28776
+ const negative = (field) => {
28777
+ const text2 = field.trimEnd();
28778
+ if (text2.length < 2 || !text2.endsWith("-")) return void 0;
28779
+ const body = text2.slice(0, -1);
28780
+ if (SIGNED_RE.test(body)) return void 0;
28781
+ const parsed = type(body);
28782
+ if (!isNumber(parsed)) return void 0;
28783
+ return { ...parsed, value: parsed.value === 0 ? 0 : -parsed.value };
28784
+ };
28785
+ const general = (field, row2, col) => {
28786
+ if (!formulas && field.startsWith("=")) return { value: field };
28787
+ const parsed = (trailingMinus ? negative(field) : void 0) ?? type(field);
28788
+ if (typeof parsed.value !== "number" || parsed.formula !== void 0) return parsed;
28789
+ const grouping = FRACTION_FORMATS.has(parsed.numFmt ?? "") ? -1 : thousands;
28790
+ const traits = isDate(parsed.numFmt) ? dateTraits(field) : numberTraits(field, decimal, grouping);
28791
+ if (traits === 0) return parsed;
28792
+ if (traits & keepText) return { value: field };
28793
+ let lost = traits;
28794
+ if (traits & (LONG_NUMBER | SCIENTIFIC)) {
28795
+ if (keepsDigits(field, parsed.value)) lost &= -7;
28796
+ else if (traits & LONG_NUMBER) lost &= ~SCIENTIFIC;
28797
+ }
28798
+ if (lost) report(lost, row2, col);
28799
+ return parsed;
28800
+ };
28801
+ return {
28802
+ target,
28803
+ read(field, row2, col) {
28804
+ const format = col < formats.length ? formats[col] : void 0;
28805
+ if (format === void 0 || format === "general") return general(field, row2, col);
28806
+ if (format === "text") return { value: field, numFmt: "@" };
28807
+ if (format === "skip") return { value: null };
28808
+ const date = parseOrderedDate(field.trim(), format, date1904, separators.decimal);
28809
+ if (!date) {
28810
+ const parsed = general(field, row2, col);
28811
+ const dated = typeof parsed.value === "number" && isDate(parsed.numFmt);
28812
+ if (dated && DAY_FIRST.has(format) && MONTH_FIRST_RE.test(field.trim()))
28813
+ report(DATE_FALLBACK, row2, col);
28814
+ return parsed;
28815
+ }
28816
+ if (date.zoned) report(TIME_ZONE, row2, col);
28817
+ return { value: date.value, numFmt: date.numFmt };
28818
+ },
28819
+ warnings() {
28820
+ const warnings = [];
28821
+ counts.forEach((count2, key) => {
28822
+ const kind = KINDS2[key % KINDS2.length];
28823
+ const col = Math.floor(key / KINDS2.length);
28824
+ const label2 = columnLabel(target(col));
28825
+ const what = (count2 === 1 ? kind?.one : kind?.many)?.replace("{order}", formats[col] ?? "");
28826
+ const row2 = (firstRows[key] ?? 0) + 1;
28827
+ warnings.push(`Column ${label2}: ${count2} ${what} (first: ${label2}${row2}).`);
28828
+ });
28829
+ return warnings;
28830
+ }
28831
+ };
28832
+ }
28833
+
28342
28834
  // xlsx/load/csv.ts
28343
28835
  var CANDIDATES = [",", ";", " "];
28344
28836
  function delimiterCounts(text2, maxLines = 20) {
@@ -28435,6 +28927,7 @@ function csvToWorkbook(text2, options = {}) {
28435
28927
  workbook.format = "csv";
28436
28928
  const sheet = workbook.sheets[0];
28437
28929
  if (!sheet) return workbook;
28930
+ const reader = createFieldReader(options, workbook.date1904);
28438
28931
  const base = styleAt(workbook, 0);
28439
28932
  const formats = /* @__PURE__ */ new Map();
28440
28933
  const rows = parseCsv(
@@ -28442,9 +28935,11 @@ function csvToWorkbook(text2, options = {}) {
28442
28935
  options.delimiter === void 0 ? {} : { delimiter: options.delimiter }
28443
28936
  );
28444
28937
  rows.forEach((fields, row2) => {
28445
- fields.forEach((field, col) => {
28938
+ fields.forEach((field, source2) => {
28446
28939
  if (field === "") return;
28447
- const parsed = !options.formulas && field.startsWith("=") ? { value: field } : parseCellInput(field);
28940
+ const col = reader.target(source2);
28941
+ if (col < 0) return;
28942
+ const parsed = reader.read(field, row2, source2);
28448
28943
  const cell = { value: parsed.value };
28449
28944
  if (parsed.formula !== void 0) cell.formula = parsed.formula;
28450
28945
  if (parsed.numFmt && parsed.numFmt !== "General") {
@@ -28463,6 +28958,7 @@ function csvToWorkbook(text2, options = {}) {
28463
28958
  cells.set(col, cell);
28464
28959
  });
28465
28960
  });
28961
+ workbook.warnings.push(...reader.warnings());
28466
28962
  return workbook;
28467
28963
  }
28468
28964
  var FORMULA_TRIGGER = /^[=+\-@\t\r]/;
@@ -29713,7 +30209,7 @@ var RT = {
29713
30209
  OBPROJ: 211,
29714
30210
  SXSTREAMID: 213};
29715
30211
  var STATES = ["visible", "hidden", "veryHidden"];
29716
- var KINDS2 = {
30212
+ var KINDS3 = {
29717
30213
  0: "worksheet",
29718
30214
  1: "macro",
29719
30215
  2: "chart",
@@ -29848,7 +30344,7 @@ function parseGlobals(records) {
29848
30344
  case RT.BOUNDSHEET: {
29849
30345
  const offset2 = r.u32();
29850
30346
  const state = STATES[r.u8() & 3] ?? "visible";
29851
- const kind = KINDS2[r.u8()] ?? "unknown";
30347
+ const kind = KINDS3[r.u8()] ?? "unknown";
29852
30348
  out.sheets.push({ offset: offset2, state, kind, name: r.shortXlString() });
29853
30349
  break;
29854
30350
  }
@@ -31151,6 +31647,7 @@ async function decryptWorkbook(bytes, password) {
31151
31647
  return plain3;
31152
31648
  }
31153
31649
  async function loadWorkbook(input, options = {}) {
31650
+ const limits = options.limits && resolveLoadLimits(options.limits);
31154
31651
  let bytes = toBytes3(input);
31155
31652
  let format = detectWorkbookFormat(bytes, options.fileName);
31156
31653
  const encrypted = format === "encrypted";
@@ -31162,12 +31659,13 @@ async function loadWorkbook(input, options = {}) {
31162
31659
  if (format === "xls") return loadLegacyXls(bytes);
31163
31660
  if (format === "csv") {
31164
31661
  return csvToWorkbook(decodeText(bytes), {
31662
+ ...options.csv,
31165
31663
  sheetName: sheetNameFromFileName(options.fileName),
31166
31664
  ...options.delimiter === void 0 ? {} : { delimiter: options.delimiter },
31167
31665
  ...options.formulas === void 0 ? {} : { formulas: options.formulas }
31168
31666
  });
31169
31667
  }
31170
- const workbook = await loadXlsx(bytes);
31668
+ const workbook = await loadXlsx(bytes, limits ? { limits } : {});
31171
31669
  if (format === "xlsm" && workbook.format === "xlsx") workbook.format = "xlsm";
31172
31670
  if (encrypted) workbook.warnings.push(ENCRYPTED_WARNING);
31173
31671
  return workbook;
@@ -31191,6 +31689,7 @@ exports.IncorrectPasswordError = IncorrectPasswordError;
31191
31689
  exports.LegacyXlsError = LegacyXlsError;
31192
31690
  exports.PasswordRequiredError = PasswordRequiredError;
31193
31691
  exports.UnsupportedWorkbookError = UnsupportedWorkbookError;
31692
+ exports.WorkbookTooLargeError = WorkbookTooLargeError;
31194
31693
  exports.csvToWorkbook = csvToWorkbook;
31195
31694
  exports.decodeSpreadsheetText = decodeSpreadsheetText;
31196
31695
  exports.decodeText = decodeText;
@@ -31198,6 +31697,7 @@ exports.detectDelimiter = detectDelimiter;
31198
31697
  exports.detectWorkbookFormat = detectWorkbookFormat;
31199
31698
  exports.isEncryptedOoxmlPackage = isEncryptedOoxmlPackage;
31200
31699
  exports.isOoxmlCryptoError = isOoxmlCryptoError;
31700
+ exports.isWorkbookTooLargeError = isWorkbookTooLargeError;
31201
31701
  exports.loadLegacyXls = loadLegacyXls;
31202
31702
  exports.loadWorkbook = loadWorkbook;
31203
31703
  exports.neutraliseCsvFormula = neutraliseCsvFormula;