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
@@ -3248,6 +3248,19 @@ var DEFAULT_XML_LIMITS = {
3248
3248
  maxDepth: 512,
3249
3249
  maxNodes: 5e6
3250
3250
  };
3251
+ var XmlLimitError = class extends Error {
3252
+ code = "xml-limit";
3253
+ /** The limit that was exceeded. */
3254
+ limit;
3255
+ /** Its value: the largest depth or element count allowed. */
3256
+ maximum;
3257
+ constructor(message, limit2, maximum) {
3258
+ super(message);
3259
+ this.name = "XmlLimitError";
3260
+ this.limit = limit2;
3261
+ this.maximum = maximum;
3262
+ }
3263
+ };
3251
3264
  var TAG_RE = /<(\/?)([^\s\/><]+)(?:\s+[^\s=\/><]+\s*=\s*(?:"[^"<]*"|'[^'<]*'))*\s*(\/?)>/y;
3252
3265
  var MARKUP_SKIPS = [
3253
3266
  ["<!--", "-->"],
@@ -3281,11 +3294,22 @@ function checkXmlLimits(xml, label2, limits = {}) {
3281
3294
  continue;
3282
3295
  }
3283
3296
  nodes++;
3284
- if (nodes > maxNodes) throw new Error(`${label2} XML exceeds the limit of ${maxNodes} elements`);
3297
+ if (nodes > maxNodes)
3298
+ throw new XmlLimitError(
3299
+ `${label2} XML exceeds the limit of ${maxNodes} elements`,
3300
+ "maxNodes",
3301
+ maxNodes
3302
+ );
3285
3303
  if (!selfClosing && ++depth > maxDepth)
3286
- throw new Error(`${label2} XML exceeds the nesting depth limit of ${maxDepth}`);
3304
+ throw new XmlLimitError(
3305
+ `${label2} XML exceeds the nesting depth limit of ${maxDepth}`,
3306
+ "maxDepth",
3307
+ maxDepth
3308
+ );
3287
3309
  }
3288
3310
  }
3311
+ var CRLF_DECLARATION = /^<\?xml[^>]*\?>\r\n/;
3312
+ var crlfDeclarations = /* @__PURE__ */ new WeakSet();
3289
3313
  function parseXml(xml, options = {}) {
3290
3314
  const label2 = options.label ?? "OOXML";
3291
3315
  if (/<!DOCTYPE|<!ENTITY/i.test(xml))
@@ -3307,9 +3331,13 @@ function parseXml(xml, options = {}) {
3307
3331
  }
3308
3332
  if (parseError || !parsed.documentElement)
3309
3333
  throw new Error(`Invalid ${label2} XML: ${parseError || "missing root element"}`);
3334
+ if (CRLF_DECLARATION.test(xml)) crlfDeclarations.add(parsed);
3310
3335
  return parsed;
3311
3336
  }
3312
- var buildXml = (node2) => new XMLSerializer().serializeToString(node2);
3337
+ var buildXml = (node2) => {
3338
+ const xml = new XMLSerializer().serializeToString(node2);
3339
+ return crlfDeclarations.has(node2) ? xml.replace(/^(<\?xml[^>]*\?>)\n/, "$1\r\n") : xml;
3340
+ };
3313
3341
  var isElement = (node2) => node2.nodeType === 1;
3314
3342
  var elements = (parent) => Array.from(parent.childNodes).filter(isElement);
