@cj-tech-master/excelts 1.6.3 → 2.0.0-canary.20251228013952.4f2c3c6

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 (400) hide show
  1. package/README.md +139 -24
  2. package/README_zh.md +140 -26
  3. package/dist/browser/excelts.esm.js +18468 -0
  4. package/dist/browser/excelts.esm.js.map +1 -0
  5. package/dist/browser/excelts.esm.min.js +125 -0
  6. package/dist/browser/excelts.iife.js +13107 -47146
  7. package/dist/browser/excelts.iife.js.map +1 -1
  8. package/dist/browser/excelts.iife.min.js +24 -106
  9. package/dist/cjs/csv/csv-core.js +701 -0
  10. package/dist/cjs/csv/csv-stream.js +646 -0
  11. package/dist/cjs/csv/csv.base.js +137 -0
  12. package/dist/cjs/csv/csv.browser.js +68 -0
  13. package/dist/cjs/csv/csv.js +218 -162
  14. package/dist/cjs/doc/anchor.js +2 -2
  15. package/dist/cjs/doc/cell.js +22 -22
  16. package/dist/cjs/doc/column.js +28 -7
  17. package/dist/cjs/doc/data-validations.js +3 -3
  18. package/dist/cjs/doc/defined-names.js +13 -13
  19. package/dist/cjs/doc/image.js +7 -7
  20. package/dist/cjs/doc/modelcontainer.js +2 -2
  21. package/dist/cjs/doc/note.js +2 -2
  22. package/dist/cjs/doc/pivot-table.js +5 -5
  23. package/dist/cjs/doc/range.js +11 -11
  24. package/dist/cjs/doc/row.js +16 -16
  25. package/dist/cjs/doc/table.js +5 -5
  26. package/dist/cjs/doc/workbook.base.js +211 -0
  27. package/dist/cjs/doc/workbook.browser.js +62 -0
  28. package/dist/cjs/doc/workbook.js +68 -179
  29. package/dist/cjs/doc/worksheet.js +45 -41
  30. package/dist/cjs/index.js +49 -32
  31. package/dist/cjs/stream/xlsx/hyperlink-reader.js +6 -6
  32. package/dist/cjs/stream/xlsx/sheet-comments-writer.js +12 -12
  33. package/dist/cjs/stream/xlsx/sheet-rels-writer.js +4 -4
  34. package/dist/cjs/stream/xlsx/workbook-reader.js +22 -22
  35. package/dist/cjs/stream/xlsx/workbook-writer.js +38 -38
  36. package/dist/cjs/stream/xlsx/worksheet-reader.js +17 -17
  37. package/dist/cjs/stream/xlsx/worksheet-writer.js +67 -60
  38. package/dist/cjs/utils/browser-buffer.js +75 -0
  39. package/dist/cjs/utils/cell-format.js +2 -2
  40. package/dist/cjs/utils/cell-matrix.js +5 -5
  41. package/dist/cjs/utils/datetime.js +499 -0
  42. package/dist/cjs/utils/encryptor.browser.js +240 -0
  43. package/dist/cjs/utils/parse-sax.js +1191 -13
  44. package/dist/cjs/utils/shared-formula.js +5 -5
  45. package/dist/cjs/utils/sheet-utils.js +13 -13
  46. package/dist/cjs/utils/stream-buf.browser.js +355 -0
  47. package/dist/cjs/utils/stream-buf.js +5 -5
  48. package/dist/cjs/utils/unzip/extract.js +11 -11
  49. package/dist/cjs/utils/unzip/index.js +21 -21
  50. package/dist/cjs/utils/unzip/parse-extra-field.js +3 -3
  51. package/dist/cjs/utils/unzip/parse.js +16 -16
  52. package/dist/cjs/utils/unzip/zip-parser.js +14 -3
  53. package/dist/cjs/utils/utils.base.js +161 -0
  54. package/dist/cjs/utils/utils.browser.js +89 -0
  55. package/dist/cjs/utils/utils.js +46 -154
  56. package/dist/cjs/utils/xml-stream.js +3 -3
  57. package/dist/cjs/utils/zip/compress.base.js +88 -0
  58. package/dist/cjs/utils/zip/compress.browser.js +127 -0
  59. package/dist/cjs/utils/zip/compress.js +18 -198
  60. package/dist/cjs/utils/zip/crc32.browser.js +88 -0
  61. package/dist/cjs/utils/zip/deflate-fallback.js +575 -0
  62. package/dist/cjs/utils/zip/index.js +17 -17
  63. package/dist/cjs/utils/zip/streaming-zip.js +264 -0
  64. package/dist/cjs/utils/zip/zip-builder.js +10 -10
  65. package/dist/cjs/utils/zip-stream.browser.js +135 -0
  66. package/dist/cjs/utils/zip-stream.js +4 -4
  67. package/dist/cjs/xlsx/xform/base-xform.js +4 -4
  68. package/dist/cjs/xlsx/xform/book/defined-name-xform.js +4 -4
  69. package/dist/cjs/xlsx/xform/book/sheet-xform.js +4 -4
  70. package/dist/cjs/xlsx/xform/book/workbook-calc-properties-xform.js +2 -2
  71. package/dist/cjs/xlsx/xform/book/workbook-pivot-cache-xform.js +2 -2
  72. package/dist/cjs/xlsx/xform/book/workbook-properties-xform.js +2 -2
  73. package/dist/cjs/xlsx/xform/book/workbook-view-xform.js +2 -2
  74. package/dist/cjs/xlsx/xform/book/workbook-xform.js +24 -24
  75. package/dist/cjs/xlsx/xform/comment/comment-xform.js +4 -4
  76. package/dist/cjs/xlsx/xform/comment/comments-xform.js +6 -6
  77. package/dist/cjs/xlsx/xform/comment/style/vml-position-xform.js +2 -2
  78. package/dist/cjs/xlsx/xform/comment/style/vml-protection-xform.js +2 -2
  79. package/dist/cjs/xlsx/xform/comment/vml-anchor-xform.js +2 -2
  80. package/dist/cjs/xlsx/xform/comment/vml-client-data-xform.js +10 -10
  81. package/dist/cjs/xlsx/xform/comment/vml-notes-xform.js +6 -6
  82. package/dist/cjs/xlsx/xform/comment/vml-shape-xform.js +6 -6
  83. package/dist/cjs/xlsx/xform/comment/vml-textbox-xform.js +2 -2
  84. package/dist/cjs/xlsx/xform/composite-xform.js +2 -2
  85. package/dist/cjs/xlsx/xform/core/app-heading-pairs-xform.js +2 -2
  86. package/dist/cjs/xlsx/xform/core/app-titles-of-parts-xform.js +2 -2
  87. package/dist/cjs/xlsx/xform/core/app-xform.js +11 -11
  88. package/dist/cjs/xlsx/xform/core/content-types-xform.js +4 -4
  89. package/dist/cjs/xlsx/xform/core/core-xform.js +23 -23
  90. package/dist/cjs/xlsx/xform/core/relationship-xform.js +2 -2
  91. package/dist/cjs/xlsx/xform/core/relationships-xform.js +6 -6
  92. package/dist/cjs/xlsx/xform/drawing/base-cell-anchor-xform.js +2 -2
  93. package/dist/cjs/xlsx/xform/drawing/blip-fill-xform.js +4 -4
  94. package/dist/cjs/xlsx/xform/drawing/blip-xform.js +2 -2
  95. package/dist/cjs/xlsx/xform/drawing/c-nv-pic-pr-xform.js +2 -2
  96. package/dist/cjs/xlsx/xform/drawing/c-nv-pr-xform.js +6 -6
  97. package/dist/cjs/xlsx/xform/drawing/cell-position-xform.js +7 -7
  98. package/dist/cjs/xlsx/xform/drawing/drawing-xform.js +10 -10
  99. package/dist/cjs/xlsx/xform/drawing/ext-lst-xform.js +2 -2
  100. package/dist/cjs/xlsx/xform/drawing/ext-xform.js +2 -2
  101. package/dist/cjs/xlsx/xform/drawing/hlink-click-xform.js +2 -2
  102. package/dist/cjs/xlsx/xform/drawing/nv-pic-pr-xform.js +6 -6
  103. package/dist/cjs/xlsx/xform/drawing/one-cell-anchor-xform.js +10 -10
  104. package/dist/cjs/xlsx/xform/drawing/pic-xform.js +9 -9
  105. package/dist/cjs/xlsx/xform/drawing/two-cell-anchor-xform.js +9 -9
  106. package/dist/cjs/xlsx/xform/list-xform.js +2 -2
  107. package/dist/cjs/xlsx/xform/pivot-table/cache-field-xform.js +5 -5
  108. package/dist/cjs/xlsx/xform/pivot-table/cache-field.js +3 -3
  109. package/dist/cjs/xlsx/xform/pivot-table/pivot-cache-definition-xform.js +10 -10
  110. package/dist/cjs/xlsx/xform/pivot-table/pivot-cache-records-xform.js +9 -9
  111. package/dist/cjs/xlsx/xform/pivot-table/pivot-table-xform.js +10 -11
  112. package/dist/cjs/xlsx/xform/sheet/auto-filter-xform.js +4 -4
  113. package/dist/cjs/xlsx/xform/sheet/cell-xform.js +65 -65
  114. package/dist/cjs/xlsx/xform/sheet/cf/cf-rule-xform.js +27 -27
  115. package/dist/cjs/xlsx/xform/sheet/cf/cfvo-xform.js +3 -3
  116. package/dist/cjs/xlsx/xform/sheet/cf/color-scale-xform.js +6 -6
  117. package/dist/cjs/xlsx/xform/sheet/cf/conditional-formatting-xform.js +6 -6
  118. package/dist/cjs/xlsx/xform/sheet/cf/conditional-formattings-xform.js +4 -4
  119. package/dist/cjs/xlsx/xform/sheet/cf/databar-xform.js +6 -6
  120. package/dist/cjs/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +5 -5
  121. package/dist/cjs/xlsx/xform/sheet/cf/formula-xform.js +2 -2
  122. package/dist/cjs/xlsx/xform/sheet/cf/icon-set-xform.js +11 -11
  123. package/dist/cjs/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +3 -3
  124. package/dist/cjs/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +11 -12
  125. package/dist/cjs/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +4 -4
  126. package/dist/cjs/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +8 -8
  127. package/dist/cjs/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +6 -6
  128. package/dist/cjs/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +26 -26
  129. package/dist/cjs/xlsx/xform/sheet/cf-ext/f-ext-xform.js +2 -2
  130. package/dist/cjs/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +14 -14
  131. package/dist/cjs/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +2 -2
  132. package/dist/cjs/xlsx/xform/sheet/col-breaks-xform.js +38 -0
  133. package/dist/cjs/xlsx/xform/sheet/col-xform.js +6 -6
  134. package/dist/cjs/xlsx/xform/sheet/data-validations-xform.js +18 -18
  135. package/dist/cjs/xlsx/xform/sheet/dimension-xform.js +2 -2
  136. package/dist/cjs/xlsx/xform/sheet/drawing-xform.js +2 -2
  137. package/dist/cjs/xlsx/xform/sheet/ext-lst-xform.js +5 -5
  138. package/dist/cjs/xlsx/xform/sheet/header-footer-xform.js +2 -2
  139. package/dist/cjs/xlsx/xform/sheet/hyperlink-xform.js +2 -2
  140. package/dist/cjs/xlsx/xform/sheet/merge-cell-xform.js +2 -2
  141. package/dist/cjs/xlsx/xform/sheet/merges.js +8 -8
  142. package/dist/cjs/xlsx/xform/sheet/outline-properties-xform.js +2 -2
  143. package/dist/cjs/xlsx/xform/sheet/page-breaks-xform.js +15 -3
  144. package/dist/cjs/xlsx/xform/sheet/page-margins-xform.js +2 -2
  145. package/dist/cjs/xlsx/xform/sheet/page-setup-properties-xform.js +2 -2
  146. package/dist/cjs/xlsx/xform/sheet/page-setup-xform.js +2 -2
  147. package/dist/cjs/xlsx/xform/sheet/picture-xform.js +2 -2
  148. package/dist/cjs/xlsx/xform/sheet/print-options-xform.js +2 -2
  149. package/dist/cjs/xlsx/xform/sheet/row-breaks-xform.js +15 -17
  150. package/dist/cjs/xlsx/xform/sheet/row-xform.js +11 -11
  151. package/dist/cjs/xlsx/xform/sheet/sheet-format-properties-xform.js +2 -2
  152. package/dist/cjs/xlsx/xform/sheet/sheet-properties-xform.js +8 -8
  153. package/dist/cjs/xlsx/xform/sheet/sheet-protection-xform.js +2 -2
  154. package/dist/cjs/xlsx/xform/sheet/sheet-view-xform.js +4 -4
  155. package/dist/cjs/xlsx/xform/sheet/table-part-xform.js +2 -2
  156. package/dist/cjs/xlsx/xform/sheet/worksheet-xform.js +75 -70
  157. package/dist/cjs/xlsx/xform/simple/boolean-xform.js +2 -2
  158. package/dist/cjs/xlsx/xform/simple/date-xform.js +2 -2
  159. package/dist/cjs/xlsx/xform/simple/float-xform.js +2 -2
  160. package/dist/cjs/xlsx/xform/simple/integer-xform.js +2 -2
  161. package/dist/cjs/xlsx/xform/simple/string-xform.js +2 -2
  162. package/dist/cjs/xlsx/xform/static-xform.js +4 -4
  163. package/dist/cjs/xlsx/xform/strings/phonetic-text-xform.js +6 -6
  164. package/dist/cjs/xlsx/xform/strings/rich-text-xform.js +6 -6
  165. package/dist/cjs/xlsx/xform/strings/shared-string-xform.js +8 -8
  166. package/dist/cjs/xlsx/xform/strings/shared-strings-xform.js +6 -6
  167. package/dist/cjs/xlsx/xform/strings/text-xform.js +2 -2
  168. package/dist/cjs/xlsx/xform/style/alignment-xform.js +8 -8
  169. package/dist/cjs/xlsx/xform/style/border-xform.js +8 -8
  170. package/dist/cjs/xlsx/xform/style/color-xform.js +2 -2
  171. package/dist/cjs/xlsx/xform/style/dxf-xform.js +14 -14
  172. package/dist/cjs/xlsx/xform/style/fill-xform.js +9 -9
  173. package/dist/cjs/xlsx/xform/style/font-xform.js +22 -22
  174. package/dist/cjs/xlsx/xform/style/numfmt-xform.js +5 -5
  175. package/dist/cjs/xlsx/xform/style/protection-xform.js +2 -2
  176. package/dist/cjs/xlsx/xform/style/style-xform.js +6 -6
  177. package/dist/cjs/xlsx/xform/style/styles-xform.js +39 -39
  178. package/dist/cjs/xlsx/xform/style/underline-xform.js +2 -2
  179. package/dist/cjs/xlsx/xform/table/auto-filter-xform.js +4 -4
  180. package/dist/cjs/xlsx/xform/table/custom-filter-xform.js +2 -2
  181. package/dist/cjs/xlsx/xform/table/filter-column-xform.js +9 -9
  182. package/dist/cjs/xlsx/xform/table/filter-xform.js +2 -2
  183. package/dist/cjs/xlsx/xform/table/table-column-xform.js +2 -2
  184. package/dist/cjs/xlsx/xform/table/table-style-info-xform.js +2 -2
  185. package/dist/cjs/xlsx/xform/table/table-xform.js +12 -12
  186. package/dist/cjs/xlsx/xlsx.base.js +742 -0
  187. package/dist/cjs/xlsx/xlsx.browser.js +162 -0
  188. package/dist/cjs/xlsx/xlsx.js +118 -892
  189. package/dist/esm/csv/csv-core.js +694 -0
  190. package/dist/esm/csv/csv-stream.js +638 -0
  191. package/dist/esm/csv/csv.base.js +127 -0
  192. package/dist/esm/csv/csv.browser.js +65 -0
  193. package/dist/esm/csv/csv.js +181 -159
  194. package/dist/esm/doc/column.js +21 -0
  195. package/dist/esm/doc/workbook.base.js +207 -0
  196. package/dist/esm/doc/workbook.browser.js +59 -0
  197. package/dist/esm/doc/workbook.js +64 -175
  198. package/dist/esm/doc/worksheet.js +4 -0
  199. package/dist/esm/index.browser.js +33 -1
  200. package/dist/esm/index.js +23 -8
  201. package/dist/esm/local.js +0 -1
  202. package/dist/esm/stream/xlsx/workbook-writer.js +1 -1
  203. package/dist/esm/stream/xlsx/worksheet-writer.js +8 -1
  204. package/dist/esm/utils/browser-buffer.js +67 -0
  205. package/dist/esm/utils/datetime.js +493 -0
  206. package/dist/esm/utils/encryptor.browser.js +237 -0
  207. package/dist/esm/utils/parse-sax.js +1188 -12
  208. package/dist/esm/utils/stream-buf.browser.js +352 -0
  209. package/dist/esm/utils/unzip/zip-parser.js +11 -0
  210. package/dist/esm/utils/utils.base.js +142 -0
  211. package/dist/esm/utils/utils.browser.js +68 -0
  212. package/dist/esm/utils/utils.js +15 -123
  213. package/dist/esm/utils/zip/compress.base.js +83 -0
  214. package/dist/esm/utils/zip/compress.browser.js +121 -0
  215. package/dist/esm/utils/zip/compress.js +16 -164
  216. package/dist/esm/utils/zip/crc32.browser.js +82 -0
  217. package/dist/esm/utils/zip/deflate-fallback.js +570 -0
  218. package/dist/esm/utils/zip/streaming-zip.js +259 -0
  219. package/dist/esm/utils/zip-stream.browser.js +132 -0
  220. package/dist/esm/xlsx/xform/pivot-table/pivot-table-xform.js +2 -3
  221. package/dist/esm/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +2 -3
  222. package/dist/esm/xlsx/xform/sheet/col-breaks-xform.js +35 -0
  223. package/dist/esm/xlsx/xform/sheet/page-breaks-xform.js +13 -1
  224. package/dist/esm/xlsx/xform/sheet/row-breaks-xform.js +11 -13
  225. package/dist/esm/xlsx/xform/sheet/worksheet-xform.js +7 -2
  226. package/dist/esm/xlsx/xlsx.base.js +739 -0
  227. package/dist/esm/xlsx/xlsx.browser.js +159 -0
  228. package/dist/esm/xlsx/xlsx.js +114 -888
  229. package/dist/types/csv/csv-core.d.ts +207 -0
  230. package/dist/types/csv/csv-stream.d.ts +114 -0
  231. package/dist/types/csv/csv.base.d.ts +62 -0
  232. package/dist/types/csv/csv.browser.d.ts +33 -0
  233. package/dist/types/csv/csv.d.ts +97 -71
  234. package/dist/types/doc/anchor.d.ts +1 -1
  235. package/dist/types/doc/cell.d.ts +7 -7
  236. package/dist/types/doc/column.d.ts +9 -3
  237. package/dist/types/doc/defined-names.d.ts +4 -4
  238. package/dist/types/doc/image.d.ts +2 -2
  239. package/dist/types/doc/modelcontainer.d.ts +1 -1
  240. package/dist/types/doc/pivot-table.d.ts +1 -1
  241. package/dist/types/doc/range.d.ts +1 -1
  242. package/dist/types/doc/row.d.ts +3 -3
  243. package/dist/types/doc/table.d.ts +2 -2
  244. package/dist/types/doc/workbook.base.d.ts +111 -0
  245. package/dist/types/doc/workbook.browser.d.ts +38 -0
  246. package/dist/types/doc/workbook.d.ts +62 -92
  247. package/dist/types/doc/worksheet.d.ts +12 -10
  248. package/dist/types/index.browser.d.ts +19 -5
  249. package/dist/types/index.d.ts +24 -23
  250. package/dist/types/local.d.ts +0 -1
  251. package/dist/types/stream/xlsx/hyperlink-reader.d.ts +1 -1
  252. package/dist/types/stream/xlsx/workbook-reader.d.ts +4 -4
  253. package/dist/types/stream/xlsx/workbook-writer.d.ts +7 -7
  254. package/dist/types/stream/xlsx/worksheet-reader.d.ts +5 -5
  255. package/dist/types/stream/xlsx/worksheet-writer.d.ts +11 -9
  256. package/dist/types/types.d.ts +6 -0
  257. package/dist/types/utils/browser-buffer.d.ts +28 -0
  258. package/dist/types/utils/col-cache.d.ts +1 -1
  259. package/dist/types/utils/datetime.d.ts +56 -0
  260. package/dist/types/utils/encryptor.browser.d.ts +28 -0
  261. package/dist/types/utils/parse-sax.d.ts +108 -1
  262. package/dist/types/utils/sheet-utils.d.ts +3 -3
  263. package/dist/types/utils/stream-buf.browser.d.ts +41 -0
  264. package/dist/types/utils/unzip/extract.d.ts +6 -6
  265. package/dist/types/utils/unzip/index.d.ts +8 -8
  266. package/dist/types/utils/unzip/parse.d.ts +3 -3
  267. package/dist/types/utils/unzip/zip-parser.d.ts +5 -0
  268. package/dist/types/utils/utils.base.d.ts +29 -0
  269. package/dist/types/utils/utils.browser.d.ts +29 -0
  270. package/dist/types/utils/utils.d.ts +6 -25
  271. package/dist/types/utils/zip/compress.base.d.ts +45 -0
  272. package/dist/types/utils/zip/compress.browser.d.ts +63 -0
  273. package/dist/types/utils/zip/compress.d.ts +13 -45
  274. package/dist/types/utils/zip/crc32.browser.d.ts +52 -0
  275. package/dist/types/utils/zip/deflate-fallback.d.ts +39 -0
  276. package/dist/types/utils/zip/index.d.ts +5 -5
  277. package/dist/types/utils/zip/streaming-zip.d.ts +96 -0
  278. package/dist/types/utils/zip/zip-builder.d.ts +1 -1
  279. package/dist/types/utils/zip-stream.browser.d.ts +39 -0
  280. package/dist/types/xlsx/xform/base-xform.d.ts +1 -1
  281. package/dist/types/xlsx/xform/book/defined-name-xform.d.ts +1 -1
  282. package/dist/types/xlsx/xform/book/sheet-xform.d.ts +1 -1
  283. package/dist/types/xlsx/xform/book/workbook-calc-properties-xform.d.ts +1 -1
  284. package/dist/types/xlsx/xform/book/workbook-pivot-cache-xform.d.ts +1 -1
  285. package/dist/types/xlsx/xform/book/workbook-properties-xform.d.ts +1 -1
  286. package/dist/types/xlsx/xform/book/workbook-view-xform.d.ts +1 -1
  287. package/dist/types/xlsx/xform/book/workbook-xform.d.ts +2 -2
  288. package/dist/types/xlsx/xform/comment/comment-xform.d.ts +2 -2
  289. package/dist/types/xlsx/xform/comment/comments-xform.d.ts +2 -2
  290. package/dist/types/xlsx/xform/comment/style/vml-position-xform.d.ts +1 -1
  291. package/dist/types/xlsx/xform/comment/style/vml-protection-xform.d.ts +1 -1
  292. package/dist/types/xlsx/xform/comment/vml-anchor-xform.d.ts +1 -1
  293. package/dist/types/xlsx/xform/comment/vml-client-data-xform.d.ts +1 -1
  294. package/dist/types/xlsx/xform/comment/vml-notes-xform.d.ts +1 -1
  295. package/dist/types/xlsx/xform/comment/vml-shape-xform.d.ts +1 -1
  296. package/dist/types/xlsx/xform/comment/vml-textbox-xform.d.ts +1 -1
  297. package/dist/types/xlsx/xform/composite-xform.d.ts +1 -1
  298. package/dist/types/xlsx/xform/core/app-heading-pairs-xform.d.ts +1 -1
  299. package/dist/types/xlsx/xform/core/app-titles-of-parts-xform.d.ts +1 -1
  300. package/dist/types/xlsx/xform/core/app-xform.d.ts +1 -1
  301. package/dist/types/xlsx/xform/core/content-types-xform.d.ts +1 -1
  302. package/dist/types/xlsx/xform/core/core-xform.d.ts +1 -1
  303. package/dist/types/xlsx/xform/core/relationship-xform.d.ts +1 -1
  304. package/dist/types/xlsx/xform/core/relationships-xform.d.ts +1 -1
  305. package/dist/types/xlsx/xform/drawing/base-cell-anchor-xform.d.ts +1 -1
  306. package/dist/types/xlsx/xform/drawing/blip-fill-xform.d.ts +2 -2
  307. package/dist/types/xlsx/xform/drawing/blip-xform.d.ts +1 -1
  308. package/dist/types/xlsx/xform/drawing/c-nv-pic-pr-xform.d.ts +1 -1
  309. package/dist/types/xlsx/xform/drawing/c-nv-pr-xform.d.ts +1 -1
  310. package/dist/types/xlsx/xform/drawing/cell-position-xform.d.ts +2 -2
  311. package/dist/types/xlsx/xform/drawing/drawing-xform.d.ts +1 -1
  312. package/dist/types/xlsx/xform/drawing/ext-lst-xform.d.ts +1 -1
  313. package/dist/types/xlsx/xform/drawing/ext-xform.d.ts +1 -1
  314. package/dist/types/xlsx/xform/drawing/hlink-click-xform.d.ts +1 -1
  315. package/dist/types/xlsx/xform/drawing/nv-pic-pr-xform.d.ts +1 -1
  316. package/dist/types/xlsx/xform/drawing/one-cell-anchor-xform.d.ts +1 -1
  317. package/dist/types/xlsx/xform/drawing/pic-xform.d.ts +1 -1
  318. package/dist/types/xlsx/xform/drawing/two-cell-anchor-xform.d.ts +1 -1
  319. package/dist/types/xlsx/xform/list-xform.d.ts +1 -1
  320. package/dist/types/xlsx/xform/pivot-table/cache-field-xform.d.ts +1 -1
  321. package/dist/types/xlsx/xform/pivot-table/pivot-cache-definition-xform.d.ts +3 -3
  322. package/dist/types/xlsx/xform/pivot-table/pivot-cache-records-xform.d.ts +2 -2
  323. package/dist/types/xlsx/xform/pivot-table/pivot-table-xform.d.ts +1 -1
  324. package/dist/types/xlsx/xform/sheet/auto-filter-xform.d.ts +1 -1
  325. package/dist/types/xlsx/xform/sheet/cell-xform.d.ts +1 -1
  326. package/dist/types/xlsx/xform/sheet/cf/cf-rule-xform.d.ts +6 -6
  327. package/dist/types/xlsx/xform/sheet/cf/cfvo-xform.d.ts +1 -1
  328. package/dist/types/xlsx/xform/sheet/cf/color-scale-xform.d.ts +3 -3
  329. package/dist/types/xlsx/xform/sheet/cf/conditional-formatting-xform.d.ts +1 -1
  330. package/dist/types/xlsx/xform/sheet/cf/conditional-formattings-xform.d.ts +2 -2
  331. package/dist/types/xlsx/xform/sheet/cf/databar-xform.d.ts +3 -3
  332. package/dist/types/xlsx/xform/sheet/cf/ext-lst-ref-xform.d.ts +1 -1
  333. package/dist/types/xlsx/xform/sheet/cf/formula-xform.d.ts +1 -1
  334. package/dist/types/xlsx/xform/sheet/cf/icon-set-xform.d.ts +2 -2
  335. package/dist/types/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.d.ts +1 -1
  336. package/dist/types/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.d.ts +3 -3
  337. package/dist/types/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.d.ts +2 -2
  338. package/dist/types/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.d.ts +3 -3
  339. package/dist/types/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.d.ts +2 -2
  340. package/dist/types/xlsx/xform/sheet/cf-ext/databar-ext-xform.d.ts +3 -3
  341. package/dist/types/xlsx/xform/sheet/cf-ext/f-ext-xform.d.ts +1 -1
  342. package/dist/types/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.d.ts +3 -3
  343. package/dist/types/xlsx/xform/sheet/cf-ext/sqref-ext-xform.d.ts +1 -1
  344. package/dist/types/xlsx/xform/sheet/col-breaks-xform.d.ts +16 -0
  345. package/dist/types/xlsx/xform/sheet/col-xform.d.ts +1 -1
  346. package/dist/types/xlsx/xform/sheet/data-validations-xform.d.ts +1 -1
  347. package/dist/types/xlsx/xform/sheet/dimension-xform.d.ts +1 -1
  348. package/dist/types/xlsx/xform/sheet/drawing-xform.d.ts +1 -1
  349. package/dist/types/xlsx/xform/sheet/ext-lst-xform.d.ts +1 -1
  350. package/dist/types/xlsx/xform/sheet/header-footer-xform.d.ts +1 -1
  351. package/dist/types/xlsx/xform/sheet/hyperlink-xform.d.ts +1 -1
  352. package/dist/types/xlsx/xform/sheet/merge-cell-xform.d.ts +1 -1
  353. package/dist/types/xlsx/xform/sheet/outline-properties-xform.d.ts +1 -1
  354. package/dist/types/xlsx/xform/sheet/page-breaks-xform.d.ts +5 -1
  355. package/dist/types/xlsx/xform/sheet/page-margins-xform.d.ts +1 -1
  356. package/dist/types/xlsx/xform/sheet/page-setup-properties-xform.d.ts +1 -1
  357. package/dist/types/xlsx/xform/sheet/page-setup-xform.d.ts +1 -1
  358. package/dist/types/xlsx/xform/sheet/picture-xform.d.ts +1 -1
  359. package/dist/types/xlsx/xform/sheet/print-options-xform.d.ts +1 -1
  360. package/dist/types/xlsx/xform/sheet/row-breaks-xform.d.ts +5 -1
  361. package/dist/types/xlsx/xform/sheet/row-xform.d.ts +1 -1
  362. package/dist/types/xlsx/xform/sheet/sheet-format-properties-xform.d.ts +1 -1
  363. package/dist/types/xlsx/xform/sheet/sheet-properties-xform.d.ts +1 -1
  364. package/dist/types/xlsx/xform/sheet/sheet-protection-xform.d.ts +1 -1
  365. package/dist/types/xlsx/xform/sheet/sheet-view-xform.d.ts +1 -1
  366. package/dist/types/xlsx/xform/sheet/table-part-xform.d.ts +1 -1
  367. package/dist/types/xlsx/xform/sheet/worksheet-xform.d.ts +1 -1
  368. package/dist/types/xlsx/xform/simple/boolean-xform.d.ts +1 -1
  369. package/dist/types/xlsx/xform/simple/date-xform.d.ts +1 -1
  370. package/dist/types/xlsx/xform/simple/float-xform.d.ts +1 -1
  371. package/dist/types/xlsx/xform/simple/integer-xform.d.ts +1 -1
  372. package/dist/types/xlsx/xform/simple/string-xform.d.ts +1 -1
  373. package/dist/types/xlsx/xform/static-xform.d.ts +1 -1
  374. package/dist/types/xlsx/xform/strings/phonetic-text-xform.d.ts +1 -1
  375. package/dist/types/xlsx/xform/strings/rich-text-xform.d.ts +3 -3
  376. package/dist/types/xlsx/xform/strings/shared-string-xform.d.ts +1 -1
  377. package/dist/types/xlsx/xform/strings/shared-strings-xform.d.ts +2 -2
  378. package/dist/types/xlsx/xform/strings/text-xform.d.ts +1 -1
  379. package/dist/types/xlsx/xform/style/alignment-xform.d.ts +1 -1
  380. package/dist/types/xlsx/xform/style/border-xform.d.ts +2 -2
  381. package/dist/types/xlsx/xform/style/color-xform.d.ts +1 -1
  382. package/dist/types/xlsx/xform/style/dxf-xform.d.ts +1 -1
  383. package/dist/types/xlsx/xform/style/fill-xform.d.ts +2 -2
  384. package/dist/types/xlsx/xform/style/font-xform.d.ts +1 -1
  385. package/dist/types/xlsx/xform/style/numfmt-xform.d.ts +1 -1
  386. package/dist/types/xlsx/xform/style/protection-xform.d.ts +1 -1
  387. package/dist/types/xlsx/xform/style/style-xform.d.ts +3 -3
  388. package/dist/types/xlsx/xform/style/styles-xform.d.ts +2 -2
  389. package/dist/types/xlsx/xform/style/underline-xform.d.ts +1 -1
  390. package/dist/types/xlsx/xform/table/auto-filter-xform.d.ts +2 -2
  391. package/dist/types/xlsx/xform/table/custom-filter-xform.d.ts +1 -1
  392. package/dist/types/xlsx/xform/table/filter-column-xform.d.ts +2 -2
  393. package/dist/types/xlsx/xform/table/filter-xform.d.ts +1 -1
  394. package/dist/types/xlsx/xform/table/table-column-xform.d.ts +1 -1
  395. package/dist/types/xlsx/xform/table/table-style-info-xform.d.ts +1 -1
  396. package/dist/types/xlsx/xform/table/table-xform.d.ts +1 -1
  397. package/dist/types/xlsx/xlsx.base.d.ts +134 -0
  398. package/dist/types/xlsx/xlsx.browser.d.ts +31 -0
  399. package/dist/types/xlsx/xlsx.d.ts +20 -80
  400. package/package.json +16 -39
