@cj-tech-master/excelts 1.6.3 → 2.0.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 (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 +648 -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 +639 -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 +85 -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
@@ -0,0 +1,639 @@
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_9 = 57;
15
+ const C_DASH = 45;
16
+ const C_SLASH = 47;
17
+ const C_COLON = 58;
18
+ const C_T = 84;
19
+ const C_SPACE = 32;
20
+ const C_Z = 90;
21
+ const C_PLUS = 43;
22
+ const C_DOT = 46;
23
+ // ============================================================================
24
+ // Low-level utilities (inlined for JIT optimization)
25
+ // ============================================================================
26
+ // Inline digit extraction - avoid function call overhead
27
+ // Using bitwise OR for integer coercion (faster than Math.floor)
28
+ const digit2 = (s, i) => ((s.charCodeAt(i) - C_0) * 10 + s.charCodeAt(i + 1) - C_0) | 0;
29
+ const digit4 = (s, i) => ((s.charCodeAt(i) - C_0) * 1000 +
30
+ (s.charCodeAt(i + 1) - C_0) * 100 +
31
+ (s.charCodeAt(i + 2) - C_0) * 10 +
32
+ s.charCodeAt(i + 3) -
33
+ C_0) |
34
+ 0;
35
+ // Days in month lookup (index 0 unused, 1-12 for Jan-Dec)
36
+ // Using 31 for Feb; actual validation done by Date constructor
37
+ const DAYS_IN_MONTH = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
38
+ function validateDate(y, m, d) {
39
+ // Fast bounds check using lookup table
40
+ if (m < 1 || m > 12 || d < 1 || d > DAYS_IN_MONTH[m]) {
41
+ return null;
42
+ }
43
+ const date = new Date(y, m - 1, d);
44
+ // Check for overflow (e.g., Feb 30 -> Mar 2)
45
+ return date.getMonth() === m - 1 ? date : null;
46
+ }
47
+ function validateDateTime(y, m, d, h, min, s) {
48
+ if (m < 1 || m > 12 || d < 1 || d > DAYS_IN_MONTH[m]) {
49
+ return null;
50
+ }
51
+ if (h > 23 || min > 59 || s > 59) {
52
+ return null;
53
+ }
54
+ return new Date(y, m - 1, d, h, min, s);
55
+ }
56
+ // ============================================================================
57
+ // Specialized parsers (length-based dispatch for speed)
58
+ // ============================================================================
59
+ // YYYY-MM-DD (10 chars)
60
+ function parseISO(s) {
61
+ if (s.charCodeAt(4) !== C_DASH || s.charCodeAt(7) !== C_DASH) {
62
+ return null;
63
+ }
64
+ return validateDate(digit4(s, 0), digit2(s, 5), digit2(s, 8));
65
+ }
66
+ // YYYY-MM-DDTHH:mm:ss (19 chars)
67
+ function parseISOT(s) {
68
+ if (s.charCodeAt(4) !== C_DASH ||
69
+ s.charCodeAt(7) !== C_DASH ||
70
+ s.charCodeAt(10) !== C_T ||
71
+ s.charCodeAt(13) !== C_COLON ||
72
+ s.charCodeAt(16) !== C_COLON) {
73
+ return null;
74
+ }
75
+ return validateDateTime(digit4(s, 0), digit2(s, 5), digit2(s, 8), digit2(s, 11), digit2(s, 14), digit2(s, 17));
76
+ }
77
+ // YYYY-MM-DD HH:mm:ss (19 chars, space separator)
78
+ function parseISOSpace(s) {
79
+ if (s.charCodeAt(4) !== C_DASH ||
80
+ s.charCodeAt(7) !== C_DASH ||
81
+ s.charCodeAt(10) !== C_SPACE ||
82
+ s.charCodeAt(13) !== C_COLON ||
83
+ s.charCodeAt(16) !== C_COLON) {
84
+ return null;
85
+ }
86
+ return validateDateTime(digit4(s, 0), digit2(s, 5), digit2(s, 8), digit2(s, 11), digit2(s, 14), digit2(s, 17));
87
+ }
88
+ // YYYY-MM-DDTHH:mm:ssZ (20 chars)
89
+ function parseISOZ(s) {
90
+ if (s.charCodeAt(19) !== C_Z) {
91
+ return null;
92
+ }
93
+ const d = new Date(s);
94
+ return isNaN(d.getTime()) ? null : d;
95
+ }
96
+ // YYYY-MM-DDTHH:mm:ss.SSSZ (24 chars)
97
+ function parseISOMsZ(s) {
98
+ if (s.charCodeAt(19) !== C_DOT || s.charCodeAt(23) !== C_Z) {
99
+ return null;
100
+ }
101
+ const d = new Date(s);
102
+ return isNaN(d.getTime()) ? null : d;
103
+ }
104
+ // YYYY-MM-DDTHH:mm:ss+HH:mm (25 chars)
105
+ function parseISOOffset(s) {
106
+ const c = s.charCodeAt(19);
107
+ if (c !== C_PLUS && c !== C_DASH) {
108
+ return null;
109
+ }
110
+ const d = new Date(s);
111
+ return isNaN(d.getTime()) ? null : d;
112
+ }
113
+ // YYYY-MM-DDTHH:mm:ss.SSS+HH:mm (29 chars)
114
+ function parseISOMsOffset(s) {
115
+ if (s.charCodeAt(19) !== C_DOT) {
116
+ return null;
117
+ }
118
+ const c = s.charCodeAt(23);
119
+ if (c !== C_PLUS && c !== C_DASH) {
120
+ return null;
121
+ }
122
+ const d = new Date(s);
123
+ return isNaN(d.getTime()) ? null : d;
124
+ }
125
+ // MM-DD-YYYY or MM/DD/YYYY (10 chars)
126
+ function parseUS(s) {
127
+ const sep = s.charCodeAt(2);
128
+ if ((sep !== C_DASH && sep !== C_SLASH) || s.charCodeAt(5) !== sep) {
129
+ return null;
130
+ }
131
+ return validateDate(digit4(s, 6), digit2(s, 0), digit2(s, 3));
132
+ }
133
+ // DD-MM-YYYY or DD/MM/YYYY (10 chars)
134
+ function parseEU(s) {
135
+ const sep = s.charCodeAt(2);
136
+ if ((sep !== C_DASH && sep !== C_SLASH) || s.charCodeAt(5) !== sep) {
137
+ return null;
138
+ }
139
+ return validateDate(digit4(s, 6), digit2(s, 3), digit2(s, 0));
140
+ }
141
+ // MM-DD-YYYY HH:mm:ss or MM/DD/YYYY HH:mm:ss (19 chars)
142
+ function parseUSTime(s) {
143
+ const sep = s.charCodeAt(2);
144
+ if ((sep !== C_DASH && sep !== C_SLASH) || s.charCodeAt(5) !== sep) {
145
+ return null;
146
+ }
147
+ if (s.charCodeAt(10) !== C_SPACE ||
148
+ s.charCodeAt(13) !== C_COLON ||
149
+ s.charCodeAt(16) !== C_COLON) {
150
+ return null;
151
+ }
152
+ return validateDateTime(digit4(s, 6), digit2(s, 0), digit2(s, 3), digit2(s, 11), digit2(s, 14), digit2(s, 17));
153
+ }
154
+ // DD-MM-YYYY HH:mm:ss or DD/MM/YYYY HH:mm:ss (19 chars)
155
+ function parseEUTime(s) {
156
+ const sep = s.charCodeAt(2);
157
+ if ((sep !== C_DASH && sep !== C_SLASH) || s.charCodeAt(5) !== sep) {
158
+ return null;
159
+ }
160
+ if (s.charCodeAt(10) !== C_SPACE ||
161
+ s.charCodeAt(13) !== C_COLON ||
162
+ s.charCodeAt(16) !== C_COLON) {
163
+ return null;
164
+ }
165
+ return validateDateTime(digit4(s, 6), digit2(s, 3), digit2(s, 0), digit2(s, 11), digit2(s, 14), digit2(s, 17));
166
+ }
167
+ const PARSERS = {
168
+ "YYYY-MM-DD": parseISO,
169
+ "YYYY-MM-DD[T]HH:mm:ss": parseISOT,
170
+ "YYYY-MM-DD HH:mm:ss": parseISOSpace,
171
+ "YYYY-MM-DD[T]HH:mm:ssZ": s => s.length === 20 ? parseISOZ(s) : s.length === 25 ? parseISOOffset(s) : null,
172
+ "YYYY-MM-DD[T]HH:mm:ss.SSSZ": s => s.length === 24 ? parseISOMsZ(s) : s.length === 29 ? parseISOMsOffset(s) : null,
173
+ "MM-DD-YYYY": parseUS,
174
+ "MM-DD-YYYY HH:mm:ss": parseUSTime,
175
+ "MM/DD/YYYY HH:mm:ss": parseUSTime,
176
+ "DD-MM-YYYY": parseEU,
177
+ "DD-MM-YYYY HH:mm:ss": parseEUTime,
178
+ "DD/MM/YYYY HH:mm:ss": parseEUTime
179
+ };
180
+ // Length-based auto-detection (ISO formats only, US/EU excluded due to ambiguity)
181
+ const AUTO_DETECT = [
182
+ [10, [parseISO]],
183
+ [19, [parseISOT, parseISOSpace]],
184
+ [20, [parseISOZ]],
185
+ [24, [parseISOMsZ]],
186
+ [25, [parseISOOffset]],
187
+ [29, [parseISOMsOffset]]
188
+ ];
189
+ // ============================================================================
190
+ // Public API
191
+ // ============================================================================
192
+ /**
193
+ * Quick pre-filter to reject non-date strings
194
+ */
195
+ export function mightBeDate(s) {
196
+ const len = s.length;
197
+ if (len < 10 || len > 30) {
198
+ return false;
199
+ }
200
+ const c0 = s.charCodeAt(0);
201
+ const c1 = s.charCodeAt(1);
202
+ // Must start with digits
203
+ if (c0 < C_0 || c0 > C_9 || c1 < C_0 || c1 > C_9) {
204
+ return false;
205
+ }
206
+ const c2 = s.charCodeAt(2);
207
+ // Either YYYY format (4 digits) or MM/DD format (separator at pos 2)
208
+ return (c2 >= C_0 && c2 <= C_9) || c2 === C_DASH || c2 === C_SLASH;
209
+ }
210
+ /**
211
+ * Parse a date string
212
+ *
213
+ * @param value - String to parse
214
+ * @param formats - Specific formats to try (optional, auto-detects ISO if omitted)
215
+ * @returns Date object or null
216
+ *
217
+ * @example
218
+ * parseDate("2024-12-26") // auto-detect ISO
219
+ * parseDate("12-26-2024", ["MM-DD-YYYY"]) // explicit US format
220
+ */
221
+ export function parseDate(value, formats) {
222
+ if (!value || typeof value !== "string") {
223
+ return null;
224
+ }
225
+ const s = value.trim();
226
+ if (!s) {
227
+ return null;
228
+ }
229
+ // Explicit formats
230
+ if (formats?.length) {
231
+ for (const fmt of formats) {
232
+ const result = PARSERS[fmt]?.(s);
233
+ if (result) {
234
+ return result;
235
+ }
236
+ }
237
+ return null;
238
+ }
239
+ // Auto-detect by length
240
+ const len = s.length;
241
+ for (const [l, parsers] of AUTO_DETECT) {
242
+ if (len === l) {
243
+ for (const p of parsers) {
244
+ const result = p(s);
245
+ if (result) {
246
+ return result;
247
+ }
248
+ }
249
+ }
250
+ }
251
+ return null;
252
+ }
253
+ /**
254
+ * Format a Date to string
255
+ *
256
+ * @param date - Date to format
257
+ * @param format - Format template (optional, defaults to ISO)
258
+ * @param utc - Use UTC time (default: false)
259
+ * @returns Formatted string or empty string if invalid
260
+ *
261
+ * @example
262
+ * formatDate(date) // "2024-12-26T10:30:00.000+08:00"
263
+ * formatDate(date, "YYYY-MM-DD", true) // "2024-12-26"
264
+ */
265
+ export function formatDate(date, format, utc = false) {
266
+ if (!(date instanceof Date)) {
267
+ return "";
268
+ }
269
+ const t = date.getTime();
270
+ if (t !== t) {
271
+ return "";
272
+ } // NaN check (faster than isNaN)
273
+ // Default ISO format - direct string building (faster than toISOString)
274
+ if (!format) {
275
+ if (utc) {
276
+ const y = date.getUTCFullYear();
277
+ const M = date.getUTCMonth() + 1;
278
+ const D = date.getUTCDate();
279
+ const H = date.getUTCHours();
280
+ const m = date.getUTCMinutes();
281
+ const s = date.getUTCSeconds();
282
+ const ms = date.getUTCMilliseconds();
283
+ return `${y}-${PAD2[M]}-${PAD2[D]}T${PAD2[H]}:${PAD2[m]}:${PAD2[s]}.${ms < 10 ? "00" + ms : ms < 100 ? "0" + ms : ms}Z`;
284
+ }
285
+ const y = date.getFullYear();
286
+ const M = date.getMonth() + 1;
287
+ const D = date.getDate();
288
+ const H = date.getHours();
289
+ const m = date.getMinutes();
290
+ const s = date.getSeconds();
291
+ const ms = date.getMilliseconds();
292
+ return `${y}-${PAD2[M]}-${PAD2[D]}T${PAD2[H]}:${PAD2[m]}:${PAD2[s]}.${ms < 10 ? "00" + ms : ms < 100 ? "0" + ms : ms}${tzOffset(date)}`;
293
+ }
294
+ // Fast paths for common formats
295
+ if (format === "YYYY-MM-DD") {
296
+ return utc
297
+ ? `${date.getUTCFullYear()}-${PAD2[date.getUTCMonth() + 1]}-${PAD2[date.getUTCDate()]}`
298
+ : `${date.getFullYear()}-${PAD2[date.getMonth() + 1]}-${PAD2[date.getDate()]}`;
299
+ }
300
+ return renderFormat(date, format, utc);
301
+ }
302
+ function tzOffset(d) {
303
+ const off = -d.getTimezoneOffset();
304
+ const sign = off >= 0 ? "+" : "-";
305
+ const h = (Math.abs(off) / 60) | 0; // Bitwise OR faster than Math.floor
306
+ const m = Math.abs(off) % 60;
307
+ return `${sign}${PAD2[h]}:${PAD2[m]}`;
308
+ }
309
+ function renderFormat(d, fmt, utc) {
310
+ // Handle escaped sections [...]
311
+ const esc = [];
312
+ let out = fmt.replace(/\[([^\]]*)\]/g, (_, c) => {
313
+ esc.push(c);
314
+ return `\x00${esc.length - 1}\x00`;
315
+ });
316
+ // Get components once
317
+ const y = utc ? d.getUTCFullYear() : d.getFullYear();
318
+ const M = utc ? d.getUTCMonth() + 1 : d.getMonth() + 1;
319
+ const D = utc ? d.getUTCDate() : d.getDate();
320
+ const H = utc ? d.getUTCHours() : d.getHours();
321
+ const m = utc ? d.getUTCMinutes() : d.getMinutes();
322
+ const s = utc ? d.getUTCSeconds() : d.getSeconds();
323
+ const ms = utc ? d.getUTCMilliseconds() : d.getMilliseconds();
324
+ // Replace tokens
325
+ out = out
326
+ .replace(/YYYY/g, String(y))
327
+ .replace(/SSS/g, ms < 10 ? `00${ms}` : ms < 100 ? `0${ms}` : String(ms))
328
+ .replace(/MM/g, PAD2[M])
329
+ .replace(/DD/g, PAD2[D])
330
+ .replace(/HH/g, PAD2[H])
331
+ .replace(/mm/g, PAD2[m])
332
+ .replace(/ss/g, PAD2[s])
333
+ .replace(/Z/g, utc ? "Z" : tzOffset(d));
334
+ // Restore escaped
335
+ if (esc.length) {
336
+ // oxlint-disable-next-line no-control-regex
337
+ out = out.replace(/\x00(\d+)\x00/g, (_, i) => esc[+i]);
338
+ }
339
+ return out;
340
+ }
341
+ // ============================================================================
342
+ // High-performance batch processors (class-based for state encapsulation)
343
+ // ============================================================================
344
+ /**
345
+ * Optimized date parser for batch processing
346
+ *
347
+ * @example
348
+ * const parser = DateParser.create(["YYYY-MM-DD"]);
349
+ * const dates = parser.parseAll(csvStrings);
350
+ */
351
+ export class DateParser {
352
+ constructor(fns) {
353
+ /** Parse single value */
354
+ this.parse = (value) => {
355
+ if (!value) {
356
+ return null;
357
+ }
358
+ const s = value.trim();
359
+ if (!s) {
360
+ return null;
361
+ }
362
+ // Fast path for single parser
363
+ if (this.single) {
364
+ return this.fn0(s);
365
+ }
366
+ // Multi-parser path
367
+ for (let i = 0, len = this.fns.length; i < len; i++) {
368
+ const r = this.fns[i](s);
369
+ if (r) {
370
+ return r;
371
+ }
372
+ }
373
+ return null;
374
+ };
375
+ this.fns = fns;
376
+ this.single = fns.length === 1;
377
+ this.fn0 = fns[0];
378
+ }
379
+ /** Create parser for specific formats */
380
+ static create(formats) {
381
+ return new DateParser(formats.map(f => PARSERS[f]).filter(Boolean));
382
+ }
383
+ /** Create parser for auto-detecting ISO formats */
384
+ static iso() {
385
+ const fns = [];
386
+ for (const [, parsers] of AUTO_DETECT) {
387
+ fns.push(...parsers);
388
+ }
389
+ return new DateParser(fns);
390
+ }
391
+ /** Parse array of values */
392
+ parseAll(values) {
393
+ const len = values.length;
394
+ const out = new Array(len);
395
+ const parse = this.parse;
396
+ for (let i = 0; i < len; i++) {
397
+ out[i] = parse(values[i]);
398
+ }
399
+ return out;
400
+ }
401
+ /** Parse and filter valid dates */
402
+ parseValid(values) {
403
+ const out = [];
404
+ const parse = this.parse;
405
+ for (let i = 0, len = values.length; i < len; i++) {
406
+ const d = parse(values[i]);
407
+ if (d) {
408
+ out.push(d);
409
+ }
410
+ }
411
+ return out;
412
+ }
413
+ }
414
+ /**
415
+ * Optimized date formatter for batch processing
416
+ *
417
+ * @example
418
+ * const formatter = DateFormatter.create("YYYY-MM-DD", { utc: true });
419
+ * const strings = formatter.formatAll(dates);
420
+ */
421
+ export class DateFormatter {
422
+ constructor(fn) {
423
+ /** Format single date */
424
+ this.format = (date) => this.fn(date);
425
+ this.fn = fn;
426
+ }
427
+ /** Create ISO formatter (fastest) */
428
+ static iso(utc = false) {
429
+ // Direct string building is faster than toISOString() + slice
430
+ return utc
431
+ ? new DateFormatter(d => {
432
+ if (!(d instanceof Date)) {
433
+ return "";
434
+ }
435
+ const t = d.getTime();
436
+ if (t !== t) {
437
+ return "";
438
+ } // NaN check
439
+ const y = d.getUTCFullYear();
440
+ const M = d.getUTCMonth() + 1;
441
+ const D = d.getUTCDate();
442
+ const H = d.getUTCHours();
443
+ const m = d.getUTCMinutes();
444
+ const s = d.getUTCSeconds();
445
+ const ms = d.getUTCMilliseconds();
446
+ return `${y}-${PAD2[M]}-${PAD2[D]}T${PAD2[H]}:${PAD2[m]}:${PAD2[s]}.${ms < 10 ? "00" + ms : ms < 100 ? "0" + ms : ms}Z`;
447
+ })
448
+ : new DateFormatter(d => {
449
+ if (!(d instanceof Date)) {
450
+ return "";
451
+ }
452
+ const t = d.getTime();
453
+ if (t !== t) {
454
+ return "";
455
+ } // NaN check
456
+ const y = d.getFullYear();
457
+ const M = d.getMonth() + 1;
458
+ const D = d.getDate();
459
+ const H = d.getHours();
460
+ const m = d.getMinutes();
461
+ const s = d.getSeconds();
462
+ const ms = d.getMilliseconds();
463
+ return `${y}-${PAD2[M]}-${PAD2[D]}T${PAD2[H]}:${PAD2[m]}:${PAD2[s]}.${ms < 10 ? "00" + ms : ms < 100 ? "0" + ms : ms}${tzOffset(d)}`;
464
+ });
465
+ }
466
+ /** Create custom format formatter */
467
+ static create(format, options) {
468
+ const utc = options?.utc ?? false;
469
+ // Fast paths for common formats (no regex, direct string building)
470
+ if (format === "YYYY-MM-DD") {
471
+ return utc
472
+ ? new DateFormatter(d => {
473
+ if (!(d instanceof Date)) {
474
+ return "";
475
+ }
476
+ const t = d.getTime();
477
+ if (t !== t) {
478
+ return "";
479
+ }
480
+ return `${d.getUTCFullYear()}-${PAD2[d.getUTCMonth() + 1]}-${PAD2[d.getUTCDate()]}`;
481
+ })
482
+ : new DateFormatter(d => {
483
+ if (!(d instanceof Date)) {
484
+ return "";
485
+ }
486
+ const t = d.getTime();
487
+ if (t !== t) {
488
+ return "";
489
+ }
490
+ return `${d.getFullYear()}-${PAD2[d.getMonth() + 1]}-${PAD2[d.getDate()]}`;
491
+ });
492
+ }
493
+ if (format === "YYYY-MM-DD HH:mm:ss") {
494
+ return utc
495
+ ? new DateFormatter(d => {
496
+ if (!(d instanceof Date)) {
497
+ return "";
498
+ }
499
+ const t = d.getTime();
500
+ if (t !== t) {
501
+ return "";
502
+ }
503
+ return `${d.getUTCFullYear()}-${PAD2[d.getUTCMonth() + 1]}-${PAD2[d.getUTCDate()]} ${PAD2[d.getUTCHours()]}:${PAD2[d.getUTCMinutes()]}:${PAD2[d.getUTCSeconds()]}`;
504
+ })
505
+ : new DateFormatter(d => {
506
+ if (!(d instanceof Date)) {
507
+ return "";
508
+ }
509
+ const t = d.getTime();
510
+ if (t !== t) {
511
+ return "";
512
+ }
513
+ return `${d.getFullYear()}-${PAD2[d.getMonth() + 1]}-${PAD2[d.getDate()]} ${PAD2[d.getHours()]}:${PAD2[d.getMinutes()]}:${PAD2[d.getSeconds()]}`;
514
+ });
515
+ }
516
+ if (format === "MM-DD-YYYY" || format === "MM/DD/YYYY") {
517
+ const sep = format.charAt(2);
518
+ return utc
519
+ ? new DateFormatter(d => {
520
+ if (!(d instanceof Date)) {
521
+ return "";
522
+ }
523
+ const t = d.getTime();
524
+ if (t !== t) {
525
+ return "";
526
+ }
527
+ return `${PAD2[d.getUTCMonth() + 1]}${sep}${PAD2[d.getUTCDate()]}${sep}${d.getUTCFullYear()}`;
528
+ })
529
+ : new DateFormatter(d => {
530
+ if (!(d instanceof Date)) {
531
+ return "";
532
+ }
533
+ const t = d.getTime();
534
+ if (t !== t) {
535
+ return "";
536
+ }
537
+ return `${PAD2[d.getMonth() + 1]}${sep}${PAD2[d.getDate()]}${sep}${d.getFullYear()}`;
538
+ });
539
+ }
540
+ if (format === "DD-MM-YYYY" || format === "DD/MM/YYYY") {
541
+ const sep = format.charAt(2);
542
+ return utc
543
+ ? new DateFormatter(d => {
544
+ if (!(d instanceof Date)) {
545
+ return "";
546
+ }
547
+ const t = d.getTime();
548
+ if (t !== t) {
549
+ return "";
550
+ }
551
+ return `${PAD2[d.getUTCDate()]}${sep}${PAD2[d.getUTCMonth() + 1]}${sep}${d.getUTCFullYear()}`;
552
+ })
553
+ : new DateFormatter(d => {
554
+ if (!(d instanceof Date)) {
555
+ return "";
556
+ }
557
+ const t = d.getTime();
558
+ if (t !== t) {
559
+ return "";
560
+ }
561
+ return `${PAD2[d.getDate()]}${sep}${PAD2[d.getMonth() + 1]}${sep}${d.getFullYear()}`;
562
+ });
563
+ }
564
+ // Generic path with pre-compiled template
565
+ return DateFormatter.createGeneric(format, utc);
566
+ }
567
+ /** Generic formatter for arbitrary formats */
568
+ static createGeneric(format, utc) {
569
+ // Pre-process escaped sections
570
+ const esc = [];
571
+ const tpl = format.replace(/\[([^\]]*)\]/g, (_, c) => {
572
+ esc.push(c);
573
+ return `\x00${esc.length - 1}\x00`;
574
+ });
575
+ // Detect used tokens for conditional computation
576
+ const hasY = tpl.includes("YYYY");
577
+ const hasMs = tpl.includes("SSS");
578
+ const hasM = tpl.includes("MM");
579
+ const hasD = tpl.includes("DD");
580
+ const hasH = tpl.includes("HH");
581
+ const hasMin = tpl.includes("mm");
582
+ const hasS = tpl.includes("ss");
583
+ const hasZ = tpl.includes("Z");
584
+ return new DateFormatter(d => {
585
+ if (!(d instanceof Date)) {
586
+ return "";
587
+ }
588
+ const t = d.getTime();
589
+ if (t !== t) {
590
+ return "";
591
+ }
592
+ let out = tpl;
593
+ if (hasY) {
594
+ out = out.replace(/YYYY/g, String(utc ? d.getUTCFullYear() : d.getFullYear()));
595
+ }
596
+ if (hasMs) {
597
+ const ms = utc ? d.getUTCMilliseconds() : d.getMilliseconds();
598
+ out = out.replace(/SSS/g, ms < 10 ? `00${ms}` : ms < 100 ? `0${ms}` : String(ms));
599
+ }
600
+ if (hasM) {
601
+ out = out.replace(/MM/g, PAD2[utc ? d.getUTCMonth() + 1 : d.getMonth() + 1]);
602
+ }
603
+ if (hasD) {
604
+ out = out.replace(/DD/g, PAD2[utc ? d.getUTCDate() : d.getDate()]);
605
+ }
606
+ if (hasH) {
607
+ out = out.replace(/HH/g, PAD2[utc ? d.getUTCHours() : d.getHours()]);
608
+ }
609
+ if (hasMin) {
610
+ out = out.replace(/mm/g, PAD2[utc ? d.getUTCMinutes() : d.getMinutes()]);
611
+ }
612
+ if (hasS) {
613
+ out = out.replace(/ss/g, PAD2[utc ? d.getUTCSeconds() : d.getSeconds()]);
614
+ }
615
+ if (hasZ) {
616
+ out = out.replace(/Z/g, utc ? "Z" : tzOffset(d));
617
+ }
618
+ if (esc.length) {
619
+ // oxlint-disable-next-line no-control-regex
620
+ out = out.replace(/\x00(\d+)\x00/g, (_, i) => esc[+i]);
621
+ }
622
+ return out;
623
+ });
624
+ }
625
+ /** Format array of dates */
626
+ formatAll(dates) {
627
+ const len = dates.length;
628
+ const out = new Array(len);
629
+ const fn = this.fn;
630
+ for (let i = 0; i < len; i++) {
631
+ out[i] = fn(dates[i]);
632
+ }
633
+ return out;
634
+ }
635
+ }
636
+ /** Get supported format strings */
637
+ export function getSupportedFormats() {
638
+ return Object.keys(PARSERS);
639
+ }