ooxml-core 1.20.0 → 1.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (422) hide show
  1. package/README.md +35 -0
  2. package/dist/{PptxHandler-TEKISCJO.cjs → PptxHandler-DNSXWTQV.cjs} +3 -3
  3. package/dist/{PptxHandler-FYD7IYXT.mjs → PptxHandler-FSKKPZZC.mjs} +3 -3
  4. package/dist/PptxHandler-H7MEWJJJ.mjs +4 -0
  5. package/dist/{PresentationBuilder-IMB4DVRN.mjs → PresentationBuilder-7TSENZTX.mjs} +2 -2
  6. package/dist/{PresentationBuilder-NCKASKXU.cjs → PresentationBuilder-A5NI35VN.cjs} +5 -5
  7. package/dist/{PresentationBuilder-EYI6Z2JP.mjs → PresentationBuilder-RIJWQSEU.mjs} +3 -3
  8. package/dist/automation/docx-forms.d.ts +26 -0
  9. package/dist/automation/docx-forms.d.ts.map +1 -0
  10. package/dist/automation/index.cjs +39159 -14352
  11. package/dist/automation/index.d.ts +5 -0
  12. package/dist/automation/index.d.ts.map +1 -1
  13. package/dist/automation/index.mjs +39145 -14353
  14. package/dist/automation/node.cjs +37 -0
  15. package/dist/automation/node.d.ts +32 -1
  16. package/dist/automation/node.d.ts.map +1 -1
  17. package/dist/automation/node.mjs +36 -1
  18. package/dist/automation/proposal.d.ts +25 -0
  19. package/dist/automation/proposal.d.ts.map +1 -0
  20. package/dist/automation/tools/define.d.ts +27 -0
  21. package/dist/automation/tools/define.d.ts.map +1 -0
  22. package/dist/automation/tools/docx-tools.d.ts +4 -0
  23. package/dist/automation/tools/docx-tools.d.ts.map +1 -0
  24. package/dist/automation/tools/index.d.ts +16 -0
  25. package/dist/automation/tools/index.d.ts.map +1 -0
  26. package/dist/automation/tools/types.d.ts +52 -0
  27. package/dist/automation/tools/types.d.ts.map +1 -0
  28. package/dist/automation/tools/visio-tools.d.ts +4 -0
  29. package/dist/automation/tools/visio-tools.d.ts.map +1 -0
  30. package/dist/automation/tools/xlsx-tools.d.ts +8 -0
  31. package/dist/automation/tools/xlsx-tools.d.ts.map +1 -0
  32. package/dist/automation/xlsx-edits.d.ts +88 -0
  33. package/dist/automation/xlsx-edits.d.ts.map +1 -0
  34. package/dist/automation/xlsx-proposal.d.ts +34 -0
  35. package/dist/automation/xlsx-proposal.d.ts.map +1 -0
  36. package/dist/automation/xlsx.d.ts +10 -5
  37. package/dist/automation/xlsx.d.ts.map +1 -1
  38. package/dist/chart/axis-range.d.ts.map +1 -1
  39. package/dist/chart/bubble-radius.d.ts +0 -5
  40. package/dist/chart/bubble-radius.d.ts.map +1 -1
  41. package/dist/chart/extent.d.ts +9 -0
  42. package/dist/chart/extent.d.ts.map +1 -0
  43. package/dist/chart/histogram-binning.d.ts.map +1 -1
  44. package/dist/chart/index.cjs +56 -18
  45. package/dist/chart/index.mjs +56 -18
  46. package/dist/chart/render/chart-svg-cartesian.d.ts.map +1 -1
  47. package/dist/chart/render/chart-svg-legend.d.ts.map +1 -1
  48. package/dist/chart/render/chart-view-ex.d.ts.map +1 -1
  49. package/dist/chart/render/chart-view.d.ts.map +1 -1
  50. package/dist/chart/trendline-fit.d.ts.map +1 -1
  51. package/dist/{chunk-3IENHIFD.cjs → chunk-4LZIUJI3.cjs} +52 -12
  52. package/dist/{chunk-LEV2SVMK.mjs → chunk-4QPOJCJG.mjs} +45 -8
  53. package/dist/{chunk-CC5UNZOO.mjs → chunk-6IIMI5RS.mjs} +52 -12
  54. package/dist/{chunk-MN27HKHM.mjs → chunk-BA7Z6ATM.mjs} +5 -5
  55. package/dist/{chunk-LVM3IZJ2.mjs → chunk-DLFMCZZT.mjs} +1 -1
  56. package/dist/{chunk-M4XLF4R7.mjs → chunk-GBKBR4CX.mjs} +20 -8
  57. package/dist/{chunk-NXKATFM5.cjs → chunk-HL3FBJ6X.cjs} +1065 -1016
  58. package/dist/{chunk-WXY5EDGT.mjs → chunk-LF5E5ZOH.mjs} +51 -2
  59. package/dist/chunk-MHNETXQB.mjs +1 -0
  60. package/dist/{chunk-MNXKRXFB.mjs → chunk-Q5PKBQXH.mjs} +52 -3
  61. package/dist/{chunk-GQYQQ3GA.mjs → chunk-VQF6HQEE.mjs} +1 -1
  62. package/dist/collab/embedding.d.ts +108 -0
  63. package/dist/collab/embedding.d.ts.map +1 -0
  64. package/dist/collab/index.cjs +423 -293
  65. package/dist/collab/index.d.ts +2 -0
  66. package/dist/collab/index.d.ts.map +1 -1
  67. package/dist/collab/index.mjs +415 -294
  68. package/dist/collab/webrtc-provider.d.ts +21 -0
  69. package/dist/collab/webrtc-provider.d.ts.map +1 -0
  70. package/dist/color/theme-palette.d.ts +5 -1
  71. package/dist/color/theme-palette.d.ts.map +1 -1
  72. package/dist/crypto/index.cjs +27 -2
  73. package/dist/crypto/index.mjs +27 -2
  74. package/dist/diagram/index.cjs +31 -3
  75. package/dist/diagram/index.mjs +31 -3
  76. package/dist/docx/block-parser.d.ts.map +1 -1
  77. package/dist/docx/cell-blocks.d.ts +7 -1
  78. package/dist/docx/cell-blocks.d.ts.map +1 -1
  79. package/dist/docx/content-control-edit.d.ts +14 -0
  80. package/dist/docx/content-control-edit.d.ts.map +1 -1
  81. package/dist/docx/content-control-model.d.ts +8 -0
  82. package/dist/docx/content-control-model.d.ts.map +1 -1
  83. package/dist/docx/content-control-values.d.ts +20 -0
  84. package/dist/docx/content-control-values.d.ts.map +1 -0
  85. package/dist/docx/content-control.d.ts +7 -1
  86. package/dist/docx/content-control.d.ts.map +1 -1
  87. package/dist/docx/element-order.d.ts +10 -5
  88. package/dist/docx/element-order.d.ts.map +1 -1
  89. package/dist/docx/embedded.cjs +3861 -1379
  90. package/dist/docx/embedded.mjs +3861 -1379
  91. package/dist/docx/field-instruction.d.ts +22 -0
  92. package/dist/docx/field-instruction.d.ts.map +1 -0
  93. package/dist/docx/form-field-model.d.ts +48 -0
  94. package/dist/docx/form-field-model.d.ts.map +1 -0
  95. package/dist/docx/form-fields.d.ts +31 -0
  96. package/dist/docx/form-fields.d.ts.map +1 -0
  97. package/dist/docx/form-fill-fields.d.ts +61 -0
  98. package/dist/docx/form-fill-fields.d.ts.map +1 -0
  99. package/dist/docx/form-fill-labels.d.ts +8 -0
  100. package/dist/docx/form-fill-labels.d.ts.map +1 -0
  101. package/dist/docx/form-fill-sites.d.ts +59 -0
  102. package/dist/docx/form-fill-sites.d.ts.map +1 -0
  103. package/dist/docx/form-fill-values.d.ts +28 -0
  104. package/dist/docx/form-fill-values.d.ts.map +1 -0
  105. package/dist/docx/form-fill-write.d.ts +26 -0
  106. package/dist/docx/form-fill-write.d.ts.map +1 -0
  107. package/dist/docx/glossary.d.ts +15 -0
  108. package/dist/docx/glossary.d.ts.map +1 -0
  109. package/dist/docx/index.cjs +5929 -3153
  110. package/dist/docx/index.d.ts +7 -0
  111. package/dist/docx/index.d.ts.map +1 -1
  112. package/dist/docx/index.mjs +5913 -3154
  113. package/dist/docx/inline-annotations.d.ts +21 -0
  114. package/dist/docx/inline-annotations.d.ts.map +1 -0
  115. package/dist/docx/inline-container-markers.d.ts +14 -0
  116. package/dist/docx/inline-container-markers.d.ts.map +1 -0
  117. package/dist/docx/inline-containers.d.ts +54 -0
  118. package/dist/docx/inline-containers.d.ts.map +1 -0
  119. package/dist/docx/inline-form-field-bookmarks.d.ts +15 -0
  120. package/dist/docx/inline-form-field-bookmarks.d.ts.map +1 -0
  121. package/dist/docx/inline-marker-positions.d.ts +15 -0
  122. package/dist/docx/inline-marker-positions.d.ts.map +1 -0
  123. package/dist/docx/inline-markers.d.ts +63 -0
  124. package/dist/docx/inline-markers.d.ts.map +1 -0
  125. package/dist/docx/inline-slots.d.ts +24 -0
  126. package/dist/docx/inline-slots.d.ts.map +1 -0
  127. package/dist/docx/layout/adapter.d.ts.map +1 -1
  128. package/dist/docx/layout/index.cjs +1176 -563
  129. package/dist/docx/layout/index.d.ts +2 -1
  130. package/dist/docx/layout/index.d.ts.map +1 -1
  131. package/dist/docx/layout/index.mjs +1175 -564
  132. package/dist/docx/layout/input.d.ts +5 -1
  133. package/dist/docx/layout/input.d.ts.map +1 -1
  134. package/dist/docx/layout/page-style-refs.d.ts +21 -0
  135. package/dist/docx/layout/page-style-refs.d.ts.map +1 -0
  136. package/dist/docx/layout/paragraph-fragments.d.ts.map +1 -1
  137. package/dist/docx/layout/result.d.ts +1 -0
  138. package/dist/docx/layout/result.d.ts.map +1 -1
  139. package/dist/docx/layout/tab-stops.d.ts +8 -1
  140. package/dist/docx/layout/tab-stops.d.ts.map +1 -1
  141. package/dist/docx/load/index.cjs +3969 -1487
  142. package/dist/docx/load/index.mjs +3969 -1487
  143. package/dist/docx/model-run.d.ts +24 -2
  144. package/dist/docx/model-run.d.ts.map +1 -1
  145. package/dist/docx/model.d.ts +5 -0
  146. package/dist/docx/model.d.ts.map +1 -1
  147. package/dist/docx/numbering-format.d.ts.map +1 -1
  148. package/dist/docx/parse-warnings.d.ts.map +1 -1
  149. package/dist/docx/parse.d.ts.map +1 -1
  150. package/dist/docx/run-segmentation.d.ts +11 -0
  151. package/dist/docx/run-segmentation.d.ts.map +1 -0
  152. package/dist/docx/save.d.ts.map +1 -1
  153. package/dist/docx/section-model.d.ts +5 -0
  154. package/dist/docx/section-model.d.ts.map +1 -1
  155. package/dist/docx/sections.d.ts +4 -2
  156. package/dist/docx/sections.d.ts.map +1 -1
  157. package/dist/docx/settings.d.ts +9 -0
  158. package/dist/docx/settings.d.ts.map +1 -1
  159. package/dist/docx/special-characters.d.ts +34 -0
  160. package/dist/docx/special-characters.d.ts.map +1 -0
  161. package/dist/docx/style-ref-fields.d.ts +40 -0
  162. package/dist/docx/style-ref-fields.d.ts.map +1 -0
  163. package/dist/docx/style-ref.d.ts +85 -0
  164. package/dist/docx/style-ref.d.ts.map +1 -0
  165. package/dist/docx/table-model.d.ts +2 -2
  166. package/dist/docx/table-model.d.ts.map +1 -1
  167. package/dist/docx/ui/break-note-schema.d.ts.map +1 -1
  168. package/dist/docx/ui/content-control-commands.d.ts +20 -8
  169. package/dist/docx/ui/content-control-commands.d.ts.map +1 -1
  170. package/dist/docx/ui/content-control-guard.d.ts +4 -1
  171. package/dist/docx/ui/content-control-guard.d.ts.map +1 -1
  172. package/dist/docx/ui/content-control-paste.d.ts +23 -0
  173. package/dist/docx/ui/content-control-paste.d.ts.map +1 -0
  174. package/dist/docx/ui/content-control-rows.d.ts +15 -0
  175. package/dist/docx/ui/content-control-rows.d.ts.map +1 -0
  176. package/dist/docx/ui/content-control-sources.d.ts +12 -0
  177. package/dist/docx/ui/content-control-sources.d.ts.map +1 -0
  178. package/dist/docx/ui/content-control-spans.d.ts +29 -6
  179. package/dist/docx/ui/content-control-spans.d.ts.map +1 -1
  180. package/dist/docx/ui/content-control-temporary.d.ts +10 -0
  181. package/dist/docx/ui/content-control-temporary.d.ts.map +1 -0
  182. package/dist/docx/ui/form-field-commands.d.ts +41 -0
  183. package/dist/docx/ui/form-field-commands.d.ts.map +1 -0
  184. package/dist/docx/ui/form-field-guard.d.ts +24 -0
  185. package/dist/docx/ui/form-field-guard.d.ts.map +1 -0
  186. package/dist/docx/ui/form-text-blank.d.ts +18 -0
  187. package/dist/docx/ui/form-text-blank.d.ts.map +1 -0
  188. package/dist/docx/ui/index.cjs +9276 -7132
  189. package/dist/docx/ui/index.d.ts +5 -0
  190. package/dist/docx/ui/index.d.ts.map +1 -1
  191. package/dist/docx/ui/index.mjs +9259 -7137
  192. package/dist/docx/ui/positional-tab-input.d.ts +7 -0
  193. package/dist/docx/ui/positional-tab-input.d.ts.map +1 -0
  194. package/dist/docx/ui/run-compare.d.ts.map +1 -1
  195. package/dist/docx/ui/run-extra-mark.d.ts +1 -1
  196. package/dist/docx/ui/run-extra-mark.d.ts.map +1 -1
  197. package/dist/docx/ui/schema-marks.d.ts +1 -1
  198. package/dist/docx/ui/schema-marks.d.ts.map +1 -1
  199. package/dist/docx/ui/symbol-font.d.ts +4 -0
  200. package/dist/docx/ui/symbol-font.d.ts.map +1 -0
  201. package/dist/docx/ui/yjs-collaboration.d.ts +12 -1
  202. package/dist/docx/ui/yjs-collaboration.d.ts.map +1 -1
  203. package/dist/docx/write-block-placement.d.ts +7 -0
  204. package/dist/docx/write-block-placement.d.ts.map +1 -1
  205. package/dist/docx/write-content-control.d.ts +6 -0
  206. package/dist/docx/write-content-control.d.ts.map +1 -1
  207. package/dist/docx/write-header-footer.d.ts +6 -2
  208. package/dist/docx/write-header-footer.d.ts.map +1 -1
  209. package/dist/docx/write-inline.d.ts +12 -16
  210. package/dist/docx/write-inline.d.ts.map +1 -1
  211. package/dist/docx/write-paragraph.d.ts.map +1 -1
  212. package/dist/docx/write-revisions.d.ts.map +1 -1
  213. package/dist/docx/write-run.d.ts.map +1 -1
  214. package/dist/docx/write-section-properties.d.ts +5 -0
  215. package/dist/docx/write-section-properties.d.ts.map +1 -0
  216. package/dist/docx/write-sections.d.ts.map +1 -1
  217. package/dist/docx/write-table-controls.d.ts +15 -0
  218. package/dist/docx/write-table-controls.d.ts.map +1 -0
  219. package/dist/docx/write-table-properties.d.ts.map +1 -1
  220. package/dist/docx/write-table.d.ts.map +1 -1
  221. package/dist/docx/write.d.ts.map +1 -1
  222. package/dist/docx/xml.d.ts +6 -0
  223. package/dist/docx/xml.d.ts.map +1 -1
  224. package/dist/drawingml/index.cjs +31 -3
  225. package/dist/drawingml/index.mjs +31 -3
  226. package/dist/index.cjs +77 -26
  227. package/dist/index.mjs +77 -26
  228. package/dist/math/index.cjs +27 -2
  229. package/dist/math/index.mjs +27 -2
  230. package/dist/opc/index.cjs +51 -11
  231. package/dist/opc/index.mjs +51 -11
  232. package/dist/opc/zip-folders.d.ts +11 -0
  233. package/dist/opc/zip-folders.d.ts.map +1 -0
  234. package/dist/opc/zip-limits.d.ts +9 -0
  235. package/dist/opc/zip-limits.d.ts.map +1 -1
  236. package/dist/pptx/automation/index.cjs +28818 -7388
  237. package/dist/pptx/automation/index.d.ts +93 -3
  238. package/dist/pptx/automation/index.d.ts.map +1 -1
  239. package/dist/pptx/automation/index.mjs +740 -63
  240. package/dist/pptx/automation/schemas/chart-formatting-schemas.d.ts +1 -1
  241. package/dist/pptx/automation/schemas/chart-schemas.d.ts +1 -1
  242. package/dist/pptx/automation/schemas/chart-user-shape-schemas.d.ts +1 -1
  243. package/dist/pptx/automation/schemas/element-schemas.d.ts +1 -1
  244. package/dist/pptx/automation/schemas/export-schemas.d.ts +1 -1
  245. package/dist/pptx/automation/schemas/geometry-schemas.d.ts +1 -1
  246. package/dist/pptx/automation/schemas/hyperlink-schemas.d.ts +1 -1
  247. package/dist/pptx/automation/schemas/index.mjs +1 -0
  248. package/dist/pptx/automation/schemas/json-schemas.d.ts +1 -1
  249. package/dist/pptx/automation/schemas/layout-schemas.d.ts +1 -1
  250. package/dist/pptx/automation/schemas/lock-schemas.d.ts +1 -1
  251. package/dist/pptx/automation/schemas/metadata-schemas.d.ts +1 -1
  252. package/dist/pptx/automation/schemas/ole-schemas.d.ts +1 -1
  253. package/dist/pptx/automation/schemas/presentation-schemas.d.ts +1 -1
  254. package/dist/pptx/automation/schemas/section-schemas.d.ts +1 -1
  255. package/dist/pptx/automation/schemas/slide-schemas.d.ts +1 -1
  256. package/dist/pptx/automation/schemas/smartart-schemas.d.ts +1 -1
  257. package/dist/pptx/automation/schemas/table-style-schemas.d.ts +1 -1
  258. package/dist/pptx/automation/schemas/template-schemas.d.ts +1 -1
  259. package/dist/pptx/automation/schemas/theme-schemas.d.ts +1 -1
  260. package/dist/pptx/automation/schemas/validation-schemas.d.ts +1 -1
  261. package/dist/pptx/chunks/{index-CgFX0T7b.d.ts → index-CPhsd7Df.d.ts} +9 -1
  262. package/dist/pptx/chunks/{index-CgFX0T7b.d.ts.map → index-CPhsd7Df.d.ts.map} +1 -1
  263. package/dist/pptx/chunks/{index-qwVYoFn6.d.ts → index-Q5mM8kIR.d.ts} +2 -2
  264. package/dist/pptx/chunks/{index-qwVYoFn6.d.ts.map → index-Q5mM8kIR.d.ts.map} +1 -1
  265. package/dist/pptx/chunks/{schemas-CWr181Wx.d.ts → schemas-fuDGetRe.d.ts} +2 -2
  266. package/dist/pptx/chunks/{schemas-CWr181Wx.d.ts.map → schemas-fuDGetRe.d.ts.map} +1 -1
  267. package/dist/pptx/cli/index.cjs +116 -17
  268. package/dist/pptx/cli/index.mjs +5 -5
  269. package/dist/pptx/converter/index.cjs +12 -3
  270. package/dist/pptx/converter/index.d.ts +1 -1
  271. package/dist/pptx/converter/index.mjs +3 -3
  272. package/dist/pptx/editor/render/find-replace.cjs +14 -14
  273. package/dist/pptx/editor/render/find-replace.d.ts +1 -1
  274. package/dist/pptx/editor/render/find-replace.mjs +1 -1
  275. package/dist/pptx/editor/render/slide-operations.cjs +8 -8
  276. package/dist/pptx/editor/render/slide-operations.mjs +2 -2
  277. package/dist/pptx/index.cjs +116 -17
  278. package/dist/pptx/index.d.ts +2 -2
  279. package/dist/pptx/index.mjs +6 -6
  280. package/dist/pptx/signature-node/index.cjs +20 -8
  281. package/dist/pptx/signature-node/index.mjs +2 -2
  282. package/dist/teams/index.cjs +105 -70
  283. package/dist/teams/index.mjs +105 -70
  284. package/dist/text/text-diff.d.ts +15 -0
  285. package/dist/text/text-diff.d.ts.map +1 -0
  286. package/dist/visio/collab/bind.d.ts +44 -0
  287. package/dist/visio/collab/bind.d.ts.map +1 -0
  288. package/dist/visio/collab/compose.d.ts +15 -0
  289. package/dist/visio/collab/compose.d.ts.map +1 -0
  290. package/dist/visio/collab/index.cjs +1194 -0
  291. package/dist/visio/collab/index.d.ts +8 -0
  292. package/dist/visio/collab/index.d.ts.map +1 -0
  293. package/dist/visio/collab/index.mjs +1152 -0
  294. package/dist/visio/collab/keys.d.ts +22 -0
  295. package/dist/visio/collab/keys.d.ts.map +1 -0
  296. package/dist/visio/collab/order.d.ts +11 -0
  297. package/dist/visio/collab/order.d.ts.map +1 -0
  298. package/dist/visio/collab/package.d.ts +37 -0
  299. package/dist/visio/collab/package.d.ts.map +1 -0
  300. package/dist/visio/collab/read.d.ts +41 -0
  301. package/dist/visio/collab/read.d.ts.map +1 -0
  302. package/dist/visio/collab/scan.d.ts +28 -0
  303. package/dist/visio/collab/scan.d.ts.map +1 -0
  304. package/dist/visio/collab/schema.d.ts +70 -0
  305. package/dist/visio/collab/schema.d.ts.map +1 -0
  306. package/dist/visio/collab/snapshot.d.ts +61 -0
  307. package/dist/visio/collab/snapshot.d.ts.map +1 -0
  308. package/dist/visio/collab/write.d.ts +20 -0
  309. package/dist/visio/collab/write.d.ts.map +1 -0
  310. package/dist/visio/index.cjs +159 -39
  311. package/dist/visio/index.mjs +159 -39
  312. package/dist/visio/ui/collab-options.d.ts +24 -0
  313. package/dist/visio/ui/collab-options.d.ts.map +1 -0
  314. package/dist/visio/ui/collab-presence.d.ts +31 -0
  315. package/dist/visio/ui/collab-presence.d.ts.map +1 -0
  316. package/dist/visio/ui/contract.d.ts +9 -3
  317. package/dist/visio/ui/contract.d.ts.map +1 -1
  318. package/dist/visio/ui/document-history.d.ts +3 -1
  319. package/dist/visio/ui/document-history.d.ts.map +1 -1
  320. package/dist/visio/ui/index.cjs +284 -95
  321. package/dist/visio/ui/index.d.ts +2 -0
  322. package/dist/visio/ui/index.d.ts.map +1 -1
  323. package/dist/visio/ui/index.mjs +278 -95
  324. package/dist/xlsx/collab/index.cjs +8 -3
  325. package/dist/xlsx/collab/index.mjs +8 -3
  326. package/dist/xlsx/compare/cells.d.ts +22 -0
  327. package/dist/xlsx/compare/cells.d.ts.map +1 -0
  328. package/dist/xlsx/compare/compare.d.ts +12 -0
  329. package/dist/xlsx/compare/compare.d.ts.map +1 -0
  330. package/dist/xlsx/compare/conditional.d.ts +7 -0
  331. package/dist/xlsx/compare/conditional.d.ts.map +1 -0
  332. package/dist/xlsx/compare/format-key.d.ts +34 -0
  333. package/dist/xlsx/compare/format-key.d.ts.map +1 -0
  334. package/dist/xlsx/compare/group.d.ts +8 -0
  335. package/dist/xlsx/compare/group.d.ts.map +1 -0
  336. package/dist/xlsx/compare/index.d.ts +5 -0
  337. package/dist/xlsx/compare/index.d.ts.map +1 -0
  338. package/dist/xlsx/compare/rich-text.d.ts +7 -0
  339. package/dist/xlsx/compare/rich-text.d.ts.map +1 -0
  340. package/dist/xlsx/compare/sheets.d.ts +22 -0
  341. package/dist/xlsx/compare/sheets.d.ts.map +1 -0
  342. package/dist/xlsx/compare/structure.d.ts +11 -0
  343. package/dist/xlsx/compare/structure.d.ts.map +1 -0
  344. package/dist/xlsx/compare/text.d.ts +8 -0
  345. package/dist/xlsx/compare/text.d.ts.map +1 -0
  346. package/dist/xlsx/compare/types.d.ts +173 -0
  347. package/dist/xlsx/compare/types.d.ts.map +1 -0
  348. package/dist/xlsx/edit/cell-values.d.ts.map +1 -1
  349. package/dist/xlsx/edit/clipboard-html.d.ts.map +1 -1
  350. package/dist/xlsx/edit/clipboard-text.d.ts.map +1 -1
  351. package/dist/xlsx/edit/clipboard.d.ts.map +1 -1
  352. package/dist/xlsx/edit/clone-cell.d.ts +9 -0
  353. package/dist/xlsx/edit/clone-cell.d.ts.map +1 -0
  354. package/dist/xlsx/edit/history.d.ts +8 -3
  355. package/dist/xlsx/edit/history.d.ts.map +1 -1
  356. package/dist/xlsx/edit/timelines.d.ts.map +1 -1
  357. package/dist/xlsx/formula/change-areas.d.ts +9 -0
  358. package/dist/xlsx/formula/change-areas.d.ts.map +1 -0
  359. package/dist/xlsx/formula/engine-prepare.d.ts +8 -0
  360. package/dist/xlsx/formula/engine-prepare.d.ts.map +1 -1
  361. package/dist/xlsx/formula/engine.d.ts.map +1 -1
  362. package/dist/xlsx/formula/spill.d.ts +5 -1
  363. package/dist/xlsx/formula/spill.d.ts.map +1 -1
  364. package/dist/xlsx/index.cjs +2461 -1192
  365. package/dist/xlsx/index.d.ts +1 -0
  366. package/dist/xlsx/index.d.ts.map +1 -1
  367. package/dist/xlsx/index.mjs +2454 -1193
  368. package/dist/xlsx/layout/cell-view.d.ts.map +1 -1
  369. package/dist/xlsx/layout/navigate.d.ts.map +1 -1
  370. package/dist/xlsx/layout/style-view.d.ts +5 -0
  371. package/dist/xlsx/layout/style-view.d.ts.map +1 -1
  372. package/dist/xlsx/load/csv-dates.d.ts +22 -0
  373. package/dist/xlsx/load/csv-dates.d.ts.map +1 -0
  374. package/dist/xlsx/load/csv-import.d.ts +64 -0
  375. package/dist/xlsx/load/csv-import.d.ts.map +1 -0
  376. package/dist/xlsx/load/csv-separators.d.ts +13 -0
  377. package/dist/xlsx/load/csv-separators.d.ts.map +1 -0
  378. package/dist/xlsx/load/csv-traits.d.ts +20 -0
  379. package/dist/xlsx/load/csv-traits.d.ts.map +1 -0
  380. package/dist/xlsx/load/csv.d.ts +8 -4
  381. package/dist/xlsx/load/csv.d.ts.map +1 -1
  382. package/dist/xlsx/load/detect.d.ts +13 -0
  383. package/dist/xlsx/load/detect.d.ts.map +1 -1
  384. package/dist/xlsx/load/errors.d.ts +1 -0
  385. package/dist/xlsx/load/errors.d.ts.map +1 -1
  386. package/dist/xlsx/load/index.cjs +537 -91
  387. package/dist/xlsx/load/index.d.ts +3 -1
  388. package/dist/xlsx/load/index.d.ts.map +1 -1
  389. package/dist/xlsx/load/index.mjs +536 -92
  390. package/dist/xlsx/numfmt/input-date.d.ts +2 -0
  391. package/dist/xlsx/numfmt/input-date.d.ts.map +1 -1
  392. package/dist/xlsx/pivot/cache-xml.d.ts.map +1 -1
  393. package/dist/xlsx/pivot/groups.d.ts.map +1 -1
  394. package/dist/xlsx/read/index.d.ts +2 -1
  395. package/dist/xlsx/read/index.d.ts.map +1 -1
  396. package/dist/xlsx/read/limits.d.ts +50 -0
  397. package/dist/xlsx/read/limits.d.ts.map +1 -0
  398. package/dist/xlsx/read/load.d.ts +11 -1
  399. package/dist/xlsx/read/load.d.ts.map +1 -1
  400. package/dist/xlsx/read/package.d.ts +5 -23
  401. package/dist/xlsx/read/package.d.ts.map +1 -1
  402. package/dist/xlsx/read/shared-strings.d.ts +2 -2
  403. package/dist/xlsx/read/shared-strings.d.ts.map +1 -1
  404. package/dist/xlsx/read/worksheet.d.ts +2 -0
  405. package/dist/xlsx/read/worksheet.d.ts.map +1 -1
  406. package/dist/xlsx/stable-key.d.ts +3 -0
  407. package/dist/xlsx/stable-key.d.ts.map +1 -0
  408. package/dist/xlsx/styles.d.ts.map +1 -1
  409. package/dist/xlsx/ui/index.cjs +662 -372
  410. package/dist/xlsx/ui/index.mjs +662 -372
  411. package/dist/xlsx/ui/locales/de/shell.d.ts.map +1 -1
  412. package/dist/xlsx/ui/locales/en/shell.d.ts.map +1 -1
  413. package/dist/xlsx/ui/locales/es/shell.d.ts.map +1 -1
  414. package/dist/xlsx/ui/locales/fr/shell.d.ts.map +1 -1
  415. package/dist/xlsx/ui/locales/zh-CN/shell.d.ts.map +1 -1
  416. package/dist/xlsx/write/sheet-props.d.ts.map +1 -1
  417. package/dist/xml/index.cjs +32 -3
  418. package/dist/xml/index.mjs +32 -4
  419. package/dist/xml/xml.d.ts +11 -1
  420. package/dist/xml/xml.d.ts.map +1 -1
  421. package/package.json +6 -1
  422. package/dist/PptxHandler-SITN3K3F.mjs +0 -4
