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