@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,638 @@
1
+ /**
2
+ * CSV Streaming Support for Node.js
3
+ *
4
+ * Provides true streaming CSV parsing and formatting using Node.js streams.
5
+ * This enables processing of large CSV files without loading them entirely into memory.
6
+ */
7
+ import { Transform } from "stream";
8
+ import { isSyncTransform, isSyncValidate } from "./csv-core.js";
9
+ /**
10
+ * Transform stream that parses CSV data row by row
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * const parser = new CsvParserStream({ headers: true });
15
+ * fs.createReadStream('data.csv')
16
+ * .pipe(parser)
17
+ * .on('data', (row) => console.log(row));
18
+ * ```
19
+ */
20
+ export class CsvParserStream extends Transform {
21
+ constructor(options = {}) {
22
+ super({ objectMode: options.objectMode !== false });
23
+ this.buffer = "";
24
+ this.currentRow = [];
25
+ this.currentField = "";
26
+ this.inQuotes = false;
27
+ this.lineNumber = 0;
28
+ this.rowCount = 0;
29
+ this.skippedDataRows = 0;
30
+ this.headerRow = null;
31
+ this.headersEmitted = false;
32
+ this._rowTransform = null;
33
+ this._rowValidator = null;
34
+ this.options = options;
35
+ this.encoding = options.encoding ?? "utf8";
36
+ const quoteOption = options.quote ?? '"';
37
+ this.quoteEnabled = quoteOption !== null && quoteOption !== false;
38
+ this.quote = this.quoteEnabled ? String(quoteOption) : "";
39
+ const escapeOption = options.escape ?? '"';
40
+ this.escape =
41
+ escapeOption !== null && escapeOption !== false ? String(escapeOption) : this.quote;
42
+ this.delimiter = options.delimiter ?? ",";
43
+ }
44
+ /**
45
+ * Set a transform function to modify rows before emitting
46
+ * Supports both sync and async transforms
47
+ */
48
+ transform(transformFunction) {
49
+ if (typeof transformFunction !== "function") {
50
+ throw new TypeError("The transform should be a function");
51
+ }
52
+ if (isSyncTransform(transformFunction)) {
53
+ this._rowTransform = (row, cb) => {
54
+ try {
55
+ const result = transformFunction(row);
56
+ cb(null, result);
57
+ }
58
+ catch (e) {
59
+ cb(e);
60
+ }
61
+ };
62
+ }
63
+ else {
64
+ this._rowTransform = transformFunction;
65
+ }
66
+ return this;
67
+ }
68
+ /**
69
+ * Set a validate function to filter rows
70
+ * Invalid rows emit 'data-invalid' event
71
+ */
72
+ validate(validateFunction) {
73
+ if (typeof validateFunction !== "function") {
74
+ throw new TypeError("The validate should be a function");
75
+ }
76
+ if (isSyncValidate(validateFunction)) {
77
+ this._rowValidator = (row, cb) => {
78
+ try {
79
+ const isValid = validateFunction(row);
80
+ cb(null, isValid);
81
+ }
82
+ catch (e) {
83
+ cb(e);
84
+ }
85
+ };
86
+ }
87
+ else {
88
+ this._rowValidator = validateFunction;
89
+ }
90
+ return this;
91
+ }
92
+ _transform(chunk, encoding, callback) {
93
+ try {
94
+ const data = typeof chunk === "string" ? chunk : chunk.toString(this.encoding);
95
+ this.buffer += data;
96
+ this.processBuffer(callback);
97
+ }
98
+ catch (error) {
99
+ callback(error);
100
+ }
101
+ }
102
+ _flush(callback) {
103
+ try {
104
+ // Process any remaining data
105
+ if (this.currentField !== "" || this.currentRow.length > 0) {
106
+ const { trim = false, ltrim = false, rtrim = false } = this.options;
107
+ this.currentRow.push(this.applyTrim(this.currentField, trim, ltrim, rtrim));
108
+ this.emitRow(callback);
109
+ }
110
+ else {
111
+ callback();
112
+ }
113
+ }
114
+ catch (error) {
115
+ callback(error);
116
+ }
117
+ }
118
+ applyTrim(field, trim, ltrim, rtrim) {
119
+ if (trim) {
120
+ return field.trim();
121
+ }
122
+ let result = field;
123
+ if (ltrim) {
124
+ result = result.trimStart();
125
+ }
126
+ if (rtrim) {
127
+ result = result.trimEnd();
128
+ }
129
+ return result;
130
+ }
131
+ processBuffer(callback) {
132
+ const { skipEmptyLines = false, ignoreEmpty = false, trim = false, ltrim = false, rtrim = false, headers = false, renameHeaders = false, comment, maxRows, skipLines = 0, skipRows = 0, strictColumnHandling = false, discardUnmappedColumns = false } = this.options;
133
+ const shouldSkipEmpty = skipEmptyLines || ignoreEmpty;
134
+ let i = 0;
135
+ const pendingRows = [];
136
+ while (i < this.buffer.length) {
137
+ const char = this.buffer[i];
138
+ const nextChar = this.buffer[i + 1];
139
+ if (this.inQuotes && this.quoteEnabled) {
140
+ if (this.escape && char === this.escape && nextChar === this.quote) {
141
+ this.currentField += this.quote;
142
+ i += 2;
143
+ }
144
+ else if (char === this.quote) {
145
+ this.inQuotes = false;
146
+ i++;
147
+ }
148
+ else if (i === this.buffer.length - 1) {
149
+ // Need more data - preserve buffer from current position
150
+ this.buffer = this.buffer.slice(i);
151
+ this.processPendingRows(pendingRows, callback);
152
+ return;
153
+ }
154
+ else {
155
+ this.currentField += char;
156
+ i++;
157
+ }
158
+ }
159
+ else {
160
+ if (this.quoteEnabled && char === this.quote && this.currentField === "") {
161
+ this.inQuotes = true;
162
+ i++;
163
+ }
164
+ else if (char === this.delimiter) {
165
+ this.currentRow.push(this.applyTrim(this.currentField, trim, ltrim, rtrim));
166
+ this.currentField = "";
167
+ i++;
168
+ }
169
+ else if (char === "\n" || char === "\r") {
170
+ // Handle \r\n
171
+ if (char === "\r" && nextChar === "\n") {
172
+ i++;
173
+ }
174
+ this.currentRow.push(this.applyTrim(this.currentField, trim, ltrim, rtrim));
175
+ this.currentField = "";
176
+ this.lineNumber++;
177
+ // Skip lines at beginning
178
+ if (this.lineNumber <= skipLines) {
179
+ this.currentRow = [];
180
+ i++;
181
+ continue;
182
+ }
183
+ // Skip comment lines
184
+ if (comment && this.currentRow[0]?.startsWith(comment)) {
185
+ this.currentRow = [];
186
+ i++;
187
+ continue;
188
+ }
189
+ // Skip empty lines
190
+ const isEmpty = this.currentRow.length === 1 && this.currentRow[0] === "";
191
+ if (shouldSkipEmpty && isEmpty) {
192
+ this.currentRow = [];
193
+ i++;
194
+ continue;
195
+ }
196
+ // Handle headers
197
+ if ((headers === true ||
198
+ typeof headers === "function" ||
199
+ (Array.isArray(headers) && renameHeaders)) &&
200
+ this.headerRow === null) {
201
+ if (typeof headers === "function") {
202
+ const transformed = headers(this.currentRow);
203
+ this.headerRow = transformed.filter((h) => h != null);
204
+ }
205
+ else if (Array.isArray(headers) && renameHeaders) {
206
+ // Discard first row, use provided headers
207
+ this.headerRow = headers.filter((h) => h != null);
208
+ }
209
+ else {
210
+ this.headerRow = this.currentRow;
211
+ }
212
+ // Emit headers event
213
+ if (!this.headersEmitted) {
214
+ this.headersEmitted = true;
215
+ this.emit("headers", this.headerRow);
216
+ }
217
+ this.currentRow = [];
218
+ i++;
219
+ continue;
220
+ }
221
+ // Use provided headers array directly if no renameHeaders
222
+ if (Array.isArray(headers) && !renameHeaders && this.headerRow === null) {
223
+ this.headerRow = headers.filter((h) => h != null);
224
+ // Emit headers event for provided headers
225
+ if (!this.headersEmitted) {
226
+ this.headersEmitted = true;
227
+ this.emit("headers", this.headerRow);
228
+ }
229
+ }
230
+ // Skip data rows
231
+ if (this.skippedDataRows < skipRows) {
232
+ this.skippedDataRows++;
233
+ this.currentRow = [];
234
+ i++;
235
+ continue;
236
+ }
237
+ // Column validation
238
+ if (this.headerRow && this.headerRow.length > 0) {
239
+ const expectedCols = this.headerRow.length;
240
+ const actualCols = this.currentRow.length;
241
+ if (actualCols > expectedCols) {
242
+ if (strictColumnHandling && !discardUnmappedColumns) {
243
+ // Emit data-invalid event
244
+ this.emit("data-invalid", this.currentRow, `Column mismatch: expected ${expectedCols}, got ${actualCols}`);
245
+ this.currentRow = [];
246
+ i++;
247
+ continue;
248
+ }
249
+ else {
250
+ // Discard extra columns
251
+ this.currentRow.length = expectedCols;
252
+ }
253
+ }
254
+ else if (actualCols < expectedCols) {
255
+ if (strictColumnHandling) {
256
+ this.emit("data-invalid", this.currentRow, `Column mismatch: expected ${expectedCols}, got ${actualCols}`);
257
+ this.currentRow = [];
258
+ i++;
259
+ continue;
260
+ }
261
+ // Pad with empty strings
262
+ while (this.currentRow.length < expectedCols) {
263
+ this.currentRow.push("");
264
+ }
265
+ }
266
+ }
267
+ this.rowCount++;
268
+ // Check max rows
269
+ if (maxRows !== undefined && this.rowCount > maxRows) {
270
+ this.buffer = "";
271
+ this.processPendingRows(pendingRows, callback);
272
+ return;
273
+ }
274
+ // Queue this row for emission
275
+ const rowToEmit = this.currentRow;
276
+ this.currentRow = [];
277
+ pendingRows.push({
278
+ row: this.buildRow(rowToEmit),
279
+ callback: () => { }
280
+ });
281
+ i++;
282
+ }
283
+ else {
284
+ this.currentField += char;
285
+ i++;
286
+ }
287
+ }
288
+ }
289
+ this.buffer = "";
290
+ this.processPendingRows(pendingRows, callback);
291
+ }
292
+ buildRow(rawRow) {
293
+ if (this.options.headers && this.headerRow) {
294
+ const obj = {};
295
+ this.headerRow.forEach((header, index) => {
296
+ obj[header] = rawRow[index] ?? "";
297
+ });
298
+ return obj;
299
+ }
300
+ return rawRow;
301
+ }
302
+ processPendingRows(rows, callback) {
303
+ if (rows.length === 0) {
304
+ callback();
305
+ return;
306
+ }
307
+ let index = 0;
308
+ const processNext = () => {
309
+ if (index >= rows.length) {
310
+ callback();
311
+ return;
312
+ }
313
+ const { row } = rows[index];
314
+ index++;
315
+ this.transformAndValidateRow(row, (err, result) => {
316
+ if (err) {
317
+ callback(err);
318
+ return;
319
+ }
320
+ if (result && result.isValid && result.row !== null) {
321
+ // Push the row (respect objectMode)
322
+ if (this.options.objectMode === false) {
323
+ this.push(JSON.stringify(result.row));
324
+ }
325
+ else {
326
+ this.push(result.row);
327
+ }
328
+ }
329
+ else if (result && !result.isValid) {
330
+ this.emit("data-invalid", result.row, result.reason);
331
+ }
332
+ // Use setImmediate to prevent stack overflow for large datasets
333
+ if (index % 1000 === 0) {
334
+ setImmediate(processNext);
335
+ }
336
+ else {
337
+ processNext();
338
+ }
339
+ });
340
+ };
341
+ processNext();
342
+ }
343
+ transformAndValidateRow(row, callback) {
344
+ // First apply transform
345
+ if (this._rowTransform) {
346
+ this._rowTransform(row, (transformErr, transformedRow) => {
347
+ if (transformErr) {
348
+ callback(transformErr);
349
+ return;
350
+ }
351
+ if (transformedRow === null || transformedRow === undefined) {
352
+ callback(null, { row: null, isValid: true });
353
+ return;
354
+ }
355
+ // Then validate
356
+ this.validateRow(transformedRow, callback);
357
+ });
358
+ }
359
+ else {
360
+ this.validateRow(row, callback);
361
+ }
362
+ }
363
+ validateRow(row, callback) {
364
+ if (this._rowValidator) {
365
+ this._rowValidator(row, (validateErr, isValid, reason) => {
366
+ if (validateErr) {
367
+ callback(validateErr);
368
+ return;
369
+ }
370
+ callback(null, { row, isValid: isValid ?? false, reason });
371
+ });
372
+ }
373
+ else {
374
+ callback(null, { row, isValid: true });
375
+ }
376
+ }
377
+ emitRow(callback) {
378
+ const row = this.buildRow(this.currentRow);
379
+ this.transformAndValidateRow(row, (err, result) => {
380
+ if (err) {
381
+ if (callback) {
382
+ callback(err);
383
+ }
384
+ return;
385
+ }
386
+ if (result && result.isValid && result.row !== null) {
387
+ if (this.options.objectMode === false) {
388
+ this.push(JSON.stringify(result.row));
389
+ }
390
+ else {
391
+ this.push(result.row);
392
+ }
393
+ }
394
+ else if (result && !result.isValid) {
395
+ this.emit("data-invalid", result.row, result.reason);
396
+ }
397
+ if (callback) {
398
+ callback();
399
+ }
400
+ });
401
+ }
402
+ }
403
+ /**
404
+ * Transform stream that formats rows to CSV
405
+ *
406
+ * @example
407
+ * ```ts
408
+ * const formatter = new CsvFormatterStream({ headers: ['name', 'age'] });
409
+ * formatter.pipe(fs.createWriteStream('output.csv'));
410
+ * formatter.write(['Alice', 30]);
411
+ * formatter.write(['Bob', 25]);
412
+ * formatter.end();
413
+ * ```
414
+ */
415
+ export class CsvFormatterStream extends Transform {
416
+ constructor(options = {}) {
417
+ super({
418
+ objectMode: options.objectMode !== false,
419
+ writableObjectMode: options.objectMode !== false
420
+ });
421
+ this.headerWritten = false;
422
+ this.headers = null;
423
+ this.rowCount = 0;
424
+ this._rowTransform = null;
425
+ this.options = options;
426
+ const quoteOption = options.quote ?? '"';
427
+ this.quoteEnabled = quoteOption !== null && quoteOption !== false;
428
+ this.quote = this.quoteEnabled ? String(quoteOption) : "";
429
+ const escapeOption = options.escape;
430
+ this.escape =
431
+ escapeOption !== undefined && escapeOption !== null && escapeOption !== false
432
+ ? String(escapeOption)
433
+ : this.quote;
434
+ this.delimiter = options.delimiter ?? ",";
435
+ this.rowDelimiter = options.rowDelimiter ?? "\n";
436
+ this.alwaysQuote = options.alwaysQuote ?? false;
437
+ // writeHeaders defaults to true when headers is provided
438
+ this.shouldWriteHeaders = options.writeHeaders ?? true;
439
+ if (Array.isArray(options.headers)) {
440
+ this.headers = options.headers;
441
+ }
442
+ // Set up transform from options
443
+ if (options.transform) {
444
+ this.transform(options.transform);
445
+ }
446
+ }
447
+ /**
448
+ * Set a transform function to modify rows before formatting
449
+ */
450
+ transform(transformFunction) {
451
+ if (typeof transformFunction !== "function") {
452
+ throw new TypeError("The transform should be a function");
453
+ }
454
+ if (isSyncTransform(transformFunction)) {
455
+ this._rowTransform = (row, cb) => {
456
+ try {
457
+ const result = transformFunction(row);
458
+ cb(null, result);
459
+ }
460
+ catch (e) {
461
+ cb(e);
462
+ }
463
+ };
464
+ }
465
+ else {
466
+ this._rowTransform = transformFunction;
467
+ }
468
+ return this;
469
+ }
470
+ _transform(chunk, encoding, callback) {
471
+ try {
472
+ // Write BOM if first chunk
473
+ if (!this.headerWritten && this.options.writeBOM) {
474
+ this.push("\uFEFF");
475
+ }
476
+ // Write headers if needed
477
+ if (!this.headerWritten && this.headers && this.shouldWriteHeaders) {
478
+ this.push(this.formatRow(this.headers, true));
479
+ this.headerWritten = true;
480
+ }
481
+ else if (!this.headerWritten &&
482
+ this.options.headers === true &&
483
+ !Array.isArray(chunk) &&
484
+ this.shouldWriteHeaders) {
485
+ // Auto-detect headers from first object
486
+ this.headers = Object.keys(chunk);
487
+ this.push(this.formatRow(this.headers, true));
488
+ this.headerWritten = true;
489
+ }
490
+ else if (!this.headerWritten) {
491
+ // Mark header as "written" even if we skip it (to handle subsequent rows)
492
+ if (this.options.headers === true && !Array.isArray(chunk)) {
493
+ this.headers = Object.keys(chunk);
494
+ }
495
+ this.headerWritten = true;
496
+ }
497
+ // Apply transform if set
498
+ if (this._rowTransform) {
499
+ this._rowTransform(chunk, (err, transformedRow) => {
500
+ if (err) {
501
+ callback(err);
502
+ return;
503
+ }
504
+ if (transformedRow === null || transformedRow === undefined) {
505
+ callback();
506
+ return;
507
+ }
508
+ this.formatAndPush(transformedRow);
509
+ callback();
510
+ });
511
+ }
512
+ else {
513
+ this.formatAndPush(chunk);
514
+ callback();
515
+ }
516
+ }
517
+ catch (error) {
518
+ callback(error);
519
+ }
520
+ }
521
+ _flush(callback) {
522
+ // Handle alwaysWriteHeaders with no data
523
+ if (!this.headerWritten &&
524
+ this.options.alwaysWriteHeaders &&
525
+ this.headers &&
526
+ this.shouldWriteHeaders) {
527
+ if (this.options.writeBOM) {
528
+ this.push("\uFEFF");
529
+ }
530
+ this.push(this.formatRow(this.headers, true));
531
+ this.headerWritten = true;
532
+ }
533
+ // Add trailing row delimiter if includeEndRowDelimiter is true
534
+ if (this.options.includeEndRowDelimiter && this.rowCount > 0) {
535
+ this.push(this.rowDelimiter);
536
+ }
537
+ callback();
538
+ }
539
+ formatAndPush(chunk) {
540
+ let row;
541
+ if (Array.isArray(chunk)) {
542
+ row = chunk;
543
+ }
544
+ else if (typeof chunk === "object" && chunk !== null) {
545
+ row = this.headers ? this.headers.map(h => chunk[h]) : Object.values(chunk);
546
+ }
547
+ else {
548
+ row = [chunk];
549
+ }
550
+ this.push(this.formatRow(row, false));
551
+ }
552
+ formatRow(row, isHeader = false) {
553
+ const { quoteColumns, quoteHeaders } = this.options;
554
+ const quoteConfig = isHeader ? quoteHeaders : quoteColumns;
555
+ const fields = row.map((field, index) => {
556
+ const headerName = this.headers?.[index];
557
+ const shouldForceQuote = this.shouldQuoteField(index, headerName, quoteConfig);
558
+ return this.formatField(field, shouldForceQuote);
559
+ });
560
+ const formattedRow = fields.join(this.delimiter);
561
+ // Use row delimiter as prefix (except for first row)
562
+ // rowDelimiter separates rows, no trailing delimiter by default
563
+ if (this.rowCount === 0) {
564
+ this.rowCount++;
565
+ return formattedRow;
566
+ }
567
+ this.rowCount++;
568
+ return this.rowDelimiter + formattedRow;
569
+ }
570
+ shouldQuoteField(index, header, quoteConfig) {
571
+ if (quoteConfig === true) {
572
+ return true;
573
+ }
574
+ if (quoteConfig === false || quoteConfig === undefined) {
575
+ return false;
576
+ }
577
+ if (Array.isArray(quoteConfig)) {
578
+ return quoteConfig[index] === true;
579
+ }
580
+ if (typeof quoteConfig === "object" && header) {
581
+ return quoteConfig[header] === true;
582
+ }
583
+ return false;
584
+ }
585
+ formatField(value, forceQuote = false) {
586
+ if (value === null || value === undefined) {
587
+ return "";
588
+ }
589
+ const str = String(value);
590
+ if (!this.quoteEnabled) {
591
+ return str;
592
+ }
593
+ // Check if quoting is needed
594
+ const needsQuote = this.alwaysQuote ||
595
+ forceQuote ||
596
+ str.includes(this.delimiter) ||
597
+ str.includes(this.quote) ||
598
+ str.includes("\r") ||
599
+ str.includes("\n");
600
+ if (needsQuote) {
601
+ const escaped = str.replace(new RegExp(escapeRegex(this.quote), "g"), this.escape + this.quote);
602
+ return this.quote + escaped + this.quote;
603
+ }
604
+ return str;
605
+ }
606
+ }
607
+ /**
608
+ * Escape special regex characters
609
+ */
610
+ function escapeRegex(str) {
611
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
612
+ }
613
+ /**
614
+ * Create a readable stream from an array of rows
615
+ */
616
+ export function createCsvReadableStream(rows, options = {}) {
617
+ const formatter = new CsvFormatterStream(options);
618
+ // Use setImmediate to allow piping before data flows
619
+ setImmediate(() => {
620
+ for (const row of rows) {
621
+ formatter.write(row);
622
+ }
623
+ formatter.end();
624
+ });
625
+ return formatter;
626
+ }
627
+ /**
628
+ * Create parser stream factory
629
+ */
630
+ export function createCsvParserStream(options = {}) {
631
+ return new CsvParserStream(options);
632
+ }
633
+ /**
634
+ * Create formatter stream factory
635
+ */
636
+ export function createCsvFormatterStream(options = {}) {
637
+ return new CsvFormatterStream(options);
638
+ }