3315
3343
  function named(element2, local, ns, lenient = true) {
@@ -3635,6 +3663,12 @@ function parseLiteFragment(xml, container2, namespaces) {
3635
3663
  }
3636
3664
  if (lt < 0) break;
3637
3665
  const next = source2.charCodeAt(lt + 1);
3666
+ if (next === 33) {
3667
+ const after = skipCommentOrCdata(source2, lt, top);
3668
+ if (after < 0) return void 0;
3669
+ pos = after;
3670
+ continue;
3671
+ }
3638
3672
  if (next === 47) {
3639
3673
  const gt = source2.indexOf(">", lt);
3640
3674
  if (gt < 0 || stack2.length < 2 || source2.slice(lt + 2, gt).trimEnd() !== top.tagName)
@@ -3655,6 +3689,25 @@ function parseLiteFragment(xml, container2, namespaces) {
3655
3689
  }
3656
3690
  return stack2.length === 1 ? root : void 0;
3657
3691
  }
3692
+ var DECLARATIONS = /<!DOCTYPE|<!ENTITY/i;
3693
+ function skipCommentOrCdata(source2, lt, parent) {
3694
+ if (source2.startsWith("<!--", lt)) {
3695
+ const end = source2.indexOf("-->", lt + 4);
3696
+ if (end < 0) return -1;
3697
+ const body = source2.slice(lt + 4, end);
3698
+ if (body.includes("--") || body.endsWith("-") || DECLARATIONS.test(body)) return -1;
3699
+ return end + 3;
3700
+ }
3701
+ if (source2.startsWith("<![CDATA[", lt)) {
3702
+ const end = source2.indexOf("]]>", lt + 9);
3703
+ if (end < 0) return -1;
3704
+ const text2 = source2.slice(lt + 9, end);
3705
+ if (DECLARATIONS.test(text2)) return -1;
3706
+ parent.childNodes.push(text2);
3707
+ return end + 3;
3708
+ }
3709
+ return -1;
3710
+ }
3658
3711
  function startTag(source2, from, namespaces) {
3659
3712
  const n = source2.length;
3660
3713
  let i2 = from;
@@ -3796,10 +3849,13 @@ var DEFAULT_ZIP_LIMITS = {
3796
3849
  var ZipLimitError = class extends Error {
3797
3850
  code = "ZIP_BOMB";
3798
3851
  limit;
3852
+ /** The check that failed (absent when the error was built without one). */
3853
+ kind;
3799
3854
  constructor(message, details) {
3800
3855
  super(message);
3801
3856
  this.name = "ZipLimitError";
3802
3857
  this.limit = details.limit;
3858
+ this.kind = details.kind;
3803
3859
  }
3804
3860
  };
3805
3861
  var mib = (bytes) => Math.round(bytes / 1048576);
@@ -3822,7 +3878,7 @@ function resolveLimits(limits) {
3822
3878
  maxEntryBytes: limits.maxEntryBytes ?? DEFAULT_ZIP_LIMITS.maxEntryBytes,
3823
3879
  maxTotalBytes: limits.maxTotalBytes ?? DEFAULT_ZIP_LIMITS.maxTotalBytes,
3824
3880
  label: limits.label ?? "ZIP",
3825
- fail: (message, limit2) => create ? create(message, { limit: limit2 }) : new ZipLimitError(message, { limit: limit2 })
3881
+ fail: (message, limit2, kind) => create ? create(message, { limit: limit2, kind }) : new ZipLimitError(message, { limit: limit2, kind })
3826
3882
  };
3827
3883
  }
3828
3884
  function inflateEntryGuarded(entry3, alreadyRead, limits) {
@@ -3845,13 +3901,18 @@ function inflateEntryGuarded(entry3, alreadyRead, limits) {
3845
3901
  size += chunk.byteLength;
3846
3902
  if (size > declared || size > r.maxEntryBytes)
3847
3903
  return abort(
3848
- r.fail(`${r.label} part ${entry3.name} inflates past its declared size`, r.maxEntryBytes)
3904
+ r.fail(
3905
+ `${r.label} part ${entry3.name} inflates past its declared size`,
3906
+ r.maxEntryBytes,
3907
+ size > declared ? "declaredSize" : "maxEntryBytes"
3908
+ )
3849
3909
  );
3850
3910
  if (alreadyRead + size > r.maxTotalBytes)
3851
3911
  return abort(
3852
3912
  r.fail(
3853
3913
  `${r.label} package exceeds the ${mib(r.maxTotalBytes)} MiB uncompressed content limit`,
3854
- r.maxTotalBytes
3914
+ r.maxTotalBytes,
3915
+ "maxTotalBytes"
3855
3916
  )
3856
3917
  );
3857
3918
  chunks.push(chunk);
@@ -3884,26 +3945,29 @@ function guardZip(zip, limits = {}) {
3884
3945
  if (entries.length > r.maxEntries)
3885
3946
  throw r.fail(
3886
3947
  `${r.label} package exceeds the ${r.maxEntries.toLocaleString("en-US")} part limit`,
3887
- r.maxEntries
3948
+ r.maxEntries,
3949
+ "maxEntries"
3888
3950
  );
3889
3951
  let declared = 0;
3890
3952
  for (const entry3 of entries) {
3891
3953
  const original = entry3.unsafeOriginalName;
3892
3954
  if (!isSafePartName(entry3.name) || original !== void 0 && !isSafePartName(original))
3893
- throw r.fail(`${r.label} package has an unsafe part name`, r.maxEntries);
3955
+ throw r.fail(`${r.label} package has an unsafe part name`, r.maxEntries, "partName");
3894
3956
  if (entry3.dir) continue;
3895
3957
  const size = declaredEntrySize(entry3);
3896
3958
  if (size > r.maxEntryBytes)
3897
3959
  throw r.fail(
3898
3960
  `${r.label} part ${entry3.name} exceeds the uncompressed part size limit`,
3899
- r.maxEntryBytes
3961
+ r.maxEntryBytes,
3962
+ "maxEntryBytes"
3900
3963
  );
3901
3964
  declared += size;
3902
3965
  }
3903
3966
  if (declared > r.maxTotalBytes)
3904
3967
  throw r.fail(
3905
3968
  `${r.label} package exceeds the ${mib(r.maxTotalBytes)} MiB uncompressed content limit`,
3906
- r.maxTotalBytes
3969
+ r.maxTotalBytes,
3970
+ "maxTotalBytes"
3907
3971
  );
3908
3972
  const produced = /* @__PURE__ */ new Map();
3909
3973
  let total2 = 0;
@@ -5593,6 +5657,9 @@ function formatValue(value2, format, options = {}) {
5593
5657
  if (options.width !== void 0) return fitNumber(value2, format, options);
5594
5658
  return formatNumber(value2, format, options.date1904 ?? false);
5595
5659
  }
5660
+ function isDateFormat(format) {
5661
+ return compileFormat(format).isDate;
5662
+ }
5596
5663
 
5597
5664
  // xlsx/numfmt/input-date.ts
5598
5665
  var MONTH_NAMES = [
@@ -5815,9 +5882,9 @@ function parseCellInput(text2, options = {}) {
5815
5882
  return parsed.numFmt ? { value: parsed.value, numFmt: parsed.numFmt } : { value: parsed.value };
5816
5883
  }
5817
5884
 
5818
- // xlsx/styles.ts
5819
- function styleKey(style2) {
5820
- return JSON.stringify(sortKeys(style2));
5885
+ // xlsx/stable-key.ts
5886
+ function stableKey(value2) {
5887
+ return JSON.stringify(sortKeys(value2));
5821
5888
  }
5822
5889
  function sortKeys(value2) {
5823
5890
  if (Array.isArray(value2)) return value2.map(sortKeys);
@@ -5831,6 +5898,11 @@ function sortKeys(value2) {
5831
5898
  }
5832
5899
  return value2;
5833
5900
  }
5901
+
5902
+ // xlsx/styles.ts
5903
+ function styleKey(style2) {
5904
+ return stableKey(style2);
5905
+ }
5834
5906
  function styleAt(workbook, styleId) {
5835
5907
  const style2 = workbook.styles[styleId ?? 0] ?? workbook.styles[0];
5836
5908
  if (!style2) throw new Error("Workbook has no default cell style");
@@ -9283,10 +9355,72 @@ function mergeComments(legacy, threaded) {
9283
9355
  (a2, b) => a2.address.row - b.address.row || a2.address.col - b.address.col
9284
9356
  );
9285
9357
  }
9286
- var MAX_INPUT_BYTES = 50 * 1024 * 1024;
9287
- var MAX_PARTS = 1e4;
9288
- var MAX_UNCOMPRESSED_BYTES = 300 * 1024 * 1024;
9289
- var MAX_PART_BYTES = 200 * 1024 * 1024;
9358
+
9359
+ // xlsx/read/limits.ts
9360
+ var DEFAULT_XLSX_LOAD_LIMITS = {
9361
+ maxInputBytes: 50 * 1024 * 1024,
9362
+ maxParts: 1e4,
9363
+ maxPartBytes: 200 * 1024 * 1024,
9364
+ maxTotalBytes: 300 * 1024 * 1024,
9365
+ maxXmlElements: 5e6
9366
+ };
9367
+ var WorkbookTooLargeError = class extends Error {
9368
+ code = "workbook-too-large";
9369
+ /** The limit that was exceeded, as named in {@link XlsxLoadLimits}. */
9370
+ limit;
9371
+ /** The value of that limit when the load failed. */
9372
+ maximum;
9373
+ constructor(message, limit2, maximum, options) {
9374
+ super(message, options);
9375
+ this.name = "WorkbookTooLargeError";
9376
+ this.limit = limit2;
9377
+ this.maximum = maximum;
9378
+ }
9379
+ };
9380
+ function isWorkbookTooLargeError(error) {
9381
+ return error instanceof Error && error.code === "workbook-too-large";
9382
+ }
9383
+ function resolveLoadLimits(limits = {}) {
9384
+ const resolved = { ...DEFAULT_XLSX_LOAD_LIMITS };
9385
+ for (const name of Object.keys(resolved)) {
9386
+ const value2 = limits[name];
9387
+ if (value2 === void 0) continue;
9388
+ if (!Number.isFinite(value2) || value2 <= 0)
9389
+ throw new RangeError(`limits.${name} must be a positive finite number`);
9390
+ resolved[name] = value2;
9391
+ }
9392
+ return resolved;
9393
+ }
9394
+ var ZIP_LIMIT_NAMES = {
9395
+ maxInputBytes: "maxInputBytes",
9396
+ maxEntries: "maxParts",
9397
+ maxEntryBytes: "maxPartBytes",
9398
+ maxTotalBytes: "maxTotalBytes"
9399
+ };
9400
+ function zipLimitsFor(limits) {
9401
+ return {
9402
+ maxInputBytes: limits.maxInputBytes,
9403
+ maxEntries: limits.maxParts,
9404
+ maxEntryBytes: limits.maxPartBytes,
9405
+ maxTotalBytes: limits.maxTotalBytes,
9406
+ label: "XLSX",
9407
+ createError: (message, { limit: limit2, kind }) => {
9408
+ const name = ZIP_LIMIT_NAMES[kind];
9409
+ return name ? new WorkbookTooLargeError(message, name, limit2) : new ZipLimitError(message, { limit: limit2, kind });
9410
+ }
9411
+ };
9412
+ }
9413
+ function parseDataXml(xml, label2, maxXmlElements = DEFAULT_XLSX_LOAD_LIMITS.maxXmlElements) {
9414
+ try {
9415
+ return parseXml(xml, { label: label2, limits: { maxNodes: maxXmlElements } });
9416
+ } catch (error) {
9417
+ if (error instanceof XmlLimitError && error.limit === "maxNodes")
9418
+ throw new WorkbookTooLargeError(error.message, "maxXmlElements", error.maximum, {
9419
+ cause: error
9420
+ });
9421
+ throw error;
9422
+ }
9423
+ }
9290
9424
  var CONTENT_TYPES = {
9291
9425
  workbook: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
9292
9426
  workbookMacro: "application/vnd.ms-excel.sheet.macroEnabled.main+xml",
@@ -9376,16 +9510,15 @@ var SourceIndex = class {
9376
9510
  };
9377
9511
  var mib2 = (bytes) => Math.round(bytes / 1048576);
9378
9512
  async function readZipParts(input, limits = {}) {
9379
- const maxInput = limits.maxInputBytes ?? MAX_INPUT_BYTES;
9380
- const zipLimits = {
9381
- maxEntries: limits.maxParts ?? MAX_PARTS,
9382
- maxEntryBytes: limits.maxPartBytes ?? MAX_PART_BYTES,
9383
- maxTotalBytes: limits.maxTotalBytes ?? MAX_UNCOMPRESSED_BYTES,
9384
- label: "XLSX"
9385
- };
9513
+ const resolved = resolveLoadLimits(limits);
9514
+ const maxInput = resolved.maxInputBytes;
9386
9515
  const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);
9387
9516
  if (bytes.byteLength > maxInput)
9388
- throw new Error(`XLSX package exceeds the ${mib2(maxInput)} MiB compressed input limit`);
9517
+ throw new WorkbookTooLargeError(
9518
+ `XLSX package exceeds the ${mib2(maxInput)} MiB compressed input limit`,
9519
+ "maxInputBytes",
9520
+ maxInput
9521
+ );
9389
9522
  let loaded;
9390
9523
  try {
9391
9524
  loaded = await JSZip2.loadAsync(bytes);
@@ -9395,7 +9528,7 @@ async function readZipParts(input, limits = {}) {
9395
9528
  { cause: error }
9396
9529
  );
9397
9530
  }
9398
- const zip = guardZip(loaded, zipLimits);
9531
+ const zip = guardZip(loaded, zipLimitsFor(resolved));
9399
9532
  const parts = /* @__PURE__ */ new Map();
9400
9533
  for (const entry3 of Object.values(zip.files)) {
9401
9534
  if (entry3.dir) continue;
@@ -9602,9 +9735,9 @@ function parseRichString(element2, palette) {
9602
9735
  const text2 = parsed.map((run2) => run2.text).join("");
9603
9736
  return { text: text2, runs: parsed };
9604
9737
  }
9605
- function parseSharedStrings(xml, palette) {
9738
+ function parseSharedStrings(xml, palette, maxXmlElements) {
9606
9739
  if (!xml) return [];
9607
- const root = parseXml(xml, { label: "XLSX shared strings" }).documentElement;
9740
+ const root = parseDataXml(xml, "XLSX shared strings", maxXmlElements).documentElement;
9608
9741
  return xChildren(root, "si").map((si) => parseRichString(si, palette));
9609
9742
  }
9610
9743
 
@@ -13996,21 +14129,50 @@ function rootNamespaces(xml) {
13996
14129
  for (const match2 of (root[2] ?? "").matchAll(DECLARATION2)) out[match2[1] ?? ""] = match2[3] ?? "";
13997
14130
  return out;
13998
14131
  }
14132
+ var SPECIAL = /<[!?]/g;
14133
+ var SECTIONS = [
14134
+ ["<!--", "-->"],
14135
+ ["<![CDATA[", "]]>"],
14136
+ ["<?", "?>"]
14137
+ ];
14138
+ function blankComments(xml) {
14139
+ if (!xml.includes("<!--") && !xml.includes("<![CDATA[")) return xml;
14140
+ const pieces = [];
14141
+ let copied = 0;
14142
+ SPECIAL.lastIndex = 0;
14143
+ for (let match2 = SPECIAL.exec(xml); match2; match2 = SPECIAL.exec(xml)) {
14144
+ const at = match2.index;
14145
+ const section = SECTIONS.find(([open2]) => xml.startsWith(open2, at));
14146
+ if (!section) return void 0;
14147
+ const [open, close2] = section;
14148
+ const end = xml.indexOf(close2, at + open.length);
14149
+ if (end < 0) return void 0;
14150
+ const after = end + close2.length;
14151
+ if (open !== "<?") {
14152
+ pieces.push(xml.slice(copied, at), " ".repeat(after - at));
14153
+ copied = after;
14154
+ }
14155
+ SPECIAL.lastIndex = after;
14156
+ }
14157
+ pieces.push(xml.slice(copied));
14158
+ return pieces.join("");
14159
+ }
13999
14160
  function splitSheetData(xml) {
14000
- if (xml.includes("<!--") || xml.includes("<![CDATA[")) return void 0;
14001
- const namespaces = rootNamespaces(xml);
14002
- const open = OPEN.exec(xml);
14161
+ const plain3 = blankComments(xml);
14162
+ if (plain3 === void 0) return void 0;
14163
+ const namespaces = rootNamespaces(plain3);
14164
+ const open = OPEN.exec(plain3);
14003
14165
  if (!namespaces || !open) return void 0;
14004
14166
  const prefix = (open[1] ?? "").slice(0, -1);
14005
14167
  const ns = namespaces[prefix];
14006
14168
  if (prefix && ns === void 0) return void 0;
14007
14169
  const tagName = `${open[1] ?? ""}sheetData`;
14008
- const openEnd = xml.indexOf(">", open.index);
14170
+ const openEnd = plain3.indexOf(">", open.index);
14009
14171
  if (openEnd < 0) return void 0;
14010
- const attributes = xml.slice(open.index + tagName.length + 1, openEnd);
14172
+ const attributes = plain3.slice(open.index + tagName.length + 1, openEnd);
14011
14173
  if (attributes.trimEnd().endsWith("/") || attributes.includes("xmlns")) return void 0;
14012
- const close2 = xml.indexOf(`</${tagName}`, openEnd);
14013
- if (close2 < 0 || OPEN.test(xml.slice(openEnd))) return void 0;
14174
+ const close2 = plain3.indexOf(`</${tagName}`, openEnd);
14175
+ if (close2 < 0 || OPEN.test(plain3.slice(openEnd))) return void 0;
14014
14176
  const container2 = new LiteElement(tagName, "sheetData", ns || null);
14015
14177
  const data = parseLiteFragment(xml.slice(openEnd + 1, close2), container2, namespaces);
14016
14178
  if (!data) return void 0;
@@ -14215,7 +14377,11 @@ function parseWorksheet(ctx, partName, name, sheetId) {
14215
14377
  return sheet;
14216
14378
  }
14217
14379
  const split = splitSheetData(xml);
14218
- const root = parseXml(split?.xml ?? xml, { label: "XLSX worksheet" }).documentElement;
14380
+ const root = parseDataXml(
14381
+ split?.xml ?? xml,
14382
+ "XLSX worksheet",
14383
+ ctx.maxXmlElements
14384
+ ).documentElement;
14219
14385
  const byName = /* @__PURE__ */ new Map();
14220
14386
  const cfBlocks = [];
14221
14387
  for (const node2 of elements(root)) {
@@ -14289,8 +14455,9 @@ function liftPrintAreas(workbook) {
14289
14455
  return false;
14290
14456
  });
14291
14457
  }
14292
- async function loadXlsx(input) {
14293
- const parts = await readZipParts(input);
14458
+ async function loadXlsx(input, options = {}) {
14459
+ const limits = resolveLoadLimits(options.limits);
14460
+ const parts = await readZipParts(input, limits);
14294
14461
  const source2 = new SourceIndex(parts);
14295
14462
  const workbookPart = source2.workbookPart();
14296
14463
  if (!workbookPart) throw new Error("XLSX package has no workbook part (xl/workbook.xml)");
@@ -14311,7 +14478,8 @@ async function loadXlsx(input) {
14311
14478
  source: source2,
14312
14479
  sharedStrings: parseSharedStrings(
14313
14480
  stringsPart ? source2.text(stringsPart) : void 0,
14314
- styles.palette
14481
+ styles.palette,
14482
+ limits.maxXmlElements
14315
14483
  ),
14316
14484
  xfMap: styles.xfMap,
14317
14485
  date1904: book.date1904,
@@ -14319,7 +14487,8 @@ async function loadXlsx(input) {
14319
14487
  dxfs: styles.dxfs,
14320
14488
  persons: parsePersons(personsPart ? source2.text(personsPart) : void 0),
14321
14489
  dynamicCells: parseDynamicArrayMetadata(metadataPart ? source2.text(metadataPart) : void 0),
14322
- warn
14490
+ warn,
14491
+ maxXmlElements: limits.maxXmlElements
14323
14492
  };
14324
14493
  const rels = source2.rels(workbookPart);
14325
14494
  const sheets = book.sheets.map((entry3) => {
@@ -16536,6 +16705,52 @@ function finite(value2) {
16536
16705
  return value2;
16537
16706
  }
16538
16707
 
16708
+ // xlsx/formula/operators.ts
16709
+ function power(base, exponent) {
16710
+ if (base === 0 && exponent === 0) throw new ErrorSignal(ERR.NUM);
16711
+ if (base === 0 && exponent < 0) throw new ErrorSignal(ERR.DIV0);
16712
+ if (base < 0 && !Number.isInteger(exponent)) {
16713
+ const inverse = 1 / exponent;
16714
+ const odd = Math.round(inverse);
16715
+ if (Math.abs(inverse - odd) < 1e-10 && Math.abs(odd) % 2 === 1) {
16716
+ return -Math.pow(-base, exponent);
16717
+ }
16718
+ throw new ErrorSignal(ERR.NUM);
16719
+ }
16720
+ return Math.pow(base, exponent);
16721
+ }
16722
+ function pick(m, row2, col) {
16723
+ const r = m.rows === 1 ? 0 : row2;
16724
+ const c2 = m.cols === 1 ? 0 : col;
16725
+ if (r >= m.rows || c2 >= m.cols) return ERR.NA;
16726
+ return m.get(r, c2);
16727
+ }
16728
+ function broadcastShape(operands, at) {
16729
+ let rows = 1;
16730
+ let cols = 1;
16731
+ for (const m of operands) {
16732
+ rows = Math.max(rows, m.rows);
16733
+ cols = Math.max(cols, m.cols);
16734
+ }
16735
+ if (!operands.some((m) => m.isPadded)) return Matrix.build(rows, cols, at);
16736
+ let blockRows = 1;
16737
+ let blockCols = 1;
16738
+ for (const m of operands) {
16739
+ blockRows = Math.max(blockRows, m.isPadded ? m.blockRows : m.rows);
16740
+ blockCols = Math.max(blockCols, m.isPadded ? m.blockCols : m.cols);
16741
+ }
16742
+ blockRows = Math.min(blockRows, rows);
16743
+ blockCols = Math.min(blockCols, cols);
16744
+ const varies = operands.some(
16745
+ (m) => blockRows < rows && m.rows === 1 && m.cols > 1 || blockCols < cols && m.cols === 1 && m.rows > 1
16746
+ );
16747
+ if (varies) return Matrix.build(rows, cols, at);
16748
+ return Matrix.padded(Matrix.build(blockRows, blockCols, at), rows, cols, at(rows - 1, cols - 1));
16749
+ }
16750
+
16751
+ // xlsx/formula/spill.ts
16752
+ var isSpilledCell = (cell) => cell !== void 0 && "spillAnchor" in cell;
16753
+
16539
16754
  // xlsx/formula/functions/wildcard.ts
16540
16755
  var lower = (ch) => (ch ?? "").toLowerCase();
16541
16756
  var fold = (text2) => Array.from({ length: text2.length }, (_, i2) => lower(text2[i2]));
@@ -19820,49 +20035,6 @@ var INFO_FUNCTIONS = [
19820
20035
  )
19821
20036
  ];
19822
20037
 
19823
- // xlsx/formula/operators.ts
19824
- function power(base, exponent) {
19825
- if (base === 0 && exponent === 0) throw new ErrorSignal(ERR.NUM);
19826
- if (base === 0 && exponent < 0) throw new ErrorSignal(ERR.DIV0);
19827
- if (base < 0 && !Number.isInteger(exponent)) {
19828
- const inverse = 1 / exponent;
19829
- const odd = Math.round(inverse);
19830
- if (Math.abs(inverse - odd) < 1e-10 && Math.abs(odd) % 2 === 1) {
19831
- return -Math.pow(-base, exponent);
19832
- }
19833
- throw new ErrorSignal(ERR.NUM);
19834
- }
19835
- return Math.pow(base, exponent);
19836
- }
19837
- function pick(m, row2, col) {
19838
- const r = m.rows === 1 ? 0 : row2;
19839
- const c2 = m.cols === 1 ? 0 : col;
19840
- if (r >= m.rows || c2 >= m.cols) return ERR.NA;
19841
- return m.get(r, c2);
19842
- }
19843
- function broadcastShape(operands, at) {
19844
- let rows = 1;
19845
- let cols = 1;
19846
- for (const m of operands) {
19847
- rows = Math.max(rows, m.rows);
19848
- cols = Math.max(cols, m.cols);
19849
- }
19850
- if (!operands.some((m) => m.isPadded)) return Matrix.build(rows, cols, at);
19851
- let blockRows = 1;
19852
- let blockCols = 1;
19853
- for (const m of operands) {
19854
- blockRows = Math.max(blockRows, m.isPadded ? m.blockRows : m.rows);
19855
- blockCols = Math.max(blockCols, m.isPadded ? m.blockCols : m.cols);
19856
- }
19857
- blockRows = Math.min(blockRows, rows);
19858
- blockCols = Math.min(blockCols, cols);
19859
- const varies = operands.some(
19860
- (m) => blockRows < rows && m.rows === 1 && m.cols > 1 || blockCols < cols && m.cols === 1 && m.rows > 1
19861
- );
19862
- if (varies) return Matrix.build(rows, cols, at);
19863
- return Matrix.padded(Matrix.build(blockRows, blockCols, at), rows, cols, at(rows - 1, cols - 1));
19864
- }
19865
-
19866
20038
  // xlsx/formula/functions/lambda.ts
19867
20039
  var C17 = "Logical";
19868
20040
  function lambdaArg(value2) {
@@ -25122,9 +25294,6 @@ var paramKind = (spec2, index3) => {
25122
25294
  return params[Math.min(index3, params.length - 1)] ?? "value";
25123
25295
  };
25124
25296
 
25125
- // xlsx/formula/spill.ts
25126
- var isSpilledCell = (cell) => cell !== void 0 && "spillAnchor" in cell;
25127
-
25128
25297
  // xlsx/formula/move.ts
25129
25298
  var same3 = (a2, b) => a2.toLowerCase() === b.toLowerCase();
25130
25299
  function deleteSheetInFormula(formula, sheetName, tableNames = []) {
@@ -27153,10 +27322,8 @@ function sheetFormatXml(sheet) {
27153
27322
  const current = { defaultRowHeight: sheet.defaultRowHeight };
27154
27323
  if (sheet.defaultColWidth !== void 0) current.defaultColWidth = sheet.defaultColWidth;
27155
27324
  if (sheet.format && Object.keys(sheet.format).length) current.format = sheet.format;
27156
- const rowLevel = Math.max(
27157
- 0,
27158
- ...[...sheet.rowInfo.values()].map((info) => info.outlineLevel ?? 0)
27159
- );
27325
+ let rowLevel = 0;
27326
+ for (const info of sheet.rowInfo.values()) rowLevel = Math.max(rowLevel, info.outlineLevel ?? 0);
27160
27327
  const colLevel = Math.max(0, ...sheet.columns.map((col) => col.outlineLevel ?? 0));
27161
27328
  if (source2 && sameModel(readSheetFormat(source2), current) && Number(source2.getAttribute("outlineLevelRow") ?? 0) === rowLevel && Number(source2.getAttribute("outlineLevelCol") ?? 0) === colLevel)
27162
27329
  return snapshotXml(sheet, "sheetFormatPr") ?? "";
@@ -27458,11 +27625,10 @@ function pivotCacheDefinitionXml(pivot, workbook, data, recordRel) {
27458
27625
  const items = data.items[index3];
27459
27626
  if (pivot.dateFields?.includes(name) && items.every((v) => typeof v === "number")) {
27460
27627
  const serials = items;
27461
- const latest = Math.max(...serials);
27462
- const maxDate = Number.isInteger(latest) ? latest + 1 : latest;
27628
+ const range = dateGroupRange({}, serials);
27463
27629
  const parent = derived.filter((entry3) => entry3.group.field === name).at(-1);
27464
27630
  const link = parent ? `<fieldGroup par="${parent.index}"/>` : "";
27465
- 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>`;
27631
+ 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>`;
27466
27632
  }
27467
27633
  const types = new Set(
27468
27634
  items.map((value2) => value2 === null || value2 === "" ? "blank" : typeof value2)
@@ -28333,6 +28499,332 @@ async function saveXlsx(workbook) {
28333
28499
  return writer.build();
28334
28500
  }
28335
28501
 
28502
+ // xlsx/load/csv-dates.ts
28503
+ var DAY_RE = /^(\d{1,4})([-/. ])(\d{1,4})\2(\d{1,4})$/;
28504
+ var COMPACT_RE = /^\d{8}$/;
28505
+ var PAIR_RE = /^(\d{1,2})\/(\d{1,2})$/;
28506
+ var FRACTION_RE = /\.(\d+)/;
28507
+ var TIME_RE3 = /^(\d{1,2}:\d{1,2}(?::\d{1,2}(?:\.\d+)?)?(?:\s*[ap]m?)?)\s*(Z|[+-]\d{2}(?::?\d{2})?)?$/i;
28508
+ var SPACE_RE = /\s/;
28509
+ var MAX_DATE_TEXT = 64;
28510
+ function splitTime(text2) {
28511
+ const colon = text2.indexOf(":");
28512
+ if (colon < 0) return [text2, void 0];
28513
+ let start = colon;
28514
+ while (start > 0 && colon - start < 2) {
28515
+ const code = text2.charCodeAt(start - 1);
28516
+ if (code < 48 || code > 57) break;
28517
+ start--;
28518
+ }
28519
+ const before = text2[start - 1] ?? "";
28520
+ if (start === colon || !before) return void 0;
28521
+ if (before === "T" || before === "t") return [text2.slice(0, start - 1), text2.slice(start)];
28522
+ return SPACE_RE.test(before) ? [text2.slice(0, start).trimEnd(), text2.slice(start)] : void 0;
28523
+ }
28524
+ function compactParts(text2, order) {
28525
+ const parts = [];
28526
+ let at = 0;
28527
+ for (const kind of order) {
28528
+ const size = kind === "Y" ? 4 : 2;
28529
+ parts.push(text2.slice(at, at + size));
28530
+ at += size;
28531
+ }
28532
+ return parts;
28533
+ }
28534
+ function pairParts(pair, order) {
28535
+ let next = 0;
28536
+ return [...order].map(
28537
+ (kind) => kind === "Y" ? String((/* @__PURE__ */ new Date()).getFullYear()) : pair[next++] ?? ""
28538
+ );
28539
+ }
28540
+ function dayParts(text2, order) {
28541
+ const match2 = DAY_RE.exec(text2);
28542
+ if (match2) return [match2[1] ?? "", match2[3] ?? "", match2[4] ?? ""];
28543
+ if (COMPACT_RE.test(text2)) return compactParts(text2, order);
28544
+ const pair = PAIR_RE.exec(text2);
28545
+ return pair ? pairParts([pair[1] ?? "", pair[2] ?? ""], order) : void 0;
28546
+ }
28547
+ function inOrder(parts, order) {
28548
+ const date = [0, 0, 0];
28549
+ for (let i2 = 0; i2 < 3; i2++) {
28550
+ const part = parts[i2] ?? "";
28551
+ const kind = order[i2];
28552
+ if (kind === "Y") {
28553
+ if (part.length === 3 || part.length > 4) return void 0;
28554
+ date[0] = fullYear(part);
28555
+ } else if (part.length > 2) return void 0;
28556
+ else date[kind === "M" ? 1 : 2] = Number(part);
28557
+ }
28558
+ return date;
28559
+ }
28560
+ function offsetMinutes(zone) {
28561
+ if (zone === "Z" || zone === "z") return 0;
28562
+ const hours = Number(zone.slice(1, 3));
28563
+ const minutes = zone.length > 3 ? Number(zone.slice(-2)) : 0;
28564
+ if (hours > 23 || minutes > 59) return void 0;
28565
+ return (zone.startsWith("-") ? -1 : 1) * (hours * 60 + minutes);
28566
+ }
28567
+ function parseOrderedDate(text2, order, date1904, decimal = ".") {
28568
+ if (text2.length > MAX_DATE_TEXT) return void 0;
28569
+ const split = splitTime(text2);
28570
+ if (!split) return void 0;
28571
+ let clock = split[1];
28572
+ if (clock !== void 0 && decimal !== ".")
28573
+ clock = clock.includes(".") ? "" : clock.replace(decimal, ".");
28574
+ const tail = clock === void 0 ? void 0 : TIME_RE3.exec(clock);
28575
+ if (clock !== void 0 && !tail) return void 0;
28576
+ const parts = dayParts(split[0], order);
28577
+ const date = parts && inOrder(parts, order);
28578
+ if (!date) return void 0;
28579
+ const serial = serialOf(date[0], date[1], date[2], date1904);
28580
+ if (serial === void 0) return void 0;
28581
+ if (!tail) return { value: serial, numFmt: "yyyy-mm-dd", zoned: false };
28582
+ const time = parseTime(tail[1] ?? "");
28583
+ if (!time || time.fraction >= 1) return void 0;
28584
+ const zone = tail[2];
28585
+ const offset2 = zone === void 0 ? 0 : offsetMinutes(zone);
28586
+ if (offset2 === void 0) return void 0;
28587
+ const value2 = serial + time.fraction - offset2 / 1440;
28588
+ if (value2 < (date1904 ? 0 : 1)) return void 0;
28589
+ const digits2 = Math.min(3, FRACTION_RE.exec(tail[1] ?? "")?.[1]?.length ?? 0);
28590
+ const format = digits2 ? `h:mm:ss.${"0".repeat(digits2)}` : time.format;
28591
+ return { value: value2, numFmt: `yyyy-mm-dd ${format}`, zoned: zone !== void 0 };
28592
+ }
28593
+
28594
+ // xlsx/load/csv-separators.ts
28595
+ function separatorsOf(decimal = ".", thousands = decimal === "," ? "." : ",") {
28596
+ for (const separator of [decimal, thousands])
28597
+ if (separator.length !== 1 || /[\d+-]/.test(separator))
28598
+ throw new RangeError(`"${separator}" cannot be a decimal or thousands separator.`);
28599
+ if (decimal === thousands)
28600
+ throw new RangeError("The decimal and thousands separators must differ.");
28601
+ return { decimal, thousands };
28602
+ }
28603
+ function separatorNormalizer({
28604
+ decimal,
28605
+ thousands
28606
+ }) {
28607
+ if (decimal === "." && thousands === ",") return void 0;
28608
+ const escape2 = (char) => char.replace(/[\\^$.*+?()[\]{}|]/g, "\\$&");
28609
+ const pattern = new RegExp(`(${escape2(decimal)})|(\\d)${escape2(thousands)}(?=\\d)|[.,]`, "g");
28610
+ const swap = (_, point, digit) => {
28611
+ if (point !== void 0) return ".";
28612
+ if (digit !== void 0) return `${digit},`;
28613
+ return "";
28614
+ };
28615
+ return (text2) => text2.replace(pattern, swap);
28616
+ }
28617
+
28618
+ // xlsx/load/csv-traits.ts
28619
+ var LEADING_ZEROS = 1;
28620
+ var LONG_NUMBER = 2;
28621
+ var SCIENTIFIC = 4;
28622
+ var LETTER_DATE = 8;
28623
+ var TIME_ZONE = 16;
28624
+ var DATE_FALLBACK = 32;
28625
+ var isDigit4 = (code) => code >= 48 && code <= 57;
28626
+ var isLetter2 = (code) => (code | 32) >= 97 && (code | 32) <= 122;
28627
+ function numberTraits(text2, decimal, thousands) {
28628
+ let traits = 0;
28629
+ let digits2 = 0;
28630
+ let first2 = true;
28631
+ for (let i2 = 0; i2 < text2.length; i2++) {
28632
+ const code = text2.charCodeAt(i2);
28633
+ if (isDigit4(code)) {
28634
+ if (first2 && code === 48) {
28635
+ const next = text2.charCodeAt(i2 + 1);
28636
+ if (isDigit4(next) || next === thousands && isDigit4(text2.charCodeAt(i2 + 2)))
28637
+ traits |= LEADING_ZEROS;
28638
+ }
28639
+ first2 = false;
28640
+ if (digits2 > 0 || code !== 48) digits2++;
28641
+ } else if (code === decimal) first2 = false;
28642
+ else if (code === 69 || code === 101) {
28643
+ traits |= SCIENTIFIC;
28644
+ break;
28645
+ }
28646
+ }
28647
+ return digits2 > 15 ? traits | LONG_NUMBER : traits;
28648
+ }
28649
+ function significantDigits(text2) {
28650
+ let digits2 = "";
28651
+ for (const char of text2) {
28652
+ if (char === "e" || char === "E") break;
28653
+ if (char >= "0" && char <= "9" && (digits2 !== "" || char !== "0")) digits2 += char;
28654
+ }
28655
+ let end = digits2.length;
28656
+ while (end > 0 && digits2[end - 1] === "0") end--;
28657
+ return digits2.slice(0, end);
28658
+ }
28659
+ var keepsDigits = (field, value2) => significantDigits(field) === significantDigits(String(Math.abs(value2)));
28660
+ function dateTraits(field) {
28661
+ const text2 = field.trimStart();
28662
+ let i2 = 0;
28663
+ while (isLetter2(text2.charCodeAt(i2))) i2++;
28664
+ return i2 > 0 && isDigit4(text2.charCodeAt(i2)) ? LETTER_DATE : 0;
28665
+ }
28666
+
28667
+ // xlsx/load/csv-import.ts
28668
+ var KINDS2 = [
28669
+ {
28670
+ conversion: "leadingZeros",
28671
+ one: "value lost its leading zeros when converted to a number",
28672
+ many: "values lost their leading zeros when converted to numbers"
28673
+ },
28674
+ {
28675
+ conversion: "longNumbers",
28676
+ one: "value with more than 15 digits lost digits when converted to a number",
28677
+ many: "values with more than 15 digits lost digits when converted to numbers"
28678
+ },
28679
+ {
28680
+ conversion: "scientific",
28681
+ one: "value with the letter E lost digits when converted to a number",
28682
+ many: "values with the letter E lost digits when converted to numbers"
28683
+ },
28684
+ {
28685
+ conversion: "letterDates",
28686
+ one: "value of letters and digits such as JAN1 was converted to a date",
28687
+ many: "values of letters and digits such as JAN1 were converted to dates"
28688
+ },
28689
+ {
28690
+ conversion: void 0,
28691
+ one: "date-time with a time zone was converted to UTC",
28692
+ many: "date-times with a time zone were converted to UTC"
28693
+ },
28694
+ {
28695
+ conversion: void 0,
28696
+ one: "value could not be read as a date in {order} order and was read as General",
28697
+ many: "values could not be read as dates in {order} order and were read as General"
28698
+ }
28699
+ ];
28700
+ var FORMATS = /* @__PURE__ */ new Set(["general", "text", "skip", "MDY", "DMY", "YMD", "MYD", "DYM", "YDM"]);
28701
+ var DAY_FIRST = /* @__PURE__ */ new Set(["DMY", "DYM", "YDM"]);
28702
+ var MONTH_FIRST_RE = /^\d{1,2}[-/]\d{1,2}(?:[-/]\d{1,4})?(?:$|[\sT])/;
28703
+ var FRACTION_FORMATS = /* @__PURE__ */ new Set(["# ?/?", "# ??/??"]);
28704
+ var EN_US_SEPARATORS_RE = /[.,]/;
28705
+ var SIGNED_RE = /^\s*(?:[$€£]\s*)?[-+(]/;
28706
+ function columnFormats(columns) {
28707
+ const formats = [];
28708
+ for (const [key, format] of Object.entries(columns ?? {})) {
28709
+ const col = Number(key);
28710
+ if (!Number.isInteger(col) || col < 0 || col > MAX_COL)
28711
+ throw new RangeError(`CSV column ${key} is not a zero-based column index.`);
28712
+ if (!FORMATS.has(format))
28713
+ throw new RangeError(`Unknown CSV column format "${String(format)}" for column ${col}.`);
28714
+ formats[col] = format;
28715
+ }
28716
+ return formats;
28717
+ }
28718
+ function createFieldReader(options, date1904) {
28719
+ const formats = columnFormats(options.columns);
28720
+ const targets = [];
28721
+ let skipped = 0;
28722
+ for (let col = 0; col < formats.length; col++) {
28723
+ if (formats[col] === "skip") {
28724
+ targets.push(-1);
28725
+ skipped++;
28726
+ } else targets.push(col - skipped);
28727
+ }
28728
+ const target = (col) => col < targets.length ? targets[col] ?? -1 : col - skipped;
28729
+ let keepText = 0;
28730
+ KINDS2.forEach(({ conversion }, kind) => {
28731
+ if (conversion && options.conversions?.[conversion] === false) keepText |= 1 << kind;
28732
+ });
28733
+ const separators = separatorsOf(options.decimalSeparator, options.thousandsSeparator);
28734
+ const normalize = separatorNormalizer(separators);
28735
+ const decimal = separators.decimal.charCodeAt(0);
28736
+ const thousands = separators.thousands.charCodeAt(0);
28737
+ const { formulas = false, trailingMinus = false } = options;
28738
+ const counts = [];
28739
+ const firstRows = [];
28740
+ const report = (traits, row2, col) => {
28741
+ if (options.reportConversions === false) return;
28742
+ for (let kind = 0; kind < KINDS2.length; kind++) {
28743
+ if (!(traits & 1 << kind)) continue;
28744
+ const key = col * KINDS2.length + kind;
28745
+ const count2 = counts[key];
28746
+ if (count2 === void 0) firstRows[key] = row2;
28747
+ counts[key] = (count2 ?? 0) + 1;
28748
+ }
28749
+ };
28750
+ const dateFormats = /* @__PURE__ */ new Map();
28751
+ const isDate = (numFmt) => {
28752
+ if (numFmt === void 0) return false;
28753
+ let known = dateFormats.get(numFmt);
28754
+ if (known === void 0) {
28755
+ known = isDateFormat(numFmt);
28756
+ dateFormats.set(numFmt, known);
28757
+ }
28758
+ return known;
28759
+ };
28760
+ const isNumber = (parsed) => typeof parsed.value === "number" && parsed.formula === void 0 && !isDate(parsed.numFmt);
28761
+ const localized = (text2, normalized) => {
28762
+ const parsed = parseCellInput(normalized);
28763
+ if (normalized === text2 || isNumber(parsed)) return parsed;
28764
+ const plain3 = parseCellInput(text2);
28765
+ if (isNumber(plain3) && EN_US_SEPARATORS_RE.test(text2)) return { value: text2 };
28766
+ const dated = typeof parsed.value === "number" && parsed.formula === void 0;
28767
+ return dated && typeof plain3.value === "string" ? parsed : plain3;
28768
+ };
28769
+ const type = normalize ? (text2) => localized(text2, normalize(text2)) : (text2) => parseCellInput(text2);
28770
+ const negative = (field) => {
28771
+ const text2 = field.trimEnd();
28772
+ if (text2.length < 2 || !text2.endsWith("-")) return void 0;
28773
+ const body = text2.slice(0, -1);
28774
+ if (SIGNED_RE.test(body)) return void 0;
28775
+ const parsed = type(body);
28776
+ if (!isNumber(parsed)) return void 0;
28777
+ return { ...parsed, value: parsed.value === 0 ? 0 : -parsed.value };
28778
+ };
28779
+ const general = (field, row2, col) => {
28780
+ if (!formulas && field.startsWith("=")) return { value: field };
28781
+ const parsed = (trailingMinus ? negative(field) : void 0) ?? type(field);
28782
+ if (typeof parsed.value !== "number" || parsed.formula !== void 0) return parsed;
28783
+ const grouping = FRACTION_FORMATS.has(parsed.numFmt ?? "") ? -1 : thousands;
28784
+ const traits = isDate(parsed.numFmt) ? dateTraits(field) : numberTraits(field, decimal, grouping);
28785
+ if (traits === 0) return parsed;
28786
+ if (traits & keepText) return { value: field };
28787
+ let lost = traits;
28788
+ if (traits & (LONG_NUMBER | SCIENTIFIC)) {
28789
+ if (keepsDigits(field, parsed.value)) lost &= -7;
28790
+ else if (traits & LONG_NUMBER) lost &= ~SCIENTIFIC;
28791
+ }
28792
+ if (lost) report(lost, row2, col);
28793
+ return parsed;
28794
+ };
28795
+ return {
28796
+ target,
28797
+ read(field, row2, col) {
28798
+ const format = col < formats.length ? formats[col] : void 0;
28799
+ if (format === void 0 || format === "general") return general(field, row2, col);
28800
+ if (format === "text") return { value: field, numFmt: "@" };
28801
+ if (format === "skip") return { value: null };
28802
+ const date = parseOrderedDate(field.trim(), format, date1904, separators.decimal);
28803
+ if (!date) {
28804
+ const parsed = general(field, row2, col);
28805
+ const dated = typeof parsed.value === "number" && isDate(parsed.numFmt);
28806
+ if (dated && DAY_FIRST.has(format) && MONTH_FIRST_RE.test(field.trim()))
28807
+ report(DATE_FALLBACK, row2, col);
28808
+ return parsed;
28809
+ }
28810
+ if (date.zoned) report(TIME_ZONE, row2, col);
28811
+ return { value: date.value, numFmt: date.numFmt };
28812
+ },
28813
+ warnings() {
28814
+ const warnings = [];
28815
+ counts.forEach((count2, key) => {
28816
+ const kind = KINDS2[key % KINDS2.length];
28817
+ const col = Math.floor(key / KINDS2.length);
28818
+ const label2 = columnLabel(target(col));
28819
+ const what = (count2 === 1 ? kind?.one : kind?.many)?.replace("{order}", formats[col] ?? "");
28820
+ const row2 = (firstRows[key] ?? 0) + 1;
28821
+ warnings.push(`Column ${label2}: ${count2} ${what} (first: ${label2}${row2}).`);
28822
+ });
28823
+ return warnings;
28824
+ }
28825
+ };
28826
+ }
28827
+
28336
28828
  // xlsx/load/csv.ts
28337
28829
  var CANDIDATES = [",", ";", " "];
28338
28830
  function delimiterCounts(text2, maxLines = 20) {
@@ -28429,6 +28921,7 @@ function csvToWorkbook(text2, options = {}) {
28429
28921
  workbook.format = "csv";
28430
28922
  const sheet = workbook.sheets[0];
28431
28923
  if (!sheet) return workbook;
28924
+ const reader = createFieldReader(options, workbook.date1904);
28432
28925
  const base = styleAt(workbook, 0);
28433
28926
  const formats = /* @__PURE__ */ new Map();
28434
28927
  const rows = parseCsv(
@@ -28436,9 +28929,11 @@ function csvToWorkbook(text2, options = {}) {
28436
28929
  options.delimiter === void 0 ? {} : { delimiter: options.delimiter }
28437
28930
  );
28438
28931
  rows.forEach((fields, row2) => {
28439
- fields.forEach((field, col) => {
28932
+ fields.forEach((field, source2) => {
28440
28933
  if (field === "") return;
28441
- const parsed = !options.formulas && field.startsWith("=") ? { value: field } : parseCellInput(field);
28934
+ const col = reader.target(source2);
28935
+ if (col < 0) return;
28936
+ const parsed = reader.read(field, row2, source2);
28442
28937
  const cell = { value: parsed.value };
28443
28938
  if (parsed.formula !== void 0) cell.formula = parsed.formula;
28444
28939
  if (parsed.numFmt && parsed.numFmt !== "General") {
@@ -28457,6 +28952,7 @@ function csvToWorkbook(text2, options = {}) {
28457
28952
  cells.set(col, cell);
28458
28953
  });
28459
28954
  });
28955
+ workbook.warnings.push(...reader.warnings());
28460
28956
  return workbook;
28461
28957
  }
28462
28958
  var FORMULA_TRIGGER = /^[=+\-@\t\r]/;
@@ -29707,7 +30203,7 @@ var RT = {
29707
30203
  OBPROJ: 211,
29708
30204
  SXSTREAMID: 213};
29709
30205
  var STATES = ["visible", "hidden", "veryHidden"];
29710
- var KINDS2 = {
30206
+ var KINDS3 = {
29711
30207
  0: "worksheet",
29712
30208
  1: "macro",
29713
30209
  2: "chart",
@@ -29842,7 +30338,7 @@ function parseGlobals(records) {
29842
30338
  case RT.BOUNDSHEET: {
29843
30339
  const offset2 = r.u32();
29844
30340
  const state = STATES[r.u8() & 3] ?? "visible";
29845
- const kind = KINDS2[r.u8()] ?? "unknown";
30341
+ const kind = KINDS3[r.u8()] ?? "unknown";
29846
30342
  out.sheets.push({ offset: offset2, state, kind, name: r.shortXlString() });
29847
30343
  break;
29848
30344
  }
@@ -31145,6 +31641,7 @@ async function decryptWorkbook(bytes, password) {
31145
31641
  return plain3;
31146
31642
  }
31147
31643
  async function loadWorkbook(input, options = {}) {
31644
+ const limits = options.limits && resolveLoadLimits(options.limits);
31148
31645
  let bytes = toBytes3(input);
31149
31646
  let format = detectWorkbookFormat(bytes, options.fileName);
31150
31647
  const encrypted = format === "encrypted";
@@ -31156,12 +31653,13 @@ async function loadWorkbook(input, options = {}) {
31156
31653
  if (format === "xls") return loadLegacyXls(bytes);
31157
31654
  if (format === "csv") {
31158
31655
  return csvToWorkbook(decodeText(bytes), {
31656
+ ...options.csv,
31159
31657
  sheetName: sheetNameFromFileName(options.fileName),
31160
31658
  ...options.delimiter === void 0 ? {} : { delimiter: options.delimiter },
31161
31659
  ...options.formulas === void 0 ? {} : { formulas: options.formulas }
31162
31660
  });
31163
31661
  }
31164
- const workbook = await loadXlsx(bytes);
31662
+ const workbook = await loadXlsx(bytes, limits ? { limits } : {});
31165
31663
  if (format === "xlsm" && workbook.format === "xlsx") workbook.format = "xlsm";
31166
31664
  if (encrypted) workbook.warnings.push(ENCRYPTED_WARNING);
31167
31665
  return workbook;
@@ -31180,4 +31678,4 @@ async function saveWorkbook(workbook, format, sheetIndexOrOptions) {
31180
31678
  return new TextEncoder().encode(`\uFEFF${csv}`);
31181
31679
  }
31182
31680
 
31183
- export { DataIntegrityError, IncorrectPasswordError, LegacyXlsError, PasswordRequiredError, UnsupportedWorkbookError, csvToWorkbook, decodeSpreadsheetText, decodeText, detectDelimiter, detectWorkbookFormat, isEncryptedOoxmlPackage, isOoxmlCryptoError, loadLegacyXls, loadWorkbook, neutraliseCsvFormula, parseCsv, saveWorkbook, sheetNameFromFileName, sheetToCsv };
31681
+ export { DataIntegrityError, IncorrectPasswordError, LegacyXlsError, PasswordRequiredError, UnsupportedWorkbookError, WorkbookTooLargeError, csvToWorkbook, decodeSpreadsheetText, decodeText, detectDelimiter, detectWorkbookFormat, isEncryptedOoxmlPackage, isOoxmlCryptoError, isWorkbookTooLargeError, loadLegacyXls, loadWorkbook, neutraliseCsvFormula, parseCsv, saveWorkbook, sheetNameFromFileName, sheetToCsv };