@@ -27,6 +27,7 @@ import { PictureXform } from "../../xlsx/xform/sheet/picture-xform.js";
27
27
  import { ConditionalFormattingsXform } from "../../xlsx/xform/sheet/cf/conditional-formattings-xform.js";
28
28
  import { HeaderFooterXform } from "../../xlsx/xform/sheet/header-footer-xform.js";
29
29
  import { RowBreaksXform } from "../../xlsx/xform/sheet/row-breaks-xform.js";
30
+ import { ColBreaksXform } from "../../xlsx/xform/sheet/col-breaks-xform.js";
30
31
  // since prepare and render are functional, we can use singletons
31
32
  const xform = {
32
33
  dataValidations: new DataValidationsXform(),
@@ -51,7 +52,8 @@ const xform = {
51
52
  picture: new PictureXform(),
52
53
  conditionalFormattings: new ConditionalFormattingsXform(),
53
54
  headerFooter: new HeaderFooterXform(),
54
- rowBreaks: new RowBreaksXform()
55
+ rowBreaks: new RowBreaksXform(),
56
+ colBreaks: new ColBreaksXform()
55
57
  };
56
58
  class WorksheetWriter {
57
59
  constructor(options) {
@@ -89,6 +91,7 @@ class WorksheetWriter {
89
91
  this.conditionalFormatting = [];
90
92
  // keep a record of all row and column pageBreaks
91
93
  this.rowBreaks = [];
94
+ this.colBreaks = [];
92
95
  // for default row height, outline levels, etc
93
96
  this.properties = Object.assign({}, {
94
97
  defaultRowHeight: 15,
@@ -193,6 +196,7 @@ class WorksheetWriter {
193
196
  this._writeBackground();
194
197
  this._writeHeaderFooter();
195
198
  this._writeRowBreaks();
199
+ this._writeColBreaks();
196
200
  // Legacy Data tag for comments
197
201
  this._writeLegacyData();
198
202
  this._writeCloseWorksheet();
@@ -543,6 +547,9 @@ class WorksheetWriter {
543
547
  _writeRowBreaks() {
544
548
  this.stream.write(xform.rowBreaks.toXml(this.rowBreaks));
545
549
  }
550
+ _writeColBreaks() {
551
+ this.stream.write(xform.colBreaks.toXml(this.colBreaks));
552
+ }
546
553
  _writeDataValidations() {
547
554
  this.stream.write(xform.dataValidations.toXml(this.dataValidations.model));
548
555
  }
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Browser-compatible Buffer utilities
3
+ * Provides base64 encoding/decoding and a Buffer-like wrapper for Uint8Array
4
+ */
5
+ /**
6
+ * Convert Uint8Array to base64 string
7
+ */
8
+ export function uint8ArrayToBase64(bytes) {
9
+ let binary = "";
10
+ for (let i = 0; i < bytes.length; i++) {
11
+ binary += String.fromCharCode(bytes[i]);
12
+ }
13
+ return btoa(binary);
14
+ }
15
+ /**
16
+ * Convert base64 string to Uint8Array
17
+ */
18
+ export function base64ToUint8Array(base64) {
19
+ const binaryString = atob(base64);
20
+ const bytes = new Uint8Array(binaryString.length);
21
+ for (let i = 0; i < binaryString.length; i++) {
22
+ bytes[i] = binaryString.charCodeAt(i);
23
+ }
24
+ return bytes;
25
+ }
26
+ /**
27
+ * Buffer-like wrapper for Uint8Array with toString("base64") support
28
+ * This provides Node.js Buffer-like API for browser environments
29
+ */
30
+ export class BrowserBuffer extends Uint8Array {
31
+ toString(encoding) {
32
+ if (encoding === "base64") {
33
+ return uint8ArrayToBase64(this);
34
+ }
35
+ return new TextDecoder().decode(this);
36
+ }
37
+ static from(data) {
38
+ const buffer = new BrowserBuffer(data.length);
39
+ buffer.set(data);
40
+ return buffer;
41
+ }
42
+ }
43
+ /**
44
+ * Convert string to UTF-16LE Uint8Array (used for Excel password hashing)
45
+ */
46
+ export function stringToUtf16Le(str) {
47
+ const bytes = new Uint8Array(str.length * 2);
48
+ for (let i = 0; i < str.length; i++) {
49
+ const code = str.charCodeAt(i);
50
+ bytes[i * 2] = code & 0xff;
51
+ bytes[i * 2 + 1] = (code >> 8) & 0xff;
52
+ }
53
+ return bytes;
54
+ }
55
+ /**
56
+ * Concatenate multiple Uint8Arrays into one
57
+ */
58
+ export function concatUint8Arrays(...arrays) {
59
+ const totalLength = arrays.reduce((acc, arr) => acc + arr.length, 0);
60
+ const result = new Uint8Array(totalLength);
61
+ let offset = 0;
62
+ for (const arr of arrays) {
63
+ result.set(arr, offset);
64
+ offset += arr.length;
65
+ }
66
+ return result;
67
+ }
@@ -0,0 +1,493 @@
1
+ /**
2
+ * High-performance native date parsing and formatting utilities
3
+ *
4
+ * Zero external dependencies. Optimized for CSV batch processing.
5
+ * Uses character code operations and lookup tables for maximum speed.
6
+ */
7
+ // ============================================================================
8
+ // Constants - Pre-computed lookup tables for zero-allocation operations
9
+ // ============================================================================
10
+ // Padding lookup (0-59 covers hours, minutes, seconds, and months/days)
11
+ const PAD2 = Array.from({ length: 60 }, (_, i) => (i < 10 ? `0${i}` : `${i}`));
12
+ // Character codes for fast comparison
13
+ const C_0 = 48;
14
+ const C_DASH = 45;
15
+ const C_SLASH = 47;
16
+ const C_COLON = 58;
17
+ const C_T = 84;
18
+ const C_SPACE = 32;
19
+ const C_Z = 90;
20
+ const C_PLUS = 43;
21
+ const C_DOT = 46;
22
+ // ============================================================================
23
+ // Low-level utilities (inlined for JIT optimization)
24
+ // ============================================================================
25
+ // Inline digit extraction - avoid function call overhead
26
+ // Using bitwise OR for integer coercion (faster than Math.floor)
27
+ const digit2 = (s, i) => ((s.charCodeAt(i) - C_0) * 10 + s.charCodeAt(i + 1) - C_0) | 0;
28
+ const digit4 = (s, i) => ((s.charCodeAt(i) - C_0) * 1000 +
29
+ (s.charCodeAt(i + 1) - C_0) * 100 +
30
+ (s.charCodeAt(i + 2) - C_0) * 10 +
31
+ s.charCodeAt(i + 3) -
32
+ C_0) |
33
+ 0;
34
+ // Days in month lookup (index 0 unused, 1-12 for Jan-Dec)
35
+ // Using 31 for Feb; actual validation done by Date constructor
36
+ const DAYS_IN_MONTH = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
37
+ function validateDate(y, m, d) {
38
+ // Fast bounds check using lookup table
39
+ if (m < 1 || m > 12 || d < 1 || d > DAYS_IN_MONTH[m]) {
40
+ return null;
41
+ }
42
+ const date = new Date(y, m - 1, d);
43
+ // Check for overflow (e.g., Feb 30 -> Mar 2)
44
+ return date.getMonth() === m - 1 ? date : null;
45
+ }
46
+ function validateDateTime(y, m, d, h, min, s) {
47
+ if (m < 1 || m > 12 || d < 1 || d > DAYS_IN_MONTH[m]) {
48
+ return null;
49
+ }
50
+ if (h > 23 || min > 59 || s > 59) {
51
+ return null;
52
+ }
53
+ return new Date(y, m - 1, d, h, min, s);
54
+ }
55
+ // ============================================================================
56
+ // Specialized parsers (length-based dispatch for speed)
57
+ // ============================================================================
58
+ // YYYY-MM-DD (10 chars)
59
+ function parseISO(s) {
60
+ if (s.charCodeAt(4) !== C_DASH || s.charCodeAt(7) !== C_DASH) {
61
+ return null;
62
+ }
63
+ return validateDate(digit4(s, 0), digit2(s, 5), digit2(s, 8));
64
+ }
65
+ // YYYY-MM-DDTHH:mm:ss (19 chars)
66
+ function parseISOT(s) {
67
+ if (s.charCodeAt(4) !== C_DASH ||
68
+ s.charCodeAt(7) !== C_DASH ||
69
+ s.charCodeAt(10) !== C_T ||
70
+ s.charCodeAt(13) !== C_COLON ||
71
+ s.charCodeAt(16) !== C_COLON) {
72
+ return null;
73
+ }
74
+ return validateDateTime(digit4(s, 0), digit2(s, 5), digit2(s, 8), digit2(s, 11), digit2(s, 14), digit2(s, 17));
75
+ }
76
+ // YYYY-MM-DD HH:mm:ss (19 chars, space separator)
77
+ function parseISOSpace(s) {
78
+ if (s.charCodeAt(4) !== C_DASH ||
79
+ s.charCodeAt(7) !== C_DASH ||
80
+ s.charCodeAt(10) !== C_SPACE ||
81
+ s.charCodeAt(13) !== C_COLON ||
82
+ s.charCodeAt(16) !== C_COLON) {
83
+ return null;
84
+ }
85
+ return validateDateTime(digit4(s, 0), digit2(s, 5), digit2(s, 8), digit2(s, 11), digit2(s, 14), digit2(s, 17));
86
+ }
87
+ // YYYY-MM-DDTHH:mm:ssZ (20 chars)
88
+ function parseISOZ(s) {
89
+ if (s.charCodeAt(19) !== C_Z) {
90
+ return null;
91
+ }
92
+ const d = new Date(s);
93
+ return isNaN(d.getTime()) ? null : d;
94
+ }
95
+ // YYYY-MM-DDTHH:mm:ss.SSSZ (24 chars)
96
+ function parseISOMsZ(s) {
97
+ if (s.charCodeAt(19) !== C_DOT || s.charCodeAt(23) !== C_Z) {
98
+ return null;
99
+ }
100
+ const d = new Date(s);
101
+ return isNaN(d.getTime()) ? null : d;
102
+ }
103
+ // YYYY-MM-DDTHH:mm:ss+HH:mm (25 chars)
104
+ function parseISOOffset(s) {
105
+ const c = s.charCodeAt(19);
106
+ if (c !== C_PLUS && c !== C_DASH) {
107
+ return null;
108
+ }
109
+ const d = new Date(s);
110
+ return isNaN(d.getTime()) ? null : d;
111
+ }
112
+ // YYYY-MM-DDTHH:mm:ss.SSS+HH:mm (29 chars)
113
+ function parseISOMsOffset(s) {
114
+ if (s.charCodeAt(19) !== C_DOT) {
115
+ return null;
116
+ }
117
+ const c = s.charCodeAt(23);
118
+ if (c !== C_PLUS && c !== C_DASH) {
119
+ return null;
120
+ }
121
+ const d = new Date(s);
122
+ return isNaN(d.getTime()) ? null : d;
123
+ }
124
+ // MM-DD-YYYY or MM/DD/YYYY (10 chars)
125
+ function parseUS(s) {
126
+ const sep = s.charCodeAt(2);
127
+ if ((sep !== C_DASH && sep !== C_SLASH) || s.charCodeAt(5) !== sep) {
128
+ return null;
129
+ }
130
+ return validateDate(digit4(s, 6), digit2(s, 0), digit2(s, 3));
131
+ }
132
+ // DD-MM-YYYY or DD/MM/YYYY (10 chars)
133
+ function parseEU(s) {
134
+ const sep = s.charCodeAt(2);
135
+ if ((sep !== C_DASH && sep !== C_SLASH) || s.charCodeAt(5) !== sep) {
136
+ return null;
137
+ }
138
+ return validateDate(digit4(s, 6), digit2(s, 3), digit2(s, 0));
139
+ }
140
+ // MM-DD-YYYY HH:mm:ss or MM/DD/YYYY HH:mm:ss (19 chars)
141
+ function parseUSTime(s) {
142
+ const sep = s.charCodeAt(2);
143
+ if ((sep !== C_DASH && sep !== C_SLASH) || s.charCodeAt(5) !== sep) {
144
+ return null;
145
+ }
146
+ if (s.charCodeAt(10) !== C_SPACE ||
147
+ s.charCodeAt(13) !== C_COLON ||
148
+ s.charCodeAt(16) !== C_COLON) {
149
+ return null;
150
+ }
151
+ return validateDateTime(digit4(s, 6), digit2(s, 0), digit2(s, 3), digit2(s, 11), digit2(s, 14), digit2(s, 17));
152
+ }
153
+ // DD-MM-YYYY HH:mm:ss or DD/MM/YYYY HH:mm:ss (19 chars)
154
+ function parseEUTime(s) {
155
+ const sep = s.charCodeAt(2);
156
+ if ((sep !== C_DASH && sep !== C_SLASH) || s.charCodeAt(5) !== sep) {
157
+ return null;
158
+ }
159
+ if (s.charCodeAt(10) !== C_SPACE ||
160
+ s.charCodeAt(13) !== C_COLON ||
161
+ s.charCodeAt(16) !== C_COLON) {
162
+ return null;
163
+ }
164
+ return validateDateTime(digit4(s, 6), digit2(s, 3), digit2(s, 0), digit2(s, 11), digit2(s, 14), digit2(s, 17));
165
+ }
166
+ const PARSERS = {
167
+ "YYYY-MM-DD": parseISO,
168
+ "YYYY-MM-DD[T]HH:mm:ss": parseISOT,
169
+ "YYYY-MM-DD HH:mm:ss": parseISOSpace,
170
+ "YYYY-MM-DD[T]HH:mm:ssZ": s => s.length === 20 ? parseISOZ(s) : s.length === 25 ? parseISOOffset(s) : null,
171
+ "YYYY-MM-DD[T]HH:mm:ss.SSSZ": s => s.length === 24 ? parseISOMsZ(s) : s.length === 29 ? parseISOMsOffset(s) : null,
172
+ "MM-DD-YYYY": parseUS,
173
+ "MM-DD-YYYY HH:mm:ss": parseUSTime,
174
+ "MM/DD/YYYY HH:mm:ss": parseUSTime,
175
+ "DD-MM-YYYY": parseEU,
176
+ "DD-MM-YYYY HH:mm:ss": parseEUTime,
177
+ "DD/MM/YYYY HH:mm:ss": parseEUTime
178
+ };
179
+ // Length-based auto-detection (ISO formats only, US/EU excluded due to ambiguity)
180
+ const AUTO_DETECT = [
181
+ [10, [parseISO]],
182
+ [19, [parseISOT, parseISOSpace]],
183
+ [20, [parseISOZ]],
184
+ [24, [parseISOMsZ]],
185
+ [25, [parseISOOffset]],
186
+ [29, [parseISOMsOffset]]
187
+ ];
188
+ // ============================================================================
189
+ // High-performance batch processors (class-based for state encapsulation)
190
+ // ============================================================================
191
+ /**
192
+ * Optimized date parser for batch processing
193
+ *
194
+ * @example
195
+ * const parser = DateParser.create(["YYYY-MM-DD"]);
196
+ * const dates = parser.parseAll(csvStrings);
197
+ */
198
+ export class DateParser {
199
+ constructor(fns) {
200
+ /** Parse single value */
201
+ this.parse = (value) => {
202
+ if (!value) {
203
+ return null;
204
+ }
205
+ const s = value.trim();
206
+ if (!s) {
207
+ return null;
208
+ }
209
+ // Fast path for single parser
210
+ if (this.single) {
211
+ return this.fn0(s);
212
+ }
213
+ // Multi-parser path
214
+ for (let i = 0, len = this.fns.length; i < len; i++) {
215
+ const r = this.fns[i](s);
216
+ if (r) {
217
+ return r;
218
+ }
219
+ }
220
+ return null;
221
+ };
222
+ this.fns = fns;
223
+ this.single = fns.length === 1;
224
+ this.fn0 = fns[0];
225
+ }
226
+ /** Create parser for specific formats */
227
+ static create(formats) {
228
+ return new DateParser(formats.map(f => PARSERS[f]).filter(Boolean));
229
+ }
230
+ /** Create parser for auto-detecting ISO formats */
231
+ static iso() {
232
+ const fns = [];
233
+ for (const [, parsers] of AUTO_DETECT) {
234
+ fns.push(...parsers);
235
+ }
236
+ return new DateParser(fns);
237
+ }
238
+ /** Parse array of values */
239
+ parseAll(values) {
240
+ const len = values.length;
241
+ const out = new Array(len);
242
+ const parse = this.parse;
243
+ for (let i = 0; i < len; i++) {
244
+ out[i] = parse(values[i]);
245
+ }
246
+ return out;
247
+ }
248
+ /** Parse and filter valid dates */
249
+ parseValid(values) {
250
+ const out = [];
251
+ const parse = this.parse;
252
+ for (let i = 0, len = values.length; i < len; i++) {
253
+ const d = parse(values[i]);
254
+ if (d) {
255
+ out.push(d);
256
+ }
257
+ }
258
+ return out;
259
+ }
260
+ }
261
+ function tzOffset(d) {
262
+ const off = -d.getTimezoneOffset();
263
+ const sign = off >= 0 ? "+" : "-";
264
+ const h = (Math.abs(off) / 60) | 0; // Bitwise OR faster than Math.floor
265
+ const m = Math.abs(off) % 60;
266
+ return `${sign}${PAD2[h]}:${PAD2[m]}`;
267
+ }
268
+ /**
269
+ * Optimized date formatter for batch processing
270
+ *
271
+ * @example
272
+ * const formatter = DateFormatter.create("YYYY-MM-DD", { utc: true });
273
+ * const strings = formatter.formatAll(dates);
274
+ */
275
+ export class DateFormatter {
276
+ constructor(fn) {
277
+ /** Format single date */
278
+ this.format = (date) => this.fn(date);
279
+ this.fn = fn;
280
+ }
281
+ /** Create ISO formatter (fastest) */
282
+ static iso(utc = false) {
283
+ // Direct string building is faster than toISOString() + slice
284
+ return utc
285
+ ? new DateFormatter(d => {
286
+ if (!(d instanceof Date)) {
287
+ return "";
288
+ }
289
+ const t = d.getTime();
290
+ if (t !== t) {
291
+ return "";
292
+ } // NaN check
293
+ const y = d.getUTCFullYear();
294
+ const M = d.getUTCMonth() + 1;
295
+ const D = d.getUTCDate();
296
+ const H = d.getUTCHours();
297
+ const m = d.getUTCMinutes();
298
+ const s = d.getUTCSeconds();
299
+ const ms = d.getUTCMilliseconds();
300
+ return `${y}-${PAD2[M]}-${PAD2[D]}T${PAD2[H]}:${PAD2[m]}:${PAD2[s]}.${ms < 10 ? "00" + ms : ms < 100 ? "0" + ms : ms}Z`;
301
+ })
302
+ : new DateFormatter(d => {
303
+ if (!(d instanceof Date)) {
304
+ return "";
305
+ }
306
+ const t = d.getTime();
307
+ if (t !== t) {
308
+ return "";
309
+ } // NaN check
310
+ const y = d.getFullYear();
311
+ const M = d.getMonth() + 1;
312
+ const D = d.getDate();
313
+ const H = d.getHours();
314
+ const m = d.getMinutes();
315
+ const s = d.getSeconds();
316
+ const ms = d.getMilliseconds();
317
+ return `${y}-${PAD2[M]}-${PAD2[D]}T${PAD2[H]}:${PAD2[m]}:${PAD2[s]}.${ms < 10 ? "00" + ms : ms < 100 ? "0" + ms : ms}${tzOffset(d)}`;
318
+ });
319
+ }
320
+ /** Create custom format formatter */
321
+ static create(format, options) {
322
+ const utc = options?.utc ?? false;
323
+ // Fast paths for common formats (no regex, direct string building)
324
+ if (format === "YYYY-MM-DD") {
325
+ return utc
326
+ ? new DateFormatter(d => {
327
+ if (!(d instanceof Date)) {
328
+ return "";
329
+ }
330
+ const t = d.getTime();
331
+ if (t !== t) {
332
+ return "";
333
+ }
334
+ return `${d.getUTCFullYear()}-${PAD2[d.getUTCMonth() + 1]}-${PAD2[d.getUTCDate()]}`;
335
+ })
336
+ : new DateFormatter(d => {
337
+ if (!(d instanceof Date)) {
338
+ return "";
339
+ }
340
+ const t = d.getTime();
341
+ if (t !== t) {
342
+ return "";
343
+ }
344
+ return `${d.getFullYear()}-${PAD2[d.getMonth() + 1]}-${PAD2[d.getDate()]}`;
345
+ });
346
+ }
347
+ if (format === "YYYY-MM-DD HH:mm:ss") {
348
+ return utc
349
+ ? new DateFormatter(d => {
350
+ if (!(d instanceof Date)) {
351
+ return "";
352
+ }
353
+ const t = d.getTime();
354
+ if (t !== t) {
355
+ return "";
356
+ }
357
+ return `${d.getUTCFullYear()}-${PAD2[d.getUTCMonth() + 1]}-${PAD2[d.getUTCDate()]} ${PAD2[d.getUTCHours()]}:${PAD2[d.getUTCMinutes()]}:${PAD2[d.getUTCSeconds()]}`;
358
+ })
359
+ : new DateFormatter(d => {
360
+ if (!(d instanceof Date)) {
361
+ return "";
362
+ }
363
+ const t = d.getTime();
364
+ if (t !== t) {
365
+ return "";
366
+ }
367
+ return `${d.getFullYear()}-${PAD2[d.getMonth() + 1]}-${PAD2[d.getDate()]} ${PAD2[d.getHours()]}:${PAD2[d.getMinutes()]}:${PAD2[d.getSeconds()]}`;
368
+ });
369
+ }
370
+ if (format === "MM-DD-YYYY" || format === "MM/DD/YYYY") {
371
+ const sep = format.charAt(2);
372
+ return utc
373
+ ? new DateFormatter(d => {
374
+ if (!(d instanceof Date)) {
375
+ return "";
376
+ }
377
+ const t = d.getTime();
378
+ if (t !== t) {
379
+ return "";
380
+ }
381
+ return `${PAD2[d.getUTCMonth() + 1]}${sep}${PAD2[d.getUTCDate()]}${sep}${d.getUTCFullYear()}`;
382
+ })
383
+ : new DateFormatter(d => {
384
+ if (!(d instanceof Date)) {
385
+ return "";
386
+ }
387
+ const t = d.getTime();
388
+ if (t !== t) {
389
+ return "";
390
+ }
391
+ return `${PAD2[d.getMonth() + 1]}${sep}${PAD2[d.getDate()]}${sep}${d.getFullYear()}`;
392
+ });
393
+ }
394
+ if (format === "DD-MM-YYYY" || format === "DD/MM/YYYY") {
395
+ const sep = format.charAt(2);
396
+ return utc
397
+ ? new DateFormatter(d => {
398
+ if (!(d instanceof Date)) {
399
+ return "";
400
+ }
401
+ const t = d.getTime();
402
+ if (t !== t) {
403
+ return "";
404
+ }
405
+ return `${PAD2[d.getUTCDate()]}${sep}${PAD2[d.getUTCMonth() + 1]}${sep}${d.getUTCFullYear()}`;
406
+ })
407
+ : new DateFormatter(d => {
408
+ if (!(d instanceof Date)) {
409
+ return "";
410
+ }
411
+ const t = d.getTime();
412
+ if (t !== t) {
413
+ return "";
414
+ }
415
+ return `${PAD2[d.getDate()]}${sep}${PAD2[d.getMonth() + 1]}${sep}${d.getFullYear()}`;
416
+ });
417
+ }
418
+ // Generic path with pre-compiled template
419
+ return DateFormatter.createGeneric(format, utc);
420
+ }
421
+ /** Generic formatter for arbitrary formats */
422
+ static createGeneric(format, utc) {
423
+ // Pre-process escaped sections
424
+ const esc = [];
425
+ const tpl = format.replace(/\[([^\]]*)\]/g, (_, c) => {
426
+ esc.push(c);
427
+ return `\x00${esc.length - 1}\x00`;
428
+ });
429
+ // Detect used tokens for conditional computation
430
+ const hasY = tpl.includes("YYYY");
431
+ const hasMs = tpl.includes("SSS");
432
+ const hasM = tpl.includes("MM");
433
+ const hasD = tpl.includes("DD");
434
+ const hasH = tpl.includes("HH");
435
+ const hasMin = tpl.includes("mm");
436
+ const hasS = tpl.includes("ss");
437
+ const hasZ = tpl.includes("Z");
438
+ return new DateFormatter(d => {
439
+ if (!(d instanceof Date)) {
440
+ return "";
441
+ }
442
+ const t = d.getTime();
443
+ if (t !== t) {
444
+ return "";
445
+ }
446
+ let out = tpl;
447
+ if (hasY) {
448
+ out = out.replace(/YYYY/g, String(utc ? d.getUTCFullYear() : d.getFullYear()));
449
+ }
450
+ if (hasMs) {
451
+ const ms = utc ? d.getUTCMilliseconds() : d.getMilliseconds();
452
+ out = out.replace(/SSS/g, ms < 10 ? `00${ms}` : ms < 100 ? `0${ms}` : String(ms));
453
+ }
454
+ if (hasM) {
455
+ out = out.replace(/MM/g, PAD2[utc ? d.getUTCMonth() + 1 : d.getMonth() + 1]);
456
+ }
457
+ if (hasD) {
458
+ out = out.replace(/DD/g, PAD2[utc ? d.getUTCDate() : d.getDate()]);
459
+ }
460
+ if (hasH) {
461
+ out = out.replace(/HH/g, PAD2[utc ? d.getUTCHours() : d.getHours()]);
462
+ }
463
+ if (hasMin) {
464
+ out = out.replace(/mm/g, PAD2[utc ? d.getUTCMinutes() : d.getMinutes()]);
465
+ }
466
+ if (hasS) {
467
+ out = out.replace(/ss/g, PAD2[utc ? d.getUTCSeconds() : d.getSeconds()]);
468
+ }
469
+ if (hasZ) {
470
+ out = out.replace(/Z/g, utc ? "Z" : tzOffset(d));
471
+ }
472
+ if (esc.length) {
473
+ // oxlint-disable-next-line no-control-regex
474
+ out = out.replace(/\x00(\d+)\x00/g, (_, i) => esc[+i]);
475
+ }
476
+ return out;
477
+ });
478
+ }
479
+ /** Format array of dates */
480
+ formatAll(dates) {
481
+ const len = dates.length;
482
+ const out = new Array(len);
483
+ const fn = this.fn;
484
+ for (let i = 0; i < len; i++) {
485
+ out[i] = fn(dates[i]);
486
+ }
487
+ return out;
488
+ }
489
+ }
490
+ /** Get supported format strings */
491
+ export function getSupportedFormats() {
492
+ return Object.keys(PARSERS);
493
+ }