@cj-tech-master/excelts 3.1.0-canary.20260102041828.82ed571 → 3.1.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.
- package/LICENSE +1 -2
- package/README.md +20 -97
- package/README_zh.md +22 -100
- package/dist/LICENSE +1 -2
- package/dist/browser/excelts.esm.js +13239 -19226
- package/dist/browser/excelts.esm.js.map +1 -1
- package/dist/browser/excelts.esm.min.js +26 -40
- package/dist/browser/excelts.iife.js +13240 -19232
- package/dist/browser/excelts.iife.js.map +1 -1
- package/dist/browser/excelts.iife.min.js +25 -39
- package/dist/cjs/csv/csv-core.js +704 -0
- package/dist/cjs/csv/csv-stream.js +648 -0
- package/dist/cjs/csv/csv.base.js +141 -0
- package/dist/cjs/csv/csv.browser.js +68 -0
- package/dist/cjs/csv/csv.js +249 -0
- package/dist/cjs/doc/anchor.js +100 -0
- package/dist/cjs/doc/cell.js +949 -0
- package/dist/cjs/doc/column.js +354 -0
- package/dist/cjs/doc/data-validations.js +46 -0
- package/dist/cjs/doc/defined-names.js +217 -0
- package/dist/cjs/doc/image.js +63 -0
- package/dist/cjs/doc/modelcontainer.js +16 -0
- package/dist/cjs/doc/note.js +64 -0
- package/dist/cjs/doc/pivot-table.js +239 -0
- package/dist/cjs/doc/range.js +283 -0
- package/dist/cjs/doc/row.js +444 -0
- package/dist/cjs/doc/table.js +408 -0
- package/dist/cjs/doc/workbook.base.js +211 -0
- package/dist/cjs/doc/workbook.browser.js +62 -0
- package/dist/cjs/doc/workbook.js +96 -0
- package/dist/cjs/doc/worksheet.js +931 -0
- package/dist/cjs/index.js +21 -19
- package/dist/cjs/local.js +1 -0
- package/dist/cjs/stream/xlsx/hyperlink-reader.js +82 -0
- package/dist/cjs/stream/xlsx/sheet-comments-writer.js +103 -0
- package/dist/cjs/stream/xlsx/sheet-rels-writer.js +93 -0
- package/dist/cjs/stream/xlsx/workbook-reader.js +359 -0
- package/dist/cjs/stream/xlsx/workbook-writer.js +387 -0
- package/dist/cjs/stream/xlsx/worksheet-reader.js +351 -0
- package/dist/cjs/stream/xlsx/worksheet-writer.js +605 -0
- package/dist/cjs/utils/browser-buffer.js +75 -0
- package/dist/cjs/utils/cell-format.js +819 -0
- package/dist/cjs/utils/cell-matrix.js +183 -0
- package/dist/cjs/utils/encryptor.browser.js +240 -0
- package/dist/cjs/utils/encryptor.js +55 -0
- package/dist/cjs/utils/parse-sax.js +1209 -0
- package/dist/cjs/utils/shared-formula.js +38 -0
- package/dist/cjs/utils/sheet-utils.js +727 -0
- package/dist/cjs/utils/stream-buf.browser.js +355 -0
- package/dist/cjs/utils/stream-buf.js +347 -0
- package/dist/cjs/utils/string-buf.js +68 -0
- package/dist/cjs/utils/under-dash.js +180 -0
- package/dist/cjs/utils/unzip/buffer-stream.js +27 -0
- package/dist/cjs/utils/unzip/extract.js +114 -0
- package/dist/cjs/utils/unzip/index.js +45 -0
- package/dist/cjs/utils/unzip/noop-stream.js +20 -0
- package/dist/cjs/utils/unzip/parse-buffer.js +60 -0
- package/dist/cjs/utils/unzip/parse-datetime.js +23 -0
- package/dist/cjs/utils/unzip/parse-extra-field.js +52 -0
- package/dist/cjs/utils/unzip/parse.js +340 -0
- package/dist/cjs/utils/unzip/pull-stream.js +145 -0
- package/dist/cjs/utils/unzip/zip-parser.js +466 -0
- package/dist/cjs/utils/utils.base.js +2 -139
- package/dist/cjs/utils/utils.browser.js +59 -6
- package/dist/cjs/utils/utils.js +89 -13
- package/dist/cjs/utils/xml-stream.js +171 -0
- package/dist/cjs/utils/zip/compress.base.js +88 -0
- package/dist/cjs/utils/zip/compress.browser.js +127 -0
- package/dist/cjs/utils/zip/compress.js +81 -0
- package/dist/cjs/utils/zip/crc32.browser.js +88 -0
- package/dist/cjs/utils/zip/crc32.js +154 -0
- package/dist/cjs/utils/zip/deflate-fallback.js +575 -0
- package/dist/cjs/utils/zip/index.js +70 -0
- package/dist/cjs/utils/zip/streaming-zip.js +264 -0
- package/dist/cjs/utils/zip/zip-builder.js +378 -0
- package/dist/cjs/utils/zip-stream.browser.js +135 -0
- package/dist/cjs/utils/zip-stream.js +114 -0
- package/dist/cjs/xlsx/xform/base-xform.js +126 -0
- package/dist/cjs/xlsx/xform/book/defined-name-xform.js +127 -0
- package/dist/cjs/xlsx/xform/book/sheet-xform.js +33 -0
- package/dist/cjs/xlsx/xform/book/workbook-calc-properties-xform.js +24 -0
- package/dist/cjs/xlsx/xform/book/workbook-pivot-cache-xform.js +27 -0
- package/dist/cjs/xlsx/xform/book/workbook-properties-xform.js +27 -0
- package/dist/cjs/xlsx/xform/book/workbook-view-xform.js +49 -0
- package/dist/cjs/xlsx/xform/book/workbook-xform.js +237 -0
- package/dist/cjs/xlsx/xform/comment/comment-xform.js +79 -0
- package/dist/cjs/xlsx/xform/comment/comments-xform.js +75 -0
- package/dist/cjs/xlsx/xform/comment/style/vml-position-xform.js +37 -0
- package/dist/cjs/xlsx/xform/comment/style/vml-protection-xform.js +33 -0
- package/dist/cjs/xlsx/xform/comment/vml-anchor-xform.js +58 -0
- package/dist/cjs/xlsx/xform/comment/vml-client-data-xform.js +85 -0
- package/dist/cjs/xlsx/xform/comment/vml-notes-xform.js +99 -0
- package/dist/cjs/xlsx/xform/comment/vml-shape-xform.js +86 -0
- package/dist/cjs/xlsx/xform/comment/vml-textbox-xform.js +63 -0
- package/dist/cjs/xlsx/xform/composite-xform.js +51 -0
- package/dist/cjs/xlsx/xform/core/app-heading-pairs-xform.js +27 -0
- package/dist/cjs/xlsx/xform/core/app-titles-of-parts-xform.js +24 -0
- package/dist/cjs/xlsx/xform/core/app-xform.js +86 -0
- package/dist/cjs/xlsx/xform/core/content-types-xform.js +131 -0
- package/dist/cjs/xlsx/xform/core/core-xform.js +127 -0
- package/dist/cjs/xlsx/xform/core/relationship-xform.js +23 -0
- package/dist/cjs/xlsx/xform/core/relationships-xform.js +65 -0
- package/dist/cjs/xlsx/xform/drawing/base-cell-anchor-xform.js +47 -0
- package/dist/cjs/xlsx/xform/drawing/blip-fill-xform.js +60 -0
- package/dist/cjs/xlsx/xform/drawing/blip-xform.js +43 -0
- package/dist/cjs/xlsx/xform/drawing/c-nv-pic-pr-xform.js +35 -0
- package/dist/cjs/xlsx/xform/drawing/c-nv-pr-xform.js +62 -0
- package/dist/cjs/xlsx/xform/drawing/cell-position-xform.js +71 -0
- package/dist/cjs/xlsx/xform/drawing/drawing-xform.js +99 -0
- package/dist/cjs/xlsx/xform/drawing/ext-lst-xform.js +40 -0
- package/dist/cjs/xlsx/xform/drawing/ext-xform.js +37 -0
- package/dist/cjs/xlsx/xform/drawing/hlink-click-xform.js +42 -0
- package/dist/cjs/xlsx/xform/drawing/nv-pic-pr-xform.js +59 -0
- package/dist/cjs/xlsx/xform/drawing/one-cell-anchor-xform.js +55 -0
- package/dist/cjs/xlsx/xform/drawing/pic-xform.js +67 -0
- package/dist/cjs/xlsx/xform/drawing/two-cell-anchor-xform.js +54 -0
- package/dist/cjs/xlsx/xform/list-xform.js +92 -0
- package/dist/cjs/xlsx/xform/pivot-table/cache-field-xform.js +131 -0
- package/dist/cjs/xlsx/xform/pivot-table/cache-field.js +81 -0
- package/dist/cjs/xlsx/xform/pivot-table/pivot-cache-definition-xform.js +182 -0
- package/dist/cjs/xlsx/xform/pivot-table/pivot-cache-records-xform.js +237 -0
- package/dist/cjs/xlsx/xform/pivot-table/pivot-table-xform.js +627 -0
- package/dist/cjs/xlsx/xform/sheet/auto-filter-xform.js +37 -0
- package/dist/cjs/xlsx/xform/sheet/cell-xform.js +463 -0
- package/dist/cjs/xlsx/xform/sheet/cf/cf-rule-xform.js +262 -0
- package/dist/cjs/xlsx/xform/sheet/cf/cfvo-xform.js +25 -0
- package/dist/cjs/xlsx/xform/sheet/cf/color-scale-xform.js +38 -0
- package/dist/cjs/xlsx/xform/sheet/cf/conditional-formatting-xform.js +40 -0
- package/dist/cjs/xlsx/xform/sheet/cf/conditional-formattings-xform.js +77 -0
- package/dist/cjs/xlsx/xform/sheet/cf/databar-xform.js +42 -0
- package/dist/cjs/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +70 -0
- package/dist/cjs/xlsx/xform/sheet/cf/formula-xform.js +22 -0
- package/dist/cjs/xlsx/xform/sheet/cf/icon-set-xform.js +40 -0
- package/dist/cjs/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +25 -0
- package/dist/cjs/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +82 -0
- package/dist/cjs/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +38 -0
- package/dist/cjs/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +51 -0
- package/dist/cjs/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +43 -0
- package/dist/cjs/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +72 -0
- package/dist/cjs/xlsx/xform/sheet/cf-ext/f-ext-xform.js +22 -0
- package/dist/cjs/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +63 -0
- package/dist/cjs/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +22 -0
- package/dist/cjs/xlsx/xform/sheet/col-breaks-xform.js +38 -0
- package/dist/cjs/xlsx/xform/sheet/col-xform.js +78 -0
- package/dist/cjs/xlsx/xform/sheet/data-validations-xform.js +285 -0
- package/dist/cjs/xlsx/xform/sheet/dimension-xform.js +26 -0
- package/dist/cjs/xlsx/xform/sheet/drawing-xform.js +30 -0
- package/dist/cjs/xlsx/xform/sheet/ext-lst-xform.js +69 -0
- package/dist/cjs/xlsx/xform/sheet/header-footer-xform.js +127 -0
- package/dist/cjs/xlsx/xform/sheet/hyperlink-xform.js +50 -0
- package/dist/cjs/xlsx/xform/sheet/merge-cell-xform.js +24 -0
- package/dist/cjs/xlsx/xform/sheet/merges.js +53 -0
- package/dist/cjs/xlsx/xform/sheet/outline-properties-xform.js +39 -0
- package/dist/cjs/xlsx/xform/sheet/page-breaks-xform.js +36 -0
- package/dist/cjs/xlsx/xform/sheet/page-margins-xform.js +45 -0
- package/dist/cjs/xlsx/xform/sheet/page-setup-properties-xform.js +32 -0
- package/dist/cjs/xlsx/xform/sheet/page-setup-xform.js +99 -0
- package/dist/cjs/xlsx/xform/sheet/picture-xform.js +30 -0
- package/dist/cjs/xlsx/xform/sheet/print-options-xform.js +44 -0
- package/dist/cjs/xlsx/xform/sheet/row-breaks-xform.js +32 -0
- package/dist/cjs/xlsx/xform/sheet/row-xform.js +155 -0
- package/dist/cjs/xlsx/xform/sheet/sheet-format-properties-xform.js +52 -0
- package/dist/cjs/xlsx/xform/sheet/sheet-properties-xform.js +85 -0
- package/dist/cjs/xlsx/xform/sheet/sheet-protection-xform.js +83 -0
- package/dist/cjs/xlsx/xform/sheet/sheet-view-xform.js +196 -0
- package/dist/cjs/xlsx/xform/sheet/table-part-xform.js +30 -0
- package/dist/cjs/xlsx/xform/sheet/worksheet-xform.js +520 -0
- package/dist/cjs/xlsx/xform/simple/boolean-xform.js +27 -0
- package/dist/cjs/xlsx/xform/simple/date-xform.js +68 -0
- package/dist/cjs/xlsx/xform/simple/float-xform.js +50 -0
- package/dist/cjs/xlsx/xform/simple/integer-xform.js +55 -0
- package/dist/cjs/xlsx/xform/simple/string-xform.js +50 -0
- package/dist/cjs/xlsx/xform/static-xform.js +58 -0
- package/dist/cjs/xlsx/xform/strings/phonetic-text-xform.js +89 -0
- package/dist/cjs/xlsx/xform/strings/rich-text-xform.js +80 -0
- package/dist/cjs/xlsx/xform/strings/shared-string-xform.js +93 -0
- package/dist/cjs/xlsx/xform/strings/shared-strings-xform.js +112 -0
- package/dist/cjs/xlsx/xform/strings/text-xform.js +39 -0
- package/dist/cjs/xlsx/xform/style/alignment-xform.js +155 -0
- package/dist/cjs/xlsx/xform/style/border-xform.js +191 -0
- package/dist/cjs/xlsx/xform/style/color-xform.js +64 -0
- package/dist/cjs/xlsx/xform/style/dxf-xform.js +95 -0
- package/dist/cjs/xlsx/xform/style/fill-xform.js +315 -0
- package/dist/cjs/xlsx/xform/style/font-xform.js +103 -0
- package/dist/cjs/xlsx/xform/style/numfmt-xform.js +53 -0
- package/dist/cjs/xlsx/xform/style/protection-xform.js +52 -0
- package/dist/cjs/xlsx/xform/style/style-xform.js +111 -0
- package/dist/cjs/xlsx/xform/style/styles-xform.js +487 -0
- package/dist/cjs/xlsx/xform/style/underline-xform.js +41 -0
- package/dist/cjs/xlsx/xform/table/auto-filter-xform.js +73 -0
- package/dist/cjs/xlsx/xform/table/custom-filter-xform.js +34 -0
- package/dist/cjs/xlsx/xform/table/filter-column-xform.js +91 -0
- package/dist/cjs/xlsx/xform/table/filter-xform.js +32 -0
- package/dist/cjs/xlsx/xform/table/table-column-xform.js +44 -0
- package/dist/cjs/xlsx/xform/table/table-style-info-xform.js +47 -0
- package/dist/cjs/xlsx/xform/table/table-xform.js +129 -0
- package/dist/cjs/xlsx/xlsx.base.js +742 -0
- package/dist/cjs/xlsx/xlsx.browser.js +162 -0
- package/dist/cjs/xlsx/xlsx.js +220 -0
- package/dist/esm/csv/csv-core.js +697 -0
- package/dist/esm/csv/csv-stream.js +640 -0
- package/dist/esm/csv/csv.base.js +131 -0
- package/dist/esm/csv/csv.browser.js +65 -0
- package/dist/esm/csv/csv.js +209 -0
- package/dist/esm/doc/anchor.js +97 -0
- package/dist/esm/doc/cell.js +946 -0
- package/dist/esm/doc/column.js +351 -0
- package/dist/esm/doc/data-validations.js +43 -0
- package/dist/esm/doc/defined-names.js +214 -0
- package/dist/esm/doc/image.js +60 -0
- package/dist/esm/doc/modelcontainer.js +13 -0
- package/dist/esm/doc/note.js +61 -0
- package/dist/esm/doc/pivot-table.js +237 -0
- package/dist/esm/doc/range.js +280 -0
- package/dist/esm/doc/row.js +441 -0
- package/dist/esm/doc/table.js +405 -0
- package/dist/esm/doc/workbook.base.js +207 -0
- package/dist/esm/doc/workbook.browser.js +59 -0
- package/dist/esm/doc/workbook.js +93 -0
- package/dist/esm/doc/worksheet.js +928 -0
- package/dist/esm/index.browser.js +17 -26
- package/dist/esm/index.js +19 -18
- package/dist/esm/local.js +1 -0
- package/dist/esm/stream/xlsx/hyperlink-reader.js +79 -0
- package/dist/esm/stream/xlsx/sheet-comments-writer.js +100 -0
- package/dist/esm/stream/xlsx/sheet-rels-writer.js +90 -0
- package/dist/esm/stream/xlsx/workbook-reader.js +352 -0
- package/dist/esm/stream/xlsx/workbook-writer.js +381 -0
- package/dist/esm/stream/xlsx/worksheet-reader.js +348 -0
- package/dist/esm/stream/xlsx/worksheet-writer.js +602 -0
- package/dist/esm/utils/browser-buffer.js +67 -0
- package/dist/esm/utils/cell-format.js +814 -0
- package/dist/esm/utils/cell-matrix.js +180 -0
- package/dist/esm/utils/encryptor.browser.js +237 -0
- package/dist/esm/utils/encryptor.js +49 -0
- package/dist/esm/utils/parse-sax.js +1205 -0
- package/dist/esm/utils/shared-formula.js +36 -0
- package/dist/esm/utils/sheet-utils.js +707 -0
- package/dist/esm/utils/stream-buf.browser.js +352 -0
- package/dist/esm/utils/stream-buf.js +344 -0
- package/dist/esm/utils/string-buf.js +65 -0
- package/dist/esm/utils/under-dash.js +171 -0
- package/dist/esm/utils/unzip/buffer-stream.js +24 -0
- package/dist/esm/utils/unzip/extract.js +106 -0
- package/dist/esm/utils/unzip/index.js +29 -0
- package/dist/esm/utils/unzip/noop-stream.js +16 -0
- package/dist/esm/utils/unzip/parse-buffer.js +57 -0
- package/dist/esm/utils/unzip/parse-datetime.js +20 -0
- package/dist/esm/utils/unzip/parse-extra-field.js +49 -0
- package/dist/esm/utils/unzip/parse.js +332 -0
- package/dist/esm/utils/unzip/pull-stream.js +141 -0
- package/dist/esm/utils/unzip/zip-parser.js +459 -0
- package/dist/esm/utils/utils.base.js +2 -135
- package/dist/esm/utils/utils.browser.js +57 -1
- package/dist/esm/utils/utils.js +87 -8
- package/dist/esm/utils/xml-stream.js +168 -0
- package/dist/esm/utils/zip/compress.base.js +83 -0
- package/dist/esm/utils/zip/compress.browser.js +121 -0
- package/dist/esm/utils/zip/compress.js +72 -0
- package/dist/esm/utils/zip/crc32.browser.js +82 -0
- package/dist/esm/utils/zip/crc32.js +116 -0
- package/dist/esm/utils/zip/deflate-fallback.js +570 -0
- package/dist/esm/utils/zip/index.js +55 -0
- package/dist/esm/utils/zip/streaming-zip.js +259 -0
- package/dist/esm/utils/zip/zip-builder.js +372 -0
- package/dist/esm/utils/zip-stream.browser.js +132 -0
- package/dist/esm/utils/zip-stream.js +109 -0
- package/dist/esm/xlsx/xform/base-xform.js +123 -0
- package/dist/esm/xlsx/xform/book/defined-name-xform.js +124 -0
- package/dist/esm/xlsx/xform/book/sheet-xform.js +30 -0
- package/dist/esm/xlsx/xform/book/workbook-calc-properties-xform.js +21 -0
- package/dist/esm/xlsx/xform/book/workbook-pivot-cache-xform.js +24 -0
- package/dist/esm/xlsx/xform/book/workbook-properties-xform.js +24 -0
- package/dist/esm/xlsx/xform/book/workbook-view-xform.js +46 -0
- package/dist/esm/xlsx/xform/book/workbook-xform.js +234 -0
- package/dist/esm/xlsx/xform/comment/comment-xform.js +76 -0
- package/dist/esm/xlsx/xform/comment/comments-xform.js +72 -0
- package/dist/esm/xlsx/xform/comment/style/vml-position-xform.js +34 -0
- package/dist/esm/xlsx/xform/comment/style/vml-protection-xform.js +30 -0
- package/dist/esm/xlsx/xform/comment/vml-anchor-xform.js +55 -0
- package/dist/esm/xlsx/xform/comment/vml-client-data-xform.js +82 -0
- package/dist/esm/xlsx/xform/comment/vml-notes-xform.js +96 -0
- package/dist/esm/xlsx/xform/comment/vml-shape-xform.js +83 -0
- package/dist/esm/xlsx/xform/comment/vml-textbox-xform.js +60 -0
- package/dist/esm/xlsx/xform/composite-xform.js +48 -0
- package/dist/esm/xlsx/xform/core/app-heading-pairs-xform.js +24 -0
- package/dist/esm/xlsx/xform/core/app-titles-of-parts-xform.js +21 -0
- package/dist/esm/xlsx/xform/core/app-xform.js +83 -0
- package/dist/esm/xlsx/xform/core/content-types-xform.js +128 -0
- package/dist/esm/xlsx/xform/core/core-xform.js +124 -0
- package/dist/esm/xlsx/xform/core/relationship-xform.js +20 -0
- package/dist/esm/xlsx/xform/core/relationships-xform.js +62 -0
- package/dist/esm/xlsx/xform/drawing/base-cell-anchor-xform.js +44 -0
- package/dist/esm/xlsx/xform/drawing/blip-fill-xform.js +57 -0
- package/dist/esm/xlsx/xform/drawing/blip-xform.js +40 -0
- package/dist/esm/xlsx/xform/drawing/c-nv-pic-pr-xform.js +32 -0
- package/dist/esm/xlsx/xform/drawing/c-nv-pr-xform.js +59 -0
- package/dist/esm/xlsx/xform/drawing/cell-position-xform.js +68 -0
- package/dist/esm/xlsx/xform/drawing/drawing-xform.js +96 -0
- package/dist/esm/xlsx/xform/drawing/ext-lst-xform.js +37 -0
- package/dist/esm/xlsx/xform/drawing/ext-xform.js +34 -0
- package/dist/esm/xlsx/xform/drawing/hlink-click-xform.js +39 -0
- package/dist/esm/xlsx/xform/drawing/nv-pic-pr-xform.js +56 -0
- package/dist/esm/xlsx/xform/drawing/one-cell-anchor-xform.js +52 -0
- package/dist/esm/xlsx/xform/drawing/pic-xform.js +64 -0
- package/dist/esm/xlsx/xform/drawing/two-cell-anchor-xform.js +51 -0
- package/dist/esm/xlsx/xform/list-xform.js +89 -0
- package/dist/esm/xlsx/xform/pivot-table/cache-field-xform.js +128 -0
- package/dist/esm/xlsx/xform/pivot-table/cache-field.js +78 -0
- package/dist/esm/xlsx/xform/pivot-table/pivot-cache-definition-xform.js +179 -0
- package/dist/esm/xlsx/xform/pivot-table/pivot-cache-records-xform.js +234 -0
- package/dist/esm/xlsx/xform/pivot-table/pivot-table-xform.js +624 -0
- package/dist/esm/xlsx/xform/sheet/auto-filter-xform.js +34 -0
- package/dist/esm/xlsx/xform/sheet/cell-xform.js +460 -0
- package/dist/esm/xlsx/xform/sheet/cf/cf-rule-xform.js +259 -0
- package/dist/esm/xlsx/xform/sheet/cf/cfvo-xform.js +22 -0
- package/dist/esm/xlsx/xform/sheet/cf/color-scale-xform.js +35 -0
- package/dist/esm/xlsx/xform/sheet/cf/conditional-formatting-xform.js +37 -0
- package/dist/esm/xlsx/xform/sheet/cf/conditional-formattings-xform.js +74 -0
- package/dist/esm/xlsx/xform/sheet/cf/databar-xform.js +39 -0
- package/dist/esm/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +67 -0
- package/dist/esm/xlsx/xform/sheet/cf/formula-xform.js +19 -0
- package/dist/esm/xlsx/xform/sheet/cf/icon-set-xform.js +37 -0
- package/dist/esm/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +22 -0
- package/dist/esm/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +79 -0
- package/dist/esm/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +35 -0
- package/dist/esm/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +48 -0
- package/dist/esm/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +40 -0
- package/dist/esm/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +69 -0
- package/dist/esm/xlsx/xform/sheet/cf-ext/f-ext-xform.js +19 -0
- package/dist/esm/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +60 -0
- package/dist/esm/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +19 -0
- package/dist/esm/xlsx/xform/sheet/col-breaks-xform.js +35 -0
- package/dist/esm/xlsx/xform/sheet/col-xform.js +75 -0
- package/dist/esm/xlsx/xform/sheet/data-validations-xform.js +282 -0
- package/dist/esm/xlsx/xform/sheet/dimension-xform.js +23 -0
- package/dist/esm/xlsx/xform/sheet/drawing-xform.js +27 -0
- package/dist/esm/xlsx/xform/sheet/ext-lst-xform.js +66 -0
- package/dist/esm/xlsx/xform/sheet/header-footer-xform.js +124 -0
- package/dist/esm/xlsx/xform/sheet/hyperlink-xform.js +47 -0
- package/dist/esm/xlsx/xform/sheet/merge-cell-xform.js +21 -0
- package/dist/esm/xlsx/xform/sheet/merges.js +50 -0
- package/dist/esm/xlsx/xform/sheet/outline-properties-xform.js +36 -0
- package/dist/esm/xlsx/xform/sheet/page-breaks-xform.js +33 -0
- package/dist/esm/xlsx/xform/sheet/page-margins-xform.js +42 -0
- package/dist/esm/xlsx/xform/sheet/page-setup-properties-xform.js +29 -0
- package/dist/esm/xlsx/xform/sheet/page-setup-xform.js +96 -0
- package/dist/esm/xlsx/xform/sheet/picture-xform.js +27 -0
- package/dist/esm/xlsx/xform/sheet/print-options-xform.js +41 -0
- package/dist/esm/xlsx/xform/sheet/row-breaks-xform.js +29 -0
- package/dist/esm/xlsx/xform/sheet/row-xform.js +152 -0
- package/dist/esm/xlsx/xform/sheet/sheet-format-properties-xform.js +49 -0
- package/dist/esm/xlsx/xform/sheet/sheet-properties-xform.js +82 -0
- package/dist/esm/xlsx/xform/sheet/sheet-protection-xform.js +80 -0
- package/dist/esm/xlsx/xform/sheet/sheet-view-xform.js +193 -0
- package/dist/esm/xlsx/xform/sheet/table-part-xform.js +27 -0
- package/dist/esm/xlsx/xform/sheet/worksheet-xform.js +517 -0
- package/dist/esm/xlsx/xform/simple/boolean-xform.js +24 -0
- package/dist/esm/xlsx/xform/simple/date-xform.js +65 -0
- package/dist/esm/xlsx/xform/simple/float-xform.js +47 -0
- package/dist/esm/xlsx/xform/simple/integer-xform.js +52 -0
- package/dist/esm/xlsx/xform/simple/string-xform.js +47 -0
- package/dist/esm/xlsx/xform/static-xform.js +55 -0
- package/dist/esm/xlsx/xform/strings/phonetic-text-xform.js +86 -0
- package/dist/esm/xlsx/xform/strings/rich-text-xform.js +77 -0
- package/dist/esm/xlsx/xform/strings/shared-string-xform.js +90 -0
- package/dist/esm/xlsx/xform/strings/shared-strings-xform.js +109 -0
- package/dist/esm/xlsx/xform/strings/text-xform.js +36 -0
- package/dist/esm/xlsx/xform/style/alignment-xform.js +152 -0
- package/dist/esm/xlsx/xform/style/border-xform.js +188 -0
- package/dist/esm/xlsx/xform/style/color-xform.js +61 -0
- package/dist/esm/xlsx/xform/style/dxf-xform.js +92 -0
- package/dist/esm/xlsx/xform/style/fill-xform.js +312 -0
- package/dist/esm/xlsx/xform/style/font-xform.js +100 -0
- package/dist/esm/xlsx/xform/style/numfmt-xform.js +50 -0
- package/dist/esm/xlsx/xform/style/protection-xform.js +49 -0
- package/dist/esm/xlsx/xform/style/style-xform.js +108 -0
- package/dist/esm/xlsx/xform/style/styles-xform.js +484 -0
- package/dist/esm/xlsx/xform/style/underline-xform.js +38 -0
- package/dist/esm/xlsx/xform/table/auto-filter-xform.js +70 -0
- package/dist/esm/xlsx/xform/table/custom-filter-xform.js +31 -0
- package/dist/esm/xlsx/xform/table/filter-column-xform.js +88 -0
- package/dist/esm/xlsx/xform/table/filter-xform.js +29 -0
- package/dist/esm/xlsx/xform/table/table-column-xform.js +41 -0
- package/dist/esm/xlsx/xform/table/table-style-info-xform.js +44 -0
- package/dist/esm/xlsx/xform/table/table-xform.js +126 -0
- package/dist/esm/xlsx/xlsx.base.js +739 -0
- package/dist/esm/xlsx/xlsx.browser.js +159 -0
- package/dist/esm/xlsx/xlsx.js +214 -0
- package/dist/types/csv/csv-core.d.ts +213 -0
- package/dist/types/csv/csv-stream.d.ts +115 -0
- package/dist/types/csv/csv.base.d.ts +62 -0
- package/dist/types/csv/csv.browser.d.ts +33 -0
- package/dist/types/csv/csv.d.ts +105 -0
- package/dist/types/doc/anchor.d.ts +33 -0
- package/dist/types/doc/cell.d.ts +139 -0
- package/dist/types/doc/column.d.ts +121 -0
- package/dist/types/doc/defined-names.d.ts +37 -0
- package/dist/types/doc/image.d.ts +64 -0
- package/dist/types/doc/modelcontainer.d.ts +8 -0
- package/dist/types/doc/pivot-table.d.ts +152 -0
- package/dist/types/doc/range.d.ts +62 -0
- package/dist/types/doc/row.d.ts +127 -0
- package/dist/types/doc/table.d.ts +81 -0
- package/dist/types/doc/workbook.base.d.ts +111 -0
- package/dist/types/doc/workbook.browser.d.ts +38 -0
- package/dist/types/doc/workbook.d.ts +79 -0
- package/dist/types/doc/worksheet.d.ts +333 -0
- package/dist/types/index.browser.d.ts +15 -21
- package/dist/types/index.d.ts +24 -23
- package/dist/types/local.d.ts +0 -0
- package/dist/types/stream/xlsx/hyperlink-reader.d.ts +27 -0
- package/dist/types/stream/xlsx/workbook-reader.d.ts +139 -0
- package/dist/types/stream/xlsx/workbook-writer.d.ts +139 -0
- package/dist/types/stream/xlsx/worksheet-reader.d.ts +55 -0
- package/dist/types/stream/xlsx/worksheet-writer.d.ts +139 -0
- package/dist/types/utils/browser-buffer.d.ts +28 -0
- package/dist/types/utils/col-cache.d.ts +36 -0
- package/dist/types/utils/encryptor.browser.d.ts +28 -0
- package/dist/types/utils/encryptor.d.ts +23 -0
- package/dist/types/utils/iterate-stream.d.ts +10 -0
- package/dist/types/utils/sheet-utils.d.ts +209 -0
- package/dist/types/utils/stream-buf.browser.d.ts +41 -0
- package/dist/types/utils/stream-buf.d.ts +2 -0
- package/dist/types/utils/string-buf.d.ts +20 -0
- package/dist/types/utils/unzip/buffer-stream.d.ts +9 -0
- package/dist/types/utils/unzip/extract.d.ts +94 -0
- package/dist/types/utils/unzip/index.d.ts +27 -0
- package/dist/types/utils/unzip/noop-stream.d.ts +13 -0
- package/dist/types/utils/unzip/parse-buffer.d.ts +24 -0
- package/dist/types/utils/unzip/parse-datetime.d.ts +12 -0
- package/dist/types/utils/unzip/parse-extra-field.d.ts +18 -0
- package/dist/types/utils/unzip/parse.d.ts +70 -0
- package/dist/types/utils/unzip/pull-stream.d.ts +24 -0
- package/dist/types/utils/unzip/zip-parser.d.ts +97 -0
- package/dist/types/utils/utils.base.d.ts +1 -21
- package/dist/types/utils/utils.browser.d.ts +24 -1
- package/dist/types/utils/utils.d.ts +24 -1
- package/dist/types/utils/zip/compress.base.d.ts +45 -0
- package/dist/types/utils/zip/compress.browser.d.ts +63 -0
- package/dist/types/utils/zip/compress.d.ts +51 -0
- package/dist/types/utils/zip/crc32.browser.d.ts +52 -0
- package/dist/types/utils/zip/crc32.d.ts +55 -0
- package/dist/types/utils/zip/index.d.ts +52 -0
- package/dist/types/utils/zip/streaming-zip.d.ts +96 -0
- package/dist/types/utils/zip/zip-builder.d.ts +110 -0
- package/dist/types/utils/zip-stream.browser.d.ts +39 -0
- package/dist/types/utils/zip-stream.d.ts +33 -0
- package/dist/types/xlsx/xform/base-xform.d.ts +33 -0
- package/dist/types/xlsx/xform/book/defined-name-xform.d.ts +17 -0
- package/dist/types/xlsx/xform/book/sheet-xform.d.ts +14 -0
- package/dist/types/xlsx/xform/book/workbook-calc-properties-xform.d.ts +11 -0
- package/dist/types/xlsx/xform/book/workbook-pivot-cache-xform.d.ts +12 -0
- package/dist/types/xlsx/xform/book/workbook-properties-xform.d.ts +11 -0
- package/dist/types/xlsx/xform/book/workbook-view-xform.d.ts +17 -0
- package/dist/types/xlsx/xform/book/workbook-xform.d.ts +23 -0
- package/dist/types/xlsx/xform/comment/comment-xform.d.ts +28 -0
- package/dist/types/xlsx/xform/comment/comments-xform.d.ts +21 -0
- package/dist/types/xlsx/xform/comment/style/vml-position-xform.d.ts +16 -0
- package/dist/types/xlsx/xform/comment/style/vml-protection-xform.d.ts +14 -0
- package/dist/types/xlsx/xform/comment/vml-anchor-xform.d.ts +27 -0
- package/dist/types/xlsx/xform/comment/vml-client-data-xform.d.ts +35 -0
- package/dist/types/xlsx/xform/comment/vml-notes-xform.d.ts +24 -0
- package/dist/types/xlsx/xform/comment/vml-shape-xform.d.ts +25 -0
- package/dist/types/xlsx/xform/comment/vml-textbox-xform.d.ts +23 -0
- package/dist/types/xlsx/xform/composite-xform.d.ts +11 -0
- package/dist/types/xlsx/xform/core/app-heading-pairs-xform.d.ts +8 -0
- package/dist/types/xlsx/xform/core/app-titles-of-parts-xform.d.ts +8 -0
- package/dist/types/xlsx/xform/core/app-xform.d.ts +26 -0
- package/dist/types/xlsx/xform/core/content-types-xform.d.ts +11 -0
- package/dist/types/xlsx/xform/core/core-xform.d.ts +42 -0
- package/dist/types/xlsx/xform/core/relationship-xform.d.ts +14 -0
- package/dist/types/xlsx/xform/core/relationships-xform.d.ts +14 -0
- package/dist/types/xlsx/xform/drawing/base-cell-anchor-xform.d.ts +13 -0
- package/dist/types/xlsx/xform/drawing/blip-fill-xform.d.ts +16 -0
- package/dist/types/xlsx/xform/drawing/blip-xform.d.ts +14 -0
- package/dist/types/xlsx/xform/drawing/c-nv-pic-pr-xform.d.ts +9 -0
- package/dist/types/xlsx/xform/drawing/c-nv-pr-xform.d.ts +18 -0
- package/dist/types/xlsx/xform/drawing/cell-position-xform.d.ts +24 -0
- package/dist/types/xlsx/xform/drawing/drawing-xform.d.ts +24 -0
- package/dist/types/xlsx/xform/drawing/ext-lst-xform.d.ts +9 -0
- package/dist/types/xlsx/xform/drawing/ext-xform.d.ts +20 -0
- package/dist/types/xlsx/xform/drawing/hlink-click-xform.d.ts +11 -0
- package/dist/types/xlsx/xform/drawing/nv-pic-pr-xform.d.ts +15 -0
- package/dist/types/xlsx/xform/drawing/one-cell-anchor-xform.d.ts +20 -0
- package/dist/types/xlsx/xform/drawing/pic-xform.d.ts +22 -0
- package/dist/types/xlsx/xform/drawing/two-cell-anchor-xform.d.ts +20 -0
- package/dist/types/xlsx/xform/list-xform.d.ts +32 -0
- package/dist/types/xlsx/xform/pivot-table/cache-field-xform.d.ts +42 -0
- package/dist/types/xlsx/xform/pivot-table/pivot-cache-definition-xform.d.ts +60 -0
- package/dist/types/xlsx/xform/pivot-table/pivot-cache-records-xform.d.ts +73 -0
- package/dist/types/xlsx/xform/pivot-table/pivot-table-xform.d.ts +119 -0
- package/dist/types/xlsx/xform/sheet/auto-filter-xform.d.ts +8 -0
- package/dist/types/xlsx/xform/sheet/cell-xform.d.ts +17 -0
- package/dist/types/xlsx/xform/sheet/cf/cf-rule-xform.d.ts +41 -0
- package/dist/types/xlsx/xform/sheet/cf/cfvo-xform.d.ts +8 -0
- package/dist/types/xlsx/xform/sheet/cf/color-scale-xform.d.ts +13 -0
- package/dist/types/xlsx/xform/sheet/cf/conditional-formatting-xform.d.ts +9 -0
- package/dist/types/xlsx/xform/sheet/cf/conditional-formattings-xform.d.ts +16 -0
- package/dist/types/xlsx/xform/sheet/cf/databar-xform.d.ts +13 -0
- package/dist/types/xlsx/xform/sheet/cf/ext-lst-ref-xform.d.ts +9 -0
- package/dist/types/xlsx/xform/sheet/cf/formula-xform.d.ts +9 -0
- package/dist/types/xlsx/xform/sheet/cf/icon-set-xform.d.ts +11 -0
- package/dist/types/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.d.ts +10 -0
- package/dist/types/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.d.ts +23 -0
- package/dist/types/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.d.ts +13 -0
- package/dist/types/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.d.ts +16 -0
- package/dist/types/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.d.ts +13 -0
- package/dist/types/xlsx/xform/sheet/cf-ext/databar-ext-xform.d.ts +29 -0
- package/dist/types/xlsx/xform/sheet/cf-ext/f-ext-xform.d.ts +9 -0
- package/dist/types/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.d.ts +20 -0
- package/dist/types/xlsx/xform/sheet/cf-ext/sqref-ext-xform.d.ts +9 -0
- package/dist/types/xlsx/xform/sheet/col-breaks-xform.d.ts +16 -0
- package/dist/types/xlsx/xform/sheet/col-xform.d.ts +22 -0
- package/dist/types/xlsx/xform/sheet/data-validations-xform.d.ts +12 -0
- package/dist/types/xlsx/xform/sheet/dimension-xform.d.ts +10 -0
- package/dist/types/xlsx/xform/sheet/drawing-xform.d.ts +12 -0
- package/dist/types/xlsx/xform/sheet/ext-lst-xform.d.ts +16 -0
- package/dist/types/xlsx/xform/sheet/header-footer-xform.d.ts +20 -0
- package/dist/types/xlsx/xform/sheet/hyperlink-xform.d.ts +16 -0
- package/dist/types/xlsx/xform/sheet/merge-cell-xform.d.ts +9 -0
- package/dist/types/xlsx/xform/sheet/outline-properties-xform.d.ts +13 -0
- package/dist/types/xlsx/xform/sheet/page-breaks-xform.d.ts +14 -0
- package/dist/types/xlsx/xform/sheet/page-margins-xform.d.ts +17 -0
- package/dist/types/xlsx/xform/sheet/page-setup-properties-xform.d.ts +12 -0
- package/dist/types/xlsx/xform/sheet/page-setup-xform.d.ts +27 -0
- package/dist/types/xlsx/xform/sheet/picture-xform.d.ts +12 -0
- package/dist/types/xlsx/xform/sheet/print-options-xform.d.ts +15 -0
- package/dist/types/xlsx/xform/sheet/row-breaks-xform.d.ts +10 -0
- package/dist/types/xlsx/xform/sheet/row-xform.d.ts +37 -0
- package/dist/types/xlsx/xform/sheet/sheet-format-properties-xform.d.ts +16 -0
- package/dist/types/xlsx/xform/sheet/sheet-properties-xform.d.ts +19 -0
- package/dist/types/xlsx/xform/sheet/sheet-protection-xform.d.ts +31 -0
- package/dist/types/xlsx/xform/sheet/sheet-view-xform.d.ts +32 -0
- package/dist/types/xlsx/xform/sheet/table-part-xform.d.ts +12 -0
- package/dist/types/xlsx/xform/sheet/worksheet-xform.d.ts +21 -0
- package/dist/types/xlsx/xform/simple/boolean-xform.d.ts +15 -0
- package/dist/types/xlsx/xform/simple/date-xform.d.ts +22 -0
- package/dist/types/xlsx/xform/simple/float-xform.d.ts +18 -0
- package/dist/types/xlsx/xform/simple/integer-xform.d.ts +20 -0
- package/dist/types/xlsx/xform/simple/string-xform.d.ts +18 -0
- package/dist/types/xlsx/xform/static-xform.d.ts +17 -0
- package/dist/types/xlsx/xform/strings/phonetic-text-xform.d.ts +20 -0
- package/dist/types/xlsx/xform/strings/rich-text-xform.d.ts +25 -0
- package/dist/types/xlsx/xform/strings/shared-string-xform.d.ts +17 -0
- package/dist/types/xlsx/xform/strings/shared-strings-xform.d.ts +27 -0
- package/dist/types/xlsx/xform/strings/text-xform.d.ts +10 -0
- package/dist/types/xlsx/xform/style/alignment-xform.d.ts +18 -0
- package/dist/types/xlsx/xform/style/border-xform.d.ts +49 -0
- package/dist/types/xlsx/xform/style/color-xform.d.ts +17 -0
- package/dist/types/xlsx/xform/style/dxf-xform.d.ts +23 -0
- package/dist/types/xlsx/xform/style/fill-xform.d.ts +85 -0
- package/dist/types/xlsx/xform/style/font-xform.d.ts +35 -0
- package/dist/types/xlsx/xform/style/numfmt-xform.d.ts +18 -0
- package/dist/types/xlsx/xform/style/protection-xform.d.ts +13 -0
- package/dist/types/xlsx/xform/style/style-xform.d.ts +30 -0
- package/dist/types/xlsx/xform/style/styles-xform.d.ts +46 -0
- package/dist/types/xlsx/xform/style/underline-xform.d.ts +14 -0
- package/dist/types/xlsx/xform/table/auto-filter-xform.d.ts +21 -0
- package/dist/types/xlsx/xform/table/custom-filter-xform.d.ts +15 -0
- package/dist/types/xlsx/xform/table/filter-column-xform.d.ts +24 -0
- package/dist/types/xlsx/xform/table/filter-xform.d.ts +14 -0
- package/dist/types/xlsx/xform/table/table-column-xform.d.ts +21 -0
- package/dist/types/xlsx/xform/table/table-style-info-xform.d.ts +18 -0
- package/dist/types/xlsx/xform/table/table-xform.d.ts +33 -0
- package/dist/types/xlsx/xlsx.base.d.ts +134 -0
- package/dist/types/xlsx/xlsx.browser.d.ts +31 -0
- package/dist/types/xlsx/xlsx.d.ts +26 -0
- package/package.json +22 -16
- package/THIRD_PARTY_NOTICES.md +0 -112
- package/dist/cjs/modules/archive/byte-queue.js +0 -129
- package/dist/cjs/modules/archive/compress.base.js +0 -186
- package/dist/cjs/modules/archive/compress.browser.js +0 -98
- package/dist/cjs/modules/archive/compress.js +0 -127
- package/dist/cjs/modules/archive/crc32.base.js +0 -56
- package/dist/cjs/modules/archive/crc32.browser.js +0 -39
- package/dist/cjs/modules/archive/crc32.js +0 -128
- package/dist/cjs/modules/archive/defaults.js +0 -6
- package/dist/cjs/modules/archive/deflate-fallback.js +0 -569
- package/dist/cjs/modules/archive/extract.js +0 -114
- package/dist/cjs/modules/archive/index.base.js +0 -28
- package/dist/cjs/modules/archive/index.browser.js +0 -47
- package/dist/cjs/modules/archive/index.js +0 -45
- package/dist/cjs/modules/archive/parse.base.js +0 -632
- package/dist/cjs/modules/archive/parse.browser.js +0 -570
- package/dist/cjs/modules/archive/parse.js +0 -103
- package/dist/cjs/modules/archive/streaming-compress.base.js +0 -12
- package/dist/cjs/modules/archive/streaming-compress.browser.js +0 -301
- package/dist/cjs/modules/archive/streaming-compress.js +0 -73
- package/dist/cjs/modules/archive/streaming-zip.js +0 -411
- package/dist/cjs/modules/archive/utils/binary.js +0 -75
- package/dist/cjs/modules/archive/utils/bytes.js +0 -106
- package/dist/cjs/modules/archive/utils/parse-buffer.js +0 -59
- package/dist/cjs/modules/archive/utils/text.js +0 -39
- package/dist/cjs/modules/archive/utils/timestamps.js +0 -56
- package/dist/cjs/modules/archive/utils/zip-extra-fields.js +0 -75
- package/dist/cjs/modules/archive/utils/zip-extra.js +0 -74
- package/dist/cjs/modules/archive/zip-builder.js +0 -297
- package/dist/cjs/modules/archive/zip-constants.js +0 -26
- package/dist/cjs/modules/archive/zip-entry-info.js +0 -7
- package/dist/cjs/modules/archive/zip-entry-metadata.js +0 -29
- package/dist/cjs/modules/archive/zip-parser.js +0 -336
- package/dist/cjs/modules/archive/zip-records.js +0 -90
- package/dist/cjs/modules/csv/csv-core.js +0 -730
- package/dist/cjs/modules/csv/csv-stream.js +0 -711
- package/dist/cjs/modules/csv/csv.browser.js +0 -276
- package/dist/cjs/modules/csv/csv.js +0 -37
- package/dist/cjs/modules/excel/anchor.js +0 -100
- package/dist/cjs/modules/excel/cell.js +0 -949
- package/dist/cjs/modules/excel/column.js +0 -361
- package/dist/cjs/modules/excel/data-validations.js +0 -46
- package/dist/cjs/modules/excel/defined-names.js +0 -217
- package/dist/cjs/modules/excel/image.js +0 -63
- package/dist/cjs/modules/excel/note.js +0 -64
- package/dist/cjs/modules/excel/pivot-table.js +0 -239
- package/dist/cjs/modules/excel/range.js +0 -283
- package/dist/cjs/modules/excel/row.js +0 -444
- package/dist/cjs/modules/excel/stream/hyperlink-reader.js +0 -87
- package/dist/cjs/modules/excel/stream/sheet-comments-writer.js +0 -104
- package/dist/cjs/modules/excel/stream/sheet-rels-writer.js +0 -94
- package/dist/cjs/modules/excel/stream/workbook-reader.browser.js +0 -447
- package/dist/cjs/modules/excel/stream/workbook-reader.js +0 -57
- package/dist/cjs/modules/excel/stream/workbook-writer.browser.js +0 -360
- package/dist/cjs/modules/excel/stream/workbook-writer.js +0 -58
- package/dist/cjs/modules/excel/stream/worksheet-reader.js +0 -370
- package/dist/cjs/modules/excel/stream/worksheet-writer.js +0 -616
- package/dist/cjs/modules/excel/table.js +0 -408
- package/dist/cjs/modules/excel/utils/cell-format.js +0 -819
- package/dist/cjs/modules/excel/utils/cell-matrix.js +0 -183
- package/dist/cjs/modules/excel/utils/encryptor.browser.js +0 -49
- package/dist/cjs/modules/excel/utils/encryptor.js +0 -41
- package/dist/cjs/modules/excel/utils/ooxml-paths.js +0 -260
- package/dist/cjs/modules/excel/utils/parse-sax.js +0 -1210
- package/dist/cjs/modules/excel/utils/shared-formula.js +0 -38
- package/dist/cjs/modules/excel/utils/sheet-utils.js +0 -693
- package/dist/cjs/modules/excel/utils/stream-buf.js +0 -456
- package/dist/cjs/modules/excel/utils/string-buf.js +0 -78
- package/dist/cjs/modules/excel/utils/under-dash.js +0 -175
- package/dist/cjs/modules/excel/utils/xml-stream.js +0 -182
- package/dist/cjs/modules/excel/workbook.js +0 -317
- package/dist/cjs/modules/excel/worksheet.js +0 -927
- package/dist/cjs/modules/excel/xlsx/xform/base-xform.js +0 -138
- package/dist/cjs/modules/excel/xlsx/xform/book/defined-name-xform.js +0 -127
- package/dist/cjs/modules/excel/xlsx/xform/book/sheet-xform.js +0 -33
- package/dist/cjs/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.js +0 -24
- package/dist/cjs/modules/excel/xlsx/xform/book/workbook-pivot-cache-xform.js +0 -27
- package/dist/cjs/modules/excel/xlsx/xform/book/workbook-properties-xform.js +0 -27
- package/dist/cjs/modules/excel/xlsx/xform/book/workbook-view-xform.js +0 -49
- package/dist/cjs/modules/excel/xlsx/xform/book/workbook-xform.js +0 -237
- package/dist/cjs/modules/excel/xlsx/xform/comment/comment-xform.js +0 -79
- package/dist/cjs/modules/excel/xlsx/xform/comment/comments-xform.js +0 -75
- package/dist/cjs/modules/excel/xlsx/xform/comment/style/vml-position-xform.js +0 -37
- package/dist/cjs/modules/excel/xlsx/xform/comment/style/vml-protection-xform.js +0 -33
- package/dist/cjs/modules/excel/xlsx/xform/comment/vml-anchor-xform.js +0 -58
- package/dist/cjs/modules/excel/xlsx/xform/comment/vml-client-data-xform.js +0 -85
- package/dist/cjs/modules/excel/xlsx/xform/comment/vml-notes-xform.js +0 -99
- package/dist/cjs/modules/excel/xlsx/xform/comment/vml-shape-xform.js +0 -86
- package/dist/cjs/modules/excel/xlsx/xform/comment/vml-textbox-xform.js +0 -63
- package/dist/cjs/modules/excel/xlsx/xform/composite-xform.js +0 -51
- package/dist/cjs/modules/excel/xlsx/xform/core/app-heading-pairs-xform.js +0 -27
- package/dist/cjs/modules/excel/xlsx/xform/core/app-titles-of-parts-xform.js +0 -24
- package/dist/cjs/modules/excel/xlsx/xform/core/app-xform.js +0 -86
- package/dist/cjs/modules/excel/xlsx/xform/core/content-types-xform.js +0 -125
- package/dist/cjs/modules/excel/xlsx/xform/core/core-xform.js +0 -127
- package/dist/cjs/modules/excel/xlsx/xform/core/relationship-xform.js +0 -23
- package/dist/cjs/modules/excel/xlsx/xform/core/relationships-xform.js +0 -65
- package/dist/cjs/modules/excel/xlsx/xform/drawing/base-cell-anchor-xform.js +0 -47
- package/dist/cjs/modules/excel/xlsx/xform/drawing/blip-fill-xform.js +0 -60
- package/dist/cjs/modules/excel/xlsx/xform/drawing/blip-xform.js +0 -43
- package/dist/cjs/modules/excel/xlsx/xform/drawing/c-nv-pic-pr-xform.js +0 -35
- package/dist/cjs/modules/excel/xlsx/xform/drawing/c-nv-pr-xform.js +0 -62
- package/dist/cjs/modules/excel/xlsx/xform/drawing/cell-position-xform.js +0 -71
- package/dist/cjs/modules/excel/xlsx/xform/drawing/drawing-xform.js +0 -99
- package/dist/cjs/modules/excel/xlsx/xform/drawing/ext-lst-xform.js +0 -40
- package/dist/cjs/modules/excel/xlsx/xform/drawing/ext-xform.js +0 -37
- package/dist/cjs/modules/excel/xlsx/xform/drawing/hlink-click-xform.js +0 -42
- package/dist/cjs/modules/excel/xlsx/xform/drawing/nv-pic-pr-xform.js +0 -59
- package/dist/cjs/modules/excel/xlsx/xform/drawing/one-cell-anchor-xform.js +0 -55
- package/dist/cjs/modules/excel/xlsx/xform/drawing/pic-xform.js +0 -67
- package/dist/cjs/modules/excel/xlsx/xform/drawing/two-cell-anchor-xform.js +0 -54
- package/dist/cjs/modules/excel/xlsx/xform/list-xform.js +0 -92
- package/dist/cjs/modules/excel/xlsx/xform/pivot-table/cache-field-xform.js +0 -131
- package/dist/cjs/modules/excel/xlsx/xform/pivot-table/cache-field.js +0 -81
- package/dist/cjs/modules/excel/xlsx/xform/pivot-table/pivot-cache-definition-xform.js +0 -182
- package/dist/cjs/modules/excel/xlsx/xform/pivot-table/pivot-cache-records-xform.js +0 -237
- package/dist/cjs/modules/excel/xlsx/xform/pivot-table/pivot-table-xform.js +0 -627
- package/dist/cjs/modules/excel/xlsx/xform/sheet/auto-filter-xform.js +0 -37
- package/dist/cjs/modules/excel/xlsx/xform/sheet/cell-xform.js +0 -463
- package/dist/cjs/modules/excel/xlsx/xform/sheet/cf/cf-rule-xform.js +0 -262
- package/dist/cjs/modules/excel/xlsx/xform/sheet/cf/cfvo-xform.js +0 -25
- package/dist/cjs/modules/excel/xlsx/xform/sheet/cf/color-scale-xform.js +0 -38
- package/dist/cjs/modules/excel/xlsx/xform/sheet/cf/conditional-formatting-xform.js +0 -40
- package/dist/cjs/modules/excel/xlsx/xform/sheet/cf/conditional-formattings-xform.js +0 -77
- package/dist/cjs/modules/excel/xlsx/xform/sheet/cf/databar-xform.js +0 -42
- package/dist/cjs/modules/excel/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +0 -70
- package/dist/cjs/modules/excel/xlsx/xform/sheet/cf/formula-xform.js +0 -22
- package/dist/cjs/modules/excel/xlsx/xform/sheet/cf/icon-set-xform.js +0 -40
- package/dist/cjs/modules/excel/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +0 -25
- package/dist/cjs/modules/excel/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +0 -83
- package/dist/cjs/modules/excel/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +0 -38
- package/dist/cjs/modules/excel/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +0 -51
- package/dist/cjs/modules/excel/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +0 -43
- package/dist/cjs/modules/excel/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +0 -72
- package/dist/cjs/modules/excel/xlsx/xform/sheet/cf-ext/f-ext-xform.js +0 -22
- package/dist/cjs/modules/excel/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +0 -63
- package/dist/cjs/modules/excel/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +0 -22
- package/dist/cjs/modules/excel/xlsx/xform/sheet/col-breaks-xform.js +0 -38
- package/dist/cjs/modules/excel/xlsx/xform/sheet/col-xform.js +0 -78
- package/dist/cjs/modules/excel/xlsx/xform/sheet/data-validations-xform.js +0 -272
- package/dist/cjs/modules/excel/xlsx/xform/sheet/dimension-xform.js +0 -26
- package/dist/cjs/modules/excel/xlsx/xform/sheet/drawing-xform.js +0 -30
- package/dist/cjs/modules/excel/xlsx/xform/sheet/ext-lst-xform.js +0 -69
- package/dist/cjs/modules/excel/xlsx/xform/sheet/header-footer-xform.js +0 -127
- package/dist/cjs/modules/excel/xlsx/xform/sheet/hyperlink-xform.js +0 -50
- package/dist/cjs/modules/excel/xlsx/xform/sheet/merge-cell-xform.js +0 -24
- package/dist/cjs/modules/excel/xlsx/xform/sheet/merges.js +0 -53
- package/dist/cjs/modules/excel/xlsx/xform/sheet/outline-properties-xform.js +0 -39
- package/dist/cjs/modules/excel/xlsx/xform/sheet/page-breaks-xform.js +0 -36
- package/dist/cjs/modules/excel/xlsx/xform/sheet/page-margins-xform.js +0 -45
- package/dist/cjs/modules/excel/xlsx/xform/sheet/page-setup-properties-xform.js +0 -32
- package/dist/cjs/modules/excel/xlsx/xform/sheet/page-setup-xform.js +0 -99
- package/dist/cjs/modules/excel/xlsx/xform/sheet/picture-xform.js +0 -30
- package/dist/cjs/modules/excel/xlsx/xform/sheet/print-options-xform.js +0 -44
- package/dist/cjs/modules/excel/xlsx/xform/sheet/row-breaks-xform.js +0 -32
- package/dist/cjs/modules/excel/xlsx/xform/sheet/row-xform.js +0 -155
- package/dist/cjs/modules/excel/xlsx/xform/sheet/sheet-format-properties-xform.js +0 -52
- package/dist/cjs/modules/excel/xlsx/xform/sheet/sheet-properties-xform.js +0 -85
- package/dist/cjs/modules/excel/xlsx/xform/sheet/sheet-protection-xform.js +0 -83
- package/dist/cjs/modules/excel/xlsx/xform/sheet/sheet-view-xform.js +0 -196
- package/dist/cjs/modules/excel/xlsx/xform/sheet/table-part-xform.js +0 -30
- package/dist/cjs/modules/excel/xlsx/xform/sheet/worksheet-xform.js +0 -521
- package/dist/cjs/modules/excel/xlsx/xform/simple/boolean-xform.js +0 -27
- package/dist/cjs/modules/excel/xlsx/xform/simple/date-xform.js +0 -68
- package/dist/cjs/modules/excel/xlsx/xform/simple/float-xform.js +0 -50
- package/dist/cjs/modules/excel/xlsx/xform/simple/integer-xform.js +0 -55
- package/dist/cjs/modules/excel/xlsx/xform/simple/string-xform.js +0 -50
- package/dist/cjs/modules/excel/xlsx/xform/static-xform.js +0 -58
- package/dist/cjs/modules/excel/xlsx/xform/strings/phonetic-text-xform.js +0 -89
- package/dist/cjs/modules/excel/xlsx/xform/strings/rich-text-xform.js +0 -80
- package/dist/cjs/modules/excel/xlsx/xform/strings/shared-string-xform.js +0 -93
- package/dist/cjs/modules/excel/xlsx/xform/strings/shared-strings-xform.js +0 -112
- package/dist/cjs/modules/excel/xlsx/xform/strings/text-xform.js +0 -39
- package/dist/cjs/modules/excel/xlsx/xform/style/alignment-xform.js +0 -155
- package/dist/cjs/modules/excel/xlsx/xform/style/border-xform.js +0 -191
- package/dist/cjs/modules/excel/xlsx/xform/style/color-xform.js +0 -64
- package/dist/cjs/modules/excel/xlsx/xform/style/dxf-xform.js +0 -95
- package/dist/cjs/modules/excel/xlsx/xform/style/fill-xform.js +0 -315
- package/dist/cjs/modules/excel/xlsx/xform/style/font-xform.js +0 -103
- package/dist/cjs/modules/excel/xlsx/xform/style/numfmt-xform.js +0 -53
- package/dist/cjs/modules/excel/xlsx/xform/style/protection-xform.js +0 -52
- package/dist/cjs/modules/excel/xlsx/xform/style/style-xform.js +0 -111
- package/dist/cjs/modules/excel/xlsx/xform/style/styles-xform.js +0 -487
- package/dist/cjs/modules/excel/xlsx/xform/style/underline-xform.js +0 -41
- package/dist/cjs/modules/excel/xlsx/xform/table/auto-filter-xform.js +0 -73
- package/dist/cjs/modules/excel/xlsx/xform/table/custom-filter-xform.js +0 -34
- package/dist/cjs/modules/excel/xlsx/xform/table/filter-column-xform.js +0 -90
- package/dist/cjs/modules/excel/xlsx/xform/table/filter-xform.js +0 -32
- package/dist/cjs/modules/excel/xlsx/xform/table/table-column-xform.js +0 -44
- package/dist/cjs/modules/excel/xlsx/xform/table/table-style-info-xform.js +0 -47
- package/dist/cjs/modules/excel/xlsx/xform/table/table-xform.js +0 -129
- package/dist/cjs/modules/excel/xlsx/xlsx.browser.js +0 -1155
- package/dist/cjs/modules/excel/xlsx/xlsx.js +0 -245
- package/dist/cjs/modules/stream/base-transform.js +0 -164
- package/dist/cjs/modules/stream/buffered-stream.js +0 -283
- package/dist/cjs/modules/stream/chunked-builder.js +0 -170
- package/dist/cjs/modules/stream/event-emitter.js +0 -243
- package/dist/cjs/modules/stream/index.browser.js +0 -97
- package/dist/cjs/modules/stream/index.js +0 -124
- package/dist/cjs/modules/stream/pull-stream.js +0 -208
- package/dist/cjs/modules/stream/shared.js +0 -168
- package/dist/cjs/modules/stream/streams.browser.js +0 -3318
- package/dist/cjs/modules/stream/streams.js +0 -988
- package/dist/cjs/modules/stream/types.js +0 -8
- package/dist/cjs/modules/stream/utils.js +0 -96
- package/dist/cjs/utils/browser.js +0 -55
- package/dist/cjs/utils/env.js +0 -22
- package/dist/cjs/utils/uuid.js +0 -58
- package/dist/esm/modules/archive/byte-queue.js +0 -125
- package/dist/esm/modules/archive/compress.base.js +0 -173
- package/dist/esm/modules/archive/compress.browser.js +0 -93
- package/dist/esm/modules/archive/compress.js +0 -86
- package/dist/esm/modules/archive/crc32.base.js +0 -51
- package/dist/esm/modules/archive/crc32.browser.js +0 -32
- package/dist/esm/modules/archive/crc32.js +0 -97
- package/dist/esm/modules/archive/defaults.js +0 -3
- package/dist/esm/modules/archive/deflate-fallback.js +0 -564
- package/dist/esm/modules/archive/extract.js +0 -106
- package/dist/esm/modules/archive/index.base.js +0 -13
- package/dist/esm/modules/archive/index.browser.js +0 -17
- package/dist/esm/modules/archive/index.js +0 -15
- package/dist/esm/modules/archive/parse.base.js +0 -610
- package/dist/esm/modules/archive/parse.browser.js +0 -564
- package/dist/esm/modules/archive/parse.js +0 -94
- package/dist/esm/modules/archive/streaming-compress.base.js +0 -9
- package/dist/esm/modules/archive/streaming-compress.browser.js +0 -296
- package/dist/esm/modules/archive/streaming-compress.js +0 -68
- package/dist/esm/modules/archive/streaming-zip.js +0 -407
- package/dist/esm/modules/archive/utils/binary.js +0 -69
- package/dist/esm/modules/archive/utils/bytes.js +0 -101
- package/dist/esm/modules/archive/utils/parse-buffer.js +0 -55
- package/dist/esm/modules/archive/utils/text.js +0 -33
- package/dist/esm/modules/archive/utils/timestamps.js +0 -48
- package/dist/esm/modules/archive/utils/zip-extra-fields.js +0 -72
- package/dist/esm/modules/archive/utils/zip-extra.js +0 -68
- package/dist/esm/modules/archive/zip-builder.js +0 -292
- package/dist/esm/modules/archive/zip-constants.js +0 -23
- package/dist/esm/modules/archive/zip-entry-info.js +0 -6
- package/dist/esm/modules/archive/zip-entry-metadata.js +0 -24
- package/dist/esm/modules/archive/zip-parser.js +0 -332
- package/dist/esm/modules/archive/zip-records.js +0 -84
- package/dist/esm/modules/csv/csv-core.js +0 -723
- package/dist/esm/modules/csv/csv-stream.js +0 -703
- package/dist/esm/modules/csv/csv.browser.js +0 -265
- package/dist/esm/modules/csv/csv.js +0 -29
- package/dist/esm/modules/excel/anchor.js +0 -97
- package/dist/esm/modules/excel/cell.js +0 -946
- package/dist/esm/modules/excel/column.js +0 -358
- package/dist/esm/modules/excel/data-validations.js +0 -43
- package/dist/esm/modules/excel/defined-names.js +0 -214
- package/dist/esm/modules/excel/image.js +0 -60
- package/dist/esm/modules/excel/note.js +0 -61
- package/dist/esm/modules/excel/pivot-table.js +0 -237
- package/dist/esm/modules/excel/range.js +0 -280
- package/dist/esm/modules/excel/row.js +0 -441
- package/dist/esm/modules/excel/stream/hyperlink-reader.js +0 -84
- package/dist/esm/modules/excel/stream/sheet-comments-writer.js +0 -101
- package/dist/esm/modules/excel/stream/sheet-rels-writer.js +0 -91
- package/dist/esm/modules/excel/stream/workbook-reader.browser.js +0 -443
- package/dist/esm/modules/excel/stream/workbook-reader.js +0 -50
- package/dist/esm/modules/excel/stream/workbook-writer.browser.js +0 -356
- package/dist/esm/modules/excel/stream/workbook-writer.js +0 -52
- package/dist/esm/modules/excel/stream/worksheet-reader.js +0 -367
- package/dist/esm/modules/excel/stream/worksheet-writer.js +0 -613
- package/dist/esm/modules/excel/table.js +0 -405
- package/dist/esm/modules/excel/utils/cell-format.js +0 -814
- package/dist/esm/modules/excel/utils/cell-matrix.js +0 -180
- package/dist/esm/modules/excel/utils/encryptor.browser.js +0 -46
- package/dist/esm/modules/excel/utils/encryptor.js +0 -35
- package/dist/esm/modules/excel/utils/ooxml-paths.js +0 -209
- package/dist/esm/modules/excel/utils/parse-sax.js +0 -1206
- package/dist/esm/modules/excel/utils/shared-formula.js +0 -36
- package/dist/esm/modules/excel/utils/sheet-utils.js +0 -674
- package/dist/esm/modules/excel/utils/stream-buf.js +0 -453
- package/dist/esm/modules/excel/utils/string-buf.js +0 -75
- package/dist/esm/modules/excel/utils/under-dash.js +0 -166
- package/dist/esm/modules/excel/utils/xml-stream.js +0 -179
- package/dist/esm/modules/excel/workbook.js +0 -314
- package/dist/esm/modules/excel/worksheet.js +0 -924
- package/dist/esm/modules/excel/xlsx/xform/base-xform.js +0 -135
- package/dist/esm/modules/excel/xlsx/xform/book/defined-name-xform.js +0 -124
- package/dist/esm/modules/excel/xlsx/xform/book/sheet-xform.js +0 -30
- package/dist/esm/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.js +0 -21
- package/dist/esm/modules/excel/xlsx/xform/book/workbook-pivot-cache-xform.js +0 -24
- package/dist/esm/modules/excel/xlsx/xform/book/workbook-properties-xform.js +0 -24
- package/dist/esm/modules/excel/xlsx/xform/book/workbook-view-xform.js +0 -46
- package/dist/esm/modules/excel/xlsx/xform/book/workbook-xform.js +0 -234
- package/dist/esm/modules/excel/xlsx/xform/comment/comment-xform.js +0 -76
- package/dist/esm/modules/excel/xlsx/xform/comment/comments-xform.js +0 -72
- package/dist/esm/modules/excel/xlsx/xform/comment/style/vml-position-xform.js +0 -34
- package/dist/esm/modules/excel/xlsx/xform/comment/style/vml-protection-xform.js +0 -30
- package/dist/esm/modules/excel/xlsx/xform/comment/vml-anchor-xform.js +0 -55
- package/dist/esm/modules/excel/xlsx/xform/comment/vml-client-data-xform.js +0 -82
- package/dist/esm/modules/excel/xlsx/xform/comment/vml-notes-xform.js +0 -96
- package/dist/esm/modules/excel/xlsx/xform/comment/vml-shape-xform.js +0 -83
- package/dist/esm/modules/excel/xlsx/xform/comment/vml-textbox-xform.js +0 -60
- package/dist/esm/modules/excel/xlsx/xform/composite-xform.js +0 -48
- package/dist/esm/modules/excel/xlsx/xform/core/app-heading-pairs-xform.js +0 -24
- package/dist/esm/modules/excel/xlsx/xform/core/app-titles-of-parts-xform.js +0 -21
- package/dist/esm/modules/excel/xlsx/xform/core/app-xform.js +0 -83
- package/dist/esm/modules/excel/xlsx/xform/core/content-types-xform.js +0 -122
- package/dist/esm/modules/excel/xlsx/xform/core/core-xform.js +0 -124
- package/dist/esm/modules/excel/xlsx/xform/core/relationship-xform.js +0 -20
- package/dist/esm/modules/excel/xlsx/xform/core/relationships-xform.js +0 -62
- package/dist/esm/modules/excel/xlsx/xform/drawing/base-cell-anchor-xform.js +0 -44
- package/dist/esm/modules/excel/xlsx/xform/drawing/blip-fill-xform.js +0 -57
- package/dist/esm/modules/excel/xlsx/xform/drawing/blip-xform.js +0 -40
- package/dist/esm/modules/excel/xlsx/xform/drawing/c-nv-pic-pr-xform.js +0 -32
- package/dist/esm/modules/excel/xlsx/xform/drawing/c-nv-pr-xform.js +0 -59
- package/dist/esm/modules/excel/xlsx/xform/drawing/cell-position-xform.js +0 -68
- package/dist/esm/modules/excel/xlsx/xform/drawing/drawing-xform.js +0 -96
- package/dist/esm/modules/excel/xlsx/xform/drawing/ext-lst-xform.js +0 -37
- package/dist/esm/modules/excel/xlsx/xform/drawing/ext-xform.js +0 -34
- package/dist/esm/modules/excel/xlsx/xform/drawing/hlink-click-xform.js +0 -39
- package/dist/esm/modules/excel/xlsx/xform/drawing/nv-pic-pr-xform.js +0 -56
- package/dist/esm/modules/excel/xlsx/xform/drawing/one-cell-anchor-xform.js +0 -52
- package/dist/esm/modules/excel/xlsx/xform/drawing/pic-xform.js +0 -64
- package/dist/esm/modules/excel/xlsx/xform/drawing/two-cell-anchor-xform.js +0 -51
- package/dist/esm/modules/excel/xlsx/xform/list-xform.js +0 -89
- package/dist/esm/modules/excel/xlsx/xform/pivot-table/cache-field-xform.js +0 -128
- package/dist/esm/modules/excel/xlsx/xform/pivot-table/cache-field.js +0 -78
- package/dist/esm/modules/excel/xlsx/xform/pivot-table/pivot-cache-definition-xform.js +0 -179
- package/dist/esm/modules/excel/xlsx/xform/pivot-table/pivot-cache-records-xform.js +0 -234
- package/dist/esm/modules/excel/xlsx/xform/pivot-table/pivot-table-xform.js +0 -624
- package/dist/esm/modules/excel/xlsx/xform/sheet/auto-filter-xform.js +0 -34
- package/dist/esm/modules/excel/xlsx/xform/sheet/cell-xform.js +0 -460
- package/dist/esm/modules/excel/xlsx/xform/sheet/cf/cf-rule-xform.js +0 -259
- package/dist/esm/modules/excel/xlsx/xform/sheet/cf/cfvo-xform.js +0 -22
- package/dist/esm/modules/excel/xlsx/xform/sheet/cf/color-scale-xform.js +0 -35
- package/dist/esm/modules/excel/xlsx/xform/sheet/cf/conditional-formatting-xform.js +0 -37
- package/dist/esm/modules/excel/xlsx/xform/sheet/cf/conditional-formattings-xform.js +0 -74
- package/dist/esm/modules/excel/xlsx/xform/sheet/cf/databar-xform.js +0 -39
- package/dist/esm/modules/excel/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +0 -67
- package/dist/esm/modules/excel/xlsx/xform/sheet/cf/formula-xform.js +0 -19
- package/dist/esm/modules/excel/xlsx/xform/sheet/cf/icon-set-xform.js +0 -37
- package/dist/esm/modules/excel/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +0 -22
- package/dist/esm/modules/excel/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +0 -80
- package/dist/esm/modules/excel/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +0 -35
- package/dist/esm/modules/excel/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +0 -48
- package/dist/esm/modules/excel/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +0 -40
- package/dist/esm/modules/excel/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +0 -69
- package/dist/esm/modules/excel/xlsx/xform/sheet/cf-ext/f-ext-xform.js +0 -19
- package/dist/esm/modules/excel/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +0 -60
- package/dist/esm/modules/excel/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +0 -19
- package/dist/esm/modules/excel/xlsx/xform/sheet/col-breaks-xform.js +0 -35
- package/dist/esm/modules/excel/xlsx/xform/sheet/col-xform.js +0 -75
- package/dist/esm/modules/excel/xlsx/xform/sheet/data-validations-xform.js +0 -269
- package/dist/esm/modules/excel/xlsx/xform/sheet/dimension-xform.js +0 -23
- package/dist/esm/modules/excel/xlsx/xform/sheet/drawing-xform.js +0 -27
- package/dist/esm/modules/excel/xlsx/xform/sheet/ext-lst-xform.js +0 -66
- package/dist/esm/modules/excel/xlsx/xform/sheet/header-footer-xform.js +0 -124
- package/dist/esm/modules/excel/xlsx/xform/sheet/hyperlink-xform.js +0 -47
- package/dist/esm/modules/excel/xlsx/xform/sheet/merge-cell-xform.js +0 -21
- package/dist/esm/modules/excel/xlsx/xform/sheet/merges.js +0 -50
- package/dist/esm/modules/excel/xlsx/xform/sheet/outline-properties-xform.js +0 -36
- package/dist/esm/modules/excel/xlsx/xform/sheet/page-breaks-xform.js +0 -33
- package/dist/esm/modules/excel/xlsx/xform/sheet/page-margins-xform.js +0 -42
- package/dist/esm/modules/excel/xlsx/xform/sheet/page-setup-properties-xform.js +0 -29
- package/dist/esm/modules/excel/xlsx/xform/sheet/page-setup-xform.js +0 -96
- package/dist/esm/modules/excel/xlsx/xform/sheet/picture-xform.js +0 -27
- package/dist/esm/modules/excel/xlsx/xform/sheet/print-options-xform.js +0 -41
- package/dist/esm/modules/excel/xlsx/xform/sheet/row-breaks-xform.js +0 -29
- package/dist/esm/modules/excel/xlsx/xform/sheet/row-xform.js +0 -152
- package/dist/esm/modules/excel/xlsx/xform/sheet/sheet-format-properties-xform.js +0 -49
- package/dist/esm/modules/excel/xlsx/xform/sheet/sheet-properties-xform.js +0 -82
- package/dist/esm/modules/excel/xlsx/xform/sheet/sheet-protection-xform.js +0 -80
- package/dist/esm/modules/excel/xlsx/xform/sheet/sheet-view-xform.js +0 -193
- package/dist/esm/modules/excel/xlsx/xform/sheet/table-part-xform.js +0 -27
- package/dist/esm/modules/excel/xlsx/xform/sheet/worksheet-xform.js +0 -518
- package/dist/esm/modules/excel/xlsx/xform/simple/boolean-xform.js +0 -24
- package/dist/esm/modules/excel/xlsx/xform/simple/date-xform.js +0 -65
- package/dist/esm/modules/excel/xlsx/xform/simple/float-xform.js +0 -47
- package/dist/esm/modules/excel/xlsx/xform/simple/integer-xform.js +0 -52
- package/dist/esm/modules/excel/xlsx/xform/simple/string-xform.js +0 -47
- package/dist/esm/modules/excel/xlsx/xform/static-xform.js +0 -55
- package/dist/esm/modules/excel/xlsx/xform/strings/phonetic-text-xform.js +0 -86
- package/dist/esm/modules/excel/xlsx/xform/strings/rich-text-xform.js +0 -77
- package/dist/esm/modules/excel/xlsx/xform/strings/shared-string-xform.js +0 -90
- package/dist/esm/modules/excel/xlsx/xform/strings/shared-strings-xform.js +0 -109
- package/dist/esm/modules/excel/xlsx/xform/strings/text-xform.js +0 -36
- package/dist/esm/modules/excel/xlsx/xform/style/alignment-xform.js +0 -152
- package/dist/esm/modules/excel/xlsx/xform/style/border-xform.js +0 -188
- package/dist/esm/modules/excel/xlsx/xform/style/color-xform.js +0 -61
- package/dist/esm/modules/excel/xlsx/xform/style/dxf-xform.js +0 -92
- package/dist/esm/modules/excel/xlsx/xform/style/fill-xform.js +0 -312
- package/dist/esm/modules/excel/xlsx/xform/style/font-xform.js +0 -100
- package/dist/esm/modules/excel/xlsx/xform/style/numfmt-xform.js +0 -50
- package/dist/esm/modules/excel/xlsx/xform/style/protection-xform.js +0 -49
- package/dist/esm/modules/excel/xlsx/xform/style/style-xform.js +0 -108
- package/dist/esm/modules/excel/xlsx/xform/style/styles-xform.js +0 -484
- package/dist/esm/modules/excel/xlsx/xform/style/underline-xform.js +0 -38
- package/dist/esm/modules/excel/xlsx/xform/table/auto-filter-xform.js +0 -70
- package/dist/esm/modules/excel/xlsx/xform/table/custom-filter-xform.js +0 -31
- package/dist/esm/modules/excel/xlsx/xform/table/filter-column-xform.js +0 -87
- package/dist/esm/modules/excel/xlsx/xform/table/filter-xform.js +0 -29
- package/dist/esm/modules/excel/xlsx/xform/table/table-column-xform.js +0 -41
- package/dist/esm/modules/excel/xlsx/xform/table/table-style-info-xform.js +0 -44
- package/dist/esm/modules/excel/xlsx/xform/table/table-xform.js +0 -126
- package/dist/esm/modules/excel/xlsx/xlsx.browser.js +0 -1152
- package/dist/esm/modules/excel/xlsx/xlsx.js +0 -239
- package/dist/esm/modules/stream/base-transform.js +0 -160
- package/dist/esm/modules/stream/buffered-stream.js +0 -277
- package/dist/esm/modules/stream/chunked-builder.js +0 -165
- package/dist/esm/modules/stream/event-emitter.js +0 -239
- package/dist/esm/modules/stream/index.browser.js +0 -25
- package/dist/esm/modules/stream/index.js +0 -52
- package/dist/esm/modules/stream/pull-stream.js +0 -204
- package/dist/esm/modules/stream/shared.js +0 -156
- package/dist/esm/modules/stream/streams.browser.js +0 -3267
- package/dist/esm/modules/stream/streams.js +0 -940
- package/dist/esm/modules/stream/types.js +0 -7
- package/dist/esm/modules/stream/utils.js +0 -85
- package/dist/esm/utils/browser.js +0 -49
- package/dist/esm/utils/env.js +0 -18
- package/dist/esm/utils/uuid.js +0 -55
- package/dist/types/modules/archive/byte-queue.d.ts +0 -18
- package/dist/types/modules/archive/compress.base.d.ts +0 -98
- package/dist/types/modules/archive/compress.browser.d.ts +0 -57
- package/dist/types/modules/archive/compress.d.ts +0 -44
- package/dist/types/modules/archive/crc32.base.d.ts +0 -25
- package/dist/types/modules/archive/crc32.browser.d.ts +0 -30
- package/dist/types/modules/archive/crc32.d.ts +0 -59
- package/dist/types/modules/archive/defaults.d.ts +0 -4
- package/dist/types/modules/archive/extract.d.ts +0 -94
- package/dist/types/modules/archive/index.base.d.ts +0 -11
- package/dist/types/modules/archive/index.browser.d.ts +0 -11
- package/dist/types/modules/archive/index.d.ts +0 -11
- package/dist/types/modules/archive/parse.base.d.ts +0 -198
- package/dist/types/modules/archive/parse.browser.d.ts +0 -22
- package/dist/types/modules/archive/parse.d.ts +0 -16
- package/dist/types/modules/archive/streaming-compress.base.d.ts +0 -36
- package/dist/types/modules/archive/streaming-compress.browser.d.ts +0 -26
- package/dist/types/modules/archive/streaming-compress.d.ts +0 -22
- package/dist/types/modules/archive/streaming-zip.d.ts +0 -120
- package/dist/types/modules/archive/utils/binary.d.ts +0 -24
- package/dist/types/modules/archive/utils/bytes.d.ts +0 -7
- package/dist/types/modules/archive/utils/parse-buffer.d.ts +0 -18
- package/dist/types/modules/archive/utils/text.d.ts +0 -20
- package/dist/types/modules/archive/utils/timestamps.d.ts +0 -28
- package/dist/types/modules/archive/utils/zip-extra-fields.d.ts +0 -19
- package/dist/types/modules/archive/utils/zip-extra.d.ts +0 -18
- package/dist/types/modules/archive/zip-builder.d.ts +0 -117
- package/dist/types/modules/archive/zip-constants.d.ts +0 -18
- package/dist/types/modules/archive/zip-entry-info.d.ts +0 -29
- package/dist/types/modules/archive/zip-entry-metadata.d.ts +0 -23
- package/dist/types/modules/archive/zip-parser.d.ts +0 -62
- package/dist/types/modules/archive/zip-records.d.ts +0 -43
- package/dist/types/modules/csv/csv-core.d.ts +0 -215
- package/dist/types/modules/csv/csv-stream.d.ts +0 -121
- package/dist/types/modules/csv/csv.browser.d.ts +0 -60
- package/dist/types/modules/csv/csv.d.ts +0 -14
- package/dist/types/modules/excel/anchor.d.ts +0 -33
- package/dist/types/modules/excel/cell.d.ts +0 -138
- package/dist/types/modules/excel/column.d.ts +0 -122
- package/dist/types/modules/excel/defined-names.d.ts +0 -37
- package/dist/types/modules/excel/image.d.ts +0 -64
- package/dist/types/modules/excel/pivot-table.d.ts +0 -152
- package/dist/types/modules/excel/range.d.ts +0 -62
- package/dist/types/modules/excel/row.d.ts +0 -127
- package/dist/types/modules/excel/stream/hyperlink-reader.d.ts +0 -33
- package/dist/types/modules/excel/stream/workbook-reader.browser.d.ts +0 -169
- package/dist/types/modules/excel/stream/workbook-reader.d.ts +0 -24
- package/dist/types/modules/excel/stream/workbook-writer.browser.d.ts +0 -147
- package/dist/types/modules/excel/stream/workbook-writer.d.ts +0 -31
- package/dist/types/modules/excel/stream/worksheet-reader.d.ts +0 -61
- package/dist/types/modules/excel/stream/worksheet-writer.d.ts +0 -140
- package/dist/types/modules/excel/table.d.ts +0 -81
- package/dist/types/modules/excel/utils/col-cache.d.ts +0 -36
- package/dist/types/modules/excel/utils/encryptor.browser.d.ts +0 -19
- package/dist/types/modules/excel/utils/encryptor.d.ts +0 -9
- package/dist/types/modules/excel/utils/iterate-stream.d.ts +0 -14
- package/dist/types/modules/excel/utils/ooxml-paths.d.ts +0 -64
- package/dist/types/modules/excel/utils/sheet-utils.d.ts +0 -190
- package/dist/types/modules/excel/utils/stream-buf.d.ts +0 -126
- package/dist/types/modules/excel/utils/string-buf.d.ts +0 -29
- package/dist/types/modules/excel/workbook.d.ts +0 -195
- package/dist/types/modules/excel/worksheet.d.ts +0 -333
- package/dist/types/modules/excel/xlsx/xform/base-xform.d.ts +0 -33
- package/dist/types/modules/excel/xlsx/xform/book/defined-name-xform.d.ts +0 -17
- package/dist/types/modules/excel/xlsx/xform/book/sheet-xform.d.ts +0 -14
- package/dist/types/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.d.ts +0 -11
- package/dist/types/modules/excel/xlsx/xform/book/workbook-pivot-cache-xform.d.ts +0 -12
- package/dist/types/modules/excel/xlsx/xform/book/workbook-properties-xform.d.ts +0 -11
- package/dist/types/modules/excel/xlsx/xform/book/workbook-view-xform.d.ts +0 -17
- package/dist/types/modules/excel/xlsx/xform/book/workbook-xform.d.ts +0 -23
- package/dist/types/modules/excel/xlsx/xform/comment/comment-xform.d.ts +0 -28
- package/dist/types/modules/excel/xlsx/xform/comment/comments-xform.d.ts +0 -21
- package/dist/types/modules/excel/xlsx/xform/comment/style/vml-position-xform.d.ts +0 -16
- package/dist/types/modules/excel/xlsx/xform/comment/style/vml-protection-xform.d.ts +0 -14
- package/dist/types/modules/excel/xlsx/xform/comment/vml-anchor-xform.d.ts +0 -27
- package/dist/types/modules/excel/xlsx/xform/comment/vml-client-data-xform.d.ts +0 -35
- package/dist/types/modules/excel/xlsx/xform/comment/vml-notes-xform.d.ts +0 -24
- package/dist/types/modules/excel/xlsx/xform/comment/vml-shape-xform.d.ts +0 -25
- package/dist/types/modules/excel/xlsx/xform/comment/vml-textbox-xform.d.ts +0 -23
- package/dist/types/modules/excel/xlsx/xform/composite-xform.d.ts +0 -11
- package/dist/types/modules/excel/xlsx/xform/core/app-heading-pairs-xform.d.ts +0 -8
- package/dist/types/modules/excel/xlsx/xform/core/app-titles-of-parts-xform.d.ts +0 -8
- package/dist/types/modules/excel/xlsx/xform/core/app-xform.d.ts +0 -26
- package/dist/types/modules/excel/xlsx/xform/core/content-types-xform.d.ts +0 -11
- package/dist/types/modules/excel/xlsx/xform/core/core-xform.d.ts +0 -42
- package/dist/types/modules/excel/xlsx/xform/core/relationship-xform.d.ts +0 -14
- package/dist/types/modules/excel/xlsx/xform/core/relationships-xform.d.ts +0 -14
- package/dist/types/modules/excel/xlsx/xform/drawing/base-cell-anchor-xform.d.ts +0 -13
- package/dist/types/modules/excel/xlsx/xform/drawing/blip-fill-xform.d.ts +0 -16
- package/dist/types/modules/excel/xlsx/xform/drawing/blip-xform.d.ts +0 -14
- package/dist/types/modules/excel/xlsx/xform/drawing/c-nv-pic-pr-xform.d.ts +0 -9
- package/dist/types/modules/excel/xlsx/xform/drawing/c-nv-pr-xform.d.ts +0 -18
- package/dist/types/modules/excel/xlsx/xform/drawing/cell-position-xform.d.ts +0 -24
- package/dist/types/modules/excel/xlsx/xform/drawing/drawing-xform.d.ts +0 -24
- package/dist/types/modules/excel/xlsx/xform/drawing/ext-lst-xform.d.ts +0 -9
- package/dist/types/modules/excel/xlsx/xform/drawing/ext-xform.d.ts +0 -20
- package/dist/types/modules/excel/xlsx/xform/drawing/hlink-click-xform.d.ts +0 -11
- package/dist/types/modules/excel/xlsx/xform/drawing/nv-pic-pr-xform.d.ts +0 -15
- package/dist/types/modules/excel/xlsx/xform/drawing/one-cell-anchor-xform.d.ts +0 -20
- package/dist/types/modules/excel/xlsx/xform/drawing/pic-xform.d.ts +0 -22
- package/dist/types/modules/excel/xlsx/xform/drawing/two-cell-anchor-xform.d.ts +0 -20
- package/dist/types/modules/excel/xlsx/xform/list-xform.d.ts +0 -32
- package/dist/types/modules/excel/xlsx/xform/pivot-table/cache-field-xform.d.ts +0 -42
- package/dist/types/modules/excel/xlsx/xform/pivot-table/pivot-cache-definition-xform.d.ts +0 -60
- package/dist/types/modules/excel/xlsx/xform/pivot-table/pivot-cache-records-xform.d.ts +0 -73
- package/dist/types/modules/excel/xlsx/xform/pivot-table/pivot-table-xform.d.ts +0 -119
- package/dist/types/modules/excel/xlsx/xform/sheet/auto-filter-xform.d.ts +0 -8
- package/dist/types/modules/excel/xlsx/xform/sheet/cell-xform.d.ts +0 -17
- package/dist/types/modules/excel/xlsx/xform/sheet/cf/cf-rule-xform.d.ts +0 -41
- package/dist/types/modules/excel/xlsx/xform/sheet/cf/cfvo-xform.d.ts +0 -8
- package/dist/types/modules/excel/xlsx/xform/sheet/cf/color-scale-xform.d.ts +0 -13
- package/dist/types/modules/excel/xlsx/xform/sheet/cf/conditional-formatting-xform.d.ts +0 -9
- package/dist/types/modules/excel/xlsx/xform/sheet/cf/conditional-formattings-xform.d.ts +0 -16
- package/dist/types/modules/excel/xlsx/xform/sheet/cf/databar-xform.d.ts +0 -13
- package/dist/types/modules/excel/xlsx/xform/sheet/cf/ext-lst-ref-xform.d.ts +0 -9
- package/dist/types/modules/excel/xlsx/xform/sheet/cf/formula-xform.d.ts +0 -9
- package/dist/types/modules/excel/xlsx/xform/sheet/cf/icon-set-xform.d.ts +0 -11
- package/dist/types/modules/excel/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.d.ts +0 -10
- package/dist/types/modules/excel/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.d.ts +0 -23
- package/dist/types/modules/excel/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.d.ts +0 -13
- package/dist/types/modules/excel/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.d.ts +0 -16
- package/dist/types/modules/excel/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.d.ts +0 -13
- package/dist/types/modules/excel/xlsx/xform/sheet/cf-ext/databar-ext-xform.d.ts +0 -29
- package/dist/types/modules/excel/xlsx/xform/sheet/cf-ext/f-ext-xform.d.ts +0 -9
- package/dist/types/modules/excel/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.d.ts +0 -20
- package/dist/types/modules/excel/xlsx/xform/sheet/cf-ext/sqref-ext-xform.d.ts +0 -9
- package/dist/types/modules/excel/xlsx/xform/sheet/col-breaks-xform.d.ts +0 -16
- package/dist/types/modules/excel/xlsx/xform/sheet/col-xform.d.ts +0 -22
- package/dist/types/modules/excel/xlsx/xform/sheet/data-validations-xform.d.ts +0 -12
- package/dist/types/modules/excel/xlsx/xform/sheet/dimension-xform.d.ts +0 -10
- package/dist/types/modules/excel/xlsx/xform/sheet/drawing-xform.d.ts +0 -12
- package/dist/types/modules/excel/xlsx/xform/sheet/ext-lst-xform.d.ts +0 -16
- package/dist/types/modules/excel/xlsx/xform/sheet/header-footer-xform.d.ts +0 -20
- package/dist/types/modules/excel/xlsx/xform/sheet/hyperlink-xform.d.ts +0 -16
- package/dist/types/modules/excel/xlsx/xform/sheet/merge-cell-xform.d.ts +0 -9
- package/dist/types/modules/excel/xlsx/xform/sheet/outline-properties-xform.d.ts +0 -13
- package/dist/types/modules/excel/xlsx/xform/sheet/page-breaks-xform.d.ts +0 -14
- package/dist/types/modules/excel/xlsx/xform/sheet/page-margins-xform.d.ts +0 -17
- package/dist/types/modules/excel/xlsx/xform/sheet/page-setup-properties-xform.d.ts +0 -12
- package/dist/types/modules/excel/xlsx/xform/sheet/page-setup-xform.d.ts +0 -27
- package/dist/types/modules/excel/xlsx/xform/sheet/picture-xform.d.ts +0 -12
- package/dist/types/modules/excel/xlsx/xform/sheet/print-options-xform.d.ts +0 -15
- package/dist/types/modules/excel/xlsx/xform/sheet/row-breaks-xform.d.ts +0 -10
- package/dist/types/modules/excel/xlsx/xform/sheet/row-xform.d.ts +0 -37
- package/dist/types/modules/excel/xlsx/xform/sheet/sheet-format-properties-xform.d.ts +0 -16
- package/dist/types/modules/excel/xlsx/xform/sheet/sheet-properties-xform.d.ts +0 -19
- package/dist/types/modules/excel/xlsx/xform/sheet/sheet-protection-xform.d.ts +0 -31
- package/dist/types/modules/excel/xlsx/xform/sheet/sheet-view-xform.d.ts +0 -32
- package/dist/types/modules/excel/xlsx/xform/sheet/table-part-xform.d.ts +0 -12
- package/dist/types/modules/excel/xlsx/xform/sheet/worksheet-xform.d.ts +0 -21
- package/dist/types/modules/excel/xlsx/xform/simple/boolean-xform.d.ts +0 -15
- package/dist/types/modules/excel/xlsx/xform/simple/date-xform.d.ts +0 -22
- package/dist/types/modules/excel/xlsx/xform/simple/float-xform.d.ts +0 -18
- package/dist/types/modules/excel/xlsx/xform/simple/integer-xform.d.ts +0 -20
- package/dist/types/modules/excel/xlsx/xform/simple/string-xform.d.ts +0 -18
- package/dist/types/modules/excel/xlsx/xform/static-xform.d.ts +0 -17
- package/dist/types/modules/excel/xlsx/xform/strings/phonetic-text-xform.d.ts +0 -20
- package/dist/types/modules/excel/xlsx/xform/strings/rich-text-xform.d.ts +0 -25
- package/dist/types/modules/excel/xlsx/xform/strings/shared-string-xform.d.ts +0 -17
- package/dist/types/modules/excel/xlsx/xform/strings/shared-strings-xform.d.ts +0 -27
- package/dist/types/modules/excel/xlsx/xform/strings/text-xform.d.ts +0 -10
- package/dist/types/modules/excel/xlsx/xform/style/alignment-xform.d.ts +0 -18
- package/dist/types/modules/excel/xlsx/xform/style/border-xform.d.ts +0 -49
- package/dist/types/modules/excel/xlsx/xform/style/color-xform.d.ts +0 -17
- package/dist/types/modules/excel/xlsx/xform/style/dxf-xform.d.ts +0 -23
- package/dist/types/modules/excel/xlsx/xform/style/fill-xform.d.ts +0 -85
- package/dist/types/modules/excel/xlsx/xform/style/font-xform.d.ts +0 -35
- package/dist/types/modules/excel/xlsx/xform/style/numfmt-xform.d.ts +0 -18
- package/dist/types/modules/excel/xlsx/xform/style/protection-xform.d.ts +0 -13
- package/dist/types/modules/excel/xlsx/xform/style/style-xform.d.ts +0 -30
- package/dist/types/modules/excel/xlsx/xform/style/styles-xform.d.ts +0 -46
- package/dist/types/modules/excel/xlsx/xform/style/underline-xform.d.ts +0 -14
- package/dist/types/modules/excel/xlsx/xform/table/auto-filter-xform.d.ts +0 -21
- package/dist/types/modules/excel/xlsx/xform/table/custom-filter-xform.d.ts +0 -15
- package/dist/types/modules/excel/xlsx/xform/table/filter-column-xform.d.ts +0 -24
- package/dist/types/modules/excel/xlsx/xform/table/filter-xform.d.ts +0 -14
- package/dist/types/modules/excel/xlsx/xform/table/table-column-xform.d.ts +0 -21
- package/dist/types/modules/excel/xlsx/xform/table/table-style-info-xform.d.ts +0 -18
- package/dist/types/modules/excel/xlsx/xform/table/table-xform.d.ts +0 -33
- package/dist/types/modules/excel/xlsx/xlsx.browser.d.ts +0 -208
- package/dist/types/modules/excel/xlsx/xlsx.d.ts +0 -24
- package/dist/types/modules/stream/base-transform.d.ts +0 -68
- package/dist/types/modules/stream/buffered-stream.d.ts +0 -94
- package/dist/types/modules/stream/chunked-builder.d.ts +0 -97
- package/dist/types/modules/stream/event-emitter.d.ts +0 -30
- package/dist/types/modules/stream/index.browser.d.ts +0 -22
- package/dist/types/modules/stream/index.d.ts +0 -49
- package/dist/types/modules/stream/pull-stream.d.ts +0 -67
- package/dist/types/modules/stream/shared.d.ts +0 -54
- package/dist/types/modules/stream/streams.browser.d.ts +0 -936
- package/dist/types/modules/stream/streams.d.ts +0 -282
- package/dist/types/modules/stream/types.d.ts +0 -238
- package/dist/types/modules/stream/utils.d.ts +0 -24
- package/dist/types/utils/browser.d.ts +0 -9
- package/dist/types/utils/env.d.ts +0 -14
- package/dist/types/utils/uuid.d.ts +0 -11
- /package/dist/cjs/{modules/csv → csv}/csv-number.js +0 -0
- /package/dist/cjs/{modules/excel → doc}/enums.js +0 -0
- /package/dist/cjs/{modules/excel/types.js → types.js} +0 -0
- /package/dist/cjs/{modules/excel/utils → utils}/col-cache.js +0 -0
- /package/dist/cjs/{modules/excel/utils → utils}/copy-style.js +0 -0
- /package/dist/cjs/{modules/excel/utils → utils}/iterate-stream.js +0 -0
- /package/dist/cjs/{modules/excel/utils → utils}/shared-strings.js +0 -0
- /package/dist/cjs/{modules/excel/xlsx → xlsx}/defaultnumformats.js +0 -0
- /package/dist/cjs/{modules/excel/xlsx → xlsx}/rel-type.js +0 -0
- /package/dist/cjs/{modules/excel/xlsx → xlsx}/xform/drawing/sp-pr.js +0 -0
- /package/dist/cjs/{modules/excel/xlsx → xlsx}/xml/theme1.js +0 -0
- /package/dist/esm/{modules/csv → csv}/csv-number.js +0 -0
- /package/dist/esm/{modules/excel → doc}/enums.js +0 -0
- /package/dist/esm/{modules/excel/types.js → types.js} +0 -0
- /package/dist/esm/{modules/excel/utils → utils}/col-cache.js +0 -0
- /package/dist/esm/{modules/excel/utils → utils}/copy-style.js +0 -0
- /package/dist/esm/{modules/excel/utils → utils}/iterate-stream.js +0 -0
- /package/dist/esm/{modules/excel/utils → utils}/shared-strings.js +0 -0
- /package/dist/esm/{modules/excel/xlsx → xlsx}/defaultnumformats.js +0 -0
- /package/dist/esm/{modules/excel/xlsx → xlsx}/rel-type.js +0 -0
- /package/dist/esm/{modules/excel/xlsx → xlsx}/xform/drawing/sp-pr.js +0 -0
- /package/dist/esm/{modules/excel/xlsx → xlsx}/xml/theme1.js +0 -0
- /package/dist/types/{modules/csv → csv}/csv-number.d.ts +0 -0
- /package/dist/types/{modules/excel → doc}/data-validations.d.ts +0 -0
- /package/dist/types/{modules/excel → doc}/enums.d.ts +0 -0
- /package/dist/types/{modules/excel → doc}/note.d.ts +0 -0
- /package/dist/types/{modules/excel/stream → stream/xlsx}/sheet-comments-writer.d.ts +0 -0
- /package/dist/types/{modules/excel/stream → stream/xlsx}/sheet-rels-writer.d.ts +0 -0
- /package/dist/types/{modules/excel/types.d.ts → types.d.ts} +0 -0
- /package/dist/types/{modules/excel/utils → utils}/cell-format.d.ts +0 -0
- /package/dist/types/{modules/excel/utils → utils}/cell-matrix.d.ts +0 -0
- /package/dist/types/{modules/excel/utils → utils}/copy-style.d.ts +0 -0
- /package/dist/types/{modules/excel/utils → utils}/parse-sax.d.ts +0 -0
- /package/dist/types/{modules/excel/utils → utils}/shared-formula.d.ts +0 -0
- /package/dist/types/{modules/excel/utils → utils}/shared-strings.d.ts +0 -0
- /package/dist/types/{modules/excel/utils → utils}/under-dash.d.ts +0 -0
- /package/dist/types/{modules/excel/utils → utils}/xml-stream.d.ts +0 -0
- /package/dist/types/{modules/archive → utils/zip}/deflate-fallback.d.ts +0 -0
- /package/dist/types/{modules/excel/xlsx → xlsx}/defaultnumformats.d.ts +0 -0
- /package/dist/types/{modules/excel/xlsx → xlsx}/rel-type.d.ts +0 -0
- /package/dist/types/{modules/excel/xlsx → xlsx}/xform/drawing/sp-pr.d.ts +0 -0
- /package/dist/types/{modules/excel/xlsx → xlsx}/xform/pivot-table/cache-field.d.ts +0 -0
- /package/dist/types/{modules/excel/xlsx → xlsx}/xform/sheet/merges.d.ts +0 -0
- /package/dist/types/{modules/excel/xlsx → xlsx}/xml/theme1.d.ts +0 -0
|
@@ -1,3318 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Native Stream Implementation - Browser
|
|
4
|
-
*
|
|
5
|
-
* Uses Web Streams API (ReadableStream, WritableStream, TransformStream)
|
|
6
|
-
* for true native streaming in browsers.
|
|
7
|
-
*
|
|
8
|
-
* Supported browsers:
|
|
9
|
-
* - Chrome >= 89
|
|
10
|
-
* - Firefox >= 102
|
|
11
|
-
* - Safari >= 14.1
|
|
12
|
-
* - Edge >= 89
|
|
13
|
-
*/
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.promises = exports.consumers = exports.streamToBuffer = exports.BufferedStream = exports.BufferChunk = exports.StringChunk = exports.PullStream = exports.Collector = exports.PassThrough = exports.Duplex = exports.Transform = exports.Writable = exports.Readable = void 0;
|
|
16
|
-
exports.normalizeWritable = normalizeWritable;
|
|
17
|
-
exports.createReadable = createReadable;
|
|
18
|
-
exports.createReadableFromAsyncIterable = createReadableFromAsyncIterable;
|
|
19
|
-
exports.createReadableFromArray = createReadableFromArray;
|
|
20
|
-
exports.createWritable = createWritable;
|
|
21
|
-
exports.createTransform = createTransform;
|
|
22
|
-
exports.createCollector = createCollector;
|
|
23
|
-
exports.createPassThrough = createPassThrough;
|
|
24
|
-
exports.createPullStream = createPullStream;
|
|
25
|
-
exports.createBufferedStream = createBufferedStream;
|
|
26
|
-
exports.pipeline = pipeline;
|
|
27
|
-
exports.finished = finished;
|
|
28
|
-
exports.streamToPromise = streamToPromise;
|
|
29
|
-
exports.streamToUint8Array = streamToUint8Array;
|
|
30
|
-
exports.streamToString = streamToString;
|
|
31
|
-
exports.drainStream = drainStream;
|
|
32
|
-
exports.copyStream = copyStream;
|
|
33
|
-
exports.isTransform = isTransform;
|
|
34
|
-
exports.isDuplex = isDuplex;
|
|
35
|
-
exports.isStream = isStream;
|
|
36
|
-
exports.addAbortSignal = addAbortSignal;
|
|
37
|
-
exports.createDuplex = createDuplex;
|
|
38
|
-
exports.createReadableFromGenerator = createReadableFromGenerator;
|
|
39
|
-
exports.createReadableFromPromise = createReadableFromPromise;
|
|
40
|
-
exports.compose = compose;
|
|
41
|
-
exports.finishedAll = finishedAll;
|
|
42
|
-
exports.createEmptyReadable = createEmptyReadable;
|
|
43
|
-
exports.createNullWritable = createNullWritable;
|
|
44
|
-
exports.once = once;
|
|
45
|
-
exports.promisify = promisify;
|
|
46
|
-
exports.getDefaultHighWaterMark = getDefaultHighWaterMark;
|
|
47
|
-
exports.setDefaultHighWaterMark = setDefaultHighWaterMark;
|
|
48
|
-
exports.isDestroyed = isDestroyed;
|
|
49
|
-
exports.isDisturbed = isDisturbed;
|
|
50
|
-
exports.isErrored = isErrored;
|
|
51
|
-
exports.isReadable = isReadable;
|
|
52
|
-
exports.isWritable = isWritable;
|
|
53
|
-
exports.duplexPair = duplexPair;
|
|
54
|
-
const event_emitter_1 = require("@stream/event-emitter");
|
|
55
|
-
const pull_stream_1 = require("@stream/pull-stream");
|
|
56
|
-
const buffered_stream_1 = require("@stream/buffered-stream");
|
|
57
|
-
const shared_1 = require("@stream/shared");
|
|
58
|
-
// =============================================================================
|
|
59
|
-
// Readable Stream Wrapper
|
|
60
|
-
// =============================================================================
|
|
61
|
-
/**
|
|
62
|
-
* A wrapper around Web ReadableStream that provides Node.js-like API
|
|
63
|
-
*/
|
|
64
|
-
class Readable extends event_emitter_1.EventEmitter {
|
|
65
|
-
constructor(options) {
|
|
66
|
-
super();
|
|
67
|
-
this._reader = null;
|
|
68
|
-
this._buffer = [];
|
|
69
|
-
this._bufferIndex = 0;
|
|
70
|
-
this._unshiftBuffer = [];
|
|
71
|
-
this._bufferSize = 0;
|
|
72
|
-
this._reading = false;
|
|
73
|
-
this._ended = false;
|
|
74
|
-
this._destroyed = false;
|
|
75
|
-
this._errored = null;
|
|
76
|
-
this._closed = false;
|
|
77
|
-
this._paused = true;
|
|
78
|
-
this._flowing = false;
|
|
79
|
-
this._pipeTo = [];
|
|
80
|
-
this._pipeListeners = new Map();
|
|
81
|
-
this._encoding = null;
|
|
82
|
-
this._decoder = null;
|
|
83
|
-
this._didRead = false;
|
|
84
|
-
this._aborted = false;
|
|
85
|
-
// Whether this stream uses push() mode (true) or Web Stream mode (false)
|
|
86
|
-
this._pushMode = false;
|
|
87
|
-
// Whether this stream was created from an external Web Stream (true) or is controllable (false)
|
|
88
|
-
this._webStreamMode = false;
|
|
89
|
-
this.objectMode = options?.objectMode ?? false;
|
|
90
|
-
this.readableHighWaterMark = options?.highWaterMark ?? 16384;
|
|
91
|
-
this.autoDestroy = options?.autoDestroy ?? true;
|
|
92
|
-
this.emitClose = options?.emitClose ?? true;
|
|
93
|
-
// Store user-provided read function
|
|
94
|
-
if (options?.read) {
|
|
95
|
-
this._read = options.read.bind(this);
|
|
96
|
-
this._pushMode = true; // User will call push()
|
|
97
|
-
}
|
|
98
|
-
if (options?.stream) {
|
|
99
|
-
this._stream = options.stream;
|
|
100
|
-
this._webStreamMode = true; // Created from external Web Stream
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
// Create a controllable stream
|
|
104
|
-
let controller;
|
|
105
|
-
this._stream = new ReadableStream({
|
|
106
|
-
start: ctrl => {
|
|
107
|
-
controller = ctrl;
|
|
108
|
-
},
|
|
109
|
-
pull: async () => {
|
|
110
|
-
// Signal that more data can be pushed
|
|
111
|
-
this.emit("drain");
|
|
112
|
-
},
|
|
113
|
-
cancel: reason => {
|
|
114
|
-
this._ended = true;
|
|
115
|
-
this._aborted = true;
|
|
116
|
-
if (this.emitClose) {
|
|
117
|
-
this.emit("close");
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
});
|
|
121
|
-
// Expose controller for push/end
|
|
122
|
-
this._controller = controller;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Create a Readable from an iterable (static factory method)
|
|
127
|
-
*/
|
|
128
|
-
static from(iterable, options) {
|
|
129
|
-
const readable = new Readable({ ...options, objectMode: options?.objectMode ?? true });
|
|
130
|
-
(async () => {
|
|
131
|
-
try {
|
|
132
|
-
for await (const chunk of iterable) {
|
|
133
|
-
if (!readable.push(chunk)) {
|
|
134
|
-
// Backpressure
|
|
135
|
-
await new Promise(resolve => setTimeout(resolve, 0));
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
readable.push(null);
|
|
139
|
-
}
|
|
140
|
-
catch (err) {
|
|
141
|
-
readable.destroy(err);
|
|
142
|
-
}
|
|
143
|
-
})();
|
|
144
|
-
return readable;
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Check if a stream has been disturbed (read from)
|
|
148
|
-
*/
|
|
149
|
-
static isDisturbed(stream) {
|
|
150
|
-
return stream._didRead || stream._ended || stream._destroyed;
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Convert a Web ReadableStream to Node.js Readable
|
|
154
|
-
*/
|
|
155
|
-
static fromWeb(webStream, options) {
|
|
156
|
-
return new Readable({ ...options, stream: webStream });
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* Convert a Node.js Readable to Web ReadableStream
|
|
160
|
-
*/
|
|
161
|
-
static toWeb(nodeStream) {
|
|
162
|
-
return nodeStream.webStream;
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Push data to the stream (when using controllable stream)
|
|
166
|
-
*/
|
|
167
|
-
push(chunk) {
|
|
168
|
-
if (this._destroyed) {
|
|
169
|
-
return false;
|
|
170
|
-
}
|
|
171
|
-
// Mark as push mode when push() is called
|
|
172
|
-
this._pushMode = true;
|
|
173
|
-
const controller = this._controller;
|
|
174
|
-
if (chunk === null) {
|
|
175
|
-
// Prevent duplicate end handling
|
|
176
|
-
if (this._ended) {
|
|
177
|
-
return false;
|
|
178
|
-
}
|
|
179
|
-
this._ended = true;
|
|
180
|
-
if (controller) {
|
|
181
|
-
try {
|
|
182
|
-
controller.close();
|
|
183
|
-
}
|
|
184
|
-
catch {
|
|
185
|
-
// Controller may already be closed
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
this.emit("end");
|
|
189
|
-
// Note: Don't call destroy() here, let the stream be consumed naturally
|
|
190
|
-
// The reader will return done:true when it finishes reading
|
|
191
|
-
return false;
|
|
192
|
-
}
|
|
193
|
-
if (this._flowing) {
|
|
194
|
-
// In flowing mode, emit data directly without buffering or enqueueing
|
|
195
|
-
// const chunkStr = chunk instanceof Uint8Array ? new TextDecoder().decode(chunk.slice(0, 50)) : String(chunk).slice(0, 50);
|
|
196
|
-
// console.log(`[Readable#${this._id}.push FLOWING] emit data size:${(chunk as any).length || (chunk as any).byteLength} start:"${chunkStr}"`);
|
|
197
|
-
this.emit("data", chunk);
|
|
198
|
-
// Check if stream was paused during emit (backpressure from consumer)
|
|
199
|
-
if (!this._flowing) {
|
|
200
|
-
return false;
|
|
201
|
-
}
|
|
202
|
-
// After emitting data, call _read again if available (Node.js behavior)
|
|
203
|
-
if (this._read && !this._ended) {
|
|
204
|
-
queueMicrotask(() => {
|
|
205
|
-
if (this._flowing && !this._ended && !this._destroyed) {
|
|
206
|
-
this._read(this.readableHighWaterMark);
|
|
207
|
-
}
|
|
208
|
-
});
|
|
209
|
-
}
|
|
210
|
-
// In flowing mode, return true (no backpressure since data is immediately consumed)
|
|
211
|
-
return true;
|
|
212
|
-
}
|
|
213
|
-
else {
|
|
214
|
-
// In paused mode, buffer for later
|
|
215
|
-
const wasEmpty = this._bufferedLength() === 0;
|
|
216
|
-
// const chunkStrBuf = chunk instanceof Uint8Array ? new TextDecoder().decode((chunk as Uint8Array).slice(0, 50)) : String(chunk).slice(0, 50);
|
|
217
|
-
// console.log(`[Readable#${this._id}.push PAUSED->BUFFER] buffer len:${this._buffer.length}->${this._buffer.length + 1} start:"${chunkStrBuf}"`);
|
|
218
|
-
this._buffer.push(chunk);
|
|
219
|
-
if (!this.objectMode) {
|
|
220
|
-
this._bufferSize += this._getChunkSize(chunk);
|
|
221
|
-
}
|
|
222
|
-
// NOTE: Do NOT enqueue to Web Stream controller here!
|
|
223
|
-
// In push mode, _buffer is the only source of data for data events.
|
|
224
|
-
// Web Stream is only used for async iteration when not in push mode.
|
|
225
|
-
// Enqueueing here would cause data duplication when _startReading is also running.
|
|
226
|
-
// Emit readable event when buffer goes from empty to having data
|
|
227
|
-
if (wasEmpty) {
|
|
228
|
-
queueMicrotask(() => this.emit("readable"));
|
|
229
|
-
}
|
|
230
|
-
// Return false if buffer exceeds high water mark (backpressure signal)
|
|
231
|
-
// Fast path for object mode - just count items
|
|
232
|
-
if (this.objectMode) {
|
|
233
|
-
return this._bufferedLength() < this.readableHighWaterMark;
|
|
234
|
-
}
|
|
235
|
-
// For binary mode, use tracked buffer size (O(1))
|
|
236
|
-
return this._bufferSize < this.readableHighWaterMark;
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
/**
|
|
240
|
-
* Put a chunk back at the front of the buffer
|
|
241
|
-
* Note: unshift is allowed even after end, as it's used to put back already read data
|
|
242
|
-
*/
|
|
243
|
-
unshift(chunk) {
|
|
244
|
-
if (this._destroyed) {
|
|
245
|
-
return;
|
|
246
|
-
}
|
|
247
|
-
this._bufferUnshift(chunk);
|
|
248
|
-
if (!this.objectMode) {
|
|
249
|
-
this._bufferSize += this._getChunkSize(chunk);
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
/**
|
|
253
|
-
* Read data from the stream
|
|
254
|
-
*/
|
|
255
|
-
read(size) {
|
|
256
|
-
this._didRead = true;
|
|
257
|
-
if (this._bufferedLength() > 0) {
|
|
258
|
-
if (this.objectMode || size === undefined) {
|
|
259
|
-
const chunk = this._bufferShift();
|
|
260
|
-
if (!this.objectMode) {
|
|
261
|
-
this._bufferSize -= this._getChunkSize(chunk);
|
|
262
|
-
}
|
|
263
|
-
return this._applyEncoding(chunk);
|
|
264
|
-
}
|
|
265
|
-
// For binary mode, handle size
|
|
266
|
-
const chunk = this._bufferShift();
|
|
267
|
-
if (!this.objectMode) {
|
|
268
|
-
this._bufferSize -= this._getChunkSize(chunk);
|
|
269
|
-
}
|
|
270
|
-
return this._applyEncoding(chunk);
|
|
271
|
-
}
|
|
272
|
-
return null;
|
|
273
|
-
}
|
|
274
|
-
_bufferedLength() {
|
|
275
|
-
return this._unshiftBuffer.length + (this._buffer.length - this._bufferIndex);
|
|
276
|
-
}
|
|
277
|
-
_bufferPeek() {
|
|
278
|
-
const unshiftLen = this._unshiftBuffer.length;
|
|
279
|
-
if (unshiftLen > 0) {
|
|
280
|
-
return this._unshiftBuffer[unshiftLen - 1];
|
|
281
|
-
}
|
|
282
|
-
return this._bufferIndex < this._buffer.length ? this._buffer[this._bufferIndex] : null;
|
|
283
|
-
}
|
|
284
|
-
_bufferShift() {
|
|
285
|
-
if (this._unshiftBuffer.length > 0) {
|
|
286
|
-
return this._unshiftBuffer.pop();
|
|
287
|
-
}
|
|
288
|
-
const chunk = this._buffer[this._bufferIndex++];
|
|
289
|
-
// Fast reset when emptied
|
|
290
|
-
if (this._bufferIndex === this._buffer.length) {
|
|
291
|
-
this._buffer.length = 0;
|
|
292
|
-
this._bufferIndex = 0;
|
|
293
|
-
return chunk;
|
|
294
|
-
}
|
|
295
|
-
// Occasionally compact to avoid unbounded growth of the unused prefix
|
|
296
|
-
if (this._bufferIndex > 1024 && this._bufferIndex * 2 > this._buffer.length) {
|
|
297
|
-
this._buffer = this._buffer.slice(this._bufferIndex);
|
|
298
|
-
this._bufferIndex = 0;
|
|
299
|
-
}
|
|
300
|
-
return chunk;
|
|
301
|
-
}
|
|
302
|
-
_bufferUnshift(chunk) {
|
|
303
|
-
if (this._bufferIndex === 0) {
|
|
304
|
-
// Avoid O(n) Array.unshift() by using a small front stack.
|
|
305
|
-
// Semantics: last unshifted chunk is returned first.
|
|
306
|
-
this._unshiftBuffer.push(chunk);
|
|
307
|
-
return;
|
|
308
|
-
}
|
|
309
|
-
this._bufferIndex--;
|
|
310
|
-
this._buffer[this._bufferIndex] = chunk;
|
|
311
|
-
}
|
|
312
|
-
_getChunkSize(chunk) {
|
|
313
|
-
// Keep semantics aligned with previous implementation:
|
|
314
|
-
// - Uint8Array counts by byteLength
|
|
315
|
-
// - other types count as 1
|
|
316
|
-
return chunk instanceof Uint8Array ? chunk.byteLength : 1;
|
|
317
|
-
}
|
|
318
|
-
/**
|
|
319
|
-
* Set encoding for string output
|
|
320
|
-
*/
|
|
321
|
-
setEncoding(encoding) {
|
|
322
|
-
this._encoding = encoding;
|
|
323
|
-
// Fast path: reuse cached utf-8 decoder; otherwise lazy-create on first decode.
|
|
324
|
-
if (encoding === "utf-8" || encoding === "utf8") {
|
|
325
|
-
this._decoder = shared_1.textDecoder;
|
|
326
|
-
}
|
|
327
|
-
else {
|
|
328
|
-
this._decoder = null;
|
|
329
|
-
}
|
|
330
|
-
return this;
|
|
331
|
-
}
|
|
332
|
-
_applyEncoding(chunk) {
|
|
333
|
-
if (this._encoding && chunk instanceof Uint8Array) {
|
|
334
|
-
// Use cached decoder instances (module-level for utf-8, cached per encoding otherwise).
|
|
335
|
-
if (!this._decoder) {
|
|
336
|
-
this._decoder = (0, shared_1.getTextDecoder)(this._encoding);
|
|
337
|
-
}
|
|
338
|
-
return this._decoder.decode(chunk);
|
|
339
|
-
}
|
|
340
|
-
return chunk;
|
|
341
|
-
}
|
|
342
|
-
/**
|
|
343
|
-
* Wrap an old-style stream
|
|
344
|
-
*/
|
|
345
|
-
wrap(stream) {
|
|
346
|
-
stream.on("data", (chunk) => {
|
|
347
|
-
if (!this.push(chunk)) {
|
|
348
|
-
stream.pause();
|
|
349
|
-
}
|
|
350
|
-
});
|
|
351
|
-
stream.on("end", () => this.push(null));
|
|
352
|
-
stream.on("error", (err) => this.destroy(err));
|
|
353
|
-
stream.on("close", () => this.destroy());
|
|
354
|
-
return this;
|
|
355
|
-
}
|
|
356
|
-
/**
|
|
357
|
-
* Pause the stream
|
|
358
|
-
*/
|
|
359
|
-
pause() {
|
|
360
|
-
this._paused = true;
|
|
361
|
-
this._flowing = false;
|
|
362
|
-
return this;
|
|
363
|
-
}
|
|
364
|
-
/**
|
|
365
|
-
* Resume the stream
|
|
366
|
-
*/
|
|
367
|
-
resume() {
|
|
368
|
-
this._paused = false;
|
|
369
|
-
this._flowing = true;
|
|
370
|
-
// Emit any buffered data first
|
|
371
|
-
while (this._bufferedLength() > 0 && this._flowing) {
|
|
372
|
-
const chunk = this._bufferShift();
|
|
373
|
-
if (!this.objectMode) {
|
|
374
|
-
this._bufferSize -= this._getChunkSize(chunk);
|
|
375
|
-
}
|
|
376
|
-
this.emit("data", chunk);
|
|
377
|
-
}
|
|
378
|
-
// If already ended, emit end event
|
|
379
|
-
if (this._ended && this._bufferedLength() === 0) {
|
|
380
|
-
this.emit("end");
|
|
381
|
-
}
|
|
382
|
-
else if (this._read) {
|
|
383
|
-
// Call user-provided read function asynchronously
|
|
384
|
-
// This allows multiple pipe() calls to register before data flows
|
|
385
|
-
queueMicrotask(() => {
|
|
386
|
-
if (this._flowing && !this._ended && !this._destroyed) {
|
|
387
|
-
this._read(this.readableHighWaterMark);
|
|
388
|
-
}
|
|
389
|
-
});
|
|
390
|
-
}
|
|
391
|
-
else if (this._webStreamMode && !this._pushMode) {
|
|
392
|
-
// Only start reading from underlying Web Stream if:
|
|
393
|
-
// 1. Stream was created from external Web Stream (_webStreamMode)
|
|
394
|
-
// 2. Not in push mode (no one called push() yet)
|
|
395
|
-
this._startReading();
|
|
396
|
-
}
|
|
397
|
-
return this;
|
|
398
|
-
}
|
|
399
|
-
/**
|
|
400
|
-
* Override on() to automatically resume when 'data' listener is added
|
|
401
|
-
* This matches Node.js behavior where adding a 'data' listener puts
|
|
402
|
-
* the stream into flowing mode.
|
|
403
|
-
*/
|
|
404
|
-
on(event, listener) {
|
|
405
|
-
super.on(event, listener);
|
|
406
|
-
// When a 'data' listener is added, switch to flowing mode
|
|
407
|
-
if (event === "data") {
|
|
408
|
-
this.resume();
|
|
409
|
-
}
|
|
410
|
-
return this;
|
|
411
|
-
}
|
|
412
|
-
/**
|
|
413
|
-
* Check if paused
|
|
414
|
-
*/
|
|
415
|
-
isPaused() {
|
|
416
|
-
return this._paused;
|
|
417
|
-
}
|
|
418
|
-
/**
|
|
419
|
-
* Pipe to a writable stream, transform stream, or duplex stream
|
|
420
|
-
*/
|
|
421
|
-
pipe(destination) {
|
|
422
|
-
// IMPORTANT:
|
|
423
|
-
// Do not rely on `instanceof` here.
|
|
424
|
-
// In bundled/minified builds, multiple copies of this module can exist,
|
|
425
|
-
// causing `instanceof Transform/Writable/Duplex` to fail even when the object
|
|
426
|
-
// is a valid destination.
|
|
427
|
-
const dest = destination;
|
|
428
|
-
// Get the actual writable target.
|
|
429
|
-
// Prefer internal `_writable` (Transform/Duplex wrappers), else treat the destination as writable-like.
|
|
430
|
-
const candidate = dest?._writable ?? dest;
|
|
431
|
-
const hasWrite = typeof candidate?.write === "function";
|
|
432
|
-
const hasEnd = typeof candidate?.end === "function";
|
|
433
|
-
const hasOn = typeof candidate?.on === "function";
|
|
434
|
-
const hasOnce = typeof candidate?.once === "function";
|
|
435
|
-
const hasOff = typeof candidate?.off === "function";
|
|
436
|
-
if (!hasWrite || !hasEnd || (!hasOnce && !hasOn) || (!hasOff && !candidate?.removeListener)) {
|
|
437
|
-
throw new Error("Readable.pipe: invalid destination");
|
|
438
|
-
}
|
|
439
|
-
const target = candidate;
|
|
440
|
-
this._pipeTo.push(target);
|
|
441
|
-
// Create listeners that we can later remove
|
|
442
|
-
const dataListener = (chunk) => {
|
|
443
|
-
const canWrite = target.write(chunk);
|
|
444
|
-
if (!canWrite) {
|
|
445
|
-
this.pause();
|
|
446
|
-
if (typeof target.once === "function") {
|
|
447
|
-
target.once("drain", () => this.resume());
|
|
448
|
-
}
|
|
449
|
-
else {
|
|
450
|
-
const resumeOnce = () => {
|
|
451
|
-
if (typeof target.off === "function") {
|
|
452
|
-
target.off("drain", resumeOnce);
|
|
453
|
-
}
|
|
454
|
-
else if (typeof target.removeListener === "function") {
|
|
455
|
-
target.removeListener("drain", resumeOnce);
|
|
456
|
-
}
|
|
457
|
-
this.resume();
|
|
458
|
-
};
|
|
459
|
-
target.on("drain", resumeOnce);
|
|
460
|
-
}
|
|
461
|
-
}
|
|
462
|
-
};
|
|
463
|
-
const endListener = () => {
|
|
464
|
-
target.end();
|
|
465
|
-
};
|
|
466
|
-
const errorListener = (err) => {
|
|
467
|
-
if (typeof target.destroy === "function") {
|
|
468
|
-
target.destroy(err);
|
|
469
|
-
}
|
|
470
|
-
else {
|
|
471
|
-
// Best-effort: forward error to the destination if it supports events.
|
|
472
|
-
target.emit?.("error", err);
|
|
473
|
-
}
|
|
474
|
-
};
|
|
475
|
-
// Store listeners for later removal in unpipe
|
|
476
|
-
this._pipeListeners.set(target, {
|
|
477
|
-
data: dataListener,
|
|
478
|
-
end: endListener,
|
|
479
|
-
error: errorListener
|
|
480
|
-
});
|
|
481
|
-
this.on("data", dataListener);
|
|
482
|
-
this.once("end", endListener);
|
|
483
|
-
this.once("error", errorListener);
|
|
484
|
-
this.resume();
|
|
485
|
-
return destination;
|
|
486
|
-
}
|
|
487
|
-
/**
|
|
488
|
-
* Unpipe from destination
|
|
489
|
-
*/
|
|
490
|
-
unpipe(destination) {
|
|
491
|
-
if (destination) {
|
|
492
|
-
const idx = this._pipeTo.indexOf(destination);
|
|
493
|
-
if (idx !== -1) {
|
|
494
|
-
this._pipeTo.splice(idx, 1);
|
|
495
|
-
}
|
|
496
|
-
// Remove the listeners
|
|
497
|
-
const listeners = this._pipeListeners.get(destination);
|
|
498
|
-
if (listeners) {
|
|
499
|
-
this.off("data", listeners.data);
|
|
500
|
-
this.off("end", listeners.end);
|
|
501
|
-
this.off("error", listeners.error);
|
|
502
|
-
this._pipeListeners.delete(destination);
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
else {
|
|
506
|
-
// Unpipe all
|
|
507
|
-
for (const target of this._pipeTo) {
|
|
508
|
-
const listeners = this._pipeListeners.get(target);
|
|
509
|
-
if (listeners) {
|
|
510
|
-
this.off("data", listeners.data);
|
|
511
|
-
this.off("end", listeners.end);
|
|
512
|
-
this.off("error", listeners.error);
|
|
513
|
-
this._pipeListeners.delete(target);
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
this._pipeTo = [];
|
|
517
|
-
}
|
|
518
|
-
// Pause the stream after unpipe
|
|
519
|
-
this.pause();
|
|
520
|
-
return this;
|
|
521
|
-
}
|
|
522
|
-
/**
|
|
523
|
-
* Destroy the stream
|
|
524
|
-
*/
|
|
525
|
-
destroy(error) {
|
|
526
|
-
if (this._destroyed) {
|
|
527
|
-
return this;
|
|
528
|
-
}
|
|
529
|
-
this._destroyed = true;
|
|
530
|
-
this._ended = true;
|
|
531
|
-
if (error) {
|
|
532
|
-
this._errored = error;
|
|
533
|
-
this.emit("error", error);
|
|
534
|
-
}
|
|
535
|
-
if (this._reader) {
|
|
536
|
-
this._reader.cancel().catch(() => { });
|
|
537
|
-
}
|
|
538
|
-
this._closed = true;
|
|
539
|
-
this.emit("close");
|
|
540
|
-
return this;
|
|
541
|
-
}
|
|
542
|
-
/**
|
|
543
|
-
* Get the underlying Web ReadableStream
|
|
544
|
-
*/
|
|
545
|
-
get webStream() {
|
|
546
|
-
return this._stream;
|
|
547
|
-
}
|
|
548
|
-
get readable() {
|
|
549
|
-
return !this._destroyed && !this._ended;
|
|
550
|
-
}
|
|
551
|
-
get readableEnded() {
|
|
552
|
-
return this._ended;
|
|
553
|
-
}
|
|
554
|
-
get readableLength() {
|
|
555
|
-
return this._bufferedLength();
|
|
556
|
-
}
|
|
557
|
-
/** Whether the stream has been destroyed */
|
|
558
|
-
get destroyed() {
|
|
559
|
-
return this._destroyed;
|
|
560
|
-
}
|
|
561
|
-
/** The error that destroyed the stream, or null */
|
|
562
|
-
get errored() {
|
|
563
|
-
return this._errored;
|
|
564
|
-
}
|
|
565
|
-
/** Whether the stream has been closed */
|
|
566
|
-
get closed() {
|
|
567
|
-
return this._closed;
|
|
568
|
-
}
|
|
569
|
-
/** Whether the stream is in flowing mode */
|
|
570
|
-
get readableFlowing() {
|
|
571
|
-
if (!this._paused && !this._ended) {
|
|
572
|
-
return this._flowing;
|
|
573
|
-
}
|
|
574
|
-
return this._flowing ? true : null;
|
|
575
|
-
}
|
|
576
|
-
/** Whether the stream was aborted */
|
|
577
|
-
get readableAborted() {
|
|
578
|
-
return this._aborted;
|
|
579
|
-
}
|
|
580
|
-
/** Whether read() has ever been called */
|
|
581
|
-
get readableDidRead() {
|
|
582
|
-
return this._didRead;
|
|
583
|
-
}
|
|
584
|
-
/** Current encoding or null */
|
|
585
|
-
get readableEncoding() {
|
|
586
|
-
return this._encoding;
|
|
587
|
-
}
|
|
588
|
-
/** Returns array of objects containing info about buffered data */
|
|
589
|
-
get readableObjectMode() {
|
|
590
|
-
return this.objectMode;
|
|
591
|
-
}
|
|
592
|
-
/**
|
|
593
|
-
* Get the internal buffer state (for debugging)
|
|
594
|
-
* Returns array of objects with length and chunk info
|
|
595
|
-
*/
|
|
596
|
-
get readableBuffer() {
|
|
597
|
-
return {
|
|
598
|
-
length: this._bufferedLength(),
|
|
599
|
-
head: this._bufferPeek()
|
|
600
|
-
};
|
|
601
|
-
}
|
|
602
|
-
async _startReading() {
|
|
603
|
-
if (this._reading || this._destroyed || !this._flowing) {
|
|
604
|
-
return;
|
|
605
|
-
}
|
|
606
|
-
this._reading = true;
|
|
607
|
-
try {
|
|
608
|
-
if (!this._reader) {
|
|
609
|
-
this._reader = this._stream.getReader();
|
|
610
|
-
}
|
|
611
|
-
while (this._flowing && !this._destroyed && !this._pushMode) {
|
|
612
|
-
const { done, value } = await this._reader.read();
|
|
613
|
-
// Check _pushMode again after async read - if push() was called, stop reading
|
|
614
|
-
if (this._pushMode) {
|
|
615
|
-
break;
|
|
616
|
-
}
|
|
617
|
-
if (done) {
|
|
618
|
-
this._ended = true;
|
|
619
|
-
this.emit("end");
|
|
620
|
-
break;
|
|
621
|
-
}
|
|
622
|
-
if (value !== undefined) {
|
|
623
|
-
// In flowing mode, emit data directly without buffering
|
|
624
|
-
// Only buffer if not flowing (paused mode)
|
|
625
|
-
if (this._flowing) {
|
|
626
|
-
this.emit("data", value);
|
|
627
|
-
}
|
|
628
|
-
else {
|
|
629
|
-
this._buffer.push(value);
|
|
630
|
-
if (!this.objectMode) {
|
|
631
|
-
this._bufferSize += this._getChunkSize(value);
|
|
632
|
-
}
|
|
633
|
-
}
|
|
634
|
-
}
|
|
635
|
-
}
|
|
636
|
-
}
|
|
637
|
-
catch (err) {
|
|
638
|
-
this.emit("error", err);
|
|
639
|
-
}
|
|
640
|
-
finally {
|
|
641
|
-
this._reading = false;
|
|
642
|
-
}
|
|
643
|
-
}
|
|
644
|
-
/**
|
|
645
|
-
* Async iterator support
|
|
646
|
-
* Uses Web Stream reader for non-push mode, event-based for push mode
|
|
647
|
-
*/
|
|
648
|
-
async *[Symbol.asyncIterator]() {
|
|
649
|
-
// First yield any buffered data
|
|
650
|
-
while (this._bufferedLength() > 0) {
|
|
651
|
-
const chunk = this._bufferShift();
|
|
652
|
-
if (!this.objectMode) {
|
|
653
|
-
this._bufferSize -= this._getChunkSize(chunk);
|
|
654
|
-
}
|
|
655
|
-
yield chunk;
|
|
656
|
-
}
|
|
657
|
-
// If already ended, we're done
|
|
658
|
-
if (this._ended) {
|
|
659
|
-
return;
|
|
660
|
-
}
|
|
661
|
-
// For controllable streams (not created from external Web Stream),
|
|
662
|
-
// use event-based iteration since data comes from push() calls
|
|
663
|
-
if (!this._webStreamMode) {
|
|
664
|
-
// Create a promise-based queue for incoming data
|
|
665
|
-
const dataQueue = [];
|
|
666
|
-
let resolveNext = null;
|
|
667
|
-
let rejectNext = null;
|
|
668
|
-
let done = false;
|
|
669
|
-
let streamError = null;
|
|
670
|
-
let dataQueueIndex = 0;
|
|
671
|
-
const dataHandler = (chunk) => {
|
|
672
|
-
if (resolveNext) {
|
|
673
|
-
resolveNext(chunk);
|
|
674
|
-
resolveNext = null;
|
|
675
|
-
rejectNext = null;
|
|
676
|
-
}
|
|
677
|
-
else {
|
|
678
|
-
dataQueue.push(chunk);
|
|
679
|
-
}
|
|
680
|
-
};
|
|
681
|
-
const endHandler = () => {
|
|
682
|
-
done = true;
|
|
683
|
-
if (resolveNext) {
|
|
684
|
-
resolveNext(null);
|
|
685
|
-
resolveNext = null;
|
|
686
|
-
rejectNext = null;
|
|
687
|
-
}
|
|
688
|
-
};
|
|
689
|
-
const errorHandler = (err) => {
|
|
690
|
-
done = true;
|
|
691
|
-
streamError = err;
|
|
692
|
-
if (rejectNext) {
|
|
693
|
-
rejectNext(err);
|
|
694
|
-
resolveNext = null;
|
|
695
|
-
rejectNext = null;
|
|
696
|
-
}
|
|
697
|
-
};
|
|
698
|
-
const closeHandler = () => {
|
|
699
|
-
// If stream closed without end event (e.g., after destroy()),
|
|
700
|
-
// treat it as done
|
|
701
|
-
done = true;
|
|
702
|
-
if (resolveNext) {
|
|
703
|
-
resolveNext(null);
|
|
704
|
-
resolveNext = null;
|
|
705
|
-
rejectNext = null;
|
|
706
|
-
}
|
|
707
|
-
};
|
|
708
|
-
this.on("data", dataHandler);
|
|
709
|
-
this.on("end", endHandler);
|
|
710
|
-
this.on("error", errorHandler);
|
|
711
|
-
this.on("close", closeHandler);
|
|
712
|
-
try {
|
|
713
|
-
// Enter flowing mode
|
|
714
|
-
this.resume();
|
|
715
|
-
while (!done || dataQueueIndex < dataQueue.length) {
|
|
716
|
-
// Check for error before processing
|
|
717
|
-
if (streamError) {
|
|
718
|
-
throw streamError;
|
|
719
|
-
}
|
|
720
|
-
if (dataQueueIndex < dataQueue.length) {
|
|
721
|
-
const chunk = dataQueue[dataQueueIndex++];
|
|
722
|
-
if (dataQueueIndex >= 1024 && dataQueueIndex * 2 >= dataQueue.length) {
|
|
723
|
-
dataQueue.splice(0, dataQueueIndex);
|
|
724
|
-
dataQueueIndex = 0;
|
|
725
|
-
}
|
|
726
|
-
yield chunk;
|
|
727
|
-
}
|
|
728
|
-
else if (!done) {
|
|
729
|
-
const chunk = await new Promise((resolve, reject) => {
|
|
730
|
-
resolveNext = resolve;
|
|
731
|
-
rejectNext = reject;
|
|
732
|
-
});
|
|
733
|
-
if (chunk !== null) {
|
|
734
|
-
yield chunk;
|
|
735
|
-
}
|
|
736
|
-
}
|
|
737
|
-
}
|
|
738
|
-
// Check for error after loop
|
|
739
|
-
if (streamError) {
|
|
740
|
-
throw streamError;
|
|
741
|
-
}
|
|
742
|
-
}
|
|
743
|
-
finally {
|
|
744
|
-
this.off("data", dataHandler);
|
|
745
|
-
this.off("end", endHandler);
|
|
746
|
-
this.off("error", errorHandler);
|
|
747
|
-
this.off("close", closeHandler);
|
|
748
|
-
}
|
|
749
|
-
return;
|
|
750
|
-
}
|
|
751
|
-
// For Web Stream mode, use the underlying reader
|
|
752
|
-
if (!this._reader) {
|
|
753
|
-
this._reader = this._stream.getReader();
|
|
754
|
-
}
|
|
755
|
-
try {
|
|
756
|
-
while (true) {
|
|
757
|
-
const { done, value } = await this._reader.read();
|
|
758
|
-
if (done) {
|
|
759
|
-
break;
|
|
760
|
-
}
|
|
761
|
-
yield value;
|
|
762
|
-
}
|
|
763
|
-
}
|
|
764
|
-
finally {
|
|
765
|
-
this._reader.releaseLock();
|
|
766
|
-
}
|
|
767
|
-
}
|
|
768
|
-
/**
|
|
769
|
-
* Explicit iterator method (same as Symbol.asyncIterator)
|
|
770
|
-
*/
|
|
771
|
-
iterator(options) {
|
|
772
|
-
const destroyOnReturn = options?.destroyOnReturn ?? true;
|
|
773
|
-
const iterator = this[Symbol.asyncIterator]();
|
|
774
|
-
if (!destroyOnReturn) {
|
|
775
|
-
return iterator;
|
|
776
|
-
}
|
|
777
|
-
// Wrap to handle early return
|
|
778
|
-
return {
|
|
779
|
-
next: async () => {
|
|
780
|
-
return iterator.next();
|
|
781
|
-
},
|
|
782
|
-
return: async (value) => {
|
|
783
|
-
this.destroy();
|
|
784
|
-
return { done: true, value };
|
|
785
|
-
},
|
|
786
|
-
[Symbol.asyncIterator]() {
|
|
787
|
-
return this;
|
|
788
|
-
}
|
|
789
|
-
};
|
|
790
|
-
}
|
|
791
|
-
// =========================================================================
|
|
792
|
-
// Async Iterator Helper Methods (Node.js 16.6+)
|
|
793
|
-
// =========================================================================
|
|
794
|
-
/**
|
|
795
|
-
* Map each chunk through an async function
|
|
796
|
-
*/
|
|
797
|
-
async *map(fn, options) {
|
|
798
|
-
const signal = options?.signal;
|
|
799
|
-
for await (const chunk of this) {
|
|
800
|
-
if (signal?.aborted) {
|
|
801
|
-
throw new Error("AbortError");
|
|
802
|
-
}
|
|
803
|
-
yield await fn(chunk, { signal });
|
|
804
|
-
}
|
|
805
|
-
}
|
|
806
|
-
/**
|
|
807
|
-
* Filter chunks through an async predicate
|
|
808
|
-
*/
|
|
809
|
-
async *filter(fn, options) {
|
|
810
|
-
const signal = options?.signal;
|
|
811
|
-
for await (const chunk of this) {
|
|
812
|
-
if (signal?.aborted) {
|
|
813
|
-
throw new Error("AbortError");
|
|
814
|
-
}
|
|
815
|
-
if (await fn(chunk, { signal })) {
|
|
816
|
-
yield chunk;
|
|
817
|
-
}
|
|
818
|
-
}
|
|
819
|
-
}
|
|
820
|
-
/**
|
|
821
|
-
* FlatMap each chunk
|
|
822
|
-
*/
|
|
823
|
-
async *flatMap(fn, options) {
|
|
824
|
-
const signal = options?.signal;
|
|
825
|
-
for await (const chunk of this) {
|
|
826
|
-
if (signal?.aborted) {
|
|
827
|
-
throw new Error("AbortError");
|
|
828
|
-
}
|
|
829
|
-
const result = await fn(chunk, { signal });
|
|
830
|
-
for await (const item of result) {
|
|
831
|
-
yield item;
|
|
832
|
-
}
|
|
833
|
-
}
|
|
834
|
-
}
|
|
835
|
-
/**
|
|
836
|
-
* Take the first n chunks
|
|
837
|
-
*/
|
|
838
|
-
async *take(limit, options) {
|
|
839
|
-
const signal = options?.signal;
|
|
840
|
-
let count = 0;
|
|
841
|
-
for await (const chunk of this) {
|
|
842
|
-
if (signal?.aborted) {
|
|
843
|
-
throw new Error("AbortError");
|
|
844
|
-
}
|
|
845
|
-
if (count >= limit) {
|
|
846
|
-
break;
|
|
847
|
-
}
|
|
848
|
-
yield chunk;
|
|
849
|
-
count++;
|
|
850
|
-
}
|
|
851
|
-
}
|
|
852
|
-
/**
|
|
853
|
-
* Drop the first n chunks
|
|
854
|
-
*/
|
|
855
|
-
async *drop(limit, options) {
|
|
856
|
-
const signal = options?.signal;
|
|
857
|
-
let count = 0;
|
|
858
|
-
for await (const chunk of this) {
|
|
859
|
-
if (signal?.aborted) {
|
|
860
|
-
throw new Error("AbortError");
|
|
861
|
-
}
|
|
862
|
-
if (count >= limit) {
|
|
863
|
-
yield chunk;
|
|
864
|
-
}
|
|
865
|
-
count++;
|
|
866
|
-
}
|
|
867
|
-
}
|
|
868
|
-
async reduce(fn, initial, options) {
|
|
869
|
-
const signal = options?.signal;
|
|
870
|
-
let accumulator = initial;
|
|
871
|
-
let first = true;
|
|
872
|
-
for await (const chunk of this) {
|
|
873
|
-
if (signal?.aborted) {
|
|
874
|
-
throw new Error("AbortError");
|
|
875
|
-
}
|
|
876
|
-
if (first && accumulator === undefined) {
|
|
877
|
-
accumulator = chunk;
|
|
878
|
-
first = false;
|
|
879
|
-
}
|
|
880
|
-
else {
|
|
881
|
-
accumulator = await fn(accumulator, chunk, { signal });
|
|
882
|
-
}
|
|
883
|
-
}
|
|
884
|
-
if (accumulator === undefined) {
|
|
885
|
-
throw new TypeError("Reduce of empty stream with no initial value");
|
|
886
|
-
}
|
|
887
|
-
return accumulator;
|
|
888
|
-
}
|
|
889
|
-
/**
|
|
890
|
-
* Check if every chunk passes a predicate
|
|
891
|
-
*/
|
|
892
|
-
async every(fn, options) {
|
|
893
|
-
const signal = options?.signal;
|
|
894
|
-
for await (const chunk of this) {
|
|
895
|
-
if (signal?.aborted) {
|
|
896
|
-
throw new Error("AbortError");
|
|
897
|
-
}
|
|
898
|
-
if (!(await fn(chunk, { signal }))) {
|
|
899
|
-
return false;
|
|
900
|
-
}
|
|
901
|
-
}
|
|
902
|
-
return true;
|
|
903
|
-
}
|
|
904
|
-
/**
|
|
905
|
-
* Check if some chunk passes a predicate
|
|
906
|
-
*/
|
|
907
|
-
async some(fn, options) {
|
|
908
|
-
const signal = options?.signal;
|
|
909
|
-
for await (const chunk of this) {
|
|
910
|
-
if (signal?.aborted) {
|
|
911
|
-
throw new Error("AbortError");
|
|
912
|
-
}
|
|
913
|
-
if (await fn(chunk, { signal })) {
|
|
914
|
-
return true;
|
|
915
|
-
}
|
|
916
|
-
}
|
|
917
|
-
return false;
|
|
918
|
-
}
|
|
919
|
-
/**
|
|
920
|
-
* Find first chunk that passes predicate
|
|
921
|
-
*/
|
|
922
|
-
async find(fn, options) {
|
|
923
|
-
const signal = options?.signal;
|
|
924
|
-
for await (const chunk of this) {
|
|
925
|
-
if (signal?.aborted) {
|
|
926
|
-
throw new Error("AbortError");
|
|
927
|
-
}
|
|
928
|
-
if (await fn(chunk, { signal })) {
|
|
929
|
-
return chunk;
|
|
930
|
-
}
|
|
931
|
-
}
|
|
932
|
-
return undefined;
|
|
933
|
-
}
|
|
934
|
-
/**
|
|
935
|
-
* Execute function for each chunk (like forEach)
|
|
936
|
-
*/
|
|
937
|
-
async forEach(fn, options) {
|
|
938
|
-
const signal = options?.signal;
|
|
939
|
-
for await (const chunk of this) {
|
|
940
|
-
if (signal?.aborted) {
|
|
941
|
-
throw new Error("AbortError");
|
|
942
|
-
}
|
|
943
|
-
await fn(chunk, { signal });
|
|
944
|
-
}
|
|
945
|
-
}
|
|
946
|
-
/**
|
|
947
|
-
* Collect all chunks into an array
|
|
948
|
-
*/
|
|
949
|
-
async toArray(options) {
|
|
950
|
-
const signal = options?.signal;
|
|
951
|
-
const result = [];
|
|
952
|
-
for await (const chunk of this) {
|
|
953
|
-
if (signal?.aborted) {
|
|
954
|
-
throw new Error("AbortError");
|
|
955
|
-
}
|
|
956
|
-
result.push(chunk);
|
|
957
|
-
}
|
|
958
|
-
return result;
|
|
959
|
-
}
|
|
960
|
-
/**
|
|
961
|
-
* Yield [index, value] pairs
|
|
962
|
-
*/
|
|
963
|
-
async *asIndexedPairs(options) {
|
|
964
|
-
const signal = options?.signal;
|
|
965
|
-
let index = 0;
|
|
966
|
-
for await (const chunk of this) {
|
|
967
|
-
if (signal?.aborted) {
|
|
968
|
-
throw new Error("AbortError");
|
|
969
|
-
}
|
|
970
|
-
yield [index++, chunk];
|
|
971
|
-
}
|
|
972
|
-
}
|
|
973
|
-
compose(stream) {
|
|
974
|
-
if (typeof stream === "function") {
|
|
975
|
-
// It's an async generator function
|
|
976
|
-
const output = stream(this);
|
|
977
|
-
return Readable.from(output);
|
|
978
|
-
}
|
|
979
|
-
// It's a Duplex stream
|
|
980
|
-
this.pipe(stream);
|
|
981
|
-
return stream;
|
|
982
|
-
}
|
|
983
|
-
}
|
|
984
|
-
exports.Readable = Readable;
|
|
985
|
-
// =============================================================================
|
|
986
|
-
// Writable Stream Wrapper
|
|
987
|
-
// =============================================================================
|
|
988
|
-
/**
|
|
989
|
-
* A wrapper around Web WritableStream that provides Node.js-like API
|
|
990
|
-
*/
|
|
991
|
-
class Writable extends event_emitter_1.EventEmitter {
|
|
992
|
-
constructor(options) {
|
|
993
|
-
super();
|
|
994
|
-
this._writer = null;
|
|
995
|
-
this._ended = false;
|
|
996
|
-
this._finished = false;
|
|
997
|
-
this._destroyed = false;
|
|
998
|
-
this._errored = null;
|
|
999
|
-
this._closed = false;
|
|
1000
|
-
this._pendingWrites = 0;
|
|
1001
|
-
this._writableLength = 0;
|
|
1002
|
-
this._corked = 0;
|
|
1003
|
-
this._corkedChunks = [];
|
|
1004
|
-
this._defaultEncoding = "utf8";
|
|
1005
|
-
this._aborted = false;
|
|
1006
|
-
this.objectMode = options?.objectMode ?? false;
|
|
1007
|
-
this.writableHighWaterMark = options?.highWaterMark ?? 16384;
|
|
1008
|
-
this.autoDestroy = options?.autoDestroy ?? true;
|
|
1009
|
-
this.emitClose = options?.emitClose ?? true;
|
|
1010
|
-
this._defaultEncoding = options?.defaultEncoding ?? "utf8";
|
|
1011
|
-
// Store user-provided write function
|
|
1012
|
-
if (options?.write) {
|
|
1013
|
-
this._writeFunc = options.write.bind(this);
|
|
1014
|
-
}
|
|
1015
|
-
// Store user-provided final function
|
|
1016
|
-
if (options?.final) {
|
|
1017
|
-
this._finalFunc = options.final.bind(this);
|
|
1018
|
-
}
|
|
1019
|
-
if (options?.stream) {
|
|
1020
|
-
this._stream = options.stream;
|
|
1021
|
-
}
|
|
1022
|
-
else {
|
|
1023
|
-
// Create bound references to instance properties/methods for use in WritableStream callbacks
|
|
1024
|
-
const getWriteFunc = () => this._writeFunc;
|
|
1025
|
-
const getFinalFunc = () => this._finalFunc;
|
|
1026
|
-
const getDefaultEncoding = () => this._defaultEncoding;
|
|
1027
|
-
const setFinished = (value) => {
|
|
1028
|
-
this._finished = value;
|
|
1029
|
-
};
|
|
1030
|
-
const setAborted = (value) => {
|
|
1031
|
-
this._aborted = value;
|
|
1032
|
-
};
|
|
1033
|
-
const emitEvent = this.emit.bind(this);
|
|
1034
|
-
const getEmitClose = () => this.emitClose;
|
|
1035
|
-
const callWrite = (chunk) => this._write?.(chunk);
|
|
1036
|
-
this._stream = new WritableStream({
|
|
1037
|
-
write: async (chunk) => {
|
|
1038
|
-
// Use user-provided write function or default behavior
|
|
1039
|
-
const writeFunc = getWriteFunc();
|
|
1040
|
-
if (writeFunc) {
|
|
1041
|
-
await new Promise((resolve, reject) => {
|
|
1042
|
-
writeFunc(chunk, getDefaultEncoding(), err => {
|
|
1043
|
-
if (err) {
|
|
1044
|
-
reject(err);
|
|
1045
|
-
}
|
|
1046
|
-
else {
|
|
1047
|
-
resolve();
|
|
1048
|
-
}
|
|
1049
|
-
});
|
|
1050
|
-
});
|
|
1051
|
-
}
|
|
1052
|
-
else {
|
|
1053
|
-
// Override this in subclasses
|
|
1054
|
-
callWrite(chunk);
|
|
1055
|
-
}
|
|
1056
|
-
},
|
|
1057
|
-
close: async () => {
|
|
1058
|
-
// Call final function if provided
|
|
1059
|
-
const finalFunc = getFinalFunc();
|
|
1060
|
-
if (finalFunc) {
|
|
1061
|
-
await new Promise((resolve, reject) => {
|
|
1062
|
-
finalFunc(err => {
|
|
1063
|
-
if (err) {
|
|
1064
|
-
reject(err);
|
|
1065
|
-
}
|
|
1066
|
-
else {
|
|
1067
|
-
resolve();
|
|
1068
|
-
}
|
|
1069
|
-
});
|
|
1070
|
-
});
|
|
1071
|
-
}
|
|
1072
|
-
setFinished(true);
|
|
1073
|
-
emitEvent("finish");
|
|
1074
|
-
if (getEmitClose()) {
|
|
1075
|
-
emitEvent("close");
|
|
1076
|
-
}
|
|
1077
|
-
},
|
|
1078
|
-
abort: reason => {
|
|
1079
|
-
setAborted(true);
|
|
1080
|
-
emitEvent("error", reason);
|
|
1081
|
-
}
|
|
1082
|
-
});
|
|
1083
|
-
}
|
|
1084
|
-
}
|
|
1085
|
-
/**
|
|
1086
|
-
* Set default encoding for string writes
|
|
1087
|
-
*/
|
|
1088
|
-
setDefaultEncoding(encoding) {
|
|
1089
|
-
this._defaultEncoding = encoding;
|
|
1090
|
-
return this;
|
|
1091
|
-
}
|
|
1092
|
-
/**
|
|
1093
|
-
* Buffer writes until uncork() is called
|
|
1094
|
-
*/
|
|
1095
|
-
cork() {
|
|
1096
|
-
this._corked++;
|
|
1097
|
-
}
|
|
1098
|
-
/**
|
|
1099
|
-
* Flush buffered writes from cork()
|
|
1100
|
-
*/
|
|
1101
|
-
uncork() {
|
|
1102
|
-
if (this._corked > 0) {
|
|
1103
|
-
this._corked--;
|
|
1104
|
-
}
|
|
1105
|
-
if (this._corked === 0) {
|
|
1106
|
-
// Flush all corked chunks
|
|
1107
|
-
const chunks = this._corkedChunks;
|
|
1108
|
-
this._corkedChunks = [];
|
|
1109
|
-
for (const { chunk, callback } of chunks) {
|
|
1110
|
-
this._doWrite(chunk, callback);
|
|
1111
|
-
}
|
|
1112
|
-
}
|
|
1113
|
-
}
|
|
1114
|
-
write(chunk, encodingOrCallback, callback) {
|
|
1115
|
-
if (this._destroyed || this._ended) {
|
|
1116
|
-
const err = new Error("Cannot write after stream destroyed/ended");
|
|
1117
|
-
const cb = typeof encodingOrCallback === "function" ? encodingOrCallback : callback;
|
|
1118
|
-
cb?.(err);
|
|
1119
|
-
return false;
|
|
1120
|
-
}
|
|
1121
|
-
const cb = typeof encodingOrCallback === "function" ? encodingOrCallback : callback;
|
|
1122
|
-
// If corked, buffer the write
|
|
1123
|
-
if (this._corked > 0) {
|
|
1124
|
-
this._corkedChunks.push({ chunk, callback: cb });
|
|
1125
|
-
const chunkSize = this._getChunkSize(chunk);
|
|
1126
|
-
this._writableLength += chunkSize;
|
|
1127
|
-
return this._writableLength < this.writableHighWaterMark;
|
|
1128
|
-
}
|
|
1129
|
-
return this._doWrite(chunk, cb);
|
|
1130
|
-
}
|
|
1131
|
-
_doWrite(chunk, callback) {
|
|
1132
|
-
// Track pending writes for writableLength
|
|
1133
|
-
const chunkSize = this._getChunkSize(chunk);
|
|
1134
|
-
this._pendingWrites++;
|
|
1135
|
-
this._writableLength += chunkSize;
|
|
1136
|
-
this._getWriter()
|
|
1137
|
-
.write(chunk)
|
|
1138
|
-
.then(() => {
|
|
1139
|
-
this._pendingWrites--;
|
|
1140
|
-
this._writableLength -= chunkSize;
|
|
1141
|
-
this.emit("drain");
|
|
1142
|
-
callback?.(null);
|
|
1143
|
-
})
|
|
1144
|
-
.catch(err => {
|
|
1145
|
-
this._pendingWrites--;
|
|
1146
|
-
this._writableLength -= chunkSize;
|
|
1147
|
-
this.emit("error", err);
|
|
1148
|
-
callback?.(err);
|
|
1149
|
-
});
|
|
1150
|
-
// Return false if we've exceeded high water mark (for backpressure)
|
|
1151
|
-
return this._writableLength < this.writableHighWaterMark;
|
|
1152
|
-
}
|
|
1153
|
-
_getChunkSize(chunk) {
|
|
1154
|
-
if (this.objectMode) {
|
|
1155
|
-
return 1;
|
|
1156
|
-
}
|
|
1157
|
-
if (chunk instanceof Uint8Array) {
|
|
1158
|
-
return chunk.byteLength;
|
|
1159
|
-
}
|
|
1160
|
-
if (typeof chunk === "string") {
|
|
1161
|
-
return chunk.length;
|
|
1162
|
-
}
|
|
1163
|
-
return 0;
|
|
1164
|
-
}
|
|
1165
|
-
end(chunkOrCallback, encodingOrCallback, callback) {
|
|
1166
|
-
if (this._ended) {
|
|
1167
|
-
return this;
|
|
1168
|
-
}
|
|
1169
|
-
this._ended = true;
|
|
1170
|
-
const chunk = typeof chunkOrCallback !== "function" ? chunkOrCallback : undefined;
|
|
1171
|
-
const cb = typeof chunkOrCallback === "function"
|
|
1172
|
-
? chunkOrCallback
|
|
1173
|
-
: typeof encodingOrCallback === "function"
|
|
1174
|
-
? encodingOrCallback
|
|
1175
|
-
: callback;
|
|
1176
|
-
const finish = async () => {
|
|
1177
|
-
try {
|
|
1178
|
-
if (chunk !== undefined) {
|
|
1179
|
-
await this._getWriter().write(chunk);
|
|
1180
|
-
}
|
|
1181
|
-
await this._getWriter().close();
|
|
1182
|
-
this._finished = true;
|
|
1183
|
-
this.emit("finish");
|
|
1184
|
-
if (cb) {
|
|
1185
|
-
cb();
|
|
1186
|
-
}
|
|
1187
|
-
}
|
|
1188
|
-
catch (err) {
|
|
1189
|
-
this.emit("error", err);
|
|
1190
|
-
}
|
|
1191
|
-
};
|
|
1192
|
-
finish();
|
|
1193
|
-
return this;
|
|
1194
|
-
}
|
|
1195
|
-
/**
|
|
1196
|
-
* Destroy the stream
|
|
1197
|
-
*/
|
|
1198
|
-
destroy(error) {
|
|
1199
|
-
if (this._destroyed) {
|
|
1200
|
-
return this;
|
|
1201
|
-
}
|
|
1202
|
-
this._destroyed = true;
|
|
1203
|
-
this._ended = true;
|
|
1204
|
-
if (error) {
|
|
1205
|
-
this._errored = error;
|
|
1206
|
-
this.emit("error", error);
|
|
1207
|
-
}
|
|
1208
|
-
if (this._writer) {
|
|
1209
|
-
this._writer.abort(error).catch(() => { });
|
|
1210
|
-
}
|
|
1211
|
-
this._closed = true;
|
|
1212
|
-
this.emit("close");
|
|
1213
|
-
return this;
|
|
1214
|
-
}
|
|
1215
|
-
/**
|
|
1216
|
-
* Get the underlying Web WritableStream
|
|
1217
|
-
*/
|
|
1218
|
-
get webStream() {
|
|
1219
|
-
return this._stream;
|
|
1220
|
-
}
|
|
1221
|
-
get writable() {
|
|
1222
|
-
return !this._destroyed && !this._ended;
|
|
1223
|
-
}
|
|
1224
|
-
get writableEnded() {
|
|
1225
|
-
return this._ended;
|
|
1226
|
-
}
|
|
1227
|
-
get writableFinished() {
|
|
1228
|
-
return this._finished;
|
|
1229
|
-
}
|
|
1230
|
-
get writableLength() {
|
|
1231
|
-
return this._writableLength;
|
|
1232
|
-
}
|
|
1233
|
-
/** Whether the stream has been destroyed */
|
|
1234
|
-
get destroyed() {
|
|
1235
|
-
return this._destroyed;
|
|
1236
|
-
}
|
|
1237
|
-
/** The error that destroyed the stream, or null */
|
|
1238
|
-
get errored() {
|
|
1239
|
-
return this._errored;
|
|
1240
|
-
}
|
|
1241
|
-
/** Whether the stream has been closed */
|
|
1242
|
-
get closed() {
|
|
1243
|
-
return this._closed;
|
|
1244
|
-
}
|
|
1245
|
-
/** Whether the stream needs drain (writableLength exceeds high water mark) */
|
|
1246
|
-
get writableNeedDrain() {
|
|
1247
|
-
return this._writableLength >= this.writableHighWaterMark;
|
|
1248
|
-
}
|
|
1249
|
-
/** How many times cork() has been called without uncork() */
|
|
1250
|
-
get writableCorked() {
|
|
1251
|
-
return this._corked;
|
|
1252
|
-
}
|
|
1253
|
-
/** Whether the stream was aborted */
|
|
1254
|
-
get writableAborted() {
|
|
1255
|
-
return this._aborted;
|
|
1256
|
-
}
|
|
1257
|
-
/** Whether the stream is in object mode */
|
|
1258
|
-
get writableObjectMode() {
|
|
1259
|
-
return this.objectMode;
|
|
1260
|
-
}
|
|
1261
|
-
/** Get default encoding */
|
|
1262
|
-
get defaultEncoding() {
|
|
1263
|
-
return this._defaultEncoding;
|
|
1264
|
-
}
|
|
1265
|
-
/**
|
|
1266
|
-
* Get the internal buffer state (for debugging)
|
|
1267
|
-
* Returns array of objects with length and chunk info
|
|
1268
|
-
*/
|
|
1269
|
-
get writableBuffer() {
|
|
1270
|
-
return {
|
|
1271
|
-
length: this._corkedChunks.length,
|
|
1272
|
-
head: this._corkedChunks.length > 0 ? this._corkedChunks[0].chunk : null
|
|
1273
|
-
};
|
|
1274
|
-
}
|
|
1275
|
-
/**
|
|
1276
|
-
* Write multiple chunks at once (batch write).
|
|
1277
|
-
* Override in subclass to implement custom batch write logic.
|
|
1278
|
-
*/
|
|
1279
|
-
_writev(chunks, callback) {
|
|
1280
|
-
// Default implementation: write each chunk individually
|
|
1281
|
-
let i = 0;
|
|
1282
|
-
const writeNext = () => {
|
|
1283
|
-
if (i >= chunks.length) {
|
|
1284
|
-
callback(null);
|
|
1285
|
-
return;
|
|
1286
|
-
}
|
|
1287
|
-
const { chunk } = chunks[i++];
|
|
1288
|
-
this._doWrite(chunk, err => {
|
|
1289
|
-
if (err) {
|
|
1290
|
-
callback(err);
|
|
1291
|
-
return;
|
|
1292
|
-
}
|
|
1293
|
-
// Continue to next chunk
|
|
1294
|
-
writeNext();
|
|
1295
|
-
});
|
|
1296
|
-
};
|
|
1297
|
-
writeNext();
|
|
1298
|
-
}
|
|
1299
|
-
/**
|
|
1300
|
-
* Batch write multiple chunks
|
|
1301
|
-
*/
|
|
1302
|
-
writev(chunks, callback) {
|
|
1303
|
-
if (this._destroyed || this._ended) {
|
|
1304
|
-
const err = new Error("Cannot write after stream destroyed/ended");
|
|
1305
|
-
callback?.(err);
|
|
1306
|
-
return false;
|
|
1307
|
-
}
|
|
1308
|
-
this._writev(chunks, callback ?? (() => { }));
|
|
1309
|
-
// Return backpressure indicator
|
|
1310
|
-
return this._writableLength < this.writableHighWaterMark;
|
|
1311
|
-
}
|
|
1312
|
-
_getWriter() {
|
|
1313
|
-
if (!this._writer) {
|
|
1314
|
-
this._writer = this._stream.getWriter();
|
|
1315
|
-
}
|
|
1316
|
-
return this._writer;
|
|
1317
|
-
}
|
|
1318
|
-
// =========================================================================
|
|
1319
|
-
// Static Methods (Node.js compatibility)
|
|
1320
|
-
// =========================================================================
|
|
1321
|
-
/**
|
|
1322
|
-
* Convert a Web WritableStream to Node.js Writable
|
|
1323
|
-
*/
|
|
1324
|
-
static fromWeb(webStream, options) {
|
|
1325
|
-
return new Writable({ ...options, stream: webStream });
|
|
1326
|
-
}
|
|
1327
|
-
/**
|
|
1328
|
-
* Convert a Node.js Writable to Web WritableStream
|
|
1329
|
-
*/
|
|
1330
|
-
static toWeb(nodeStream) {
|
|
1331
|
-
return nodeStream.webStream;
|
|
1332
|
-
}
|
|
1333
|
-
}
|
|
1334
|
-
exports.Writable = Writable;
|
|
1335
|
-
// =============================================================================
|
|
1336
|
-
// Cross-environment stream normalization
|
|
1337
|
-
// =============================================================================
|
|
1338
|
-
/**
|
|
1339
|
-
* Normalize a user-provided writable into this module's Writable.
|
|
1340
|
-
* Keeps Web/Node branching at the stream-module boundary.
|
|
1341
|
-
*/
|
|
1342
|
-
function normalizeWritable(stream) {
|
|
1343
|
-
if (stream instanceof Writable) {
|
|
1344
|
-
return stream;
|
|
1345
|
-
}
|
|
1346
|
-
// Web WritableStream
|
|
1347
|
-
if (stream?.getWriter) {
|
|
1348
|
-
return new Writable({ stream: stream });
|
|
1349
|
-
}
|
|
1350
|
-
// Already a Node-like writable (e.g. StreamBuf)
|
|
1351
|
-
return stream;
|
|
1352
|
-
}
|
|
1353
|
-
// =============================================================================
|
|
1354
|
-
// Transform Stream Wrapper
|
|
1355
|
-
// =============================================================================
|
|
1356
|
-
/**
|
|
1357
|
-
* A wrapper around Web TransformStream that provides Node.js-like API
|
|
1358
|
-
*/
|
|
1359
|
-
class Transform extends event_emitter_1.EventEmitter {
|
|
1360
|
-
/**
|
|
1361
|
-
* Push data to the readable side (Node.js compatibility)
|
|
1362
|
-
* Can be called from within transform callback
|
|
1363
|
-
*/
|
|
1364
|
-
push(chunk) {
|
|
1365
|
-
if (chunk === null) {
|
|
1366
|
-
return false;
|
|
1367
|
-
}
|
|
1368
|
-
if (this._transformController) {
|
|
1369
|
-
// If we're in a transform callback, enqueue directly
|
|
1370
|
-
this._transformController.enqueue(chunk);
|
|
1371
|
-
}
|
|
1372
|
-
else {
|
|
1373
|
-
// Otherwise buffer for later
|
|
1374
|
-
this._pushBuffer.push(chunk);
|
|
1375
|
-
}
|
|
1376
|
-
return true;
|
|
1377
|
-
}
|
|
1378
|
-
constructor(options) {
|
|
1379
|
-
super();
|
|
1380
|
-
this._ended = false;
|
|
1381
|
-
this._destroyed = false;
|
|
1382
|
-
this._errored = false;
|
|
1383
|
-
// Buffer for Node.js style push() calls during transform
|
|
1384
|
-
this._pushBuffer = [];
|
|
1385
|
-
// Controller for enqueueing pushed data (set during transform execution)
|
|
1386
|
-
this._transformController = null;
|
|
1387
|
-
// Buffer for writes that occur after end() but before writable is closed
|
|
1388
|
-
this._pendingEndWrites = [];
|
|
1389
|
-
// Whether end() has been called but writable not yet closed
|
|
1390
|
-
this._endPending = false;
|
|
1391
|
-
// Track if we've already set up data forwarding
|
|
1392
|
-
this._dataForwardingSetup = false;
|
|
1393
|
-
/** @internal - whether we have a data event consumer */
|
|
1394
|
-
this._hasDataConsumer = false;
|
|
1395
|
-
/** @internal - whether we're auto-consuming the readable */
|
|
1396
|
-
this._readableConsuming = false;
|
|
1397
|
-
/** @internal - buffer for auto-consumed data */
|
|
1398
|
-
this._autoConsumedBuffer = [];
|
|
1399
|
-
this._autoConsumedBufferIndex = 0;
|
|
1400
|
-
/** @internal - whether auto-consume has ended */
|
|
1401
|
-
this._autoConsumeEnded = false;
|
|
1402
|
-
/** @internal - promise that resolves when auto-consume finishes */
|
|
1403
|
-
this._autoConsumePromise = null;
|
|
1404
|
-
this.objectMode = options?.objectMode ?? false;
|
|
1405
|
-
const userTransform = options?.transform;
|
|
1406
|
-
const userFlush = options?.flush;
|
|
1407
|
-
// Determine if transform function is Node.js style (has 3 params) or simple style
|
|
1408
|
-
const isNodeStyleTransform = userTransform && userTransform.length >= 3;
|
|
1409
|
-
const isNodeStyleFlush = userFlush && userFlush.length >= 1;
|
|
1410
|
-
// Create bound references for use in TransformStream callbacks
|
|
1411
|
-
const setController = (ctrl) => {
|
|
1412
|
-
this._transformController = ctrl;
|
|
1413
|
-
};
|
|
1414
|
-
const emitEvent = (event, ...args) => {
|
|
1415
|
-
if (event === "error") {
|
|
1416
|
-
// Only emit error once to prevent duplicate events
|
|
1417
|
-
if (this._errored) {
|
|
1418
|
-
return false;
|
|
1419
|
-
}
|
|
1420
|
-
this._errored = true;
|
|
1421
|
-
// Also destroy the writable to prevent further writes
|
|
1422
|
-
this._writable.destroy(args[0]);
|
|
1423
|
-
}
|
|
1424
|
-
return this.emit(event, ...args);
|
|
1425
|
-
};
|
|
1426
|
-
const getInstance = () => this;
|
|
1427
|
-
// Check if subclass overrides _transform (for Node.js compatibility)
|
|
1428
|
-
// We need to check this at runtime since the subclass constructor runs after super()
|
|
1429
|
-
const hasSubclassTransform = () => {
|
|
1430
|
-
// If userTransform was provided in options, use that
|
|
1431
|
-
if (userTransform) {
|
|
1432
|
-
return false;
|
|
1433
|
-
}
|
|
1434
|
-
// Check if _transform is overridden (not the base class no-op)
|
|
1435
|
-
const proto = Object.getPrototypeOf(this);
|
|
1436
|
-
return proto._transform !== Transform.prototype._transform;
|
|
1437
|
-
};
|
|
1438
|
-
const hasSubclassFlush = () => {
|
|
1439
|
-
if (userFlush) {
|
|
1440
|
-
return false;
|
|
1441
|
-
}
|
|
1442
|
-
const proto = Object.getPrototypeOf(this);
|
|
1443
|
-
return proto._flush !== Transform.prototype._flush;
|
|
1444
|
-
};
|
|
1445
|
-
this._stream = new TransformStream({
|
|
1446
|
-
transform: async (chunk, controller) => {
|
|
1447
|
-
// Skip processing if already errored
|
|
1448
|
-
if (this._errored) {
|
|
1449
|
-
return;
|
|
1450
|
-
}
|
|
1451
|
-
try {
|
|
1452
|
-
// Set controller for push() to use
|
|
1453
|
-
setController(controller);
|
|
1454
|
-
// Check for subclass _transform override first
|
|
1455
|
-
if (hasSubclassTransform()) {
|
|
1456
|
-
// Call subclass _transform method (Node.js style)
|
|
1457
|
-
await new Promise((resolve, reject) => {
|
|
1458
|
-
this._transform(chunk, "utf8", (err, data) => {
|
|
1459
|
-
if (err) {
|
|
1460
|
-
reject(err);
|
|
1461
|
-
}
|
|
1462
|
-
else {
|
|
1463
|
-
if (data !== undefined) {
|
|
1464
|
-
controller.enqueue(data);
|
|
1465
|
-
}
|
|
1466
|
-
resolve();
|
|
1467
|
-
}
|
|
1468
|
-
});
|
|
1469
|
-
});
|
|
1470
|
-
}
|
|
1471
|
-
else if (userTransform) {
|
|
1472
|
-
if (isNodeStyleTransform) {
|
|
1473
|
-
// Node.js style: transform(chunk, encoding, callback)
|
|
1474
|
-
await new Promise((resolve, reject) => {
|
|
1475
|
-
userTransform.call(getInstance(), chunk, "utf8", (err, data) => {
|
|
1476
|
-
if (err) {
|
|
1477
|
-
reject(err);
|
|
1478
|
-
}
|
|
1479
|
-
else {
|
|
1480
|
-
// If data provided via callback, enqueue it
|
|
1481
|
-
if (data !== undefined) {
|
|
1482
|
-
controller.enqueue(data);
|
|
1483
|
-
}
|
|
1484
|
-
resolve();
|
|
1485
|
-
}
|
|
1486
|
-
});
|
|
1487
|
-
});
|
|
1488
|
-
}
|
|
1489
|
-
else {
|
|
1490
|
-
// Simple style: transform(chunk) => result
|
|
1491
|
-
const result = await userTransform(chunk);
|
|
1492
|
-
if (result !== undefined) {
|
|
1493
|
-
controller.enqueue(result);
|
|
1494
|
-
}
|
|
1495
|
-
}
|
|
1496
|
-
}
|
|
1497
|
-
else {
|
|
1498
|
-
// Default: pass through
|
|
1499
|
-
controller.enqueue(chunk);
|
|
1500
|
-
}
|
|
1501
|
-
}
|
|
1502
|
-
catch (err) {
|
|
1503
|
-
controller.error(err);
|
|
1504
|
-
emitEvent("error", err);
|
|
1505
|
-
}
|
|
1506
|
-
finally {
|
|
1507
|
-
setController(null);
|
|
1508
|
-
}
|
|
1509
|
-
},
|
|
1510
|
-
flush: async (controller) => {
|
|
1511
|
-
try {
|
|
1512
|
-
setController(controller);
|
|
1513
|
-
// Check for subclass _flush override first
|
|
1514
|
-
if (hasSubclassFlush()) {
|
|
1515
|
-
await new Promise((resolve, reject) => {
|
|
1516
|
-
this._flush((err, data) => {
|
|
1517
|
-
if (err) {
|
|
1518
|
-
reject(err);
|
|
1519
|
-
}
|
|
1520
|
-
else {
|
|
1521
|
-
if (data !== undefined) {
|
|
1522
|
-
controller.enqueue(data);
|
|
1523
|
-
}
|
|
1524
|
-
resolve();
|
|
1525
|
-
}
|
|
1526
|
-
});
|
|
1527
|
-
});
|
|
1528
|
-
}
|
|
1529
|
-
else if (userFlush) {
|
|
1530
|
-
if (isNodeStyleFlush) {
|
|
1531
|
-
// Node.js style: flush(callback)
|
|
1532
|
-
await new Promise((resolve, reject) => {
|
|
1533
|
-
userFlush.call(getInstance(), (err, data) => {
|
|
1534
|
-
if (err) {
|
|
1535
|
-
reject(err);
|
|
1536
|
-
}
|
|
1537
|
-
else {
|
|
1538
|
-
if (data !== undefined) {
|
|
1539
|
-
controller.enqueue(data);
|
|
1540
|
-
}
|
|
1541
|
-
resolve();
|
|
1542
|
-
}
|
|
1543
|
-
});
|
|
1544
|
-
});
|
|
1545
|
-
}
|
|
1546
|
-
else {
|
|
1547
|
-
// Simple style: flush() => result
|
|
1548
|
-
const result = await userFlush();
|
|
1549
|
-
if (result !== undefined && result !== null) {
|
|
1550
|
-
controller.enqueue(result);
|
|
1551
|
-
}
|
|
1552
|
-
}
|
|
1553
|
-
}
|
|
1554
|
-
// No flush defined - nothing to do
|
|
1555
|
-
}
|
|
1556
|
-
catch (err) {
|
|
1557
|
-
controller.error(err);
|
|
1558
|
-
emitEvent("error", err);
|
|
1559
|
-
}
|
|
1560
|
-
finally {
|
|
1561
|
-
setController(null);
|
|
1562
|
-
}
|
|
1563
|
-
}
|
|
1564
|
-
});
|
|
1565
|
-
this._readable = new Readable({
|
|
1566
|
-
stream: this._stream.readable,
|
|
1567
|
-
objectMode: this.objectMode
|
|
1568
|
-
});
|
|
1569
|
-
this._writable = new Writable({
|
|
1570
|
-
stream: this._stream.writable,
|
|
1571
|
-
objectMode: this.objectMode
|
|
1572
|
-
});
|
|
1573
|
-
// Forward non-data events (data forwarding is lazy to avoid premature flowing)
|
|
1574
|
-
this._readable.on("end", () => this.emit("end"));
|
|
1575
|
-
// Only forward errors if not already errored (to prevent duplicate events)
|
|
1576
|
-
this._readable.on("error", err => {
|
|
1577
|
-
if (!this._errored) {
|
|
1578
|
-
this._errored = true;
|
|
1579
|
-
this.emit("error", err);
|
|
1580
|
-
}
|
|
1581
|
-
});
|
|
1582
|
-
this._writable.on("finish", () => this.emit("finish"));
|
|
1583
|
-
this._writable.on("drain", () => this.emit("drain"));
|
|
1584
|
-
// Only forward errors if not already errored (to prevent duplicate events)
|
|
1585
|
-
this._writable.on("error", err => {
|
|
1586
|
-
if (!this._errored) {
|
|
1587
|
-
this._errored = true;
|
|
1588
|
-
this.emit("error", err);
|
|
1589
|
-
}
|
|
1590
|
-
});
|
|
1591
|
-
}
|
|
1592
|
-
/**
|
|
1593
|
-
* Override on to start flowing when data listener is added
|
|
1594
|
-
*/
|
|
1595
|
-
on(event, listener) {
|
|
1596
|
-
// Set up data forwarding when first external data listener is added
|
|
1597
|
-
if (event === "data" && !this._dataForwardingSetup) {
|
|
1598
|
-
this._dataForwardingSetup = true;
|
|
1599
|
-
this._readable.on("data", data => this.emit("data", data));
|
|
1600
|
-
}
|
|
1601
|
-
super.on(event, listener);
|
|
1602
|
-
// When data listener is added, mark as having consumer
|
|
1603
|
-
// and start the readable in flowing mode
|
|
1604
|
-
if (event === "data") {
|
|
1605
|
-
this._hasDataConsumer = true;
|
|
1606
|
-
this._readable.resume();
|
|
1607
|
-
}
|
|
1608
|
-
return this;
|
|
1609
|
-
}
|
|
1610
|
-
write(chunk, encodingOrCallback, callback) {
|
|
1611
|
-
const cb = typeof encodingOrCallback === "function" ? encodingOrCallback : callback;
|
|
1612
|
-
if (this._destroyed || this._errored) {
|
|
1613
|
-
const err = new Error(this._errored ? "Cannot write after stream errored" : "Cannot write after stream destroyed");
|
|
1614
|
-
queueMicrotask(() => this.emit("error", err));
|
|
1615
|
-
cb?.(err);
|
|
1616
|
-
return false;
|
|
1617
|
-
}
|
|
1618
|
-
// Ensure readable is being consumed to allow transform to execute
|
|
1619
|
-
// This matches Node.js behavior where transform executes immediately on write
|
|
1620
|
-
// Only auto-consume if no explicit consumer (data listener or pipe)
|
|
1621
|
-
if (!this._readableConsuming && !this._hasDataConsumer) {
|
|
1622
|
-
this._readableConsuming = true;
|
|
1623
|
-
this._startAutoConsume();
|
|
1624
|
-
}
|
|
1625
|
-
// If end() was called but writable not yet closed, buffer the write
|
|
1626
|
-
// This allows writes during data event handlers to be processed
|
|
1627
|
-
if (this._endPending) {
|
|
1628
|
-
this._pendingEndWrites.push({ chunk, callback: cb });
|
|
1629
|
-
return true;
|
|
1630
|
-
}
|
|
1631
|
-
return this._writable.write(chunk, cb);
|
|
1632
|
-
}
|
|
1633
|
-
/** @internal - auto-consume readable to allow transform to execute */
|
|
1634
|
-
_startAutoConsume() {
|
|
1635
|
-
this._autoConsumePromise = (async () => {
|
|
1636
|
-
try {
|
|
1637
|
-
for await (const chunk of this._readable) {
|
|
1638
|
-
// Buffer the data for later retrieval
|
|
1639
|
-
this._autoConsumedBuffer.push(chunk);
|
|
1640
|
-
// Also emit data event for listeners
|
|
1641
|
-
this.emit("data", chunk);
|
|
1642
|
-
}
|
|
1643
|
-
this._autoConsumeEnded = true;
|
|
1644
|
-
this.emit("end");
|
|
1645
|
-
}
|
|
1646
|
-
catch (err) {
|
|
1647
|
-
this.emit("error", err);
|
|
1648
|
-
}
|
|
1649
|
-
})();
|
|
1650
|
-
}
|
|
1651
|
-
end(chunkOrCallback, encodingOrCallback, callback) {
|
|
1652
|
-
if (this._ended) {
|
|
1653
|
-
return this;
|
|
1654
|
-
}
|
|
1655
|
-
this._ended = true;
|
|
1656
|
-
this._endPending = true;
|
|
1657
|
-
const chunk = typeof chunkOrCallback === "function" ? undefined : chunkOrCallback;
|
|
1658
|
-
const cb = typeof chunkOrCallback === "function"
|
|
1659
|
-
? chunkOrCallback
|
|
1660
|
-
: typeof encodingOrCallback === "function"
|
|
1661
|
-
? encodingOrCallback
|
|
1662
|
-
: callback;
|
|
1663
|
-
if (cb) {
|
|
1664
|
-
this.once("finish", cb);
|
|
1665
|
-
}
|
|
1666
|
-
if (chunk !== undefined) {
|
|
1667
|
-
this._writable.write(chunk);
|
|
1668
|
-
}
|
|
1669
|
-
// Use setTimeout(0) instead of queueMicrotask to ensure all transform
|
|
1670
|
-
// processing and data events complete before we close the writable.
|
|
1671
|
-
// Microtasks run before the TransformStream processes data.
|
|
1672
|
-
setTimeout(() => {
|
|
1673
|
-
// Process any writes that occurred during data events
|
|
1674
|
-
for (const { chunk: pendingChunk, callback } of this._pendingEndWrites) {
|
|
1675
|
-
this._writable.write(pendingChunk, callback);
|
|
1676
|
-
}
|
|
1677
|
-
this._pendingEndWrites = [];
|
|
1678
|
-
this._endPending = false;
|
|
1679
|
-
this._writable.end();
|
|
1680
|
-
}, 0);
|
|
1681
|
-
return this;
|
|
1682
|
-
}
|
|
1683
|
-
/**
|
|
1684
|
-
* Read from the transform stream
|
|
1685
|
-
*/
|
|
1686
|
-
read(size) {
|
|
1687
|
-
return this._readable.read(size);
|
|
1688
|
-
}
|
|
1689
|
-
/**
|
|
1690
|
-
* Pipe to another stream (writable, transform, or duplex)
|
|
1691
|
-
*/
|
|
1692
|
-
pipe(destination) {
|
|
1693
|
-
// Mark as having consumer to prevent auto-consume conflict
|
|
1694
|
-
this._hasDataConsumer = true;
|
|
1695
|
-
return this._readable.pipe(destination);
|
|
1696
|
-
}
|
|
1697
|
-
/**
|
|
1698
|
-
* Unpipe from destination
|
|
1699
|
-
*/
|
|
1700
|
-
unpipe(destination) {
|
|
1701
|
-
this._readable.unpipe(destination);
|
|
1702
|
-
return this;
|
|
1703
|
-
}
|
|
1704
|
-
/**
|
|
1705
|
-
* Check if paused
|
|
1706
|
-
*/
|
|
1707
|
-
isPaused() {
|
|
1708
|
-
return this._readable.isPaused();
|
|
1709
|
-
}
|
|
1710
|
-
/**
|
|
1711
|
-
* Resume reading from the readable side
|
|
1712
|
-
*/
|
|
1713
|
-
resume() {
|
|
1714
|
-
this._readable.resume();
|
|
1715
|
-
return this;
|
|
1716
|
-
}
|
|
1717
|
-
/**
|
|
1718
|
-
* Pause reading from the readable side
|
|
1719
|
-
*/
|
|
1720
|
-
pause() {
|
|
1721
|
-
this._readable.pause();
|
|
1722
|
-
return this;
|
|
1723
|
-
}
|
|
1724
|
-
/**
|
|
1725
|
-
* Destroy the stream
|
|
1726
|
-
*/
|
|
1727
|
-
destroy(error) {
|
|
1728
|
-
if (this._destroyed) {
|
|
1729
|
-
return;
|
|
1730
|
-
}
|
|
1731
|
-
this._destroyed = true;
|
|
1732
|
-
this._readable.destroy(error);
|
|
1733
|
-
this._writable.destroy(error);
|
|
1734
|
-
queueMicrotask(() => this.emit("close"));
|
|
1735
|
-
}
|
|
1736
|
-
/**
|
|
1737
|
-
* Get the underlying Web TransformStream
|
|
1738
|
-
*/
|
|
1739
|
-
get webStream() {
|
|
1740
|
-
return this._stream;
|
|
1741
|
-
}
|
|
1742
|
-
get readable() {
|
|
1743
|
-
return this._readable.readable;
|
|
1744
|
-
}
|
|
1745
|
-
get writable() {
|
|
1746
|
-
return this._writable.writable;
|
|
1747
|
-
}
|
|
1748
|
-
get readableEnded() {
|
|
1749
|
-
return this._readable.readableEnded;
|
|
1750
|
-
}
|
|
1751
|
-
get writableEnded() {
|
|
1752
|
-
return this._writable.writableEnded;
|
|
1753
|
-
}
|
|
1754
|
-
get writableFinished() {
|
|
1755
|
-
return this._writable.writableFinished;
|
|
1756
|
-
}
|
|
1757
|
-
get readableLength() {
|
|
1758
|
-
return this._readable.readableLength;
|
|
1759
|
-
}
|
|
1760
|
-
get writableLength() {
|
|
1761
|
-
return this._writable.writableLength;
|
|
1762
|
-
}
|
|
1763
|
-
get readableHighWaterMark() {
|
|
1764
|
-
return this._readable.readableHighWaterMark;
|
|
1765
|
-
}
|
|
1766
|
-
get writableHighWaterMark() {
|
|
1767
|
-
return this._writable.writableHighWaterMark;
|
|
1768
|
-
}
|
|
1769
|
-
get readableObjectMode() {
|
|
1770
|
-
return this._readable.readableObjectMode ?? this._readable.objectMode;
|
|
1771
|
-
}
|
|
1772
|
-
get readableFlowing() {
|
|
1773
|
-
return this._readable.readableFlowing;
|
|
1774
|
-
}
|
|
1775
|
-
get destroyed() {
|
|
1776
|
-
return this._destroyed;
|
|
1777
|
-
}
|
|
1778
|
-
/**
|
|
1779
|
-
* Async iterator support
|
|
1780
|
-
*/
|
|
1781
|
-
async *[Symbol.asyncIterator]() {
|
|
1782
|
-
// If auto-consume is running, wait for it to finish and use its buffer
|
|
1783
|
-
if (this._autoConsumePromise) {
|
|
1784
|
-
await this._autoConsumePromise;
|
|
1785
|
-
// Yield all buffered data
|
|
1786
|
-
while (this._autoConsumedBufferIndex < this._autoConsumedBuffer.length) {
|
|
1787
|
-
yield this._autoConsumedBuffer[this._autoConsumedBufferIndex++];
|
|
1788
|
-
}
|
|
1789
|
-
// Reset when drained to avoid prefix growth
|
|
1790
|
-
this._autoConsumedBuffer.length = 0;
|
|
1791
|
-
this._autoConsumedBufferIndex = 0;
|
|
1792
|
-
return;
|
|
1793
|
-
}
|
|
1794
|
-
// Otherwise delegate to readable's iterator
|
|
1795
|
-
yield* this._readable[Symbol.asyncIterator]();
|
|
1796
|
-
}
|
|
1797
|
-
// =========================================================================
|
|
1798
|
-
// Static Methods (Node.js compatibility)
|
|
1799
|
-
// =========================================================================
|
|
1800
|
-
/**
|
|
1801
|
-
* Convert a Web TransformStream to Node.js Transform
|
|
1802
|
-
*/
|
|
1803
|
-
static fromWeb(webStream, options) {
|
|
1804
|
-
const transform = new Transform(options);
|
|
1805
|
-
// Connect the web stream - set the internal _stream property
|
|
1806
|
-
transform._stream = webStream;
|
|
1807
|
-
// Replace internal streams with the ones from the web stream
|
|
1808
|
-
const newReadable = Readable.fromWeb(webStream.readable, { objectMode: options?.objectMode });
|
|
1809
|
-
const newWritable = Writable.fromWeb(webStream.writable, { objectMode: options?.objectMode });
|
|
1810
|
-
// Remove old event listeners before replacing
|
|
1811
|
-
transform._readable.removeAllListeners();
|
|
1812
|
-
transform._writable.removeAllListeners();
|
|
1813
|
-
transform._readable = newReadable;
|
|
1814
|
-
transform._writable = newWritable;
|
|
1815
|
-
// Re-connect event forwarding
|
|
1816
|
-
newReadable.on("data", (data) => transform.emit("data", data));
|
|
1817
|
-
newReadable.on("end", () => transform.emit("end"));
|
|
1818
|
-
newReadable.on("error", (err) => transform.emit("error", err));
|
|
1819
|
-
newWritable.on("finish", () => transform.emit("finish"));
|
|
1820
|
-
newWritable.on("drain", () => transform.emit("drain"));
|
|
1821
|
-
newWritable.on("error", (err) => transform.emit("error", err));
|
|
1822
|
-
return transform;
|
|
1823
|
-
}
|
|
1824
|
-
/**
|
|
1825
|
-
* Convert a Node.js Transform to Web TransformStream
|
|
1826
|
-
*/
|
|
1827
|
-
static toWeb(nodeStream) {
|
|
1828
|
-
return nodeStream.webStream;
|
|
1829
|
-
}
|
|
1830
|
-
// =========================================================================
|
|
1831
|
-
// Base Class Methods (for subclass override detection)
|
|
1832
|
-
// =========================================================================
|
|
1833
|
-
/**
|
|
1834
|
-
* Base transform method - can be overridden by subclasses.
|
|
1835
|
-
* Default behavior: pass through chunk unchanged.
|
|
1836
|
-
*/
|
|
1837
|
-
_transform(chunk, encoding, callback) {
|
|
1838
|
-
// Default: pass through unchanged
|
|
1839
|
-
callback(null, chunk);
|
|
1840
|
-
}
|
|
1841
|
-
/**
|
|
1842
|
-
* Base flush method - can be overridden by subclasses.
|
|
1843
|
-
* Called when the stream ends to allow final processing.
|
|
1844
|
-
*/
|
|
1845
|
-
_flush(callback) {
|
|
1846
|
-
// Default: no-op
|
|
1847
|
-
callback();
|
|
1848
|
-
}
|
|
1849
|
-
}
|
|
1850
|
-
exports.Transform = Transform;
|
|
1851
|
-
// =============================================================================
|
|
1852
|
-
// Duplex Stream
|
|
1853
|
-
// =============================================================================
|
|
1854
|
-
/**
|
|
1855
|
-
* A duplex stream that combines readable and writable
|
|
1856
|
-
*/
|
|
1857
|
-
class Duplex extends event_emitter_1.EventEmitter {
|
|
1858
|
-
/**
|
|
1859
|
-
* Create a Duplex stream from various sources
|
|
1860
|
-
*/
|
|
1861
|
-
static from(source) {
|
|
1862
|
-
// If it's already a Duplex, return as-is
|
|
1863
|
-
if (source instanceof Duplex) {
|
|
1864
|
-
return source;
|
|
1865
|
-
}
|
|
1866
|
-
const forwardReadableToDuplex = (readable, duplex) => {
|
|
1867
|
-
const sink = new Writable({
|
|
1868
|
-
objectMode: duplex.readableObjectMode,
|
|
1869
|
-
write(chunk, _encoding, callback) {
|
|
1870
|
-
duplex.push(chunk);
|
|
1871
|
-
callback();
|
|
1872
|
-
},
|
|
1873
|
-
final(callback) {
|
|
1874
|
-
duplex.push(null);
|
|
1875
|
-
callback();
|
|
1876
|
-
}
|
|
1877
|
-
});
|
|
1878
|
-
readable.on("error", err => duplex.emit("error", err));
|
|
1879
|
-
readable.pipe(sink);
|
|
1880
|
-
};
|
|
1881
|
-
// If it has readable and/or writable properties
|
|
1882
|
-
if (typeof source === "object" &&
|
|
1883
|
-
source !== null &&
|
|
1884
|
-
"readable" in source &&
|
|
1885
|
-
"writable" in source) {
|
|
1886
|
-
const duplex = new Duplex();
|
|
1887
|
-
const pair = source;
|
|
1888
|
-
if (pair.readable) {
|
|
1889
|
-
forwardReadableToDuplex(pair.readable, duplex);
|
|
1890
|
-
}
|
|
1891
|
-
if (pair.writable) {
|
|
1892
|
-
return new Duplex({
|
|
1893
|
-
objectMode: duplex.writableObjectMode,
|
|
1894
|
-
write(chunk, encoding, callback) {
|
|
1895
|
-
pair.writable.write(chunk, encoding, callback);
|
|
1896
|
-
},
|
|
1897
|
-
final(callback) {
|
|
1898
|
-
pair.writable.end(callback);
|
|
1899
|
-
}
|
|
1900
|
-
});
|
|
1901
|
-
}
|
|
1902
|
-
return duplex;
|
|
1903
|
-
}
|
|
1904
|
-
// If it's an iterable
|
|
1905
|
-
if (typeof source === "object" &&
|
|
1906
|
-
source !== null &&
|
|
1907
|
-
(Symbol.asyncIterator in source || Symbol.iterator in source)) {
|
|
1908
|
-
const readable = Readable.from(source);
|
|
1909
|
-
const duplex = new Duplex();
|
|
1910
|
-
forwardReadableToDuplex(readable, duplex);
|
|
1911
|
-
return duplex;
|
|
1912
|
-
}
|
|
1913
|
-
// If it's a Readable
|
|
1914
|
-
if (source instanceof Readable) {
|
|
1915
|
-
const duplex = new Duplex();
|
|
1916
|
-
forwardReadableToDuplex(source, duplex);
|
|
1917
|
-
return duplex;
|
|
1918
|
-
}
|
|
1919
|
-
// If it's a Writable
|
|
1920
|
-
if (source instanceof Writable) {
|
|
1921
|
-
return new Duplex({
|
|
1922
|
-
objectMode: true,
|
|
1923
|
-
write(chunk, encoding, callback) {
|
|
1924
|
-
source.write(chunk, encoding, callback);
|
|
1925
|
-
},
|
|
1926
|
-
final(callback) {
|
|
1927
|
-
source.end(callback);
|
|
1928
|
-
}
|
|
1929
|
-
});
|
|
1930
|
-
}
|
|
1931
|
-
throw new Error("Duplex.from: unsupported source type");
|
|
1932
|
-
}
|
|
1933
|
-
/**
|
|
1934
|
-
* Create a Duplex from a Web ReadableWritablePair
|
|
1935
|
-
*/
|
|
1936
|
-
static fromWeb(pair, options) {
|
|
1937
|
-
const duplex = new Duplex(options);
|
|
1938
|
-
// Replace internal streams
|
|
1939
|
-
duplex._readable = new Readable({ stream: pair.readable });
|
|
1940
|
-
duplex._writable = new Writable({ stream: pair.writable });
|
|
1941
|
-
return duplex;
|
|
1942
|
-
}
|
|
1943
|
-
/**
|
|
1944
|
-
* Convert a Node.js Duplex to Web ReadableWritablePair
|
|
1945
|
-
*/
|
|
1946
|
-
static toWeb(duplex) {
|
|
1947
|
-
return {
|
|
1948
|
-
readable: duplex._readable.webStream,
|
|
1949
|
-
writable: duplex._writable.webStream
|
|
1950
|
-
};
|
|
1951
|
-
}
|
|
1952
|
-
constructor(options) {
|
|
1953
|
-
super();
|
|
1954
|
-
// Track if we've already set up data forwarding
|
|
1955
|
-
this._dataForwardingSetup = false;
|
|
1956
|
-
this.allowHalfOpen = options?.allowHalfOpen ?? true;
|
|
1957
|
-
// Support shorthand objectMode option
|
|
1958
|
-
const objectMode = options?.objectMode ?? false;
|
|
1959
|
-
this.readableObjectMode = options?.readableObjectMode ?? objectMode;
|
|
1960
|
-
this.writableObjectMode = options?.writableObjectMode ?? objectMode;
|
|
1961
|
-
this._readable = new Readable({
|
|
1962
|
-
highWaterMark: options?.readableHighWaterMark,
|
|
1963
|
-
objectMode: this.readableObjectMode,
|
|
1964
|
-
read: options?.read?.bind(this)
|
|
1965
|
-
});
|
|
1966
|
-
this._writable = new Writable({
|
|
1967
|
-
highWaterMark: options?.writableHighWaterMark,
|
|
1968
|
-
objectMode: this.writableObjectMode,
|
|
1969
|
-
write: options?.write?.bind(this),
|
|
1970
|
-
final: options?.final?.bind(this)
|
|
1971
|
-
});
|
|
1972
|
-
// Forward non-data events (data forwarding is lazy to avoid premature flowing)
|
|
1973
|
-
this._readable.on("end", () => {
|
|
1974
|
-
this.emit("end");
|
|
1975
|
-
// If not allowHalfOpen, end the writable side too
|
|
1976
|
-
if (!this.allowHalfOpen) {
|
|
1977
|
-
this._writable.end();
|
|
1978
|
-
}
|
|
1979
|
-
});
|
|
1980
|
-
this._readable.on("error", err => this.emit("error", err));
|
|
1981
|
-
this._writable.on("finish", () => this.emit("finish"));
|
|
1982
|
-
this._writable.on("drain", () => this.emit("drain"));
|
|
1983
|
-
this._writable.on("close", () => {
|
|
1984
|
-
// If not allowHalfOpen, destroy the readable side too
|
|
1985
|
-
if (!this.allowHalfOpen && !this._readable.destroyed) {
|
|
1986
|
-
this._readable.destroy();
|
|
1987
|
-
}
|
|
1988
|
-
});
|
|
1989
|
-
}
|
|
1990
|
-
/**
|
|
1991
|
-
* Override on() to set up data forwarding lazily
|
|
1992
|
-
*/
|
|
1993
|
-
on(event, listener) {
|
|
1994
|
-
// Set up data forwarding when first external data listener is added
|
|
1995
|
-
if (event === "data" && !this._dataForwardingSetup) {
|
|
1996
|
-
this._dataForwardingSetup = true;
|
|
1997
|
-
this._readable.on("data", chunk => this.emit("data", chunk));
|
|
1998
|
-
}
|
|
1999
|
-
return super.on(event, listener);
|
|
2000
|
-
}
|
|
2001
|
-
/**
|
|
2002
|
-
* Push data to readable side
|
|
2003
|
-
*/
|
|
2004
|
-
push(chunk) {
|
|
2005
|
-
return this._readable.push(chunk);
|
|
2006
|
-
}
|
|
2007
|
-
/**
|
|
2008
|
-
* Put a chunk back at the front of the buffer (readable side)
|
|
2009
|
-
*/
|
|
2010
|
-
unshift(chunk) {
|
|
2011
|
-
this._readable.unshift(chunk);
|
|
2012
|
-
}
|
|
2013
|
-
/**
|
|
2014
|
-
* Read from readable side
|
|
2015
|
-
*/
|
|
2016
|
-
read(size) {
|
|
2017
|
-
return this._readable.read(size);
|
|
2018
|
-
}
|
|
2019
|
-
write(chunk, encodingOrCallback, callback) {
|
|
2020
|
-
const cb = typeof encodingOrCallback === "function" ? encodingOrCallback : callback;
|
|
2021
|
-
return this._writable.write(chunk, cb);
|
|
2022
|
-
}
|
|
2023
|
-
end(chunkOrCallback, encodingOrCallback, callback) {
|
|
2024
|
-
const chunk = typeof chunkOrCallback === "function" ? undefined : chunkOrCallback;
|
|
2025
|
-
const cb = typeof chunkOrCallback === "function"
|
|
2026
|
-
? chunkOrCallback
|
|
2027
|
-
: typeof encodingOrCallback === "function"
|
|
2028
|
-
? encodingOrCallback
|
|
2029
|
-
: callback;
|
|
2030
|
-
if (cb) {
|
|
2031
|
-
this.once("finish", cb);
|
|
2032
|
-
}
|
|
2033
|
-
if (chunk !== undefined) {
|
|
2034
|
-
this._writable.write(chunk);
|
|
2035
|
-
}
|
|
2036
|
-
this._writable.end();
|
|
2037
|
-
return this;
|
|
2038
|
-
}
|
|
2039
|
-
/**
|
|
2040
|
-
* Cork the writable side
|
|
2041
|
-
*/
|
|
2042
|
-
cork() {
|
|
2043
|
-
this._writable.cork();
|
|
2044
|
-
}
|
|
2045
|
-
/**
|
|
2046
|
-
* Uncork the writable side
|
|
2047
|
-
*/
|
|
2048
|
-
uncork() {
|
|
2049
|
-
this._writable.uncork();
|
|
2050
|
-
}
|
|
2051
|
-
/**
|
|
2052
|
-
* Set encoding for readable side
|
|
2053
|
-
*/
|
|
2054
|
-
setEncoding(encoding) {
|
|
2055
|
-
this._readable.setEncoding(encoding);
|
|
2056
|
-
return this;
|
|
2057
|
-
}
|
|
2058
|
-
/**
|
|
2059
|
-
* Set default encoding for writable side
|
|
2060
|
-
*/
|
|
2061
|
-
setDefaultEncoding(encoding) {
|
|
2062
|
-
this._writable.setDefaultEncoding(encoding);
|
|
2063
|
-
return this;
|
|
2064
|
-
}
|
|
2065
|
-
/**
|
|
2066
|
-
* Pipe readable side to destination
|
|
2067
|
-
*/
|
|
2068
|
-
pipe(destination) {
|
|
2069
|
-
if (destination instanceof Transform) {
|
|
2070
|
-
this._readable.pipe(destination._writable);
|
|
2071
|
-
return destination;
|
|
2072
|
-
}
|
|
2073
|
-
this._readable.pipe(destination);
|
|
2074
|
-
return destination;
|
|
2075
|
-
}
|
|
2076
|
-
/**
|
|
2077
|
-
* Unpipe from destination
|
|
2078
|
-
*/
|
|
2079
|
-
unpipe(destination) {
|
|
2080
|
-
this._readable.unpipe(destination);
|
|
2081
|
-
return this;
|
|
2082
|
-
}
|
|
2083
|
-
/**
|
|
2084
|
-
* Pause the readable side
|
|
2085
|
-
*/
|
|
2086
|
-
pause() {
|
|
2087
|
-
this._readable.pause();
|
|
2088
|
-
return this;
|
|
2089
|
-
}
|
|
2090
|
-
/**
|
|
2091
|
-
* Resume the readable side
|
|
2092
|
-
*/
|
|
2093
|
-
resume() {
|
|
2094
|
-
this._readable.resume();
|
|
2095
|
-
return this;
|
|
2096
|
-
}
|
|
2097
|
-
/**
|
|
2098
|
-
* Check if paused
|
|
2099
|
-
*/
|
|
2100
|
-
isPaused() {
|
|
2101
|
-
return this._readable.isPaused();
|
|
2102
|
-
}
|
|
2103
|
-
/**
|
|
2104
|
-
* Destroy both sides
|
|
2105
|
-
*/
|
|
2106
|
-
destroy(error) {
|
|
2107
|
-
this._readable.destroy(error);
|
|
2108
|
-
this._writable.destroy(error);
|
|
2109
|
-
return this;
|
|
2110
|
-
}
|
|
2111
|
-
get readable() {
|
|
2112
|
-
return this._readable.readable;
|
|
2113
|
-
}
|
|
2114
|
-
get writable() {
|
|
2115
|
-
return this._writable.writable;
|
|
2116
|
-
}
|
|
2117
|
-
get readableEnded() {
|
|
2118
|
-
return this._readable.readableEnded;
|
|
2119
|
-
}
|
|
2120
|
-
get writableEnded() {
|
|
2121
|
-
return this._writable.writableEnded;
|
|
2122
|
-
}
|
|
2123
|
-
get writableFinished() {
|
|
2124
|
-
return this._writable.writableFinished;
|
|
2125
|
-
}
|
|
2126
|
-
get readableLength() {
|
|
2127
|
-
return this._readable.readableLength;
|
|
2128
|
-
}
|
|
2129
|
-
get writableLength() {
|
|
2130
|
-
return this._writable.writableLength;
|
|
2131
|
-
}
|
|
2132
|
-
get readableHighWaterMark() {
|
|
2133
|
-
return this._readable.readableHighWaterMark;
|
|
2134
|
-
}
|
|
2135
|
-
get writableHighWaterMark() {
|
|
2136
|
-
return this._writable.writableHighWaterMark;
|
|
2137
|
-
}
|
|
2138
|
-
get destroyed() {
|
|
2139
|
-
return this._readable.destroyed && this._writable.destroyed;
|
|
2140
|
-
}
|
|
2141
|
-
get writableCorked() {
|
|
2142
|
-
return this._writable.writableCorked;
|
|
2143
|
-
}
|
|
2144
|
-
get writableNeedDrain() {
|
|
2145
|
-
return this._writable.writableNeedDrain;
|
|
2146
|
-
}
|
|
2147
|
-
/**
|
|
2148
|
-
* Async iterator support
|
|
2149
|
-
*/
|
|
2150
|
-
[Symbol.asyncIterator]() {
|
|
2151
|
-
return this._readable[Symbol.asyncIterator]();
|
|
2152
|
-
}
|
|
2153
|
-
}
|
|
2154
|
-
exports.Duplex = Duplex;
|
|
2155
|
-
// =============================================================================
|
|
2156
|
-
// PassThrough Stream
|
|
2157
|
-
// =============================================================================
|
|
2158
|
-
/**
|
|
2159
|
-
* A passthrough stream that passes data through unchanged
|
|
2160
|
-
*/
|
|
2161
|
-
class PassThrough extends Transform {
|
|
2162
|
-
constructor(options) {
|
|
2163
|
-
super({
|
|
2164
|
-
...options,
|
|
2165
|
-
transform: chunk => chunk
|
|
2166
|
-
});
|
|
2167
|
-
}
|
|
2168
|
-
}
|
|
2169
|
-
exports.PassThrough = PassThrough;
|
|
2170
|
-
// =============================================================================
|
|
2171
|
-
// Collector Stream
|
|
2172
|
-
// =============================================================================
|
|
2173
|
-
/**
|
|
2174
|
-
* A writable stream that collects all chunks
|
|
2175
|
-
*/
|
|
2176
|
-
class Collector extends Writable {
|
|
2177
|
-
constructor(options) {
|
|
2178
|
-
const collectedChunks = [];
|
|
2179
|
-
super({
|
|
2180
|
-
...options,
|
|
2181
|
-
stream: new WritableStream({
|
|
2182
|
-
write: chunk => {
|
|
2183
|
-
collectedChunks.push(chunk);
|
|
2184
|
-
},
|
|
2185
|
-
close: () => {
|
|
2186
|
-
// Finished
|
|
2187
|
-
}
|
|
2188
|
-
})
|
|
2189
|
-
});
|
|
2190
|
-
this.chunks = [];
|
|
2191
|
-
this.chunks = collectedChunks;
|
|
2192
|
-
}
|
|
2193
|
-
write(chunk, encodingOrCallback, callback) {
|
|
2194
|
-
if (this.writableEnded || this.writableFinished) {
|
|
2195
|
-
const err = new Error("write after end");
|
|
2196
|
-
this.emit("error", err);
|
|
2197
|
-
return false;
|
|
2198
|
-
}
|
|
2199
|
-
const cb = typeof encodingOrCallback === "function" ? encodingOrCallback : callback;
|
|
2200
|
-
// Synchronously push to chunks
|
|
2201
|
-
this.chunks.push(chunk);
|
|
2202
|
-
cb?.(null);
|
|
2203
|
-
return true;
|
|
2204
|
-
}
|
|
2205
|
-
/**
|
|
2206
|
-
* Get all collected data as a single Uint8Array (for binary mode)
|
|
2207
|
-
*/
|
|
2208
|
-
toUint8Array() {
|
|
2209
|
-
const chunks = this.chunks;
|
|
2210
|
-
const len = chunks.length;
|
|
2211
|
-
if (len === 0) {
|
|
2212
|
-
return new Uint8Array(0);
|
|
2213
|
-
}
|
|
2214
|
-
if (len === 1 && chunks[0] instanceof Uint8Array) {
|
|
2215
|
-
return chunks[0];
|
|
2216
|
-
}
|
|
2217
|
-
// If chunks are Uint8Arrays, concatenate them
|
|
2218
|
-
if (chunks[0] instanceof Uint8Array) {
|
|
2219
|
-
return (0, shared_1.concatUint8Arrays)(chunks);
|
|
2220
|
-
}
|
|
2221
|
-
throw new Error("Collector contains non-binary data");
|
|
2222
|
-
}
|
|
2223
|
-
/**
|
|
2224
|
-
* Get all collected data as a string
|
|
2225
|
-
*/
|
|
2226
|
-
toString() {
|
|
2227
|
-
const chunks = this.chunks;
|
|
2228
|
-
const len = chunks.length;
|
|
2229
|
-
if (len === 0) {
|
|
2230
|
-
return "";
|
|
2231
|
-
}
|
|
2232
|
-
const first = chunks[0];
|
|
2233
|
-
if (typeof first === "string") {
|
|
2234
|
-
if (len === 1) {
|
|
2235
|
-
return first;
|
|
2236
|
-
}
|
|
2237
|
-
return chunks.join("");
|
|
2238
|
-
}
|
|
2239
|
-
return shared_1.textDecoder.decode(this.toUint8Array());
|
|
2240
|
-
}
|
|
2241
|
-
get isFinished() {
|
|
2242
|
-
// Use inherited writable property
|
|
2243
|
-
return this.writableFinished;
|
|
2244
|
-
}
|
|
2245
|
-
}
|
|
2246
|
-
exports.Collector = Collector;
|
|
2247
|
-
// =============================================================================
|
|
2248
|
-
// PullStream / BufferedStream / DataChunk helpers
|
|
2249
|
-
// =============================================================================
|
|
2250
|
-
class PullStream extends pull_stream_1.PullStream {
|
|
2251
|
-
// Keep constructor signature aligned with streams.browser.ts public API
|
|
2252
|
-
constructor(options) {
|
|
2253
|
-
super(options);
|
|
2254
|
-
}
|
|
2255
|
-
}
|
|
2256
|
-
exports.PullStream = PullStream;
|
|
2257
|
-
class StringChunk extends buffered_stream_1.StringChunk {
|
|
2258
|
-
}
|
|
2259
|
-
exports.StringChunk = StringChunk;
|
|
2260
|
-
class BufferChunk extends buffered_stream_1.BufferChunk {
|
|
2261
|
-
}
|
|
2262
|
-
exports.BufferChunk = BufferChunk;
|
|
2263
|
-
class BufferedStream extends buffered_stream_1.BufferedStream {
|
|
2264
|
-
constructor(options) {
|
|
2265
|
-
super(options);
|
|
2266
|
-
}
|
|
2267
|
-
}
|
|
2268
|
-
exports.BufferedStream = BufferedStream;
|
|
2269
|
-
// =============================================================================
|
|
2270
|
-
// Stream Creation Functions
|
|
2271
|
-
// =============================================================================
|
|
2272
|
-
/**
|
|
2273
|
-
* Create a readable stream with custom read implementation
|
|
2274
|
-
*/
|
|
2275
|
-
function createReadable(options) {
|
|
2276
|
-
const readable = new Readable(options);
|
|
2277
|
-
// Override read behavior if provided
|
|
2278
|
-
if (options?.read) {
|
|
2279
|
-
const originalRead = readable.read.bind(readable);
|
|
2280
|
-
readable.read = function (size) {
|
|
2281
|
-
options.read(size ?? 16384);
|
|
2282
|
-
return originalRead(size);
|
|
2283
|
-
};
|
|
2284
|
-
}
|
|
2285
|
-
return readable;
|
|
2286
|
-
}
|
|
2287
|
-
/**
|
|
2288
|
-
* Create a readable stream from an async iterable
|
|
2289
|
-
*/
|
|
2290
|
-
function createReadableFromAsyncIterable(iterable, options) {
|
|
2291
|
-
const readable = new Readable({ ...options, objectMode: options?.objectMode ?? true });
|
|
2292
|
-
(async () => {
|
|
2293
|
-
try {
|
|
2294
|
-
for await (const chunk of iterable) {
|
|
2295
|
-
if (!readable.push(chunk)) {
|
|
2296
|
-
// Backpressure - wait a bit
|
|
2297
|
-
await new Promise(resolve => setTimeout(resolve, 0));
|
|
2298
|
-
}
|
|
2299
|
-
}
|
|
2300
|
-
readable.push(null);
|
|
2301
|
-
}
|
|
2302
|
-
catch (err) {
|
|
2303
|
-
readable.destroy(err);
|
|
2304
|
-
}
|
|
2305
|
-
})();
|
|
2306
|
-
return readable;
|
|
2307
|
-
}
|
|
2308
|
-
/**
|
|
2309
|
-
* Create a readable stream from an array
|
|
2310
|
-
*/
|
|
2311
|
-
function createReadableFromArray(data, options) {
|
|
2312
|
-
let index = 0;
|
|
2313
|
-
const readable = new Readable({
|
|
2314
|
-
...options,
|
|
2315
|
-
objectMode: options?.objectMode ?? true,
|
|
2316
|
-
read() {
|
|
2317
|
-
// Push data when read is called
|
|
2318
|
-
while (index < data.length) {
|
|
2319
|
-
if (!this.push(data[index++])) {
|
|
2320
|
-
// Backpressure - wait for next read
|
|
2321
|
-
return;
|
|
2322
|
-
}
|
|
2323
|
-
}
|
|
2324
|
-
// All data pushed, end the stream
|
|
2325
|
-
this.push(null);
|
|
2326
|
-
}
|
|
2327
|
-
});
|
|
2328
|
-
return readable;
|
|
2329
|
-
}
|
|
2330
|
-
/**
|
|
2331
|
-
* Create a writable stream with custom write implementation
|
|
2332
|
-
*/
|
|
2333
|
-
function createWritable(options) {
|
|
2334
|
-
// Create a custom WritableStream with user's handlers
|
|
2335
|
-
const stream = new WritableStream({
|
|
2336
|
-
write: async (chunk) => {
|
|
2337
|
-
if (options?.write) {
|
|
2338
|
-
return new Promise((resolve, reject) => {
|
|
2339
|
-
options.write(chunk, "utf8", err => {
|
|
2340
|
-
if (err) {
|
|
2341
|
-
reject(err);
|
|
2342
|
-
}
|
|
2343
|
-
else {
|
|
2344
|
-
resolve();
|
|
2345
|
-
}
|
|
2346
|
-
});
|
|
2347
|
-
});
|
|
2348
|
-
}
|
|
2349
|
-
},
|
|
2350
|
-
close: async () => {
|
|
2351
|
-
if (options?.final) {
|
|
2352
|
-
return new Promise((resolve, reject) => {
|
|
2353
|
-
options.final(err => {
|
|
2354
|
-
if (err) {
|
|
2355
|
-
reject(err);
|
|
2356
|
-
}
|
|
2357
|
-
else {
|
|
2358
|
-
resolve();
|
|
2359
|
-
}
|
|
2360
|
-
});
|
|
2361
|
-
});
|
|
2362
|
-
}
|
|
2363
|
-
}
|
|
2364
|
-
});
|
|
2365
|
-
return new Writable({ ...options, stream });
|
|
2366
|
-
}
|
|
2367
|
-
/**
|
|
2368
|
-
* Create a transform stream from a transform function
|
|
2369
|
-
*/
|
|
2370
|
-
function createTransform(transformFn, options) {
|
|
2371
|
-
return new Transform({
|
|
2372
|
-
...options,
|
|
2373
|
-
transform: transformFn,
|
|
2374
|
-
flush: options?.flush
|
|
2375
|
-
});
|
|
2376
|
-
}
|
|
2377
|
-
/**
|
|
2378
|
-
* Create a collector stream
|
|
2379
|
-
*/
|
|
2380
|
-
function createCollector(options) {
|
|
2381
|
-
return new Collector(options);
|
|
2382
|
-
}
|
|
2383
|
-
/**
|
|
2384
|
-
* Create a passthrough stream
|
|
2385
|
-
*/
|
|
2386
|
-
function createPassThrough(options) {
|
|
2387
|
-
return new PassThrough(options);
|
|
2388
|
-
}
|
|
2389
|
-
/**
|
|
2390
|
-
* Create a pull stream
|
|
2391
|
-
*/
|
|
2392
|
-
function createPullStream(options) {
|
|
2393
|
-
return new PullStream(options);
|
|
2394
|
-
}
|
|
2395
|
-
/**
|
|
2396
|
-
* Create a buffered stream
|
|
2397
|
-
*/
|
|
2398
|
-
function createBufferedStream(options) {
|
|
2399
|
-
return new BufferedStream(options);
|
|
2400
|
-
}
|
|
2401
|
-
const isReadableStream = (value) => !!value && typeof value === "object" && typeof value.getReader === "function";
|
|
2402
|
-
const isAsyncIterable = (value) => {
|
|
2403
|
-
if (!value || (typeof value !== "object" && typeof value !== "function")) {
|
|
2404
|
-
return false;
|
|
2405
|
-
}
|
|
2406
|
-
return typeof value[Symbol.asyncIterator] === "function";
|
|
2407
|
-
};
|
|
2408
|
-
const isWritableStream = (value) => !!value && typeof value === "object" && typeof value.getWriter === "function";
|
|
2409
|
-
const isTransformStream = (value) => !!value &&
|
|
2410
|
-
typeof value === "object" &&
|
|
2411
|
-
!!value.readable &&
|
|
2412
|
-
!!value.writable &&
|
|
2413
|
-
isReadableStream(value.readable) &&
|
|
2414
|
-
isWritableStream(value.writable);
|
|
2415
|
-
const isPipelineOptions = (value) => {
|
|
2416
|
-
if (!value || typeof value !== "object") {
|
|
2417
|
-
return false;
|
|
2418
|
-
}
|
|
2419
|
-
// IMPORTANT:
|
|
2420
|
-
// Do NOT use `"end" in obj` here because streams have `.end()` and would be
|
|
2421
|
-
// misclassified as options, breaking argument parsing and potentially hanging.
|
|
2422
|
-
if (typeof value.pipe === "function" ||
|
|
2423
|
-
typeof value.write === "function" ||
|
|
2424
|
-
typeof value.end === "function" ||
|
|
2425
|
-
typeof value.getReader === "function" ||
|
|
2426
|
-
typeof value.getWriter === "function") {
|
|
2427
|
-
return false;
|
|
2428
|
-
}
|
|
2429
|
-
return (Object.prototype.hasOwnProperty.call(value, "signal") ||
|
|
2430
|
-
Object.prototype.hasOwnProperty.call(value, "end"));
|
|
2431
|
-
};
|
|
2432
|
-
const toBrowserPipelineStream = (stream) => {
|
|
2433
|
-
if (stream instanceof Readable ||
|
|
2434
|
-
stream instanceof Writable ||
|
|
2435
|
-
stream instanceof Transform ||
|
|
2436
|
-
stream instanceof Duplex) {
|
|
2437
|
-
return stream;
|
|
2438
|
-
}
|
|
2439
|
-
if (isTransformStream(stream)) {
|
|
2440
|
-
return Transform.fromWeb(stream);
|
|
2441
|
-
}
|
|
2442
|
-
if (isReadableStream(stream)) {
|
|
2443
|
-
return Readable.fromWeb(stream);
|
|
2444
|
-
}
|
|
2445
|
-
if (isWritableStream(stream)) {
|
|
2446
|
-
return Writable.fromWeb(stream);
|
|
2447
|
-
}
|
|
2448
|
-
return stream;
|
|
2449
|
-
};
|
|
2450
|
-
/**
|
|
2451
|
-
* Pipeline streams together with proper error handling and cleanup.
|
|
2452
|
-
* Supports both callback and promise-based usage like Node.js.
|
|
2453
|
-
*
|
|
2454
|
-
* @example
|
|
2455
|
-
* // Promise usage
|
|
2456
|
-
* await pipeline(source, transform, destination);
|
|
2457
|
-
*
|
|
2458
|
-
* @example
|
|
2459
|
-
* // With options
|
|
2460
|
-
* await pipeline(source, transform, destination, { signal: controller.signal });
|
|
2461
|
-
*
|
|
2462
|
-
* @example
|
|
2463
|
-
* // Callback usage
|
|
2464
|
-
* pipeline(source, transform, destination, (err) => {
|
|
2465
|
-
* if (err) console.error('Pipeline failed', err);
|
|
2466
|
-
* });
|
|
2467
|
-
*/
|
|
2468
|
-
function pipeline(...args) {
|
|
2469
|
-
// Parse arguments
|
|
2470
|
-
let streams;
|
|
2471
|
-
let options = {};
|
|
2472
|
-
let callback;
|
|
2473
|
-
const lastArg = args[args.length - 1];
|
|
2474
|
-
if (typeof lastArg === "function") {
|
|
2475
|
-
// Callback style: pipeline(s1, s2, s3, callback)
|
|
2476
|
-
callback = lastArg;
|
|
2477
|
-
streams = args.slice(0, -1);
|
|
2478
|
-
}
|
|
2479
|
-
else if (isPipelineOptions(lastArg)) {
|
|
2480
|
-
// Options style: pipeline(s1, s2, s3, { signal })
|
|
2481
|
-
options = lastArg;
|
|
2482
|
-
streams = args.slice(0, -1);
|
|
2483
|
-
}
|
|
2484
|
-
else {
|
|
2485
|
-
// No callback or options: pipeline(s1, s2, s3)
|
|
2486
|
-
streams = args;
|
|
2487
|
-
}
|
|
2488
|
-
const promise = new Promise((resolve, reject) => {
|
|
2489
|
-
if (streams.length < 2) {
|
|
2490
|
-
const err = new Error("Pipeline requires at least 2 streams");
|
|
2491
|
-
reject(err);
|
|
2492
|
-
return;
|
|
2493
|
-
}
|
|
2494
|
-
const normalized = streams.map(toBrowserPipelineStream);
|
|
2495
|
-
const source = normalized[0];
|
|
2496
|
-
const destination = normalized[normalized.length - 1];
|
|
2497
|
-
const transforms = normalized.slice(1, -1);
|
|
2498
|
-
let completed = false;
|
|
2499
|
-
const allStreams = [source, ...transforms, destination];
|
|
2500
|
-
const cleanup = (error) => {
|
|
2501
|
-
if (completed) {
|
|
2502
|
-
return;
|
|
2503
|
-
}
|
|
2504
|
-
completed = true;
|
|
2505
|
-
// Destroy all streams on error
|
|
2506
|
-
if (error) {
|
|
2507
|
-
for (const stream of allStreams) {
|
|
2508
|
-
if (typeof stream.destroy === "function") {
|
|
2509
|
-
stream.destroy(error);
|
|
2510
|
-
}
|
|
2511
|
-
}
|
|
2512
|
-
reject(error);
|
|
2513
|
-
}
|
|
2514
|
-
else {
|
|
2515
|
-
resolve();
|
|
2516
|
-
}
|
|
2517
|
-
};
|
|
2518
|
-
// Handle abort signal
|
|
2519
|
-
if (options.signal) {
|
|
2520
|
-
if (options.signal.aborted) {
|
|
2521
|
-
cleanup(new Error("Pipeline aborted"));
|
|
2522
|
-
return;
|
|
2523
|
-
}
|
|
2524
|
-
options.signal.addEventListener("abort", () => {
|
|
2525
|
-
cleanup(new Error("Pipeline aborted"));
|
|
2526
|
-
});
|
|
2527
|
-
}
|
|
2528
|
-
// Chain the streams
|
|
2529
|
-
let current = source;
|
|
2530
|
-
for (const transform of transforms) {
|
|
2531
|
-
current.pipe(transform);
|
|
2532
|
-
current = transform;
|
|
2533
|
-
}
|
|
2534
|
-
// Pipe to destination
|
|
2535
|
-
if (options.end !== false) {
|
|
2536
|
-
current.pipe(destination);
|
|
2537
|
-
}
|
|
2538
|
-
else {
|
|
2539
|
-
// Don't end destination
|
|
2540
|
-
current.on("data", chunk => destination.write(chunk));
|
|
2541
|
-
}
|
|
2542
|
-
// Handle completion
|
|
2543
|
-
destination.on("finish", () => cleanup());
|
|
2544
|
-
// Handle errors on all streams
|
|
2545
|
-
for (const stream of allStreams) {
|
|
2546
|
-
stream.on("error", (err) => cleanup(err));
|
|
2547
|
-
}
|
|
2548
|
-
});
|
|
2549
|
-
// If callback provided, use it
|
|
2550
|
-
if (callback) {
|
|
2551
|
-
promise.then(() => callback(null)).catch(err => callback(err));
|
|
2552
|
-
}
|
|
2553
|
-
return promise;
|
|
2554
|
-
}
|
|
2555
|
-
/**
|
|
2556
|
-
* Wait for a stream to finish, close, or error.
|
|
2557
|
-
* Node.js compatible with support for options and callbacks.
|
|
2558
|
-
*
|
|
2559
|
-
* @example
|
|
2560
|
-
* // Promise usage
|
|
2561
|
-
* await finished(stream);
|
|
2562
|
-
*
|
|
2563
|
-
* @example
|
|
2564
|
-
* // With options
|
|
2565
|
-
* await finished(stream, { readable: false }); // Only wait for writable side
|
|
2566
|
-
*
|
|
2567
|
-
* @example
|
|
2568
|
-
* // Callback usage
|
|
2569
|
-
* finished(stream, (err) => {
|
|
2570
|
-
* if (err) console.error('Stream error', err);
|
|
2571
|
-
* });
|
|
2572
|
-
*/
|
|
2573
|
-
function finished(stream, optionsOrCallback, callback) {
|
|
2574
|
-
let options = {};
|
|
2575
|
-
let cb;
|
|
2576
|
-
if (typeof optionsOrCallback === "function") {
|
|
2577
|
-
cb = optionsOrCallback;
|
|
2578
|
-
}
|
|
2579
|
-
else if (optionsOrCallback) {
|
|
2580
|
-
options = optionsOrCallback;
|
|
2581
|
-
cb = callback;
|
|
2582
|
-
}
|
|
2583
|
-
const promise = new Promise((resolve, reject) => {
|
|
2584
|
-
const normalizedStream = toBrowserPipelineStream(stream);
|
|
2585
|
-
let resolved = false;
|
|
2586
|
-
const done = (err) => {
|
|
2587
|
-
if (resolved) {
|
|
2588
|
-
return;
|
|
2589
|
-
}
|
|
2590
|
-
resolved = true;
|
|
2591
|
-
if (err && !options.error) {
|
|
2592
|
-
reject(err);
|
|
2593
|
-
}
|
|
2594
|
-
else {
|
|
2595
|
-
resolve();
|
|
2596
|
-
}
|
|
2597
|
-
};
|
|
2598
|
-
// Handle abort signal
|
|
2599
|
-
if (options.signal) {
|
|
2600
|
-
if (options.signal.aborted) {
|
|
2601
|
-
done(new Error("Aborted"));
|
|
2602
|
-
return;
|
|
2603
|
-
}
|
|
2604
|
-
options.signal.addEventListener("abort", () => {
|
|
2605
|
-
done(new Error("Aborted"));
|
|
2606
|
-
});
|
|
2607
|
-
}
|
|
2608
|
-
const checkReadable = options.readable !== false;
|
|
2609
|
-
const checkWritable = options.writable !== false;
|
|
2610
|
-
// Already finished?
|
|
2611
|
-
if (checkReadable && normalizedStream.readableEnded) {
|
|
2612
|
-
done();
|
|
2613
|
-
return;
|
|
2614
|
-
}
|
|
2615
|
-
if (checkWritable && normalizedStream.writableFinished) {
|
|
2616
|
-
done();
|
|
2617
|
-
return;
|
|
2618
|
-
}
|
|
2619
|
-
// Listen for events
|
|
2620
|
-
if (checkWritable) {
|
|
2621
|
-
normalizedStream.on("finish", () => done());
|
|
2622
|
-
}
|
|
2623
|
-
if (checkReadable) {
|
|
2624
|
-
normalizedStream.on("end", () => done());
|
|
2625
|
-
}
|
|
2626
|
-
normalizedStream.on("error", (err) => done(err));
|
|
2627
|
-
normalizedStream.on("close", () => done());
|
|
2628
|
-
});
|
|
2629
|
-
// If callback provided, use it
|
|
2630
|
-
if (cb) {
|
|
2631
|
-
promise.then(() => cb(null)).catch(err => cb(err));
|
|
2632
|
-
}
|
|
2633
|
-
return promise;
|
|
2634
|
-
}
|
|
2635
|
-
// =============================================================================
|
|
2636
|
-
// Utility Functions
|
|
2637
|
-
// =============================================================================
|
|
2638
|
-
/**
|
|
2639
|
-
* Convert a stream to a promise that resolves when finished
|
|
2640
|
-
*/
|
|
2641
|
-
async function streamToPromise(stream) {
|
|
2642
|
-
return finished(stream);
|
|
2643
|
-
}
|
|
2644
|
-
/**
|
|
2645
|
-
* Collect all data from a readable stream into a Uint8Array
|
|
2646
|
-
* (Browser equivalent of Node.js streamToBuffer)
|
|
2647
|
-
*/
|
|
2648
|
-
async function streamToUint8Array(stream) {
|
|
2649
|
-
let iterable;
|
|
2650
|
-
if (isReadableStream(stream)) {
|
|
2651
|
-
iterable = Readable.fromWeb(stream);
|
|
2652
|
-
}
|
|
2653
|
-
else if (isAsyncIterable(stream)) {
|
|
2654
|
-
iterable = stream;
|
|
2655
|
-
}
|
|
2656
|
-
else {
|
|
2657
|
-
throw new Error("streamToUint8Array: unsupported stream type");
|
|
2658
|
-
}
|
|
2659
|
-
const chunks = [];
|
|
2660
|
-
let totalLength = 0;
|
|
2661
|
-
for await (const chunk of iterable) {
|
|
2662
|
-
chunks.push(chunk);
|
|
2663
|
-
totalLength += chunk.length;
|
|
2664
|
-
}
|
|
2665
|
-
// Fast paths
|
|
2666
|
-
const len = chunks.length;
|
|
2667
|
-
if (len === 0) {
|
|
2668
|
-
return new Uint8Array(0);
|
|
2669
|
-
}
|
|
2670
|
-
if (len === 1) {
|
|
2671
|
-
return chunks[0];
|
|
2672
|
-
}
|
|
2673
|
-
// Use precalculated total length
|
|
2674
|
-
const result = new Uint8Array(totalLength);
|
|
2675
|
-
let offset = 0;
|
|
2676
|
-
for (let i = 0; i < len; i++) {
|
|
2677
|
-
result.set(chunks[i], offset);
|
|
2678
|
-
offset += chunks[i].length;
|
|
2679
|
-
}
|
|
2680
|
-
return result;
|
|
2681
|
-
}
|
|
2682
|
-
/**
|
|
2683
|
-
* Alias for streamToUint8Array (Node.js compatibility)
|
|
2684
|
-
*/
|
|
2685
|
-
exports.streamToBuffer = streamToUint8Array;
|
|
2686
|
-
/**
|
|
2687
|
-
* Collect all data from a readable stream into a string
|
|
2688
|
-
*/
|
|
2689
|
-
async function streamToString(stream, encoding) {
|
|
2690
|
-
const buffer = await streamToUint8Array(stream);
|
|
2691
|
-
return (0, shared_1.getTextDecoder)(encoding).decode(buffer);
|
|
2692
|
-
}
|
|
2693
|
-
/**
|
|
2694
|
-
* Drain a stream (consume all data without processing)
|
|
2695
|
-
*/
|
|
2696
|
-
async function drainStream(stream) {
|
|
2697
|
-
let iterable;
|
|
2698
|
-
if (isReadableStream(stream)) {
|
|
2699
|
-
iterable = Readable.fromWeb(stream);
|
|
2700
|
-
}
|
|
2701
|
-
else if (isAsyncIterable(stream)) {
|
|
2702
|
-
iterable = stream;
|
|
2703
|
-
}
|
|
2704
|
-
else {
|
|
2705
|
-
throw new Error("drainStream: unsupported stream type");
|
|
2706
|
-
}
|
|
2707
|
-
for await (const _chunk of iterable) {
|
|
2708
|
-
// Consume data
|
|
2709
|
-
}
|
|
2710
|
-
}
|
|
2711
|
-
/**
|
|
2712
|
-
* Copy from a readable stream to a writable stream
|
|
2713
|
-
*/
|
|
2714
|
-
async function copyStream(source, destination) {
|
|
2715
|
-
return pipeline(source, destination);
|
|
2716
|
-
}
|
|
2717
|
-
// =============================================================================
|
|
2718
|
-
// Type Guards
|
|
2719
|
-
// =============================================================================
|
|
2720
|
-
/**
|
|
2721
|
-
* Check if an object is a transform stream
|
|
2722
|
-
*/
|
|
2723
|
-
function isTransform(obj) {
|
|
2724
|
-
if (obj == null) {
|
|
2725
|
-
return false;
|
|
2726
|
-
}
|
|
2727
|
-
if (obj instanceof Transform) {
|
|
2728
|
-
return true;
|
|
2729
|
-
}
|
|
2730
|
-
const o = obj;
|
|
2731
|
-
return (typeof o.read === "function" &&
|
|
2732
|
-
typeof o.pipe === "function" &&
|
|
2733
|
-
typeof o.write === "function" &&
|
|
2734
|
-
typeof o.end === "function" &&
|
|
2735
|
-
typeof o._transform === "function");
|
|
2736
|
-
}
|
|
2737
|
-
/**
|
|
2738
|
-
* Check if an object is a duplex stream
|
|
2739
|
-
* Note: In Node.js, Transform extends Duplex, so Transform is also a Duplex
|
|
2740
|
-
*/
|
|
2741
|
-
function isDuplex(obj) {
|
|
2742
|
-
if (obj == null) {
|
|
2743
|
-
return false;
|
|
2744
|
-
}
|
|
2745
|
-
if (obj instanceof Duplex || obj instanceof Transform) {
|
|
2746
|
-
return true;
|
|
2747
|
-
}
|
|
2748
|
-
const o = obj;
|
|
2749
|
-
return (typeof o.read === "function" &&
|
|
2750
|
-
typeof o.pipe === "function" &&
|
|
2751
|
-
typeof o.write === "function" &&
|
|
2752
|
-
typeof o.end === "function");
|
|
2753
|
-
}
|
|
2754
|
-
/**
|
|
2755
|
-
* Check if an object is any kind of stream
|
|
2756
|
-
*/
|
|
2757
|
-
function isStream(obj) {
|
|
2758
|
-
if (obj == null) {
|
|
2759
|
-
return false;
|
|
2760
|
-
}
|
|
2761
|
-
if (obj instanceof Readable || obj instanceof Writable) {
|
|
2762
|
-
return true;
|
|
2763
|
-
}
|
|
2764
|
-
const o = obj;
|
|
2765
|
-
return ((typeof o.read === "function" && typeof o.pipe === "function") ||
|
|
2766
|
-
(typeof o.write === "function" && typeof o.end === "function"));
|
|
2767
|
-
}
|
|
2768
|
-
// =============================================================================
|
|
2769
|
-
// Additional Utility Functions (Node.js Compatibility)
|
|
2770
|
-
// =============================================================================
|
|
2771
|
-
/**
|
|
2772
|
-
* Add abort signal handling to any stream
|
|
2773
|
-
*/
|
|
2774
|
-
function addAbortSignal(signal, stream) {
|
|
2775
|
-
if (signal.aborted) {
|
|
2776
|
-
stream.destroy(new Error("Aborted"));
|
|
2777
|
-
return stream;
|
|
2778
|
-
}
|
|
2779
|
-
const onAbort = () => {
|
|
2780
|
-
stream.destroy(new Error("Aborted"));
|
|
2781
|
-
};
|
|
2782
|
-
signal.addEventListener("abort", onAbort, { once: true });
|
|
2783
|
-
// Clean up when stream is destroyed
|
|
2784
|
-
stream.on("close", () => {
|
|
2785
|
-
signal.removeEventListener("abort", onAbort);
|
|
2786
|
-
});
|
|
2787
|
-
return stream;
|
|
2788
|
-
}
|
|
2789
|
-
/**
|
|
2790
|
-
* Create a duplex stream from a pair of readable and writable streams
|
|
2791
|
-
*/
|
|
2792
|
-
function createDuplex(options) {
|
|
2793
|
-
const readableObjectMode = options?.readableObjectMode ?? options?.objectMode;
|
|
2794
|
-
const writableObjectMode = options?.writableObjectMode ?? options?.objectMode;
|
|
2795
|
-
const duplex = new Duplex({
|
|
2796
|
-
allowHalfOpen: options?.allowHalfOpen,
|
|
2797
|
-
readableHighWaterMark: options?.readableHighWaterMark,
|
|
2798
|
-
writableHighWaterMark: options?.writableHighWaterMark,
|
|
2799
|
-
readableObjectMode,
|
|
2800
|
-
writableObjectMode
|
|
2801
|
-
});
|
|
2802
|
-
// If custom readable/writable provided, pipe them
|
|
2803
|
-
if (options?.readable) {
|
|
2804
|
-
const readable = options.readable;
|
|
2805
|
-
readable.on?.("data", (chunk) => duplex.push(chunk));
|
|
2806
|
-
readable.on?.("end", () => duplex.push(null));
|
|
2807
|
-
readable.on?.("error", (err) => duplex.destroy(err));
|
|
2808
|
-
}
|
|
2809
|
-
if (options?.writable) {
|
|
2810
|
-
const writable = options.writable;
|
|
2811
|
-
duplex.on("data", (chunk) => writable.write?.(chunk));
|
|
2812
|
-
duplex.on("finish", () => writable.end?.());
|
|
2813
|
-
}
|
|
2814
|
-
// If custom read/write/final provided, override methods
|
|
2815
|
-
if (options?.write) {
|
|
2816
|
-
const _originalWrite = duplex.write.bind(duplex); // Keep bound reference for potential future use
|
|
2817
|
-
duplex.write = function (chunk, encodingOrCallback, callback) {
|
|
2818
|
-
const encoding = typeof encodingOrCallback === "string" ? encodingOrCallback : "utf8";
|
|
2819
|
-
const cb = typeof encodingOrCallback === "function" ? encodingOrCallback : (callback ?? (() => { }));
|
|
2820
|
-
options.write.call(duplex, chunk, encoding, cb);
|
|
2821
|
-
return true;
|
|
2822
|
-
};
|
|
2823
|
-
}
|
|
2824
|
-
if (options?.final) {
|
|
2825
|
-
const originalEnd = duplex.end.bind(duplex);
|
|
2826
|
-
duplex.end = function (chunkOrCallback, encodingOrCallback, callback) {
|
|
2827
|
-
const cb = typeof chunkOrCallback === "function"
|
|
2828
|
-
? chunkOrCallback
|
|
2829
|
-
: typeof encodingOrCallback === "function"
|
|
2830
|
-
? encodingOrCallback
|
|
2831
|
-
: (callback ?? (() => { }));
|
|
2832
|
-
if (chunkOrCallback !== undefined && typeof chunkOrCallback !== "function") {
|
|
2833
|
-
duplex.write(chunkOrCallback);
|
|
2834
|
-
}
|
|
2835
|
-
// Call custom final handler
|
|
2836
|
-
options.final.call(duplex, (err) => {
|
|
2837
|
-
if (err) {
|
|
2838
|
-
duplex.emit("error", err);
|
|
2839
|
-
}
|
|
2840
|
-
else {
|
|
2841
|
-
duplex.emit("finish");
|
|
2842
|
-
}
|
|
2843
|
-
// Call original end to properly close writable side
|
|
2844
|
-
originalEnd();
|
|
2845
|
-
cb();
|
|
2846
|
-
});
|
|
2847
|
-
return duplex;
|
|
2848
|
-
};
|
|
2849
|
-
}
|
|
2850
|
-
if (options?.destroy) {
|
|
2851
|
-
const originalDestroy = duplex.destroy.bind(duplex);
|
|
2852
|
-
duplex.destroy = function (error) {
|
|
2853
|
-
options.destroy.call(duplex, error ?? null, (err) => {
|
|
2854
|
-
if (err) {
|
|
2855
|
-
duplex.emit("error", err);
|
|
2856
|
-
originalDestroy(err);
|
|
2857
|
-
}
|
|
2858
|
-
else {
|
|
2859
|
-
originalDestroy(error);
|
|
2860
|
-
}
|
|
2861
|
-
});
|
|
2862
|
-
return duplex;
|
|
2863
|
-
};
|
|
2864
|
-
}
|
|
2865
|
-
return duplex;
|
|
2866
|
-
}
|
|
2867
|
-
/**
|
|
2868
|
-
* Create a readable stream from a generator function
|
|
2869
|
-
*/
|
|
2870
|
-
function createReadableFromGenerator(generator, options) {
|
|
2871
|
-
const readable = new Readable({ ...options, objectMode: options?.objectMode ?? true });
|
|
2872
|
-
(async () => {
|
|
2873
|
-
try {
|
|
2874
|
-
for await (const chunk of generator()) {
|
|
2875
|
-
if (!readable.push(chunk)) {
|
|
2876
|
-
// Backpressure
|
|
2877
|
-
await new Promise(resolve => setTimeout(resolve, 0));
|
|
2878
|
-
}
|
|
2879
|
-
}
|
|
2880
|
-
readable.push(null);
|
|
2881
|
-
}
|
|
2882
|
-
catch (err) {
|
|
2883
|
-
readable.destroy(err);
|
|
2884
|
-
}
|
|
2885
|
-
})();
|
|
2886
|
-
return readable;
|
|
2887
|
-
}
|
|
2888
|
-
/**
|
|
2889
|
-
* Create a readable stream from a Promise
|
|
2890
|
-
*/
|
|
2891
|
-
function createReadableFromPromise(promise, options) {
|
|
2892
|
-
const readable = new Readable({ ...options, objectMode: options?.objectMode ?? true });
|
|
2893
|
-
promise
|
|
2894
|
-
.then(value => {
|
|
2895
|
-
readable.push(value);
|
|
2896
|
-
readable.push(null);
|
|
2897
|
-
})
|
|
2898
|
-
.catch(err => {
|
|
2899
|
-
readable.destroy(err);
|
|
2900
|
-
});
|
|
2901
|
-
return readable;
|
|
2902
|
-
}
|
|
2903
|
-
/**
|
|
2904
|
-
* Compose multiple transform streams into one
|
|
2905
|
-
* Data flows through each transform in sequence
|
|
2906
|
-
*/
|
|
2907
|
-
function compose(...transforms) {
|
|
2908
|
-
const len = transforms.length;
|
|
2909
|
-
if (len === 0) {
|
|
2910
|
-
return new Transform({
|
|
2911
|
-
objectMode: true,
|
|
2912
|
-
transform: chunk => chunk
|
|
2913
|
-
});
|
|
2914
|
-
}
|
|
2915
|
-
const isNativeTransform = (stream) => stream instanceof Transform;
|
|
2916
|
-
if (len === 1 && isNativeTransform(transforms[0])) {
|
|
2917
|
-
return transforms[0];
|
|
2918
|
-
}
|
|
2919
|
-
// Chain the transforms: first → second → ... → last
|
|
2920
|
-
const first = transforms[0];
|
|
2921
|
-
const last = transforms[len - 1];
|
|
2922
|
-
// Pipe all transforms together
|
|
2923
|
-
for (let i = 0; i < len - 1; i++) {
|
|
2924
|
-
transforms[i].pipe(transforms[i + 1]);
|
|
2925
|
-
}
|
|
2926
|
-
class ComposedTransform extends Transform {
|
|
2927
|
-
constructor() {
|
|
2928
|
-
super(...arguments);
|
|
2929
|
-
this._dataForwarding = false;
|
|
2930
|
-
this._endForwarding = false;
|
|
2931
|
-
}
|
|
2932
|
-
on(event, listener) {
|
|
2933
|
-
if (event === "data" && !this._dataForwarding) {
|
|
2934
|
-
this._dataForwarding = true;
|
|
2935
|
-
last.on("data", (chunk) => this.emit("data", chunk));
|
|
2936
|
-
}
|
|
2937
|
-
if (event === "end" && !this._endForwarding) {
|
|
2938
|
-
this._endForwarding = true;
|
|
2939
|
-
last.on("end", () => this.emit("end"));
|
|
2940
|
-
}
|
|
2941
|
-
return super.on(event, listener);
|
|
2942
|
-
}
|
|
2943
|
-
write(chunk, encodingOrCallback, callback) {
|
|
2944
|
-
if (typeof encodingOrCallback === "function") {
|
|
2945
|
-
return first.write(chunk, encodingOrCallback);
|
|
2946
|
-
}
|
|
2947
|
-
return first.write(chunk, encodingOrCallback, callback);
|
|
2948
|
-
}
|
|
2949
|
-
end(chunkOrCallback, encodingOrCallback, callback) {
|
|
2950
|
-
if (typeof chunkOrCallback === "function") {
|
|
2951
|
-
first.end(chunkOrCallback);
|
|
2952
|
-
return this;
|
|
2953
|
-
}
|
|
2954
|
-
if (typeof encodingOrCallback === "function") {
|
|
2955
|
-
first.end(chunkOrCallback, encodingOrCallback);
|
|
2956
|
-
return this;
|
|
2957
|
-
}
|
|
2958
|
-
first.end(chunkOrCallback, encodingOrCallback, callback);
|
|
2959
|
-
return this;
|
|
2960
|
-
}
|
|
2961
|
-
pipe(destination) {
|
|
2962
|
-
return last.pipe(destination);
|
|
2963
|
-
}
|
|
2964
|
-
destroy(error) {
|
|
2965
|
-
for (const t of transforms) {
|
|
2966
|
-
t.destroy(error);
|
|
2967
|
-
}
|
|
2968
|
-
super.destroy(error);
|
|
2969
|
-
}
|
|
2970
|
-
read(size) {
|
|
2971
|
-
return typeof last.read === "function" ? last.read(size) : null;
|
|
2972
|
-
}
|
|
2973
|
-
async *[Symbol.asyncIterator]() {
|
|
2974
|
-
const it = last?.[Symbol.asyncIterator]?.();
|
|
2975
|
-
if (it) {
|
|
2976
|
-
for await (const chunk of it) {
|
|
2977
|
-
yield chunk;
|
|
2978
|
-
}
|
|
2979
|
-
return;
|
|
2980
|
-
}
|
|
2981
|
-
yield* super[Symbol.asyncIterator]();
|
|
2982
|
-
}
|
|
2983
|
-
}
|
|
2984
|
-
const composed = new ComposedTransform({
|
|
2985
|
-
objectMode: first?.objectMode ?? true,
|
|
2986
|
-
transform: chunk => chunk
|
|
2987
|
-
});
|
|
2988
|
-
// Forward errors from any transform
|
|
2989
|
-
for (const t of transforms) {
|
|
2990
|
-
t.on("error", (err) => {
|
|
2991
|
-
composed.emit("error", err);
|
|
2992
|
-
});
|
|
2993
|
-
}
|
|
2994
|
-
// Reflect underlying readability/writability like the previous duck-typed wrapper
|
|
2995
|
-
Object.defineProperty(composed, "readable", {
|
|
2996
|
-
get: () => last.readable
|
|
2997
|
-
});
|
|
2998
|
-
Object.defineProperty(composed, "writable", {
|
|
2999
|
-
get: () => first.writable
|
|
3000
|
-
});
|
|
3001
|
-
return composed;
|
|
3002
|
-
}
|
|
3003
|
-
/**
|
|
3004
|
-
* Wait for multiple streams to finish
|
|
3005
|
-
*/
|
|
3006
|
-
async function finishedAll(streams) {
|
|
3007
|
-
const len = streams.length;
|
|
3008
|
-
if (len === 0) {
|
|
3009
|
-
return;
|
|
3010
|
-
}
|
|
3011
|
-
if (len === 1) {
|
|
3012
|
-
await finished(streams[0]);
|
|
3013
|
-
return;
|
|
3014
|
-
}
|
|
3015
|
-
// Pre-allocate promise array
|
|
3016
|
-
const promises = new Array(len);
|
|
3017
|
-
for (let i = 0; i < len; i++) {
|
|
3018
|
-
promises[i] = finished(streams[i]);
|
|
3019
|
-
}
|
|
3020
|
-
await Promise.all(promises);
|
|
3021
|
-
}
|
|
3022
|
-
// Reusable empty push callback for createEmptyReadable
|
|
3023
|
-
const pushNull = (readable) => {
|
|
3024
|
-
readable.push(null);
|
|
3025
|
-
};
|
|
3026
|
-
/**
|
|
3027
|
-
* Create a readable stream that emits nothing and immediately ends
|
|
3028
|
-
*/
|
|
3029
|
-
function createEmptyReadable(options) {
|
|
3030
|
-
const readable = new Readable(options);
|
|
3031
|
-
queueMicrotask(() => pushNull(readable));
|
|
3032
|
-
return readable;
|
|
3033
|
-
}
|
|
3034
|
-
// Reusable null write handler
|
|
3035
|
-
const nullWriteHandler = {
|
|
3036
|
-
write: () => {
|
|
3037
|
-
// Discard
|
|
3038
|
-
}
|
|
3039
|
-
};
|
|
3040
|
-
/**
|
|
3041
|
-
* Create a writable stream that discards all data (like /dev/null)
|
|
3042
|
-
*/
|
|
3043
|
-
function createNullWritable(options) {
|
|
3044
|
-
return new Writable({
|
|
3045
|
-
...options,
|
|
3046
|
-
stream: new WritableStream(nullWriteHandler)
|
|
3047
|
-
});
|
|
3048
|
-
}
|
|
3049
|
-
/**
|
|
3050
|
-
* Promisified version of once for events
|
|
3051
|
-
*/
|
|
3052
|
-
function once(emitter, event, options) {
|
|
3053
|
-
return new Promise((resolve, reject) => {
|
|
3054
|
-
let onAbort;
|
|
3055
|
-
let resolved = false;
|
|
3056
|
-
const cleanup = () => {
|
|
3057
|
-
if (resolved) {
|
|
3058
|
-
return;
|
|
3059
|
-
}
|
|
3060
|
-
resolved = true;
|
|
3061
|
-
emitter.off(event, onEvent);
|
|
3062
|
-
emitter.off("error", onError);
|
|
3063
|
-
if (onAbort && options?.signal) {
|
|
3064
|
-
options.signal.removeEventListener("abort", onAbort);
|
|
3065
|
-
}
|
|
3066
|
-
};
|
|
3067
|
-
const onEvent = (...args) => {
|
|
3068
|
-
cleanup();
|
|
3069
|
-
resolve(args);
|
|
3070
|
-
};
|
|
3071
|
-
const onError = (err) => {
|
|
3072
|
-
cleanup();
|
|
3073
|
-
reject(err);
|
|
3074
|
-
};
|
|
3075
|
-
emitter.once(event, onEvent);
|
|
3076
|
-
emitter.once("error", onError);
|
|
3077
|
-
if (options?.signal) {
|
|
3078
|
-
if (options.signal.aborted) {
|
|
3079
|
-
cleanup();
|
|
3080
|
-
reject(new Error("Aborted"));
|
|
3081
|
-
return;
|
|
3082
|
-
}
|
|
3083
|
-
onAbort = () => {
|
|
3084
|
-
cleanup();
|
|
3085
|
-
reject(new Error("Aborted"));
|
|
3086
|
-
};
|
|
3087
|
-
options.signal.addEventListener("abort", onAbort);
|
|
3088
|
-
}
|
|
3089
|
-
});
|
|
3090
|
-
}
|
|
3091
|
-
/**
|
|
3092
|
-
* Convert a callback-based stream operation to a promise
|
|
3093
|
-
*/
|
|
3094
|
-
function promisify(fn) {
|
|
3095
|
-
return new Promise((resolve, reject) => {
|
|
3096
|
-
fn((error, result) => {
|
|
3097
|
-
if (error) {
|
|
3098
|
-
reject(error);
|
|
3099
|
-
}
|
|
3100
|
-
else {
|
|
3101
|
-
resolve(result);
|
|
3102
|
-
}
|
|
3103
|
-
});
|
|
3104
|
-
});
|
|
3105
|
-
}
|
|
3106
|
-
// =============================================================================
|
|
3107
|
-
// Default High Water Mark Management
|
|
3108
|
-
// =============================================================================
|
|
3109
|
-
let _defaultHighWaterMark = 16384; // 16KB default
|
|
3110
|
-
let _defaultHighWaterMarkObjectMode = 16; // 16 objects default
|
|
3111
|
-
/**
|
|
3112
|
-
* Get the default high water mark for streams
|
|
3113
|
-
*/
|
|
3114
|
-
function getDefaultHighWaterMark(objectMode) {
|
|
3115
|
-
return objectMode ? _defaultHighWaterMarkObjectMode : _defaultHighWaterMark;
|
|
3116
|
-
}
|
|
3117
|
-
/**
|
|
3118
|
-
* Set the default high water mark for streams
|
|
3119
|
-
*/
|
|
3120
|
-
function setDefaultHighWaterMark(objectMode, value) {
|
|
3121
|
-
if (objectMode) {
|
|
3122
|
-
_defaultHighWaterMarkObjectMode = value;
|
|
3123
|
-
}
|
|
3124
|
-
else {
|
|
3125
|
-
_defaultHighWaterMark = value;
|
|
3126
|
-
}
|
|
3127
|
-
}
|
|
3128
|
-
// =============================================================================
|
|
3129
|
-
// Stream State Inspection Functions
|
|
3130
|
-
// =============================================================================
|
|
3131
|
-
/**
|
|
3132
|
-
* Check if a stream has been destroyed
|
|
3133
|
-
*/
|
|
3134
|
-
function isDestroyed(stream) {
|
|
3135
|
-
return !!stream?.destroyed;
|
|
3136
|
-
}
|
|
3137
|
-
/**
|
|
3138
|
-
* Check if a readable stream has been disturbed (read from)
|
|
3139
|
-
*/
|
|
3140
|
-
function isDisturbed(stream) {
|
|
3141
|
-
if (stream instanceof Readable) {
|
|
3142
|
-
return Readable.isDisturbed(stream);
|
|
3143
|
-
}
|
|
3144
|
-
if (stream instanceof Duplex) {
|
|
3145
|
-
return Readable.isDisturbed(stream._readable);
|
|
3146
|
-
}
|
|
3147
|
-
const s = stream;
|
|
3148
|
-
return (s?.readableDidRead === true ||
|
|
3149
|
-
s?._didRead === true ||
|
|
3150
|
-
s?._ended === true ||
|
|
3151
|
-
s?._destroyed === true);
|
|
3152
|
-
}
|
|
3153
|
-
/**
|
|
3154
|
-
* Check if a stream has an error
|
|
3155
|
-
*/
|
|
3156
|
-
function isErrored(stream) {
|
|
3157
|
-
const err = stream?.errored;
|
|
3158
|
-
return err !== null && err !== undefined;
|
|
3159
|
-
}
|
|
3160
|
-
/**
|
|
3161
|
-
* Check if a stream is readable
|
|
3162
|
-
*/
|
|
3163
|
-
function isReadable(stream) {
|
|
3164
|
-
if (stream == null) {
|
|
3165
|
-
return false;
|
|
3166
|
-
}
|
|
3167
|
-
if (stream instanceof Readable || stream instanceof Transform) {
|
|
3168
|
-
return true;
|
|
3169
|
-
}
|
|
3170
|
-
if (stream instanceof Duplex) {
|
|
3171
|
-
return stream._readable instanceof Readable;
|
|
3172
|
-
}
|
|
3173
|
-
const o = stream;
|
|
3174
|
-
return typeof o.read === "function" && typeof o.pipe === "function";
|
|
3175
|
-
}
|
|
3176
|
-
/**
|
|
3177
|
-
* Check if a stream is writable
|
|
3178
|
-
*/
|
|
3179
|
-
function isWritable(stream) {
|
|
3180
|
-
if (stream == null) {
|
|
3181
|
-
return false;
|
|
3182
|
-
}
|
|
3183
|
-
if (stream instanceof Writable || stream instanceof Transform) {
|
|
3184
|
-
return true;
|
|
3185
|
-
}
|
|
3186
|
-
if (stream instanceof Duplex) {
|
|
3187
|
-
return stream._writable instanceof Writable;
|
|
3188
|
-
}
|
|
3189
|
-
const o = stream;
|
|
3190
|
-
return typeof o.write === "function" && typeof o.end === "function";
|
|
3191
|
-
}
|
|
3192
|
-
// =============================================================================
|
|
3193
|
-
// Duplex Pair
|
|
3194
|
-
// =============================================================================
|
|
3195
|
-
/**
|
|
3196
|
-
* Create a pair of connected Duplex streams
|
|
3197
|
-
* Data written to one stream can be read from the other
|
|
3198
|
-
*/
|
|
3199
|
-
function duplexPair(options) {
|
|
3200
|
-
const stream1 = new Duplex(options);
|
|
3201
|
-
const stream2 = new Duplex(options);
|
|
3202
|
-
// Override write to push to the other stream's readable
|
|
3203
|
-
stream1.write = function (chunk) {
|
|
3204
|
-
// Push to stream2's readable side
|
|
3205
|
-
stream2.push(chunk);
|
|
3206
|
-
return true;
|
|
3207
|
-
};
|
|
3208
|
-
stream2.write = function (chunk) {
|
|
3209
|
-
// Push to stream1's readable side
|
|
3210
|
-
stream1.push(chunk);
|
|
3211
|
-
return true;
|
|
3212
|
-
};
|
|
3213
|
-
// Override end to signal EOF to the other stream
|
|
3214
|
-
const originalEnd1 = stream1.end.bind(stream1);
|
|
3215
|
-
const originalEnd2 = stream2.end.bind(stream2);
|
|
3216
|
-
stream1.end = function (chunk) {
|
|
3217
|
-
if (chunk !== undefined && typeof chunk !== "function") {
|
|
3218
|
-
stream2.push(chunk);
|
|
3219
|
-
}
|
|
3220
|
-
stream2.push(null);
|
|
3221
|
-
return originalEnd1(typeof chunk === "function" ? chunk : undefined);
|
|
3222
|
-
};
|
|
3223
|
-
stream2.end = function (chunk) {
|
|
3224
|
-
if (chunk !== undefined && typeof chunk !== "function") {
|
|
3225
|
-
stream1.push(chunk);
|
|
3226
|
-
}
|
|
3227
|
-
stream1.push(null);
|
|
3228
|
-
return originalEnd2(typeof chunk === "function" ? chunk : undefined);
|
|
3229
|
-
};
|
|
3230
|
-
return [stream1, stream2];
|
|
3231
|
-
}
|
|
3232
|
-
// =============================================================================
|
|
3233
|
-
// Stream Consumers (like stream.consumers in Node.js)
|
|
3234
|
-
// =============================================================================
|
|
3235
|
-
// Helper function to collect stream chunks with total length tracking
|
|
3236
|
-
async function collectStreamChunks(stream) {
|
|
3237
|
-
const chunks = [];
|
|
3238
|
-
let totalLength = 0;
|
|
3239
|
-
let iterable;
|
|
3240
|
-
if (isReadableStream(stream)) {
|
|
3241
|
-
iterable = Readable.fromWeb(stream);
|
|
3242
|
-
}
|
|
3243
|
-
else if (isAsyncIterable(stream)) {
|
|
3244
|
-
iterable = stream;
|
|
3245
|
-
}
|
|
3246
|
-
else {
|
|
3247
|
-
throw new Error("collectStreamChunks: unsupported stream type");
|
|
3248
|
-
}
|
|
3249
|
-
for await (const chunk of iterable) {
|
|
3250
|
-
chunks.push(chunk);
|
|
3251
|
-
totalLength += chunk.length;
|
|
3252
|
-
}
|
|
3253
|
-
return { chunks, totalLength };
|
|
3254
|
-
}
|
|
3255
|
-
// Helper to concatenate with known length (faster)
|
|
3256
|
-
function concatWithLength(chunks, totalLength) {
|
|
3257
|
-
const len = chunks.length;
|
|
3258
|
-
if (len === 0) {
|
|
3259
|
-
return new Uint8Array(0);
|
|
3260
|
-
}
|
|
3261
|
-
if (len === 1) {
|
|
3262
|
-
return chunks[0];
|
|
3263
|
-
}
|
|
3264
|
-
const result = new Uint8Array(totalLength);
|
|
3265
|
-
let offset = 0;
|
|
3266
|
-
for (let i = 0; i < len; i++) {
|
|
3267
|
-
result.set(chunks[i], offset);
|
|
3268
|
-
offset += chunks[i].length;
|
|
3269
|
-
}
|
|
3270
|
-
return result;
|
|
3271
|
-
}
|
|
3272
|
-
exports.consumers = {
|
|
3273
|
-
/**
|
|
3274
|
-
* Consume entire stream as ArrayBuffer
|
|
3275
|
-
*/
|
|
3276
|
-
async arrayBuffer(stream) {
|
|
3277
|
-
const { chunks, totalLength } = await collectStreamChunks(stream);
|
|
3278
|
-
const combined = concatWithLength(chunks, totalLength);
|
|
3279
|
-
return combined.buffer.slice(combined.byteOffset, combined.byteOffset + combined.byteLength);
|
|
3280
|
-
},
|
|
3281
|
-
/**
|
|
3282
|
-
* Consume entire stream as Blob
|
|
3283
|
-
*/
|
|
3284
|
-
async blob(stream, options) {
|
|
3285
|
-
const { chunks } = await collectStreamChunks(stream);
|
|
3286
|
-
return new Blob(chunks, options);
|
|
3287
|
-
},
|
|
3288
|
-
/**
|
|
3289
|
-
* Consume entire stream as Buffer (Uint8Array in browser)
|
|
3290
|
-
*/
|
|
3291
|
-
async buffer(stream) {
|
|
3292
|
-
const { chunks, totalLength } = await collectStreamChunks(stream);
|
|
3293
|
-
return concatWithLength(chunks, totalLength);
|
|
3294
|
-
},
|
|
3295
|
-
/**
|
|
3296
|
-
* Consume entire stream as JSON
|
|
3297
|
-
*/
|
|
3298
|
-
async json(stream) {
|
|
3299
|
-
const text = await exports.consumers.text(stream);
|
|
3300
|
-
return JSON.parse(text);
|
|
3301
|
-
},
|
|
3302
|
-
/**
|
|
3303
|
-
* Consume entire stream as text
|
|
3304
|
-
*/
|
|
3305
|
-
async text(stream, encoding) {
|
|
3306
|
-
const { chunks, totalLength } = await collectStreamChunks(stream);
|
|
3307
|
-
const combined = concatWithLength(chunks, totalLength);
|
|
3308
|
-
const decoder = encoding ? (0, shared_1.getTextDecoder)(encoding) : shared_1.textDecoder;
|
|
3309
|
-
return decoder.decode(combined);
|
|
3310
|
-
}
|
|
3311
|
-
};
|
|
3312
|
-
// =============================================================================
|
|
3313
|
-
// Promises API (like stream/promises in Node.js)
|
|
3314
|
-
// =============================================================================
|
|
3315
|
-
exports.promises = {
|
|
3316
|
-
pipeline,
|
|
3317
|
-
finished
|
|
3318
|
-
};
|