@@ -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) {
@@ -3821,10 +3849,13 @@ var DEFAULT_ZIP_LIMITS = {
3821
3849
  var ZipLimitError = class extends Error {
3822
3850
  code = "ZIP_BOMB";
3823
3851
  limit;
3852
+ /** The check that failed (absent when the error was built without one). */
3853
+ kind;
3824
3854
  constructor(message, details) {
3825
3855
  super(message);
3826
3856
  this.name = "ZipLimitError";
3827
3857
  this.limit = details.limit;
3858
+ this.kind = details.kind;
3828
3859
  }
3829
3860
  };
3830
3861
  var mib = (bytes) => Math.round(bytes / 1048576);
@@ -3847,7 +3878,7 @@ function resolveLimits(limits) {
3847
3878
  maxEntryBytes: limits.maxEntryBytes ?? DEFAULT_ZIP_LIMITS.maxEntryBytes,
3848
3879
  maxTotalBytes: limits.maxTotalBytes ?? DEFAULT_ZIP_LIMITS.maxTotalBytes,
3849
3880
  label: limits.label ?? "ZIP",
3850
- 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 })
3851
3882
  };
3852
3883
  }
3853
3884
  function inflateEntryGuarded(entry3, alreadyRead, limits) {
@@ -3870,13 +3901,18 @@ function inflateEntryGuarded(entry3, alreadyRead, limits) {
3870
3901
  size += chunk.byteLength;
3871
3902
  if (size > declared || size > r.maxEntryBytes)
3872
3903
  return abort(
3873
- 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
+ )
3874
3909
  );
3875
3910
  if (alreadyRead + size > r.maxTotalBytes)
3876
3911
  return abort(
3877
3912
  r.fail(
3878
3913
  `${r.label} package exceeds the ${mib(r.maxTotalBytes)} MiB uncompressed content limit`,
3879
- r.maxTotalBytes
3914
+ r.maxTotalBytes,
3915
+ "maxTotalBytes"
3880
3916
  )
3881
3917
  );
3882
3918
  chunks.push(chunk);
@@ -3909,26 +3945,29 @@ function guardZip(zip, limits = {}) {
3909
3945
  if (entries.length > r.maxEntries)
3910
3946
  throw r.fail(
3911
3947
  `${r.label} package exceeds the ${r.maxEntries.toLocaleString("en-US")} part limit`,
3912
- r.maxEntries
3948
+ r.maxEntries,
3949
+ "maxEntries"
3913
3950
  );
3914
3951
  let declared = 0;
3915
3952
  for (const entry3 of entries) {
3916
3953
  const original = entry3.unsafeOriginalName;
3917
3954
  if (!isSafePartName(entry3.name) || original !== void 0 && !isSafePartName(original))
3918
- 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");
3919
3956
  if (entry3.dir) continue;
3920
3957
  const size = declaredEntrySize(entry3);
3921
3958
  if (size > r.maxEntryBytes)
3922
3959
  throw r.fail(
3923
3960
  `${r.label} part ${entry3.name} exceeds the uncompressed part size limit`,
3924
- r.maxEntryBytes
3961
+ r.maxEntryBytes,
3962
+ "maxEntryBytes"
3925
3963
  );
3926
3964
  declared += size;
3927
3965
  }
3928
3966
  if (declared > r.maxTotalBytes)
3929
3967
  throw r.fail(
3930
3968
  `${r.label} package exceeds the ${mib(r.maxTotalBytes)} MiB uncompressed content limit`,
3931
- r.maxTotalBytes
3969
+ r.maxTotalBytes,
3970
+ "maxTotalBytes"
3932
3971
  );
3933
3972
  const produced = /* @__PURE__ */ new Map();
3934
3973
  let total2 = 0;
@@ -5618,6 +5657,9 @@ function formatValue(value2, format, options = {}) {
5618
5657
  if (options.width !== void 0) return fitNumber(value2, format, options);
5619
5658
  return formatNumber(value2, format, options.date1904 ?? false);
5620
5659
  }
5660
+ function isDateFormat(format) {
5661
+ return compileFormat(format).isDate;
5662
+ }
5621
5663
 
5622
5664
  // xlsx/numfmt/input-date.ts
5623
5665
  var MONTH_NAMES = [
@@ -5840,9 +5882,9 @@ function parseCellInput(text2, options = {}) {
5840
5882
  return parsed.numFmt ? { value: parsed.value, numFmt: parsed.numFmt } : { value: parsed.value };
5841
5883
  }
5842
5884
 
5843
- // xlsx/styles.ts
5844
- function styleKey(style2) {
5845
- return JSON.stringify(sortKeys(style2));
5885
+ // xlsx/stable-key.ts
5886
+ function stableKey(value2) {
5887
+ return JSON.stringify(sortKeys(value2));
5846
5888
  }
5847
5889
  function sortKeys(value2) {
5848
5890
  if (Array.isArray(value2)) return value2.map(sortKeys);
@@ -5856,6 +5898,11 @@ function sortKeys(value2) {
5856
5898
  }
5857
5899
  return value2;
5858
5900
  }
5901
+
5902
+ // xlsx/styles.ts
5903
+ function styleKey(style2) {
5904
+ return stableKey(style2);
5905
+ }
5859
5906
  function styleAt(workbook, styleId) {
5860
5907
  const style2 = workbook.styles[styleId ?? 0] ?? workbook.styles[0];
5861
5908
  if (!style2) throw new Error("Workbook has no default cell style");
@@ -9308,10 +9355,72 @@ function mergeComments(legacy, threaded) {
9308
9355
  (a2, b) => a2.address.row - b.address.row || a2.address.col - b.address.col
9309
9356
  );
9310
9357
  }
9311
- var MAX_INPUT_BYTES = 50 * 1024 * 1024;
9312
- var MAX_PARTS = 1e4;
9313
- var MAX_UNCOMPRESSED_BYTES = 300 * 1024 * 1024;
9314
- 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
+ }
9315
9424
  var CONTENT_TYPES = {
9316
9425
  workbook: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
9317
9426
  workbookMacro: "application/vnd.ms-excel.sheet.macroEnabled.main+xml",
@@ -9401,16 +9510,15 @@ var SourceIndex = class {
9401
9510
  };
9402
9511
  var mib2 = (bytes) => Math.round(bytes / 1048576);
9403
9512
  async function readZipParts(input, limits = {}) {
9404
- const maxInput = limits.maxInputBytes ?? MAX_INPUT_BYTES;
9405
- const zipLimits = {
9406
- maxEntries: limits.maxParts ?? MAX_PARTS,
9407
- maxEntryBytes: limits.maxPartBytes ?? MAX_PART_BYTES,
9408
- maxTotalBytes: limits.maxTotalBytes ?? MAX_UNCOMPRESSED_BYTES,
9409
- label: "XLSX"
9410
- };
9513
+ const resolved = resolveLoadLimits(limits);
9514
+ const maxInput = resolved.maxInputBytes;
9411
9515
  const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);
9412
9516
  if (bytes.byteLength > maxInput)
9413
- 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
+ );
9414
9522
  let loaded;
9415
9523
  try {
9416
9524
  loaded = await JSZip2.loadAsync(bytes);
@@ -9420,7 +9528,7 @@ async function readZipParts(input, limits = {}) {
9420
9528
  { cause: error }
9421
9529
  );
9422
9530
  }
9423
- const zip = guardZip(loaded, zipLimits);
9531
+ const zip = guardZip(loaded, zipLimitsFor(resolved));
9424
9532
  const parts = /* @__PURE__ */ new Map();
9425
9533
  for (const entry3 of Object.values(zip.files)) {
9426
9534
  if (entry3.dir) continue;
@@ -9627,9 +9735,9 @@ function parseRichString(element2, palette) {
9627
9735
  const text2 = parsed.map((run2) => run2.text).join("");
9628
9736
  return { text: text2, runs: parsed };
9629
9737
  }
9630
- function parseSharedStrings(xml, palette) {
9738
+ function parseSharedStrings(xml, palette, maxXmlElements) {
9631
9739
  if (!xml) return [];
9632
- const root = parseXml(xml, { label: "XLSX shared strings" }).documentElement;
9740
+ const root = parseDataXml(xml, "XLSX shared strings", maxXmlElements).documentElement;
9633
9741
  return xChildren(root, "si").map((si) => parseRichString(si, palette));
9634
9742
  }
9635
9743
 
@@ -14269,7 +14377,11 @@ function parseWorksheet(ctx, partName, name, sheetId) {
14269
14377
  return sheet;
14270
14378
  }
14271
14379
  const split = splitSheetData(xml);
14272
- 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;
14273
14385
  const byName = /* @__PURE__ */ new Map();
14274
14386
  const cfBlocks = [];
14275
14387
  for (const node2 of elements(root)) {
@@ -14343,8 +14455,9 @@ function liftPrintAreas(workbook) {
14343
14455
  return false;
14344
14456
  });
14345
14457
  }
14346
- async function loadXlsx(input) {
14347
- const parts = await readZipParts(input);
14458
+ async function loadXlsx(input, options = {}) {
14459
+ const limits = resolveLoadLimits(options.limits);
14460
+ const parts = await readZipParts(input, limits);
14348
14461
  const source2 = new SourceIndex(parts);
14349
14462
  const workbookPart = source2.workbookPart();
14350
14463
  if (!workbookPart) throw new Error("XLSX package has no workbook part (xl/workbook.xml)");
@@ -14365,7 +14478,8 @@ async function loadXlsx(input) {
14365
14478
  source: source2,
14366
14479
  sharedStrings: parseSharedStrings(
14367
14480
  stringsPart ? source2.text(stringsPart) : void 0,
14368
- styles.palette
14481
+ styles.palette,
14482
+ limits.maxXmlElements
14369
14483
  ),
14370
14484
  xfMap: styles.xfMap,
14371
14485
  date1904: book.date1904,
@@ -14373,7 +14487,8 @@ async function loadXlsx(input) {
14373
14487
  dxfs: styles.dxfs,
14374
14488
  persons: parsePersons(personsPart ? source2.text(personsPart) : void 0),
14375
14489
  dynamicCells: parseDynamicArrayMetadata(metadataPart ? source2.text(metadataPart) : void 0),
14376
- warn
14490
+ warn,
14491
+ maxXmlElements: limits.maxXmlElements
14377
14492
  };
14378
14493
  const rels = source2.rels(workbookPart);
14379
14494
  const sheets = book.sheets.map((entry3) => {
@@ -16590,6 +16705,52 @@ function finite(value2) {
16590
16705
  return value2;
16591
16706
  }
16592
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
+
16593
16754
  // xlsx/formula/functions/wildcard.ts
16594
16755
  var lower = (ch) => (ch ?? "").toLowerCase();
16595
16756
  var fold = (text2) => Array.from({ length: text2.length }, (_, i2) => lower(text2[i2]));
@@ -19874,49 +20035,6 @@ var INFO_FUNCTIONS = [
19874
20035
  )
19875
20036
  ];
19876
20037
 
19877
- // xlsx/formula/operators.ts
19878
- function power(base, exponent) {
19879
- if (base === 0 && exponent === 0) throw new ErrorSignal(ERR.NUM);
19880
- if (base === 0 && exponent < 0) throw new ErrorSignal(ERR.DIV0);
19881
- if (base < 0 && !Number.isInteger(exponent)) {
19882
- const inverse = 1 / exponent;
19883
- const odd = Math.round(inverse);
19884
- if (Math.abs(inverse - odd) < 1e-10 && Math.abs(odd) % 2 === 1) {
19885
- return -Math.pow(-base, exponent);
19886
- }
19887
- throw new ErrorSignal(ERR.NUM);
19888
- }
19889
- return Math.pow(base, exponent);
19890
- }
19891
- function pick(m, row2, col) {
19892
- const r = m.rows === 1 ? 0 : row2;
19893
- const c2 = m.cols === 1 ? 0 : col;
19894
- if (r >= m.rows || c2 >= m.cols) return ERR.NA;
19895
- return m.get(r, c2);
19896
- }
19897
- function broadcastShape(operands, at) {
19898
- let rows = 1;
19899
- let cols = 1;
19900
- for (const m of operands) {
19901
- rows = Math.max(rows, m.rows);
19902
- cols = Math.max(cols, m.cols);
19903
- }
19904
- if (!operands.some((m) => m.isPadded)) return Matrix.build(rows, cols, at);
19905
- let blockRows = 1;
19906
- let blockCols = 1;
19907
- for (const m of operands) {
19908
- blockRows = Math.max(blockRows, m.isPadded ? m.blockRows : m.rows);
19909
- blockCols = Math.max(blockCols, m.isPadded ? m.blockCols : m.cols);
19910
- }
19911
- blockRows = Math.min(blockRows, rows);
19912
- blockCols = Math.min(blockCols, cols);
19913
- const varies = operands.some(
19914
- (m) => blockRows < rows && m.rows === 1 && m.cols > 1 || blockCols < cols && m.cols === 1 && m.rows > 1
19915
- );
19916
- if (varies) return Matrix.build(rows, cols, at);
19917
- return Matrix.padded(Matrix.build(blockRows, blockCols, at), rows, cols, at(rows - 1, cols - 1));
19918
- }
19919
-
19920
20038
  // xlsx/formula/functions/lambda.ts
19921
20039
  var C17 = "Logical";
19922
20040
  function lambdaArg(value2) {
@@ -25176,9 +25294,6 @@ var paramKind = (spec2, index3) => {
25176
25294
  return params[Math.min(index3, params.length - 1)] ?? "value";
25177
25295
  };
25178
25296
 
25179
- // xlsx/formula/spill.ts
25180
- var isSpilledCell = (cell) => cell !== void 0 && "spillAnchor" in cell;
25181
-
25182
25297
  // xlsx/formula/move.ts
25183
25298
  var same3 = (a2, b) => a2.toLowerCase() === b.toLowerCase();
25184
25299
  function deleteSheetInFormula(formula, sheetName, tableNames = []) {
@@ -27207,10 +27322,8 @@ function sheetFormatXml(sheet) {
27207
27322
  const current = { defaultRowHeight: sheet.defaultRowHeight };
27208
27323
  if (sheet.defaultColWidth !== void 0) current.defaultColWidth = sheet.defaultColWidth;
27209
27324
  if (sheet.format && Object.keys(sheet.format).length) current.format = sheet.format;
27210
- const rowLevel = Math.max(
27211
- 0,
27212
- ...[...sheet.rowInfo.values()].map((info) => info.outlineLevel ?? 0)
27213
- );
27325
+ let rowLevel = 0;
27326
+ for (const info of sheet.rowInfo.values()) rowLevel = Math.max(rowLevel, info.outlineLevel ?? 0);
27214
27327
  const colLevel = Math.max(0, ...sheet.columns.map((col) => col.outlineLevel ?? 0));
27215
27328
  if (source2 && sameModel(readSheetFormat(source2), current) && Number(source2.getAttribute("outlineLevelRow") ?? 0) === rowLevel && Number(source2.getAttribute("outlineLevelCol") ?? 0) === colLevel)
27216
27329
  return snapshotXml(sheet, "sheetFormatPr") ?? "";
@@ -27512,11 +27625,10 @@ function pivotCacheDefinitionXml(pivot, workbook, data, recordRel) {
27512
27625
  const items = data.items[index3];
27513
27626
  if (pivot.dateFields?.includes(name) && items.every((v) => typeof v === "number")) {
27514
27627
  const serials = items;
27515
- const latest = Math.max(...serials);
27516
- const maxDate = Number.isInteger(latest) ? latest + 1 : latest;
27628
+ const range = dateGroupRange({}, serials);
27517
27629
  const parent = derived.filter((entry3) => entry3.group.field === name).at(-1);
27518
27630
  const link = parent ? `<fieldGroup par="${parent.index}"/>` : "";
27519
- 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>`;
27520
27632
  }
27521
27633
  const types = new Set(
27522
27634
  items.map((value2) => value2 === null || value2 === "" ? "blank" : typeof value2)
@@ -28387,6 +28499,332 @@ async function saveXlsx(workbook) {
28387
28499
  return writer.build();
28388
28500
  }
28389
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
+
28390
28828
  // xlsx/load/csv.ts
28391
28829
  var CANDIDATES = [",", ";", " "];
28392
28830
  function delimiterCounts(text2, maxLines = 20) {
@@ -28483,6 +28921,7 @@ function csvToWorkbook(text2, options = {}) {
28483
28921
  workbook.format = "csv";
28484
28922
  const sheet = workbook.sheets[0];
28485
28923
  if (!sheet) return workbook;
28924
+ const reader = createFieldReader(options, workbook.date1904);
28486
28925
  const base = styleAt(workbook, 0);
28487
28926
  const formats = /* @__PURE__ */ new Map();
28488
28927
  const rows = parseCsv(
@@ -28490,9 +28929,11 @@ function csvToWorkbook(text2, options = {}) {
28490
28929
  options.delimiter === void 0 ? {} : { delimiter: options.delimiter }
28491
28930
  );
28492
28931
  rows.forEach((fields, row2) => {
28493
- fields.forEach((field, col) => {
28932
+ fields.forEach((field, source2) => {
28494
28933
  if (field === "") return;
28495
- 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);
28496
28937
  const cell = { value: parsed.value };
28497
28938
  if (parsed.formula !== void 0) cell.formula = parsed.formula;
28498
28939
  if (parsed.numFmt && parsed.numFmt !== "General") {
@@ -28511,6 +28952,7 @@ function csvToWorkbook(text2, options = {}) {
28511
28952
  cells.set(col, cell);
28512
28953
  });
28513
28954
  });
28955
+ workbook.warnings.push(...reader.warnings());
28514
28956
  return workbook;
28515
28957
  }
28516
28958
  var FORMULA_TRIGGER = /^[=+\-@\t\r]/;
@@ -29761,7 +30203,7 @@ var RT = {
29761
30203
  OBPROJ: 211,
29762
30204
  SXSTREAMID: 213};
29763
30205
  var STATES = ["visible", "hidden", "veryHidden"];
29764
- var KINDS2 = {
30206
+ var KINDS3 = {
29765
30207
  0: "worksheet",
29766
30208
  1: "macro",
29767
30209
  2: "chart",
@@ -29896,7 +30338,7 @@ function parseGlobals(records) {
29896
30338
  case RT.BOUNDSHEET: {
29897
30339
  const offset2 = r.u32();
29898
30340
  const state = STATES[r.u8() & 3] ?? "visible";
29899
- const kind = KINDS2[r.u8()] ?? "unknown";
30341
+ const kind = KINDS3[r.u8()] ?? "unknown";
29900
30342
  out.sheets.push({ offset: offset2, state, kind, name: r.shortXlString() });
29901
30343
  break;
29902
30344
  }
@@ -31199,6 +31641,7 @@ async function decryptWorkbook(bytes, password) {
31199
31641
  return plain3;
31200
31642
  }
31201
31643
  async function loadWorkbook(input, options = {}) {
31644
+ const limits = options.limits && resolveLoadLimits(options.limits);
31202
31645
  let bytes = toBytes3(input);
31203
31646
  let format = detectWorkbookFormat(bytes, options.fileName);
31204
31647
  const encrypted = format === "encrypted";
@@ -31210,12 +31653,13 @@ async function loadWorkbook(input, options = {}) {
31210
31653
  if (format === "xls") return loadLegacyXls(bytes);
31211
31654
  if (format === "csv") {
31212
31655
  return csvToWorkbook(decodeText(bytes), {
31656
+ ...options.csv,
31213
31657
  sheetName: sheetNameFromFileName(options.fileName),
31214
31658
  ...options.delimiter === void 0 ? {} : { delimiter: options.delimiter },
31215
31659
  ...options.formulas === void 0 ? {} : { formulas: options.formulas }
31216
31660
  });
31217
31661
  }
31218
- const workbook = await loadXlsx(bytes);
31662
+ const workbook = await loadXlsx(bytes, limits ? { limits } : {});
31219
31663
  if (format === "xlsm" && workbook.format === "xlsx") workbook.format = "xlsm";
31220
31664
  if (encrypted) workbook.warnings.push(ENCRYPTED_WARNING);
31221
31665
  return workbook;
@@ -31234,4 +31678,4 @@ async function saveWorkbook(workbook, format, sheetIndexOrOptions) {
31234
31678
  return new TextEncoder().encode(`\uFEFF${csv}`);
31235
31679
  }
31236
31680
 
31237
- 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 };