@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
@@ -0,0 +1,701 @@
1
+ "use strict";
2
+ /**
3
+ * CSV Parser and Formatter - RFC 4180 compliant
4
+ *
5
+ * A lightweight, cross-platform CSV implementation that works in both
6
+ * Node.js and Browser environments with zero dependencies.
7
+ *
8
+ * High-performance RFC 4180 compliant CSV parser and formatter.
9
+ *
10
+ * @see https://tools.ietf.org/html/rfc4180
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.isSyncTransform = isSyncTransform;
14
+ exports.isSyncValidate = isSyncValidate;
15
+ exports.parseCsv = parseCsv;
16
+ exports.formatCsv = formatCsv;
17
+ exports.parseCsvStream = parseCsvStream;
18
+ // =============================================================================
19
+ // Helper Functions
20
+ // =============================================================================
21
+ /**
22
+ * Escape special regex characters
23
+ */
24
+ function escapeRegex(str) {
25
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
26
+ }
27
+ /**
28
+ * Check if a transform function is synchronous (1 argument) vs async (2 arguments)
29
+ */
30
+ function isSyncTransform(transform) {
31
+ return transform.length === 1;
32
+ }
33
+ /**
34
+ * Check if a validate function is synchronous (1 argument) vs async (2 arguments)
35
+ */
36
+ function isSyncValidate(validate) {
37
+ return validate.length === 1;
38
+ }
39
+ /**
40
+ * Check if headers are unique
41
+ */
42
+ function validateUniqueHeaders(headers) {
43
+ const seen = new Set();
44
+ const duplicates = [];
45
+ for (const header of headers) {
46
+ if (header !== null && header !== undefined) {
47
+ if (seen.has(header)) {
48
+ duplicates.push(header);
49
+ }
50
+ seen.add(header);
51
+ }
52
+ }
53
+ if (duplicates.length > 0) {
54
+ throw new Error(`Duplicate headers found ${JSON.stringify(duplicates)}`);
55
+ }
56
+ }
57
+ /**
58
+ * Apply trim options to a field
59
+ */
60
+ function applyTrim(field, trim, ltrim, rtrim) {
61
+ if (trim) {
62
+ return field.trim();
63
+ }
64
+ let result = field;
65
+ if (ltrim) {
66
+ result = result.trimStart();
67
+ }
68
+ if (rtrim) {
69
+ result = result.trimEnd();
70
+ }
71
+ return result;
72
+ }
73
+ // =============================================================================
74
+ // Parse Functions
75
+ // =============================================================================
76
+ /**
77
+ * Parse a CSV string into rows of fields
78
+ */
79
+ function parseCsv(input, options = {}) {
80
+ const { delimiter = ",", quote: quoteOption = '"', escape: escapeOption = '"', skipEmptyLines = false, ignoreEmpty = false, trim = false, ltrim = false, rtrim = false, headers = false, renameHeaders = false, comment, maxRows, skipLines = 0, skipRows = 0, strictColumnHandling = false, discardUnmappedColumns = false, transform, validate } = options;
81
+ const shouldSkipEmpty = skipEmptyLines || ignoreEmpty;
82
+ // Handle quote: null/false to disable quoting
83
+ const quoteEnabled = quoteOption !== null && quoteOption !== false;
84
+ const quote = quoteEnabled ? String(quoteOption) : "";
85
+ const escape = escapeOption !== null && escapeOption !== false ? String(escapeOption) : "";
86
+ const rows = [];
87
+ const invalidRows = [];
88
+ let currentRow = [];
89
+ let currentField = "";
90
+ let inQuotes = false;
91
+ let i = 0;
92
+ let lineNumber = 0;
93
+ let dataRowCount = 0;
94
+ let skippedDataRows = 0;
95
+ // Header handling
96
+ let headerRow = null;
97
+ let headersLength = 0;
98
+ let useHeaders = false;
99
+ let headerRowProcessed = false;
100
+ // Determine header mode
101
+ if (headers === true) {
102
+ useHeaders = true;
103
+ }
104
+ else if (Array.isArray(headers)) {
105
+ headerRow = headers;
106
+ headersLength = headers.filter(h => h !== null && h !== undefined).length;
107
+ validateUniqueHeaders(headers);
108
+ useHeaders = true;
109
+ if (!renameHeaders) {
110
+ headerRowProcessed = true; // We already have headers, don't wait for first row
111
+ }
112
+ }
113
+ else if (typeof headers === "function") {
114
+ useHeaders = true;
115
+ }
116
+ // Normalize line endings
117
+ input = input.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
118
+ const processRow = (row) => {
119
+ // If we have headers defined and this is the first data row (for headers: true)
120
+ // or we need to validate headers from a function
121
+ if (useHeaders && !headerRowProcessed) {
122
+ // First row is headers
123
+ if (typeof headers === "function") {
124
+ const transformed = headers(row);
125
+ validateUniqueHeaders(transformed);
126
+ headerRow = transformed;
127
+ }
128
+ else if (!Array.isArray(headers)) {
129
+ validateUniqueHeaders(row);
130
+ headerRow = row;
131
+ }
132
+ headersLength = headerRow.filter(h => h !== null && h !== undefined).length;
133
+ headerRowProcessed = true;
134
+ // If renameHeaders and custom headers provided, discard this row
135
+ if (renameHeaders) {
136
+ return false;
137
+ }
138
+ // For headers: true, don't add header row to data
139
+ if (headers === true || typeof headers === "function") {
140
+ return false;
141
+ }
142
+ return false;
143
+ }
144
+ // Skip data rows
145
+ if (skippedDataRows < skipRows) {
146
+ skippedDataRows++;
147
+ return false;
148
+ }
149
+ // Column validation when using headers
150
+ if (headerRow && headerRow.length > 0) {
151
+ const expectedCols = headersLength;
152
+ const actualCols = row.length;
153
+ if (actualCols > expectedCols) {
154
+ if (strictColumnHandling && !discardUnmappedColumns) {
155
+ // Mark as invalid but continue
156
+ invalidRows.push({
157
+ row,
158
+ reason: `Column header mismatch expected: ${expectedCols} columns got: ${actualCols}`
159
+ });
160
+ return false;
161
+ }
162
+ else {
163
+ // Default: trim extra columns
164
+ row.length = headerRow.length;
165
+ }
166
+ }
167
+ else if (actualCols < expectedCols) {
168
+ if (strictColumnHandling) {
169
+ invalidRows.push({
170
+ row,
171
+ reason: `Column header mismatch expected: ${expectedCols} columns got: ${actualCols}`
172
+ });
173
+ return false;
174
+ }
175
+ // Pad with empty strings
176
+ while (row.length < headerRow.length) {
177
+ row.push("");
178
+ }
179
+ }
180
+ }
181
+ return true;
182
+ };
183
+ while (i < input.length) {
184
+ const char = input[i];
185
+ const nextChar = input[i + 1];
186
+ if (inQuotes && quoteEnabled) {
187
+ // Inside quoted field
188
+ if (escape && char === escape && nextChar === quote) {
189
+ // Escaped quote
190
+ currentField += quote;
191
+ i += 2;
192
+ }
193
+ else if (char === quote) {
194
+ // End of quoted field
195
+ inQuotes = false;
196
+ i++;
197
+ }
198
+ else {
199
+ currentField += char;
200
+ i++;
201
+ }
202
+ }
203
+ else {
204
+ // Outside quoted field
205
+ if (quoteEnabled && char === quote && currentField === "") {
206
+ // Start of quoted field
207
+ inQuotes = true;
208
+ i++;
209
+ }
210
+ else if (char === delimiter) {
211
+ // Field separator
212
+ currentRow.push(applyTrim(currentField, trim, ltrim, rtrim));
213
+ currentField = "";
214
+ i++;
215
+ }
216
+ else if (char === "\n") {
217
+ // End of row
218
+ currentRow.push(applyTrim(currentField, trim, ltrim, rtrim));
219
+ currentField = "";
220
+ lineNumber++;
221
+ // Skip lines at beginning
222
+ if (lineNumber <= skipLines) {
223
+ currentRow = [];
224
+ i++;
225
+ continue;
226
+ }
227
+ // Skip comment lines
228
+ if (comment && currentRow[0]?.startsWith(comment)) {
229
+ currentRow = [];
230
+ i++;
231
+ continue;
232
+ }
233
+ // Skip empty lines
234
+ const isEmpty = currentRow.length === 1 && currentRow[0] === "";
235
+ if (shouldSkipEmpty && isEmpty) {
236
+ currentRow = [];
237
+ i++;
238
+ continue;
239
+ }
240
+ // Process row (handles headers, validation)
241
+ if (processRow(currentRow)) {
242
+ rows.push(currentRow);
243
+ dataRowCount++;
244
+ }
245
+ currentRow = [];
246
+ i++;
247
+ // Check max rows - after resetting currentRow
248
+ if (maxRows !== undefined && dataRowCount >= maxRows) {
249
+ break;
250
+ }
251
+ }
252
+ else {
253
+ currentField += char;
254
+ i++;
255
+ }
256
+ }
257
+ }
258
+ // Handle last field/row
259
+ if (currentField !== "" || currentRow.length > 0) {
260
+ currentRow.push(applyTrim(currentField, trim, ltrim, rtrim));
261
+ // Skip lines at beginning
262
+ if (lineNumber >= skipLines) {
263
+ // Skip comment lines
264
+ if (!(comment && currentRow[0]?.startsWith(comment))) {
265
+ // Skip empty lines
266
+ const isEmpty = currentRow.length === 1 && currentRow[0] === "";
267
+ if (!(shouldSkipEmpty && isEmpty)) {
268
+ if (!(maxRows !== undefined && dataRowCount >= maxRows)) {
269
+ if (processRow(currentRow)) {
270
+ rows.push(currentRow);
271
+ }
272
+ }
273
+ }
274
+ }
275
+ }
276
+ }
277
+ // Convert to objects if headers enabled
278
+ if (useHeaders && headerRow) {
279
+ let dataRows = rows.map(row => {
280
+ const obj = {};
281
+ headerRow.forEach((header, index) => {
282
+ if (header !== null && header !== undefined) {
283
+ obj[header] = row[index] ?? "";
284
+ }
285
+ });
286
+ return obj;
287
+ });
288
+ // Apply transform if provided
289
+ if (transform) {
290
+ dataRows = dataRows
291
+ .map(row => transform(row))
292
+ .filter((row) => row !== null && row !== undefined);
293
+ }
294
+ // Apply validate if provided
295
+ if (validate) {
296
+ const validatedRows = [];
297
+ for (const row of dataRows) {
298
+ const result = validate(row);
299
+ if (typeof result === "boolean") {
300
+ if (result) {
301
+ validatedRows.push(row);
302
+ }
303
+ else {
304
+ invalidRows.push({ row: Object.values(row), reason: "Validation failed" });
305
+ }
306
+ }
307
+ else {
308
+ if (result.isValid) {
309
+ validatedRows.push(row);
310
+ }
311
+ else {
312
+ invalidRows.push({
313
+ row: Object.values(row),
314
+ reason: result.reason || "Validation failed"
315
+ });
316
+ }
317
+ }
318
+ }
319
+ dataRows = validatedRows;
320
+ }
321
+ if ((strictColumnHandling || validate) && invalidRows.length > 0) {
322
+ return {
323
+ headers: headerRow.filter((h) => h !== null && h !== undefined),
324
+ rows: dataRows,
325
+ invalidRows
326
+ };
327
+ }
328
+ return {
329
+ headers: headerRow.filter((h) => h !== null && h !== undefined),
330
+ rows: dataRows
331
+ };
332
+ }
333
+ // For array mode (no headers), apply transform and validate
334
+ let resultRows = rows;
335
+ if (transform) {
336
+ resultRows = resultRows
337
+ .map(row => transform(row))
338
+ .filter((row) => row !== null && row !== undefined);
339
+ }
340
+ if (validate) {
341
+ const validatedRows = [];
342
+ const arrayInvalidRows = [];
343
+ for (const row of resultRows) {
344
+ const result = validate(row);
345
+ if (typeof result === "boolean") {
346
+ if (result) {
347
+ validatedRows.push(row);
348
+ }
349
+ else {
350
+ arrayInvalidRows.push({ row, reason: "Validation failed" });
351
+ }
352
+ }
353
+ else {
354
+ if (result.isValid) {
355
+ validatedRows.push(row);
356
+ }
357
+ else {
358
+ arrayInvalidRows.push({ row, reason: result.reason || "Validation failed" });
359
+ }
360
+ }
361
+ }
362
+ resultRows = validatedRows;
363
+ if (arrayInvalidRows.length > 0) {
364
+ return {
365
+ rows: resultRows,
366
+ invalidRows: arrayInvalidRows
367
+ }; // Return with invalidRows for array mode too
368
+ }
369
+ }
370
+ return resultRows;
371
+ }
372
+ // =============================================================================
373
+ // Format Functions
374
+ // =============================================================================
375
+ /**
376
+ * Format data as a CSV string
377
+ */
378
+ function formatCsv(data, options = {}) {
379
+ const { delimiter = ",", quote: quoteOption = '"', escape: escapeOption, rowDelimiter = "\n", alwaysQuote = false, quoteColumns = false, quoteHeaders = false, headers, writeHeaders: writeHeadersOption, writeBOM = false, includeEndRowDelimiter = false, alwaysWriteHeaders = false, transform } = options;
380
+ // Determine if headers should be written (default: true when headers is provided)
381
+ const shouldWriteHeaders = writeHeadersOption ?? true;
382
+ // If quote is false or null, disable quoting entirely
383
+ const quoteEnabled = quoteOption !== false && quoteOption !== null;
384
+ const quote = quoteEnabled ? String(quoteOption) : "";
385
+ const escape = escapeOption !== undefined && escapeOption !== false && escapeOption !== null
386
+ ? String(escapeOption)
387
+ : quote;
388
+ const lines = [];
389
+ const shouldQuoteColumn = (index, header, isHeader = false) => {
390
+ const quoteConfig = isHeader ? quoteHeaders : quoteColumns;
391
+ if (typeof quoteConfig === "boolean") {
392
+ return quoteConfig;
393
+ }
394
+ if (Array.isArray(quoteConfig)) {
395
+ return quoteConfig[index] === true;
396
+ }
397
+ if (typeof quoteConfig === "object" && header) {
398
+ return quoteConfig[header] === true;
399
+ }
400
+ return false;
401
+ };
402
+ const formatField = (value, index, header, isHeader = false) => {
403
+ if (value === null || value === undefined) {
404
+ return "";
405
+ }
406
+ const str = String(value);
407
+ // If quoting is disabled, return raw string
408
+ if (!quoteEnabled) {
409
+ return str;
410
+ }
411
+ // Check if quoting is needed
412
+ const forceQuote = alwaysQuote || shouldQuoteColumn(index, header, isHeader);
413
+ // Check if quoting is needed (contains delimiter, quote, or newline)
414
+ const quoteRegex = new RegExp(`[${escapeRegex(delimiter)}${escapeRegex(quote)}\r\n]`);
415
+ const needsQuote = forceQuote || quoteRegex.test(str);
416
+ if (needsQuote) {
417
+ // Escape quotes
418
+ const escaped = str.replace(new RegExp(escapeRegex(quote), "g"), escape + quote);
419
+ return quote + escaped + quote;
420
+ }
421
+ return str;
422
+ };
423
+ const formatRow = (row, rowHeaders, isHeader = false) => {
424
+ return row
425
+ .map((value, index) => formatField(value, index, rowHeaders?.[index], isHeader))
426
+ .join(delimiter);
427
+ };
428
+ // Determine headers
429
+ let keys = null;
430
+ // Helper to apply transform if provided (sync only)
431
+ const applyTransform = (row) => {
432
+ if (transform) {
433
+ // Check if it's a sync transform (1 argument)
434
+ if (transform.length === 1) {
435
+ return transform(row);
436
+ }
437
+ // For async transform in sync context, just return the row unchanged
438
+ // Async transforms should use streaming API
439
+ return row;
440
+ }
441
+ return row;
442
+ };
443
+ // Handle array of objects
444
+ if (data.length > 0 && !Array.isArray(data[0])) {
445
+ const objects = data;
446
+ keys = headers === true ? Object.keys(objects[0]) : Array.isArray(headers) ? headers : null;
447
+ if (keys && shouldWriteHeaders) {
448
+ // Add header row
449
+ lines.push(formatRow(keys, keys, true));
450
+ }
451
+ // Add data rows
452
+ for (const obj of objects) {
453
+ const transformedObj = applyTransform(obj);
454
+ if (transformedObj === null || transformedObj === undefined) {
455
+ continue; // Skip row if transform returns null
456
+ }
457
+ const row = keys ? keys.map(key => transformedObj[key]) : Object.values(transformedObj);
458
+ lines.push(formatRow(row, keys ?? undefined));
459
+ }
460
+ }
461
+ else if (data.length > 0) {
462
+ // Handle 2D array with data
463
+ const arrays = data;
464
+ // Add custom headers if provided
465
+ if (Array.isArray(headers)) {
466
+ keys = headers;
467
+ if (shouldWriteHeaders) {
468
+ lines.push(formatRow(headers, headers, true));
469
+ }
470
+ }
471
+ for (const row of arrays) {
472
+ const transformedRow = applyTransform(row);
473
+ if (transformedRow === null || transformedRow === undefined) {
474
+ continue; // Skip row if transform returns null
475
+ }
476
+ lines.push(formatRow(transformedRow, keys ?? undefined));
477
+ }
478
+ }
479
+ else if (alwaysWriteHeaders && Array.isArray(headers) && shouldWriteHeaders) {
480
+ // Handle empty data with alwaysWriteHeaders
481
+ lines.push(formatRow(headers, headers, true));
482
+ }
483
+ let result = lines.join(rowDelimiter);
484
+ // Add trailing row delimiter
485
+ if (result.length > 0 && includeEndRowDelimiter) {
486
+ result += rowDelimiter;
487
+ }
488
+ // Add BOM for UTF-8
489
+ if (writeBOM) {
490
+ result = "\uFEFF" + result;
491
+ }
492
+ return result;
493
+ }
494
+ // =============================================================================
495
+ // Streaming Parser
496
+ // =============================================================================
497
+ /**
498
+ * Async CSV parser that yields rows one at a time
499
+ */
500
+ async function* parseCsvStream(input, options = {}) {
501
+ const { delimiter = ",", quote: quoteOption = '"', escape: escapeOption = '"', skipEmptyLines = false, ignoreEmpty = false, trim = false, ltrim = false, rtrim = false, headers = false, renameHeaders = false, comment, maxRows, skipLines = 0, skipRows = 0, strictColumnHandling = false, discardUnmappedColumns = false } = options;
502
+ const shouldSkipEmpty = skipEmptyLines || ignoreEmpty;
503
+ // Handle quote: null/false to disable quoting
504
+ const quoteEnabled = quoteOption !== null && quoteOption !== false;
505
+ const quote = quoteEnabled ? String(quoteOption) : "";
506
+ const escape = escapeOption !== null && escapeOption !== false ? String(escapeOption) : "";
507
+ let headerRow = null;
508
+ let headersLength = 0;
509
+ let useHeaders = false;
510
+ let headerRowProcessed = false;
511
+ let buffer = "";
512
+ let currentRow = [];
513
+ let currentField = "";
514
+ let inQuotes = false;
515
+ let lineNumber = 0;
516
+ let dataRowCount = 0;
517
+ let skippedDataRows = 0;
518
+ // Determine header mode
519
+ if (headers === true) {
520
+ useHeaders = true;
521
+ }
522
+ else if (Array.isArray(headers)) {
523
+ headerRow = headers;
524
+ headersLength = headers.filter(h => h !== null && h !== undefined).length;
525
+ validateUniqueHeaders(headers);
526
+ useHeaders = true;
527
+ if (!renameHeaders) {
528
+ headerRowProcessed = true;
529
+ }
530
+ }
531
+ else if (typeof headers === "function") {
532
+ useHeaders = true;
533
+ }
534
+ const processRow = (row) => {
535
+ // Header handling
536
+ if (useHeaders && !headerRowProcessed) {
537
+ if (typeof headers === "function") {
538
+ const transformed = headers(row);
539
+ validateUniqueHeaders(transformed);
540
+ headerRow = transformed;
541
+ }
542
+ else if (!Array.isArray(headers)) {
543
+ validateUniqueHeaders(row);
544
+ headerRow = row;
545
+ }
546
+ headersLength = headerRow.filter(h => h !== null && h !== undefined).length;
547
+ headerRowProcessed = true;
548
+ if (renameHeaders) {
549
+ return { valid: false, row: null };
550
+ }
551
+ if (headers === true || typeof headers === "function") {
552
+ return { valid: false, row: null };
553
+ }
554
+ return { valid: false, row: null };
555
+ }
556
+ // Skip data rows
557
+ if (skippedDataRows < skipRows) {
558
+ skippedDataRows++;
559
+ return { valid: false, row: null };
560
+ }
561
+ // Column validation
562
+ if (headerRow && headerRow.length > 0) {
563
+ const expectedCols = headersLength;
564
+ const actualCols = row.length;
565
+ if (actualCols > expectedCols) {
566
+ if (strictColumnHandling && !discardUnmappedColumns) {
567
+ return { valid: false, row: null };
568
+ }
569
+ else {
570
+ // Default: trim extra columns
571
+ row.length = headerRow.length;
572
+ }
573
+ }
574
+ else if (actualCols < expectedCols) {
575
+ if (strictColumnHandling) {
576
+ return { valid: false, row: null };
577
+ }
578
+ while (row.length < headerRow.length) {
579
+ row.push("");
580
+ }
581
+ }
582
+ }
583
+ // Convert to object if using headers
584
+ if (useHeaders && headerRow) {
585
+ const obj = {};
586
+ headerRow.forEach((header, index) => {
587
+ if (header !== null && header !== undefined) {
588
+ obj[header] = row[index] ?? "";
589
+ }
590
+ });
591
+ return { valid: true, row: obj };
592
+ }
593
+ return { valid: true, row };
594
+ };
595
+ const processBuffer = function* () {
596
+ let i = 0;
597
+ while (i < buffer.length) {
598
+ const char = buffer[i];
599
+ const nextChar = buffer[i + 1];
600
+ if (inQuotes && quoteEnabled) {
601
+ if (escape && char === escape && nextChar === quote) {
602
+ currentField += quote;
603
+ i += 2;
604
+ }
605
+ else if (char === quote) {
606
+ inQuotes = false;
607
+ i++;
608
+ }
609
+ else if (i === buffer.length - 1) {
610
+ buffer = buffer.slice(i);
611
+ return;
612
+ }
613
+ else {
614
+ currentField += char;
615
+ i++;
616
+ }
617
+ }
618
+ else {
619
+ if (quoteEnabled && char === quote && currentField === "") {
620
+ inQuotes = true;
621
+ i++;
622
+ }
623
+ else if (char === delimiter) {
624
+ currentRow.push(applyTrim(currentField, trim, ltrim, rtrim));
625
+ currentField = "";
626
+ i++;
627
+ }
628
+ else if (char === "\n" || char === "\r") {
629
+ if (char === "\r" && nextChar === "\n") {
630
+ i++;
631
+ }
632
+ currentRow.push(applyTrim(currentField, trim, ltrim, rtrim));
633
+ currentField = "";
634
+ lineNumber++;
635
+ if (lineNumber <= skipLines) {
636
+ currentRow = [];
637
+ i++;
638
+ continue;
639
+ }
640
+ if (comment && currentRow[0]?.startsWith(comment)) {
641
+ currentRow = [];
642
+ i++;
643
+ continue;
644
+ }
645
+ const isEmpty = currentRow.length === 1 && currentRow[0] === "";
646
+ if (shouldSkipEmpty && isEmpty) {
647
+ currentRow = [];
648
+ i++;
649
+ continue;
650
+ }
651
+ const result = processRow(currentRow);
652
+ if (result.valid && result.row) {
653
+ dataRowCount++;
654
+ if (maxRows !== undefined && dataRowCount > maxRows) {
655
+ return;
656
+ }
657
+ yield result.row;
658
+ }
659
+ currentRow = [];
660
+ i++;
661
+ }
662
+ else {
663
+ currentField += char;
664
+ i++;
665
+ }
666
+ }
667
+ }
668
+ buffer = "";
669
+ };
670
+ // Handle string input
671
+ if (typeof input === "string") {
672
+ buffer = input;
673
+ yield* processBuffer();
674
+ // Handle last row
675
+ if (currentField !== "" || currentRow.length > 0) {
676
+ currentRow.push(applyTrim(currentField, trim, ltrim, rtrim));
677
+ if (!(maxRows !== undefined && dataRowCount >= maxRows)) {
678
+ const result = processRow(currentRow);
679
+ if (result.valid && result.row) {
680
+ yield result.row;
681
+ }
682
+ }
683
+ }
684
+ return;
685
+ }
686
+ // Handle async iterable
687
+ for await (const chunk of input) {
688
+ buffer += chunk;
689
+ yield* processBuffer();
690
+ }
691
+ // Handle last row
692
+ if (currentField !== "" || currentRow.length > 0) {
693
+ currentRow.push(applyTrim(currentField, trim, ltrim, rtrim));
694
+ if (!(maxRows !== undefined && dataRowCount >= maxRows)) {
695
+ const result = processRow(currentRow);
696
+ if (result.valid && result.row) {
697
+ yield result.row;
698
+ }
699
+ }
700
+ }
701
+ }