@cj-tech-master/excelts 1.6.3-canary.20251224124621.73c5d94 → 1.6.3

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 (376) hide show
  1. package/README.md +18 -31
  2. package/README_zh.md +19 -31
  3. package/dist/browser/excelts.iife.js +40910 -7518
  4. package/dist/browser/excelts.iife.js.map +1 -1
  5. package/dist/browser/excelts.iife.min.js +105 -25
  6. package/dist/cjs/csv/csv.js +162 -226
  7. package/dist/cjs/doc/anchor.js +2 -2
  8. package/dist/cjs/doc/cell.js +22 -22
  9. package/dist/cjs/doc/column.js +7 -7
  10. package/dist/cjs/doc/data-validations.js +3 -3
  11. package/dist/cjs/doc/defined-names.js +13 -13
  12. package/dist/cjs/doc/image.js +7 -7
  13. package/dist/cjs/doc/modelcontainer.js +2 -2
  14. package/dist/cjs/doc/note.js +2 -2
  15. package/dist/cjs/doc/pivot-table.js +5 -5
  16. package/dist/cjs/doc/range.js +11 -11
  17. package/dist/cjs/doc/row.js +16 -16
  18. package/dist/cjs/doc/table.js +5 -5
  19. package/dist/cjs/doc/workbook.js +179 -68
  20. package/dist/cjs/doc/worksheet.js +41 -41
  21. package/dist/cjs/index.js +32 -49
  22. package/dist/cjs/stream/xlsx/hyperlink-reader.js +6 -6
  23. package/dist/cjs/stream/xlsx/sheet-comments-writer.js +12 -12
  24. package/dist/cjs/stream/xlsx/sheet-rels-writer.js +4 -4
  25. package/dist/cjs/stream/xlsx/workbook-reader.js +22 -22
  26. package/dist/cjs/stream/xlsx/workbook-writer.js +34 -34
  27. package/dist/cjs/stream/xlsx/worksheet-reader.js +17 -17
  28. package/dist/cjs/stream/xlsx/worksheet-writer.js +60 -60
  29. package/dist/cjs/utils/cell-format.js +2 -2
  30. package/dist/cjs/utils/cell-matrix.js +5 -5
  31. package/dist/cjs/utils/parse-sax.js +2 -2
  32. package/dist/cjs/utils/shared-formula.js +5 -5
  33. package/dist/cjs/utils/sheet-utils.js +13 -13
  34. package/dist/cjs/utils/stream-buf.js +5 -5
  35. package/dist/cjs/utils/unzip/extract.js +11 -11
  36. package/dist/cjs/utils/unzip/index.js +21 -21
  37. package/dist/cjs/utils/unzip/parse-extra-field.js +3 -3
  38. package/dist/cjs/utils/unzip/parse.js +16 -16
  39. package/dist/cjs/utils/unzip/zip-parser.js +3 -3
  40. package/dist/cjs/utils/utils.js +154 -46
  41. package/dist/cjs/utils/xml-stream.js +3 -3
  42. package/dist/cjs/utils/zip/compress.js +198 -18
  43. package/dist/cjs/utils/zip/index.js +17 -17
  44. package/dist/cjs/utils/zip/zip-builder.js +10 -10
  45. package/dist/cjs/utils/zip-stream.js +4 -4
  46. package/dist/cjs/xlsx/xform/base-xform.js +4 -4
  47. package/dist/cjs/xlsx/xform/book/defined-name-xform.js +4 -4
  48. package/dist/cjs/xlsx/xform/book/sheet-xform.js +4 -4
  49. package/dist/cjs/xlsx/xform/book/workbook-calc-properties-xform.js +2 -2
  50. package/dist/cjs/xlsx/xform/book/workbook-pivot-cache-xform.js +2 -2
  51. package/dist/cjs/xlsx/xform/book/workbook-properties-xform.js +2 -2
  52. package/dist/cjs/xlsx/xform/book/workbook-view-xform.js +2 -2
  53. package/dist/cjs/xlsx/xform/book/workbook-xform.js +24 -24
  54. package/dist/cjs/xlsx/xform/comment/comment-xform.js +4 -4
  55. package/dist/cjs/xlsx/xform/comment/comments-xform.js +6 -6
  56. package/dist/cjs/xlsx/xform/comment/style/vml-position-xform.js +2 -2
  57. package/dist/cjs/xlsx/xform/comment/style/vml-protection-xform.js +2 -2
  58. package/dist/cjs/xlsx/xform/comment/vml-anchor-xform.js +2 -2
  59. package/dist/cjs/xlsx/xform/comment/vml-client-data-xform.js +10 -10
  60. package/dist/cjs/xlsx/xform/comment/vml-notes-xform.js +6 -6
  61. package/dist/cjs/xlsx/xform/comment/vml-shape-xform.js +6 -6
  62. package/dist/cjs/xlsx/xform/comment/vml-textbox-xform.js +2 -2
  63. package/dist/cjs/xlsx/xform/composite-xform.js +2 -2
  64. package/dist/cjs/xlsx/xform/core/app-heading-pairs-xform.js +2 -2
  65. package/dist/cjs/xlsx/xform/core/app-titles-of-parts-xform.js +2 -2
  66. package/dist/cjs/xlsx/xform/core/app-xform.js +11 -11
  67. package/dist/cjs/xlsx/xform/core/content-types-xform.js +4 -4
  68. package/dist/cjs/xlsx/xform/core/core-xform.js +23 -23
  69. package/dist/cjs/xlsx/xform/core/relationship-xform.js +2 -2
  70. package/dist/cjs/xlsx/xform/core/relationships-xform.js +6 -6
  71. package/dist/cjs/xlsx/xform/drawing/base-cell-anchor-xform.js +2 -2
  72. package/dist/cjs/xlsx/xform/drawing/blip-fill-xform.js +4 -4
  73. package/dist/cjs/xlsx/xform/drawing/blip-xform.js +2 -2
  74. package/dist/cjs/xlsx/xform/drawing/c-nv-pic-pr-xform.js +2 -2
  75. package/dist/cjs/xlsx/xform/drawing/c-nv-pr-xform.js +6 -6
  76. package/dist/cjs/xlsx/xform/drawing/cell-position-xform.js +7 -7
  77. package/dist/cjs/xlsx/xform/drawing/drawing-xform.js +10 -10
  78. package/dist/cjs/xlsx/xform/drawing/ext-lst-xform.js +2 -2
  79. package/dist/cjs/xlsx/xform/drawing/ext-xform.js +2 -2
  80. package/dist/cjs/xlsx/xform/drawing/hlink-click-xform.js +2 -2
  81. package/dist/cjs/xlsx/xform/drawing/nv-pic-pr-xform.js +6 -6
  82. package/dist/cjs/xlsx/xform/drawing/one-cell-anchor-xform.js +10 -10
  83. package/dist/cjs/xlsx/xform/drawing/pic-xform.js +9 -9
  84. package/dist/cjs/xlsx/xform/drawing/two-cell-anchor-xform.js +9 -9
  85. package/dist/cjs/xlsx/xform/list-xform.js +2 -2
  86. package/dist/cjs/xlsx/xform/pivot-table/cache-field-xform.js +5 -5
  87. package/dist/cjs/xlsx/xform/pivot-table/cache-field.js +3 -3
  88. package/dist/cjs/xlsx/xform/pivot-table/pivot-cache-definition-xform.js +10 -10
  89. package/dist/cjs/xlsx/xform/pivot-table/pivot-cache-records-xform.js +9 -9
  90. package/dist/cjs/xlsx/xform/pivot-table/pivot-table-xform.js +11 -10
  91. package/dist/cjs/xlsx/xform/sheet/auto-filter-xform.js +4 -4
  92. package/dist/cjs/xlsx/xform/sheet/cell-xform.js +65 -65
  93. package/dist/cjs/xlsx/xform/sheet/cf/cf-rule-xform.js +27 -27
  94. package/dist/cjs/xlsx/xform/sheet/cf/cfvo-xform.js +3 -3
  95. package/dist/cjs/xlsx/xform/sheet/cf/color-scale-xform.js +6 -6
  96. package/dist/cjs/xlsx/xform/sheet/cf/conditional-formatting-xform.js +6 -6
  97. package/dist/cjs/xlsx/xform/sheet/cf/conditional-formattings-xform.js +4 -4
  98. package/dist/cjs/xlsx/xform/sheet/cf/databar-xform.js +6 -6
  99. package/dist/cjs/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +5 -5
  100. package/dist/cjs/xlsx/xform/sheet/cf/formula-xform.js +2 -2
  101. package/dist/cjs/xlsx/xform/sheet/cf/icon-set-xform.js +11 -11
  102. package/dist/cjs/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +3 -3
  103. package/dist/cjs/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +12 -11
  104. package/dist/cjs/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +4 -4
  105. package/dist/cjs/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +8 -8
  106. package/dist/cjs/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +6 -6
  107. package/dist/cjs/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +26 -26
  108. package/dist/cjs/xlsx/xform/sheet/cf-ext/f-ext-xform.js +2 -2
  109. package/dist/cjs/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +14 -14
  110. package/dist/cjs/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +2 -2
  111. package/dist/cjs/xlsx/xform/sheet/col-xform.js +6 -6
  112. package/dist/cjs/xlsx/xform/sheet/data-validations-xform.js +18 -18
  113. package/dist/cjs/xlsx/xform/sheet/dimension-xform.js +2 -2
  114. package/dist/cjs/xlsx/xform/sheet/drawing-xform.js +2 -2
  115. package/dist/cjs/xlsx/xform/sheet/ext-lst-xform.js +5 -5
  116. package/dist/cjs/xlsx/xform/sheet/header-footer-xform.js +2 -2
  117. package/dist/cjs/xlsx/xform/sheet/hyperlink-xform.js +2 -2
  118. package/dist/cjs/xlsx/xform/sheet/merge-cell-xform.js +2 -2
  119. package/dist/cjs/xlsx/xform/sheet/merges.js +8 -8
  120. package/dist/cjs/xlsx/xform/sheet/outline-properties-xform.js +2 -2
  121. package/dist/cjs/xlsx/xform/sheet/page-breaks-xform.js +2 -2
  122. package/dist/cjs/xlsx/xform/sheet/page-margins-xform.js +2 -2
  123. package/dist/cjs/xlsx/xform/sheet/page-setup-properties-xform.js +2 -2
  124. package/dist/cjs/xlsx/xform/sheet/page-setup-xform.js +2 -2
  125. package/dist/cjs/xlsx/xform/sheet/picture-xform.js +2 -2
  126. package/dist/cjs/xlsx/xform/sheet/print-options-xform.js +2 -2
  127. package/dist/cjs/xlsx/xform/sheet/row-breaks-xform.js +4 -4
  128. package/dist/cjs/xlsx/xform/sheet/row-xform.js +11 -11
  129. package/dist/cjs/xlsx/xform/sheet/sheet-format-properties-xform.js +2 -2
  130. package/dist/cjs/xlsx/xform/sheet/sheet-properties-xform.js +8 -8
  131. package/dist/cjs/xlsx/xform/sheet/sheet-protection-xform.js +2 -2
  132. package/dist/cjs/xlsx/xform/sheet/sheet-view-xform.js +4 -4
  133. package/dist/cjs/xlsx/xform/sheet/table-part-xform.js +2 -2
  134. package/dist/cjs/xlsx/xform/sheet/worksheet-xform.js +68 -68
  135. package/dist/cjs/xlsx/xform/simple/boolean-xform.js +2 -2
  136. package/dist/cjs/xlsx/xform/simple/date-xform.js +2 -2
  137. package/dist/cjs/xlsx/xform/simple/float-xform.js +2 -2
  138. package/dist/cjs/xlsx/xform/simple/integer-xform.js +2 -2
  139. package/dist/cjs/xlsx/xform/simple/string-xform.js +2 -2
  140. package/dist/cjs/xlsx/xform/static-xform.js +4 -4
  141. package/dist/cjs/xlsx/xform/strings/phonetic-text-xform.js +6 -6
  142. package/dist/cjs/xlsx/xform/strings/rich-text-xform.js +6 -6
  143. package/dist/cjs/xlsx/xform/strings/shared-string-xform.js +8 -8
  144. package/dist/cjs/xlsx/xform/strings/shared-strings-xform.js +6 -6
  145. package/dist/cjs/xlsx/xform/strings/text-xform.js +2 -2
  146. package/dist/cjs/xlsx/xform/style/alignment-xform.js +8 -8
  147. package/dist/cjs/xlsx/xform/style/border-xform.js +8 -8
  148. package/dist/cjs/xlsx/xform/style/color-xform.js +2 -2
  149. package/dist/cjs/xlsx/xform/style/dxf-xform.js +14 -14
  150. package/dist/cjs/xlsx/xform/style/fill-xform.js +9 -9
  151. package/dist/cjs/xlsx/xform/style/font-xform.js +22 -22
  152. package/dist/cjs/xlsx/xform/style/numfmt-xform.js +5 -5
  153. package/dist/cjs/xlsx/xform/style/protection-xform.js +2 -2
  154. package/dist/cjs/xlsx/xform/style/style-xform.js +6 -6
  155. package/dist/cjs/xlsx/xform/style/styles-xform.js +39 -39
  156. package/dist/cjs/xlsx/xform/style/underline-xform.js +2 -2
  157. package/dist/cjs/xlsx/xform/table/auto-filter-xform.js +4 -4
  158. package/dist/cjs/xlsx/xform/table/custom-filter-xform.js +2 -2
  159. package/dist/cjs/xlsx/xform/table/filter-column-xform.js +9 -9
  160. package/dist/cjs/xlsx/xform/table/filter-xform.js +2 -2
  161. package/dist/cjs/xlsx/xform/table/table-column-xform.js +2 -2
  162. package/dist/cjs/xlsx/xform/table/table-style-info-xform.js +2 -2
  163. package/dist/cjs/xlsx/xform/table/table-xform.js +12 -12
  164. package/dist/cjs/xlsx/xlsx.js +833 -91
  165. package/dist/esm/csv/csv.js +159 -189
  166. package/dist/esm/doc/workbook.js +175 -64
  167. package/dist/esm/index.browser.js +1 -33
  168. package/dist/esm/index.js +8 -23
  169. package/dist/esm/local.js +1 -0
  170. package/dist/esm/utils/utils.js +123 -15
  171. package/dist/esm/utils/zip/compress.js +164 -16
  172. package/dist/esm/xlsx/xform/pivot-table/pivot-table-xform.js +3 -2
  173. package/dist/esm/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +3 -2
  174. package/dist/esm/xlsx/xlsx.js +829 -87
  175. package/dist/types/csv/csv.d.ts +71 -97
  176. package/dist/types/doc/anchor.d.ts +1 -1
  177. package/dist/types/doc/cell.d.ts +7 -7
  178. package/dist/types/doc/column.d.ts +3 -3
  179. package/dist/types/doc/defined-names.d.ts +4 -4
  180. package/dist/types/doc/image.d.ts +2 -2
  181. package/dist/types/doc/modelcontainer.d.ts +1 -1
  182. package/dist/types/doc/pivot-table.d.ts +1 -1
  183. package/dist/types/doc/range.d.ts +1 -1
  184. package/dist/types/doc/row.d.ts +3 -3
  185. package/dist/types/doc/table.d.ts +2 -2
  186. package/dist/types/doc/workbook.d.ts +92 -62
  187. package/dist/types/doc/worksheet.d.ts +10 -10
  188. package/dist/types/index.browser.d.ts +5 -19
  189. package/dist/types/index.d.ts +23 -24
  190. package/dist/types/local.d.ts +1 -0
  191. package/dist/types/stream/xlsx/hyperlink-reader.d.ts +1 -1
  192. package/dist/types/stream/xlsx/workbook-reader.d.ts +4 -4
  193. package/dist/types/stream/xlsx/workbook-writer.d.ts +6 -6
  194. package/dist/types/stream/xlsx/worksheet-reader.d.ts +5 -5
  195. package/dist/types/stream/xlsx/worksheet-writer.d.ts +9 -9
  196. package/dist/types/utils/col-cache.d.ts +1 -1
  197. package/dist/types/utils/sheet-utils.d.ts +3 -3
  198. package/dist/types/utils/unzip/extract.d.ts +6 -6
  199. package/dist/types/utils/unzip/index.d.ts +8 -8
  200. package/dist/types/utils/unzip/parse.d.ts +3 -3
  201. package/dist/types/utils/utils.d.ts +25 -6
  202. package/dist/types/utils/zip/compress.d.ts +45 -13
  203. package/dist/types/utils/zip/index.d.ts +5 -5
  204. package/dist/types/utils/zip/zip-builder.d.ts +1 -1
  205. package/dist/types/xlsx/xform/base-xform.d.ts +1 -1
  206. package/dist/types/xlsx/xform/book/defined-name-xform.d.ts +1 -1
  207. package/dist/types/xlsx/xform/book/sheet-xform.d.ts +1 -1
  208. package/dist/types/xlsx/xform/book/workbook-calc-properties-xform.d.ts +1 -1
  209. package/dist/types/xlsx/xform/book/workbook-pivot-cache-xform.d.ts +1 -1
  210. package/dist/types/xlsx/xform/book/workbook-properties-xform.d.ts +1 -1
  211. package/dist/types/xlsx/xform/book/workbook-view-xform.d.ts +1 -1
  212. package/dist/types/xlsx/xform/book/workbook-xform.d.ts +2 -2
  213. package/dist/types/xlsx/xform/comment/comment-xform.d.ts +2 -2
  214. package/dist/types/xlsx/xform/comment/comments-xform.d.ts +2 -2
  215. package/dist/types/xlsx/xform/comment/style/vml-position-xform.d.ts +1 -1
  216. package/dist/types/xlsx/xform/comment/style/vml-protection-xform.d.ts +1 -1
  217. package/dist/types/xlsx/xform/comment/vml-anchor-xform.d.ts +1 -1
  218. package/dist/types/xlsx/xform/comment/vml-client-data-xform.d.ts +1 -1
  219. package/dist/types/xlsx/xform/comment/vml-notes-xform.d.ts +1 -1
  220. package/dist/types/xlsx/xform/comment/vml-shape-xform.d.ts +1 -1
  221. package/dist/types/xlsx/xform/comment/vml-textbox-xform.d.ts +1 -1
  222. package/dist/types/xlsx/xform/composite-xform.d.ts +1 -1
  223. package/dist/types/xlsx/xform/core/app-heading-pairs-xform.d.ts +1 -1
  224. package/dist/types/xlsx/xform/core/app-titles-of-parts-xform.d.ts +1 -1
  225. package/dist/types/xlsx/xform/core/app-xform.d.ts +1 -1
  226. package/dist/types/xlsx/xform/core/content-types-xform.d.ts +1 -1
  227. package/dist/types/xlsx/xform/core/core-xform.d.ts +1 -1
  228. package/dist/types/xlsx/xform/core/relationship-xform.d.ts +1 -1
  229. package/dist/types/xlsx/xform/core/relationships-xform.d.ts +1 -1
  230. package/dist/types/xlsx/xform/drawing/base-cell-anchor-xform.d.ts +1 -1
  231. package/dist/types/xlsx/xform/drawing/blip-fill-xform.d.ts +2 -2
  232. package/dist/types/xlsx/xform/drawing/blip-xform.d.ts +1 -1
  233. package/dist/types/xlsx/xform/drawing/c-nv-pic-pr-xform.d.ts +1 -1
  234. package/dist/types/xlsx/xform/drawing/c-nv-pr-xform.d.ts +1 -1
  235. package/dist/types/xlsx/xform/drawing/cell-position-xform.d.ts +2 -2
  236. package/dist/types/xlsx/xform/drawing/drawing-xform.d.ts +1 -1
  237. package/dist/types/xlsx/xform/drawing/ext-lst-xform.d.ts +1 -1
  238. package/dist/types/xlsx/xform/drawing/ext-xform.d.ts +1 -1
  239. package/dist/types/xlsx/xform/drawing/hlink-click-xform.d.ts +1 -1
  240. package/dist/types/xlsx/xform/drawing/nv-pic-pr-xform.d.ts +1 -1
  241. package/dist/types/xlsx/xform/drawing/one-cell-anchor-xform.d.ts +1 -1
  242. package/dist/types/xlsx/xform/drawing/pic-xform.d.ts +1 -1
  243. package/dist/types/xlsx/xform/drawing/two-cell-anchor-xform.d.ts +1 -1
  244. package/dist/types/xlsx/xform/list-xform.d.ts +1 -1
  245. package/dist/types/xlsx/xform/pivot-table/cache-field-xform.d.ts +1 -1
  246. package/dist/types/xlsx/xform/pivot-table/pivot-cache-definition-xform.d.ts +3 -3
  247. package/dist/types/xlsx/xform/pivot-table/pivot-cache-records-xform.d.ts +2 -2
  248. package/dist/types/xlsx/xform/pivot-table/pivot-table-xform.d.ts +1 -1
  249. package/dist/types/xlsx/xform/sheet/auto-filter-xform.d.ts +1 -1
  250. package/dist/types/xlsx/xform/sheet/cell-xform.d.ts +1 -1
  251. package/dist/types/xlsx/xform/sheet/cf/cf-rule-xform.d.ts +6 -6
  252. package/dist/types/xlsx/xform/sheet/cf/cfvo-xform.d.ts +1 -1
  253. package/dist/types/xlsx/xform/sheet/cf/color-scale-xform.d.ts +3 -3
  254. package/dist/types/xlsx/xform/sheet/cf/conditional-formatting-xform.d.ts +1 -1
  255. package/dist/types/xlsx/xform/sheet/cf/conditional-formattings-xform.d.ts +2 -2
  256. package/dist/types/xlsx/xform/sheet/cf/databar-xform.d.ts +3 -3
  257. package/dist/types/xlsx/xform/sheet/cf/ext-lst-ref-xform.d.ts +1 -1
  258. package/dist/types/xlsx/xform/sheet/cf/formula-xform.d.ts +1 -1
  259. package/dist/types/xlsx/xform/sheet/cf/icon-set-xform.d.ts +2 -2
  260. package/dist/types/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.d.ts +1 -1
  261. package/dist/types/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.d.ts +3 -3
  262. package/dist/types/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.d.ts +2 -2
  263. package/dist/types/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.d.ts +3 -3
  264. package/dist/types/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.d.ts +2 -2
  265. package/dist/types/xlsx/xform/sheet/cf-ext/databar-ext-xform.d.ts +3 -3
  266. package/dist/types/xlsx/xform/sheet/cf-ext/f-ext-xform.d.ts +1 -1
  267. package/dist/types/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.d.ts +3 -3
  268. package/dist/types/xlsx/xform/sheet/cf-ext/sqref-ext-xform.d.ts +1 -1
  269. package/dist/types/xlsx/xform/sheet/col-xform.d.ts +1 -1
  270. package/dist/types/xlsx/xform/sheet/data-validations-xform.d.ts +1 -1
  271. package/dist/types/xlsx/xform/sheet/dimension-xform.d.ts +1 -1
  272. package/dist/types/xlsx/xform/sheet/drawing-xform.d.ts +1 -1
  273. package/dist/types/xlsx/xform/sheet/ext-lst-xform.d.ts +1 -1
  274. package/dist/types/xlsx/xform/sheet/header-footer-xform.d.ts +1 -1
  275. package/dist/types/xlsx/xform/sheet/hyperlink-xform.d.ts +1 -1
  276. package/dist/types/xlsx/xform/sheet/merge-cell-xform.d.ts +1 -1
  277. package/dist/types/xlsx/xform/sheet/outline-properties-xform.d.ts +1 -1
  278. package/dist/types/xlsx/xform/sheet/page-breaks-xform.d.ts +1 -1
  279. package/dist/types/xlsx/xform/sheet/page-margins-xform.d.ts +1 -1
  280. package/dist/types/xlsx/xform/sheet/page-setup-properties-xform.d.ts +1 -1
  281. package/dist/types/xlsx/xform/sheet/page-setup-xform.d.ts +1 -1
  282. package/dist/types/xlsx/xform/sheet/picture-xform.d.ts +1 -1
  283. package/dist/types/xlsx/xform/sheet/print-options-xform.d.ts +1 -1
  284. package/dist/types/xlsx/xform/sheet/row-breaks-xform.d.ts +1 -1
  285. package/dist/types/xlsx/xform/sheet/row-xform.d.ts +1 -1
  286. package/dist/types/xlsx/xform/sheet/sheet-format-properties-xform.d.ts +1 -1
  287. package/dist/types/xlsx/xform/sheet/sheet-properties-xform.d.ts +1 -1
  288. package/dist/types/xlsx/xform/sheet/sheet-protection-xform.d.ts +1 -1
  289. package/dist/types/xlsx/xform/sheet/sheet-view-xform.d.ts +1 -1
  290. package/dist/types/xlsx/xform/sheet/table-part-xform.d.ts +1 -1
  291. package/dist/types/xlsx/xform/sheet/worksheet-xform.d.ts +1 -1
  292. package/dist/types/xlsx/xform/simple/boolean-xform.d.ts +1 -1
  293. package/dist/types/xlsx/xform/simple/date-xform.d.ts +1 -1
  294. package/dist/types/xlsx/xform/simple/float-xform.d.ts +1 -1
  295. package/dist/types/xlsx/xform/simple/integer-xform.d.ts +1 -1
  296. package/dist/types/xlsx/xform/simple/string-xform.d.ts +1 -1
  297. package/dist/types/xlsx/xform/static-xform.d.ts +1 -1
  298. package/dist/types/xlsx/xform/strings/phonetic-text-xform.d.ts +1 -1
  299. package/dist/types/xlsx/xform/strings/rich-text-xform.d.ts +3 -3
  300. package/dist/types/xlsx/xform/strings/shared-string-xform.d.ts +1 -1
  301. package/dist/types/xlsx/xform/strings/shared-strings-xform.d.ts +2 -2
  302. package/dist/types/xlsx/xform/strings/text-xform.d.ts +1 -1
  303. package/dist/types/xlsx/xform/style/alignment-xform.d.ts +1 -1
  304. package/dist/types/xlsx/xform/style/border-xform.d.ts +2 -2
  305. package/dist/types/xlsx/xform/style/color-xform.d.ts +1 -1
  306. package/dist/types/xlsx/xform/style/dxf-xform.d.ts +1 -1
  307. package/dist/types/xlsx/xform/style/fill-xform.d.ts +2 -2
  308. package/dist/types/xlsx/xform/style/font-xform.d.ts +1 -1
  309. package/dist/types/xlsx/xform/style/numfmt-xform.d.ts +1 -1
  310. package/dist/types/xlsx/xform/style/protection-xform.d.ts +1 -1
  311. package/dist/types/xlsx/xform/style/style-xform.d.ts +3 -3
  312. package/dist/types/xlsx/xform/style/styles-xform.d.ts +2 -2
  313. package/dist/types/xlsx/xform/style/underline-xform.d.ts +1 -1
  314. package/dist/types/xlsx/xform/table/auto-filter-xform.d.ts +2 -2
  315. package/dist/types/xlsx/xform/table/custom-filter-xform.d.ts +1 -1
  316. package/dist/types/xlsx/xform/table/filter-column-xform.d.ts +2 -2
  317. package/dist/types/xlsx/xform/table/filter-xform.d.ts +1 -1
  318. package/dist/types/xlsx/xform/table/table-column-xform.d.ts +1 -1
  319. package/dist/types/xlsx/xform/table/table-style-info-xform.d.ts +1 -1
  320. package/dist/types/xlsx/xform/table/table-xform.d.ts +1 -1
  321. package/dist/types/xlsx/xlsx.d.ts +80 -20
  322. package/package.json +15 -13
  323. package/dist/browser/excelts.esm.js +0 -19115
  324. package/dist/browser/excelts.esm.js.map +0 -1
  325. package/dist/browser/excelts.esm.min.js +0 -127
  326. package/dist/cjs/csv/csv-core.js +0 -701
  327. package/dist/cjs/csv/csv-stream.js +0 -646
  328. package/dist/cjs/csv/csv.base.js +0 -154
  329. package/dist/cjs/csv/csv.browser.js +0 -68
  330. package/dist/cjs/doc/workbook.base.js +0 -211
  331. package/dist/cjs/doc/workbook.browser.js +0 -62
  332. package/dist/cjs/utils/browser-buffer.js +0 -75
  333. package/dist/cjs/utils/encryptor.browser.js +0 -240
  334. package/dist/cjs/utils/stream-buf.browser.js +0 -355
  335. package/dist/cjs/utils/utils.base.js +0 -161
  336. package/dist/cjs/utils/utils.browser.js +0 -89
  337. package/dist/cjs/utils/zip/compress.base.js +0 -85
  338. package/dist/cjs/utils/zip/compress.browser.js +0 -83
  339. package/dist/cjs/utils/zip/crc32.browser.js +0 -88
  340. package/dist/cjs/utils/zip-stream.browser.js +0 -135
  341. package/dist/cjs/xlsx/xlsx.base.js +0 -742
  342. package/dist/cjs/xlsx/xlsx.browser.js +0 -205
  343. package/dist/esm/csv/csv-core.js +0 -694
  344. package/dist/esm/csv/csv-stream.js +0 -638
  345. package/dist/esm/csv/csv.base.js +0 -141
  346. package/dist/esm/csv/csv.browser.js +0 -65
  347. package/dist/esm/doc/workbook.base.js +0 -207
  348. package/dist/esm/doc/workbook.browser.js +0 -59
  349. package/dist/esm/utils/browser-buffer.js +0 -67
  350. package/dist/esm/utils/encryptor.browser.js +0 -237
  351. package/dist/esm/utils/stream-buf.browser.js +0 -352
  352. package/dist/esm/utils/utils.base.js +0 -142
  353. package/dist/esm/utils/utils.browser.js +0 -68
  354. package/dist/esm/utils/zip/compress.base.js +0 -80
  355. package/dist/esm/utils/zip/compress.browser.js +0 -76
  356. package/dist/esm/utils/zip/crc32.browser.js +0 -82
  357. package/dist/esm/utils/zip-stream.browser.js +0 -132
  358. package/dist/esm/xlsx/xlsx.base.js +0 -739
  359. package/dist/esm/xlsx/xlsx.browser.js +0 -202
  360. package/dist/types/csv/csv-core.d.ts +0 -207
  361. package/dist/types/csv/csv-stream.d.ts +0 -114
  362. package/dist/types/csv/csv.base.d.ts +0 -61
  363. package/dist/types/csv/csv.browser.d.ts +0 -33
  364. package/dist/types/doc/workbook.base.d.ts +0 -111
  365. package/dist/types/doc/workbook.browser.d.ts +0 -38
  366. package/dist/types/utils/browser-buffer.d.ts +0 -28
  367. package/dist/types/utils/encryptor.browser.d.ts +0 -28
  368. package/dist/types/utils/stream-buf.browser.d.ts +0 -41
  369. package/dist/types/utils/utils.base.d.ts +0 -29
  370. package/dist/types/utils/utils.browser.d.ts +0 -29
  371. package/dist/types/utils/zip/compress.base.d.ts +0 -42
  372. package/dist/types/utils/zip/compress.browser.d.ts +0 -54
  373. package/dist/types/utils/zip/crc32.browser.d.ts +0 -52
  374. package/dist/types/utils/zip-stream.browser.d.ts +0 -39
  375. package/dist/types/xlsx/xlsx.base.d.ts +0 -134
  376. package/dist/types/xlsx/xlsx.browser.d.ts +0 -31
@@ -1,638 +0,0 @@
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
- // This matches fast-csv behavior where rowDelimiter separates rows
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
- }