@cj-tech-master/excelts 4.0.0 → 4.0.1
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/README.md +2 -2
- package/README_zh.md +2 -2
- package/dist/browser/index.browser.d.ts +25 -0
- package/dist/browser/index.browser.js +40 -0
- package/dist/browser/index.d.ts +23 -0
- package/dist/browser/index.js +35 -0
- package/dist/browser/modules/archive/byte-queue.d.ts +18 -0
- package/dist/browser/modules/archive/byte-queue.js +125 -0
- package/dist/browser/modules/archive/compress.base.d.ts +98 -0
- package/dist/browser/modules/archive/compress.base.js +173 -0
- package/dist/browser/modules/archive/compress.browser.d.ts +57 -0
- package/dist/browser/modules/archive/compress.browser.js +93 -0
- package/dist/browser/modules/archive/compress.d.ts +44 -0
- package/dist/browser/modules/archive/compress.js +86 -0
- package/dist/browser/modules/archive/crc32.base.d.ts +25 -0
- package/dist/browser/modules/archive/crc32.base.js +51 -0
- package/dist/browser/modules/archive/crc32.browser.d.ts +30 -0
- package/dist/browser/modules/archive/crc32.browser.js +32 -0
- package/dist/browser/modules/archive/crc32.d.ts +59 -0
- package/dist/browser/modules/archive/crc32.js +97 -0
- package/dist/browser/modules/archive/defaults.d.ts +4 -0
- package/dist/browser/modules/archive/defaults.js +3 -0
- package/dist/browser/modules/archive/deflate-fallback.d.ts +39 -0
- package/dist/browser/modules/archive/deflate-fallback.js +564 -0
- package/dist/browser/modules/archive/extract.d.ts +94 -0
- package/dist/browser/modules/archive/extract.js +106 -0
- package/dist/browser/modules/archive/index.base.d.ts +11 -0
- package/dist/browser/modules/archive/index.base.js +13 -0
- package/dist/browser/modules/archive/index.browser.d.ts +11 -0
- package/dist/browser/modules/archive/index.browser.js +17 -0
- package/dist/browser/modules/archive/index.d.ts +11 -0
- package/dist/browser/modules/archive/index.js +15 -0
- package/dist/browser/modules/archive/parse.base.d.ts +198 -0
- package/dist/browser/modules/archive/parse.base.js +610 -0
- package/dist/browser/modules/archive/parse.browser.d.ts +22 -0
- package/dist/browser/modules/archive/parse.browser.js +564 -0
- package/dist/browser/modules/archive/parse.d.ts +16 -0
- package/dist/browser/modules/archive/parse.js +94 -0
- package/dist/browser/modules/archive/streaming-compress.base.d.ts +36 -0
- package/dist/browser/modules/archive/streaming-compress.base.js +9 -0
- package/dist/browser/modules/archive/streaming-compress.browser.d.ts +26 -0
- package/dist/browser/modules/archive/streaming-compress.browser.js +296 -0
- package/dist/browser/modules/archive/streaming-compress.d.ts +22 -0
- package/dist/browser/modules/archive/streaming-compress.js +68 -0
- package/dist/browser/modules/archive/streaming-zip.d.ts +120 -0
- package/dist/browser/modules/archive/streaming-zip.js +407 -0
- package/dist/browser/modules/archive/utils/binary.d.ts +24 -0
- package/dist/browser/modules/archive/utils/binary.js +69 -0
- package/dist/browser/modules/archive/utils/bytes.d.ts +7 -0
- package/dist/browser/modules/archive/utils/bytes.js +101 -0
- package/dist/browser/modules/archive/utils/parse-buffer.d.ts +18 -0
- package/dist/browser/modules/archive/utils/parse-buffer.js +55 -0
- package/dist/browser/modules/archive/utils/text.d.ts +20 -0
- package/dist/browser/modules/archive/utils/text.js +33 -0
- package/dist/browser/modules/archive/utils/timestamps.d.ts +28 -0
- package/dist/browser/modules/archive/utils/timestamps.js +48 -0
- package/dist/browser/modules/archive/utils/zip-extra-fields.d.ts +19 -0
- package/dist/browser/modules/archive/utils/zip-extra-fields.js +72 -0
- package/dist/browser/modules/archive/utils/zip-extra.d.ts +18 -0
- package/dist/browser/modules/archive/utils/zip-extra.js +68 -0
- package/dist/browser/modules/archive/zip-builder.d.ts +117 -0
- package/dist/browser/modules/archive/zip-builder.js +292 -0
- package/dist/browser/modules/archive/zip-constants.d.ts +18 -0
- package/dist/browser/modules/archive/zip-constants.js +23 -0
- package/dist/browser/modules/archive/zip-entry-info.d.ts +29 -0
- package/dist/browser/modules/archive/zip-entry-info.js +6 -0
- package/dist/browser/modules/archive/zip-entry-metadata.d.ts +23 -0
- package/dist/browser/modules/archive/zip-entry-metadata.js +24 -0
- package/dist/browser/modules/archive/zip-parser.d.ts +62 -0
- package/dist/browser/modules/archive/zip-parser.js +332 -0
- package/dist/browser/modules/archive/zip-records.d.ts +43 -0
- package/dist/browser/modules/archive/zip-records.js +84 -0
- package/dist/browser/modules/csv/csv-core.d.ts +215 -0
- package/dist/browser/modules/csv/csv-core.js +723 -0
- package/dist/browser/modules/csv/csv-number.d.ts +3 -0
- package/dist/browser/modules/csv/csv-number.js +20 -0
- package/dist/browser/modules/csv/csv-stream.d.ts +121 -0
- package/dist/browser/modules/csv/csv-stream.js +703 -0
- package/dist/browser/modules/csv/csv.browser.d.ts +60 -0
- package/dist/browser/modules/csv/csv.browser.js +265 -0
- package/dist/browser/modules/csv/csv.d.ts +14 -0
- package/dist/browser/modules/csv/csv.js +29 -0
- package/dist/browser/modules/excel/anchor.d.ts +33 -0
- package/dist/browser/modules/excel/anchor.js +97 -0
- package/dist/browser/modules/excel/cell.d.ts +138 -0
- package/dist/browser/modules/excel/cell.js +946 -0
- package/dist/browser/modules/excel/column.d.ts +122 -0
- package/dist/browser/modules/excel/column.js +358 -0
- package/dist/browser/modules/excel/data-validations.d.ts +11 -0
- package/dist/browser/modules/excel/data-validations.js +43 -0
- package/dist/browser/modules/excel/defined-names.d.ts +37 -0
- package/dist/browser/modules/excel/defined-names.js +214 -0
- package/dist/browser/modules/excel/enums.d.ts +62 -0
- package/dist/browser/modules/excel/enums.js +58 -0
- package/dist/browser/modules/excel/image.d.ts +64 -0
- package/dist/browser/modules/excel/image.js +60 -0
- package/dist/browser/modules/excel/note.d.ts +29 -0
- package/dist/browser/modules/excel/note.js +61 -0
- package/dist/browser/modules/excel/pivot-table.d.ts +152 -0
- package/dist/browser/modules/excel/pivot-table.js +237 -0
- package/dist/browser/modules/excel/range.d.ts +62 -0
- package/dist/browser/modules/excel/range.js +280 -0
- package/dist/browser/modules/excel/row.d.ts +127 -0
- package/dist/browser/modules/excel/row.js +441 -0
- package/dist/browser/modules/excel/stream/hyperlink-reader.d.ts +33 -0
- package/dist/browser/modules/excel/stream/hyperlink-reader.js +84 -0
- package/dist/browser/modules/excel/stream/sheet-comments-writer.d.ts +26 -0
- package/dist/browser/modules/excel/stream/sheet-comments-writer.js +101 -0
- package/dist/browser/modules/excel/stream/sheet-rels-writer.d.ts +45 -0
- package/dist/browser/modules/excel/stream/sheet-rels-writer.js +91 -0
- package/dist/browser/modules/excel/stream/workbook-reader.browser.d.ts +169 -0
- package/dist/browser/modules/excel/stream/workbook-reader.browser.js +443 -0
- package/dist/browser/modules/excel/stream/workbook-reader.d.ts +24 -0
- package/dist/browser/modules/excel/stream/workbook-reader.js +50 -0
- package/dist/browser/modules/excel/stream/workbook-writer.browser.d.ts +147 -0
- package/dist/browser/modules/excel/stream/workbook-writer.browser.js +356 -0
- package/dist/browser/modules/excel/stream/workbook-writer.d.ts +31 -0
- package/dist/browser/modules/excel/stream/workbook-writer.js +52 -0
- package/dist/browser/modules/excel/stream/worksheet-reader.d.ts +61 -0
- package/dist/browser/modules/excel/stream/worksheet-reader.js +367 -0
- package/dist/browser/modules/excel/stream/worksheet-writer.d.ts +140 -0
- package/dist/browser/modules/excel/stream/worksheet-writer.js +613 -0
- package/dist/browser/modules/excel/table.d.ts +81 -0
- package/dist/browser/modules/excel/table.js +405 -0
- package/dist/browser/modules/excel/types.d.ts +518 -0
- package/dist/browser/modules/excel/types.js +22 -0
- package/dist/browser/modules/excel/utils/cell-format.d.ts +32 -0
- package/dist/browser/modules/excel/utils/cell-format.js +814 -0
- package/dist/browser/modules/excel/utils/cell-matrix.d.ts +37 -0
- package/dist/browser/modules/excel/utils/cell-matrix.js +180 -0
- package/dist/browser/modules/excel/utils/col-cache.d.ts +36 -0
- package/dist/browser/modules/excel/utils/col-cache.js +278 -0
- package/dist/browser/modules/excel/utils/copy-style.d.ts +5 -0
- package/dist/browser/modules/excel/utils/copy-style.js +43 -0
- package/dist/browser/modules/excel/utils/encryptor.browser.d.ts +19 -0
- package/dist/browser/modules/excel/utils/encryptor.browser.js +46 -0
- package/dist/browser/modules/excel/utils/encryptor.d.ts +9 -0
- package/dist/browser/modules/excel/utils/encryptor.js +35 -0
- package/dist/browser/modules/excel/utils/iterate-stream.d.ts +14 -0
- package/dist/browser/modules/excel/utils/iterate-stream.js +55 -0
- package/dist/browser/modules/excel/utils/ooxml-paths.d.ts +64 -0
- package/dist/browser/modules/excel/utils/ooxml-paths.js +209 -0
- package/dist/browser/modules/excel/utils/parse-sax.d.ts +113 -0
- package/dist/browser/modules/excel/utils/parse-sax.js +1206 -0
- package/dist/browser/modules/excel/utils/shared-formula.d.ts +2 -0
- package/dist/browser/modules/excel/utils/shared-formula.js +36 -0
- package/dist/browser/modules/excel/utils/shared-strings.d.ts +12 -0
- package/dist/browser/modules/excel/utils/shared-strings.js +29 -0
- package/dist/browser/modules/excel/utils/sheet-utils.d.ts +190 -0
- package/dist/browser/modules/excel/utils/sheet-utils.js +674 -0
- package/dist/browser/modules/excel/utils/stream-buf.d.ts +126 -0
- package/dist/browser/modules/excel/utils/stream-buf.js +452 -0
- package/dist/browser/modules/excel/utils/string-buf.d.ts +29 -0
- package/dist/browser/modules/excel/utils/string-buf.js +75 -0
- package/dist/browser/modules/excel/utils/under-dash.d.ts +7 -0
- package/dist/browser/modules/excel/utils/under-dash.js +166 -0
- package/dist/browser/modules/excel/utils/xml-stream.d.ts +34 -0
- package/dist/browser/modules/excel/utils/xml-stream.js +179 -0
- package/dist/browser/modules/excel/workbook.d.ts +195 -0
- package/dist/browser/modules/excel/workbook.js +314 -0
- package/dist/browser/modules/excel/worksheet.d.ts +333 -0
- package/dist/browser/modules/excel/worksheet.js +924 -0
- package/dist/browser/modules/excel/xlsx/defaultnumformats.d.ts +12 -0
- package/dist/browser/modules/excel/xlsx/defaultnumformats.js +149 -0
- package/dist/browser/modules/excel/xlsx/rel-type.d.ts +19 -0
- package/dist/browser/modules/excel/xlsx/rel-type.js +19 -0
- package/dist/browser/modules/excel/xlsx/xform/base-xform.d.ts +33 -0
- package/dist/browser/modules/excel/xlsx/xform/base-xform.js +135 -0
- package/dist/browser/modules/excel/xlsx/xform/book/defined-name-xform.d.ts +17 -0
- package/dist/browser/modules/excel/xlsx/xform/book/defined-name-xform.js +124 -0
- package/dist/browser/modules/excel/xlsx/xform/book/sheet-xform.d.ts +14 -0
- package/dist/browser/modules/excel/xlsx/xform/book/sheet-xform.js +30 -0
- package/dist/browser/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.d.ts +11 -0
- package/dist/browser/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.js +21 -0
- package/dist/browser/modules/excel/xlsx/xform/book/workbook-pivot-cache-xform.d.ts +12 -0
- package/dist/browser/modules/excel/xlsx/xform/book/workbook-pivot-cache-xform.js +24 -0
- package/dist/browser/modules/excel/xlsx/xform/book/workbook-properties-xform.d.ts +11 -0
- package/dist/browser/modules/excel/xlsx/xform/book/workbook-properties-xform.js +24 -0
- package/dist/browser/modules/excel/xlsx/xform/book/workbook-view-xform.d.ts +17 -0
- package/dist/browser/modules/excel/xlsx/xform/book/workbook-view-xform.js +46 -0
- package/dist/browser/modules/excel/xlsx/xform/book/workbook-xform.d.ts +23 -0
- package/dist/browser/modules/excel/xlsx/xform/book/workbook-xform.js +234 -0
- package/dist/browser/modules/excel/xlsx/xform/comment/comment-xform.d.ts +28 -0
- package/dist/browser/modules/excel/xlsx/xform/comment/comment-xform.js +76 -0
- package/dist/browser/modules/excel/xlsx/xform/comment/comments-xform.d.ts +21 -0
- package/dist/browser/modules/excel/xlsx/xform/comment/comments-xform.js +72 -0
- package/dist/browser/modules/excel/xlsx/xform/comment/style/vml-position-xform.d.ts +16 -0
- package/dist/browser/modules/excel/xlsx/xform/comment/style/vml-position-xform.js +34 -0
- package/dist/browser/modules/excel/xlsx/xform/comment/style/vml-protection-xform.d.ts +14 -0
- package/dist/browser/modules/excel/xlsx/xform/comment/style/vml-protection-xform.js +30 -0
- package/dist/browser/modules/excel/xlsx/xform/comment/vml-anchor-xform.d.ts +27 -0
- package/dist/browser/modules/excel/xlsx/xform/comment/vml-anchor-xform.js +55 -0
- package/dist/browser/modules/excel/xlsx/xform/comment/vml-client-data-xform.d.ts +35 -0
- package/dist/browser/modules/excel/xlsx/xform/comment/vml-client-data-xform.js +82 -0
- package/dist/browser/modules/excel/xlsx/xform/comment/vml-notes-xform.d.ts +24 -0
- package/dist/browser/modules/excel/xlsx/xform/comment/vml-notes-xform.js +96 -0
- package/dist/browser/modules/excel/xlsx/xform/comment/vml-shape-xform.d.ts +25 -0
- package/dist/browser/modules/excel/xlsx/xform/comment/vml-shape-xform.js +83 -0
- package/dist/browser/modules/excel/xlsx/xform/comment/vml-textbox-xform.d.ts +23 -0
- package/dist/browser/modules/excel/xlsx/xform/comment/vml-textbox-xform.js +60 -0
- package/dist/browser/modules/excel/xlsx/xform/composite-xform.d.ts +11 -0
- package/dist/browser/modules/excel/xlsx/xform/composite-xform.js +48 -0
- package/dist/browser/modules/excel/xlsx/xform/core/app-heading-pairs-xform.d.ts +8 -0
- package/dist/browser/modules/excel/xlsx/xform/core/app-heading-pairs-xform.js +24 -0
- package/dist/browser/modules/excel/xlsx/xform/core/app-titles-of-parts-xform.d.ts +8 -0
- package/dist/browser/modules/excel/xlsx/xform/core/app-titles-of-parts-xform.js +21 -0
- package/dist/browser/modules/excel/xlsx/xform/core/app-xform.d.ts +26 -0
- package/dist/browser/modules/excel/xlsx/xform/core/app-xform.js +83 -0
- package/dist/browser/modules/excel/xlsx/xform/core/content-types-xform.d.ts +11 -0
- package/dist/browser/modules/excel/xlsx/xform/core/content-types-xform.js +122 -0
- package/dist/browser/modules/excel/xlsx/xform/core/core-xform.d.ts +42 -0
- package/dist/browser/modules/excel/xlsx/xform/core/core-xform.js +124 -0
- package/dist/browser/modules/excel/xlsx/xform/core/relationship-xform.d.ts +14 -0
- package/dist/browser/modules/excel/xlsx/xform/core/relationship-xform.js +20 -0
- package/dist/browser/modules/excel/xlsx/xform/core/relationships-xform.d.ts +14 -0
- package/dist/browser/modules/excel/xlsx/xform/core/relationships-xform.js +62 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/base-cell-anchor-xform.d.ts +13 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/base-cell-anchor-xform.js +44 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/blip-fill-xform.d.ts +16 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/blip-fill-xform.js +57 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/blip-xform.d.ts +14 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/blip-xform.js +40 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/c-nv-pic-pr-xform.d.ts +9 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/c-nv-pic-pr-xform.js +32 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/c-nv-pr-xform.d.ts +18 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/c-nv-pr-xform.js +59 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/cell-position-xform.d.ts +24 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/cell-position-xform.js +68 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/drawing-xform.d.ts +24 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/drawing-xform.js +96 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/ext-lst-xform.d.ts +9 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/ext-lst-xform.js +37 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/ext-xform.d.ts +20 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/ext-xform.js +34 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/hlink-click-xform.d.ts +11 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/hlink-click-xform.js +39 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/nv-pic-pr-xform.d.ts +15 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/nv-pic-pr-xform.js +56 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/one-cell-anchor-xform.d.ts +20 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/one-cell-anchor-xform.js +52 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/pic-xform.d.ts +22 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/pic-xform.js +64 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/sp-pr.d.ts +32 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/sp-pr.js +17 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/two-cell-anchor-xform.d.ts +20 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/two-cell-anchor-xform.js +51 -0
- package/dist/browser/modules/excel/xlsx/xform/list-xform.d.ts +32 -0
- package/dist/browser/modules/excel/xlsx/xform/list-xform.js +89 -0
- package/dist/browser/modules/excel/xlsx/xform/pivot-table/cache-field-xform.d.ts +42 -0
- package/dist/browser/modules/excel/xlsx/xform/pivot-table/cache-field-xform.js +128 -0
- package/dist/browser/modules/excel/xlsx/xform/pivot-table/cache-field.d.ts +15 -0
- package/dist/browser/modules/excel/xlsx/xform/pivot-table/cache-field.js +78 -0
- package/dist/browser/modules/excel/xlsx/xform/pivot-table/pivot-cache-definition-xform.d.ts +60 -0
- package/dist/browser/modules/excel/xlsx/xform/pivot-table/pivot-cache-definition-xform.js +179 -0
- package/dist/browser/modules/excel/xlsx/xform/pivot-table/pivot-cache-records-xform.d.ts +73 -0
- package/dist/browser/modules/excel/xlsx/xform/pivot-table/pivot-cache-records-xform.js +234 -0
- package/dist/browser/modules/excel/xlsx/xform/pivot-table/pivot-table-xform.d.ts +119 -0
- package/dist/browser/modules/excel/xlsx/xform/pivot-table/pivot-table-xform.js +624 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/auto-filter-xform.d.ts +8 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/auto-filter-xform.js +34 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cell-xform.d.ts +17 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cell-xform.js +460 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf/cf-rule-xform.d.ts +41 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf/cf-rule-xform.js +259 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf/cfvo-xform.d.ts +8 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf/cfvo-xform.js +22 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf/color-scale-xform.d.ts +13 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf/color-scale-xform.js +35 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf/conditional-formatting-xform.d.ts +9 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf/conditional-formatting-xform.js +37 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf/conditional-formattings-xform.d.ts +16 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf/conditional-formattings-xform.js +74 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf/databar-xform.d.ts +13 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf/databar-xform.js +39 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf/ext-lst-ref-xform.d.ts +9 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +67 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf/formula-xform.d.ts +9 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf/formula-xform.js +19 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf/icon-set-xform.d.ts +11 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf/icon-set-xform.js +37 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.d.ts +10 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +22 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.d.ts +23 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +80 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.d.ts +13 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +35 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.d.ts +16 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +48 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.d.ts +13 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +40 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf-ext/databar-ext-xform.d.ts +29 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +69 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf-ext/f-ext-xform.d.ts +9 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf-ext/f-ext-xform.js +19 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.d.ts +20 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +60 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf-ext/sqref-ext-xform.d.ts +9 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +19 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/col-breaks-xform.d.ts +16 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/col-breaks-xform.js +35 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/col-xform.d.ts +22 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/col-xform.js +75 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/data-validations-xform.d.ts +12 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/data-validations-xform.js +269 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/dimension-xform.d.ts +10 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/dimension-xform.js +23 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/drawing-xform.d.ts +12 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/drawing-xform.js +27 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/ext-lst-xform.d.ts +16 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/ext-lst-xform.js +66 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/header-footer-xform.d.ts +20 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/header-footer-xform.js +124 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/hyperlink-xform.d.ts +16 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/hyperlink-xform.js +47 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/merge-cell-xform.d.ts +9 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/merge-cell-xform.js +21 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/merges.d.ts +14 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/merges.js +50 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/outline-properties-xform.d.ts +13 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/outline-properties-xform.js +36 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/page-breaks-xform.d.ts +14 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/page-breaks-xform.js +33 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/page-margins-xform.d.ts +17 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/page-margins-xform.js +42 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/page-setup-properties-xform.d.ts +12 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/page-setup-properties-xform.js +29 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/page-setup-xform.d.ts +27 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/page-setup-xform.js +96 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/picture-xform.d.ts +12 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/picture-xform.js +27 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/print-options-xform.d.ts +15 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/print-options-xform.js +41 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/row-breaks-xform.d.ts +10 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/row-breaks-xform.js +29 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/row-xform.d.ts +37 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/row-xform.js +152 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/sheet-format-properties-xform.d.ts +16 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/sheet-format-properties-xform.js +49 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/sheet-properties-xform.d.ts +19 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/sheet-properties-xform.js +82 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/sheet-protection-xform.d.ts +31 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/sheet-protection-xform.js +80 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/sheet-view-xform.d.ts +32 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/sheet-view-xform.js +193 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/table-part-xform.d.ts +12 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/table-part-xform.js +27 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/worksheet-xform.d.ts +21 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/worksheet-xform.js +518 -0
- package/dist/browser/modules/excel/xlsx/xform/simple/boolean-xform.d.ts +15 -0
- package/dist/browser/modules/excel/xlsx/xform/simple/boolean-xform.js +24 -0
- package/dist/browser/modules/excel/xlsx/xform/simple/date-xform.d.ts +22 -0
- package/dist/browser/modules/excel/xlsx/xform/simple/date-xform.js +65 -0
- package/dist/browser/modules/excel/xlsx/xform/simple/float-xform.d.ts +18 -0
- package/dist/browser/modules/excel/xlsx/xform/simple/float-xform.js +47 -0
- package/dist/browser/modules/excel/xlsx/xform/simple/integer-xform.d.ts +20 -0
- package/dist/browser/modules/excel/xlsx/xform/simple/integer-xform.js +52 -0
- package/dist/browser/modules/excel/xlsx/xform/simple/string-xform.d.ts +18 -0
- package/dist/browser/modules/excel/xlsx/xform/simple/string-xform.js +47 -0
- package/dist/browser/modules/excel/xlsx/xform/static-xform.d.ts +17 -0
- package/dist/browser/modules/excel/xlsx/xform/static-xform.js +55 -0
- package/dist/browser/modules/excel/xlsx/xform/strings/phonetic-text-xform.d.ts +20 -0
- package/dist/browser/modules/excel/xlsx/xform/strings/phonetic-text-xform.js +86 -0
- package/dist/browser/modules/excel/xlsx/xform/strings/rich-text-xform.d.ts +25 -0
- package/dist/browser/modules/excel/xlsx/xform/strings/rich-text-xform.js +77 -0
- package/dist/browser/modules/excel/xlsx/xform/strings/shared-string-xform.d.ts +17 -0
- package/dist/browser/modules/excel/xlsx/xform/strings/shared-string-xform.js +90 -0
- package/dist/browser/modules/excel/xlsx/xform/strings/shared-strings-xform.d.ts +27 -0
- package/dist/browser/modules/excel/xlsx/xform/strings/shared-strings-xform.js +109 -0
- package/dist/browser/modules/excel/xlsx/xform/strings/text-xform.d.ts +10 -0
- package/dist/browser/modules/excel/xlsx/xform/strings/text-xform.js +36 -0
- package/dist/browser/modules/excel/xlsx/xform/style/alignment-xform.d.ts +18 -0
- package/dist/browser/modules/excel/xlsx/xform/style/alignment-xform.js +152 -0
- package/dist/browser/modules/excel/xlsx/xform/style/border-xform.d.ts +49 -0
- package/dist/browser/modules/excel/xlsx/xform/style/border-xform.js +188 -0
- package/dist/browser/modules/excel/xlsx/xform/style/color-xform.d.ts +17 -0
- package/dist/browser/modules/excel/xlsx/xform/style/color-xform.js +61 -0
- package/dist/browser/modules/excel/xlsx/xform/style/dxf-xform.d.ts +23 -0
- package/dist/browser/modules/excel/xlsx/xform/style/dxf-xform.js +92 -0
- package/dist/browser/modules/excel/xlsx/xform/style/fill-xform.d.ts +85 -0
- package/dist/browser/modules/excel/xlsx/xform/style/fill-xform.js +312 -0
- package/dist/browser/modules/excel/xlsx/xform/style/font-xform.d.ts +35 -0
- package/dist/browser/modules/excel/xlsx/xform/style/font-xform.js +100 -0
- package/dist/browser/modules/excel/xlsx/xform/style/numfmt-xform.d.ts +18 -0
- package/dist/browser/modules/excel/xlsx/xform/style/numfmt-xform.js +50 -0
- package/dist/browser/modules/excel/xlsx/xform/style/protection-xform.d.ts +13 -0
- package/dist/browser/modules/excel/xlsx/xform/style/protection-xform.js +49 -0
- package/dist/browser/modules/excel/xlsx/xform/style/style-xform.d.ts +30 -0
- package/dist/browser/modules/excel/xlsx/xform/style/style-xform.js +108 -0
- package/dist/browser/modules/excel/xlsx/xform/style/styles-xform.d.ts +46 -0
- package/dist/browser/modules/excel/xlsx/xform/style/styles-xform.js +484 -0
- package/dist/browser/modules/excel/xlsx/xform/style/underline-xform.d.ts +14 -0
- package/dist/browser/modules/excel/xlsx/xform/style/underline-xform.js +38 -0
- package/dist/browser/modules/excel/xlsx/xform/table/auto-filter-xform.d.ts +21 -0
- package/dist/browser/modules/excel/xlsx/xform/table/auto-filter-xform.js +70 -0
- package/dist/browser/modules/excel/xlsx/xform/table/custom-filter-xform.d.ts +15 -0
- package/dist/browser/modules/excel/xlsx/xform/table/custom-filter-xform.js +31 -0
- package/dist/browser/modules/excel/xlsx/xform/table/filter-column-xform.d.ts +24 -0
- package/dist/browser/modules/excel/xlsx/xform/table/filter-column-xform.js +87 -0
- package/dist/browser/modules/excel/xlsx/xform/table/filter-xform.d.ts +14 -0
- package/dist/browser/modules/excel/xlsx/xform/table/filter-xform.js +29 -0
- package/dist/browser/modules/excel/xlsx/xform/table/table-column-xform.d.ts +21 -0
- package/dist/browser/modules/excel/xlsx/xform/table/table-column-xform.js +41 -0
- package/dist/browser/modules/excel/xlsx/xform/table/table-style-info-xform.d.ts +18 -0
- package/dist/browser/modules/excel/xlsx/xform/table/table-style-info-xform.js +44 -0
- package/dist/browser/modules/excel/xlsx/xform/table/table-xform.d.ts +33 -0
- package/dist/browser/modules/excel/xlsx/xform/table/table-xform.js +126 -0
- package/dist/browser/modules/excel/xlsx/xlsx.browser.d.ts +208 -0
- package/dist/browser/modules/excel/xlsx/xlsx.browser.js +1152 -0
- package/dist/browser/modules/excel/xlsx/xlsx.d.ts +24 -0
- package/dist/browser/modules/excel/xlsx/xlsx.js +239 -0
- package/dist/browser/modules/excel/xlsx/xml/theme1.d.ts +1 -0
- package/dist/browser/modules/excel/xlsx/xml/theme1.js +1 -0
- package/dist/browser/modules/stream/base-transform.d.ts +68 -0
- package/dist/browser/modules/stream/base-transform.js +160 -0
- package/dist/browser/modules/stream/buffered-stream.d.ts +94 -0
- package/dist/browser/modules/stream/buffered-stream.js +277 -0
- package/dist/browser/modules/stream/chunked-builder.d.ts +97 -0
- package/dist/browser/modules/stream/chunked-builder.js +165 -0
- package/dist/browser/modules/stream/event-emitter.d.ts +30 -0
- package/dist/browser/modules/stream/event-emitter.js +239 -0
- package/dist/browser/modules/stream/index.browser.d.ts +22 -0
- package/dist/browser/modules/stream/index.browser.js +25 -0
- package/dist/browser/modules/stream/index.d.ts +49 -0
- package/dist/browser/modules/stream/index.js +52 -0
- package/dist/browser/modules/stream/pull-stream.d.ts +67 -0
- package/dist/browser/modules/stream/pull-stream.js +204 -0
- package/dist/browser/modules/stream/shared.d.ts +54 -0
- package/dist/browser/modules/stream/shared.js +156 -0
- package/dist/browser/modules/stream/streams.browser.d.ts +936 -0
- package/dist/browser/modules/stream/streams.browser.js +3297 -0
- package/dist/browser/modules/stream/streams.d.ts +282 -0
- package/dist/browser/modules/stream/streams.js +940 -0
- package/dist/browser/modules/stream/types.d.ts +238 -0
- package/dist/browser/modules/stream/types.js +7 -0
- package/dist/browser/modules/stream/utils.d.ts +24 -0
- package/dist/browser/modules/stream/utils.js +85 -0
- package/dist/browser/utils/browser.d.ts +9 -0
- package/dist/browser/utils/browser.js +49 -0
- package/dist/browser/utils/datetime.d.ts +56 -0
- package/dist/browser/utils/datetime.js +493 -0
- package/dist/browser/utils/env.d.ts +14 -0
- package/dist/browser/utils/env.js +18 -0
- package/dist/browser/utils/utils.base.d.ts +49 -0
- package/dist/browser/utils/utils.base.js +275 -0
- package/dist/browser/utils/utils.browser.d.ts +6 -0
- package/dist/browser/utils/utils.browser.js +12 -0
- package/dist/browser/utils/utils.d.ts +6 -0
- package/dist/browser/utils/utils.js +19 -0
- package/dist/browser/utils/uuid.d.ts +11 -0
- package/dist/browser/utils/uuid.js +55 -0
- package/dist/{browser → iife}/excelts.iife.js +1 -1
- package/dist/{browser → iife}/excelts.iife.min.js +1 -1
- package/dist/types/index.browser.d.ts +20 -20
- package/dist/types/index.d.ts +23 -23
- package/dist/types/modules/archive/compress.browser.d.ts +1 -1
- package/dist/types/modules/archive/compress.d.ts +2 -2
- package/dist/types/modules/archive/crc32.browser.d.ts +1 -1
- package/dist/types/modules/archive/crc32.d.ts +1 -1
- package/dist/types/modules/archive/defaults.d.ts +1 -1
- package/dist/types/modules/archive/extract.d.ts +2 -2
- package/dist/types/modules/archive/index.base.d.ts +4 -4
- package/dist/types/modules/archive/index.browser.d.ts +5 -5
- package/dist/types/modules/archive/index.d.ts +5 -5
- package/dist/types/modules/archive/parse.base.d.ts +3 -3
- package/dist/types/modules/archive/parse.browser.d.ts +2 -2
- package/dist/types/modules/archive/parse.d.ts +3 -3
- package/dist/types/modules/archive/streaming-compress.browser.d.ts +2 -2
- package/dist/types/modules/archive/streaming-compress.d.ts +2 -2
- package/dist/types/modules/archive/streaming-zip.d.ts +2 -2
- package/dist/types/modules/archive/zip-builder.d.ts +2 -2
- package/dist/types/modules/archive/zip-entry-metadata.d.ts +1 -1
- package/dist/types/modules/archive/zip-parser.d.ts +1 -1
- package/dist/types/modules/csv/csv-stream.d.ts +3 -3
- package/dist/types/modules/csv/csv.browser.d.ts +9 -9
- package/dist/types/modules/csv/csv.d.ts +4 -4
- package/dist/types/modules/excel/anchor.d.ts +1 -1
- package/dist/types/modules/excel/cell.d.ts +7 -7
- package/dist/types/modules/excel/column.d.ts +3 -3
- package/dist/types/modules/excel/defined-names.d.ts +4 -4
- package/dist/types/modules/excel/image.d.ts +2 -2
- package/dist/types/modules/excel/pivot-table.d.ts +1 -1
- package/dist/types/modules/excel/range.d.ts +1 -1
- package/dist/types/modules/excel/row.d.ts +3 -3
- package/dist/types/modules/excel/stream/hyperlink-reader.d.ts +2 -2
- package/dist/types/modules/excel/stream/workbook-reader.browser.d.ts +6 -6
- package/dist/types/modules/excel/stream/workbook-reader.d.ts +5 -5
- package/dist/types/modules/excel/stream/workbook-writer.browser.d.ts +8 -8
- package/dist/types/modules/excel/stream/workbook-writer.d.ts +2 -2
- package/dist/types/modules/excel/stream/worksheet-reader.d.ts +6 -6
- package/dist/types/modules/excel/stream/worksheet-writer.d.ts +9 -9
- package/dist/types/modules/excel/table.d.ts +2 -2
- package/dist/types/modules/excel/utils/col-cache.d.ts +1 -1
- package/dist/types/modules/excel/utils/sheet-utils.d.ts +3 -3
- package/dist/types/modules/excel/utils/stream-buf.d.ts +2 -2
- package/dist/types/modules/excel/workbook.d.ts +9 -9
- package/dist/types/modules/excel/worksheet.d.ts +10 -10
- package/dist/types/modules/excel/xlsx/xform/base-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/book/defined-name-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/book/sheet-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/book/workbook-pivot-cache-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/book/workbook-properties-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/book/workbook-view-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/book/workbook-xform.d.ts +2 -2
- package/dist/types/modules/excel/xlsx/xform/comment/comment-xform.d.ts +2 -2
- package/dist/types/modules/excel/xlsx/xform/comment/comments-xform.d.ts +2 -2
- package/dist/types/modules/excel/xlsx/xform/comment/style/vml-position-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/comment/style/vml-protection-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/comment/vml-anchor-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/comment/vml-client-data-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/comment/vml-notes-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/comment/vml-shape-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/comment/vml-textbox-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/composite-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/core/app-heading-pairs-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/core/app-titles-of-parts-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/core/app-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/core/content-types-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/core/core-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/core/relationship-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/core/relationships-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/drawing/base-cell-anchor-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/drawing/blip-fill-xform.d.ts +2 -2
- package/dist/types/modules/excel/xlsx/xform/drawing/blip-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/drawing/c-nv-pic-pr-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/drawing/c-nv-pr-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/drawing/cell-position-xform.d.ts +2 -2
- package/dist/types/modules/excel/xlsx/xform/drawing/drawing-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/drawing/ext-lst-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/drawing/ext-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/drawing/hlink-click-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/drawing/nv-pic-pr-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/drawing/one-cell-anchor-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/drawing/pic-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/drawing/two-cell-anchor-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/list-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/pivot-table/cache-field-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/pivot-table/pivot-cache-definition-xform.d.ts +3 -3
- package/dist/types/modules/excel/xlsx/xform/pivot-table/pivot-cache-records-xform.d.ts +2 -2
- package/dist/types/modules/excel/xlsx/xform/pivot-table/pivot-table-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/auto-filter-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/cell-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/cf/cf-rule-xform.d.ts +6 -6
- package/dist/types/modules/excel/xlsx/xform/sheet/cf/cfvo-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/cf/color-scale-xform.d.ts +3 -3
- package/dist/types/modules/excel/xlsx/xform/sheet/cf/conditional-formatting-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/cf/conditional-formattings-xform.d.ts +2 -2
- package/dist/types/modules/excel/xlsx/xform/sheet/cf/databar-xform.d.ts +3 -3
- package/dist/types/modules/excel/xlsx/xform/sheet/cf/ext-lst-ref-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/cf/formula-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/cf/icon-set-xform.d.ts +2 -2
- package/dist/types/modules/excel/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.d.ts +3 -3
- package/dist/types/modules/excel/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.d.ts +2 -2
- package/dist/types/modules/excel/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.d.ts +3 -3
- package/dist/types/modules/excel/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.d.ts +2 -2
- package/dist/types/modules/excel/xlsx/xform/sheet/cf-ext/databar-ext-xform.d.ts +3 -3
- package/dist/types/modules/excel/xlsx/xform/sheet/cf-ext/f-ext-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.d.ts +3 -3
- package/dist/types/modules/excel/xlsx/xform/sheet/cf-ext/sqref-ext-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/col-breaks-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/col-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/data-validations-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/dimension-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/drawing-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/ext-lst-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/header-footer-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/hyperlink-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/merge-cell-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/outline-properties-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/page-breaks-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/page-margins-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/page-setup-properties-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/page-setup-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/picture-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/print-options-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/row-breaks-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/row-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/sheet-format-properties-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/sheet-properties-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/sheet-protection-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/sheet-view-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/table-part-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/worksheet-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/simple/boolean-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/simple/date-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/simple/float-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/simple/integer-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/simple/string-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/static-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/strings/phonetic-text-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/strings/rich-text-xform.d.ts +3 -3
- package/dist/types/modules/excel/xlsx/xform/strings/shared-string-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/strings/shared-strings-xform.d.ts +2 -2
- package/dist/types/modules/excel/xlsx/xform/strings/text-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/style/alignment-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/style/border-xform.d.ts +2 -2
- package/dist/types/modules/excel/xlsx/xform/style/color-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/style/dxf-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/style/fill-xform.d.ts +2 -2
- package/dist/types/modules/excel/xlsx/xform/style/font-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/style/numfmt-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/style/protection-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/style/style-xform.d.ts +3 -3
- package/dist/types/modules/excel/xlsx/xform/style/styles-xform.d.ts +2 -2
- package/dist/types/modules/excel/xlsx/xform/style/underline-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/table/auto-filter-xform.d.ts +2 -2
- package/dist/types/modules/excel/xlsx/xform/table/custom-filter-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/table/filter-column-xform.d.ts +2 -2
- package/dist/types/modules/excel/xlsx/xform/table/filter-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/table/table-column-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/table/table-style-info-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/table/table-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xlsx.browser.d.ts +3 -3
- package/dist/types/modules/excel/xlsx/xlsx.d.ts +1 -1
- package/dist/types/modules/stream/base-transform.d.ts +1 -1
- package/dist/types/modules/stream/buffered-stream.d.ts +1 -1
- package/dist/types/modules/stream/index.browser.d.ts +8 -8
- package/dist/types/modules/stream/index.d.ts +8 -8
- package/dist/types/modules/stream/pull-stream.d.ts +1 -1
- package/dist/types/modules/stream/streams.browser.d.ts +4 -4
- package/dist/types/modules/stream/streams.d.ts +3 -3
- package/dist/types/modules/stream/utils.d.ts +1 -1
- package/dist/types/utils/utils.browser.d.ts +1 -1
- package/dist/types/utils/utils.d.ts +1 -1
- package/package.json +10 -6
- package/dist/browser/excelts.esm.js +0 -24621
- package/dist/browser/excelts.esm.js.map +0 -1
- package/dist/browser/excelts.esm.min.js +0 -148
- /package/dist/{browser → iife}/excelts.iife.js.map +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"excelts.esm.js","names":["range","ErrorValue","range","Column","assign","validation","textDecoder","CHUNK_SIZE","textEncoder","textDecoder","concatUint8Arrays","chunk","textDecoder","callback","concatUint8Arrays","range","range","xform","Enums","validation","xform","range","range","range","booleanToXml","booleanToXml","AutoFilterXform","DrawingXform","ExtXform","extIcons","ExtXform","ExtLstXform","AutoFilterXform","DrawingXform","ExtLstXform","items","buf","buffers","concatUint8Arrays","i","process","crc32Update","promise","format","concatUint8Arrays","parseBuffer","dataDescriptorSignature","fallbackInflateRaw","concatUint8Arrays","Parse","concatUint8Arrays","xform","xml","parse","format","escapeRegex","validate","AutoFilterXform","Dimensions","Zip","Writeable","ZipDeflate","xform","Dimensions","encoder","isDateFormat","decMatch","decPlaces","denom","whole","numer","sections","cellFormat","range","result","includeBlank"],"sources":["../../src/modules/excel/utils/col-cache.ts","../../src/modules/excel/range.ts","../../src/modules/excel/enums.ts","../../src/modules/excel/utils/under-dash.ts","../../src/modules/excel/note.ts","../../src/modules/excel/utils/shared-formula.ts","../../src/modules/excel/cell.ts","../../src/modules/excel/row.ts","../../src/modules/excel/column.ts","../../src/modules/excel/anchor.ts","../../src/modules/excel/image.ts","../../src/modules/excel/table.ts","../../src/modules/excel/data-validations.ts","../../src/utils/env.ts","../../src/utils/utils.base.ts","../../src/modules/stream/event-emitter.ts","../../src/modules/stream/shared.ts","../../src/modules/stream/streams.browser.ts","../../src/modules/excel/utils/encryptor.browser.ts","../../src/modules/excel/pivot-table.ts","../../src/modules/excel/utils/copy-style.ts","../../src/modules/excel/worksheet.ts","../../src/modules/excel/utils/cell-matrix.ts","../../src/modules/excel/defined-names.ts","../../src/modules/excel/utils/xml-stream.ts","../../src/modules/excel/utils/parse-sax.ts","../../src/modules/excel/xlsx/xform/base-xform.ts","../../src/modules/excel/xlsx/xform/static-xform.ts","../../src/modules/excel/xlsx/xform/list-xform.ts","../../src/modules/excel/xlsx/xform/style/color-xform.ts","../../src/modules/excel/xlsx/xform/simple/boolean-xform.ts","../../src/modules/excel/xlsx/xform/simple/integer-xform.ts","../../src/modules/excel/xlsx/xform/simple/string-xform.ts","../../src/modules/excel/xlsx/xform/style/underline-xform.ts","../../src/modules/excel/xlsx/xform/style/font-xform.ts","../../src/modules/excel/xlsx/xform/style/fill-xform.ts","../../src/modules/excel/xlsx/xform/style/border-xform.ts","../../src/modules/excel/xlsx/defaultnumformats.ts","../../src/modules/excel/xlsx/xform/style/numfmt-xform.ts","../../src/modules/excel/xlsx/xform/style/alignment-xform.ts","../../src/modules/excel/xlsx/xform/style/protection-xform.ts","../../src/modules/excel/xlsx/xform/style/style-xform.ts","../../src/modules/excel/xlsx/xform/style/dxf-xform.ts","../../src/modules/excel/xlsx/xform/style/styles-xform.ts","../../src/modules/excel/xlsx/xform/simple/date-xform.ts","../../src/modules/excel/xlsx/xform/core/core-xform.ts","../../src/modules/excel/xlsx/xform/strings/text-xform.ts","../../src/modules/excel/xlsx/xform/strings/rich-text-xform.ts","../../src/modules/excel/xlsx/xform/strings/phonetic-text-xform.ts","../../src/modules/excel/xlsx/xform/strings/shared-string-xform.ts","../../src/modules/excel/xlsx/xform/strings/shared-strings-xform.ts","../../src/modules/excel/xlsx/xform/core/relationship-xform.ts","../../src/modules/excel/xlsx/xform/core/relationships-xform.ts","../../src/modules/excel/utils/ooxml-paths.ts","../../src/modules/excel/xlsx/xform/core/content-types-xform.ts","../../src/modules/excel/xlsx/xform/core/app-heading-pairs-xform.ts","../../src/modules/excel/xlsx/xform/core/app-titles-of-parts-xform.ts","../../src/modules/excel/xlsx/xform/core/app-xform.ts","../../src/modules/excel/xlsx/xform/book/defined-name-xform.ts","../../src/modules/excel/xlsx/xform/book/sheet-xform.ts","../../src/modules/excel/xlsx/xform/book/workbook-view-xform.ts","../../src/modules/excel/xlsx/xform/book/workbook-properties-xform.ts","../../src/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.ts","../../src/modules/excel/xlsx/xform/book/workbook-pivot-cache-xform.ts","../../src/modules/excel/xlsx/xform/book/workbook-xform.ts","../../src/modules/excel/xlsx/rel-type.ts","../../src/modules/excel/xlsx/xform/sheet/merges.ts","../../src/modules/excel/xlsx/xform/sheet/cell-xform.ts","../../src/modules/excel/xlsx/xform/sheet/row-xform.ts","../../src/modules/excel/xlsx/xform/sheet/col-xform.ts","../../src/modules/excel/xlsx/xform/sheet/dimension-xform.ts","../../src/modules/excel/xlsx/xform/sheet/hyperlink-xform.ts","../../src/modules/excel/xlsx/xform/sheet/merge-cell-xform.ts","../../src/modules/excel/xlsx/xform/sheet/data-validations-xform.ts","../../src/modules/excel/xlsx/xform/sheet/page-setup-properties-xform.ts","../../src/modules/excel/xlsx/xform/sheet/outline-properties-xform.ts","../../src/modules/excel/xlsx/xform/sheet/sheet-properties-xform.ts","../../src/modules/excel/xlsx/xform/sheet/sheet-format-properties-xform.ts","../../src/modules/excel/xlsx/xform/sheet/sheet-view-xform.ts","../../src/modules/excel/xlsx/xform/sheet/sheet-protection-xform.ts","../../src/modules/excel/xlsx/xform/sheet/page-margins-xform.ts","../../src/modules/excel/xlsx/xform/sheet/page-setup-xform.ts","../../src/modules/excel/xlsx/xform/sheet/print-options-xform.ts","../../src/modules/excel/xlsx/xform/sheet/auto-filter-xform.ts","../../src/modules/excel/xlsx/xform/sheet/picture-xform.ts","../../src/modules/excel/xlsx/xform/sheet/drawing-xform.ts","../../src/modules/excel/xlsx/xform/sheet/table-part-xform.ts","../../src/modules/excel/xlsx/xform/sheet/page-breaks-xform.ts","../../src/modules/excel/xlsx/xform/sheet/row-breaks-xform.ts","../../src/modules/excel/xlsx/xform/sheet/col-breaks-xform.ts","../../src/modules/excel/xlsx/xform/sheet/header-footer-xform.ts","../../src/modules/excel/xlsx/xform/composite-xform.ts","../../src/modules/excel/xlsx/xform/sheet/cf/cfvo-xform.ts","../../src/modules/excel/xlsx/xform/sheet/cf/databar-xform.ts","../../src/modules/excel/xlsx/xform/sheet/cf/ext-lst-ref-xform.ts","../../src/modules/excel/xlsx/xform/sheet/cf/formula-xform.ts","../../src/modules/excel/xlsx/xform/sheet/cf/color-scale-xform.ts","../../src/modules/excel/xlsx/xform/sheet/cf/icon-set-xform.ts","../../src/modules/excel/xlsx/xform/sheet/cf/cf-rule-xform.ts","../../src/modules/excel/xlsx/xform/sheet/cf/conditional-formatting-xform.ts","../../src/modules/excel/xlsx/xform/sheet/cf/conditional-formattings-xform.ts","../../src/modules/excel/xlsx/xform/sheet/cf-ext/f-ext-xform.ts","../../src/modules/excel/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.ts","../../src/modules/excel/xlsx/xform/sheet/cf-ext/databar-ext-xform.ts","../../src/modules/excel/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.ts","../../src/modules/excel/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.ts","../../src/utils/uuid.ts","../../src/modules/excel/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.ts","../../src/modules/excel/xlsx/xform/sheet/cf-ext/sqref-ext-xform.ts","../../src/modules/excel/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.ts","../../src/modules/excel/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.ts","../../src/modules/excel/xlsx/xform/sheet/ext-lst-xform.ts","../../src/modules/excel/xlsx/xform/sheet/worksheet-xform.ts","../../src/modules/excel/xlsx/xform/drawing/base-cell-anchor-xform.ts","../../src/modules/excel/xlsx/xform/drawing/cell-position-xform.ts","../../src/modules/excel/xlsx/xform/drawing/blip-xform.ts","../../src/modules/excel/xlsx/xform/drawing/blip-fill-xform.ts","../../src/modules/excel/xlsx/xform/drawing/hlink-click-xform.ts","../../src/modules/excel/xlsx/xform/drawing/ext-lst-xform.ts","../../src/modules/excel/xlsx/xform/drawing/c-nv-pr-xform.ts","../../src/modules/excel/xlsx/xform/drawing/c-nv-pic-pr-xform.ts","../../src/modules/excel/xlsx/xform/drawing/nv-pic-pr-xform.ts","../../src/modules/excel/xlsx/xform/drawing/sp-pr.ts","../../src/modules/excel/xlsx/xform/drawing/pic-xform.ts","../../src/modules/excel/xlsx/xform/drawing/two-cell-anchor-xform.ts","../../src/modules/excel/xlsx/xform/drawing/ext-xform.ts","../../src/modules/excel/xlsx/xform/drawing/one-cell-anchor-xform.ts","../../src/modules/excel/xlsx/xform/drawing/drawing-xform.ts","../../src/modules/excel/xlsx/xform/table/custom-filter-xform.ts","../../src/modules/excel/xlsx/xform/table/filter-xform.ts","../../src/modules/excel/xlsx/xform/table/filter-column-xform.ts","../../src/modules/excel/xlsx/xform/table/auto-filter-xform.ts","../../src/modules/excel/xlsx/xform/table/table-column-xform.ts","../../src/modules/excel/xlsx/xform/table/table-style-info-xform.ts","../../src/modules/excel/xlsx/xform/table/table-xform.ts","../../src/modules/excel/xlsx/xform/pivot-table/pivot-cache-records-xform.ts","../../src/modules/excel/xlsx/xform/pivot-table/cache-field.ts","../../src/modules/excel/xlsx/xform/pivot-table/cache-field-xform.ts","../../src/modules/excel/xlsx/xform/pivot-table/pivot-cache-definition-xform.ts","../../src/modules/excel/xlsx/xform/pivot-table/pivot-table-xform.ts","../../src/modules/excel/xlsx/xform/comment/comment-xform.ts","../../src/modules/excel/xlsx/xform/comment/comments-xform.ts","../../src/modules/excel/xlsx/xform/comment/vml-textbox-xform.ts","../../src/modules/excel/xlsx/xform/comment/vml-anchor-xform.ts","../../src/modules/excel/xlsx/xform/comment/style/vml-protection-xform.ts","../../src/modules/excel/xlsx/xform/comment/style/vml-position-xform.ts","../../src/modules/excel/xlsx/xform/comment/vml-client-data-xform.ts","../../src/modules/excel/xlsx/xform/comment/vml-shape-xform.ts","../../src/modules/excel/xlsx/xform/comment/vml-notes-xform.ts","../../src/modules/excel/xlsx/xml/theme1.ts","../../src/modules/excel/utils/string-buf.ts","../../src/modules/excel/utils/stream-buf.ts","../../src/modules/archive/crc32.base.ts","../../src/modules/archive/utils/bytes.ts","../../src/modules/archive/deflate-fallback.ts","../../src/modules/archive/byte-queue.ts","../../src/modules/archive/compress.base.ts","../../src/modules/archive/defaults.ts","../../src/modules/archive/streaming-compress.base.ts","../../src/modules/archive/streaming-compress.browser.ts","../../src/modules/archive/utils/text.ts","../../src/modules/archive/utils/zip-extra.ts","../../src/modules/archive/utils/timestamps.ts","../../src/modules/archive/zip-constants.ts","../../src/modules/archive/zip-entry-metadata.ts","../../src/modules/archive/zip-records.ts","../../src/modules/archive/streaming-zip.ts","../../src/modules/archive/compress.browser.ts","../../src/modules/archive/utils/binary.ts","../../src/modules/archive/utils/zip-extra-fields.ts","../../src/modules/archive/zip-parser.ts","../../src/modules/archive/utils/parse-buffer.ts","../../src/modules/archive/parse.base.ts","../../src/modules/archive/parse.browser.ts","../../src/modules/excel/xlsx/xlsx.browser.ts","../../src/utils/datetime.ts","../../src/modules/csv/csv-number.ts","../../src/modules/csv/csv-core.ts","../../src/modules/csv/csv-stream.ts","../../src/modules/csv/csv.browser.ts","../../src/modules/excel/utils/shared-strings.ts","../../src/modules/excel/stream/sheet-rels-writer.ts","../../src/modules/excel/stream/sheet-comments-writer.ts","../../src/modules/excel/stream/worksheet-writer.ts","../../src/modules/excel/stream/workbook-writer.browser.ts","../../src/modules/excel/utils/iterate-stream.ts","../../src/modules/excel/stream/worksheet-reader.ts","../../src/modules/excel/stream/hyperlink-reader.ts","../../src/modules/excel/stream/workbook-reader.browser.ts","../../src/modules/excel/workbook.ts","../../src/modules/excel/types.ts","../../src/modules/excel/utils/cell-format.ts","../../src/modules/excel/utils/sheet-utils.ts"],"sourcesContent":["import type { Address, Location } from \"@excel/types\";\n\nconst addressRegex = /^[A-Z]+\\d+$/;\n\n// Internal type with required $col$row for caching\ntype CachedAddress = Address & { $col$row: string };\n\nexport type DecodedRange = Location & {\n tl: string | CachedAddress;\n br: string | CachedAddress;\n dimensions: string;\n sheetName?: string;\n};\n\ninterface ErrorReference {\n error: string;\n sheetName?: string;\n}\n\ntype DecodeExResult = CachedAddress | DecodedRange | ErrorReference;\n\ninterface ColCache {\n _dictionary: string[];\n _l2nFill: number;\n _l2n: Record<string, number>;\n _n2l: string[];\n _hash: Record<string, CachedAddress>;\n _level(n: number): number;\n _fill(level: number): void;\n l2n(l: string): number;\n n2l(n: number): string;\n validateAddress(value: string): boolean;\n decodeAddress(value: string): CachedAddress;\n getAddress(r: number | string, c?: number): CachedAddress;\n decode(value: string): CachedAddress | DecodedRange;\n decodeEx(value: string): DecodeExResult;\n encodeAddress(row: number, col: number): string;\n encode(...args: number[]): string;\n inRange(range: number[], address: number[]): boolean;\n}\n\n// =========================================================================\n// Column Letter to Number conversion\nconst colCache: ColCache = {\n _dictionary: [\n \"A\",\n \"B\",\n \"C\",\n \"D\",\n \"E\",\n \"F\",\n \"G\",\n \"H\",\n \"I\",\n \"J\",\n \"K\",\n \"L\",\n \"M\",\n \"N\",\n \"O\",\n \"P\",\n \"Q\",\n \"R\",\n \"S\",\n \"T\",\n \"U\",\n \"V\",\n \"W\",\n \"X\",\n \"Y\",\n \"Z\"\n ],\n _l2nFill: 0,\n _l2n: {} as Record<string, number>,\n _n2l: [] as string[],\n _level(n: number): number {\n if (n <= 26) {\n return 1;\n }\n if (n <= 26 * 26) {\n return 2;\n }\n return 3;\n },\n _fill(level: number): void {\n let c: string;\n let v: number;\n let l1: number;\n let l2: number;\n let l3: number;\n let n = 1;\n if (level >= 4) {\n throw new Error(\"Out of bounds. Excel supports columns from 1 to 16384\");\n }\n if (this._l2nFill < 1 && level >= 1) {\n while (n <= 26) {\n c = this._dictionary[n - 1];\n this._n2l[n] = c;\n this._l2n[c] = n;\n n++;\n }\n this._l2nFill = 1;\n }\n if (this._l2nFill < 2 && level >= 2) {\n n = 27;\n while (n <= 26 + 26 * 26) {\n v = n - (26 + 1);\n l1 = v % 26;\n l2 = Math.floor(v / 26);\n c = this._dictionary[l2] + this._dictionary[l1];\n this._n2l[n] = c;\n this._l2n[c] = n;\n n++;\n }\n this._l2nFill = 2;\n }\n if (this._l2nFill < 3 && level >= 3) {\n n = 26 + 26 * 26 + 1;\n while (n <= 16384) {\n v = n - (26 * 26 + 26 + 1);\n l1 = v % 26;\n l2 = Math.floor(v / 26) % 26;\n l3 = Math.floor(v / (26 * 26));\n c = this._dictionary[l3] + this._dictionary[l2] + this._dictionary[l1];\n this._n2l[n] = c;\n this._l2n[c] = n;\n n++;\n }\n this._l2nFill = 3;\n }\n },\n l2n(l: string): number {\n if (!this._l2n[l]) {\n this._fill(l.length);\n }\n if (!this._l2n[l]) {\n throw new Error(`Out of bounds. Invalid column letter: ${l}`);\n }\n return this._l2n[l];\n },\n n2l(n: number): string {\n if (n < 1 || n > 16384) {\n throw new Error(`${n} is out of bounds. Excel supports columns from 1 to 16384`);\n }\n if (!this._n2l[n]) {\n this._fill(this._level(n));\n }\n return this._n2l[n];\n },\n\n // =========================================================================\n // Address processing\n _hash: {} as Record<string, CachedAddress>,\n\n // check if value looks like an address\n validateAddress(value: string): boolean {\n if (!addressRegex.test(value)) {\n throw new Error(`Invalid Address: ${value}`);\n }\n return true;\n },\n\n // convert address string into structure\n decodeAddress(value: string): CachedAddress {\n const addr = value.length < 5 && this._hash[value];\n if (addr) {\n return addr;\n }\n let hasCol = false;\n let col = \"\";\n let colNumber: number | undefined = 0;\n let hasRow = false;\n let row = \"\";\n let rowNumber: number | undefined = 0;\n for (let i = 0, char; i < value.length; i++) {\n char = value.charCodeAt(i);\n // col should before row\n if (!hasRow && char >= 65 && char <= 90) {\n // 65 = 'A'.charCodeAt(0)\n // 90 = 'Z'.charCodeAt(0)\n hasCol = true;\n col += value[i];\n // colNumber starts from 1\n colNumber = colNumber * 26 + char - 64;\n } else if (char >= 48 && char <= 57) {\n // 48 = '0'.charCodeAt(0)\n // 57 = '9'.charCodeAt(0)\n hasRow = true;\n row += value[i];\n // rowNumber starts from 0\n rowNumber = rowNumber * 10 + char - 48;\n } else if (hasRow && hasCol && char !== 36) {\n // 36 = '$'.charCodeAt(0)\n break;\n }\n }\n if (!hasCol) {\n colNumber = undefined;\n } else if (colNumber! > 16384) {\n throw new Error(`Out of bounds. Invalid column letter: ${col}`);\n }\n if (!hasRow) {\n rowNumber = undefined;\n }\n\n // in case $row$col\n value = col + row;\n\n const address: CachedAddress = {\n address: value,\n col: colNumber!,\n row: rowNumber!,\n $col$row: `$${col}$${row}`\n };\n\n // mem fix - cache only the tl 100x100 square\n if (colNumber! <= 100 && rowNumber! <= 100) {\n this._hash[value] = address;\n this._hash[address.$col$row] = address;\n }\n\n return address;\n },\n\n // convert r,c into structure (if only 1 arg, assume r is address string)\n getAddress(r: number | string, c?: number): CachedAddress {\n if (c) {\n const address = this.n2l(c) + r;\n return this.decodeAddress(address);\n }\n return this.decodeAddress(r as string);\n },\n\n // convert [address], [tl:br] into address structures\n decode(value: string) {\n const parts = value.split(\":\");\n if (parts.length === 2) {\n const tl = this.decodeAddress(parts[0]);\n const br = this.decodeAddress(parts[1]);\n const result: DecodedRange = {\n top: Math.min(tl.row, br.row),\n left: Math.min(tl.col, br.col),\n bottom: Math.max(tl.row, br.row),\n right: Math.max(tl.col, br.col),\n tl: \"\",\n br: \"\",\n dimensions: \"\"\n };\n // reconstruct tl, br and dimensions\n result.tl = this.n2l(result.left) + result.top;\n result.br = this.n2l(result.right) + result.bottom;\n result.dimensions = `${result.tl}:${result.br}`;\n return result;\n }\n return this.decodeAddress(value);\n },\n\n // convert [sheetName!][$]col[$]row[[$]col[$]row] into address or range structures\n decodeEx(value: string): DecodeExResult {\n // Use possessive quantifiers to prevent catastrophic backtracking (ReDoS)\n const groups = value.match(/^(?:(?:(?:'((?:[^']|'')+?)')|([^'^ !]+?))!)?(.*)$/);\n\n const sheetName = groups![1] || groups![2]; // Quoted and unquoted groups\n const reference = groups![3]; // Remaining address\n\n const parts = reference.split(\":\");\n if (parts.length > 1) {\n const tl = this.decodeAddress(parts[0]);\n const br = this.decodeAddress(parts[1]);\n const top = Math.min(tl.row, br.row);\n const left = Math.min(tl.col, br.col);\n const bottom = Math.max(tl.row, br.row);\n const right = Math.max(tl.col, br.col);\n\n const tlStr = this.n2l(left) + top;\n const brStr = this.n2l(right) + bottom;\n\n return {\n top,\n left,\n bottom,\n right,\n sheetName,\n tl: {\n address: tlStr,\n col: left,\n row: top,\n $col$row: `$${this.n2l(left)}$${top}`,\n sheetName\n },\n br: {\n address: brStr,\n col: right,\n row: bottom,\n $col$row: `$${this.n2l(right)}$${bottom}`,\n sheetName\n },\n dimensions: `${tlStr}:${brStr}`\n };\n }\n if (reference.indexOf(\"#\") === 0) {\n return sheetName ? { sheetName, error: reference } : { error: reference };\n }\n\n const address = this.decodeAddress(reference);\n return sheetName ? { sheetName, ...address } : address;\n },\n\n // convert row,col into address string\n encodeAddress(row: number, col: number): string {\n return colCache.n2l(col) + row;\n },\n\n // convert row,col into string address or t,l,b,r into range\n encode(...args: number[]): string {\n switch (args.length) {\n case 2:\n return colCache.encodeAddress(args[0], args[1]);\n case 4:\n return `${colCache.encodeAddress(args[0], args[1])}:${colCache.encodeAddress(args[2], args[3])}`;\n default:\n throw new Error(\"Can only encode with 2 or 4 arguments\");\n }\n },\n\n // return true if address is contained within range\n inRange(range: number[], address: number[]): boolean {\n const [left, top, , right, bottom] = range;\n const [col, row] = address;\n return col >= left && col <= right && row >= top && row <= bottom;\n }\n};\n\nexport { colCache };\n","import { colCache } from \"@excel/utils/col-cache\";\nimport type { Address } from \"@excel/types\";\n\ninterface RangeModel {\n top: number;\n left: number;\n bottom: number;\n right: number;\n sheetName?: string;\n}\n\ninterface RowDimensions {\n min: number;\n max: number;\n}\n\ninterface RowWithDimensions {\n number: number;\n dimensions?: RowDimensions;\n}\n\n// Input types for Range constructor and decode\nexport type RangeInput = Range | RangeModel | string | number | RangeInput[];\n\n// used by worksheet to calculate sheet dimensions\nclass Range {\n model: RangeModel = {\n top: 0,\n left: 0,\n bottom: 0,\n right: 0\n };\n\n // Constructor overloads\n constructor();\n constructor(range: Range);\n constructor(model: RangeModel);\n constructor(rangeString: string);\n constructor(args: RangeInput[]);\n constructor(tl: string, br: string);\n constructor(tl: string, br: string, sheetName: string);\n constructor(top: number, left: number, bottom: number, right: number);\n constructor(top: number, left: number, bottom: number, right: number, sheetName: string);\n constructor(...args: RangeInput[]) {\n this.decode(args);\n }\n\n // setTLBR overloads\n setTLBR(tl: string, br: string, sheetName?: string): void;\n setTLBR(top: number, left: number, bottom: number, right: number, sheetName?: string): void;\n setTLBR(\n t: number | string,\n l: number | string,\n b?: number | string,\n r?: number,\n s?: string\n ): void {\n if (typeof t === \"string\" && typeof l === \"string\") {\n // setTLBR(tl, br, s) - t and l are address strings\n const tl = colCache.decodeAddress(t);\n const br = colCache.decodeAddress(l);\n this.model = {\n top: Math.min(tl.row, br.row),\n left: Math.min(tl.col, br.col),\n bottom: Math.max(tl.row, br.row),\n right: Math.max(tl.col, br.col),\n sheetName: typeof b === \"string\" ? b : undefined\n };\n } else if (\n typeof t === \"number\" &&\n typeof l === \"number\" &&\n typeof b === \"number\" &&\n typeof r === \"number\"\n ) {\n // setTLBR(t, l, b, r, s) - all numbers\n this.model = {\n top: Math.min(t, b),\n left: Math.min(l, r),\n bottom: Math.max(t, b),\n right: Math.max(l, r),\n sheetName: s\n };\n }\n }\n\n private decode(argv: RangeInput[]): void {\n switch (argv.length) {\n case 5: // [t,l,b,r,s]\n if (\n typeof argv[0] === \"number\" &&\n typeof argv[1] === \"number\" &&\n typeof argv[2] === \"number\" &&\n typeof argv[3] === \"number\" &&\n typeof argv[4] === \"string\"\n ) {\n this.setTLBR(argv[0], argv[1], argv[2], argv[3], argv[4]);\n }\n break;\n case 4: // [t,l,b,r]\n if (\n typeof argv[0] === \"number\" &&\n typeof argv[1] === \"number\" &&\n typeof argv[2] === \"number\" &&\n typeof argv[3] === \"number\"\n ) {\n this.setTLBR(argv[0], argv[1], argv[2], argv[3]);\n }\n break;\n\n case 3: // [tl,br,s]\n if (\n typeof argv[0] === \"string\" &&\n typeof argv[1] === \"string\" &&\n typeof argv[2] === \"string\"\n ) {\n this.setTLBR(argv[0], argv[1], argv[2]);\n }\n break;\n case 2: // [tl,br]\n if (typeof argv[0] === \"string\" && typeof argv[1] === \"string\") {\n this.setTLBR(argv[0], argv[1]);\n }\n break;\n\n case 1: {\n const value = argv[0];\n if (value instanceof Range) {\n // copy constructor\n this.model = {\n top: value.model.top,\n left: value.model.left,\n bottom: value.model.bottom,\n right: value.model.right,\n sheetName: value.sheetName\n };\n } else if (Array.isArray(value)) {\n // an arguments array\n this.decode(value);\n } else if (\n typeof value === \"object\" &&\n \"top\" in value &&\n \"left\" in value &&\n \"bottom\" in value &&\n \"right\" in value\n ) {\n // a model\n this.model = {\n top: value.top,\n left: value.left,\n bottom: value.bottom,\n right: value.right,\n sheetName: value.sheetName\n };\n } else if (typeof value === \"string\") {\n // [sheetName!]tl:br\n const decoded = colCache.decodeEx(value);\n if (\"top\" in decoded) {\n // It's a DecodedRange\n this.model = {\n top: decoded.top,\n left: decoded.left,\n bottom: decoded.bottom,\n right: decoded.right,\n sheetName: decoded.sheetName\n };\n } else if (\"row\" in decoded) {\n // It's an Address\n this.model = {\n top: decoded.row,\n left: decoded.col,\n bottom: decoded.row,\n right: decoded.col,\n sheetName: decoded.sheetName\n };\n }\n }\n break;\n }\n\n case 0:\n this.model = {\n top: 0,\n left: 0,\n bottom: 0,\n right: 0\n };\n break;\n\n default:\n throw new Error(`Invalid number of arguments to _getDimensions() - ${argv.length}`);\n }\n }\n\n get top(): number {\n return this.model.top || 1;\n }\n\n set top(value: number) {\n this.model.top = value;\n }\n\n get left(): number {\n return this.model.left || 1;\n }\n\n set left(value: number) {\n this.model.left = value;\n }\n\n get bottom(): number {\n return this.model.bottom || 1;\n }\n\n set bottom(value: number) {\n this.model.bottom = value;\n }\n\n get right(): number {\n return this.model.right || 1;\n }\n\n set right(value: number) {\n this.model.right = value;\n }\n\n get sheetName(): string | undefined {\n return this.model.sheetName;\n }\n\n set sheetName(value: string | undefined) {\n this.model.sheetName = value;\n }\n\n get _serialisedSheetName(): string {\n const { sheetName } = this.model;\n if (sheetName) {\n if (/^[a-zA-Z0-9]*$/.test(sheetName)) {\n return `${sheetName}!`;\n }\n return `'${sheetName}'!`;\n }\n return \"\";\n }\n\n expand(top: number, left: number, bottom: number, right: number): void {\n if (!this.model.top || top < this.top) {\n this.top = top;\n }\n if (!this.model.left || left < this.left) {\n this.left = left;\n }\n if (!this.model.bottom || bottom > this.bottom) {\n this.bottom = bottom;\n }\n if (!this.model.right || right > this.right) {\n this.right = right;\n }\n }\n\n expandRow(row: RowWithDimensions | null | undefined): void {\n if (row) {\n const { dimensions, number } = row;\n if (dimensions) {\n this.expand(number, dimensions.min, number, dimensions.max);\n }\n }\n }\n\n expandToAddress(addressStr: string): void {\n const address = colCache.decodeEx(addressStr);\n if (\"row\" in address && \"col\" in address) {\n this.expand(address.row, address.col, address.row, address.col);\n }\n }\n\n get tl(): string {\n return colCache.n2l(this.left) + this.top;\n }\n\n get $t$l(): string {\n return `$${colCache.n2l(this.left)}$${this.top}`;\n }\n\n get br(): string {\n return colCache.n2l(this.right) + this.bottom;\n }\n\n get $b$r(): string {\n return `$${colCache.n2l(this.right)}$${this.bottom}`;\n }\n\n get range(): string {\n return `${this._serialisedSheetName + this.tl}:${this.br}`;\n }\n\n get $range(): string {\n return `${this._serialisedSheetName + this.$t$l}:${this.$b$r}`;\n }\n\n get shortRange(): string {\n return this.count > 1 ? this.range : this._serialisedSheetName + this.tl;\n }\n\n get $shortRange(): string {\n return this.count > 1 ? this.$range : this._serialisedSheetName + this.$t$l;\n }\n\n get count(): number {\n return (1 + this.bottom - this.top) * (1 + this.right - this.left);\n }\n\n toString(): string {\n return this.range;\n }\n\n intersects(other: Range): boolean {\n if (other.sheetName && this.sheetName && other.sheetName !== this.sheetName) {\n return false;\n }\n if (other.bottom < this.top) {\n return false;\n }\n if (other.top > this.bottom) {\n return false;\n }\n if (other.right < this.left) {\n return false;\n }\n if (other.left > this.right) {\n return false;\n }\n return true;\n }\n\n contains(addressStr: string): boolean {\n const address = colCache.decodeEx(addressStr);\n if (\"row\" in address && \"col\" in address) {\n return this.containsEx(address);\n }\n return false;\n }\n\n containsEx(address: Address): boolean {\n if (address.sheetName && this.sheetName && address.sheetName !== this.sheetName) {\n return false;\n }\n return (\n address.row >= this.top &&\n address.row <= this.bottom &&\n address.col >= this.left &&\n address.col <= this.right\n );\n }\n\n forEachAddress(cb: (address: string, row: number, col: number) => void): void {\n for (let col = this.left; col <= this.right; col++) {\n for (let row = this.top; row <= this.bottom; row++) {\n cb(colCache.encodeAddress(row, col), row, col);\n }\n }\n }\n}\n\nexport { Range };\nexport { Range as Dimensions };\n","export enum ValueType {\n Null = 0,\n Merge = 1,\n Number = 2,\n String = 3,\n Date = 4,\n Hyperlink = 5,\n Formula = 6,\n SharedString = 7,\n RichText = 8,\n Boolean = 9,\n Error = 10,\n JSON = 11 // Internal type for JSON values that serialize as String\n}\n\nexport enum FormulaType {\n None = 0,\n Master = 1,\n Shared = 2\n}\n\nexport enum RelationshipType {\n None = 0,\n OfficeDocument = 1,\n Worksheet = 2,\n CalcChain = 3,\n SharedStrings = 4,\n Styles = 5,\n Theme = 6,\n Hyperlink = 7\n}\n\nexport enum DocumentType {\n Xlsx = 1\n}\n\nexport enum ReadingOrder {\n LeftToRight = 1,\n RightToLeft = 2\n}\n\nexport const ErrorValue = {\n NotApplicable: \"#N/A\",\n Ref: \"#REF!\",\n Name: \"#NAME?\",\n DivZero: \"#DIV/0!\",\n Null: \"#NULL!\",\n Value: \"#VALUE!\",\n Num: \"#NUM!\"\n} as const;\n\nexport type ErrorValueType = (typeof ErrorValue)[keyof typeof ErrorValue];\n\nexport const Enums = {\n ValueType,\n FormulaType,\n RelationshipType,\n DocumentType,\n ReadingOrder,\n ErrorValue\n};\n","const escapeHtmlMap: Record<string, string> = {\n '\"': \""\",\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\"\n};\nconst escapeHtmlRegex = /[\"&<>]/g;\n\nexport function isEqual(a: any, b: any): boolean {\n // Fast path: identical references or primitives\n if (a === b) {\n return true;\n }\n if (a == null || b == null) {\n return a === b;\n }\n\n const aType = typeof a;\n if (aType !== typeof b) {\n return false;\n }\n\n // Primitives already handled by ===\n if (aType !== \"object\") {\n return false;\n }\n\n // Arrays\n const aIsArray = Array.isArray(a);\n const bIsArray = Array.isArray(b);\n if (aIsArray !== bIsArray) {\n return false;\n }\n\n if (aIsArray) {\n const len = a.length;\n if (len !== b.length) {\n return false;\n }\n for (let i = 0; i < len; i++) {\n if (!isEqual(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n\n // Objects\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n\n for (let i = 0, len = aKeys.length; i < len; i++) {\n const key = aKeys[i];\n if (!Object.prototype.hasOwnProperty.call(b, key)) {\n return false;\n }\n if (!isEqual(a[key], b[key])) {\n return false;\n }\n }\n return true;\n}\n\nexport function escapeHtml(html: string): string {\n return html.replace(escapeHtmlRegex, char => escapeHtmlMap[char]);\n}\n\nexport function isUndefined(val: any): val is undefined {\n return val === undefined;\n}\n\nexport function isObject(val: any): val is Record<string, any> {\n return val !== null && typeof val === \"object\" && !Array.isArray(val);\n}\n\nexport function deepMerge<T = any>(...args: any[]): T {\n const target: any = args[0] || {};\n const len = args.length;\n\n for (let i = 1; i < len; i++) {\n const arg = args[i];\n if (!arg) {\n continue;\n }\n\n if (Array.isArray(arg)) {\n for (let j = 0, jLen = arg.length; j < jLen; j++) {\n const val = arg[j];\n if (val === undefined) {\n continue;\n }\n const src = target[j];\n if (Array.isArray(val)) {\n target[j] = deepMerge(Array.isArray(src) ? src : [], val);\n } else if (isObject(val)) {\n target[j] = deepMerge(isObject(src) ? src : {}, val);\n } else {\n target[j] = val;\n }\n }\n } else {\n const keys = Object.keys(arg);\n for (let j = 0, jLen = keys.length; j < jLen; j++) {\n const key = keys[j];\n // Prevent prototype pollution\n if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") {\n continue;\n }\n const val = arg[key];\n if (val === undefined) {\n continue;\n }\n const src = target[key];\n if (Array.isArray(val)) {\n target[key] = deepMerge(Array.isArray(src) ? src : [], val);\n } else if (isObject(val)) {\n target[key] = deepMerge(isObject(src) ? src : {}, val);\n } else {\n target[key] = val;\n }\n }\n }\n }\n return target;\n}\n\nexport function cloneDeep(obj: any, preserveUndefined = true): any {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n if (obj instanceof Date) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n const len = obj.length;\n const clone = new Array(len);\n for (let i = 0; i < len; i++) {\n const value = obj[i];\n if (value !== undefined) {\n clone[i] = cloneDeep(value, preserveUndefined);\n } else if (preserveUndefined) {\n clone[i] = undefined;\n }\n }\n return clone;\n }\n\n const clone: any = {};\n const keys = Object.keys(obj);\n for (let i = 0, len = keys.length; i < len; i++) {\n const key = keys[i];\n const value = obj[key];\n if (value !== undefined) {\n clone[key] = cloneDeep(value, preserveUndefined);\n } else if (preserveUndefined) {\n clone[key] = undefined;\n }\n }\n return clone;\n}\n\nexport function get<T = any>(obj: any, path: string, defaultValue?: T): T {\n const keys = path.split(\".\");\n let result = obj;\n for (let i = 0, len = keys.length; i < len; i++) {\n if (result == null) {\n return defaultValue as T;\n }\n result = result[keys[i]];\n }\n return result ?? (defaultValue as T);\n}\n","import { deepMerge } from \"@excel/utils/under-dash\";\n\ninterface NoteText {\n text: string;\n [key: string]: any;\n}\n\ninterface NoteConfig {\n margins?: {\n insetmode?: string;\n inset?: number[];\n };\n protection?: {\n locked?: string;\n lockText?: string;\n };\n editAs?: string;\n texts?: NoteText[];\n}\n\ninterface NoteModel {\n type: string;\n note: NoteConfig;\n}\n\nclass Note {\n note: string | NoteConfig;\n\n static DEFAULT_CONFIGS: NoteModel = {\n note: {\n margins: {\n insetmode: \"auto\",\n inset: [0.13, 0.13, 0.25, 0.25]\n },\n protection: {\n locked: \"True\",\n lockText: \"True\"\n },\n editAs: \"absolute\"\n },\n type: \"note\"\n };\n\n constructor(note?: string | NoteConfig) {\n this.note = note!;\n }\n\n get model(): NoteModel {\n let value: NoteModel | null = null;\n switch (typeof this.note) {\n case \"string\":\n value = {\n type: \"note\",\n note: {\n texts: [\n {\n text: this.note\n }\n ]\n }\n };\n break;\n default:\n value = {\n type: \"note\",\n note: this.note\n };\n break;\n }\n // Suitable for all cell comments\n return deepMerge<NoteModel>({}, Note.DEFAULT_CONFIGS, value);\n }\n\n set model(value: NoteModel) {\n const { note } = value;\n const { texts } = note;\n if (texts && texts.length === 1 && Object.keys(texts[0]).length === 1) {\n this.note = texts[0].text;\n } else {\n this.note = note;\n }\n }\n\n static fromModel(model: NoteModel): Note {\n const note = new Note();\n note.model = model;\n return note;\n }\n}\n\nexport { Note };\n","import { colCache } from \"@excel/utils/col-cache\";\n\n// const cellRefRegex = /(([a-z_\\-0-9]*)!)?[$]?([a-z]+)[$]?([1-9][0-9]*)/i;\nconst replacementCandidateRx = /(([a-z_\\-0-9]*)!)?([a-z0-9_$]{2,})([(])?/gi;\nconst CRrx = /^([$])?([a-z]+)([$])?([1-9][0-9]*)$/i;\n\nfunction slideFormula(formula: string, fromCell: string, toCell: string): string {\n const offset = colCache.decode(fromCell);\n const to = colCache.decode(toCell);\n return formula.replace(\n replacementCandidateRx,\n (\n refMatch: string,\n sheet: string,\n sheetMaybe: string,\n addrPart: string,\n trailingParen: string\n ) => {\n if (trailingParen) {\n return refMatch;\n }\n const match = CRrx.exec(addrPart);\n if (match) {\n const colDollar = match[1];\n const colStr = match[2].toUpperCase();\n const rowDollar = match[3];\n const rowStr = match[4];\n if (colStr.length > 3 || (colStr.length === 3 && colStr > \"XFD\")) {\n // > XFD is the highest col number in excel 2007 and beyond, so this is a named range\n return refMatch;\n }\n let col = colCache.l2n(colStr);\n let row = parseInt(rowStr, 10);\n if (!colDollar) {\n col += (to as any).col - (offset as any).col;\n }\n if (!rowDollar) {\n row += (to as any).row - (offset as any).row;\n }\n const res = (sheet || \"\") + (colDollar || \"\") + colCache.n2l(col) + (rowDollar || \"\") + row;\n return res;\n }\n return refMatch;\n }\n );\n}\n\nexport { slideFormula };\n","import { colCache } from \"@excel/utils/col-cache\";\nimport { Enums } from \"@excel/enums\";\nimport { Note } from \"@excel/note\";\nimport { escapeHtml } from \"@excel/utils/under-dash\";\nimport { slideFormula } from \"@excel/utils/shared-formula\";\nimport type { Row } from \"@excel/row\";\nimport type { Column } from \"@excel/column\";\nimport type { Worksheet } from \"@excel/worksheet\";\nimport type { Workbook } from \"@excel/workbook\";\nimport type {\n Style,\n NumFmt,\n Font,\n Alignment,\n Protection,\n Borders,\n Fill,\n CellRichTextValue,\n CellErrorValue,\n DataValidation,\n CellValue,\n CellHyperlinkValue\n} from \"@excel/types\";\nimport type { DataValidations } from \"@excel/data-validations\";\n\nexport type FormulaResult = string | number | boolean | Date | CellErrorValue;\n\n// Extended formula type for internal use (includes shared formula fields)\nexport interface FormulaValueData {\n shareType?: string;\n ref?: string;\n formula?: string;\n sharedFormula?: string;\n result?: FormulaResult;\n date1904?: boolean;\n}\n\n// FullAddress for Cell - only needs basic fields for defined names\ninterface FullAddress {\n sheetName: string;\n address: string;\n row: number;\n col: number;\n}\n\nexport interface CellAddress {\n address: string;\n row: number;\n col: number;\n $col$row?: string;\n}\n\nexport interface NoteText {\n text: string;\n font?: Record<string, unknown>;\n}\n\nexport interface NoteConfig {\n texts?: NoteText[];\n margins?: { insetmode?: string; inset?: number[] };\n protection?: { locked?: string; lockText?: string };\n editAs?: string;\n}\n\nexport interface NoteModel {\n type: string;\n note: NoteConfig;\n}\n\nexport interface CellModel {\n address: string;\n type: number;\n // Internal value storage - type depends on cell type\n value?:\n | number\n | string\n | boolean\n | Date\n | CellRichTextValue\n | CellErrorValue\n | CellHyperlinkValue;\n style?: Partial<Style>;\n comment?: NoteModel;\n text?: string;\n hyperlink?: string;\n tooltip?: string;\n master?: string;\n shareType?: string;\n ref?: string;\n formula?: string;\n sharedFormula?: string;\n result?: FormulaResult;\n richText?: CellRichTextValue;\n sharedString?: number;\n error?: CellErrorValue;\n rawValue?: unknown;\n}\n\n// Internal interface for Value type objects\ninterface ICellValue {\n model: CellModel;\n value: CellValueType;\n type: number;\n effectiveType: number;\n address: string;\n formula?: string;\n result?: FormulaResult;\n formulaType?: number;\n hyperlink?: string;\n master?: Cell;\n text?: string;\n release(): void;\n toCsvString(): string;\n toString(): string;\n isMergedTo?(master: Cell): boolean;\n}\n\n// Type for cell values (what users set/get) - alias for CellValue from types.ts\nexport type CellValueType = CellValue;\n\n// Cell requirements\n// Operate inside a worksheet\n// Store and retrieve a value with a range of types: text, number, date, hyperlink, reference, formula, etc.\n// Manage/use and manipulate cell format either as local to cell or inherited from column or row.\n\nclass Cell {\n static Types = Enums.ValueType;\n\n // Type declarations only - no runtime overhead\n declare private _row: Row;\n declare private _column: Column;\n declare private _address: string;\n\n declare private _value: ICellValue;\n declare public style: Partial<Style>;\n declare private _mergeCount: number;\n\n declare private _comment?: Note;\n\n constructor(row: Row, column: Column, address: string) {\n if (!row || !column) {\n throw new Error(\"A Cell needs a Row\");\n }\n\n this._row = row;\n this._column = column;\n\n colCache.validateAddress(address);\n this._address = address;\n\n // TODO: lazy evaluation of this._value\n this._value = Value.create(Cell.Types.Null, this);\n\n this.style = this._mergeStyle(row.style, column.style, {});\n\n this._mergeCount = 0;\n }\n\n get worksheet(): Worksheet {\n return this._row.worksheet;\n }\n\n get workbook(): Workbook {\n return this._row.worksheet.workbook;\n }\n\n // help GC by removing cyclic (and other) references\n destroy(): void {\n delete this.style;\n delete this._value;\n delete this._row;\n delete this._column;\n delete this._address;\n }\n\n // =========================================================================\n // Styles stuff\n get numFmt(): string | NumFmt | undefined {\n return this.style.numFmt;\n }\n\n set numFmt(value: string | undefined) {\n this.style.numFmt = value;\n }\n\n get font(): Partial<Font> | undefined {\n return this.style.font;\n }\n\n set font(value: Partial<Font> | undefined) {\n this.style.font = value;\n }\n\n get alignment(): Partial<Alignment> | undefined {\n return this.style.alignment;\n }\n\n set alignment(value: Partial<Alignment> | undefined) {\n this.style.alignment = value;\n }\n\n get border(): Partial<Borders> | undefined {\n return this.style.border;\n }\n\n set border(value: Partial<Borders> | undefined) {\n this.style.border = value;\n }\n\n get fill(): Fill | undefined {\n return this.style.fill;\n }\n\n set fill(value: Fill | undefined) {\n this.style.fill = value;\n }\n\n get protection(): Partial<Protection> | undefined {\n return this.style.protection;\n }\n\n set protection(value: Partial<Protection> | undefined) {\n this.style.protection = value;\n }\n\n private _mergeStyle(\n rowStyle: Partial<Style>,\n colStyle: Partial<Style>,\n style: Partial<Style>\n ): Partial<Style> {\n const numFmt = (rowStyle && rowStyle.numFmt) || (colStyle && colStyle.numFmt);\n if (numFmt) {\n style.numFmt = numFmt;\n }\n\n const font = (rowStyle && rowStyle.font) || (colStyle && colStyle.font);\n if (font) {\n style.font = font;\n }\n\n const alignment = (rowStyle && rowStyle.alignment) || (colStyle && colStyle.alignment);\n if (alignment) {\n style.alignment = alignment;\n }\n\n const border = (rowStyle && rowStyle.border) || (colStyle && colStyle.border);\n if (border) {\n style.border = border;\n }\n\n const fill = (rowStyle && rowStyle.fill) || (colStyle && colStyle.fill);\n if (fill) {\n style.fill = fill;\n }\n\n const protection = (rowStyle && rowStyle.protection) || (colStyle && colStyle.protection);\n if (protection) {\n style.protection = protection;\n }\n\n return style;\n }\n\n // =========================================================================\n // return the address for this cell\n get address(): string {\n return this._address;\n }\n\n get row(): number {\n return this._row.number;\n }\n\n get col(): number {\n return this._column.number;\n }\n\n get $col$row(): string {\n return `$${this._column.letter}$${this.row}`;\n }\n\n // =========================================================================\n // Value stuff\n\n get type(): number {\n return this._value.type;\n }\n\n get effectiveType(): number {\n return this._value.effectiveType;\n }\n\n toCsvString(): string {\n return this._value.toCsvString();\n }\n\n // =========================================================================\n // Merge stuff\n\n addMergeRef(): void {\n this._mergeCount++;\n }\n\n releaseMergeRef(): void {\n this._mergeCount--;\n }\n\n get isMerged(): boolean {\n return this._mergeCount > 0 || this.type === Cell.Types.Merge;\n }\n\n merge(master: Cell, ignoreStyle?: boolean): void {\n this._value.release();\n this._value = Value.create(Cell.Types.Merge, this, master);\n if (!ignoreStyle) {\n this.style = master.style;\n }\n }\n\n unmerge(): void {\n if (this.type === Cell.Types.Merge) {\n this._value.release();\n this._value = Value.create(Cell.Types.Null, this);\n this.style = this._mergeStyle(this._row.style, this._column.style, {});\n }\n }\n\n isMergedTo(master: Cell): boolean {\n if (this._value.type !== Cell.Types.Merge) {\n return false;\n }\n return this._value.isMergedTo(master);\n }\n\n get master(): Cell {\n if (this.type === Cell.Types.Merge) {\n return this._value.master;\n }\n return this; // an unmerged cell is its own master\n }\n\n get isHyperlink(): boolean {\n return this._value.type === Cell.Types.Hyperlink;\n }\n\n get hyperlink(): string | undefined {\n return this._value.hyperlink;\n }\n\n // return the value\n get value(): CellValueType {\n return this._value.value;\n }\n\n // set the value - can be number, string or raw\n set value(v: CellValueType) {\n // special case - merge cells set their master's value\n if (this.type === Cell.Types.Merge) {\n this._value.master!.value = v;\n return;\n }\n\n this._value.release();\n\n // assign value\n this._value = Value.create(Value.getType(v), this, v);\n }\n\n get note(): string | NoteConfig | undefined {\n if (!this._comment) {\n return undefined;\n }\n const noteValue = this._comment.note;\n return noteValue;\n }\n\n set note(note: string | NoteConfig) {\n this._comment = new Note(note);\n }\n\n // Internal comment accessor for row operations\n get comment(): Note | undefined {\n return this._comment;\n }\n\n set comment(comment: Note | NoteConfig | undefined) {\n if (comment === undefined) {\n this._comment = undefined;\n } else if (comment instanceof Note) {\n this._comment = comment;\n } else {\n this._comment = new Note(comment);\n }\n }\n\n get text(): string {\n return this._value.toString();\n }\n\n get html(): string {\n return escapeHtml(this.text);\n }\n\n toString(): string {\n return this.text;\n }\n\n _upgradeToHyperlink(hyperlink: string): void {\n // if this cell is a string, turn it into a Hyperlink\n if (this.type === Cell.Types.String) {\n this._value = Value.create(Cell.Types.Hyperlink, this, {\n text: String(this._value.value),\n hyperlink\n });\n }\n }\n\n // =========================================================================\n // Formula stuff\n get formula(): string | undefined {\n return this._value.formula;\n }\n\n get result(): FormulaResult | undefined {\n return this._value.result;\n }\n\n get formulaType(): number {\n return this._value.formulaType;\n }\n\n // =========================================================================\n // Name stuff\n get fullAddress(): FullAddress {\n const { worksheet } = this._row;\n return {\n sheetName: worksheet.name,\n address: this.address,\n row: this.row,\n col: this.col\n };\n }\n\n get name(): string {\n return this.names[0];\n }\n\n set name(value: string) {\n this.names = [value];\n }\n\n get names(): string[] {\n return this.workbook.definedNames.getNamesEx(this.fullAddress);\n }\n\n set names(value: string[]) {\n const { definedNames } = this.workbook;\n definedNames.removeAllNames(this.fullAddress);\n value.forEach(name => {\n definedNames.addEx(this.fullAddress, name);\n });\n }\n\n addName(name: string): void {\n this.workbook.definedNames.addEx(this.fullAddress, name);\n }\n\n removeName(name: string): void {\n this.workbook.definedNames.removeEx(this.fullAddress, name);\n }\n\n removeAllNames(): void {\n this.workbook.definedNames.removeAllNames(this.fullAddress);\n }\n\n // =========================================================================\n // Data Validation stuff\n private get _dataValidations(): DataValidations {\n return this.worksheet.dataValidations;\n }\n\n get dataValidation(): DataValidation | undefined {\n return this._dataValidations.find(this.address);\n }\n\n set dataValidation(value: DataValidation) {\n this._dataValidations.add(this.address, value);\n }\n\n // =========================================================================\n // Model stuff\n\n get model(): CellModel {\n const { model } = this._value;\n model.style = this.style;\n if (this._comment) {\n model.comment = this._comment.model;\n }\n return model;\n }\n\n set model(value: CellModel) {\n this._value.release();\n this._value = Value.create(value.type, this);\n this._value.model = value;\n\n if (value.comment) {\n switch (value.comment.type) {\n case \"note\":\n this._comment = Note.fromModel(value.comment);\n break;\n }\n }\n\n if (value.style) {\n this.style = value.style;\n } else {\n this.style = {};\n }\n }\n}\n\n// =============================================================================\n// Internal Value Types\n\n// Internal model interfaces for type safety within Value classes\ninterface NullValueModel {\n address: string;\n type: number;\n}\n\ninterface NumberValueModel {\n address: string;\n type: number;\n value: number;\n}\n\ninterface StringValueModel {\n address: string;\n type: number;\n value: string;\n}\n\ninterface DateValueModel {\n address: string;\n type: number;\n value: Date;\n}\n\ninterface BooleanValueModel {\n address: string;\n type: number;\n value: boolean;\n}\n\ninterface HyperlinkValueModel {\n address: string;\n type: number;\n text?: string;\n hyperlink?: string;\n tooltip?: string;\n}\n\ninterface MergeValueModel {\n address: string;\n type: number;\n master?: string;\n}\n\ninterface FormulaValueModel {\n address: string;\n type: number;\n shareType?: string;\n ref?: string;\n formula?: string;\n sharedFormula?: string;\n result?: FormulaResult;\n}\n\ninterface SharedStringValueModel {\n address: string;\n type: number;\n value: number;\n}\n\ninterface RichTextValueModel {\n address: string;\n type: number;\n value: CellRichTextValue;\n}\n\ninterface ErrorValueModel {\n address: string;\n type: number;\n value: CellErrorValue;\n}\n\ninterface JSONValueModel {\n address: string;\n type: number;\n value: string;\n rawValue: unknown;\n}\n\nclass NullValue {\n declare public model: NullValueModel;\n\n constructor(cell: Cell) {\n this.model = {\n address: cell.address,\n type: Cell.Types.Null\n };\n }\n\n get value(): null {\n return null;\n }\n\n set value(_value: any) {\n // nothing to do\n }\n\n get type(): number {\n return Cell.Types.Null;\n }\n\n get effectiveType(): number {\n return Cell.Types.Null;\n }\n\n get address(): string {\n return this.model.address;\n }\n\n set address(value: string) {\n this.model.address = value;\n }\n\n toCsvString(): string {\n return \"\";\n }\n\n release(): void {}\n\n toString(): string {\n return \"\";\n }\n}\n\nclass NumberValue {\n declare public model: NumberValueModel;\n\n constructor(cell: Cell, value: number) {\n this.model = {\n address: cell.address,\n type: Cell.Types.Number,\n value\n };\n }\n\n get value(): number {\n return this.model.value;\n }\n\n set value(value: number) {\n this.model.value = value;\n }\n\n get type(): number {\n return Cell.Types.Number;\n }\n\n get effectiveType(): number {\n return Cell.Types.Number;\n }\n\n get address(): string {\n return this.model.address;\n }\n\n set address(value: string) {\n this.model.address = value;\n }\n\n toCsvString(): string {\n return this.model.value.toString();\n }\n\n release(): void {}\n\n toString(): string {\n return this.model.value.toString();\n }\n}\n\nclass StringValue {\n declare public model: StringValueModel;\n\n constructor(cell: Cell, value: string) {\n this.model = {\n address: cell.address,\n type: Cell.Types.String,\n value\n };\n }\n\n get value(): string {\n return this.model.value;\n }\n\n set value(value: string) {\n this.model.value = value;\n }\n\n get type(): number {\n return Cell.Types.String;\n }\n\n get effectiveType(): number {\n return Cell.Types.String;\n }\n\n get address(): string {\n return this.model.address;\n }\n\n set address(value: string) {\n this.model.address = value;\n }\n\n toCsvString(): string {\n return `\"${this.model.value.replace(/\"/g, '\"\"')}\"`;\n }\n\n release(): void {}\n\n toString(): string {\n return this.model.value;\n }\n}\n\nclass RichTextValue {\n declare public model: RichTextValueModel;\n\n constructor(cell: Cell, value: CellRichTextValue) {\n this.model = {\n address: cell.address,\n type: Cell.Types.String,\n value\n };\n }\n\n get value(): CellRichTextValue {\n return this.model.value;\n }\n\n set value(value: CellRichTextValue) {\n this.model.value = value;\n }\n\n toString(): string {\n return this.model.value.richText.map(t => t.text).join(\"\");\n }\n\n get type(): number {\n return Cell.Types.RichText;\n }\n\n get effectiveType(): number {\n return Cell.Types.RichText;\n }\n\n get address(): string {\n return this.model.address;\n }\n\n set address(value: string) {\n this.model.address = value;\n }\n\n get text(): string {\n return this.toString();\n }\n\n toCsvString(): string {\n return `\"${this.text.replace(/\"/g, '\"\"')}\"`;\n }\n\n release(): void {}\n}\n\nclass DateValue {\n declare public model: DateValueModel;\n\n constructor(cell: Cell, value: Date) {\n this.model = {\n address: cell.address,\n type: Cell.Types.Date,\n value\n };\n }\n\n get value(): Date {\n return this.model.value;\n }\n\n set value(value: Date) {\n this.model.value = value;\n }\n\n get type(): number {\n return Cell.Types.Date;\n }\n\n get effectiveType(): number {\n return Cell.Types.Date;\n }\n\n get address(): string {\n return this.model.address;\n }\n\n set address(value: string) {\n this.model.address = value;\n }\n\n toCsvString(): string {\n return this.model.value.toISOString();\n }\n\n release(): void {}\n\n toString(): string {\n return this.model.value.toString();\n }\n}\n\nclass HyperlinkValue {\n declare public model: HyperlinkValueModel;\n\n constructor(cell: Cell, value?: CellHyperlinkValue) {\n this.model = {\n address: cell.address,\n type: Cell.Types.Hyperlink,\n text: value ? value.text : undefined,\n hyperlink: value ? value.hyperlink : undefined\n };\n if (value && value.tooltip) {\n this.model.tooltip = value.tooltip;\n }\n }\n\n get value(): CellHyperlinkValue {\n return {\n text: this.model.text || \"\",\n hyperlink: this.model.hyperlink || \"\",\n tooltip: this.model.tooltip\n };\n }\n\n set value(value: CellHyperlinkValue) {\n this.model.text = value.text;\n this.model.hyperlink = value.hyperlink;\n if (value.tooltip) {\n this.model.tooltip = value.tooltip;\n }\n }\n\n get text(): string | undefined {\n return this.model.text;\n }\n\n set text(value: string | undefined) {\n this.model.text = value;\n }\n\n get hyperlink(): string | undefined {\n return this.model.hyperlink;\n }\n\n set hyperlink(value: string | undefined) {\n this.model.hyperlink = value;\n }\n\n get type(): number {\n return Cell.Types.Hyperlink;\n }\n\n get effectiveType(): number {\n return Cell.Types.Hyperlink;\n }\n\n get address(): string {\n return this.model.address;\n }\n\n set address(value: string) {\n this.model.address = value;\n }\n\n toCsvString(): string {\n return this.model.hyperlink || \"\";\n }\n\n release(): void {}\n\n toString(): string {\n return this.model.text || \"\";\n }\n}\n\nclass MergeValue {\n declare public model: MergeValueModel;\n declare private _master: Cell;\n\n constructor(cell: Cell, master?: Cell) {\n this.model = {\n address: cell.address,\n type: Cell.Types.Merge,\n master: master ? master.address : undefined\n };\n this._master = master;\n if (master) {\n master.addMergeRef();\n }\n }\n\n get value(): CellValueType {\n return this._master.value;\n }\n\n set value(value: CellValueType | Cell) {\n if (value instanceof Cell) {\n if (this._master) {\n this._master.releaseMergeRef();\n }\n value.addMergeRef();\n this._master = value;\n } else {\n this._master.value = value;\n }\n }\n\n isMergedTo(master: Cell): boolean {\n return master === this._master;\n }\n\n get master(): Cell {\n return this._master;\n }\n\n get type(): number {\n return Cell.Types.Merge;\n }\n\n get effectiveType(): number {\n return this._master.effectiveType;\n }\n\n get address(): string {\n return this.model.address;\n }\n\n set address(value: string) {\n this.model.address = value;\n }\n\n toCsvString(): string {\n return \"\";\n }\n\n release(): void {\n this._master.releaseMergeRef();\n }\n\n toString(): string {\n return this.value.toString();\n }\n}\n\nclass FormulaValue {\n declare public cell: Cell;\n declare public model: FormulaValueModel;\n declare private _translatedFormula?: string;\n\n constructor(cell: Cell, value?: FormulaValueData) {\n this.cell = cell;\n\n this.model = {\n address: cell.address,\n type: Cell.Types.Formula,\n shareType: value ? value.shareType : undefined,\n ref: value ? value.ref : undefined,\n formula: value ? value.formula : undefined,\n sharedFormula: value ? value.sharedFormula : undefined,\n result: value ? value.result : undefined\n };\n }\n\n private _copyModel(model: FormulaValueModel): FormulaValueData {\n const copy: FormulaValueData = {};\n if (model.formula) {\n copy.formula = model.formula;\n }\n if (model.result !== undefined) {\n copy.result = model.result;\n }\n if (model.ref) {\n copy.ref = model.ref;\n }\n if (model.shareType) {\n copy.shareType = model.shareType;\n }\n if (model.sharedFormula) {\n copy.sharedFormula = model.sharedFormula;\n }\n return copy;\n }\n\n get value(): FormulaValueData {\n return this._copyModel(this.model);\n }\n\n set value(value: FormulaValueData) {\n if (value.formula) {\n this.model.formula = value.formula;\n }\n if (value.result !== undefined) {\n this.model.result = value.result;\n }\n if (value.ref) {\n this.model.ref = value.ref;\n }\n if (value.shareType) {\n this.model.shareType = value.shareType;\n }\n if (value.sharedFormula) {\n this.model.sharedFormula = value.sharedFormula;\n }\n }\n\n validate(value: CellValueType): void {\n switch (Value.getType(value)) {\n case Cell.Types.Null:\n case Cell.Types.String:\n case Cell.Types.Number:\n case Cell.Types.Date:\n break;\n case Cell.Types.Hyperlink:\n case Cell.Types.Formula:\n default:\n throw new Error(\"Cannot process that type of result value\");\n }\n }\n\n get dependencies(): { ranges: string[] | null; cells: string[] | null } {\n // find all the ranges and cells mentioned in the formula\n const ranges = this.formula.match(/([a-zA-Z0-9]+!)?[A-Z]{1,3}\\d{1,4}:[A-Z]{1,3}\\d{1,4}/g);\n const cells = this.formula\n .replace(/([a-zA-Z0-9]+!)?[A-Z]{1,3}\\d{1,4}:[A-Z]{1,3}\\d{1,4}/g, \"\")\n .match(/([a-zA-Z0-9]+!)?[A-Z]{1,3}\\d{1,4}/g);\n return {\n ranges,\n cells\n };\n }\n\n get formula(): string {\n return this.model.formula || this._getTranslatedFormula() || \"\";\n }\n\n set formula(value: string) {\n this.model.formula = value;\n }\n\n get formulaType(): number {\n if (this.model.formula) {\n return Enums.FormulaType.Master;\n }\n if (this.model.sharedFormula) {\n return Enums.FormulaType.Shared;\n }\n return Enums.FormulaType.None;\n }\n\n get result(): FormulaResult | undefined {\n return this.model.result;\n }\n\n set result(value: FormulaResult | undefined) {\n this.model.result = value;\n }\n\n get type(): number {\n return Cell.Types.Formula;\n }\n\n get effectiveType(): number {\n const v = this.model.result;\n if (v === null || v === undefined) {\n return Enums.ValueType.Null;\n }\n if (v instanceof String || typeof v === \"string\") {\n return Enums.ValueType.String;\n }\n if (typeof v === \"number\") {\n return Enums.ValueType.Number;\n }\n if (v instanceof Date) {\n return Enums.ValueType.Date;\n }\n if (typeof v === \"object\" && \"error\" in v) {\n return Enums.ValueType.Error;\n }\n\n return Enums.ValueType.Null;\n }\n\n get address(): string {\n return this.model.address;\n }\n\n set address(value: string) {\n this.model.address = value;\n }\n\n _getTranslatedFormula(): string | undefined {\n if (!this._translatedFormula && this.model.sharedFormula) {\n const { worksheet } = this.cell;\n const master = worksheet.findCell(this.model.sharedFormula);\n this._translatedFormula =\n master && slideFormula(master.formula, master.address, this.model.address);\n }\n return this._translatedFormula;\n }\n\n toCsvString(): string {\n return `${this.model.result || \"\"}`;\n }\n\n release(): void {}\n\n toString(): string {\n return this.model.result ? this.model.result.toString() : \"\";\n }\n}\n\nclass SharedStringValue {\n declare public model: SharedStringValueModel;\n\n constructor(cell: Cell, value: number) {\n this.model = {\n address: cell.address,\n type: Cell.Types.SharedString,\n value\n };\n }\n\n get value(): number {\n return this.model.value;\n }\n\n set value(value: number) {\n this.model.value = value;\n }\n\n get type(): number {\n return Cell.Types.SharedString;\n }\n\n get effectiveType(): number {\n return Cell.Types.SharedString;\n }\n\n get address(): string {\n return this.model.address;\n }\n\n set address(value: string) {\n this.model.address = value;\n }\n\n toCsvString(): string {\n return this.model.value.toString();\n }\n\n release(): void {}\n\n toString(): string {\n return this.model.value.toString();\n }\n}\n\nclass BooleanValue {\n declare public model: BooleanValueModel;\n\n constructor(cell: Cell, value: boolean) {\n this.model = {\n address: cell.address,\n type: Cell.Types.Boolean,\n value\n };\n }\n\n get value(): boolean {\n return this.model.value;\n }\n\n set value(value: boolean) {\n this.model.value = value;\n }\n\n get type(): number {\n return Cell.Types.Boolean;\n }\n\n get effectiveType(): number {\n return Cell.Types.Boolean;\n }\n\n get address(): string {\n return this.model.address;\n }\n\n set address(value: string) {\n this.model.address = value;\n }\n\n toCsvString(): number {\n return this.model.value ? 1 : 0;\n }\n\n release(): void {}\n\n toString(): string {\n return this.model.value.toString();\n }\n}\n\nclass ErrorValue {\n declare public model: ErrorValueModel;\n\n constructor(cell: Cell, value: CellErrorValue) {\n this.model = {\n address: cell.address,\n type: Cell.Types.Error,\n value\n };\n }\n\n get value(): CellErrorValue {\n return this.model.value;\n }\n\n set value(value: CellErrorValue) {\n this.model.value = value;\n }\n\n get type(): number {\n return Cell.Types.Error;\n }\n\n get effectiveType(): number {\n return Cell.Types.Error;\n }\n\n get address(): string {\n return this.model.address;\n }\n\n set address(value: string) {\n this.model.address = value;\n }\n\n toCsvString(): string {\n return this.toString();\n }\n\n release(): void {}\n\n toString(): string {\n return this.model.value.error.toString();\n }\n}\n\nclass JSONValue {\n declare public model: JSONValueModel;\n\n constructor(cell: Cell, value: unknown) {\n this.model = {\n address: cell.address,\n type: Cell.Types.String,\n value: JSON.stringify(value),\n rawValue: value\n };\n }\n\n get value(): unknown {\n return this.model.rawValue;\n }\n\n set value(value: unknown) {\n this.model.rawValue = value;\n this.model.value = JSON.stringify(value);\n }\n\n get type(): number {\n return Cell.Types.String;\n }\n\n get effectiveType(): number {\n return Cell.Types.String;\n }\n\n get address(): string {\n return this.model.address;\n }\n\n set address(value: string) {\n this.model.address = value;\n }\n\n toCsvString(): string {\n return this.model.value;\n }\n\n release(): void {}\n\n toString(): string {\n return this.model.value;\n }\n}\n\n// Value is a place to hold common static Value type functions\nconst Value = {\n getType(value: CellValueType): number {\n if (value === null || value === undefined) {\n return Cell.Types.Null;\n }\n if (value instanceof String || typeof value === \"string\") {\n return Cell.Types.String;\n }\n if (typeof value === \"number\") {\n return Cell.Types.Number;\n }\n if (typeof value === \"boolean\") {\n return Cell.Types.Boolean;\n }\n if (value instanceof Date) {\n return Cell.Types.Date;\n }\n if (typeof value === \"object\") {\n if (\"text\" in value && value.text && \"hyperlink\" in value && value.hyperlink) {\n return Cell.Types.Hyperlink;\n }\n if (\n (\"formula\" in value && value.formula) ||\n (\"sharedFormula\" in value && value.sharedFormula)\n ) {\n return Cell.Types.Formula;\n }\n if (\"richText\" in value && value.richText) {\n return Cell.Types.RichText;\n }\n if (\"sharedString\" in value && value.sharedString) {\n return Cell.Types.SharedString;\n }\n if (\"error\" in value && value.error) {\n return Cell.Types.Error;\n }\n }\n return Cell.Types.JSON;\n },\n\n // map valueType to constructor\n types: [\n { t: Cell.Types.Null, f: NullValue },\n { t: Cell.Types.Number, f: NumberValue },\n { t: Cell.Types.String, f: StringValue },\n { t: Cell.Types.Date, f: DateValue },\n { t: Cell.Types.Hyperlink, f: HyperlinkValue },\n { t: Cell.Types.Formula, f: FormulaValue },\n { t: Cell.Types.Merge, f: MergeValue },\n { t: Cell.Types.JSON, f: JSONValue },\n { t: Cell.Types.SharedString, f: SharedStringValue },\n { t: Cell.Types.RichText, f: RichTextValue },\n { t: Cell.Types.Boolean, f: BooleanValue },\n { t: Cell.Types.Error, f: ErrorValue }\n ].reduce(\n (\n p: (\n | typeof NullValue\n | typeof NumberValue\n | typeof StringValue\n | typeof DateValue\n | typeof HyperlinkValue\n | typeof FormulaValue\n | typeof MergeValue\n | typeof JSONValue\n | typeof SharedStringValue\n | typeof RichTextValue\n | typeof BooleanValue\n | typeof ErrorValue\n )[],\n t\n ) => {\n p[t.t] = t.f;\n return p;\n },\n []\n ),\n\n create(type: number, cell: Cell, value?: CellValueType): ICellValue {\n const T = this.types[type];\n if (!T) {\n throw new Error(`Could not create Value of type ${type}`);\n }\n return new T(cell, value);\n }\n};\n\nexport { Cell };\n","import { Enums } from \"@excel/enums\";\nimport { colCache } from \"@excel/utils/col-cache\";\nimport { Cell, type CellModel, type CellAddress } from \"@excel/cell\";\nimport type { Worksheet } from \"@excel/worksheet\";\nimport type { Column } from \"@excel/column\";\nimport type {\n Style,\n NumFmt,\n Font,\n Alignment,\n Protection,\n Borders,\n Fill,\n CellValue,\n RowValues,\n RowBreak\n} from \"@excel/types\";\n\n// Internal interface for row dimensions\ninterface RowDimensions {\n min: number;\n max: number;\n}\n\n// Internal interface for row model (serialization)\nexport interface RowModel {\n cells: CellModel[];\n number: number;\n min: number;\n max: number;\n height?: number;\n style: Partial<Style>;\n hidden: boolean;\n outlineLevel: number;\n collapsed: boolean;\n}\n\nclass Row {\n // Type declarations only - no runtime overhead\n declare private _worksheet: Worksheet;\n declare private _number: number;\n declare private _cells: Cell[];\n declare public style: Partial<Style>;\n declare private _hidden?: boolean;\n declare private _outlineLevel?: number;\n declare public height?: number;\n\n constructor(worksheet: Worksheet, number: number) {\n this._worksheet = worksheet;\n this._number = number;\n this._cells = [];\n this.style = {};\n this.outlineLevel = 0;\n }\n\n /**\n * The row number\n */\n get number(): number {\n return this._number;\n }\n\n /**\n * The worksheet that contains this row\n */\n get worksheet(): Worksheet {\n return this._worksheet;\n }\n\n /**\n * Commit a completed row to stream.\n * Inform Streaming Writer that this row (and all rows before it) are complete\n * and ready to write. Has no effect on Worksheet document.\n */\n commit(): void {\n this._worksheet._commitRow(this);\n }\n\n /**\n * Helps GC by breaking cyclic references\n */\n destroy(): void {\n delete this._worksheet;\n delete this._cells;\n delete this.style;\n }\n\n findCell(colNumber: number): Cell | undefined {\n return this._cells[colNumber - 1];\n }\n\n // given {address, row, col}, find or create new cell\n getCellEx(address: CellAddress): Cell {\n let cell = this._cells[address.col - 1];\n if (!cell) {\n const column = this._worksheet.getColumn(address.col);\n cell = new Cell(this, column, address.address);\n this._cells[address.col - 1] = cell;\n }\n return cell;\n }\n\n /**\n * Get cell by number, column letter or column key\n */\n getCell(col: string | number): Cell {\n let colNum: number;\n if (typeof col === \"string\") {\n // is it a key?\n const column = this._worksheet.getColumnKey(col);\n if (column) {\n colNum = column.number;\n } else {\n colNum = colCache.l2n(col);\n }\n } else {\n colNum = col;\n }\n return (\n this._cells[colNum - 1] ||\n this.getCellEx({\n address: colCache.encodeAddress(this._number, colNum),\n row: this._number,\n col: colNum\n })\n );\n }\n\n /**\n * Cut one or more cells (cells to the right are shifted left)\n *\n * Note: this operation will not affect other rows\n */\n splice(start: number, count: number, ...inserts: CellValue[]): void {\n const nKeep = start + count;\n const nExpand = inserts.length - count;\n const nEnd = this._cells.length;\n let i: number;\n let cSrc: Cell | undefined;\n let cDst: Cell | undefined;\n\n if (nExpand < 0) {\n // remove cells\n for (i = start + inserts.length; i <= nEnd; i++) {\n cDst = this._cells[i - 1];\n cSrc = this._cells[i - nExpand - 1];\n if (cSrc) {\n cDst = this.getCell(i);\n cDst.value = cSrc.value;\n cDst.style = cSrc.style;\n cDst.comment = cSrc.comment;\n } else if (cDst) {\n cDst.value = null;\n cDst.style = {};\n cDst.comment = undefined;\n }\n }\n } else if (nExpand > 0) {\n // insert new cells\n for (i = nEnd; i >= nKeep; i--) {\n cSrc = this._cells[i - 1];\n if (cSrc) {\n cDst = this.getCell(i + nExpand);\n cDst.value = cSrc.value;\n cDst.style = cSrc.style;\n cDst.comment = cSrc.comment;\n } else {\n this._cells[i + nExpand - 1] = undefined;\n }\n }\n }\n\n // now add the new values\n for (i = 0; i < inserts.length; i++) {\n cDst = this.getCell(start + i);\n cDst.value = inserts[i];\n cDst.style = {};\n cDst.comment = undefined;\n }\n }\n\n /**\n * Iterate over all non-null cells in a row\n */\n eachCell(callback: (cell: Cell, colNumber: number) => void): void;\n /**\n * Iterate over all cells in a row (including empty cells)\n */\n eachCell(\n opt: { includeEmpty?: boolean },\n callback: (cell: Cell, colNumber: number) => void\n ): void;\n eachCell(\n optOrCallback: { includeEmpty?: boolean } | ((cell: Cell, colNumber: number) => void),\n maybeCallback?: (cell: Cell, colNumber: number) => void\n ): void {\n let options: { includeEmpty?: boolean } | null = null;\n let callback: (cell: Cell, colNumber: number) => void;\n if (typeof optOrCallback === \"function\") {\n callback = optOrCallback;\n } else {\n options = optOrCallback;\n callback = maybeCallback!;\n }\n if (options && options.includeEmpty) {\n const n = this._cells.length;\n for (let i = 1; i <= n; i++) {\n callback(this.getCell(i), i);\n }\n } else {\n this._cells.forEach((cell, index) => {\n if (cell && cell.type !== Enums.ValueType.Null) {\n callback(cell, index + 1);\n }\n });\n }\n }\n\n // ===========================================================================\n // Page Breaks\n addPageBreak(lft?: number, rght?: number): void {\n const ws = this._worksheet;\n const left = Math.max(0, (lft || 0) - 1) || 0;\n const right = Math.max(0, (rght || 0) - 1) || 16838;\n const pb: RowBreak = {\n id: this._number,\n max: right,\n man: 1\n };\n if (left) {\n pb.min = left;\n }\n\n ws.rowBreaks.push(pb);\n }\n\n /**\n * Get a row as a sparse array\n */\n get values(): CellValue[] {\n const values: CellValue[] = [];\n this._cells.forEach(cell => {\n if (cell && cell.type !== Enums.ValueType.Null) {\n values[cell.col] = cell.value;\n }\n });\n return values;\n }\n\n /**\n * Set the values by contiguous or sparse array, or by key'd object literal\n */\n set values(value: RowValues) {\n // this operation is not additive - any prior cells are removed\n this._cells = [];\n if (!value) {\n // empty row\n } else if (value instanceof Array) {\n let offset = 0;\n if (Object.prototype.hasOwnProperty.call(value, \"0\")) {\n // contiguous array - start at column 1\n offset = 1;\n }\n value.forEach((item, index) => {\n if (item !== undefined) {\n this.getCellEx({\n address: colCache.encodeAddress(this._number, index + offset),\n row: this._number,\n col: index + offset\n }).value = item;\n }\n });\n } else {\n // assume object with column keys\n this._worksheet.eachColumnKey((column: Column, key: string) => {\n if (value[key] !== undefined) {\n this.getCellEx({\n address: colCache.encodeAddress(this._number, column.number),\n row: this._number,\n col: column.number\n }).value = value[key];\n }\n });\n }\n }\n\n /**\n * Get row values as a 0-based sparse array (column 1 => index 0).\n *\n * This is useful when you want to compare/stringify values without the\n * leading separator produced by the 1-based sparse array returned by `values`.\n */\n getValues(): CellValue[] {\n const values: CellValue[] = [];\n this._cells.forEach(cell => {\n if (cell && cell.type !== Enums.ValueType.Null) {\n values[cell.col - 1] = cell.value;\n }\n });\n return values;\n }\n\n /**\n * Convenience stringification for row values.\n *\n * Equivalent to `row.getValues().join(separator)`.\n */\n valuesToString(separator = \",\"): string {\n return this.getValues().join(separator);\n }\n\n /**\n * Returns true if the row includes at least one cell with a value\n */\n get hasValues(): boolean {\n return this._cells.some(cell => cell && cell.type !== Enums.ValueType.Null);\n }\n\n /**\n * Number of cells including empty ones\n */\n get cellCount(): number {\n return this._cells.length;\n }\n\n /**\n * Number of non-empty cells\n */\n get actualCellCount(): number {\n let count = 0;\n this.eachCell(() => {\n count++;\n });\n return count;\n }\n\n /**\n * Get the min and max column number for the non-null cells in this row or null\n */\n get dimensions(): RowDimensions | null {\n let min = 0;\n let max = 0;\n this._cells.forEach(cell => {\n if (cell && cell.type !== Enums.ValueType.Null) {\n if (!min || min > cell.col) {\n min = cell.col;\n }\n if (max < cell.col) {\n max = cell.col;\n }\n }\n });\n return min > 0\n ? {\n min,\n max\n }\n : null;\n }\n\n // =========================================================================\n // styles\n private _applyStyle<K extends keyof Style>(name: K, value: Style[K]): void {\n this.style[name] = value;\n this._cells.forEach(cell => {\n if (cell) {\n cell.style[name] = value;\n }\n });\n }\n\n get numFmt(): string | NumFmt | undefined {\n return this.style.numFmt;\n }\n\n set numFmt(value: string | undefined) {\n if (value !== undefined) {\n this._applyStyle(\"numFmt\", value);\n }\n }\n\n get font(): Partial<Font> | undefined {\n return this.style.font;\n }\n\n set font(value: Partial<Font> | undefined) {\n if (value !== undefined) {\n this._applyStyle(\"font\", value);\n }\n }\n\n get alignment(): Partial<Alignment> | undefined {\n return this.style.alignment;\n }\n\n set alignment(value: Partial<Alignment> | undefined) {\n if (value !== undefined) {\n this._applyStyle(\"alignment\", value);\n }\n }\n\n get protection(): Partial<Protection> | undefined {\n return this.style.protection;\n }\n\n set protection(value: Partial<Protection> | undefined) {\n if (value !== undefined) {\n this._applyStyle(\"protection\", value);\n }\n }\n\n get border(): Partial<Borders> | undefined {\n return this.style.border;\n }\n\n set border(value: Partial<Borders> | undefined) {\n if (value !== undefined) {\n this._applyStyle(\"border\", value);\n }\n }\n\n get fill(): Fill | undefined {\n return this.style.fill;\n }\n\n set fill(value: Fill | undefined) {\n if (value !== undefined) {\n this._applyStyle(\"fill\", value);\n }\n }\n\n get hidden(): boolean {\n return !!this._hidden;\n }\n\n set hidden(value: boolean) {\n this._hidden = value;\n }\n\n get outlineLevel(): number {\n return this._outlineLevel || 0;\n }\n\n set outlineLevel(value: number) {\n this._outlineLevel = value;\n }\n\n get collapsed(): boolean {\n return !!(\n this._outlineLevel && this._outlineLevel >= this._worksheet.properties.outlineLevelRow\n );\n }\n\n // =========================================================================\n get model(): RowModel | null {\n const cells: CellModel[] = [];\n let min = 0;\n let max = 0;\n this._cells.forEach(cell => {\n if (cell) {\n const cellModel = cell.model;\n if (cellModel) {\n if (!min || min > cell.col) {\n min = cell.col;\n }\n if (max < cell.col) {\n max = cell.col;\n }\n cells.push(cellModel);\n }\n }\n });\n\n return this.height || cells.length\n ? {\n cells,\n number: this.number,\n min,\n max,\n height: this.height,\n style: this.style,\n hidden: this.hidden,\n outlineLevel: this.outlineLevel,\n collapsed: this.collapsed\n }\n : null;\n }\n\n set model(value: RowModel) {\n if (value.number !== this._number) {\n throw new Error(\"Invalid row number in model\");\n }\n this._cells = [];\n let previousAddress: CellAddress | undefined;\n value.cells.forEach(cellModel => {\n switch (cellModel.type) {\n case Cell.Types.Merge:\n // special case - don't add this types\n break;\n default: {\n let address: CellAddress | undefined;\n if (cellModel.address) {\n address = colCache.decodeAddress(cellModel.address);\n } else if (previousAddress) {\n // This is a <c> element without an r attribute\n // Assume that it's the cell for the next column\n const { row } = previousAddress;\n const col = previousAddress.col + 1;\n address = {\n row,\n col,\n address: colCache.encodeAddress(row, col),\n $col$row: `$${colCache.n2l(col)}$${row}`\n };\n }\n previousAddress = address;\n const cell = this.getCellEx(address);\n cell.model = cellModel;\n break;\n }\n }\n });\n\n if (value.height) {\n this.height = value.height;\n } else {\n delete this.height;\n }\n\n this.hidden = value.hidden;\n this.outlineLevel = value.outlineLevel || 0;\n\n this.style = (value.style && JSON.parse(JSON.stringify(value.style))) || {};\n }\n}\n\nexport { Row };\n","import { colCache } from \"@excel/utils/col-cache\";\nimport { isEqual } from \"@excel/utils/under-dash\";\nimport { Enums } from \"@excel/enums\";\nimport type { Cell, CellValueType } from \"@excel/cell\";\nimport type { Row } from \"@excel/row\";\nimport type { Worksheet } from \"@excel/worksheet\";\nimport type {\n Style,\n NumFmt,\n Font,\n Alignment,\n Protection,\n Borders,\n Fill,\n CellValue,\n ColBreak\n} from \"@excel/types\";\n\nconst DEFAULT_COLUMN_WIDTH = 9;\n\n/** Header value type - can be a single value or array for multi-row headers */\nexport type ColumnHeaderValue = CellValue | CellValue[];\n\nexport interface ColumnDefn {\n /** Column header value(s). Can be string, Date, number, or any CellValue type */\n header?: ColumnHeaderValue;\n key?: string;\n width?: number;\n outlineLevel?: number;\n hidden?: boolean;\n style?: Partial<Style>;\n}\n\nexport interface ColumnModel {\n min: number;\n max: number;\n width?: number;\n style?: Partial<Style>;\n isCustomWidth?: boolean;\n hidden?: boolean;\n outlineLevel?: number;\n collapsed?: boolean;\n}\n\n/**\n * Column defines the column properties for 1 column.\n * This includes header rows, widths, key, (style), etc.\n * Worksheet will condense the columns as appropriate during serialization\n */\nclass Column {\n declare private _worksheet: Worksheet;\n declare private _number: number;\n declare private _header: ColumnHeaderValue | undefined;\n declare private _key: string | undefined;\n /** The width of the column */\n declare public width?: number;\n declare private _hidden: boolean | undefined;\n declare private _outlineLevel: number | undefined;\n /** Styles applied to the column */\n declare public style: Partial<Style>;\n\n constructor(worksheet: Worksheet, number: number, defn?: ColumnDefn | false) {\n this._worksheet = worksheet;\n this._number = number;\n if (defn !== false) {\n // sometimes defn will follow\n this.defn = defn;\n }\n }\n\n get number(): number {\n return this._number;\n }\n\n get worksheet(): Worksheet {\n return this._worksheet;\n }\n\n /**\n * Column letter key\n */\n get letter(): string {\n return colCache.n2l(this._number);\n }\n\n get isCustomWidth(): boolean {\n return this.width !== undefined && this.width !== DEFAULT_COLUMN_WIDTH;\n }\n\n get defn(): ColumnDefn {\n return {\n header: this._header,\n key: this.key,\n width: this.width,\n style: this.style,\n hidden: this.hidden,\n outlineLevel: this.outlineLevel\n };\n }\n\n set defn(value: ColumnDefn | undefined) {\n if (value) {\n this.key = value.key;\n this.width = value.width !== undefined ? value.width : DEFAULT_COLUMN_WIDTH;\n this.outlineLevel = value.outlineLevel;\n if (value.style) {\n this.style = value.style;\n } else {\n this.style = {};\n }\n\n // headers must be set after style\n this.header = value.header;\n this._hidden = !!value.hidden;\n } else {\n delete this._header;\n delete this._key;\n delete this.width;\n this.style = {};\n this.outlineLevel = 0;\n }\n }\n\n /**\n * Get header values as an array (for multi-row header support)\n */\n get headers(): CellValue[] {\n if (Array.isArray(this._header)) {\n return this._header;\n }\n if (this._header !== undefined) {\n return [this._header];\n }\n return [];\n }\n\n /**\n * Can be a single value or an array for multi-row headers.\n * Supports any CellValue type including Date, number, string, etc.\n */\n get header(): ColumnHeaderValue | undefined {\n return this._header;\n }\n\n set header(value: ColumnHeaderValue | undefined) {\n if (value !== undefined) {\n this._header = value;\n this.headers.forEach((cellValue, index) => {\n this._worksheet.getCell(index + 1, this.number).value = cellValue;\n });\n } else {\n this._header = undefined;\n }\n }\n\n /**\n * The name of the properties associated with this column in each row\n */\n get key(): string | undefined {\n return this._key;\n }\n\n set key(value: string | undefined) {\n const column = this._key && this._worksheet.getColumnKey(this._key);\n if (column === this) {\n this._worksheet.deleteColumnKey(this._key);\n }\n\n this._key = value;\n if (value) {\n this._worksheet.setColumnKey(this._key, this);\n }\n }\n\n /**\n * Hides the column\n */\n get hidden(): boolean {\n return !!this._hidden;\n }\n\n set hidden(value: boolean) {\n this._hidden = value;\n }\n\n /**\n * Set an outline level for columns\n */\n get outlineLevel(): number {\n return this._outlineLevel || 0;\n }\n\n set outlineLevel(value: number | undefined) {\n this._outlineLevel = value;\n }\n\n /**\n * Indicate the collapsed state based on outlineLevel\n */\n get collapsed(): boolean {\n return !!(\n this._outlineLevel && this._outlineLevel >= this._worksheet.properties.outlineLevelCol\n );\n }\n\n toString(): string {\n return JSON.stringify({\n key: this.key,\n width: this.width,\n headers: this.headers.length ? this.headers : undefined\n });\n }\n\n equivalentTo(other: Column): boolean {\n return (\n this.width === other.width &&\n this.hidden === other.hidden &&\n this.outlineLevel === other.outlineLevel &&\n isEqual(this.style, other.style)\n );\n }\n\n equivalentToModel(model: ColumnModel): boolean {\n return (\n this.width === model.width &&\n this.hidden === model.hidden &&\n this.outlineLevel === model.outlineLevel &&\n isEqual(this.style, model.style)\n );\n }\n\n get isDefault(): boolean {\n if (this.isCustomWidth) {\n return false;\n }\n if (this.hidden) {\n return false;\n }\n if (this.outlineLevel) {\n return false;\n }\n const s = this.style;\n if (s && (s.font || s.numFmt || s.alignment || s.border || s.fill || s.protection)) {\n return false;\n }\n return true;\n }\n\n get headerCount(): number {\n return this.headers.length;\n }\n\n /**\n * Iterate over all current cells in this column\n */\n eachCell(callback: (cell: Cell, rowNumber: number) => void): void;\n /**\n * Iterate over all current cells in this column including empty cells\n */\n eachCell(\n opt: { includeEmpty?: boolean },\n callback: (cell: Cell, rowNumber: number) => void\n ): void;\n eachCell(\n optionsOrCallback: { includeEmpty?: boolean } | ((cell: Cell, rowNumber: number) => void),\n maybeCallback?: (cell: Cell, rowNumber: number) => void\n ): void {\n const colNumber = this.number;\n let options: { includeEmpty?: boolean };\n let callback: (cell: Cell, rowNumber: number) => void;\n if (typeof optionsOrCallback === \"function\") {\n options = {};\n callback = optionsOrCallback;\n } else {\n options = optionsOrCallback;\n callback = maybeCallback!;\n }\n this._worksheet.eachRow(options, (row: Row, rowNumber: number) => {\n callback(row.getCell(colNumber), rowNumber);\n });\n }\n\n /**\n * The cell values in the column\n */\n get values(): CellValueType[] {\n const v: CellValueType[] = [];\n this.eachCell((cell, rowNumber) => {\n if (cell && cell.type !== Enums.ValueType.Null) {\n v[rowNumber] = cell.value;\n }\n });\n return v;\n }\n\n set values(v: CellValueType[]) {\n if (!v) {\n return;\n }\n const colNumber = this.number;\n let offset = 0;\n if (Object.prototype.hasOwnProperty.call(v, \"0\")) {\n // assume contiguous array, start at row 1\n offset = 1;\n }\n v.forEach((value, index) => {\n this._worksheet.getCell(index + offset, colNumber).value = value;\n });\n }\n\n // =========================================================================\n // Page Breaks\n\n /**\n * Add a page break after this column.\n * @param top - Optional top row limit for the page break (1-indexed)\n * @param bottom - Optional bottom row limit for the page break (1-indexed)\n */\n addPageBreak(top?: number, bottom?: number): void {\n const ws = this._worksheet;\n const topRow = Math.max(0, (top || 0) - 1) || 0;\n const bottomRow = Math.max(0, (bottom || 0) - 1) || 1048575;\n const pb: ColBreak = {\n id: this._number,\n max: bottomRow,\n man: 1\n };\n if (topRow) {\n pb.min = topRow;\n }\n\n ws.colBreaks.push(pb);\n }\n\n // =========================================================================\n // styles\n get numFmt(): string | NumFmt | undefined {\n return this.style.numFmt;\n }\n\n set numFmt(value: string | undefined) {\n this.style.numFmt = value;\n this.eachCell(cell => {\n cell.numFmt = value;\n });\n }\n\n get font(): Partial<Font> | undefined {\n return this.style.font;\n }\n\n set font(value: Partial<Font> | undefined) {\n this.style.font = value;\n this.eachCell(cell => {\n cell.font = value;\n });\n }\n\n get alignment(): Partial<Alignment> | undefined {\n return this.style.alignment;\n }\n\n set alignment(value: Partial<Alignment> | undefined) {\n this.style.alignment = value;\n this.eachCell(cell => {\n cell.alignment = value;\n });\n }\n\n get protection(): Partial<Protection> | undefined {\n return this.style.protection;\n }\n\n set protection(value: Partial<Protection> | undefined) {\n this.style.protection = value;\n this.eachCell(cell => {\n cell.protection = value;\n });\n }\n\n get border(): Partial<Borders> | undefined {\n return this.style.border;\n }\n\n set border(value: Partial<Borders> | undefined) {\n this.style.border = value;\n this.eachCell(cell => {\n cell.border = value;\n });\n }\n\n get fill(): Fill | undefined {\n return this.style.fill;\n }\n\n set fill(value: Fill | undefined) {\n this.style.fill = value;\n this.eachCell(cell => {\n cell.fill = value;\n });\n }\n\n // =============================================================================\n // static functions\n\n static toModel(columns: Column[]): ColumnModel[] | undefined {\n // Convert array of Column into compressed list cols\n const cols: ColumnModel[] = [];\n let col: ColumnModel | null = null;\n if (columns) {\n columns.forEach((column, index) => {\n if (column.isDefault) {\n if (col) {\n col = null;\n }\n } else if (!col || !column.equivalentToModel(col)) {\n col = {\n min: index + 1,\n max: index + 1,\n width: column.width !== undefined ? column.width : DEFAULT_COLUMN_WIDTH,\n style: column.style,\n isCustomWidth: column.isCustomWidth,\n hidden: column.hidden,\n outlineLevel: column.outlineLevel,\n collapsed: column.collapsed\n };\n cols.push(col);\n } else {\n col.max = index + 1;\n }\n });\n }\n return cols.length ? cols : undefined;\n }\n\n static fromModel(cols: ColumnModel[]): Column[] | null;\n static fromModel(worksheet: Worksheet, cols: ColumnModel[]): Column[] | null;\n static fromModel(\n worksheetOrCols: Worksheet | ColumnModel[],\n colsMaybe?: ColumnModel[]\n ): Column[] | null {\n // Streaming readers historically called Column.fromModel(cols) without a Worksheet.\n // Preserve that behavior by accepting the 1-arg form and intentionally using the\n // cols array as the backing \"worksheet\" object.\n const worksheet: Worksheet = Array.isArray(worksheetOrCols)\n ? (worksheetOrCols as any as Worksheet)\n : worksheetOrCols;\n let cols: ColumnModel[] = Array.isArray(worksheetOrCols) ? worksheetOrCols : (colsMaybe ?? []);\n\n cols = cols || [];\n const columns: Column[] = [];\n let count = 1;\n let index = 0;\n /**\n * sort cols by min\n * If it is not sorted, the subsequent column configuration will be overwritten\n * */\n cols = cols.sort(function (pre, next) {\n return pre.min - next.min;\n });\n while (index < cols.length) {\n const col = cols[index++];\n while (count < col.min) {\n columns.push(new Column(worksheet, count++));\n }\n while (count <= col.max) {\n columns.push(new Column(worksheet, count++, col));\n }\n }\n return columns.length ? columns : null;\n }\n}\n\nexport { Column };\n","import { colCache } from \"@excel/utils/col-cache\";\nimport type { Worksheet } from \"@excel/worksheet\";\n\ninterface AnchorModel {\n nativeCol: number;\n nativeRow: number;\n nativeColOff: number;\n nativeRowOff: number;\n}\n\ninterface SimpleAddress {\n col: number;\n row: number;\n}\n\ntype AddressInput = string | AnchorModel | SimpleAddress;\n\nfunction isAnchorModel(value: AddressInput): value is AnchorModel {\n return (\n typeof value === \"object\" &&\n \"nativeCol\" in value &&\n \"nativeRow\" in value &&\n \"nativeColOff\" in value &&\n \"nativeRowOff\" in value\n );\n}\n\nfunction isSimpleAddress(value: AddressInput): value is SimpleAddress {\n return typeof value === \"object\" && \"col\" in value && \"row\" in value;\n}\n\nclass Anchor {\n declare public nativeCol: number;\n declare public nativeRow: number;\n declare public nativeColOff: number;\n declare public nativeRowOff: number;\n declare public worksheet?: Worksheet;\n\n constructor(worksheet?: Worksheet, address?: AddressInput | null, offset: number = 0) {\n this.worksheet = worksheet;\n\n if (!address) {\n this.nativeCol = 0;\n this.nativeColOff = 0;\n this.nativeRow = 0;\n this.nativeRowOff = 0;\n } else if (typeof address === \"string\") {\n const decoded = colCache.decodeAddress(address);\n this.nativeCol = decoded.col + offset;\n this.nativeColOff = 0;\n this.nativeRow = decoded.row + offset;\n this.nativeRowOff = 0;\n } else if (isAnchorModel(address)) {\n this.nativeCol = address.nativeCol || 0;\n this.nativeColOff = address.nativeColOff || 0;\n this.nativeRow = address.nativeRow || 0;\n this.nativeRowOff = address.nativeRowOff || 0;\n } else if (isSimpleAddress(address)) {\n this.col = address.col + offset;\n this.row = address.row + offset;\n } else {\n this.nativeCol = 0;\n this.nativeColOff = 0;\n this.nativeRow = 0;\n this.nativeRowOff = 0;\n }\n }\n\n static asInstance(model: AddressInput | Anchor | null | undefined): Anchor | null {\n if (model == null) {\n return null;\n }\n if (model instanceof Anchor) {\n return model;\n }\n return new Anchor(undefined, model);\n }\n\n get col(): number {\n return this.nativeCol + Math.min(this.colWidth - 1, this.nativeColOff) / this.colWidth;\n }\n\n set col(v: number) {\n this.nativeCol = Math.floor(v);\n this.nativeColOff = Math.floor((v - this.nativeCol) * this.colWidth);\n }\n\n get row(): number {\n return this.nativeRow + Math.min(this.rowHeight - 1, this.nativeRowOff) / this.rowHeight;\n }\n\n set row(v: number) {\n this.nativeRow = Math.floor(v);\n this.nativeRowOff = Math.floor((v - this.nativeRow) * this.rowHeight);\n }\n\n get colWidth(): number {\n return this.worksheet &&\n this.worksheet.getColumn(this.nativeCol + 1) &&\n this.worksheet.getColumn(this.nativeCol + 1).isCustomWidth\n ? Math.floor(this.worksheet.getColumn(this.nativeCol + 1).width! * 10000)\n : 640000;\n }\n\n get rowHeight(): number {\n return this.worksheet &&\n this.worksheet.getRow(this.nativeRow + 1) &&\n this.worksheet.getRow(this.nativeRow + 1).height\n ? Math.floor(this.worksheet.getRow(this.nativeRow + 1).height * 10000)\n : 180000;\n }\n\n get model(): AnchorModel {\n return {\n nativeCol: this.nativeCol,\n nativeColOff: this.nativeColOff,\n nativeRow: this.nativeRow,\n nativeRowOff: this.nativeRowOff\n };\n }\n\n set model(value: AnchorModel) {\n this.nativeCol = value.nativeCol;\n this.nativeColOff = value.nativeColOff;\n this.nativeRow = value.nativeRow;\n this.nativeRowOff = value.nativeRowOff;\n }\n}\n\nexport { Anchor };\nexport type { AnchorModel };\n\ntype IAnchor = Pick<\n InstanceType<typeof Anchor>,\n \"col\" | \"row\" | \"nativeCol\" | \"nativeRow\" | \"nativeColOff\" | \"nativeRowOff\"\n>;\nexport type { IAnchor };\n","import { colCache } from \"@excel/utils/col-cache\";\nimport { Anchor, type AnchorModel } from \"@excel/anchor\";\nimport type { Worksheet } from \"@excel/worksheet\";\n\ninterface ImageHyperlinks {\n hyperlink?: string;\n tooltip?: string;\n}\n\ninterface ImageExt {\n width?: number;\n height?: number;\n}\n\ninterface ImageRange {\n tl: Anchor;\n br?: Anchor;\n ext?: ImageExt;\n editAs?: string;\n hyperlinks?: ImageHyperlinks;\n}\n\ninterface BackgroundModel {\n type: \"background\";\n imageId: string;\n}\n\ninterface ImageRangeModel {\n tl: AnchorModel;\n br?: AnchorModel;\n ext?: ImageExt;\n editAs?: string;\n}\n\ninterface ImageModel {\n type: \"image\";\n imageId: string;\n hyperlinks?: ImageHyperlinks;\n range: ImageRangeModel;\n}\n\ntype Model = BackgroundModel | ImageModel;\ntype ImageModelInput = ModelInput;\n\ninterface RangeInput {\n tl?: AnchorModel | { col: number; row: number } | string;\n br?: AnchorModel | { col: number; row: number } | string;\n ext?: ImageExt;\n editAs?: string;\n hyperlinks?: ImageHyperlinks;\n}\n\ninterface ModelInput {\n type: string;\n imageId: string;\n range?: string | RangeInput | ImageRangeModel;\n hyperlinks?: ImageHyperlinks;\n}\n\nclass Image {\n worksheet: Worksheet;\n type?: string;\n imageId?: string;\n range?: ImageRange;\n\n constructor(worksheet: Worksheet, model?: ModelInput) {\n this.worksheet = worksheet;\n if (model) {\n this.model = model;\n }\n }\n\n get model(): Model {\n switch (this.type) {\n case \"background\":\n return {\n type: this.type,\n imageId: this.imageId!\n };\n case \"image\":\n return {\n type: this.type,\n imageId: this.imageId!,\n hyperlinks: this.range!.hyperlinks,\n range: {\n tl: this.range!.tl.model,\n br: this.range!.br && this.range!.br.model,\n ext: this.range!.ext,\n editAs: this.range!.editAs\n }\n };\n default:\n throw new Error(\"Invalid Image Type\");\n }\n }\n\n set model({ type, imageId, range, hyperlinks }: ModelInput) {\n this.type = type;\n this.imageId = imageId;\n\n if (type === \"image\") {\n if (typeof range === \"string\") {\n const decoded = colCache.decode(range);\n if (\"top\" in decoded) {\n // It's a Location (range like \"A1:C3\")\n this.range = {\n tl: new Anchor(this.worksheet, { col: decoded.left, row: decoded.top }, -1),\n br: new Anchor(this.worksheet, { col: decoded.right, row: decoded.bottom }, 0),\n editAs: \"oneCell\"\n };\n }\n } else if (range) {\n this.range = {\n tl: new Anchor(this.worksheet, range.tl, 0),\n br: range.br ? new Anchor(this.worksheet, range.br, 0) : undefined,\n ext: range.ext,\n editAs: range.editAs,\n hyperlinks: hyperlinks || (\"hyperlinks\" in range ? range.hyperlinks : undefined)\n };\n }\n }\n }\n}\n\nexport { Image, type Model as ImageModel, type ImageModelInput };\n","import { colCache } from \"@excel/utils/col-cache\";\nimport type {\n Address,\n CellFormulaValue,\n CellValue,\n Style,\n TableColumnProperties,\n TableStyleProperties\n} from \"@excel/types\";\nimport type { Worksheet } from \"@excel/worksheet\";\nimport type { Cell } from \"@excel/cell\";\n\ninterface TableModel {\n ref: string;\n name: string;\n displayName?: string;\n columns: TableColumnProperties[];\n rows: CellValue[][];\n headerRow?: boolean;\n totalsRow?: boolean;\n style?: TableStyleProperties;\n tl?: Address;\n autoFilterRef?: string;\n tableRef?: string;\n}\n\ninterface CacheState {\n ref: string;\n width: number;\n tableHeight: number;\n}\n\nclass Column {\n // wrapper around column model, allowing access and manipulation\n table: Table;\n column: TableColumnProperties;\n index: number;\n\n constructor(table: Table, column: TableColumnProperties, index: number) {\n this.table = table;\n this.column = column;\n this.index = index;\n }\n\n private _set<K extends keyof TableColumnProperties>(\n name: K,\n value: TableColumnProperties[K]\n ): void {\n this.table.cacheState();\n this.column[name] = value;\n }\n\n get name(): string {\n return this.column.name;\n }\n set name(value: string) {\n this._set(\"name\", value);\n }\n\n get filterButton(): boolean | undefined {\n return this.column.filterButton;\n }\n set filterButton(value: boolean | undefined) {\n this.column.filterButton = value;\n }\n\n get style(): Partial<Style> | undefined {\n return this.column.style;\n }\n set style(value: Partial<Style> | undefined) {\n this.column.style = value;\n }\n\n get totalsRowLabel(): string | undefined {\n return this.column.totalsRowLabel;\n }\n set totalsRowLabel(value: string | undefined) {\n this._set(\"totalsRowLabel\", value);\n }\n\n get totalsRowFunction(): TableColumnProperties[\"totalsRowFunction\"] {\n return this.column.totalsRowFunction;\n }\n set totalsRowFunction(value: TableColumnProperties[\"totalsRowFunction\"]) {\n this._set(\"totalsRowFunction\", value);\n }\n\n get totalsRowResult(): CellValue {\n return this.column.totalsRowResult;\n }\n set totalsRowResult(value: CellFormulaValue[\"result\"]) {\n this._set(\"totalsRowResult\", value);\n }\n\n get totalsRowFormula(): string | undefined {\n return this.column.totalsRowFormula;\n }\n set totalsRowFormula(value: string | undefined) {\n this._set(\"totalsRowFormula\", value);\n }\n}\n\nclass Table {\n worksheet: Worksheet;\n table!: TableModel;\n declare private _cache?: CacheState;\n\n constructor(worksheet: Worksheet, table?: TableModel) {\n this.worksheet = worksheet;\n if (table) {\n this.table = table;\n // check things are ok first\n this.validate();\n\n this.store();\n }\n }\n\n getFormula(column: TableColumnProperties): string | null {\n // get the correct formula to apply to the totals row\n switch (column.totalsRowFunction) {\n case \"none\":\n return null;\n case \"average\":\n return `SUBTOTAL(101,${this.table.name}[${column.name}])`;\n case \"countNums\":\n return `SUBTOTAL(102,${this.table.name}[${column.name}])`;\n case \"count\":\n return `SUBTOTAL(103,${this.table.name}[${column.name}])`;\n case \"max\":\n return `SUBTOTAL(104,${this.table.name}[${column.name}])`;\n case \"min\":\n return `SUBTOTAL(105,${this.table.name}[${column.name}])`;\n case \"stdDev\":\n return `SUBTOTAL(106,${this.table.name}[${column.name}])`;\n case \"var\":\n return `SUBTOTAL(107,${this.table.name}[${column.name}])`;\n case \"sum\":\n return `SUBTOTAL(109,${this.table.name}[${column.name}])`;\n case \"custom\":\n return column.totalsRowFormula || null;\n default:\n throw new Error(`Invalid Totals Row Function: ${column.totalsRowFunction}`);\n }\n }\n\n get width(): number {\n // width of the table\n return this.table.columns.length;\n }\n\n get height(): number {\n // height of the table data\n return this.table.rows.length;\n }\n\n get filterHeight(): number {\n // height of the table data plus optional header row\n return this.height + (this.table.headerRow ? 1 : 0);\n }\n\n get tableHeight(): number {\n // full height of the table on the sheet\n return this.filterHeight + (this.table.totalsRow ? 1 : 0);\n }\n\n validate(): void {\n const { table } = this;\n // set defaults and check is valid\n const assign = <T extends object, K extends keyof T>(o: T, name: K, dflt: T[K]): void => {\n if (o[name] === undefined) {\n o[name] = dflt;\n }\n };\n assign(table, \"headerRow\", true);\n assign(table, \"totalsRow\", false);\n\n assign(table, \"style\", {});\n assign(table.style, \"theme\", \"TableStyleMedium2\");\n assign(table.style, \"showFirstColumn\", false);\n assign(table.style, \"showLastColumn\", false);\n assign(table.style, \"showRowStripes\", false);\n assign(table.style, \"showColumnStripes\", false);\n\n const assert = (test: boolean, message: string) => {\n if (!test) {\n throw new Error(message);\n }\n };\n assert(!!table.ref, \"Table must have ref\");\n assert(!!table.columns, \"Table must have column definitions\");\n assert(!!table.rows, \"Table must have row definitions\");\n\n table.tl = colCache.decodeAddress(table.ref);\n const { row, col } = table.tl;\n assert(row > 0, \"Table must be on valid row\");\n assert(col > 0, \"Table must be on valid col\");\n\n const { width, filterHeight, tableHeight } = this;\n\n // autoFilterRef is a range that includes optional headers only\n table.autoFilterRef = colCache.encode(row, col, row + filterHeight - 1, col + width - 1);\n\n // tableRef is a range that includes optional headers and totals\n table.tableRef = colCache.encode(row, col, row + tableHeight - 1, col + width - 1);\n\n table.columns.forEach((column, i) => {\n assert(!!column.name, `Column ${i} must have a name`);\n if (i === 0) {\n assign(column, \"totalsRowLabel\", \"Total\");\n } else {\n assign(column, \"totalsRowFunction\", \"none\");\n column.totalsRowFormula = this.getFormula(column) || undefined;\n }\n });\n }\n\n store(): void {\n // where the table needs to store table data, headers, footers in\n // the sheet...\n const assignStyle = (cell: Cell, style: Partial<Style> | undefined): void => {\n if (style) {\n Object.assign(cell.style, style);\n }\n };\n\n const { worksheet, table } = this;\n const { row, col } = table.tl;\n let count = 0;\n if (table.headerRow) {\n const r = worksheet.getRow(row + count++);\n table.columns.forEach((column, j) => {\n const { style, name } = column;\n const cell = r.getCell(col + j);\n cell.value = name;\n assignStyle(cell, style);\n });\n }\n table.rows.forEach(data => {\n const r = worksheet.getRow(row + count++);\n data.forEach((value, j) => {\n const cell = r.getCell(col + j);\n cell.value = value;\n\n assignStyle(cell, table.columns[j].style);\n });\n });\n\n if (table.totalsRow) {\n const r = worksheet.getRow(row + count++);\n table.columns.forEach((column, j) => {\n const cell = r.getCell(col + j);\n if (j === 0) {\n cell.value = column.totalsRowLabel;\n } else {\n const formula = this.getFormula(column);\n if (formula) {\n cell.value = {\n formula: column.totalsRowFormula,\n result: column.totalsRowResult\n };\n } else {\n cell.value = null;\n }\n }\n\n assignStyle(cell, column.style);\n });\n }\n }\n\n load(worksheet: Worksheet): void {\n // where the table will read necessary features from a loaded sheet\n const { table } = this;\n const { row, col } = table.tl!;\n let count = 0;\n if (table.headerRow) {\n const r = worksheet.getRow(row + count++);\n table.columns.forEach((column, j) => {\n const cell = r.getCell(col + j);\n cell.value = column.name;\n });\n }\n table.rows.forEach(data => {\n const r = worksheet.getRow(row + count++);\n data.forEach((value, j) => {\n const cell = r.getCell(col + j);\n cell.value = value;\n });\n });\n\n if (table.totalsRow) {\n const r = worksheet.getRow(row + count++);\n table.columns.forEach((column, j) => {\n const cell = r.getCell(col + j);\n if (j === 0) {\n cell.value = column.totalsRowLabel;\n } else {\n const formula = this.getFormula(column);\n if (formula) {\n cell.value = {\n formula: column.totalsRowFormula,\n result: column.totalsRowResult\n };\n }\n }\n });\n }\n }\n\n get model(): TableModel {\n return this.table;\n }\n\n set model(value: TableModel) {\n this.table = value;\n }\n\n // ================================================================\n // TODO: Mutating methods\n cacheState(): void {\n if (!this._cache) {\n this._cache = {\n ref: this.ref,\n width: this.width,\n tableHeight: this.tableHeight\n };\n }\n }\n\n commit(): void {\n // changes may have been made that might have on-sheet effects\n if (!this._cache) {\n return;\n }\n\n // check things are ok first\n this.validate();\n\n const ref = colCache.decodeAddress(this._cache.ref);\n if (this.ref !== this._cache.ref) {\n // wipe out whole table footprint at previous location\n for (let i = 0; i < this._cache.tableHeight; i++) {\n const row = this.worksheet.getRow(ref.row + i);\n for (let j = 0; j < this._cache.width; j++) {\n const cell = row.getCell(ref.col + j);\n cell.value = null;\n }\n }\n } else {\n // clear out below table if it has shrunk\n for (let i = this.tableHeight; i < this._cache.tableHeight; i++) {\n const row = this.worksheet.getRow(ref.row + i);\n for (let j = 0; j < this._cache.width; j++) {\n const cell = row.getCell(ref.col + j);\n cell.value = null;\n }\n }\n\n // clear out to right of table if it has lost columns\n for (let i = 0; i < this.tableHeight; i++) {\n const row = this.worksheet.getRow(ref.row + i);\n for (let j = this.width; j < this._cache.width; j++) {\n const cell = row.getCell(ref.col + j);\n cell.value = null;\n }\n }\n }\n\n this.store();\n }\n\n addRow(values: CellValue[], rowNumber?: number): void {\n // Add a row of data, either insert at rowNumber or append\n this.cacheState();\n\n if (rowNumber === undefined) {\n this.table.rows.push(values);\n } else {\n this.table.rows.splice(rowNumber, 0, values);\n }\n }\n\n removeRows(rowIndex: number, count: number = 1): void {\n // Remove a rows of data\n this.cacheState();\n this.table.rows.splice(rowIndex, count);\n }\n\n getColumn(colIndex: number): Column {\n const column = this.table.columns[colIndex];\n return new Column(this, column, colIndex);\n }\n\n addColumn(column: TableColumnProperties, values: CellValue[], colIndex?: number): void {\n // Add a new column, including column defn and values\n // Inserts at colNumber or adds to the right\n this.cacheState();\n\n if (colIndex === undefined) {\n this.table.columns.push(column);\n this.table.rows.forEach((row, i) => {\n row.push(values[i]);\n });\n } else {\n this.table.columns.splice(colIndex, 0, column);\n this.table.rows.forEach((row, i) => {\n row.splice(colIndex, 0, values[i]);\n });\n }\n }\n\n removeColumns(colIndex: number, count: number = 1): void {\n // Remove a column with data\n this.cacheState();\n\n this.table.columns.splice(colIndex, count);\n this.table.rows.forEach(row => {\n row.splice(colIndex, count);\n });\n }\n\n private _assign<T extends object, K extends keyof T>(target: T, prop: K, value: T[K]): void {\n this.cacheState();\n target[prop] = value;\n }\n\n get ref(): string {\n return this.table.ref;\n }\n set ref(value: string) {\n this._assign(this.table, \"ref\", value);\n }\n\n get name(): string {\n return this.table.name;\n }\n set name(value: string) {\n this.table.name = value;\n }\n\n get displayName(): string {\n return this.table.displayName || this.table.name;\n }\n set displayName(value: string) {\n this.table.displayName = value;\n }\n\n get headerRow(): boolean | undefined {\n return this.table.headerRow;\n }\n set headerRow(value: boolean | undefined) {\n this._assign(this.table, \"headerRow\", value);\n }\n\n get totalsRow(): boolean | undefined {\n return this.table.totalsRow;\n }\n set totalsRow(value: boolean | undefined) {\n this._assign(this.table, \"totalsRow\", value);\n }\n\n get theme(): TableStyleProperties[\"theme\"] {\n return this.table.style.theme;\n }\n set theme(value: TableStyleProperties[\"theme\"]) {\n this.table.style.theme = value;\n }\n\n get showFirstColumn(): boolean | undefined {\n return this.table.style.showFirstColumn;\n }\n set showFirstColumn(value: boolean | undefined) {\n this.table.style.showFirstColumn = value;\n }\n\n get showLastColumn(): boolean | undefined {\n return this.table.style.showLastColumn;\n }\n set showLastColumn(value: boolean | undefined) {\n this.table.style.showLastColumn = value;\n }\n\n get showRowStripes(): boolean | undefined {\n return this.table.style.showRowStripes;\n }\n set showRowStripes(value: boolean | undefined) {\n this.table.style.showRowStripes = value;\n }\n\n get showColumnStripes(): boolean | undefined {\n return this.table.style.showColumnStripes;\n }\n set showColumnStripes(value: boolean | undefined) {\n this.table.style.showColumnStripes = value;\n }\n}\n\nexport { Table, type TableModel };\n","import { colCache } from \"@excel/utils/col-cache\";\n\ninterface ValidationModel {\n [address: string]: any;\n}\n\nclass DataValidations {\n model: ValidationModel;\n\n constructor(model?: ValidationModel) {\n this.model = model || {};\n }\n\n add(address: string, validation: any): any {\n return (this.model[address] = validation);\n }\n\n find(address: string): any {\n // First check direct address match\n const direct = this.model[address];\n if (direct !== undefined) {\n return direct;\n }\n\n // Check range: prefixed keys in model (from parsing ranges)\n // Only decode address if we see at least one range key.\n let decoded: { row: number; col: number } | undefined;\n for (const key in this.model) {\n if (!key.startsWith(\"range:\")) {\n continue;\n }\n\n decoded ||= colCache.decodeAddress(address);\n\n const rangeStr = key.slice(6); // Remove \"range:\" prefix\n const rangeDecoded = colCache.decodeEx(rangeStr) as any;\n if (!rangeDecoded.dimensions) {\n continue;\n }\n\n const tl = rangeDecoded.tl as { row: number; col: number };\n const br = rangeDecoded.br as { row: number; col: number };\n if (\n decoded.row >= tl.row &&\n decoded.row <= br.row &&\n decoded.col >= tl.col &&\n decoded.col <= br.col\n ) {\n return this.model[key];\n }\n }\n\n return undefined;\n }\n\n remove(address: string): void {\n this.model[address] = undefined;\n }\n}\n\nexport { DataValidations };\n","/**\n * Environment detection utilities\n * Common functions to detect runtime environment (Node.js vs Browser)\n */\n\n/**\n * Check if running in Node.js environment\n * Returns true if process.versions.node exists\n */\nexport function isNode(): boolean {\n return typeof process !== \"undefined\" && !!process.versions?.node;\n}\n\n/**\n * Check if running in browser environment\n * Returns true if window and document are defined\n */\nexport function isBrowser(): boolean {\n return typeof window !== \"undefined\" && typeof document !== \"undefined\";\n}\n","/**\n * Base utility functions shared between Node.js and Browser\n * All functions use standard Web APIs that work in both environments\n * (Node.js 16+ supports atob/btoa/TextEncoder/TextDecoder globally)\n */\n\nimport { isNode } from \"@utils/env\";\n\n// =============================================================================\n// Base64 utilities (with native Buffer optimization for Node.js)\n// =============================================================================\n\n/**\n * Convert base64 string to Uint8Array\n * Uses native Buffer in Node.js for better performance\n */\nexport function base64ToUint8Array(base64: string): Uint8Array {\n // Node.js: use native Buffer (fast, C++ implementation)\n if (isNode()) {\n return Buffer.from(base64, \"base64\");\n }\n // Browser: use atob\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\n// =============================================================================\n// Basic utilities\n// =============================================================================\n\nexport function delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\nexport function nop(): void {}\n\nexport const inherits = function <\n T extends new (...args: any[]) => any,\n S extends new (...args: any[]) => any\n>(cls: T, superCtor: S, statics?: any, prototype?: any): void {\n (cls as any).super_ = superCtor;\n\n if (!prototype) {\n prototype = statics;\n statics = null;\n }\n\n if (statics) {\n Object.keys(statics).forEach(i => {\n Object.defineProperty(cls, i, Object.getOwnPropertyDescriptor(statics, i)!);\n });\n }\n\n const properties: PropertyDescriptorMap = {\n constructor: {\n value: cls,\n enumerable: false,\n writable: false,\n configurable: true\n }\n };\n if (prototype) {\n Object.keys(prototype).forEach(i => {\n properties[i] = Object.getOwnPropertyDescriptor(prototype, i)!;\n });\n }\n\n cls.prototype = Object.create(superCtor.prototype, properties);\n};\n\n// =============================================================================\n// Date utilities\n// =============================================================================\n\nexport function dateToExcel(d: Date, date1904?: boolean): number {\n return 25569 + d.getTime() / (24 * 3600 * 1000) - (date1904 ? 1462 : 0);\n}\n\nexport function excelToDate(v: number, date1904?: boolean): Date {\n const millisecondSinceEpoch = Math.round((v - 25569 + (date1904 ? 1462 : 0)) * 24 * 3600 * 1000);\n return new Date(millisecondSinceEpoch);\n}\n\nexport function toIsoDateString(dt: Date): string {\n return dt.toISOString().substr(0, 10);\n}\n\n// =============================================================================\n// Path utilities\n// =============================================================================\n\ninterface PathInfo {\n path: string;\n name: string;\n}\n\nexport function parsePath(filepath: string): PathInfo {\n const last = filepath.lastIndexOf(\"/\");\n return {\n path: filepath.substring(0, last),\n name: filepath.substring(last + 1)\n };\n}\n\nexport function getRelsPath(filepath: string): string {\n const path = parsePath(filepath);\n return `${path.path}/_rels/${path.name}.rels`;\n}\n\n// =============================================================================\n// XML utilities\n// =============================================================================\n\nconst xmlDecodingMap: Record<string, string> = {\n lt: \"<\",\n gt: \">\",\n amp: \"&\",\n quot: '\"',\n apos: \"'\"\n};\n\nexport function xmlDecode(text: string): string {\n if (text.indexOf(\"&\") === -1) {\n return text;\n }\n return text.replace(/&(#\\d+|#x[0-9A-Fa-f]+|\\w+);/g, (match: string, entity: string) => {\n if (entity[0] === \"#\") {\n // Numeric character reference\n const code = entity[1] === \"x\" ? parseInt(entity.slice(2), 16) : parseInt(entity.slice(1));\n if (Number.isNaN(code)) {\n return match;\n }\n return String.fromCodePoint(code);\n }\n return xmlDecodingMap[entity] || match;\n });\n}\n// oxlint-disable-next-line no-control-regex -- Control characters are intentionally matched for XML encoding\nconst xmlEncodeRegex = /[<>&'\"\\x7F\\x00-\\x08\\x0B-\\x0C\\x0E-\\x1F]/;\n\n/**\n * Encode special characters for XML output\n * Handles XML entities (< > & \" ') and removes invalid control characters\n */\nexport function xmlEncode(text: string): string {\n const regexResult = xmlEncodeRegex.exec(text);\n if (!regexResult) {\n return text;\n }\n\n const parts: string[] = [];\n let lastIndex = 0;\n for (let i = regexResult.index; i < text.length; i++) {\n const charCode = text.charCodeAt(i);\n let escape: string | null = null;\n switch (charCode) {\n case 34: // \"\n escape = \""\";\n break;\n case 38: // &\n escape = \"&\";\n break;\n case 39: // '\n escape = \"'\";\n break;\n case 60: // <\n escape = \"<\";\n break;\n case 62: // >\n escape = \">\";\n break;\n case 127:\n escape = \"\";\n break;\n default: {\n if (charCode <= 31 && (charCode <= 8 || (charCode >= 11 && charCode !== 13))) {\n // Remove invalid control characters\n escape = \"\";\n break;\n }\n continue;\n }\n }\n\n if (lastIndex !== i) {\n parts.push(text.substring(lastIndex, i));\n }\n lastIndex = i + 1;\n if (escape) {\n parts.push(escape);\n }\n }\n\n if (lastIndex < text.length) {\n parts.push(text.substring(lastIndex));\n }\n\n return parts.join(\"\");\n}\n// =============================================================================\n// Parsing utilities\n// =============================================================================\n\nexport function validInt(value: string | number): number {\n const i = typeof value === \"number\" ? value : parseInt(value, 10);\n return Number.isNaN(i) ? 0 : i;\n}\n\nexport function isDateFmt(fmt: string | null | undefined): boolean {\n if (!fmt) {\n return false;\n }\n // must not be a string fmt\n if (fmt.indexOf(\"@\") > -1) {\n return false;\n }\n // must remove all chars inside quotes and []\n let cleanFmt = fmt.replace(/\\[[^\\]]*\\]/g, \"\");\n cleanFmt = cleanFmt.replace(/\"[^\"]*\"/g, \"\");\n // then check for date formatting chars\n return cleanFmt.match(/[ymdhMsb]+/) !== null;\n}\n\nexport function parseBoolean(value: any): boolean {\n return value === true || value === \"true\" || value === 1 || value === \"1\";\n}\n\n// =============================================================================\n// Collection utilities\n// =============================================================================\n\nexport function* range(start: number, stop: number, step: number = 1): Generator<number> {\n const compareOrder = step > 0 ? (a: number, b: number) => a < b : (a: number, b: number) => a > b;\n for (let value = start; compareOrder(value, stop); value += step) {\n yield value;\n }\n}\n\nexport function toSortedArray(values: Iterable<any>): any[] {\n const result = Array.from(values);\n // If all numbers, use numeric sort\n if (result.every(item => Number.isFinite(item))) {\n return result.sort((a, b) => a - b);\n }\n return result.sort();\n}\n\nexport function objectFromProps<T = any>(\n props: string[],\n value: T | null = null\n): Record<string, T | null> {\n return props.reduce((result: Record<string, T | null>, property: string) => {\n result[property] = value;\n return result;\n }, {});\n}\n\n// =============================================================================\n// Buffer utilities (cross-platform)\n// =============================================================================\n\nconst textDecoder = new TextDecoder(\"utf-8\");\n\nlet latin1Decoder: TextDecoder | undefined;\ntry {\n // Faster base64 encoding path in browsers: decode bytes into a binary string once.\n // Some environments may not support this encoding.\n latin1Decoder = new TextDecoder(\"latin1\");\n} catch {\n latin1Decoder = undefined;\n}\n\n/**\n * Convert a Buffer, ArrayBuffer, or Uint8Array to a UTF-8 string\n * Works in both Node.js and browser environments\n */\nexport function bufferToString(chunk: ArrayBuffer | Uint8Array | string): string {\n if (typeof chunk === \"string\") {\n return chunk;\n }\n return textDecoder.decode(chunk);\n}\n\n/**\n * Convert Uint8Array to base64 string\n * Uses native Buffer in Node.js, optimized chunked conversion in browser\n */\nexport function uint8ArrayToBase64(bytes: Uint8Array): string {\n if (isNode()) {\n return Buffer.from(bytes).toString(\"base64\");\n }\n\n // Browser: fastest path when latin1 TextDecoder exists.\n // Some environments can still throw on `btoa(...)` (e.g. if decoding yields non-Latin1 chars),\n // so fall back to a guaranteed-binary string conversion.\n if (latin1Decoder) {\n try {\n return btoa(latin1Decoder.decode(bytes));\n } catch {\n // fall through\n }\n }\n\n // Browser: chunked String.fromCharCode.apply to avoid stack overflow and reduce string concatenation\n const CHUNK_SIZE = 0x8000; // 32KB chunks\n const chunks: string[] = [];\n for (let i = 0; i < bytes.length; i += CHUNK_SIZE) {\n chunks.push(String.fromCharCode.apply(null, bytes.subarray(i, i + CHUNK_SIZE) as any));\n }\n return btoa(chunks.join(\"\"));\n}\n\n/**\n * Convert string to UTF-16LE Uint8Array (used for Excel password hashing)\n */\nexport function stringToUtf16Le(str: string): Uint8Array {\n const bytes = new Uint8Array(str.length * 2);\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n bytes[i * 2] = code & 0xff;\n bytes[i * 2 + 1] = (code >> 8) & 0xff;\n }\n return bytes;\n}\n","/**\n * Event Emitter\n *\n * Browser-compatible EventEmitter with a Node.js-like API surface.\n * Kept lightweight and allocation-lean for hot paths.\n */\n\nexport type EventListener = (...args: any[]) => void;\n\ntype ListenerList = EventListener[];\ntype ListenerValue = EventListener | ListenerList;\n\nconst isListenerList = (value: ListenerValue): value is ListenerList => Array.isArray(value);\n\nexport class EventEmitter {\n // Brand for ExcelTS browser stream objects.\n // Use a string key (not a Symbol) so it still works if the bundle ends up\n // containing multiple copies of this module.\n readonly __excelts_stream: true = true;\n\n private _listeners: Map<string | symbol, ListenerValue> = new Map();\n private _maxListeners: number = EventEmitter.defaultMaxListeners;\n\n static defaultMaxListeners: number = 10;\n\n addListener(event: string | symbol, listener: EventListener): this {\n return this.on(event, listener);\n }\n\n private _listenerCount(value: ListenerValue | undefined): number {\n if (!value) {\n return 0;\n }\n return isListenerList(value) ? value.length : 1;\n }\n\n private _hasListeners(event: string | symbol): boolean {\n return this._listenerCount(this._listeners.get(event)) > 0;\n }\n\n on(event: string | symbol, listener: EventListener): this {\n const existing = this._listeners.get(event);\n\n // Warn if exceeding max listeners (skip check if maxListeners is 0 = unlimited)\n if (this._maxListeners > 0) {\n const count = this._listenerCount(existing);\n if (count >= this._maxListeners) {\n // Avoid hard dependency on console for bundle/minified builds\n console?.warn?.(\n `MaxListenersExceededWarning: Possible EventEmitter memory leak detected. ` +\n `${count + 1} ${String(event)} listeners added. ` +\n `Use emitter.setMaxListeners() to increase limit`\n );\n }\n }\n\n if (!existing) {\n this._listeners.set(event, listener);\n } else if (isListenerList(existing)) {\n existing.push(listener);\n } else {\n this._listeners.set(event, [existing, listener]);\n }\n\n // Node emits 'newListener' only if someone is listening to it.\n if (event !== \"newListener\" && this._hasListeners(\"newListener\")) {\n this.emit(\"newListener\", event, listener);\n }\n return this;\n }\n\n prependListener(event: string | symbol, listener: EventListener): this {\n const existing = this._listeners.get(event);\n if (!existing) {\n this._listeners.set(event, listener);\n } else if (isListenerList(existing)) {\n existing.unshift(listener);\n } else {\n this._listeners.set(event, [listener, existing]);\n }\n\n if (event !== \"newListener\" && this._hasListeners(\"newListener\")) {\n this.emit(\"newListener\", event, listener);\n }\n return this;\n }\n\n once(event: string | symbol, listener: EventListener): this {\n const onceWrapper = (...args: any[]): void => {\n this.off(event, onceWrapper);\n listener.apply(this, args);\n };\n (onceWrapper as any).listener = listener;\n return this.on(event, onceWrapper);\n }\n\n prependOnceListener(event: string | symbol, listener: EventListener): this {\n const onceWrapper = (...args: any[]): void => {\n this.off(event, onceWrapper);\n listener.apply(this, args);\n };\n (onceWrapper as any).listener = listener;\n return this.prependListener(event, onceWrapper);\n }\n\n removeListener(event: string | symbol, listener: EventListener): this {\n return this.off(event, listener);\n }\n\n off(event: string | symbol, listener: EventListener): this {\n const existing = this._listeners.get(event);\n if (!existing) {\n return this;\n }\n\n if (!isListenerList(existing)) {\n if (existing === listener || (existing as any).listener === listener) {\n this._listeners.delete(event);\n if (event !== \"removeListener\" && this._hasListeners(\"removeListener\")) {\n this.emit(\"removeListener\", event, listener);\n }\n }\n return this;\n }\n\n const listeners = existing;\n if (listeners.length === 0) {\n this._listeners.delete(event);\n return this;\n }\n\n // Fast path: direct match\n const directIdx = listeners.indexOf(listener);\n if (directIdx !== -1) {\n listeners.splice(directIdx, 1);\n } else {\n // Slow path: check for once wrapper\n for (let i = 0, len = listeners.length; i < len; i++) {\n if ((listeners[i] as any).listener === listener) {\n listeners.splice(i, 1);\n break;\n }\n }\n }\n\n if (listeners.length === 0) {\n this._listeners.delete(event);\n } else if (listeners.length === 1) {\n this._listeners.set(event, listeners[0]);\n }\n\n if (event !== \"removeListener\" && this._hasListeners(\"removeListener\")) {\n this.emit(\"removeListener\", event, listener);\n }\n\n return this;\n }\n\n emit(event: string | symbol, ...args: any[]): boolean {\n const existing = this._listeners.get(event);\n if (!existing) {\n return false;\n }\n\n if (!isListenerList(existing)) {\n try {\n existing.apply(this, args);\n } catch (err) {\n if (event !== \"error\") {\n this.emit(\"error\", err);\n }\n }\n return true;\n }\n\n const listeners = existing;\n const len = listeners.length;\n if (len === 0) {\n return false;\n }\n\n if (len === 1) {\n try {\n listeners[0].apply(this, args);\n } catch (err) {\n if (event !== \"error\") {\n this.emit(\"error\", err);\n }\n }\n return true;\n }\n\n if (len === 2) {\n const l0 = listeners[0];\n const l1 = listeners[1];\n try {\n l0.apply(this, args);\n } catch (err) {\n if (event !== \"error\") {\n this.emit(\"error\", err);\n }\n }\n try {\n l1.apply(this, args);\n } catch (err) {\n if (event !== \"error\") {\n this.emit(\"error\", err);\n }\n }\n return true;\n }\n\n // Snapshot to allow removal during emit\n const snapshot = listeners.slice();\n for (let i = 0; i < snapshot.length; i++) {\n try {\n snapshot[i].apply(this, args);\n } catch (err) {\n if (event !== \"error\") {\n this.emit(\"error\", err);\n }\n }\n }\n return true;\n }\n\n removeAllListeners(event?: string | symbol): this {\n if (event !== undefined) {\n this._listeners.delete(event);\n } else {\n this._listeners.clear();\n }\n return this;\n }\n\n listenerCount(event: string | symbol): number {\n return this._listenerCount(this._listeners.get(event));\n }\n\n listeners(event: string | symbol): EventListener[] {\n const value = this._listeners.get(event);\n if (!value) {\n return [];\n }\n return isListenerList(value) ? value.slice() : [value];\n }\n\n rawListeners(event: string | symbol): EventListener[] {\n const value = this._listeners.get(event);\n if (!value) {\n return [];\n }\n return isListenerList(value) ? value.slice() : [value];\n }\n\n eventNames(): (string | symbol)[] {\n return [...this._listeners.keys()];\n }\n\n setMaxListeners(n: number): this {\n this._maxListeners = n;\n return this;\n }\n\n getMaxListeners(): number {\n return this._maxListeners;\n }\n}\n","/**\n * Shared Utilities\n *\n * Common utilities shared across all stream implementations.\n * This module provides cached TextEncoder/TextDecoder instances\n * and core binary operations.\n */\n\n// =============================================================================\n// Cached TextEncoder/TextDecoder instances\n// =============================================================================\n\n/**\n * Cached TextEncoder instance for UTF-8 encoding\n */\nexport const textEncoder = new TextEncoder();\n\n/**\n * Cached TextDecoder instance for UTF-8 decoding\n * ignoreBOM: true - preserves BOM in output to match Node.js behavior\n */\nexport const textDecoder = new TextDecoder(\"utf-8\", { ignoreBOM: true });\n\n// Cache non-default decoders by encoding to avoid repeated allocations.\nconst _decoderCache = new Map<string, TextDecoder>();\n\n/**\n * Get a cached TextDecoder instance.\n *\n * Note: For the default UTF-8 path we reuse the module-level `textDecoder`.\n */\nexport function getTextDecoder(encoding?: string): TextDecoder {\n if (!encoding || encoding === \"utf-8\" || encoding === \"utf8\") {\n return textDecoder;\n }\n const key = encoding;\n let decoder = _decoderCache.get(key);\n if (!decoder) {\n decoder = new TextDecoder(key);\n _decoderCache.set(key, decoder);\n }\n return decoder;\n}\n\n// =============================================================================\n// Binary Operations\n// =============================================================================\n\n/**\n * Convert string to Uint8Array using cached encoder\n */\nexport function stringToUint8Array(str: string): Uint8Array {\n return textEncoder.encode(str);\n}\n\n/**\n * Convert Uint8Array to string using cached decoder\n */\nexport function uint8ArrayToString(arr: Uint8Array, encoding?: string): string {\n return getTextDecoder(encoding).decode(arr);\n}\n\n/**\n * Concatenate multiple Uint8Arrays efficiently\n */\nexport function concatUint8Arrays(arrays: readonly Uint8Array[]): Uint8Array {\n const len = arrays.length;\n if (len === 0) {\n return new Uint8Array(0);\n }\n if (len === 1) {\n return arrays[0];\n }\n\n // Calculate total length with for loop for better performance\n let totalLength = 0;\n for (let i = 0; i < len; i++) {\n totalLength += arrays[i].length;\n }\n\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (let i = 0; i < len; i++) {\n const arr = arrays[i];\n result.set(arr, offset);\n offset += arr.length;\n }\n\n return result;\n}\n\n/**\n * Compare two Uint8Arrays for equality\n */\nexport function uint8ArrayEquals(a: Uint8Array, b: Uint8Array): boolean {\n const len = a.length;\n if (len !== b.length) {\n return false;\n }\n for (let i = 0; i < len; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Find pattern in Uint8Array\n */\nexport function uint8ArrayIndexOf(haystack: Uint8Array, needle: Uint8Array, start = 0): number {\n const needleLen = needle.length;\n if (needleLen === 0) {\n return start;\n }\n\n const haystackLen = haystack.length;\n if (needleLen > haystackLen) {\n return -1;\n }\n\n const firstByte = needle[0];\n const end = haystackLen - needleLen;\n\n outer: for (let i = start; i <= end; i++) {\n // Quick check first byte\n if (haystack[i] !== firstByte) {\n continue;\n }\n // Check rest of pattern\n for (let j = 1; j < needleLen; j++) {\n if (haystack[i + j] !== needle[j]) {\n continue outer;\n }\n }\n return i;\n }\n\n return -1;\n}\n\n/**\n * Slice Uint8Array (returns a copy)\n */\nexport function uint8ArraySlice(arr: Uint8Array, start?: number, end?: number): Uint8Array {\n return arr.slice(start, end);\n}\n\n/**\n * Convert any buffer-like input to Uint8Array\n */\nexport function toUint8Array(input: string | Uint8Array | ArrayBuffer | number[]): Uint8Array {\n if (input instanceof Uint8Array) {\n return input;\n }\n if (typeof input === \"string\") {\n return textEncoder.encode(input);\n }\n if (input instanceof ArrayBuffer) {\n return new Uint8Array(input);\n }\n if (Array.isArray(input)) {\n return new Uint8Array(input);\n }\n throw new Error(\"Cannot convert to Uint8Array: unsupported input type\");\n}\n\n/**\n * Convert any input to string\n */\nexport function bufferToString(\n input: string | Uint8Array | ArrayBuffer | number[],\n encoding?: string\n): string {\n if (typeof input === \"string\") {\n return input;\n }\n const arr = toUint8Array(input);\n return getTextDecoder(encoding).decode(arr);\n}\n","/**\n * Native Stream Implementation - Browser\n *\n * Uses Web Streams API (ReadableStream, WritableStream, TransformStream)\n * for true native streaming in browsers.\n *\n * Supported browsers:\n * - Chrome >= 89\n * - Firefox >= 102\n * - Safari >= 14.1\n * - Edge >= 89\n */\n\nimport type {\n TransformStreamOptions,\n ReadableStreamOptions,\n WritableStreamOptions,\n DuplexStreamOptions,\n PullStreamOptions,\n BufferedStreamOptions,\n DataChunk,\n ICollector,\n IDuplex,\n IEventEmitter,\n IPassThrough,\n IReadable,\n ITransform,\n IWritable,\n PipelineStreamLike,\n ReadableLike,\n WritableLike\n} from \"@stream/types\";\n\nimport type { Writable as NodeWritable } from \"stream\";\n\nimport { EventEmitter } from \"@stream/event-emitter\";\nimport {\n PullStream as StandalonePullStream,\n type PullStreamOptions as StandalonePullStreamOptions\n} from \"@stream/pull-stream\";\nimport {\n BufferedStream as StandaloneBufferedStream,\n StringChunk as StandaloneStringChunk,\n BufferChunk as StandaloneBufferChunk\n} from \"@stream/buffered-stream\";\n\nimport { concatUint8Arrays, getTextDecoder, textDecoder } from \"@stream/shared\";\n\n// =============================================================================\n// Readable Stream Wrapper\n// =============================================================================\n\n/**\n * A wrapper around Web ReadableStream that provides Node.js-like API\n */\nexport class Readable<T = Uint8Array> extends EventEmitter {\n private _stream: ReadableStream<T>;\n private _reader: ReadableStreamDefaultReader<T> | null = null;\n private _buffer: T[] = [];\n private _bufferIndex: number = 0;\n private _unshiftBuffer: T[] = [];\n private _bufferSize: number = 0;\n private _reading: boolean = false;\n private _ended: boolean = false;\n private _destroyed: boolean = false;\n private _errored: Error | null = null;\n private _closed: boolean = false;\n private _paused: boolean = true;\n private _flowing: boolean = false;\n private _pipeTo: WritableLike[] = [];\n private _pipeListeners: Map<\n WritableLike,\n { data: (chunk: T) => void; end: () => void; error: (err: Error) => void }\n > = new Map();\n private _encoding: string | null = null;\n private _decoder: TextDecoder | null = null;\n private _didRead: boolean = false;\n private _aborted: boolean = false;\n // Whether this stream uses push() mode (true) or Web Stream mode (false)\n private _pushMode: boolean = false;\n // Whether this stream was created from an external Web Stream (true) or is controllable (false)\n private _webStreamMode: boolean = false;\n readonly objectMode: boolean;\n readonly readableHighWaterMark: number;\n readonly autoDestroy: boolean;\n readonly emitClose: boolean;\n // User-provided read function (Node.js compatibility)\n private _read?: (size?: number) => void;\n\n constructor(\n options?: ReadableStreamOptions & {\n stream?: ReadableStream<T>;\n autoDestroy?: boolean;\n emitClose?: boolean;\n read?: (this: Readable<T>, size?: number) => void;\n }\n ) {\n super();\n this.objectMode = options?.objectMode ?? false;\n this.readableHighWaterMark = options?.highWaterMark ?? 16384;\n this.autoDestroy = options?.autoDestroy ?? true;\n this.emitClose = options?.emitClose ?? true;\n\n // Store user-provided read function\n if (options?.read) {\n this._read = options.read.bind(this);\n this._pushMode = true; // User will call push()\n }\n\n if (options?.stream) {\n this._stream = options.stream;\n this._webStreamMode = true; // Created from external Web Stream\n } else {\n // Create a controllable stream\n let controller: ReadableStreamDefaultController<T>;\n this._stream = new ReadableStream<T>({\n start: ctrl => {\n controller = ctrl;\n },\n pull: async () => {\n // Signal that more data can be pushed\n this.emit(\"drain\");\n },\n cancel: reason => {\n this._ended = true;\n this._aborted = true;\n if (this.emitClose) {\n this.emit(\"close\");\n }\n }\n });\n\n // Expose controller for push/end\n (this as any)._controller = controller!;\n }\n }\n\n /**\n * Create a Readable from an iterable (static factory method)\n */\n static from<T>(\n iterable: Iterable<T> | AsyncIterable<T>,\n options?: ReadableStreamOptions\n ): Readable<T> {\n const readable = new Readable<T>({ ...options, objectMode: options?.objectMode ?? true });\n\n (async () => {\n try {\n for await (const chunk of iterable as AsyncIterable<T>) {\n if (!readable.push(chunk)) {\n // Backpressure\n await new Promise(resolve => setTimeout(resolve, 0));\n }\n }\n readable.push(null);\n } catch (err) {\n readable.destroy(err as Error);\n }\n })();\n\n return readable;\n }\n\n /**\n * Check if a stream has been disturbed (read from)\n */\n static isDisturbed(stream: Readable<any>): boolean {\n return stream._didRead || stream._ended || stream._destroyed;\n }\n\n /**\n * Convert a Web ReadableStream to Node.js Readable\n */\n static fromWeb<T>(webStream: ReadableStream<T>, options?: ReadableStreamOptions): Readable<T> {\n return new Readable<T>({ ...options, stream: webStream });\n }\n\n /**\n * Convert a Node.js Readable to Web ReadableStream\n */\n static toWeb<T>(nodeStream: Readable<T>): ReadableStream<T> {\n return nodeStream.webStream;\n }\n\n /**\n * Push data to the stream (when using controllable stream)\n */\n push(chunk: T | null): boolean {\n if (this._destroyed) {\n return false;\n }\n\n // Mark as push mode when push() is called\n this._pushMode = true;\n\n const controller = (this as any)._controller as ReadableStreamDefaultController<T> | undefined;\n\n if (chunk === null) {\n // Prevent duplicate end handling\n if (this._ended) {\n return false;\n }\n this._ended = true;\n if (controller) {\n try {\n controller.close();\n } catch {\n // Controller may already be closed\n }\n }\n this.emit(\"end\");\n // Note: Don't call destroy() here, let the stream be consumed naturally\n // The reader will return done:true when it finishes reading\n return false;\n }\n\n if (this._flowing) {\n // In flowing mode, emit data directly without buffering or enqueueing\n // const chunkStr = chunk instanceof Uint8Array ? new TextDecoder().decode(chunk.slice(0, 50)) : String(chunk).slice(0, 50);\n // console.log(`[Readable#${this._id}.push FLOWING] emit data size:${(chunk as any).length || (chunk as any).byteLength} start:\"${chunkStr}\"`);\n this.emit(\"data\", chunk);\n // Check if stream was paused during emit (backpressure from consumer)\n if (!this._flowing) {\n return false;\n }\n // After emitting data, call _read again if available (Node.js behavior)\n if (this._read && !this._ended) {\n queueMicrotask(() => {\n if (this._flowing && !this._ended && !this._destroyed) {\n this._read!(this.readableHighWaterMark);\n }\n });\n }\n // In flowing mode, return true (no backpressure since data is immediately consumed)\n return true;\n } else {\n // In paused mode, buffer for later\n const wasEmpty = this._bufferedLength() === 0;\n // const chunkStrBuf = chunk instanceof Uint8Array ? new TextDecoder().decode((chunk as Uint8Array).slice(0, 50)) : String(chunk).slice(0, 50);\n // console.log(`[Readable#${this._id}.push PAUSED->BUFFER] buffer len:${this._buffer.length}->${this._buffer.length + 1} start:\"${chunkStrBuf}\"`);\n this._buffer.push(chunk);\n if (!this.objectMode) {\n this._bufferSize += this._getChunkSize(chunk);\n }\n // NOTE: Do NOT enqueue to Web Stream controller here!\n // In push mode, _buffer is the only source of data for data events.\n // Web Stream is only used for async iteration when not in push mode.\n // Enqueueing here would cause data duplication when _startReading is also running.\n\n // Emit readable event when buffer goes from empty to having data\n if (wasEmpty) {\n queueMicrotask(() => this.emit(\"readable\"));\n }\n // Return false if buffer exceeds high water mark (backpressure signal)\n // Fast path for object mode - just count items\n if (this.objectMode) {\n return this._bufferedLength() < this.readableHighWaterMark;\n }\n // For binary mode, use tracked buffer size (O(1))\n return this._bufferSize < this.readableHighWaterMark;\n }\n }\n\n /**\n * Put a chunk back at the front of the buffer\n * Note: unshift is allowed even after end, as it's used to put back already read data\n */\n unshift(chunk: T): void {\n if (this._destroyed) {\n return;\n }\n this._bufferUnshift(chunk);\n if (!this.objectMode) {\n this._bufferSize += this._getChunkSize(chunk);\n }\n }\n\n /**\n * Read data from the stream\n */\n read(size?: number): T | null {\n this._didRead = true;\n\n if (this._bufferedLength() > 0) {\n if (this.objectMode || size === undefined) {\n const chunk = this._bufferShift();\n if (!this.objectMode) {\n this._bufferSize -= this._getChunkSize(chunk);\n }\n return this._applyEncoding(chunk);\n }\n // For binary mode, handle size\n const chunk = this._bufferShift();\n if (!this.objectMode) {\n this._bufferSize -= this._getChunkSize(chunk);\n }\n return this._applyEncoding(chunk);\n }\n return null;\n }\n\n private _bufferedLength(): number {\n return this._unshiftBuffer.length + (this._buffer.length - this._bufferIndex);\n }\n\n private _bufferPeek(): T | null {\n const unshiftLen = this._unshiftBuffer.length;\n if (unshiftLen > 0) {\n return this._unshiftBuffer[unshiftLen - 1]!;\n }\n return this._bufferIndex < this._buffer.length ? this._buffer[this._bufferIndex] : null;\n }\n\n private _bufferShift(): T {\n if (this._unshiftBuffer.length > 0) {\n return this._unshiftBuffer.pop()!;\n }\n const chunk = this._buffer[this._bufferIndex++]!;\n\n // Fast reset when emptied\n if (this._bufferIndex === this._buffer.length) {\n this._buffer.length = 0;\n this._bufferIndex = 0;\n return chunk;\n }\n\n // Occasionally compact to avoid unbounded growth of the unused prefix\n if (this._bufferIndex > 1024 && this._bufferIndex * 2 > this._buffer.length) {\n this._buffer = this._buffer.slice(this._bufferIndex);\n this._bufferIndex = 0;\n }\n\n return chunk;\n }\n\n private _bufferUnshift(chunk: T): void {\n if (this._bufferIndex === 0) {\n // Avoid O(n) Array.unshift() by using a small front stack.\n // Semantics: last unshifted chunk is returned first.\n this._unshiftBuffer.push(chunk);\n return;\n }\n\n this._bufferIndex--;\n this._buffer[this._bufferIndex] = chunk;\n }\n\n private _getChunkSize(chunk: T): number {\n // Keep semantics aligned with previous implementation:\n // - Uint8Array counts by byteLength\n // - other types count as 1\n return chunk instanceof Uint8Array ? chunk.byteLength : 1;\n }\n\n /**\n * Set encoding for string output\n */\n setEncoding(encoding: string): this {\n this._encoding = encoding;\n // Fast path: reuse cached utf-8 decoder; otherwise lazy-create on first decode.\n if (encoding === \"utf-8\" || encoding === \"utf8\") {\n this._decoder = textDecoder;\n } else {\n this._decoder = null;\n }\n return this;\n }\n\n private _applyEncoding(chunk: T): T {\n if (this._encoding && chunk instanceof Uint8Array) {\n // Use cached decoder instances (module-level for utf-8, cached per encoding otherwise).\n if (!this._decoder) {\n this._decoder = getTextDecoder(this._encoding);\n }\n return this._decoder.decode(chunk) as any;\n }\n return chunk;\n }\n\n /**\n * Wrap an old-style stream\n */\n wrap(stream: any): this {\n stream.on(\"data\", (chunk: T) => {\n if (!this.push(chunk)) {\n stream.pause();\n }\n });\n stream.on(\"end\", () => this.push(null));\n stream.on(\"error\", (err: Error) => this.destroy(err));\n stream.on(\"close\", () => this.destroy());\n return this;\n }\n\n /**\n * Pause the stream\n */\n pause(): this {\n this._paused = true;\n this._flowing = false;\n return this;\n }\n\n /**\n * Resume the stream\n */\n resume(): this {\n this._paused = false;\n this._flowing = true;\n\n // Emit any buffered data first\n while (this._bufferedLength() > 0 && this._flowing) {\n const chunk = this._bufferShift();\n if (!this.objectMode) {\n this._bufferSize -= this._getChunkSize(chunk);\n }\n this.emit(\"data\", chunk);\n }\n\n // If already ended, emit end event\n if (this._ended && this._bufferedLength() === 0) {\n this.emit(\"end\");\n } else if (this._read) {\n // Call user-provided read function asynchronously\n // This allows multiple pipe() calls to register before data flows\n queueMicrotask(() => {\n if (this._flowing && !this._ended && !this._destroyed) {\n this._read!(this.readableHighWaterMark);\n }\n });\n } else if (this._webStreamMode && !this._pushMode) {\n // Only start reading from underlying Web Stream if:\n // 1. Stream was created from external Web Stream (_webStreamMode)\n // 2. Not in push mode (no one called push() yet)\n this._startReading();\n }\n\n return this;\n }\n\n /**\n * Override on() to automatically resume when 'data' listener is added\n * This matches Node.js behavior where adding a 'data' listener puts\n * the stream into flowing mode.\n */\n override on(event: string | symbol, listener: (...args: any[]) => void): this {\n super.on(event, listener);\n\n // When a 'data' listener is added, switch to flowing mode\n if (event === \"data\") {\n this.resume();\n }\n\n return this;\n }\n\n /**\n * Check if paused\n */\n isPaused(): boolean {\n return this._paused;\n }\n\n /**\n * Pipe to a writable stream, transform stream, or duplex stream\n */\n pipe<W extends Writable<T> | Transform<T, any> | Duplex<any, T>>(destination: W): W {\n // IMPORTANT:\n // Do not rely on `instanceof` here.\n // In bundled/minified builds, multiple copies of this module can exist,\n // causing `instanceof Transform/Writable/Duplex` to fail even when the object\n // is a valid destination.\n const dest: any = destination as any;\n\n // Get the actual writable target.\n // Prefer internal `_writable` (Transform/Duplex wrappers), else treat the destination as writable-like.\n const candidate: any = dest?._writable ?? dest;\n const hasWrite = typeof candidate?.write === \"function\";\n const hasEnd = typeof candidate?.end === \"function\";\n const hasOn = typeof candidate?.on === \"function\";\n const hasOnce = typeof candidate?.once === \"function\";\n const hasOff = typeof candidate?.off === \"function\";\n\n if (!hasWrite || !hasEnd || (!hasOnce && !hasOn) || (!hasOff && !candidate?.removeListener)) {\n throw new Error(\"Readable.pipe: invalid destination\");\n }\n\n const target: WritableLike = candidate;\n\n this._pipeTo.push(target);\n\n // Create listeners that we can later remove\n const dataListener = (chunk: T): void => {\n const canWrite = target.write(chunk);\n if (!canWrite) {\n this.pause();\n if (typeof (target as any).once === \"function\") {\n (target as any).once(\"drain\", () => this.resume());\n } else {\n const resumeOnce = (): void => {\n if (typeof (target as any).off === \"function\") {\n (target as any).off(\"drain\", resumeOnce);\n } else if (typeof (target as any).removeListener === \"function\") {\n (target as any).removeListener(\"drain\", resumeOnce);\n }\n this.resume();\n };\n (target as any).on(\"drain\", resumeOnce);\n }\n }\n };\n\n const endListener = (): void => {\n target.end();\n };\n\n const errorListener = (err: Error): void => {\n if (typeof (target as any).destroy === \"function\") {\n (target as any).destroy(err);\n } else {\n // Best-effort: forward error to the destination if it supports events.\n (target as any).emit?.(\"error\", err);\n }\n };\n\n // Store listeners for later removal in unpipe\n this._pipeListeners.set(target, {\n data: dataListener,\n end: endListener,\n error: errorListener\n });\n\n this.on(\"data\", dataListener);\n this.once(\"end\", endListener);\n this.once(\"error\", errorListener);\n\n this.resume();\n return destination;\n }\n\n /**\n * Unpipe from destination\n */\n unpipe(destination?: WritableLike): this {\n if (destination) {\n const idx = this._pipeTo.indexOf(destination);\n if (idx !== -1) {\n this._pipeTo.splice(idx, 1);\n }\n\n // Remove the listeners\n const listeners = this._pipeListeners.get(destination);\n if (listeners) {\n this.off(\"data\", listeners.data);\n this.off(\"end\", listeners.end);\n this.off(\"error\", listeners.error);\n this._pipeListeners.delete(destination);\n }\n } else {\n // Unpipe all\n for (const target of this._pipeTo) {\n const listeners = this._pipeListeners.get(target);\n if (listeners) {\n this.off(\"data\", listeners.data);\n this.off(\"end\", listeners.end);\n this.off(\"error\", listeners.error);\n this._pipeListeners.delete(target);\n }\n }\n this._pipeTo = [];\n }\n\n // Pause the stream after unpipe\n this.pause();\n\n return this;\n }\n\n /**\n * Destroy the stream\n */\n destroy(error?: Error): this {\n if (this._destroyed) {\n return this;\n }\n\n this._destroyed = true;\n this._ended = true;\n\n if (error) {\n this._errored = error;\n this.emit(\"error\", error);\n }\n\n if (this._reader) {\n this._reader.cancel().catch(() => {});\n }\n\n this._closed = true;\n this.emit(\"close\");\n return this;\n }\n\n /**\n * Get the underlying Web ReadableStream\n */\n get webStream(): ReadableStream<T> {\n return this._stream;\n }\n\n get readable(): boolean {\n return !this._destroyed && !this._ended;\n }\n\n get readableEnded(): boolean {\n return this._ended;\n }\n\n get readableLength(): number {\n return this._bufferedLength();\n }\n\n /** Whether the stream has been destroyed */\n get destroyed(): boolean {\n return this._destroyed;\n }\n\n /** The error that destroyed the stream, or null */\n get errored(): Error | null {\n return this._errored;\n }\n\n /** Whether the stream has been closed */\n get closed(): boolean {\n return this._closed;\n }\n\n /** Whether the stream is in flowing mode */\n get readableFlowing(): boolean | null {\n if (!this._paused && !this._ended) {\n return this._flowing;\n }\n return this._flowing ? true : null;\n }\n\n /** Whether the stream was aborted */\n get readableAborted(): boolean {\n return this._aborted;\n }\n\n /** Whether read() has ever been called */\n get readableDidRead(): boolean {\n return this._didRead;\n }\n\n /** Current encoding or null */\n get readableEncoding(): string | null {\n return this._encoding;\n }\n\n /** Returns array of objects containing info about buffered data */\n get readableObjectMode(): boolean {\n return this.objectMode;\n }\n\n /**\n * Get the internal buffer state (for debugging)\n * Returns array of objects with length and chunk info\n */\n get readableBuffer(): { length: number; head: T | null } {\n return {\n length: this._bufferedLength(),\n head: this._bufferPeek()\n };\n }\n\n private async _startReading(): Promise<void> {\n if (this._reading || this._destroyed || !this._flowing) {\n return;\n }\n\n this._reading = true;\n\n try {\n if (!this._reader) {\n this._reader = this._stream.getReader();\n }\n\n while (this._flowing && !this._destroyed && !this._pushMode) {\n const { done, value } = await this._reader.read();\n\n // Check _pushMode again after async read - if push() was called, stop reading\n if (this._pushMode) {\n break;\n }\n\n if (done) {\n this._ended = true;\n this.emit(\"end\");\n break;\n }\n\n if (value !== undefined) {\n // In flowing mode, emit data directly without buffering\n // Only buffer if not flowing (paused mode)\n if (this._flowing) {\n this.emit(\"data\", value);\n } else {\n this._buffer.push(value);\n if (!this.objectMode) {\n this._bufferSize += this._getChunkSize(value);\n }\n }\n }\n }\n } catch (err) {\n this.emit(\"error\", err);\n } finally {\n this._reading = false;\n }\n }\n\n /**\n * Async iterator support\n * Uses Web Stream reader for non-push mode, event-based for push mode\n */\n async *[Symbol.asyncIterator](): AsyncIterableIterator<T> {\n // First yield any buffered data\n while (this._bufferedLength() > 0) {\n const chunk = this._bufferShift();\n if (!this.objectMode) {\n this._bufferSize -= this._getChunkSize(chunk);\n }\n yield chunk;\n }\n\n // If already ended, we're done\n if (this._ended) {\n return;\n }\n\n // For controllable streams (not created from external Web Stream),\n // use event-based iteration since data comes from push() calls\n if (!this._webStreamMode) {\n // Create a promise-based queue for incoming data\n const dataQueue: T[] = [];\n let resolveNext: ((value: T | null) => void) | null = null;\n let rejectNext: ((error: Error) => void) | null = null;\n let done = false;\n let streamError: Error | null = null;\n let dataQueueIndex = 0;\n\n const dataHandler = (chunk: T): void => {\n if (resolveNext) {\n resolveNext(chunk);\n resolveNext = null;\n rejectNext = null;\n } else {\n dataQueue.push(chunk);\n }\n };\n\n const endHandler = (): void => {\n done = true;\n if (resolveNext) {\n resolveNext(null);\n resolveNext = null;\n rejectNext = null;\n }\n };\n\n const errorHandler = (err: Error): void => {\n done = true;\n streamError = err;\n if (rejectNext) {\n rejectNext(err);\n resolveNext = null;\n rejectNext = null;\n }\n };\n\n const closeHandler = (): void => {\n // If stream closed without end event (e.g., after destroy()),\n // treat it as done\n done = true;\n if (resolveNext) {\n resolveNext(null);\n resolveNext = null;\n rejectNext = null;\n }\n };\n\n this.on(\"data\", dataHandler);\n this.on(\"end\", endHandler);\n this.on(\"error\", errorHandler);\n this.on(\"close\", closeHandler);\n\n try {\n // Enter flowing mode\n this.resume();\n\n while (!done || dataQueueIndex < dataQueue.length) {\n // Check for error before processing\n if (streamError) {\n throw streamError;\n }\n if (dataQueueIndex < dataQueue.length) {\n const chunk = dataQueue[dataQueueIndex++]!;\n if (dataQueueIndex >= 1024 && dataQueueIndex * 2 >= dataQueue.length) {\n dataQueue.splice(0, dataQueueIndex);\n dataQueueIndex = 0;\n }\n yield chunk;\n } else if (!done) {\n const chunk = await new Promise<T | null>((resolve, reject) => {\n resolveNext = resolve;\n rejectNext = reject;\n });\n if (chunk !== null) {\n yield chunk;\n }\n }\n }\n // Check for error after loop\n if (streamError) {\n throw streamError;\n }\n } finally {\n this.off(\"data\", dataHandler);\n this.off(\"end\", endHandler);\n this.off(\"error\", errorHandler);\n this.off(\"close\", closeHandler);\n }\n return;\n }\n\n // For Web Stream mode, use the underlying reader\n if (!this._reader) {\n this._reader = this._stream.getReader();\n }\n\n try {\n while (true) {\n const { done, value } = await this._reader.read();\n if (done) {\n break;\n }\n yield value;\n }\n } finally {\n this._reader.releaseLock();\n }\n }\n\n /**\n * Explicit iterator method (same as Symbol.asyncIterator)\n */\n iterator(options?: { destroyOnReturn?: boolean }): AsyncIterableIterator<T> {\n const destroyOnReturn = options?.destroyOnReturn ?? true;\n const iterator = this[Symbol.asyncIterator]();\n\n if (!destroyOnReturn) {\n return iterator;\n }\n\n // Wrap to handle early return\n return {\n next: async () => {\n return iterator.next();\n },\n return: async (value?: any) => {\n this.destroy();\n return { done: true, value };\n },\n [Symbol.asyncIterator]() {\n return this;\n }\n };\n }\n\n // =========================================================================\n // Async Iterator Helper Methods (Node.js 16.6+)\n // =========================================================================\n\n /**\n * Map each chunk through an async function\n */\n async *map<R>(\n fn: (data: T, options?: { signal?: AbortSignal }) => R | Promise<R>,\n options?: { concurrency?: number; signal?: AbortSignal }\n ): AsyncGenerator<R, void, unknown> {\n const signal = options?.signal;\n for await (const chunk of this) {\n if (signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n yield await fn(chunk, { signal });\n }\n }\n\n /**\n * Filter chunks through an async predicate\n */\n async *filter(\n fn: (data: T, options?: { signal?: AbortSignal }) => boolean | Promise<boolean>,\n options?: { concurrency?: number; signal?: AbortSignal }\n ): AsyncGenerator<T, void, unknown> {\n const signal = options?.signal;\n for await (const chunk of this) {\n if (signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n if (await fn(chunk, { signal })) {\n yield chunk;\n }\n }\n }\n\n /**\n * FlatMap each chunk\n */\n async *flatMap<R>(\n fn: (data: T, options?: { signal?: AbortSignal }) => AsyncIterable<R> | Iterable<R>,\n options?: { concurrency?: number; signal?: AbortSignal }\n ): AsyncGenerator<R, void, unknown> {\n const signal = options?.signal;\n for await (const chunk of this) {\n if (signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n const result = await fn(chunk, { signal });\n for await (const item of result) {\n yield item;\n }\n }\n }\n\n /**\n * Take the first n chunks\n */\n async *take(limit: number, options?: { signal?: AbortSignal }): AsyncGenerator<T, void, unknown> {\n const signal = options?.signal;\n let count = 0;\n for await (const chunk of this) {\n if (signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n if (count >= limit) {\n break;\n }\n yield chunk;\n count++;\n }\n }\n\n /**\n * Drop the first n chunks\n */\n async *drop(limit: number, options?: { signal?: AbortSignal }): AsyncGenerator<T, void, unknown> {\n const signal = options?.signal;\n let count = 0;\n for await (const chunk of this) {\n if (signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n if (count >= limit) {\n yield chunk;\n }\n count++;\n }\n }\n\n /**\n * Reduce all chunks to a single value\n */\n async reduce(\n fn: (previous: T, data: T, options?: { signal?: AbortSignal }) => T | Promise<T>,\n initial?: T,\n options?: { signal?: AbortSignal }\n ): Promise<T>;\n async reduce<R>(\n fn: (previous: R, data: T, options?: { signal?: AbortSignal }) => R | Promise<R>,\n initial: R,\n options?: { signal?: AbortSignal }\n ): Promise<R>;\n async reduce<R>(\n fn: (previous: R, data: T, options?: { signal?: AbortSignal }) => R | Promise<R>,\n initial?: R,\n options?: { signal?: AbortSignal }\n ): Promise<R> {\n const signal = options?.signal;\n let accumulator: R | undefined = initial;\n let first = true;\n\n for await (const chunk of this) {\n if (signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n if (first && accumulator === undefined) {\n accumulator = chunk as any as R;\n first = false;\n } else {\n accumulator = await fn(accumulator as R, chunk, { signal });\n }\n }\n\n if (accumulator === undefined) {\n throw new TypeError(\"Reduce of empty stream with no initial value\");\n }\n\n return accumulator;\n }\n\n /**\n * Check if every chunk passes a predicate\n */\n async every(\n fn: (data: T, options?: { signal?: AbortSignal }) => boolean | Promise<boolean>,\n options?: { concurrency?: number; signal?: AbortSignal }\n ): Promise<boolean> {\n const signal = options?.signal;\n for await (const chunk of this) {\n if (signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n if (!(await fn(chunk, { signal }))) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Check if some chunk passes a predicate\n */\n async some(\n fn: (data: T, options?: { signal?: AbortSignal }) => boolean | Promise<boolean>,\n options?: { concurrency?: number; signal?: AbortSignal }\n ): Promise<boolean> {\n const signal = options?.signal;\n for await (const chunk of this) {\n if (signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n if (await fn(chunk, { signal })) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Find first chunk that passes predicate\n */\n async find(\n fn: (data: T, options?: { signal?: AbortSignal }) => boolean | Promise<boolean>,\n options?: { signal?: AbortSignal }\n ): Promise<T | undefined> {\n const signal = options?.signal;\n for await (const chunk of this) {\n if (signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n if (await fn(chunk, { signal })) {\n return chunk;\n }\n }\n return undefined;\n }\n\n /**\n * Execute function for each chunk (like forEach)\n */\n async forEach(\n fn: (data: T, options?: { signal?: AbortSignal }) => void | Promise<void>,\n options?: { concurrency?: number; signal?: AbortSignal }\n ): Promise<void> {\n const signal = options?.signal;\n for await (const chunk of this) {\n if (signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n await fn(chunk, { signal });\n }\n }\n\n /**\n * Collect all chunks into an array\n */\n async toArray(options?: { signal?: AbortSignal }): Promise<T[]> {\n const signal = options?.signal;\n const result: T[] = [];\n for await (const chunk of this) {\n if (signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n result.push(chunk);\n }\n return result;\n }\n\n /**\n * Yield [index, value] pairs\n */\n async *asIndexedPairs(options?: {\n signal?: AbortSignal;\n }): AsyncGenerator<[number, T], void, unknown> {\n const signal = options?.signal;\n let index = 0;\n for await (const chunk of this) {\n if (signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n yield [index++, chunk];\n }\n }\n\n /**\n * Compose this stream with another iterable/stream\n */\n compose<R>(stream: (source: AsyncIterable<T>) => AsyncIterable<R>): Readable<R>;\n compose<R>(stream: Duplex<R, T>): Duplex<R, T>;\n compose<R>(\n stream: Duplex<R, T> | ((source: AsyncIterable<T>) => AsyncIterable<R>)\n ): Readable<R> | Duplex<R, T> {\n if (typeof stream === \"function\") {\n // It's an async generator function\n const output = stream(this);\n return Readable.from(output);\n }\n // It's a Duplex stream\n this.pipe(stream);\n return stream;\n }\n}\n\n// =============================================================================\n// Writable Stream Wrapper\n// =============================================================================\n\n/**\n * A wrapper around Web WritableStream that provides Node.js-like API\n */\nexport class Writable<T = Uint8Array> extends EventEmitter {\n private _stream: WritableStream<T>;\n private _writer: WritableStreamDefaultWriter<T> | null = null;\n private _ended: boolean = false;\n private _finished: boolean = false;\n private _destroyed: boolean = false;\n private _errored: Error | null = null;\n private _closed: boolean = false;\n private _pendingWrites: number = 0;\n private _writableLength: number = 0;\n private _corked: number = 0;\n private _corkedChunks: Array<{ chunk: T; callback?: (error?: Error | null) => void }> = [];\n private _defaultEncoding: string = \"utf8\";\n private _aborted: boolean = false;\n // User-provided write function (Node.js compatibility)\n private _writeFunc?: (\n chunk: T,\n encoding: string,\n callback: (error?: Error | null) => void\n ) => void;\n // User-provided final function (Node.js compatibility)\n private _finalFunc?: (callback: (error?: Error | null) => void) => void;\n readonly objectMode: boolean;\n readonly writableHighWaterMark: number;\n readonly autoDestroy: boolean;\n readonly emitClose: boolean;\n\n constructor(\n options?: WritableStreamOptions & {\n stream?: WritableStream<T>;\n autoDestroy?: boolean;\n emitClose?: boolean;\n defaultEncoding?: string;\n write?: (\n this: Writable<T>,\n chunk: T,\n encoding: string,\n callback: (error?: Error | null) => void\n ) => void;\n final?: (this: Writable<T>, callback: (error?: Error | null) => void) => void;\n }\n ) {\n super();\n this.objectMode = options?.objectMode ?? false;\n this.writableHighWaterMark = options?.highWaterMark ?? 16384;\n this.autoDestroy = options?.autoDestroy ?? true;\n this.emitClose = options?.emitClose ?? true;\n this._defaultEncoding = options?.defaultEncoding ?? \"utf8\";\n\n // Store user-provided write function\n if (options?.write) {\n this._writeFunc = options.write.bind(this);\n }\n // Store user-provided final function\n if (options?.final) {\n this._finalFunc = options.final.bind(this);\n }\n\n if (options?.stream) {\n this._stream = options.stream;\n } else {\n // Create bound references to instance properties/methods for use in WritableStream callbacks\n const getWriteFunc = (): typeof this._writeFunc => this._writeFunc;\n const getFinalFunc = (): typeof this._finalFunc => this._finalFunc;\n const getDefaultEncoding = (): string => this._defaultEncoding;\n const setFinished = (value: boolean): void => {\n this._finished = value;\n };\n const setAborted = (value: boolean): void => {\n this._aborted = value;\n };\n const emitEvent = this.emit.bind(this);\n const getEmitClose = (): boolean => this.emitClose;\n const callWrite = (chunk: T): any => (this as any)._write?.(chunk);\n\n this._stream = new WritableStream<T>({\n write: async chunk => {\n // Use user-provided write function or default behavior\n const writeFunc = getWriteFunc();\n if (writeFunc) {\n await new Promise<void>((resolve, reject) => {\n writeFunc(chunk, getDefaultEncoding(), err => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n });\n });\n } else {\n // Override this in subclasses\n callWrite(chunk);\n }\n },\n close: async () => {\n // Call final function if provided\n const finalFunc = getFinalFunc();\n if (finalFunc) {\n await new Promise<void>((resolve, reject) => {\n finalFunc(err => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n });\n });\n }\n setFinished(true);\n emitEvent(\"finish\");\n if (getEmitClose()) {\n emitEvent(\"close\");\n }\n },\n abort: reason => {\n setAborted(true);\n emitEvent(\"error\", reason);\n }\n });\n }\n }\n\n /**\n * Set default encoding for string writes\n */\n setDefaultEncoding(encoding: string): this {\n this._defaultEncoding = encoding;\n return this;\n }\n\n /**\n * Buffer writes until uncork() is called\n */\n cork(): void {\n this._corked++;\n }\n\n /**\n * Flush buffered writes from cork()\n */\n uncork(): void {\n if (this._corked > 0) {\n this._corked--;\n }\n\n if (this._corked === 0) {\n // Flush all corked chunks\n const chunks = this._corkedChunks;\n this._corkedChunks = [];\n for (const { chunk, callback } of chunks) {\n this._doWrite(chunk, callback);\n }\n }\n }\n\n /**\n * Write data to the stream\n */\n write(chunk: T, callback?: (error?: Error | null) => void): boolean;\n write(chunk: T, encoding?: string, callback?: (error?: Error | null) => void): boolean;\n write(\n chunk: T,\n encodingOrCallback?: string | ((error?: Error | null) => void),\n callback?: (error?: Error | null) => void\n ): boolean {\n if (this._destroyed || this._ended) {\n const err = new Error(\"Cannot write after stream destroyed/ended\");\n const cb = typeof encodingOrCallback === \"function\" ? encodingOrCallback : callback;\n cb?.(err);\n return false;\n }\n\n const cb = typeof encodingOrCallback === \"function\" ? encodingOrCallback : callback;\n\n // If corked, buffer the write\n if (this._corked > 0) {\n this._corkedChunks.push({ chunk, callback: cb });\n const chunkSize = this._getChunkSize(chunk);\n this._writableLength += chunkSize;\n return this._writableLength < this.writableHighWaterMark;\n }\n\n return this._doWrite(chunk, cb);\n }\n\n private _doWrite(chunk: T, callback?: (error?: Error | null) => void): boolean {\n // Track pending writes for writableLength\n const chunkSize = this._getChunkSize(chunk);\n this._pendingWrites++;\n this._writableLength += chunkSize;\n\n this._getWriter()\n .write(chunk)\n .then(() => {\n this._pendingWrites--;\n this._writableLength -= chunkSize;\n this.emit(\"drain\");\n callback?.(null);\n })\n .catch(err => {\n this._pendingWrites--;\n this._writableLength -= chunkSize;\n this.emit(\"error\", err);\n callback?.(err);\n });\n\n // Return false if we've exceeded high water mark (for backpressure)\n return this._writableLength < this.writableHighWaterMark;\n }\n\n private _getChunkSize(chunk: T): number {\n if (this.objectMode) {\n return 1;\n }\n if (chunk instanceof Uint8Array) {\n return chunk.byteLength;\n }\n if (typeof chunk === \"string\") {\n return chunk.length;\n }\n return 0;\n }\n\n /**\n * End the stream\n */\n end(callback?: () => void): this;\n end(chunk: T, callback?: () => void): this;\n end(chunk: T, encoding?: string, callback?: () => void): this;\n end(\n chunkOrCallback?: T | (() => void),\n encodingOrCallback?: string | (() => void),\n callback?: () => void\n ): this {\n if (this._ended) {\n return this;\n }\n\n this._ended = true;\n\n const chunk = typeof chunkOrCallback !== \"function\" ? chunkOrCallback : undefined;\n const cb: (() => void) | undefined =\n typeof chunkOrCallback === \"function\"\n ? (chunkOrCallback as () => void)\n : typeof encodingOrCallback === \"function\"\n ? (encodingOrCallback as () => void)\n : callback;\n\n const finish = async (): Promise<void> => {\n try {\n if (chunk !== undefined) {\n await this._getWriter().write(chunk);\n }\n await this._getWriter().close();\n this._finished = true;\n this.emit(\"finish\");\n if (cb) {\n cb();\n }\n } catch (err) {\n this.emit(\"error\", err);\n }\n };\n\n finish();\n return this;\n }\n\n /**\n * Destroy the stream\n */\n destroy(error?: Error): this {\n if (this._destroyed) {\n return this;\n }\n\n this._destroyed = true;\n this._ended = true;\n\n if (error) {\n this._errored = error;\n this.emit(\"error\", error);\n }\n\n if (this._writer) {\n this._writer.abort(error).catch(() => {});\n }\n\n this._closed = true;\n this.emit(\"close\");\n return this;\n }\n\n /**\n * Get the underlying Web WritableStream\n */\n get webStream(): WritableStream<T> {\n return this._stream;\n }\n\n get writable(): boolean {\n return !this._destroyed && !this._ended;\n }\n\n get writableEnded(): boolean {\n return this._ended;\n }\n\n get writableFinished(): boolean {\n return this._finished;\n }\n\n get writableLength(): number {\n return this._writableLength;\n }\n\n /** Whether the stream has been destroyed */\n get destroyed(): boolean {\n return this._destroyed;\n }\n\n /** The error that destroyed the stream, or null */\n get errored(): Error | null {\n return this._errored;\n }\n\n /** Whether the stream has been closed */\n get closed(): boolean {\n return this._closed;\n }\n\n /** Whether the stream needs drain (writableLength exceeds high water mark) */\n get writableNeedDrain(): boolean {\n return this._writableLength >= this.writableHighWaterMark;\n }\n\n /** How many times cork() has been called without uncork() */\n get writableCorked(): number {\n return this._corked;\n }\n\n /** Whether the stream was aborted */\n get writableAborted(): boolean {\n return this._aborted;\n }\n\n /** Whether the stream is in object mode */\n get writableObjectMode(): boolean {\n return this.objectMode;\n }\n\n /** Get default encoding */\n get defaultEncoding(): string {\n return this._defaultEncoding;\n }\n\n /**\n * Get the internal buffer state (for debugging)\n * Returns array of objects with length and chunk info\n */\n get writableBuffer(): { length: number; head: T | null } {\n return {\n length: this._corkedChunks.length,\n head: this._corkedChunks.length > 0 ? this._corkedChunks[0].chunk : null\n };\n }\n\n /**\n * Write multiple chunks at once (batch write).\n * Override in subclass to implement custom batch write logic.\n */\n _writev(\n chunks: Array<{ chunk: T; encoding?: string }>,\n callback: (error?: Error | null) => void\n ): void {\n // Default implementation: write each chunk individually\n let i = 0;\n const writeNext = (): void => {\n if (i >= chunks.length) {\n callback(null);\n return;\n }\n\n const { chunk } = chunks[i++];\n this._doWrite(chunk, err => {\n if (err) {\n callback(err);\n return;\n }\n // Continue to next chunk\n writeNext();\n });\n };\n\n writeNext();\n }\n\n /**\n * Batch write multiple chunks\n */\n writev(\n chunks: Array<{ chunk: T; encoding?: string }>,\n callback?: (error?: Error | null) => void\n ): boolean {\n if (this._destroyed || this._ended) {\n const err = new Error(\"Cannot write after stream destroyed/ended\");\n callback?.(err);\n return false;\n }\n\n this._writev(chunks, callback ?? (() => {}));\n\n // Return backpressure indicator\n return this._writableLength < this.writableHighWaterMark;\n }\n\n private _getWriter(): WritableStreamDefaultWriter<T> {\n if (!this._writer) {\n this._writer = this._stream.getWriter();\n }\n return this._writer;\n }\n\n // =========================================================================\n // Static Methods (Node.js compatibility)\n // =========================================================================\n\n /**\n * Convert a Web WritableStream to Node.js Writable\n */\n static fromWeb<T>(webStream: WritableStream<T>, options?: WritableStreamOptions): Writable<T> {\n return new Writable<T>({ ...options, stream: webStream });\n }\n\n /**\n * Convert a Node.js Writable to Web WritableStream\n */\n static toWeb<T>(nodeStream: Writable<T>): WritableStream<T> {\n return nodeStream.webStream;\n }\n}\n\n// =============================================================================\n// Cross-environment stream normalization\n// =============================================================================\n\n/**\n * Normalize a user-provided writable into this module's Writable.\n * Keeps Web/Node branching at the stream-module boundary.\n */\nexport function normalizeWritable<T = Uint8Array>(\n stream: WritableLike | WritableStream<T> | NodeWritable\n): WritableLike {\n if (stream instanceof Writable) {\n return stream;\n }\n\n // Web WritableStream\n if ((stream as any)?.getWriter) {\n return new Writable<T>({ stream: stream as WritableStream<T> });\n }\n\n // Already a Node-like writable (e.g. StreamBuf)\n return stream as WritableLike;\n}\n\n// =============================================================================\n// Transform Stream Wrapper\n// =============================================================================\n\n/**\n * A wrapper around Web TransformStream that provides Node.js-like API\n */\nexport class Transform<TInput = Uint8Array, TOutput = Uint8Array> extends EventEmitter {\n private _stream: TransformStream<TInput, TOutput>;\n /** @internal - for pipe() support */\n readonly _readable: Readable<TOutput>;\n /** @internal - for pipe() support */\n readonly _writable: Writable<TInput>;\n readonly objectMode: boolean;\n private _ended: boolean = false;\n private _destroyed: boolean = false;\n private _errored: boolean = false;\n // Buffer for Node.js style push() calls during transform\n private _pushBuffer: TOutput[] = [];\n // Controller for enqueueing pushed data (set during transform execution)\n private _transformController: TransformStreamDefaultController<TOutput> | null = null;\n // Buffer for writes that occur after end() but before writable is closed\n private _pendingEndWrites: { chunk: TInput; callback?: (error?: Error | null) => void }[] = [];\n // Whether end() has been called but writable not yet closed\n private _endPending: boolean = false;\n\n /**\n * Push data to the readable side (Node.js compatibility)\n * Can be called from within transform callback\n */\n push(chunk: TOutput | null): boolean {\n if (chunk === null) {\n return false;\n }\n if (this._transformController) {\n // If we're in a transform callback, enqueue directly\n this._transformController.enqueue(chunk);\n } else {\n // Otherwise buffer for later\n this._pushBuffer.push(chunk);\n }\n return true;\n }\n\n constructor(\n options?: TransformStreamOptions & {\n transform?:\n | ((chunk: TInput) => TOutput | Promise<TOutput>)\n | ((\n this: Transform<TInput, TOutput>,\n chunk: TInput,\n encoding: string,\n callback: (error?: Error | null, data?: TOutput) => void\n ) => void);\n flush?:\n | (() => TOutput | void | Promise<TOutput | void>)\n | ((\n this: Transform<TInput, TOutput>,\n callback: (error?: Error | null, data?: TOutput) => void\n ) => void);\n }\n ) {\n super();\n this.objectMode = options?.objectMode ?? false;\n\n const userTransform = options?.transform;\n const userFlush = options?.flush;\n\n // Create bound references for use in TransformStream callbacks\n const setController = (ctrl: TransformStreamDefaultController<TOutput> | null): void => {\n this._transformController = ctrl;\n };\n const emitEvent = (event: string, ...args: any[]): boolean => {\n if (event === \"error\") {\n // Only emit error once to prevent duplicate events\n if (this._errored) {\n return false;\n }\n this._errored = true;\n // Also destroy the writable to prevent further writes\n this._writable.destroy(args[0] as Error);\n }\n return this.emit(event, ...args);\n };\n const getInstance = (): Transform<TInput, TOutput> => this;\n\n // Check if subclass overrides _transform (for Node.js compatibility)\n // We need to check this at runtime since the subclass constructor runs after super()\n const hasSubclassTransform = (): boolean => {\n // If userTransform was provided in options, use that\n if (userTransform) {\n return false;\n }\n // Check if _transform is overridden (not the base class no-op)\n const proto = Object.getPrototypeOf(this);\n return proto._transform !== Transform.prototype._transform;\n };\n\n const hasSubclassFlush = (): boolean => {\n if (userFlush) {\n return false;\n }\n const proto = Object.getPrototypeOf(this);\n return proto._flush !== Transform.prototype._flush;\n };\n\n this._stream = new TransformStream<TInput, TOutput>({\n transform: async (chunk, controller) => {\n // Skip processing if already errored\n if (this._errored) {\n return;\n }\n\n try {\n // Set controller for push() to use\n setController(controller);\n\n // Check for subclass _transform override first\n if (hasSubclassTransform()) {\n // Call subclass _transform method (Node.js style)\n // _transform signature is (chunk, encoding, callback)\n await new Promise<void>((resolve, reject) => {\n this._transform(chunk, \"utf8\", (err?: Error | null, data?: TOutput) => {\n if (err) {\n reject(err);\n } else {\n if (data !== undefined) {\n controller.enqueue(data);\n }\n resolve();\n }\n });\n });\n } else if (userTransform) {\n const transformParamCount = userTransform.length;\n\n if (transformParamCount >= 3) {\n // Node.js style: transform(chunk, encoding, callback)\n await new Promise<void>((resolve, reject) => {\n (\n userTransform as (\n this: Transform<TInput, TOutput>,\n chunk: TInput,\n encoding: string,\n callback: (error?: Error | null, data?: TOutput) => void\n ) => void\n ).call(getInstance(), chunk, \"utf8\", (err?: Error | null, data?: TOutput) => {\n if (err) {\n reject(err);\n } else {\n if (data !== undefined) {\n controller.enqueue(data);\n }\n resolve();\n }\n });\n });\n } else if (transformParamCount === 2) {\n await new Promise<void>((resolve, reject) => {\n (\n userTransform as (\n this: Transform<TInput, TOutput>,\n chunk: TInput,\n callback: (error?: Error | null, data?: TOutput) => void\n ) => void\n ).call(getInstance(), chunk, (err?: Error | null, data?: TOutput) => {\n if (err) {\n reject(err);\n } else {\n if (data !== undefined) {\n controller.enqueue(data);\n }\n resolve();\n }\n });\n });\n } else {\n // Simple style: transform(chunk) => result\n const result = userTransform.call(getInstance(), chunk);\n if (result && typeof result.then === \"function\") {\n const awaitedResult = await result;\n if (awaitedResult !== undefined) {\n controller.enqueue(awaitedResult);\n }\n } else {\n if (result !== undefined) {\n controller.enqueue(result);\n }\n }\n }\n } else {\n // Default: pass through\n controller.enqueue(chunk as any as TOutput);\n }\n } catch (err) {\n controller.error(err);\n emitEvent(\"error\", err);\n } finally {\n setController(null);\n }\n },\n flush: async controller => {\n try {\n setController(controller);\n\n // Check for subclass _flush override first\n if (hasSubclassFlush()) {\n await new Promise<void>((resolve, reject) => {\n this._flush((err?: Error | null, data?: TOutput) => {\n if (err) {\n reject(err);\n } else {\n if (data !== undefined) {\n controller.enqueue(data);\n }\n resolve();\n }\n });\n });\n } else if (userFlush) {\n const flushParamCount = userFlush.length;\n\n if (flushParamCount >= 1) {\n // Node.js style: flush(callback)\n await new Promise<void>((resolve, reject) => {\n (\n userFlush as (\n this: Transform<TInput, TOutput>,\n callback: (error?: Error | null, data?: TOutput) => void\n ) => void\n ).call(getInstance(), (err?: Error | null, data?: TOutput) => {\n if (err) {\n reject(err);\n } else {\n if (data !== undefined) {\n controller.enqueue(data);\n }\n resolve();\n }\n });\n });\n } else {\n // Simple style: flush() => result\n const result = userFlush.call(getInstance());\n if (result && typeof result.then === \"function\") {\n const awaitedResult = await result;\n if (awaitedResult !== undefined && awaitedResult !== null) {\n controller.enqueue(awaitedResult as TOutput);\n }\n } else {\n if (result !== undefined && result !== null) {\n controller.enqueue(result as TOutput);\n }\n }\n }\n }\n // No flush defined - nothing to do\n } catch (err) {\n controller.error(err);\n emitEvent(\"error\", err);\n } finally {\n setController(null);\n }\n }\n });\n\n this._readable = new Readable<TOutput>({\n stream: this._stream.readable,\n objectMode: this.objectMode\n });\n\n this._writable = new Writable<TInput>({\n stream: this._stream.writable,\n objectMode: this.objectMode\n });\n\n // Forward non-data events (data forwarding is lazy to avoid premature flowing)\n this._readable.on(\"end\", () => this.emit(\"end\"));\n // Only forward errors if not already errored (to prevent duplicate events)\n this._readable.on(\"error\", err => {\n if (!this._errored) {\n this._errored = true;\n this.emit(\"error\", err);\n }\n });\n this._writable.on(\"finish\", () => this.emit(\"finish\"));\n this._writable.on(\"drain\", () => this.emit(\"drain\"));\n // Only forward errors if not already errored (to prevent duplicate events)\n this._writable.on(\"error\", err => {\n if (!this._errored) {\n this._errored = true;\n this.emit(\"error\", err);\n }\n });\n }\n\n // Track if we've already set up data forwarding\n private _dataForwardingSetup: boolean = false;\n\n /**\n * Override on to start flowing when data listener is added\n */\n on(event: string | symbol, listener: (...args: any[]) => void): this {\n // Set up data forwarding when first external data listener is added\n if (event === \"data\" && !this._dataForwardingSetup) {\n this._dataForwardingSetup = true;\n this._readable.on(\"data\", data => this.emit(\"data\", data));\n }\n\n super.on(event, listener);\n\n // When data listener is added, mark as having consumer\n // and start the readable in flowing mode\n if (event === \"data\") {\n this._hasDataConsumer = true;\n this._readable.resume();\n }\n return this;\n }\n\n /** @internal - whether we have a data event consumer */\n private _hasDataConsumer: boolean = false;\n\n /**\n * Write data to the transform stream\n * Note: Automatically starts consuming readable if no consumer to allow\n * transform function to execute (Web Streams backpressure compatibility)\n */\n write(chunk: TInput, callback?: (error?: Error | null) => void): boolean;\n write(chunk: TInput, encoding?: string, callback?: (error?: Error | null) => void): boolean;\n write(\n chunk: TInput,\n encodingOrCallback?: string | ((error?: Error | null) => void),\n callback?: (error?: Error | null) => void\n ): boolean {\n const cb = typeof encodingOrCallback === \"function\" ? encodingOrCallback : callback;\n if (this._destroyed || this._errored) {\n const err = new Error(\n this._errored ? \"Cannot write after stream errored\" : \"Cannot write after stream destroyed\"\n );\n queueMicrotask(() => this.emit(\"error\", err));\n cb?.(err);\n return false;\n }\n\n // Ensure readable is being consumed to allow transform to execute\n // This matches Node.js behavior where transform executes immediately on write\n // Only auto-consume if no explicit consumer (data listener or pipe)\n if (!this._readableConsuming && !this._hasDataConsumer) {\n this._readableConsuming = true;\n this._startAutoConsume();\n }\n\n // If end() was called but writable not yet closed, buffer the write\n // This allows writes during data event handlers to be processed\n if (this._endPending) {\n this._pendingEndWrites.push({ chunk, callback: cb });\n return true;\n }\n\n return this._writable.write(chunk, cb);\n }\n\n /** @internal - whether we're auto-consuming the readable */\n private _readableConsuming: boolean = false;\n /** @internal - buffer for auto-consumed data */\n private _autoConsumedBuffer: TOutput[] = [];\n private _autoConsumedBufferIndex: number = 0;\n /** @internal - whether auto-consume has ended */\n private _autoConsumeEnded: boolean = false;\n /** @internal - promise that resolves when auto-consume finishes */\n private _autoConsumePromise: Promise<void> | null = null;\n\n /** @internal - auto-consume readable to allow transform to execute */\n private _startAutoConsume(): void {\n this._autoConsumePromise = (async () => {\n try {\n for await (const chunk of this._readable) {\n // Buffer the data for later retrieval\n this._autoConsumedBuffer.push(chunk);\n // Also emit data event for listeners\n this.emit(\"data\", chunk);\n }\n this._autoConsumeEnded = true;\n this.emit(\"end\");\n } catch (err) {\n this.emit(\"error\", err);\n }\n })();\n }\n\n /**\n * End the transform stream\n * Delays closing to allow writes during data events to complete\n */\n end(callback?: () => void): this;\n end(chunk: TInput, callback?: () => void): this;\n end(chunk: TInput, encoding?: string, callback?: () => void): this;\n end(\n chunkOrCallback?: TInput | (() => void),\n encodingOrCallback?: string | (() => void),\n callback?: () => void\n ): this {\n if (this._ended) {\n return this;\n }\n this._ended = true;\n this._endPending = true;\n\n const chunk = typeof chunkOrCallback === \"function\" ? undefined : chunkOrCallback;\n const cb: (() => void) | undefined =\n typeof chunkOrCallback === \"function\"\n ? (chunkOrCallback as () => void)\n : typeof encodingOrCallback === \"function\"\n ? (encodingOrCallback as () => void)\n : callback;\n\n if (cb) {\n this.once(\"finish\", cb as any);\n }\n\n if (chunk !== undefined) {\n this._writable.write(chunk);\n }\n\n // Use setTimeout(0) instead of queueMicrotask to ensure all transform\n // processing and data events complete before we close the writable.\n // Microtasks run before the TransformStream processes data.\n setTimeout(() => {\n // Process any writes that occurred during data events\n for (const { chunk: pendingChunk, callback } of this._pendingEndWrites) {\n this._writable.write(pendingChunk, callback);\n }\n this._pendingEndWrites = [];\n this._endPending = false;\n this._writable.end();\n }, 0);\n return this;\n }\n\n /**\n * Read from the transform stream\n */\n read(size?: number): TOutput | null {\n return this._readable.read(size);\n }\n\n /**\n * Pipe to another stream (writable, transform, or duplex)\n */\n pipe<W extends Writable<TOutput> | Transform<TOutput, any> | Duplex<any, TOutput>>(\n destination: W\n ): W {\n // Mark as having consumer to prevent auto-consume conflict\n this._hasDataConsumer = true;\n return this._readable.pipe(destination as any) as W;\n }\n\n /**\n * Unpipe from destination\n */\n unpipe(destination?: any): this {\n this._readable.unpipe(destination as any);\n return this;\n }\n\n /**\n * Check if paused\n */\n isPaused(): boolean {\n return this._readable.isPaused();\n }\n\n /**\n * Resume reading from the readable side\n */\n resume(): this {\n this._readable.resume();\n return this;\n }\n\n /**\n * Pause reading from the readable side\n */\n pause(): this {\n this._readable.pause();\n return this;\n }\n\n /**\n * Destroy the stream\n */\n destroy(error?: Error): void {\n if (this._destroyed) {\n return;\n }\n this._destroyed = true;\n this._readable.destroy(error);\n this._writable.destroy(error);\n queueMicrotask(() => this.emit(\"close\"));\n }\n\n /**\n * Get the underlying Web TransformStream\n */\n get webStream(): TransformStream<TInput, TOutput> {\n return this._stream;\n }\n\n get readable(): boolean {\n return this._readable.readable;\n }\n\n get writable(): boolean {\n return this._writable.writable;\n }\n\n get readableEnded(): boolean {\n return this._readable.readableEnded;\n }\n\n get writableEnded(): boolean {\n return this._writable.writableEnded;\n }\n\n get writableFinished(): boolean {\n return this._writable.writableFinished;\n }\n\n get readableLength(): number {\n return this._readable.readableLength;\n }\n\n get writableLength(): number {\n return this._writable.writableLength;\n }\n\n get readableHighWaterMark(): number {\n return this._readable.readableHighWaterMark;\n }\n\n get writableHighWaterMark(): number {\n return this._writable.writableHighWaterMark;\n }\n\n get readableObjectMode(): boolean {\n return (this._readable as any).readableObjectMode ?? this._readable.objectMode;\n }\n\n get readableFlowing(): boolean | null {\n return (this._readable as any).readableFlowing;\n }\n\n get destroyed(): boolean {\n return this._destroyed;\n }\n\n /**\n * Async iterator support\n */\n async *[Symbol.asyncIterator](): AsyncIterableIterator<TOutput> {\n // If auto-consume is running, wait for it to finish and use its buffer\n if (this._autoConsumePromise) {\n await this._autoConsumePromise;\n // Yield all buffered data\n while (this._autoConsumedBufferIndex < this._autoConsumedBuffer.length) {\n yield this._autoConsumedBuffer[this._autoConsumedBufferIndex++]!;\n }\n // Reset when drained to avoid prefix growth\n this._autoConsumedBuffer.length = 0;\n this._autoConsumedBufferIndex = 0;\n return;\n }\n\n // Otherwise delegate to readable's iterator\n yield* this._readable[Symbol.asyncIterator]();\n }\n\n // =========================================================================\n // Static Methods (Node.js compatibility)\n // =========================================================================\n\n /**\n * Convert a Web TransformStream to Node.js Transform\n */\n static fromWeb<TIn = Uint8Array, TOut = Uint8Array>(\n webStream: TransformStream<TIn, TOut>,\n options?: TransformStreamOptions\n ): Transform<TIn, TOut> {\n const transform = new Transform<TIn, TOut>(options);\n // Connect the web stream - set the internal _stream property\n (transform as any)._stream = webStream;\n\n // Replace internal streams with the ones from the web stream\n const newReadable = Readable.fromWeb(webStream.readable, { objectMode: options?.objectMode });\n const newWritable = Writable.fromWeb(webStream.writable, { objectMode: options?.objectMode });\n\n // Remove old event listeners before replacing\n (transform as any)._readable.removeAllListeners();\n (transform as any)._writable.removeAllListeners();\n\n (transform as any)._readable = newReadable;\n (transform as any)._writable = newWritable;\n\n // Re-connect event forwarding\n newReadable.on(\"data\", (data: TOut) => transform.emit(\"data\", data));\n newReadable.on(\"end\", () => transform.emit(\"end\"));\n newReadable.on(\"error\", (err: Error) => transform.emit(\"error\", err));\n newWritable.on(\"finish\", () => transform.emit(\"finish\"));\n newWritable.on(\"drain\", () => transform.emit(\"drain\"));\n newWritable.on(\"error\", (err: Error) => transform.emit(\"error\", err));\n\n return transform;\n }\n\n /**\n * Convert a Node.js Transform to Web TransformStream\n */\n static toWeb<TIn = Uint8Array, TOut = Uint8Array>(\n nodeStream: Transform<TIn, TOut>\n ): TransformStream<TIn, TOut> {\n return nodeStream.webStream;\n }\n\n // =========================================================================\n // Base Class Methods (for subclass override detection)\n // =========================================================================\n\n /**\n * Base transform method - can be overridden by subclasses.\n * Default behavior: pass through chunk unchanged.\n */\n _transform(\n chunk: TInput,\n encoding: string,\n callback: (error?: Error | null, data?: TOutput) => void\n ): void {\n // Default: pass through unchanged\n callback(null, chunk as any as TOutput);\n }\n\n /**\n * Base flush method - can be overridden by subclasses.\n * Called when the stream ends to allow final processing.\n */\n _flush(callback: (error?: Error | null, data?: TOutput) => void): void {\n // Default: no-op\n callback();\n }\n}\n\n// =============================================================================\n// Duplex Stream\n// =============================================================================\n\n/**\n * A duplex stream that combines readable and writable\n */\nexport class Duplex<TRead = Uint8Array, TWrite = Uint8Array> extends EventEmitter {\n /** @internal - for pipe() support */\n readonly _readable: Readable<TRead>;\n /** @internal - for pipe() support */\n readonly _writable: Writable<TWrite>;\n readonly allowHalfOpen: boolean;\n readonly readableObjectMode: boolean;\n readonly writableObjectMode: boolean;\n\n /**\n * Create a Duplex stream from various sources\n */\n static from<R = Uint8Array, W = Uint8Array>(\n source:\n | Duplex<R, W>\n | Readable<R>\n | Writable<W>\n | AsyncIterable<R>\n | Iterable<R>\n | {\n readable?: Readable<R>;\n writable?: Writable<W>;\n }\n ): Duplex<R, W> {\n // If it's already a Duplex, return as-is\n if (source instanceof Duplex) {\n return source;\n }\n\n const forwardReadableToDuplex = (readable: Readable<R>, duplex: Duplex<R, W>): void => {\n const sink = new Writable<R>({\n objectMode: duplex.readableObjectMode,\n write(chunk, _encoding, callback) {\n duplex.push(chunk);\n callback();\n },\n final(callback) {\n duplex.push(null);\n callback();\n }\n });\n\n readable.on(\"error\", err => duplex.emit(\"error\", err));\n readable.pipe(sink);\n };\n\n // If it has readable and/or writable properties\n if (\n typeof source === \"object\" &&\n source !== null &&\n \"readable\" in source &&\n \"writable\" in source\n ) {\n const duplex = new Duplex<R, W>();\n const pair = source as { readable?: Readable<R>; writable?: Writable<W> };\n\n if (pair.readable) {\n forwardReadableToDuplex(pair.readable, duplex);\n }\n\n if (pair.writable) {\n return new Duplex<R, W>({\n objectMode: duplex.writableObjectMode,\n write(chunk, encoding, callback) {\n pair.writable!.write(chunk, encoding, callback);\n },\n final(callback) {\n pair.writable!.end(callback);\n }\n });\n }\n\n return duplex;\n }\n\n // If it's an iterable\n if (\n typeof source === \"object\" &&\n source !== null &&\n (Symbol.asyncIterator in (source as object) || Symbol.iterator in (source as object))\n ) {\n const readable = Readable.from(source as AsyncIterable<R> | Iterable<R>);\n const duplex = new Duplex<R, W>();\n forwardReadableToDuplex(readable, duplex);\n return duplex;\n }\n\n // If it's a Readable\n if (source instanceof Readable) {\n const duplex = new Duplex<R, W>();\n forwardReadableToDuplex(source, duplex);\n return duplex;\n }\n\n // If it's a Writable\n if (source instanceof Writable) {\n return new Duplex<R, W>({\n objectMode: true,\n write(chunk, encoding, callback) {\n source.write(chunk as W, encoding, callback);\n },\n final(callback) {\n source.end(callback);\n }\n });\n }\n\n throw new Error(\"Duplex.from: unsupported source type\");\n }\n\n /**\n * Create a Duplex from a Web ReadableWritablePair\n */\n static fromWeb<R = Uint8Array, W = Uint8Array>(\n pair: { readable: ReadableStream<R>; writable: WritableStream<W> },\n options?: DuplexStreamOptions\n ): Duplex<R, W> {\n const duplex = new Duplex<R, W>(options);\n\n // Replace internal streams\n (duplex as any)._readable = new Readable<R>({ stream: pair.readable });\n (duplex as any)._writable = new Writable<W>({ stream: pair.writable });\n\n return duplex;\n }\n\n /**\n * Convert a Node.js Duplex to Web ReadableWritablePair\n */\n static toWeb<R = Uint8Array, W = Uint8Array>(\n duplex: Duplex<R, W>\n ): { readable: ReadableStream<R>; writable: WritableStream<W> } {\n return {\n readable: duplex._readable.webStream,\n writable: duplex._writable.webStream\n };\n }\n\n // Track if we've already set up data forwarding\n private _dataForwardingSetup: boolean = false;\n\n constructor(\n options?: DuplexStreamOptions & {\n allowHalfOpen?: boolean;\n objectMode?: boolean;\n read?: (this: Duplex<TRead, TWrite>, size?: number) => void;\n write?: (\n this: Duplex<TRead, TWrite>,\n chunk: TWrite,\n encoding: string,\n callback: (error?: Error | null) => void\n ) => void;\n final?: (this: Duplex<TRead, TWrite>, callback: (error?: Error | null) => void) => void;\n }\n ) {\n super();\n\n this.allowHalfOpen = options?.allowHalfOpen ?? true;\n // Support shorthand objectMode option\n const objectMode = options?.objectMode ?? false;\n this.readableObjectMode = options?.readableObjectMode ?? objectMode;\n this.writableObjectMode = options?.writableObjectMode ?? objectMode;\n\n this._readable = new Readable<TRead>({\n highWaterMark: options?.readableHighWaterMark,\n objectMode: this.readableObjectMode,\n read: options?.read?.bind(this as any)\n });\n\n this._writable = new Writable<TWrite>({\n highWaterMark: options?.writableHighWaterMark,\n objectMode: this.writableObjectMode,\n write: options?.write?.bind(this as any),\n final: options?.final?.bind(this as any)\n });\n\n // Forward non-data events (data forwarding is lazy to avoid premature flowing)\n this._readable.on(\"end\", () => {\n this.emit(\"end\");\n // If not allowHalfOpen, end the writable side too\n if (!this.allowHalfOpen) {\n this._writable.end();\n }\n });\n this._readable.on(\"error\", err => this.emit(\"error\", err));\n this._writable.on(\"finish\", () => this.emit(\"finish\"));\n this._writable.on(\"drain\", () => this.emit(\"drain\"));\n this._writable.on(\"close\", () => {\n // If not allowHalfOpen, destroy the readable side too\n if (!this.allowHalfOpen && !this._readable.destroyed) {\n this._readable.destroy();\n }\n });\n }\n\n /**\n * Override on() to set up data forwarding lazily\n */\n override on(event: string | symbol, listener: (...args: any[]) => void): this {\n // Set up data forwarding when first external data listener is added\n if (event === \"data\" && !this._dataForwardingSetup) {\n this._dataForwardingSetup = true;\n this._readable.on(\"data\", chunk => this.emit(\"data\", chunk));\n }\n return super.on(event, listener);\n }\n\n /**\n * Push data to readable side\n */\n push(chunk: TRead | null): boolean {\n return this._readable.push(chunk);\n }\n\n /**\n * Put a chunk back at the front of the buffer (readable side)\n */\n unshift(chunk: TRead): void {\n this._readable.unshift(chunk);\n }\n\n /**\n * Read from readable side\n */\n read(size?: number): TRead | null {\n return this._readable.read(size);\n }\n\n /**\n * Write to writable side\n */\n write(chunk: TWrite, callback?: (error?: Error | null) => void): boolean;\n write(chunk: TWrite, encoding?: string, callback?: (error?: Error | null) => void): boolean;\n write(\n chunk: TWrite,\n encodingOrCallback?: string | ((error?: Error | null) => void),\n callback?: (error?: Error | null) => void\n ): boolean {\n const cb = typeof encodingOrCallback === \"function\" ? encodingOrCallback : callback;\n return this._writable.write(chunk, cb);\n }\n\n /**\n * End writable side\n */\n end(callback?: () => void): this;\n end(chunk: TWrite, callback?: () => void): this;\n end(chunk: TWrite, encoding?: string, callback?: () => void): this;\n end(\n chunkOrCallback?: TWrite | (() => void),\n encodingOrCallback?: string | (() => void),\n callback?: () => void\n ): this {\n const chunk = typeof chunkOrCallback === \"function\" ? undefined : chunkOrCallback;\n const cb: (() => void) | undefined =\n typeof chunkOrCallback === \"function\"\n ? (chunkOrCallback as () => void)\n : typeof encodingOrCallback === \"function\"\n ? (encodingOrCallback as () => void)\n : callback;\n\n if (cb) {\n this.once(\"finish\", cb as any);\n }\n\n if (chunk !== undefined) {\n this._writable.write(chunk);\n }\n this._writable.end();\n return this;\n }\n\n /**\n * Cork the writable side\n */\n cork(): void {\n this._writable.cork();\n }\n\n /**\n * Uncork the writable side\n */\n uncork(): void {\n this._writable.uncork();\n }\n\n /**\n * Set encoding for readable side\n */\n setEncoding(encoding: string): this {\n this._readable.setEncoding(encoding);\n return this;\n }\n\n /**\n * Set default encoding for writable side\n */\n setDefaultEncoding(encoding: string): this {\n this._writable.setDefaultEncoding(encoding);\n return this;\n }\n\n /**\n * Pipe readable side to destination\n */\n pipe<W extends Writable<TRead> | Transform<TRead, any>>(destination: W): W {\n if (destination instanceof Transform) {\n this._readable.pipe(destination._writable);\n return destination;\n }\n this._readable.pipe(destination);\n return destination;\n }\n\n /**\n * Unpipe from destination\n */\n unpipe(destination?: Writable<TRead>): this {\n this._readable.unpipe(destination);\n return this;\n }\n\n /**\n * Pause the readable side\n */\n pause(): this {\n this._readable.pause();\n return this;\n }\n\n /**\n * Resume the readable side\n */\n resume(): this {\n this._readable.resume();\n return this;\n }\n\n /**\n * Check if paused\n */\n isPaused(): boolean {\n return this._readable.isPaused();\n }\n\n /**\n * Destroy both sides\n */\n destroy(error?: Error): this {\n this._readable.destroy(error);\n this._writable.destroy(error);\n return this;\n }\n\n get readable(): boolean {\n return this._readable.readable;\n }\n\n get writable(): boolean {\n return this._writable.writable;\n }\n\n get readableEnded(): boolean {\n return this._readable.readableEnded;\n }\n\n get writableEnded(): boolean {\n return this._writable.writableEnded;\n }\n\n get writableFinished(): boolean {\n return this._writable.writableFinished;\n }\n\n get readableLength(): number {\n return this._readable.readableLength;\n }\n\n get writableLength(): number {\n return this._writable.writableLength;\n }\n\n get readableHighWaterMark(): number {\n return this._readable.readableHighWaterMark;\n }\n\n get writableHighWaterMark(): number {\n return this._writable.writableHighWaterMark;\n }\n\n get destroyed(): boolean {\n return this._readable.destroyed && this._writable.destroyed;\n }\n\n get writableCorked(): number {\n return this._writable.writableCorked;\n }\n\n get writableNeedDrain(): boolean {\n return this._writable.writableNeedDrain;\n }\n\n /**\n * Async iterator support\n */\n [Symbol.asyncIterator](): AsyncIterableIterator<TRead> {\n return this._readable[Symbol.asyncIterator]();\n }\n}\n\n// =============================================================================\n// PassThrough Stream\n// =============================================================================\n\n/**\n * A passthrough stream that passes data through unchanged\n */\nexport class PassThrough<T = Uint8Array> extends Transform<T, T> {\n constructor(options?: TransformStreamOptions) {\n super({\n ...options,\n transform: chunk => chunk\n });\n }\n}\n\n// =============================================================================\n// Collector Stream\n// =============================================================================\n\n/**\n * A writable stream that collects all chunks\n */\nexport class Collector<T = Uint8Array> extends Writable<T> {\n public chunks: T[] = [];\n\n constructor(options?: WritableStreamOptions) {\n const collectedChunks: T[] = [];\n\n super({\n ...options,\n stream: new WritableStream<T>({\n write: chunk => {\n collectedChunks.push(chunk);\n },\n close: () => {\n // Finished\n }\n })\n });\n\n this.chunks = collectedChunks;\n }\n\n // Override write to be synchronous - Collector doesn't need async behavior\n // This makes behavior consistent with Node.js Collector\n override write(chunk: T, callback?: (error?: Error | null) => void): boolean;\n override write(chunk: T, encoding?: string, callback?: (error?: Error | null) => void): boolean;\n override write(\n chunk: T,\n encodingOrCallback?: string | ((error?: Error | null) => void),\n callback?: (error?: Error | null) => void\n ): boolean {\n if (this.writableEnded || this.writableFinished) {\n const err = new Error(\"write after end\");\n this.emit(\"error\", err);\n return false;\n }\n\n const cb = typeof encodingOrCallback === \"function\" ? encodingOrCallback : callback;\n\n // Synchronously push to chunks\n this.chunks.push(chunk);\n cb?.(null);\n return true;\n }\n\n /**\n * Get all collected data as a single Uint8Array (for binary mode)\n */\n toUint8Array(): Uint8Array {\n const chunks = this.chunks;\n const len = chunks.length;\n if (len === 0) {\n return new Uint8Array(0);\n }\n if (len === 1 && chunks[0] instanceof Uint8Array) {\n return chunks[0];\n }\n\n // If chunks are Uint8Arrays, concatenate them\n if (chunks[0] instanceof Uint8Array) {\n return concatUint8Arrays(chunks as Uint8Array[]);\n }\n\n throw new Error(\"Collector contains non-binary data\");\n }\n\n /**\n * Get all collected data as a string\n */\n override toString(): string {\n const chunks = this.chunks;\n const len = chunks.length;\n if (len === 0) {\n return \"\";\n }\n\n const first = chunks[0];\n if (typeof first === \"string\") {\n if (len === 1) {\n return first;\n }\n return (chunks as string[]).join(\"\");\n }\n\n return textDecoder.decode(this.toUint8Array());\n }\n\n get isFinished(): boolean {\n // Use inherited writable property\n return this.writableFinished;\n }\n}\n\n// =============================================================================\n// PullStream / BufferedStream / DataChunk helpers\n// =============================================================================\n\nexport class PullStream extends StandalonePullStream {\n // Keep constructor signature aligned with streams.browser.ts public API\n constructor(options?: PullStreamOptions | StandalonePullStreamOptions) {\n super(options as any);\n }\n}\n\nexport class StringChunk extends StandaloneStringChunk implements DataChunk {}\nexport class BufferChunk extends StandaloneBufferChunk implements DataChunk {}\nexport class BufferedStream extends StandaloneBufferedStream {\n constructor(options?: BufferedStreamOptions) {\n super(options);\n }\n}\n\n// =============================================================================\n// Stream Creation Functions\n// =============================================================================\n\n/**\n * Create a readable stream with custom read implementation\n */\nexport function createReadable<T = Uint8Array>(\n options?: ReadableStreamOptions & {\n read?: (size: number) => void;\n destroy?: (error: Error | null, callback: (error: Error | null) => void) => void;\n }\n): IReadable<T> {\n const readable = new Readable<T>(options);\n\n // Override read behavior if provided\n if (options?.read) {\n const originalRead = readable.read.bind(readable);\n readable.read = function (size?: number): T | null {\n options.read!(size ?? 16384);\n return originalRead(size);\n };\n }\n\n return readable;\n}\n\n/**\n * Create a readable stream from an async iterable\n */\nexport function createReadableFromAsyncIterable<T>(\n iterable: AsyncIterable<T>,\n options?: ReadableStreamOptions\n): IReadable<T> {\n const readable = new Readable<T>({ ...options, objectMode: options?.objectMode ?? true });\n\n (async () => {\n try {\n for await (const chunk of iterable) {\n if (!readable.push(chunk)) {\n // Backpressure - wait a bit\n await new Promise(resolve => setTimeout(resolve, 0));\n }\n }\n readable.push(null);\n } catch (err) {\n readable.destroy(err as Error);\n }\n })();\n\n return readable;\n}\n\n/**\n * Create a readable stream from an array\n */\nexport function createReadableFromArray<T>(\n data: T[],\n options?: ReadableStreamOptions\n): IReadable<T> {\n let index = 0;\n const readable = new Readable<T>({\n ...options,\n objectMode: options?.objectMode ?? true,\n read() {\n // Push data when read is called\n while (index < data.length) {\n if (!this.push(data[index++])) {\n // Backpressure - wait for next read\n return;\n }\n }\n // All data pushed, end the stream\n this.push(null);\n }\n });\n\n return readable;\n}\n\n/**\n * Create a writable stream with custom write implementation\n */\nexport function createWritable<T = Uint8Array>(\n options?: WritableStreamOptions & {\n write?: (chunk: T, encoding: string, callback: (error?: Error | null) => void) => void;\n final?: (callback: (error?: Error | null) => void) => void;\n destroy?: (error: Error | null, callback: (error: Error | null) => void) => void;\n }\n): IWritable<T> {\n // Create a custom WritableStream with user's handlers\n const stream = new WritableStream<T>({\n write: async chunk => {\n if (options?.write) {\n return new Promise<void>((resolve, reject) => {\n options.write!(chunk, \"utf8\", err => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n });\n });\n }\n },\n close: async () => {\n if (options?.final) {\n return new Promise<void>((resolve, reject) => {\n options.final!(err => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n });\n });\n }\n }\n });\n\n return new Writable<T>({ ...options, stream });\n}\n\n/**\n * Create a transform stream from a transform function\n */\nexport function createTransform<TInput = Uint8Array, TOutput = Uint8Array>(\n transformFn: (chunk: TInput, encoding?: string) => TOutput | Promise<TOutput>,\n options?: TransformStreamOptions & {\n flush?: () => TOutput | Promise<TOutput> | void;\n }\n): ITransform<TInput, TOutput> {\n return new Transform<TInput, TOutput>({\n ...options,\n transform: transformFn,\n flush: options?.flush\n });\n}\n\n/**\n * Create a collector stream\n */\nexport function createCollector<T = Uint8Array>(options?: WritableStreamOptions): ICollector<T> {\n return new Collector<T>(options);\n}\n\n/**\n * Create a passthrough stream\n */\nexport function createPassThrough<T = any>(options?: TransformStreamOptions): IPassThrough<T> {\n return new PassThrough(options);\n}\n\n/**\n * Create a pull stream\n */\nexport function createPullStream(options?: PullStreamOptions): PullStream {\n return new PullStream(options);\n}\n\n/**\n * Create a buffered stream\n */\nexport function createBufferedStream(options?: BufferedStreamOptions): BufferedStream {\n return new BufferedStream(options);\n}\n\n// =============================================================================\n// Pipeline Options (Node.js compatible)\n// =============================================================================\n\nexport interface PipelineOptions {\n /** AbortSignal to cancel the pipeline */\n signal?: AbortSignal;\n /** Whether to call end() on the destination when source ends */\n end?: boolean;\n}\n\n// =============================================================================\n// Pipeline\n// =============================================================================\n\ntype PipelineStream = PipelineStreamLike;\ntype PipelineCallback = (err?: Error | null) => void;\n\nconst isReadableStream = (value: unknown): value is ReadableStream<any> =>\n !!value && typeof value === \"object\" && typeof (value as any).getReader === \"function\";\n\nconst isAsyncIterable = (value: unknown): value is AsyncIterable<unknown> => {\n if (!value || (typeof value !== \"object\" && typeof value !== \"function\")) {\n return false;\n }\n return typeof (value as any)[Symbol.asyncIterator] === \"function\";\n};\n\nconst isWritableStream = (value: unknown): value is WritableStream<any> =>\n !!value && typeof value === \"object\" && typeof (value as any).getWriter === \"function\";\n\nconst isTransformStream = (value: unknown): value is TransformStream<any, any> =>\n !!value &&\n typeof value === \"object\" &&\n !!(value as any).readable &&\n !!(value as any).writable &&\n isReadableStream((value as any).readable) &&\n isWritableStream((value as any).writable);\n\nconst isPipelineOptions = (value: unknown): value is PipelineOptions => {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n // IMPORTANT:\n // Do NOT use `\"end\" in obj` here because streams have `.end()` and would be\n // misclassified as options, breaking argument parsing and potentially hanging.\n if (\n typeof (value as any).pipe === \"function\" ||\n typeof (value as any).write === \"function\" ||\n typeof (value as any).end === \"function\" ||\n typeof (value as any).getReader === \"function\" ||\n typeof (value as any).getWriter === \"function\"\n ) {\n return false;\n }\n\n return (\n Object.prototype.hasOwnProperty.call(value, \"signal\") ||\n Object.prototype.hasOwnProperty.call(value, \"end\")\n );\n};\n\nconst toBrowserPipelineStream = (stream: PipelineStream): any => {\n if (\n stream instanceof Readable ||\n stream instanceof Writable ||\n stream instanceof Transform ||\n stream instanceof Duplex\n ) {\n return stream;\n }\n\n if (isTransformStream(stream)) {\n return Transform.fromWeb(stream as any);\n }\n if (isReadableStream(stream)) {\n return Readable.fromWeb(stream as any);\n }\n if (isWritableStream(stream)) {\n return Writable.fromWeb(stream as any);\n }\n\n return stream;\n};\n\n/**\n * Pipeline streams together with proper error handling and cleanup.\n * Supports both callback and promise-based usage like Node.js.\n *\n * @example\n * // Promise usage\n * await pipeline(source, transform, destination);\n *\n * @example\n * // With options\n * await pipeline(source, transform, destination, { signal: controller.signal });\n *\n * @example\n * // Callback usage\n * pipeline(source, transform, destination, (err) => {\n * if (err) console.error('Pipeline failed', err);\n * });\n */\nexport function pipeline(\n ...args: [...PipelineStream[], PipelineOptions | PipelineCallback] | PipelineStream[]\n): Promise<void> {\n // Parse arguments\n let streams: PipelineStream[];\n let options: PipelineOptions = {};\n let callback: PipelineCallback | undefined;\n\n const lastArg = args[args.length - 1];\n\n if (typeof lastArg === \"function\") {\n // Callback style: pipeline(s1, s2, s3, callback)\n callback = lastArg as PipelineCallback;\n streams = args.slice(0, -1) as PipelineStream[];\n } else if (isPipelineOptions(lastArg)) {\n // Options style: pipeline(s1, s2, s3, { signal })\n options = lastArg as PipelineOptions;\n streams = args.slice(0, -1) as PipelineStream[];\n } else {\n // No callback or options: pipeline(s1, s2, s3)\n streams = args as PipelineStream[];\n }\n\n const promise = new Promise<void>((resolve, reject) => {\n if (streams.length < 2) {\n const err = new Error(\"Pipeline requires at least 2 streams\");\n reject(err);\n return;\n }\n\n const normalized = streams.map(toBrowserPipelineStream);\n const source = normalized[0] as any;\n const destination = normalized[normalized.length - 1] as any;\n const transforms = normalized.slice(1, -1) as any[];\n\n let completed = false;\n const allStreams = [source, ...transforms, destination];\n\n const cleanup = (error?: Error): void => {\n if (completed) {\n return;\n }\n completed = true;\n\n // Destroy all streams on error\n if (error) {\n for (const stream of allStreams) {\n if (typeof stream.destroy === \"function\") {\n stream.destroy(error);\n }\n }\n reject(error);\n } else {\n resolve();\n }\n };\n\n // Handle abort signal\n if (options.signal) {\n if (options.signal.aborted) {\n cleanup(new Error(\"Pipeline aborted\"));\n return;\n }\n options.signal.addEventListener(\"abort\", () => {\n cleanup(new Error(\"Pipeline aborted\"));\n });\n }\n\n // Chain the streams\n let current: any = source;\n for (const transform of transforms) {\n current.pipe(transform);\n current = transform;\n }\n\n // Pipe to destination\n if (options.end !== false) {\n current.pipe(destination);\n } else {\n // Don't end destination\n current.on(\"data\", chunk => destination.write(chunk));\n }\n\n // Handle completion\n destination.on(\"finish\", () => cleanup());\n\n // Handle errors on all streams\n for (const stream of allStreams) {\n stream.on(\"error\", (err: Error) => cleanup(err));\n }\n });\n\n // If callback provided, use it\n if (callback) {\n promise.then(() => callback!(null)).catch(err => callback!(err));\n }\n\n return promise;\n}\n\n// =============================================================================\n// Finished Options (Node.js compatible)\n// =============================================================================\n\nexport interface FinishedOptions {\n /** Check for readable stream completion */\n readable?: boolean;\n /** Check for writable stream completion */\n writable?: boolean;\n /** Resolve on error instead of reject */\n error?: boolean;\n /** AbortSignal to cancel waiting */\n signal?: AbortSignal;\n}\n\n/**\n * Wait for a stream to finish, close, or error.\n * Node.js compatible with support for options and callbacks.\n *\n * @example\n * // Promise usage\n * await finished(stream);\n *\n * @example\n * // With options\n * await finished(stream, { readable: false }); // Only wait for writable side\n *\n * @example\n * // Callback usage\n * finished(stream, (err) => {\n * if (err) console.error('Stream error', err);\n * });\n */\nexport function finished(\n stream: PipelineStream,\n optionsOrCallback?: FinishedOptions | ((err?: Error | null) => void),\n callback?: (err?: Error | null) => void\n): Promise<void> {\n let options: FinishedOptions = {};\n let cb: ((err?: Error | null) => void) | undefined;\n\n if (typeof optionsOrCallback === \"function\") {\n cb = optionsOrCallback;\n } else if (optionsOrCallback) {\n options = optionsOrCallback;\n cb = callback;\n }\n\n const promise = new Promise<void>((resolve, reject) => {\n const normalizedStream = toBrowserPipelineStream(stream);\n let resolved = false;\n\n const done = (err?: Error | null): void => {\n if (resolved) {\n return;\n }\n resolved = true;\n\n if (err && !options.error) {\n reject(err);\n } else {\n resolve();\n }\n };\n\n // Handle abort signal\n if (options.signal) {\n if (options.signal.aborted) {\n done(new Error(\"Aborted\"));\n return;\n }\n options.signal.addEventListener(\"abort\", () => {\n done(new Error(\"Aborted\"));\n });\n }\n\n const checkReadable = options.readable !== false;\n const checkWritable = options.writable !== false;\n\n // Already finished?\n if (checkReadable && (normalizedStream as any).readableEnded) {\n done();\n return;\n }\n\n if (checkWritable && (normalizedStream as any).writableFinished) {\n done();\n return;\n }\n\n // Listen for events\n if (checkWritable) {\n normalizedStream.on(\"finish\", () => done());\n }\n\n if (checkReadable) {\n normalizedStream.on(\"end\", () => done());\n }\n\n normalizedStream.on(\"error\", (err: Error) => done(err));\n normalizedStream.on(\"close\", () => done());\n });\n\n // If callback provided, use it\n if (cb) {\n promise.then(() => cb!(null)).catch(err => cb!(err));\n }\n\n return promise;\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Convert a stream to a promise that resolves when finished\n */\nexport async function streamToPromise(stream: PipelineStream): Promise<void> {\n return finished(stream);\n}\n\n/**\n * Collect all data from a readable stream into a Uint8Array\n * (Browser equivalent of Node.js streamToBuffer)\n */\nexport async function streamToUint8Array(\n stream: AsyncIterable<Uint8Array> | ReadableStream<Uint8Array>\n): Promise<Uint8Array> {\n let iterable: AsyncIterable<Uint8Array>;\n if (isReadableStream(stream)) {\n iterable = Readable.fromWeb(stream as any);\n } else if (isAsyncIterable(stream)) {\n iterable = stream;\n } else {\n throw new Error(\"streamToUint8Array: unsupported stream type\");\n }\n\n const chunks: Uint8Array[] = [];\n let totalLength = 0;\n\n for await (const chunk of iterable) {\n chunks.push(chunk);\n totalLength += chunk.length;\n }\n\n // Fast paths\n const len = chunks.length;\n if (len === 0) {\n return new Uint8Array(0);\n }\n if (len === 1) {\n return chunks[0];\n }\n\n // Use precalculated total length\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (let i = 0; i < len; i++) {\n result.set(chunks[i], offset);\n offset += chunks[i].length;\n }\n return result;\n}\n\n/**\n * Alias for streamToUint8Array (Node.js compatibility)\n */\nexport const streamToBuffer = streamToUint8Array;\n\n/**\n * Collect all data from a readable stream into a string\n */\nexport async function streamToString(\n stream: AsyncIterable<Uint8Array> | ReadableStream<Uint8Array>,\n encoding?: string\n): Promise<string> {\n const buffer = await streamToUint8Array(stream as any);\n return getTextDecoder(encoding).decode(buffer);\n}\n\n/**\n * Drain a stream (consume all data without processing)\n */\nexport async function drainStream(\n stream: AsyncIterable<unknown> | ReadableStream<unknown>\n): Promise<void> {\n let iterable: AsyncIterable<unknown>;\n if (isReadableStream(stream)) {\n iterable = Readable.fromWeb(stream as any);\n } else if (isAsyncIterable(stream)) {\n iterable = stream;\n } else {\n throw new Error(\"drainStream: unsupported stream type\");\n }\n\n for await (const _chunk of iterable) {\n // Consume data\n }\n}\n\n/**\n * Copy from a readable stream to a writable stream\n */\nexport async function copyStream(\n source: PipelineStreamLike,\n destination: PipelineStreamLike\n): Promise<void> {\n return pipeline(source as any, destination as any);\n}\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n/**\n * Check if an object is a transform stream\n */\nexport function isTransform(obj: unknown): obj is ITransform<any, any> {\n if (obj == null) {\n return false;\n }\n if (obj instanceof Transform) {\n return true;\n }\n const o = obj as Record<string, unknown>;\n return (\n typeof o.read === \"function\" &&\n typeof o.pipe === \"function\" &&\n typeof o.write === \"function\" &&\n typeof o.end === \"function\" &&\n typeof (o as any)._transform === \"function\"\n );\n}\n\n/**\n * Check if an object is a duplex stream\n * Note: In Node.js, Transform extends Duplex, so Transform is also a Duplex\n */\nexport function isDuplex(obj: unknown): obj is IDuplex<any, any> {\n if (obj == null) {\n return false;\n }\n if (obj instanceof Duplex || obj instanceof Transform) {\n return true;\n }\n const o = obj as Record<string, unknown>;\n return (\n typeof o.read === \"function\" &&\n typeof o.pipe === \"function\" &&\n typeof o.write === \"function\" &&\n typeof o.end === \"function\"\n );\n}\n\n/**\n * Check if an object is any kind of stream\n */\nexport function isStream(obj: unknown): obj is ReadableLike | WritableLike {\n if (obj == null) {\n return false;\n }\n if (obj instanceof Readable || obj instanceof Writable) {\n return true;\n }\n const o = obj as Record<string, unknown>;\n return (\n (typeof o.read === \"function\" && typeof o.pipe === \"function\") ||\n (typeof o.write === \"function\" && typeof o.end === \"function\")\n );\n}\n\n// =============================================================================\n// Additional Utility Functions (Node.js Compatibility)\n// =============================================================================\n\n/**\n * Add abort signal handling to any stream\n */\nexport function addAbortSignal<\n T extends (ReadableLike | WritableLike) & { destroy(error?: Error): any }\n>(signal: AbortSignal, stream: T): T {\n if (signal.aborted) {\n stream.destroy(new Error(\"Aborted\"));\n return stream;\n }\n\n const onAbort = (): void => {\n stream.destroy(new Error(\"Aborted\"));\n };\n\n signal.addEventListener(\"abort\", onAbort, { once: true });\n\n // Clean up when stream is destroyed\n stream.on(\"close\", () => {\n signal.removeEventListener(\"abort\", onAbort);\n });\n\n return stream;\n}\n\n/**\n * Create a duplex stream from a pair of readable and writable streams\n */\nexport function createDuplex<TRead = Uint8Array, TWrite = Uint8Array>(\n options?: DuplexStreamOptions & {\n readable?: unknown;\n writable?: unknown;\n allowHalfOpen?: boolean;\n objectMode?: boolean;\n read?: (this: any, size: number) => void;\n write?: (\n this: any,\n chunk: TWrite,\n encoding: string,\n callback: (error?: Error | null) => void\n ) => void;\n final?: (this: any, callback: (error?: Error | null) => void) => void;\n destroy?: (this: any, error: Error | null, callback: (error: Error | null) => void) => void;\n }\n): IDuplex<TRead, TWrite> {\n const readableObjectMode = options?.readableObjectMode ?? options?.objectMode;\n const writableObjectMode = options?.writableObjectMode ?? options?.objectMode;\n\n const duplex = new Duplex<TRead, TWrite>({\n allowHalfOpen: options?.allowHalfOpen,\n readableHighWaterMark: options?.readableHighWaterMark,\n writableHighWaterMark: options?.writableHighWaterMark,\n readableObjectMode,\n writableObjectMode\n });\n\n // If custom readable/writable provided, pipe them\n if ((options as any)?.readable) {\n const readable: any = (options as any).readable;\n readable.on?.(\"data\", (chunk: any) => duplex.push(chunk));\n readable.on?.(\"end\", () => duplex.push(null));\n readable.on?.(\"error\", (err: any) => duplex.destroy(err));\n }\n\n if ((options as any)?.writable) {\n const writable: any = (options as any).writable;\n duplex.on(\"data\", (chunk: TWrite) => writable.write?.(chunk as any));\n duplex.on(\"finish\", () => writable.end?.());\n }\n\n // If custom read/write/final provided, override methods\n if (options?.write) {\n const _originalWrite = duplex.write.bind(duplex); // Keep bound reference for potential future use\n duplex.write = function (\n chunk: TWrite,\n encodingOrCallback?: string | ((error?: Error | null) => void),\n callback?: (error?: Error | null) => void\n ): boolean {\n const encoding = typeof encodingOrCallback === \"string\" ? encodingOrCallback : \"utf8\";\n const cb =\n typeof encodingOrCallback === \"function\" ? encodingOrCallback : (callback ?? (() => {}));\n\n options.write!.call(duplex, chunk, encoding, cb);\n return true;\n };\n }\n\n if (options?.final) {\n const originalEnd = duplex.end.bind(duplex);\n duplex.end = function (\n chunkOrCallback?: TWrite | (() => void),\n encodingOrCallback?: string | (() => void),\n callback?: () => void\n ): Duplex<TRead, TWrite> {\n const cb =\n typeof chunkOrCallback === \"function\"\n ? chunkOrCallback\n : typeof encodingOrCallback === \"function\"\n ? encodingOrCallback\n : (callback ?? (() => {}));\n\n if (chunkOrCallback !== undefined && typeof chunkOrCallback !== \"function\") {\n duplex.write(chunkOrCallback);\n }\n\n // Call custom final handler\n options.final!.call(duplex, (err?: Error | null) => {\n if (err) {\n duplex.emit(\"error\", err);\n } else {\n duplex.emit(\"finish\");\n }\n // Call original end to properly close writable side\n originalEnd();\n (cb as () => void)();\n });\n\n return duplex;\n };\n }\n\n if (options?.destroy) {\n const originalDestroy = duplex.destroy.bind(duplex);\n duplex.destroy = function (error?: Error): Duplex<TRead, TWrite> {\n options.destroy!.call(duplex, error ?? null, (err: Error | null) => {\n if (err) {\n duplex.emit(\"error\", err);\n originalDestroy(err as any);\n } else {\n originalDestroy(error);\n }\n });\n return duplex;\n };\n }\n\n return duplex;\n}\n\n/**\n * Create a readable stream from a generator function\n */\nexport function createReadableFromGenerator<T>(\n generator: () => AsyncGenerator<T, void, unknown>,\n options?: ReadableStreamOptions\n): IReadable<T> {\n const readable = new Readable<T>({ ...options, objectMode: options?.objectMode ?? true });\n\n (async () => {\n try {\n for await (const chunk of generator()) {\n if (!readable.push(chunk)) {\n // Backpressure\n await new Promise(resolve => setTimeout(resolve, 0));\n }\n }\n readable.push(null);\n } catch (err) {\n readable.destroy(err as Error);\n }\n })();\n\n return readable;\n}\n\n/**\n * Create a readable stream from a Promise\n */\nexport function createReadableFromPromise<T>(\n promise: Promise<T>,\n options?: ReadableStreamOptions\n): IReadable<T> {\n const readable = new Readable<T>({ ...options, objectMode: options?.objectMode ?? true });\n\n promise\n .then(value => {\n readable.push(value);\n readable.push(null);\n })\n .catch(err => {\n readable.destroy(err);\n });\n\n return readable;\n}\n\n/**\n * Compose multiple transform streams into one\n * Data flows through each transform in sequence\n */\nexport function compose<T = any, R = any>(\n ...transforms: Array<ITransform<any, any>>\n): Transform<T, R> {\n const len = transforms.length;\n\n if (len === 0) {\n return new Transform<T, R>({\n objectMode: true,\n transform: chunk => chunk as any as R\n });\n }\n\n const isNativeTransform = (stream: ITransform<any, any>): stream is Transform<any, any> =>\n stream instanceof Transform;\n\n if (len === 1 && isNativeTransform(transforms[0]!)) {\n return transforms[0];\n }\n\n // Chain the transforms: first → second → ... → last\n const first = transforms[0] as any;\n const last = transforms[len - 1] as any;\n\n // Pipe all transforms together\n for (let i = 0; i < len - 1; i++) {\n transforms[i].pipe(transforms[i + 1] as any);\n }\n\n class ComposedTransform extends Transform<T, R> {\n private _dataForwarding: boolean = false;\n private _endForwarding: boolean = false;\n\n override on(event: string | symbol, listener: (...args: any[]) => void): this {\n if (event === \"data\" && !this._dataForwarding) {\n this._dataForwarding = true;\n last.on(\"data\", (chunk: R) => this.emit(\"data\", chunk));\n }\n if (event === \"end\" && !this._endForwarding) {\n this._endForwarding = true;\n last.on(\"end\", () => this.emit(\"end\"));\n }\n return super.on(event, listener);\n }\n\n override write(\n chunk: T,\n encodingOrCallback?: string | ((error?: Error | null) => void),\n callback?: (error?: Error | null) => void\n ): boolean {\n if (typeof encodingOrCallback === \"function\") {\n return first.write(chunk as any, encodingOrCallback);\n }\n return first.write(chunk as any, encodingOrCallback, callback);\n }\n\n override end(\n chunkOrCallback?: T | (() => void),\n encodingOrCallback?: string | (() => void),\n callback?: () => void\n ): this {\n if (typeof chunkOrCallback === \"function\") {\n first.end(chunkOrCallback);\n return this;\n }\n if (typeof encodingOrCallback === \"function\") {\n first.end(chunkOrCallback as any, encodingOrCallback);\n return this;\n }\n first.end(chunkOrCallback as any, encodingOrCallback as any, callback as any);\n return this;\n }\n\n override pipe<W extends Writable<R> | Transform<R, any> | Duplex<any, R>>(destination: W): W {\n return last.pipe(destination as any) as W;\n }\n\n override destroy(error?: Error): void {\n for (const t of transforms) {\n t.destroy(error);\n }\n super.destroy(error);\n }\n\n read(size?: number): R | null {\n return typeof last.read === \"function\" ? (last.read(size) as R | null) : null;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterableIterator<R> {\n const it = (last as any)?.[Symbol.asyncIterator]?.();\n if (it) {\n for await (const chunk of it as AsyncIterable<R>) {\n yield chunk;\n }\n return;\n }\n yield* super[Symbol.asyncIterator]();\n }\n }\n\n const composed = new ComposedTransform({\n objectMode: first?.objectMode ?? true,\n transform: chunk => chunk as any as R\n });\n\n // Forward errors from any transform\n for (const t of transforms as any[]) {\n t.on(\"error\", (err: Error) => {\n composed.emit(\"error\", err);\n });\n }\n\n // Reflect underlying readability/writability like the previous duck-typed wrapper\n Object.defineProperty(composed, \"readable\", {\n get: () => last.readable\n });\n Object.defineProperty(composed, \"writable\", {\n get: () => first.writable\n });\n\n return composed;\n}\n\n/**\n * Wait for multiple streams to finish\n */\nexport async function finishedAll(streams: ReadonlyArray<PipelineStreamLike>): Promise<void> {\n const len = streams.length;\n if (len === 0) {\n return;\n }\n if (len === 1) {\n await finished(streams[0]);\n return;\n }\n // Pre-allocate promise array\n const promises = new Array<Promise<void>>(len);\n for (let i = 0; i < len; i++) {\n promises[i] = finished(streams[i]);\n }\n await Promise.all(promises);\n}\n\n// Reusable empty push callback for createEmptyReadable\nconst pushNull = (readable: Readable<any>): void => {\n readable.push(null);\n};\n\n/**\n * Create a readable stream that emits nothing and immediately ends\n */\nexport function createEmptyReadable<T = Uint8Array>(options?: ReadableStreamOptions): IReadable<T> {\n const readable = new Readable<T>(options);\n queueMicrotask(() => pushNull(readable));\n return readable;\n}\n\n// Reusable null write handler\nconst nullWriteHandler: UnderlyingSink<any> = {\n write: () => {\n // Discard\n }\n};\n\n/**\n * Create a writable stream that discards all data (like /dev/null)\n */\nexport function createNullWritable<T = any>(options?: WritableStreamOptions): IWritable<T> {\n return new Writable<T>({\n ...options,\n stream: new WritableStream<T>(nullWriteHandler)\n });\n}\n\n/**\n * Promisified version of once for events\n */\nexport function once(\n emitter: IEventEmitter,\n event: string,\n options?: { signal?: AbortSignal }\n): Promise<any[]> {\n return new Promise((resolve, reject) => {\n let onAbort: (() => void) | undefined;\n let resolved = false;\n\n const cleanup = (): void => {\n if (resolved) {\n return;\n }\n resolved = true;\n emitter.off(event, onEvent);\n emitter.off(\"error\", onError);\n if (onAbort && options?.signal) {\n options.signal.removeEventListener(\"abort\", onAbort);\n }\n };\n\n const onEvent = (...args: any[]): void => {\n cleanup();\n resolve(args);\n };\n\n const onError = (err: Error): void => {\n cleanup();\n reject(err);\n };\n\n emitter.once(event, onEvent);\n emitter.once(\"error\", onError);\n\n if (options?.signal) {\n if (options.signal.aborted) {\n cleanup();\n reject(new Error(\"Aborted\"));\n return;\n }\n onAbort = () => {\n cleanup();\n reject(new Error(\"Aborted\"));\n };\n options.signal.addEventListener(\"abort\", onAbort);\n }\n });\n}\n\n/**\n * Convert a callback-based stream operation to a promise\n */\nexport function promisify<T>(\n fn: (callback: (error?: Error | null, result?: T) => void) => void\n): Promise<T> {\n return new Promise((resolve, reject) => {\n fn((error, result) => {\n if (error) {\n reject(error);\n } else {\n resolve(result as T);\n }\n });\n });\n}\n\n// =============================================================================\n// Default High Water Mark Management\n// =============================================================================\n\nlet _defaultHighWaterMark = 16384; // 16KB default\nlet _defaultHighWaterMarkObjectMode = 16; // 16 objects default\n\n/**\n * Get the default high water mark for streams\n */\nexport function getDefaultHighWaterMark(objectMode: boolean): number {\n return objectMode ? _defaultHighWaterMarkObjectMode : _defaultHighWaterMark;\n}\n\n/**\n * Set the default high water mark for streams\n */\nexport function setDefaultHighWaterMark(objectMode: boolean, value: number): void {\n if (objectMode) {\n _defaultHighWaterMarkObjectMode = value;\n } else {\n _defaultHighWaterMark = value;\n }\n}\n\n// =============================================================================\n// Stream State Inspection Functions\n// =============================================================================\n\n/**\n * Check if a stream has been destroyed\n */\nexport function isDestroyed(stream: { destroyed?: boolean } | null | undefined): boolean {\n return !!(stream as any)?.destroyed;\n}\n\n/**\n * Check if a readable stream has been disturbed (read from)\n */\nexport function isDisturbed(stream: unknown): boolean {\n if (stream instanceof Readable) {\n return Readable.isDisturbed(stream);\n }\n if (stream instanceof Duplex) {\n return Readable.isDisturbed((stream as any)._readable);\n }\n\n const s = stream as any;\n return (\n s?.readableDidRead === true ||\n s?._didRead === true ||\n s?._ended === true ||\n s?._destroyed === true\n );\n}\n\n/**\n * Check if a stream has an error\n */\nexport function isErrored(stream: { errored?: unknown } | null | undefined): boolean {\n const err = (stream as any)?.errored;\n return err !== null && err !== undefined;\n}\n\n/**\n * Check if a stream is readable\n */\nexport function isReadable(stream: unknown): stream is ReadableLike {\n if (stream == null) {\n return false;\n }\n if (stream instanceof Readable || stream instanceof Transform) {\n return true;\n }\n if (stream instanceof Duplex) {\n return (stream as any)._readable instanceof Readable;\n }\n const o = stream as Record<string, unknown>;\n return typeof o.read === \"function\" && typeof o.pipe === \"function\";\n}\n\n/**\n * Check if a stream is writable\n */\nexport function isWritable(stream: unknown): stream is WritableLike {\n if (stream == null) {\n return false;\n }\n if (stream instanceof Writable || stream instanceof Transform) {\n return true;\n }\n if (stream instanceof Duplex) {\n return (stream as any)._writable instanceof Writable;\n }\n const o = stream as Record<string, unknown>;\n return typeof o.write === \"function\" && typeof o.end === \"function\";\n}\n\n// =============================================================================\n// Duplex Pair\n// =============================================================================\n\n/**\n * Create a pair of connected Duplex streams\n * Data written to one stream can be read from the other\n */\nexport function duplexPair<T = Uint8Array>(\n options?: DuplexStreamOptions\n): [Duplex<T, T>, Duplex<T, T>] {\n const stream1 = new Duplex<T, T>(options);\n const stream2 = new Duplex<T, T>(options);\n\n // Override write to push to the other stream's readable\n stream1.write = function (chunk: T): boolean {\n // Push to stream2's readable side\n stream2.push(chunk);\n return true;\n };\n\n stream2.write = function (chunk: T): boolean {\n // Push to stream1's readable side\n stream1.push(chunk);\n return true;\n };\n\n // Override end to signal EOF to the other stream\n const originalEnd1 = stream1.end.bind(stream1);\n const originalEnd2 = stream2.end.bind(stream2);\n\n stream1.end = function (chunk?: T | (() => void)): any {\n if (chunk !== undefined && typeof chunk !== \"function\") {\n stream2.push(chunk);\n }\n stream2.push(null);\n return originalEnd1(typeof chunk === \"function\" ? chunk : undefined);\n };\n\n stream2.end = function (chunk?: T | (() => void)): any {\n if (chunk !== undefined && typeof chunk !== \"function\") {\n stream1.push(chunk);\n }\n stream1.push(null);\n return originalEnd2(typeof chunk === \"function\" ? chunk : undefined);\n };\n\n return [stream1, stream2];\n}\n\n// =============================================================================\n// Stream Consumers (like stream.consumers in Node.js)\n// =============================================================================\n\n// Helper function to collect stream chunks with total length tracking\nasync function collectStreamChunks(\n stream: AsyncIterable<Uint8Array> | ReadableStream<Uint8Array>\n): Promise<{ chunks: Uint8Array[]; totalLength: number }> {\n const chunks: Uint8Array[] = [];\n let totalLength = 0;\n let iterable: AsyncIterable<Uint8Array>;\n if (isReadableStream(stream)) {\n iterable = Readable.fromWeb(stream as any);\n } else if (isAsyncIterable(stream)) {\n iterable = stream;\n } else {\n throw new Error(\"collectStreamChunks: unsupported stream type\");\n }\n\n for await (const chunk of iterable) {\n chunks.push(chunk);\n totalLength += chunk.length;\n }\n return { chunks, totalLength };\n}\n\n// Helper to concatenate with known length (faster)\nfunction concatWithLength(chunks: Uint8Array[], totalLength: number): Uint8Array {\n const len = chunks.length;\n if (len === 0) {\n return new Uint8Array(0);\n }\n if (len === 1) {\n return chunks[0];\n }\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (let i = 0; i < len; i++) {\n result.set(chunks[i], offset);\n offset += chunks[i].length;\n }\n return result;\n}\n\nexport const consumers = {\n /**\n * Consume entire stream as ArrayBuffer\n */\n async arrayBuffer(\n stream: AsyncIterable<Uint8Array> | ReadableStream<Uint8Array>\n ): Promise<ArrayBuffer> {\n const { chunks, totalLength } = await collectStreamChunks(stream);\n const combined = concatWithLength(chunks, totalLength);\n return combined.buffer.slice(\n combined.byteOffset,\n combined.byteOffset + combined.byteLength\n ) as ArrayBuffer;\n },\n\n /**\n * Consume entire stream as Blob\n */\n async blob(\n stream: AsyncIterable<Uint8Array> | ReadableStream<Uint8Array>,\n options?: BlobPropertyBag\n ): Promise<Blob> {\n const { chunks } = await collectStreamChunks(stream);\n return new Blob(chunks as any, options);\n },\n\n /**\n * Consume entire stream as Buffer (Uint8Array in browser)\n */\n async buffer(\n stream: AsyncIterable<Uint8Array> | ReadableStream<Uint8Array>\n ): Promise<Uint8Array> {\n const { chunks, totalLength } = await collectStreamChunks(stream);\n return concatWithLength(chunks, totalLength);\n },\n\n /**\n * Consume entire stream as JSON\n */\n async json(stream: AsyncIterable<Uint8Array> | ReadableStream<Uint8Array>): Promise<any> {\n const text = await consumers.text(stream);\n return JSON.parse(text);\n },\n\n /**\n * Consume entire stream as text\n */\n async text(\n stream: AsyncIterable<Uint8Array> | ReadableStream<Uint8Array>,\n encoding?: string\n ): Promise<string> {\n const { chunks, totalLength } = await collectStreamChunks(stream);\n const combined = concatWithLength(chunks, totalLength);\n const decoder = encoding ? getTextDecoder(encoding) : textDecoder;\n return decoder.decode(combined);\n }\n};\n\n// =============================================================================\n// Promises API (like stream/promises in Node.js)\n// =============================================================================\n\nexport const promises = {\n pipeline,\n finished\n};\n","/**\n * Browser-only Encryptor\n * Uses Web Crypto API (hardware accelerated)\n */\n\nimport { base64ToUint8Array, uint8ArrayToBase64, stringToUtf16Le } from \"@utils/utils.base\";\nimport { concatUint8Arrays } from \"@stream\";\n\n// Helper to convert number to little-endian Uint8Array\nfunction uint32ToLe(num: number): Uint8Array {\n const arr = new Uint8Array(4);\n arr[0] = num & 0xff;\n arr[1] = (num >> 8) & 0xff;\n arr[2] = (num >> 16) & 0xff;\n arr[3] = (num >> 24) & 0xff;\n return arr;\n}\n\nconst Encryptor = {\n /**\n * Calculate hash using Web Crypto API\n */\n async hash(algorithm: string, ...buffers: Uint8Array[]): Promise<Uint8Array> {\n const data = concatUint8Arrays(buffers);\n const hashBuffer = await crypto.subtle.digest(algorithm, new Uint8Array(data));\n return new Uint8Array(hashBuffer);\n },\n\n /**\n * Convert password to hash\n */\n async convertPasswordToHash(\n password: string,\n hashAlgorithm: string,\n saltValue: string,\n spinCount: number\n ): Promise<string> {\n const passwordBuffer = stringToUtf16Le(password);\n const saltBuffer = base64ToUint8Array(saltValue);\n\n let key = await this.hash(hashAlgorithm, saltBuffer, passwordBuffer);\n\n for (let i = 0; i < spinCount; i++) {\n key = await this.hash(hashAlgorithm, key, uint32ToLe(i));\n }\n\n return uint8ArrayToBase64(key);\n },\n\n /**\n * Generate cryptographically strong random bytes\n */\n randomBytes(size: number): Uint8Array {\n const bytes = new Uint8Array(size);\n crypto.getRandomValues(bytes);\n return bytes;\n }\n};\n\nexport { Encryptor };\n","import { range, toSortedArray } from \"@utils/utils\";\nimport { colCache } from \"@excel/utils/col-cache\";\nimport type { Table } from \"@excel/table\";\n\n/**\n * Interface representing the source data abstraction for pivot tables.\n * This allows both Worksheet and Table to be used as pivot table data sources.\n */\nexport interface PivotTableSource {\n /** Name of the worksheet containing the source data (used in pivotCacheDefinition) */\n name: string;\n /** Get row values by 1-indexed row number */\n getRow(rowNumber: number): { values: any[] };\n /** Get column values by 1-indexed column number */\n getColumn(columnNumber: number): { values: any[] };\n /** Get all sheet values as a sparse 2D array */\n getSheetValues(): any[][];\n /** Dimensions with short range reference (e.g., \"A1:E10\") */\n dimensions: { shortRange: string };\n}\n\n/**\n * Model for creating a new pivot table.\n * Pass this to worksheet.addPivotTable() to create a pivot table.\n */\nexport interface PivotTableModel {\n /**\n * Source worksheet for the pivot table data.\n * Either sourceSheet or sourceTable must be provided (mutually exclusive).\n */\n sourceSheet?: PivotTableSource;\n /**\n * Source table for the pivot table data.\n * Either sourceSheet or sourceTable must be provided (mutually exclusive).\n * The table must have headerRow=true and contain at least one data row.\n */\n sourceTable?: Table;\n /** Column names to use as row fields in the pivot table */\n rows: string[];\n /**\n * Column names to use as column fields in the pivot table.\n * If omitted or empty, Excel will use \"Values\" as the column field.\n * @default []\n */\n columns?: string[];\n /** Column names to aggregate as values in the pivot table */\n values: string[];\n /**\n * Aggregation metric for the pivot table values.\n * - 'sum': Sum of values (default)\n * - 'count': Count of values\n * @default 'sum'\n */\n metric?: \"sum\" | \"count\";\n /**\n * Controls whether pivot table style overrides worksheet column widths.\n * - '0': Preserve worksheet column widths (useful for custom sizing)\n * - '1': Apply pivot table style width/height (default Excel behavior)\n * @default '1'\n */\n applyWidthHeightFormats?: \"0\" | \"1\";\n}\n\n/**\n * Represents a cache field in a pivot table.\n * Cache fields store unique values from source columns for row/column grouping.\n */\nexport interface CacheField {\n /** Name of the field (column header from source) */\n name: string;\n /** Unique values for row/column fields, null for value fields */\n sharedItems: any[] | null;\n /** Minimum value for numeric fields */\n minValue?: number;\n /** Maximum value for numeric fields */\n maxValue?: number;\n}\n\n/** Aggregation function types for pivot table data fields */\nexport type PivotTableSubtotal =\n | \"sum\"\n | \"count\"\n | \"average\"\n | \"max\"\n | \"min\"\n | \"product\"\n | \"countNums\"\n | \"stdDev\"\n | \"stdDevP\"\n | \"var\"\n | \"varP\";\n\n/**\n * Data field configuration for pivot table aggregation.\n * Defines how values are aggregated in the pivot table.\n */\nexport interface DataField {\n /** Display name for the data field (e.g., \"Sum of Sales\") */\n name: string;\n /** Index of the source field in cacheFields */\n fld: number;\n /** Base field index for calculated fields */\n baseField?: number;\n /** Base item index for calculated fields */\n baseItem?: number;\n /** Aggregation function (default: 'sum') */\n subtotal?: PivotTableSubtotal;\n}\n\n/**\n * Internal pivot table representation used by the library.\n * This is the processed model after calling makePivotTable().\n */\nexport interface PivotTable {\n /** Source data adapter (always present for new pivot tables) */\n source?: PivotTableSource;\n /** Field indices for row fields */\n rows: number[];\n /** Field indices for column fields */\n columns: number[];\n /** Field indices for value fields */\n values: number[];\n /** Aggregation metric */\n metric: \"sum\" | \"count\";\n /** Cache fields with shared items */\n cacheFields: CacheField[];\n /** Cache ID for linking to pivot cache */\n cacheId: string;\n /** Width/height format setting */\n applyWidthHeightFormats: \"0\" | \"1\";\n /** 1-indexed table number for file naming (pivotTable1.xml, pivotTable2.xml, etc.) */\n tableNumber: number;\n /** Flag indicating this pivot table was loaded from file (not newly created) */\n isLoaded?: boolean;\n /** Data fields for loaded pivot tables */\n dataFields?: DataField[];\n /** Cache definition for loaded pivot tables */\n cacheDefinition?: ParsedCacheDefinition;\n /** Cache records for loaded pivot tables */\n cacheRecords?: ParsedCacheRecords;\n}\n\n/**\n * Parsed cache definition from loaded pivot table files.\n */\nexport interface ParsedCacheDefinition {\n sourceRef?: string;\n sourceSheet?: string;\n cacheFields: CacheField[];\n recordCount?: number;\n rId?: string;\n isLoaded?: boolean;\n}\n\n/**\n * Parsed cache records from loaded pivot table files.\n */\nexport interface ParsedCacheRecords {\n records: Array<Array<{ type: string; value?: any }>>;\n count: number;\n isLoaded?: boolean;\n}\n\n// TK(2023-10-10): turn this into a class constructor.\n\n/**\n * Creates a PivotTableSource adapter from a Table object.\n * This allows Tables to be used as pivot table data sources with the same interface as Worksheets.\n */\nfunction createTableSourceAdapter(table: Table): PivotTableSource {\n const tableModel = table.model;\n\n // Validate that table has headerRow enabled (required for pivot table column names)\n if (tableModel.headerRow === false) {\n throw new Error(\n \"Cannot create pivot table from a table without headers. Set headerRow: true on the table.\"\n );\n }\n\n // Validate table has data rows\n if (!tableModel.rows || tableModel.rows.length === 0) {\n throw new Error(\"Cannot create pivot table from an empty table. Add data rows to the table.\");\n }\n\n const columnNames = tableModel.columns.map(col => col.name);\n\n // Check for duplicate column names\n const nameSet = new Set<string>();\n for (const name of columnNames) {\n if (nameSet.has(name)) {\n throw new Error(\n `Duplicate column name \"${name}\" found in table. Pivot tables require unique column names.`\n );\n }\n nameSet.add(name);\n }\n\n // Build the full data array: headers + rows\n const headerRow = [undefined, ...columnNames]; // sparse array starting at index 1\n const dataRows = tableModel.rows.map(row => [undefined, ...row]); // sparse array starting at index 1\n\n // Calculate the range reference for the table\n const tl = tableModel.tl!;\n const startRow = tl.row;\n const startCol = tl.col;\n const endRow = startRow + tableModel.rows.length; // header row + data rows\n const endCol = startCol + columnNames.length - 1;\n\n const shortRange = colCache.encode(startRow, startCol, endRow, endCol);\n\n // Use the worksheet name (not table name) for pivotCacheDefinition's worksheetSource\n // The sheet attribute in worksheetSource must reference the actual worksheet name\n const worksheetName = table.worksheet.name;\n\n return {\n name: worksheetName,\n getRow(rowNumber: number): { values: any[] } {\n if (rowNumber === 1) {\n return { values: headerRow };\n }\n const dataIndex = rowNumber - 2; // rowNumber 2 maps to index 0\n if (dataIndex >= 0 && dataIndex < dataRows.length) {\n return { values: dataRows[dataIndex] };\n }\n return { values: [] };\n },\n getColumn(columnNumber: number): { values: any[] } {\n // Validate column number is within bounds\n if (columnNumber < 1 || columnNumber > columnNames.length) {\n return { values: [] };\n }\n // Values should be sparse array with header at index 1, data starting at index 2\n const values: any[] = [];\n values[1] = columnNames[columnNumber - 1];\n for (let i = 0; i < tableModel.rows.length; i++) {\n values[i + 2] = tableModel.rows[i][columnNumber - 1];\n }\n return { values };\n },\n getSheetValues(): any[][] {\n // Return sparse array where index 1 is header row, and subsequent indices are data rows\n const result: any[][] = [];\n result[1] = headerRow;\n for (let i = 0; i < dataRows.length; i++) {\n result[i + 2] = dataRows[i];\n }\n return result;\n },\n dimensions: { shortRange }\n };\n}\n\n/**\n * Resolves the data source from the model, supporting both sourceSheet and sourceTable.\n */\nfunction resolveSource(model: PivotTableModel): PivotTableSource {\n if (model.sourceTable) {\n return createTableSourceAdapter(model.sourceTable);\n }\n // For sourceSheet, it already implements the required interface\n return model.sourceSheet as PivotTableSource;\n}\n\nfunction makePivotTable(worksheet: any, model: PivotTableModel): PivotTable {\n // Example `model`:\n // {\n // // Source of data (either sourceSheet OR sourceTable):\n // sourceSheet: worksheet1, // Use entire sheet range\n // // OR\n // sourceTable: table, // Use table data\n //\n // // Pivot table fields: values indicate field names;\n // // they come from the first row in `worksheet1` or table column names.\n // rows: ['A', 'B'],\n // columns: ['C'],\n // values: ['E'], // only 1 item possible for now\n // metric: 'sum', // only 'sum' possible for now\n // }\n\n // Validate source exists before trying to resolve it\n if (!model.sourceSheet && !model.sourceTable) {\n throw new Error(\"Either sourceSheet or sourceTable must be provided.\");\n }\n if (model.sourceSheet && model.sourceTable) {\n throw new Error(\"Cannot specify both sourceSheet and sourceTable. Choose one.\");\n }\n\n // Resolve source first to avoid creating adapter multiple times\n const source = resolveSource(model);\n\n validate(worksheet, model, source);\n\n const { rows, values } = model;\n const columns = model.columns ?? [];\n\n const cacheFields = makeCacheFields(source, [...rows, ...columns], values);\n\n const nameToIndex = cacheFields.reduce(\n (result: Record<string, number>, cacheField: CacheField, index: number) => {\n result[cacheField.name] = index;\n return result;\n },\n {} as Record<string, number>\n );\n const rowIndices = rows.map(row => nameToIndex[row]);\n const columnIndices = columns.map(column => nameToIndex[column]);\n const valueIndices = values.map(value => nameToIndex[value]);\n\n // Calculate tableNumber based on existing pivot tables (1-indexed)\n const tableNumber = worksheet.workbook.pivotTables.length + 1;\n\n // Base cache ID starts at 10 (Excel convention), each subsequent table increments\n const BASE_CACHE_ID = 10;\n\n // form pivot table object\n return {\n source,\n rows: rowIndices,\n columns: columnIndices,\n values: valueIndices,\n metric: model.metric ?? \"sum\",\n cacheFields,\n // Dynamic cacheId: 10 for first table, 11 for second, etc.\n // Used in <pivotTableDefinition> and xl/workbook.xml\n cacheId: String(BASE_CACHE_ID + tableNumber - 1),\n // Control whether pivot table style overrides worksheet column widths\n // '0' = preserve worksheet column widths (useful for custom sizing)\n // '1' = apply pivot table style width/height (default Excel behavior)\n applyWidthHeightFormats: model.applyWidthHeightFormats ?? \"1\",\n // Table number for file naming (pivotTable1.xml, pivotTable2.xml, etc.)\n tableNumber\n };\n}\n\nfunction validate(_worksheet: any, model: PivotTableModel, source: PivotTableSource): void {\n if (model.metric && model.metric !== \"sum\" && model.metric !== \"count\") {\n throw new Error('Only the \"sum\" and \"count\" metrics are supported at this time.');\n }\n\n const columns = model.columns ?? [];\n\n // Get header names from source (already resolved)\n const headerNames = source.getRow(1).values.slice(1);\n // Use Set for O(1) lookup\n const headerNameSet = new Set(headerNames);\n for (const name of [...model.rows, ...columns, ...model.values]) {\n if (!headerNameSet.has(name)) {\n throw new Error(`The header name \"${name}\" was not found in ${source.name}.`);\n }\n }\n\n if (!model.rows.length) {\n throw new Error(\"No pivot table rows specified.\");\n }\n\n // Allow empty columns - Excel will use \"Values\" as column field\n // But can't have multiple values with columns specified\n if (model.values.length < 1) {\n throw new Error(\"Must have at least one value.\");\n }\n\n if (model.values.length > 1 && columns.length > 0) {\n throw new Error(\n \"It is currently not possible to have multiple values when columns are specified. Please either supply an empty array for columns or a single value.\"\n );\n }\n}\n\nfunction makeCacheFields(\n source: PivotTableSource,\n fieldNamesWithSharedItems: string[],\n valueFieldNames: string[]\n): CacheField[] {\n // Cache fields are used in pivot tables to reference source data.\n // Fields in fieldNamesWithSharedItems get their unique values extracted as sharedItems.\n // Fields in valueFieldNames (but not in fieldNamesWithSharedItems) get min/max calculated.\n // Other fields are unused and get empty sharedItems.\n\n const names = source.getRow(1).values;\n // Use Set for O(1) lookup instead of object\n const sharedItemsFields = new Set(fieldNamesWithSharedItems);\n const valueFields = new Set(valueFieldNames);\n\n const aggregate = (columnIndex: number): any[] => {\n const columnValues = source.getColumn(columnIndex).values;\n // Build unique values set directly, skipping header (index 0,1) and null/undefined\n const uniqueValues = new Set<any>();\n for (let i = 2; i < columnValues.length; i++) {\n const v = columnValues[i];\n if (v !== null && v !== undefined) {\n uniqueValues.add(v);\n }\n }\n return toSortedArray(uniqueValues);\n };\n\n // Calculate min/max for numeric fields\n const getMinMax = (columnIndex: number): { minValue: number; maxValue: number } | null => {\n const columnValues = source.getColumn(columnIndex).values;\n let min = Infinity;\n let max = -Infinity;\n let hasNumeric = false;\n for (let i = 2; i < columnValues.length; i++) {\n const v = columnValues[i];\n if (typeof v === \"number\" && !isNaN(v)) {\n hasNumeric = true;\n if (v < min) {\n min = v;\n }\n if (v > max) {\n max = v;\n }\n }\n }\n return hasNumeric ? { minValue: min, maxValue: max } : null;\n };\n\n // Build result array\n const result: CacheField[] = [];\n for (const columnIndex of range(1, names.length)) {\n const name = names[columnIndex];\n if (sharedItemsFields.has(name)) {\n // Field used for rows/columns - extract unique values as sharedItems\n result.push({ name, sharedItems: aggregate(columnIndex) });\n } else if (valueFields.has(name)) {\n // Field used only for values (aggregation) - calculate min/max\n const minMax = getMinMax(columnIndex);\n result.push({\n name,\n sharedItems: null,\n minValue: minMax?.minValue,\n maxValue: minMax?.maxValue\n });\n } else {\n // Unused field - just empty sharedItems (like Excel does)\n result.push({ name, sharedItems: null });\n }\n }\n return result;\n}\n\nexport { makePivotTable };\n","interface StyleObject {\n [key: string]: any;\n}\n\nconst oneDepthCopy = (obj: StyleObject, nestKeys: string[]): StyleObject => ({\n ...obj,\n ...nestKeys.reduce((memo: StyleObject, key: string) => {\n if (obj[key]) {\n memo[key] = { ...obj[key] };\n }\n return memo;\n }, {})\n});\n\nconst setIfExists = (\n src: StyleObject,\n dst: StyleObject,\n key: string,\n nestKeys: string[] = []\n): void => {\n if (src[key]) {\n dst[key] = oneDepthCopy(src[key], nestKeys);\n }\n};\n\nconst isEmptyObj = (obj: StyleObject): boolean => Object.keys(obj).length === 0;\n\nconst copyStyle = (style: StyleObject | null | undefined): StyleObject | null | undefined => {\n if (!style) {\n return style;\n }\n if (isEmptyObj(style)) {\n return {};\n }\n\n const copied: StyleObject = { ...style };\n\n setIfExists(style, copied, \"font\", [\"color\"]);\n setIfExists(style, copied, \"alignment\");\n setIfExists(style, copied, \"protection\");\n if (style.border) {\n setIfExists(style, copied, \"border\");\n setIfExists(style.border, copied.border, \"top\", [\"color\"]);\n setIfExists(style.border, copied.border, \"left\", [\"color\"]);\n setIfExists(style.border, copied.border, \"bottom\", [\"color\"]);\n setIfExists(style.border, copied.border, \"right\", [\"color\"]);\n setIfExists(style.border, copied.border, \"diagonal\", [\"color\"]);\n }\n\n if (style.fill) {\n setIfExists(style, copied, \"fill\", [\"fgColor\", \"bgColor\", \"center\"]);\n if (style.fill.stops) {\n copied.fill.stops = style.fill.stops.map((s: StyleObject) => oneDepthCopy(s, [\"color\"]));\n }\n }\n\n return copied;\n};\n\nexport { copyStyle };\n","import { colCache, type DecodedRange } from \"@excel/utils/col-cache\";\nimport { Range, type RangeInput } from \"@excel/range\";\nimport { Row, type RowModel } from \"@excel/row\";\nimport { Column, type ColumnModel, type ColumnDefn } from \"@excel/column\";\nimport type { Cell, FormulaResult, FormulaValueData } from \"@excel/cell\";\nimport { Enums } from \"@excel/enums\";\nimport { Image, type ImageModel } from \"@excel/image\";\nimport { Table, type TableModel } from \"@excel/table\";\nimport { DataValidations } from \"@excel/data-validations\";\nimport { Encryptor } from \"@excel/utils/encryptor\";\nimport { uint8ArrayToBase64 } from \"@utils/utils\";\nimport { makePivotTable, type PivotTable, type PivotTableModel } from \"@excel/pivot-table\";\nimport { copyStyle } from \"@excel/utils/copy-style\";\nimport type { Workbook } from \"@excel/workbook\";\nimport type {\n AddImageRange,\n AutoFilter,\n CellValue,\n ColBreak,\n ConditionalFormattingOptions,\n DataValidation,\n RowBreak,\n RowValues,\n TableProperties,\n WorksheetProperties,\n WorksheetView\n} from \"@excel/types\";\n\n// Type for data validation model - maps address to validation\ntype DataValidationModel = { [address: string]: DataValidation | undefined };\n\ninterface SheetProtection {\n sheet?: boolean;\n objects?: boolean;\n scenarios?: boolean;\n selectLockedCells?: boolean;\n selectUnlockedCells?: boolean;\n formatCells?: boolean;\n formatColumns?: boolean;\n formatRows?: boolean;\n insertColumns?: boolean;\n insertRows?: boolean;\n insertHyperlinks?: boolean;\n deleteColumns?: boolean;\n deleteRows?: boolean;\n sort?: boolean;\n autoFilter?: boolean;\n pivotTables?: boolean;\n algorithmName?: string;\n hashValue?: string;\n saltValue?: string;\n spinCount?: number;\n}\n\ninterface WorksheetOptions {\n workbook?: Workbook;\n id?: number;\n orderNo?: number;\n name?: string;\n state?: string;\n properties?: Partial<WorksheetProperties>;\n pageSetup?: Partial<PageSetup>;\n headerFooter?: Partial<HeaderFooter>;\n views?: Partial<WorksheetView>[];\n autoFilter?: AutoFilter | null;\n}\n\ninterface PageSetupMargins {\n left: number;\n right: number;\n top: number;\n bottom: number;\n header: number;\n footer: number;\n}\n\ninterface PageSetup {\n margins: PageSetupMargins;\n orientation: string;\n horizontalDpi: number;\n verticalDpi: number;\n fitToPage: boolean;\n pageOrder: string;\n blackAndWhite: boolean;\n draft: boolean;\n cellComments: string;\n errors: string;\n scale: number;\n fitToWidth: number;\n fitToHeight: number;\n paperSize?: number;\n showRowColHeaders: boolean;\n showGridLines: boolean;\n firstPageNumber?: number;\n horizontalCentered: boolean;\n verticalCentered: boolean;\n rowBreaks: RowBreak[];\n printTitlesRow?: string;\n printTitlesColumn?: string;\n}\n\ninterface HeaderFooter {\n differentFirst: boolean;\n differentOddEven: boolean;\n oddHeader: string | null;\n oddFooter: string | null;\n evenHeader: string | null;\n evenFooter: string | null;\n firstHeader: string | null;\n firstFooter: string | null;\n}\n\ninterface WorksheetModel {\n id: number;\n name: string;\n dataValidations: DataValidationModel;\n properties: Partial<WorksheetProperties>;\n state: string;\n pageSetup: PageSetup;\n headerFooter: HeaderFooter;\n rowBreaks: RowBreak[];\n colBreaks: ColBreak[];\n views: Partial<WorksheetView>[];\n autoFilter: AutoFilter | null;\n media: ImageModel[];\n sheetProtection: SheetProtection | null;\n tables: TableModel[];\n pivotTables: PivotTable[];\n conditionalFormattings: ConditionalFormattingOptions[];\n cols?: ColumnModel[];\n rows?: RowModel[];\n dimensions?: Range;\n merges?: string[];\n mergeCells?: string[];\n}\n\n// Worksheet requirements\n// Operate as sheet inside workbook or standalone\n// Load and Save from file and stream\n// Access/Add/Delete individual cells\n// Manage column widths and row heights\n\nclass Worksheet {\n // Type declarations only - no runtime overhead\n declare private _workbook: Workbook;\n declare public id: number;\n declare public orderNo: number;\n declare private _name: string;\n declare public state: string;\n declare private _rows: Row[];\n declare private _columns: Column[] | null;\n declare private _keys: { [key: string]: Column };\n declare private _merges: { [key: string]: Range };\n declare public rowBreaks: RowBreak[];\n declare public colBreaks: ColBreak[];\n declare public properties: Partial<WorksheetProperties>;\n declare public pageSetup: PageSetup;\n declare public headerFooter: HeaderFooter;\n declare public dataValidations: DataValidations;\n declare public views: Partial<WorksheetView>[];\n declare public autoFilter: AutoFilter | null;\n declare private _media: Image[];\n declare public sheetProtection: SheetProtection | null;\n declare public tables: { [key: string]: Table };\n declare public pivotTables: PivotTable[];\n declare public conditionalFormattings: ConditionalFormattingOptions[];\n declare private _headerRowCount?: number;\n\n constructor(options: WorksheetOptions) {\n options = options || {};\n this._workbook = options.workbook;\n\n // in a workbook, each sheet will have a number\n this.id = options.id || 0;\n this.orderNo = options.orderNo || 0;\n\n // and a name - use the setter to ensure validation and truncation\n this.name = options.name || `sheet${this.id}`;\n\n // add a state\n this.state = options.state || \"visible\";\n\n // rows allows access organised by row. Sparse array of arrays indexed by row-1, col\n // Note: _rows is zero based. Must subtract 1 to go from cell.row to index\n this._rows = [];\n\n // column definitions\n this._columns = null;\n\n // column keys (addRow convenience): key ==> this._collumns index\n this._keys = {};\n\n // keep record of all merges\n this._merges = {};\n\n // record of all row and column pageBreaks\n this.rowBreaks = [];\n this.colBreaks = [];\n\n // for tabColor, default row height, outline levels, etc\n this.properties = Object.assign(\n {},\n {\n defaultRowHeight: 15,\n outlineLevelCol: 0,\n outlineLevelRow: 0\n },\n options.properties\n );\n\n // for all things printing\n this.pageSetup = Object.assign(\n {},\n {\n margins: { left: 0.7, right: 0.7, top: 0.75, bottom: 0.75, header: 0.3, footer: 0.3 },\n orientation: \"portrait\",\n horizontalDpi: 4294967295,\n verticalDpi: 4294967295,\n fitToPage: !!(\n options.pageSetup &&\n (options.pageSetup.fitToWidth || options.pageSetup.fitToHeight) &&\n !options.pageSetup.scale\n ),\n pageOrder: \"downThenOver\",\n blackAndWhite: false,\n draft: false,\n cellComments: \"None\",\n errors: \"displayed\",\n scale: 100,\n fitToWidth: 1,\n fitToHeight: 1,\n paperSize: undefined,\n showRowColHeaders: false,\n showGridLines: false,\n firstPageNumber: undefined,\n horizontalCentered: false,\n verticalCentered: false,\n rowBreaks: null,\n colBreaks: null\n },\n options.pageSetup\n );\n\n this.headerFooter = Object.assign(\n {},\n {\n differentFirst: false,\n differentOddEven: false,\n oddHeader: null,\n oddFooter: null,\n evenHeader: null,\n evenFooter: null,\n firstHeader: null,\n firstFooter: null\n },\n options.headerFooter\n );\n\n this.dataValidations = new DataValidations();\n\n // for freezepanes, split, zoom, gridlines, etc\n this.views = options.views || [];\n\n this.autoFilter = options.autoFilter || null;\n\n // for images, etc\n this._media = [];\n\n // worksheet protection\n this.sheetProtection = null;\n\n // for tables\n this.tables = {};\n\n this.pivotTables = [];\n\n this.conditionalFormattings = [];\n }\n\n get name(): string {\n return this._name;\n }\n\n set name(name: string | undefined) {\n if (name === undefined) {\n name = `sheet${this.id}`;\n }\n\n if (this._name === name) {\n return;\n }\n\n if (typeof name !== \"string\") {\n throw new Error(\"The name has to be a string.\");\n }\n\n if (name === \"\") {\n throw new Error(\"The name can't be empty.\");\n }\n\n if (name === \"History\") {\n throw new Error('The name \"History\" is protected. Please use a different name.');\n }\n\n // Illegal character in worksheet name: asterisk (*), question mark (?),\n // colon (:), forward slash (/ \\), or bracket ([])\n if (/[*?:/\\\\[\\]]/.test(name)) {\n throw new Error(\n `Worksheet name ${name} cannot include any of the following characters: * ? : \\\\ / [ ]`\n );\n }\n\n if (/(^')|('$)/.test(name)) {\n throw new Error(\n `The first or last character of worksheet name cannot be a single quotation mark: ${name}`\n );\n }\n\n if (name && name.length > 31) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(`Worksheet name ${name} exceeds 31 chars. This will be truncated`);\n }\n name = name.substring(0, 31);\n }\n\n if (this._workbook.worksheets.find(ws => ws && ws.name.toLowerCase() === name.toLowerCase())) {\n throw new Error(`Worksheet name already exists: ${name}`);\n }\n\n this._name = name;\n }\n\n /**\n * The workbook that contains this worksheet\n */\n get workbook(): Workbook {\n return this._workbook;\n }\n\n /**\n * When you're done with this worksheet, call this to remove from workbook\n */\n destroy(): void {\n this._workbook.removeWorksheetEx(this);\n }\n\n /**\n * Get the bounding range of the cells in this worksheet\n */\n get dimensions(): Range {\n const dimensions = new Range();\n this._rows.forEach(row => {\n if (row) {\n const rowDims = row.dimensions;\n if (rowDims) {\n dimensions.expand(row.number, rowDims.min, row.number, rowDims.max);\n }\n }\n });\n return dimensions;\n }\n\n // =========================================================================\n // Columns\n\n /**\n * Get the current columns array\n */\n get columns(): Column[] {\n return this._columns;\n }\n\n /**\n * Add column headers and define column keys and widths.\n *\n * Note: these column structures are a workbook-building convenience only,\n * apart from the column width, they will not be fully persisted.\n */\n set columns(value: ColumnDefn[]) {\n // calculate max header row count\n this._headerRowCount = value.reduce((pv, cv) => {\n const headerCount = Array.isArray(cv.header) ? cv.header.length : cv.header ? 1 : 0;\n return Math.max(pv, headerCount);\n }, 0);\n\n // construct Column objects\n let count = 1;\n const columns: Column[] = (this._columns = []);\n value.forEach(defn => {\n const column = new Column(this, count++, false);\n columns.push(column);\n column.defn = defn;\n });\n }\n\n getColumnKey(key: string): Column | undefined {\n return this._keys[key];\n }\n\n setColumnKey(key: string, value: Column): void {\n this._keys[key] = value;\n }\n\n deleteColumnKey(key: string): void {\n delete this._keys[key];\n }\n\n eachColumnKey(f: (column: Column, key: string) => void): void {\n Object.keys(this._keys).forEach(key => f(this._keys[key], key));\n }\n\n /**\n * Access an individual column by key, letter and 1-based column number\n */\n getColumn(c: string | number): Column {\n let colNum: number;\n if (typeof c === \"string\") {\n // if it matches a key'd column, return that\n const col = this._keys[c];\n if (col) {\n return col;\n }\n\n // otherwise, assume letter\n colNum = colCache.l2n(c);\n } else {\n colNum = c;\n }\n if (!this._columns) {\n this._columns = [];\n }\n if (colNum > this._columns.length) {\n let n = this._columns.length + 1;\n while (n <= colNum) {\n this._columns.push(new Column(this, n++));\n }\n }\n return this._columns[colNum - 1];\n }\n\n /**\n * Cut one or more columns (columns to the right are shifted left)\n * and optionally insert more\n *\n * If column properties have been defined, they will be cut or moved accordingly\n *\n * Known limitation: If a splice causes any merged cells to move, the results may be unpredictable\n *\n * Also: If the worksheet has more rows than values in the column inserts,\n * the rows will still be shifted as if the values existed\n */\n spliceColumns(start: number, count: number, ...inserts: CellValue[][]): void {\n const rows = this._rows;\n const nRows = rows.length;\n if (inserts.length > 0) {\n // must iterate over all rows whether they exist yet or not\n for (let i = 0; i < nRows; i++) {\n const insertValues = inserts.map(insert => insert[i] || null);\n const row = this.getRow(i + 1);\n row.splice(start, count, ...insertValues);\n }\n } else {\n // nothing to insert, so just splice all rows\n this._rows.forEach(r => {\n if (r) {\n r.splice(start, count);\n }\n });\n }\n\n // splice column definitions\n const nExpand = inserts.length - count;\n const nKeep = start + count;\n const nEnd = this._columns ? this._columns.length : 0;\n if (nExpand < 0) {\n for (let i = start + inserts.length; i <= nEnd; i++) {\n this.getColumn(i).defn = this.getColumn(i - nExpand).defn;\n }\n } else if (nExpand > 0) {\n for (let i = nEnd; i >= nKeep; i--) {\n this.getColumn(i + nExpand).defn = this.getColumn(i).defn;\n }\n }\n for (let i = start; i < start + inserts.length; i++) {\n this.getColumn(i).defn = undefined;\n }\n\n // account for defined names\n this.workbook.definedNames.spliceColumns(this.name, start, count, inserts.length);\n }\n\n /**\n * Get the last column in a worksheet\n */\n get lastColumn(): Column {\n return this.getColumn(this.columnCount);\n }\n\n /**\n * The total column size of the document. Equal to the maximum cell count from all of the rows\n */\n get columnCount(): number {\n let maxCount = 0;\n this.eachRow(row => {\n maxCount = Math.max(maxCount, row.cellCount);\n });\n return maxCount;\n }\n\n /**\n * A count of the number of columns that have values\n */\n get actualColumnCount(): number {\n // performance nightmare - for each row, counts all the columns used\n const counts: boolean[] = [];\n let count = 0;\n this.eachRow(row => {\n row.eachCell(({ col }: { col: number }) => {\n if (!counts[col]) {\n counts[col] = true;\n count++;\n }\n });\n });\n return count;\n }\n\n // =========================================================================\n // Rows\n\n _commitRow(row: Row): void {\n // nop - allows streaming reader to fill a document\n }\n\n get _lastRowNumber(): number {\n // need to cope with results of splice\n const rows = this._rows;\n let n = rows.length;\n while (n > 0 && rows[n - 1] === undefined) {\n n--;\n }\n return n;\n }\n\n get _nextRow(): number {\n return this._lastRowNumber + 1;\n }\n\n /**\n * Get the last editable row in a worksheet (or undefined if there are none)\n */\n get lastRow(): Row | undefined {\n if (this._rows.length) {\n return this._rows[this._rows.length - 1];\n }\n return undefined;\n }\n\n /**\n * Tries to find and return row for row number, else undefined\n *\n * @param r - The 1-indexed row number\n */\n findRow(r: number): Row | undefined {\n return this._rows[r - 1];\n }\n\n /**\n * Tries to find and return rows for row number start and length, else undefined\n *\n * @param start - The 1-indexed starting row number\n * @param length - The length of the expected array\n */\n findRows(start: number, length: number): (Row | undefined)[] {\n return this._rows.slice(start - 1, start - 1 + length);\n }\n\n /**\n * The total row size of the document. Equal to the row number of the last row that has values.\n */\n get rowCount(): number {\n return this._lastRowNumber;\n }\n\n /**\n * A count of the number of rows that have values. If a mid-document row is empty, it will not be included in the count.\n */\n get actualRowCount(): number {\n // counts actual rows that have actual data\n let count = 0;\n this.eachRow(() => {\n count++;\n });\n return count;\n }\n\n // get a row by row number.\n getRow(r: number): any {\n let row = this._rows[r - 1];\n if (!row) {\n row = this._rows[r - 1] = new Row(this, r);\n }\n return row;\n }\n\n // get multiple rows by row number.\n getRows(start: number, length: number): any[] | undefined {\n if (length < 1) {\n return undefined;\n }\n const rows: any[] = [];\n for (let i = start; i < start + length; i++) {\n rows.push(this.getRow(i));\n }\n return rows;\n }\n\n addRow(value: any, style: string = \"n\"): any {\n const rowNo = this._nextRow;\n const row = this.getRow(rowNo);\n row.values = value;\n this._setStyleOption(rowNo, style[0] === \"i\" ? style : \"n\");\n return row;\n }\n\n addRows(value: any[], style: string = \"n\"): any[] {\n const rows: Row[] = [];\n value.forEach(row => {\n rows.push(this.addRow(row, style));\n });\n return rows;\n }\n\n insertRow(pos: number, value: any, style: string = \"n\"): any {\n this.spliceRows(pos, 0, value);\n this._setStyleOption(pos, style);\n return this.getRow(pos);\n }\n\n insertRows(pos: number, values: any[], style: string = \"n\"): Row[] | undefined {\n this.spliceRows(pos, 0, ...values);\n if (style !== \"n\") {\n // copy over the styles\n for (let i = 0; i < values.length; i++) {\n if (style[0] === \"o\" && this.findRow(values.length + pos + i) !== undefined) {\n this._copyStyle(values.length + pos + i, pos + i, style[1] === \"+\");\n } else if (style[0] === \"i\" && this.findRow(pos - 1) !== undefined) {\n this._copyStyle(pos - 1, pos + i, style[1] === \"+\");\n }\n }\n }\n return this.getRows(pos, values.length);\n }\n\n // set row at position to same style as of either pervious row (option 'i') or next row (option 'o')\n _setStyleOption(pos: number, style: string = \"n\"): void {\n if (style[0] === \"o\" && this.findRow(pos + 1) !== undefined) {\n this._copyStyle(pos + 1, pos, style[1] === \"+\");\n } else if (style[0] === \"i\" && this.findRow(pos - 1) !== undefined) {\n this._copyStyle(pos - 1, pos, style[1] === \"+\");\n }\n }\n\n _copyStyle(src: number, dest: number, styleEmpty: boolean = false): void {\n const rSrc = this.getRow(src);\n const rDst = this.getRow(dest);\n rDst.style = copyStyle(rSrc.style);\n rSrc.eachCell({ includeEmpty: styleEmpty }, (cell: Cell, colNumber: number) => {\n rDst.getCell(colNumber).style = copyStyle(cell.style);\n });\n rDst.height = rSrc.height;\n }\n\n /**\n * Duplicate rows and insert new rows\n */\n duplicateRow(rowNum: number, count: number, insert: boolean = false): void {\n // create count duplicates of rowNum\n // either inserting new or overwriting existing rows\n\n const rSrc = this._rows[rowNum - 1];\n const inserts = Array.from<RowValues>({ length: count }).fill(rSrc.values);\n this.spliceRows(rowNum + 1, insert ? 0 : count, ...inserts);\n\n // now copy styles...\n for (let i = 0; i < count; i++) {\n const rDst = this._rows[rowNum + i];\n rDst.style = rSrc.style;\n rDst.height = rSrc.height;\n rSrc.eachCell({ includeEmpty: true }, (cell: Cell, colNumber: number) => {\n rDst.getCell(colNumber).style = cell.style;\n });\n }\n }\n\n /**\n * Cut one or more rows (rows below are shifted up)\n * and optionally insert more\n *\n * Known limitation: If a splice causes any merged cells to move, the results may be unpredictable\n */\n spliceRows(start: number, count: number, ...inserts: RowValues[]): void {\n // same problem as row.splice, except worse.\n const nKeep = start + count;\n const nInserts = inserts.length;\n const nExpand = nInserts - count;\n const nEnd = this._rows.length;\n let i: number;\n let rSrc: Row | undefined;\n if (nExpand < 0) {\n // remove rows\n if (start === nEnd) {\n this._rows[nEnd - 1] = undefined;\n }\n for (i = nKeep; i <= nEnd; i++) {\n rSrc = this._rows[i - 1];\n if (rSrc) {\n const rDst = this.getRow(i + nExpand);\n rDst.values = rSrc.values;\n rDst.style = rSrc.style;\n rDst.height = rSrc.height;\n rSrc.eachCell({ includeEmpty: true }, (cell: Cell, colNumber: number) => {\n rDst.getCell(colNumber).style = cell.style;\n });\n this._rows[i - 1] = undefined;\n } else {\n this._rows[i + nExpand - 1] = undefined;\n }\n }\n } else if (nExpand > 0) {\n // insert new cells\n for (i = nEnd; i >= nKeep; i--) {\n rSrc = this._rows[i - 1];\n if (rSrc) {\n const rDst = this.getRow(i + nExpand);\n rDst.values = rSrc.values;\n rDst.style = rSrc.style;\n rDst.height = rSrc.height;\n rSrc.eachCell({ includeEmpty: true }, (cell: Cell, colNumber: number) => {\n rDst.getCell(colNumber).style = cell.style;\n\n // remerge cells accounting for insert offset\n if (cell.type === Enums.ValueType.Merge) {\n const cellToBeMerged = this.getRow(cell.row + nInserts).getCell(colNumber);\n const prevMaster = cell.master;\n const newMaster = this.getRow(prevMaster.row + nInserts).getCell(prevMaster.col);\n cellToBeMerged.merge(newMaster);\n }\n });\n } else {\n this._rows[i + nExpand - 1] = undefined;\n }\n }\n }\n\n // now copy over the new values\n for (i = 0; i < nInserts; i++) {\n const rDst = this.getRow(start + i);\n rDst.style = {};\n rDst.values = inserts[i];\n }\n\n // account for defined names\n this.workbook.definedNames.spliceRows(this.name, start, count, nInserts);\n }\n\n /**\n * Iterate over all rows that have values in a worksheet\n */\n eachRow(callback: (row: Row, rowNumber: number) => void): void;\n /**\n * Iterate over all rows (including empty rows) in a worksheet\n */\n eachRow(opt: { includeEmpty?: boolean }, callback: (row: Row, rowNumber: number) => void): void;\n eachRow(\n optOrCallback: { includeEmpty?: boolean } | ((row: Row, rowNumber: number) => void),\n maybeCallback?: (row: Row, rowNumber: number) => void\n ): void {\n let options: { includeEmpty?: boolean } | undefined;\n let callback: (row: Row, rowNumber: number) => void;\n if (typeof optOrCallback === \"function\") {\n callback = optOrCallback;\n } else {\n options = optOrCallback;\n callback = maybeCallback!;\n }\n if (options && options.includeEmpty) {\n const n = this._rows.length;\n for (let i = 1; i <= n; i++) {\n callback(this.getRow(i), i);\n }\n } else {\n this._rows.forEach(row => {\n if (row && row.hasValues) {\n callback(row, row.number);\n }\n });\n }\n }\n\n /**\n * Return all rows as sparse array\n */\n getSheetValues(): CellValue[][] {\n const rows: CellValue[][] = [];\n this._rows.forEach(row => {\n if (row) {\n rows[row.number] = row.values;\n }\n });\n return rows;\n }\n\n // =========================================================================\n // Cells\n\n /**\n * Returns the cell at [r,c] or address given by r. If not found, return undefined\n */\n findCell(r: number | string, c?: number): Cell | undefined {\n const address = colCache.getAddress(r, c);\n const row = this._rows[address.row - 1];\n return row ? row.findCell(address.col) : undefined;\n }\n\n /**\n * Get or create cell at [r,c] or address given by r\n */\n getCell(r: number | string, c?: number): Cell {\n const address = colCache.getAddress(r, c);\n const row = this.getRow(address.row);\n return row.getCellEx(address);\n }\n\n // =========================================================================\n // Merge\n\n /**\n * Merge cells, either:\n *\n * tlbr string, e.g. `'A4:B5'`\n *\n * tl string, br string, e.g. `'G10', 'H11'`\n *\n * t, l, b, r numbers, e.g. `10,11,12,13`\n */\n mergeCells(...cells: RangeInput[]): void {\n const dimensions = new Range(cells);\n this._mergeCellsInternal(dimensions);\n }\n\n mergeCellsWithoutStyle(...cells: RangeInput[]): void {\n const dimensions = new Range(cells);\n this._mergeCellsInternal(dimensions, true);\n }\n\n _mergeCellsInternal(dimensions: Range, ignoreStyle?: boolean): void {\n // check cells aren't already merged\n Object.values(this._merges).forEach((merge: Range) => {\n if (merge.intersects(dimensions)) {\n throw new Error(\"Cannot merge already merged cells\");\n }\n });\n\n // apply merge\n const master = this.getCell(dimensions.top, dimensions.left);\n for (let i = dimensions.top; i <= dimensions.bottom; i++) {\n for (let j = dimensions.left; j <= dimensions.right; j++) {\n // merge all but the master cell\n if (i > dimensions.top || j > dimensions.left) {\n this.getCell(i, j).merge(master, ignoreStyle);\n }\n }\n }\n\n // index merge\n this._merges[master.address] = dimensions;\n }\n\n _unMergeMaster(master: Cell): void {\n // master is always top left of a rectangle\n const merge = this._merges[master.address];\n if (merge) {\n for (let i = merge.top; i <= merge.bottom; i++) {\n for (let j = merge.left; j <= merge.right; j++) {\n this.getCell(i, j).unmerge();\n }\n }\n delete this._merges[master.address];\n }\n }\n\n get hasMerges(): boolean {\n // return true if this._merges has a merge object\n return Object.values(this._merges).some(Boolean);\n }\n\n /**\n * Scan the range and if any cell is part of a merge, un-merge the group.\n * Note this function can affect multiple merges and merge-blocks are\n * atomic - either they're all merged or all un-merged.\n */\n unMergeCells(...cells: RangeInput[]): void {\n const dimensions = new Range(cells);\n\n // find any cells in that range and unmerge them\n for (let i = dimensions.top; i <= dimensions.bottom; i++) {\n for (let j = dimensions.left; j <= dimensions.right; j++) {\n const cell = this.findCell(i, j);\n if (cell) {\n if (cell.type === Enums.ValueType.Merge) {\n // this cell merges to another master\n this._unMergeMaster(cell.master);\n } else if (this._merges[cell.address]) {\n // this cell is a master\n this._unMergeMaster(cell);\n }\n }\n }\n }\n }\n\n // ===========================================================================\n // Shared/Array Formula\n fillFormula(\n range: string,\n formula: string,\n results?:\n | FormulaResult[][]\n | FormulaResult[]\n | ((row: number, col: number) => FormulaResult | undefined),\n shareType: string = \"shared\"\n ): void {\n // Define formula for top-left cell and share to rest\n const decoded = colCache.decode(range) as DecodedRange;\n const { top, left, bottom, right } = decoded;\n const width = right - left + 1;\n const masterAddress = colCache.encodeAddress(top, left);\n const isShared = shareType === \"shared\";\n\n // work out result accessor\n let getResult: (row: number, col: number) => FormulaResult | undefined;\n if (typeof results === \"function\") {\n getResult = results;\n } else if (Array.isArray(results)) {\n if (Array.isArray(results[0])) {\n getResult = (row: number, col: number) =>\n (results as FormulaResult[][])[row - top][col - left];\n } else {\n getResult = (row: number, col: number) =>\n (results as FormulaResult[])[(row - top) * width + (col - left)];\n }\n } else {\n getResult = () => undefined;\n }\n let first = true;\n for (let r = top; r <= bottom; r++) {\n for (let c = left; c <= right; c++) {\n if (first) {\n const cell = this.getCell(r, c);\n const formulaValue: FormulaValueData = {\n shareType,\n formula,\n ref: range,\n result: getResult(r, c)\n };\n cell.value = formulaValue as CellValue;\n first = false;\n } else {\n this.getCell(r, c).value = isShared\n ? {\n sharedFormula: masterAddress,\n result: getResult(r, c)\n }\n : getResult(r, c);\n }\n }\n }\n }\n\n // =========================================================================\n // Images\n\n /**\n * Using the image id from `Workbook.addImage`,\n * embed an image within the worksheet to cover a range\n */\n addImage(imageId: string | number, range: AddImageRange): void {\n const model = {\n type: \"image\",\n imageId: String(imageId),\n range\n };\n this._media.push(new Image(this, model));\n }\n\n getImages(): Image[] {\n return this._media.filter(m => m.type === \"image\");\n }\n\n /**\n * Using the image id from `Workbook.addImage`, set the background to the worksheet\n */\n addBackgroundImage(imageId: string | number): void {\n const model = {\n type: \"background\",\n imageId: String(imageId)\n };\n this._media.push(new Image(this, model));\n }\n\n getBackgroundImageId(): string | undefined {\n const image = this._media.find(m => m.type === \"background\");\n return image && image.imageId;\n }\n\n // =========================================================================\n // Worksheet Protection\n\n /**\n * Protect the worksheet with optional password and options\n */\n async protect(password?: string, options?: Partial<SheetProtection>): Promise<void> {\n this.sheetProtection = {\n sheet: true\n };\n if (options && \"spinCount\" in options) {\n // force spinCount to be integer >= 0\n options.spinCount = Number.isFinite(options.spinCount)\n ? Math.round(Math.max(0, options.spinCount))\n : 100000;\n }\n if (password) {\n this.sheetProtection.algorithmName = \"SHA-512\";\n this.sheetProtection.saltValue = uint8ArrayToBase64(Encryptor.randomBytes(16));\n this.sheetProtection.spinCount =\n options && \"spinCount\" in options ? options.spinCount : 100000; // allow user specified spinCount\n this.sheetProtection.hashValue = await Encryptor.convertPasswordToHash(\n password,\n \"SHA-512\",\n this.sheetProtection.saltValue,\n this.sheetProtection.spinCount\n );\n }\n if (options) {\n this.sheetProtection = Object.assign(this.sheetProtection, options);\n if (!password && \"spinCount\" in options) {\n delete this.sheetProtection.spinCount;\n }\n }\n }\n\n unprotect(): void {\n this.sheetProtection = null;\n }\n\n // =========================================================================\n // Tables\n\n /**\n * Add a new table and return a reference to it\n */\n addTable(model: TableProperties): Table {\n const table = new Table(this, model);\n this.tables[model.name] = table;\n return table;\n }\n\n /**\n * Fetch table by name\n */\n getTable(name: string): Table {\n return this.tables[name];\n }\n\n /**\n * Delete table by name\n */\n removeTable(name: string): void {\n delete this.tables[name];\n }\n\n /**\n * Fetch all tables in the worksheet\n */\n getTables(): Table[] {\n return Object.values(this.tables);\n }\n\n // =========================================================================\n // Pivot Tables\n addPivotTable(model: PivotTableModel): PivotTable {\n const pivotTable = makePivotTable(this, model);\n\n this.pivotTables.push(pivotTable);\n this.workbook.pivotTables.push(pivotTable);\n\n return pivotTable;\n }\n\n // ===========================================================================\n // Conditional Formatting\n\n /**\n * Add conditional formatting rules\n */\n addConditionalFormatting(cf: ConditionalFormattingOptions): void {\n this.conditionalFormattings.push(cf);\n }\n\n /**\n * Delete conditional formatting rules\n */\n removeConditionalFormatting(\n filter:\n | number\n | ((\n value: ConditionalFormattingOptions,\n index: number,\n array: ConditionalFormattingOptions[]\n ) => boolean)\n ): void {\n if (typeof filter === \"number\") {\n this.conditionalFormattings.splice(filter, 1);\n } else if (filter instanceof Function) {\n this.conditionalFormattings = this.conditionalFormattings.filter(filter);\n } else {\n this.conditionalFormattings = [];\n }\n }\n\n // ===========================================================================\n // Model\n\n get model(): WorksheetModel {\n const model: WorksheetModel = {\n id: this.id,\n name: this.name,\n dataValidations: this.dataValidations.model,\n properties: this.properties,\n state: this.state,\n pageSetup: this.pageSetup,\n headerFooter: this.headerFooter,\n rowBreaks: this.rowBreaks,\n colBreaks: this.colBreaks,\n views: this.views,\n autoFilter: this.autoFilter,\n media: this._media.map(medium => medium.model),\n sheetProtection: this.sheetProtection,\n tables: Object.values(this.tables).map(table => table.model),\n pivotTables: this.pivotTables,\n conditionalFormattings: this.conditionalFormattings\n };\n\n // =================================================\n // columns\n model.cols = Column.toModel(this.columns || []);\n\n // ==========================================================\n // Rows\n const rows: RowModel[] = (model.rows = []);\n const dimensions: Range = (model.dimensions = new Range());\n this._rows.forEach(row => {\n const rowModel = row && row.model;\n if (rowModel) {\n dimensions.expand(rowModel.number, rowModel.min, rowModel.number, rowModel.max);\n rows.push(rowModel);\n }\n });\n\n // ==========================================================\n // Merges\n model.merges = [];\n Object.values(this._merges).forEach((merge: Range) => {\n model.merges!.push(merge.range);\n });\n\n return model;\n }\n\n _parseRows(model: WorksheetModel): void {\n this._rows = [];\n if (model.rows) {\n model.rows.forEach(rowModel => {\n const row = new Row(this, rowModel.number);\n this._rows[row.number - 1] = row;\n row.model = rowModel;\n });\n }\n }\n\n _parseMergeCells(model: WorksheetModel): void {\n if (model.mergeCells) {\n model.mergeCells.forEach((merge: string) => {\n // Do not merge styles when importing an Excel file\n // since each cell may have different styles intentionally.\n this.mergeCellsWithoutStyle(merge);\n });\n }\n }\n\n set model(value: WorksheetModel) {\n this.name = value.name;\n this._columns = Column.fromModel(this, value.cols);\n this._parseRows(value);\n\n this._parseMergeCells(value);\n this.dataValidations = new DataValidations(value.dataValidations);\n this.properties = value.properties;\n this.pageSetup = value.pageSetup;\n this.headerFooter = value.headerFooter;\n this.rowBreaks = value.rowBreaks || [];\n this.colBreaks = value.colBreaks || [];\n this.views = value.views;\n this.autoFilter = value.autoFilter;\n this._media = value.media.map(medium => new Image(this, medium));\n this.sheetProtection = value.sheetProtection;\n this.tables = value.tables.reduce((tables: { [key: string]: Table }, table: TableModel) => {\n const t = new Table(this, table);\n t.model = table;\n tables[table.name] = t;\n return tables;\n }, {});\n this.pivotTables = value.pivotTables;\n this.conditionalFormattings = value.conditionalFormattings;\n }\n}\n\nexport { Worksheet, type WorksheetModel };\n","import { colCache } from \"@excel/utils/col-cache\";\n\n// Helper to check for prototype pollution\nfunction isSafeKey(key: string | number): boolean {\n if (typeof key === \"number\") {\n return true;\n }\n return key !== \"__proto__\" && key !== \"constructor\" && key !== \"prototype\";\n}\n\n// Safe deep clone that filters out prototype pollution keys\nfunction safeDeepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n if (Array.isArray(obj)) {\n return obj.map(item => safeDeepClone(item)) as T;\n }\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n if (isSafeKey(key)) {\n result[key] = safeDeepClone((obj as Record<string, unknown>)[key]);\n }\n }\n return result as T;\n}\n\ninterface CellAddress {\n sheetName?: string;\n address: string;\n row: number;\n col: number;\n top?: number;\n bottom?: number;\n left?: number;\n right?: number;\n}\n\ntype Cell = CellAddress & any;\ntype Row = Cell[];\ntype Sheet = Row[];\ntype Sheets = Record<string, Sheet>;\n\nclass CellMatrix {\n template: any;\n sheets: Sheets;\n\n constructor(template?: any) {\n this.template = template;\n this.sheets = {};\n }\n\n addCell(addressStr: string): void {\n this.addCellEx(colCache.decodeEx(addressStr) as any);\n }\n\n getCell(addressStr: string): Cell {\n return this.findCellEx(colCache.decodeEx(addressStr) as any, true);\n }\n\n findCell(addressStr: string): Cell | undefined {\n return this.findCellEx(colCache.decodeEx(addressStr) as any, false);\n }\n\n findCellAt(sheetName: string, rowNumber: number, colNumber: number): Cell | undefined {\n const sheet = this.sheets[sheetName];\n const row = sheet && sheet[rowNumber];\n return row && row[colNumber];\n }\n\n addCellEx(address: CellAddress): void {\n if (address.top !== undefined) {\n for (let row = address.top; row <= address.bottom!; row++) {\n for (let col = address.left!; col <= address.right!; col++) {\n this.getCellAt(address.sheetName!, row, col);\n }\n }\n } else {\n this.findCellEx(address, true);\n }\n }\n\n getCellEx(address: CellAddress): Cell {\n return this.findCellEx(address, true);\n }\n\n findCellEx(address: CellAddress, create: boolean): Cell | undefined {\n const sheet = this.findSheet(address, create);\n const row = this.findSheetRow(sheet, address, create);\n return this.findRowCell(row, address, create);\n }\n\n getCellAt(sheetName: string, rowNumber: number, colNumber: number): Cell {\n if (!isSafeKey(sheetName)) {\n throw new Error(`Invalid sheet name: ${sheetName}`);\n }\n const sheet = this.sheets[sheetName] || (this.sheets[sheetName] = []);\n const row = sheet[rowNumber] || (sheet[rowNumber] = []);\n const cell =\n row[colNumber] ||\n (row[colNumber] = {\n sheetName,\n address: colCache.n2l(colNumber) + rowNumber,\n row: rowNumber,\n col: colNumber\n });\n return cell;\n }\n\n removeCellEx(address: CellAddress): void {\n const sheet = this.findSheet(address, false);\n if (!sheet) {\n return;\n }\n const row = this.findSheetRow(sheet, address, false);\n if (!row) {\n return;\n }\n delete row[address.col];\n }\n\n forEachInSheet(\n sheetName: string,\n callback: (cell: Cell, rowNumber: number, colNumber: number) => void\n ): void {\n const sheet = this.sheets[sheetName];\n if (sheet) {\n sheet.forEach((row, rowNumber) => {\n if (row) {\n row.forEach((cell, colNumber) => {\n if (cell) {\n callback(cell, rowNumber, colNumber);\n }\n });\n }\n });\n }\n }\n\n forEach(callback: (cell: Cell) => void): void {\n Object.keys(this.sheets).forEach(sheetName => {\n this.forEachInSheet(sheetName as string, callback);\n });\n }\n\n map<T>(callback: (cell: Cell) => T): T[] {\n const results: T[] = [];\n this.forEach(cell => {\n results.push(callback(cell));\n });\n return results;\n }\n\n findSheet(address: CellAddress, create: boolean): Sheet | undefined {\n const name = address.sheetName!;\n if (!isSafeKey(name)) {\n throw new Error(`Invalid sheet name: ${name}`);\n }\n if (Object.prototype.hasOwnProperty.call(this.sheets, name)) {\n return this.sheets[name];\n }\n if (create) {\n return (this.sheets[name] = []);\n }\n return undefined;\n }\n\n findSheetRow(sheet: Sheet | undefined, address: CellAddress, create: boolean): Row | undefined {\n const { row } = address;\n if (!isSafeKey(row)) {\n throw new Error(`Invalid row: ${row}`);\n }\n if (sheet && sheet[row]) {\n return sheet[row];\n }\n if (create) {\n return (sheet![row] = []);\n }\n return undefined;\n }\n\n findRowCell(row: Row | undefined, address: CellAddress, create: boolean): Cell | undefined {\n const { col } = address;\n if (!isSafeKey(col)) {\n throw new Error(`Invalid column: ${col}`);\n }\n if (row && row[col]) {\n return row[col];\n }\n if (create) {\n return (row![col] = this.template\n ? { ...address, ...safeDeepClone(this.template) }\n : address);\n }\n return undefined;\n }\n\n spliceRows(sheetName: string, start: number, numDelete: number, numInsert: number): void {\n const sheet = this.sheets[sheetName];\n if (sheet) {\n const inserts: Row[] = [];\n for (let i = 0; i < numInsert; i++) {\n inserts.push([]);\n }\n sheet.splice(start, numDelete, ...inserts);\n }\n }\n\n spliceColumns(sheetName: string, start: number, numDelete: number, numInsert: number): void {\n const sheet = this.sheets[sheetName];\n if (sheet) {\n const inserts: (Cell | null)[] = [];\n for (let i = 0; i < numInsert; i++) {\n inserts.push(null);\n }\n Object.values(sheet).forEach((row: Row) => {\n row.splice(start, numDelete, ...inserts);\n });\n }\n }\n}\n\nexport { CellMatrix };\n","import { colCache, type DecodedRange } from \"@excel/utils/col-cache\";\nimport { CellMatrix } from \"@excel/utils/cell-matrix\";\nimport { Range } from \"@excel/range\";\nimport type { Address } from \"@excel/types\";\n\nconst rangeRegexp = /[$](\\w+)[$](\\d+)(:[$](\\w+)[$](\\d+))?/;\n\n// Cell type for defined names - extends Address with mark for exploration algorithm\ninterface DefinedNameCell {\n sheetName?: string;\n address: string;\n row: number;\n col: number;\n mark?: boolean;\n}\n\n// Location can be a single cell address or a range\ntype CellLocation = Address | DecodedRange;\n\ninterface DefinedNameModel {\n name: string;\n ranges: string[];\n}\n\nclass DefinedNames {\n matrixMap: Record<string, CellMatrix>;\n\n constructor() {\n this.matrixMap = {};\n }\n\n getMatrix(name: string): CellMatrix {\n const matrix = this.matrixMap[name] || (this.matrixMap[name] = new CellMatrix());\n return matrix;\n }\n\n // add a name to a cell. locStr in the form SheetName!$col$row or SheetName!$c1$r1:$c2:$r2\n add(locStr: string, name: string): void {\n const location = colCache.decodeEx(locStr);\n if (\"error\" in location) {\n return; // Invalid reference, skip\n }\n this.addEx(location, name);\n }\n\n addEx(location: CellLocation, name: string): void {\n const matrix = this.getMatrix(name);\n if (\"top\" in location) {\n // It's a range (DecodedRange has top/left/bottom/right from Location)\n for (let col = location.left; col <= location.right; col++) {\n for (let row = location.top; row <= location.bottom; row++) {\n const address = {\n sheetName: location.sheetName,\n address: colCache.n2l(col) + row,\n row,\n col\n };\n\n matrix.addCellEx(address);\n }\n }\n } else {\n // It's a single cell address\n matrix.addCellEx(location);\n }\n }\n\n remove(locStr: string, name: string): void {\n const location = colCache.decodeEx(locStr);\n if (\"error\" in location) {\n return; // Invalid reference, skip\n }\n this.removeEx(location, name);\n }\n\n removeEx(location: CellLocation, name: string): void {\n const matrix = this.getMatrix(name);\n if (\"top\" in location) {\n // Range - remove each cell\n for (let col = location.left; col <= location.right; col++) {\n for (let row = location.top; row <= location.bottom; row++) {\n matrix.removeCellEx({\n sheetName: location.sheetName,\n address: colCache.n2l(col) + row,\n row,\n col\n });\n }\n }\n } else {\n matrix.removeCellEx(location);\n }\n }\n\n removeAllNames(location: CellLocation): void {\n Object.values(this.matrixMap).forEach((matrix: CellMatrix) => {\n if (\"top\" in location) {\n // Range - remove each cell\n for (let col = location.left; col <= location.right; col++) {\n for (let row = location.top; row <= location.bottom; row++) {\n matrix.removeCellEx({\n sheetName: location.sheetName,\n address: colCache.n2l(col) + row,\n row,\n col\n });\n }\n }\n } else {\n matrix.removeCellEx(location);\n }\n });\n }\n\n forEach(callback: (name: string, cell: DefinedNameCell) => void): void {\n Object.entries(this.matrixMap).forEach(([name, matrix]) => {\n matrix.forEach((cell: DefinedNameCell) => {\n callback(name, cell);\n });\n });\n }\n\n // get all the names of a cell\n getNames(addressStr: string): string[] {\n const location = colCache.decodeEx(addressStr);\n if (\"error\" in location || \"top\" in location) {\n return []; // Invalid reference or range not supported\n }\n return this.getNamesEx(location);\n }\n\n getNamesEx(address: Address): string[] {\n return Object.entries(this.matrixMap)\n .map(([name, matrix]) => matrix.findCellEx(address, false) && name)\n .filter((name): name is string => Boolean(name));\n }\n\n _explore(matrix: CellMatrix, cell: DefinedNameCell): Range {\n cell.mark = false;\n const { sheetName } = cell;\n\n const range = new Range(cell.row, cell.col, cell.row, cell.col, sheetName);\n let x: number;\n let y: number;\n\n // Helper to get cell with proper type\n const getCell = (row: number, col: number): DefinedNameCell | undefined => {\n return matrix.findCellAt(sheetName!, row, col) as DefinedNameCell | undefined;\n };\n\n // grow vertical - only one col to worry about\n function vGrow(yy: number, edge: \"top\" | \"bottom\"): boolean {\n const c = getCell(yy, cell.col);\n if (!c || !c.mark) {\n return false;\n }\n range[edge] = yy;\n c.mark = false;\n return true;\n }\n for (y = cell.row - 1; vGrow(y, \"top\"); y--) {}\n for (y = cell.row + 1; vGrow(y, \"bottom\"); y++) {}\n\n // grow horizontal - ensure all rows can grow\n function hGrow(xx: number, edge: \"left\" | \"right\"): boolean {\n const cells: DefinedNameCell[] = [];\n for (y = range.top; y <= range.bottom; y++) {\n const c = getCell(y, xx);\n if (c && c.mark) {\n cells.push(c);\n } else {\n return false;\n }\n }\n range[edge] = xx;\n for (let i = 0; i < cells.length; i++) {\n cells[i].mark = false;\n }\n return true;\n }\n for (x = cell.col - 1; hGrow(x, \"left\"); x--) {}\n for (x = cell.col + 1; hGrow(x, \"right\"); x++) {}\n\n return range;\n }\n\n getRanges(name: string, matrix?: CellMatrix): DefinedNameModel {\n matrix = matrix || this.matrixMap[name];\n\n if (!matrix) {\n return { name, ranges: [] };\n }\n\n // mark and sweep!\n matrix.forEach((cell: DefinedNameCell) => {\n cell.mark = true;\n });\n const ranges = matrix\n .map((cell: DefinedNameCell) => cell.mark && this._explore(matrix!, cell))\n .filter(Boolean)\n .map((range: Range) => range.$shortRange);\n\n return {\n name,\n ranges\n };\n }\n\n normaliseMatrix(matrix: CellMatrix, sheetName: string): void {\n // some of the cells might have shifted on specified sheet\n // need to reassign rows, cols\n matrix.forEachInSheet(\n sheetName,\n (cell: DefinedNameCell | undefined, row: number, col: number) => {\n if (cell) {\n if (cell.row !== row || cell.col !== col) {\n cell.row = row;\n cell.col = col;\n cell.address = colCache.n2l(col) + row;\n }\n }\n }\n );\n }\n\n spliceRows(sheetName: string, start: number, numDelete: number, numInsert: number): void {\n Object.values(this.matrixMap).forEach((matrix: CellMatrix) => {\n matrix.spliceRows(sheetName, start, numDelete, numInsert);\n this.normaliseMatrix(matrix, sheetName);\n });\n }\n\n spliceColumns(sheetName: string, start: number, numDelete: number, numInsert: number): void {\n Object.values(this.matrixMap).forEach((matrix: CellMatrix) => {\n matrix.spliceColumns(sheetName, start, numDelete, numInsert);\n this.normaliseMatrix(matrix, sheetName);\n });\n }\n\n get model(): DefinedNameModel[] {\n // To get names per cell - just iterate over all names finding cells if they exist\n return Object.entries(this.matrixMap)\n .map(([name, matrix]) => this.getRanges(name, matrix))\n .filter((definedName: DefinedNameModel) => definedName.ranges.length);\n }\n\n set model(value: DefinedNameModel[]) {\n // value is [ { name, ranges }, ... ]\n const matrixMap = (this.matrixMap = {});\n value.forEach(definedName => {\n const matrix = (matrixMap[definedName.name] = new CellMatrix());\n definedName.ranges.forEach(rangeStr => {\n if (rangeRegexp.test(rangeStr.split(\"!\").pop() || \"\")) {\n matrix.addCell(rangeStr);\n }\n });\n });\n }\n}\n\nexport { DefinedNames, type DefinedNameModel };\n","import { xmlEncode } from \"@utils/utils\";\n\n// constants\nconst OPEN_ANGLE = \"<\";\nconst CLOSE_ANGLE = \">\";\nconst OPEN_ANGLE_SLASH = \"</\";\nconst CLOSE_SLASH_ANGLE = \"/>\";\n\n// Chunk size for periodic consolidation (reduces final join overhead)\nconst CHUNK_SIZE = 10000;\n\ninterface Attributes {\n [key: string]: any;\n}\n\ninterface Rollback {\n xml: number;\n stack: number;\n leaf: boolean;\n open: boolean;\n chunksLength: number;\n}\n\nfunction pushAttribute(xml: string[], name: string, value: any): void {\n xml.push(` ${name}=\"${xmlEncode(value.toString())}\"`);\n}\n\nfunction pushAttributes(xml: string[], attributes?: Attributes): void {\n if (attributes) {\n const tmp: string[] = [];\n for (const name in attributes) {\n if (!Object.prototype.hasOwnProperty.call(attributes, name)) {\n continue;\n }\n const value = attributes[name];\n if (value !== undefined) {\n pushAttribute(tmp, name, value);\n }\n }\n xml.push(tmp.join(\"\"));\n }\n}\n\nclass XmlStream {\n declare private _xml: string[];\n declare private _chunks: string[];\n declare private _stack: string[];\n declare private _rollbacks: Rollback[];\n leaf?: boolean;\n open?: boolean;\n\n constructor() {\n this._xml = [];\n this._chunks = [];\n this._stack = [];\n this._rollbacks = [];\n this.leaf = false;\n this.open = false;\n }\n\n private _consolidate(): void {\n // Consolidation is not rollback-safe: joining and moving fragments into `_chunks`\n // cannot be undone. Avoid consolidating while a rollback marker is active.\n if (this._rollbacks.length > 0) {\n return;\n }\n // Periodically join small strings into larger chunks to reduce final join overhead\n if (this._xml.length >= CHUNK_SIZE) {\n this._chunks.push(this._xml.join(\"\"));\n this._xml.length = 0;\n }\n }\n\n get tos(): string | undefined {\n return this._stack.length ? this._stack[this._stack.length - 1] : undefined;\n }\n\n get cursor(): number {\n // handy way to track whether anything has been added\n return this._chunks.length * CHUNK_SIZE + this._xml.length;\n }\n\n openXml(docAttributes?: Attributes): void {\n const xml = this._xml;\n // <?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n xml.push(\"<?xml\");\n pushAttributes(xml, docAttributes);\n xml.push(\"?>\\n\");\n }\n\n openNode(name: string, attributes?: Attributes): void {\n const parent = this.tos;\n const xml = this._xml;\n if (parent && this.open) {\n xml.push(CLOSE_ANGLE);\n }\n\n this._stack.push(name);\n\n // start streaming node\n xml.push(OPEN_ANGLE);\n xml.push(name);\n pushAttributes(xml, attributes);\n this.leaf = true;\n this.open = true;\n }\n\n addAttribute(name: string, value: any): void {\n if (!this.open) {\n throw new Error(\"Cannot write attributes to node if it is not open\");\n }\n if (value !== undefined) {\n pushAttribute(this._xml, name, value);\n }\n }\n\n addAttributes(attrs: Attributes): void {\n if (!this.open) {\n throw new Error(\"Cannot write attributes to node if it is not open\");\n }\n pushAttributes(this._xml, attrs);\n }\n\n writeText(text: any): void {\n const xml = this._xml;\n if (this.open) {\n xml.push(CLOSE_ANGLE);\n this.open = false;\n }\n this.leaf = false;\n xml.push(xmlEncode(text.toString()));\n }\n\n writeXml(xml: string): void {\n if (this.open) {\n this._xml.push(CLOSE_ANGLE);\n this.open = false;\n }\n this.leaf = false;\n this._xml.push(xml);\n }\n\n closeNode(): void {\n const node = this._stack.pop();\n const xml = this._xml;\n if (this.leaf) {\n xml.push(CLOSE_SLASH_ANGLE);\n } else {\n xml.push(OPEN_ANGLE_SLASH);\n xml.push(node!);\n xml.push(CLOSE_ANGLE);\n }\n this.open = false;\n this.leaf = false;\n this._consolidate();\n }\n\n leafNode(name: string, attributes?: Attributes, text?: any): void {\n this.openNode(name, attributes);\n if (text !== undefined) {\n // zeros need to be written\n this.writeText(text);\n }\n this.closeNode();\n }\n\n closeAll(): void {\n while (this._stack.length) {\n this.closeNode();\n }\n }\n\n addRollback(): number {\n this._rollbacks.push({\n xml: this._xml.length,\n stack: this._stack.length,\n leaf: this.leaf ?? false,\n open: this.open ?? false,\n chunksLength: this._chunks.length\n });\n return this.cursor;\n }\n\n commit(): void {\n this._rollbacks.pop();\n }\n\n rollback(): void {\n const r = this._rollbacks.pop()!;\n if (this._xml.length > r.xml) {\n this._xml.length = r.xml;\n }\n if (this._stack.length > r.stack) {\n this._stack.length = r.stack;\n }\n if (this._chunks.length > r.chunksLength) {\n this._chunks.length = r.chunksLength;\n }\n this.leaf = r.leaf;\n this.open = r.open;\n }\n\n get xml(): string {\n this.closeAll();\n // Join chunks first, then remaining xml array\n if (this._chunks.length === 0) {\n return this._xml.join(\"\");\n }\n if (this._xml.length > 0) {\n this._chunks.push(this._xml.join(\"\"));\n }\n return this._chunks.join(\"\");\n }\n\n static StdDocAttributes = {\n version: \"1.0\",\n encoding: \"UTF-8\",\n standalone: \"yes\"\n };\n}\n\nexport { XmlStream };\n","/**\n * High-performance SAX XML parser\n *\n * Minimal implementation optimized for Excel XML parsing.\n * Supports: opentag, text, closetag, error events.\n * Zero external dependencies.\n *\n * Based on XML 1.0 specification with optimizations for common Excel XML patterns.\n */\n\nimport { bufferToString } from \"@utils/utils\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface SaxEvent {\n eventType: \"opentag\" | \"text\" | \"closetag\";\n value: any;\n}\n\nexport interface SaxesTagPlain {\n name: string;\n attributes: Record<string, string>;\n isSelfClosing: boolean;\n}\n\nexport interface SaxesOptions {\n xmlns?: boolean;\n position?: boolean;\n fileName?: string;\n fragment?: boolean;\n}\n\ntype TextHandler = (text: string) => void;\ntype OpenTagHandler = (tag: SaxesTagPlain) => void;\ntype CloseTagHandler = (tag: SaxesTagPlain) => void;\ntype ErrorHandler = (err: Error) => void;\n\n// ============================================================================\n// Character codes (for fast comparison)\n// ============================================================================\n\nconst TAB = 9;\nconst NL = 0xa;\nconst CR = 0xd;\nconst SPACE = 0x20;\nconst BANG = 0x21; // !\nconst DQUOTE = 0x22; // \"\nconst AMP = 0x26; // &\nconst SQUOTE = 0x27; // '\nconst MINUS = 0x2d; // -\nconst FORWARD_SLASH = 0x2f; // /\nconst SEMICOLON = 0x3b; // ;\nconst LESS = 0x3c; // <\nconst EQUAL = 0x3d; // =\nconst GREATER = 0x3e; // >\nconst QUESTION = 0x3f; // ?\nconst OPEN_BRACKET = 0x5b; // [\nconst CLOSE_BRACKET = 0x5d; // ]\nconst HASH = 0x23; // #\n\n// ============================================================================\n// Pre-computed lookup tables for performance\n// ============================================================================\n\n// ASCII character lookup (0-127) for String.fromCharCode\nconst ASCII_CHARS: string[] = new Array(128);\nfor (let i = 0; i < 128; i++) {\n ASCII_CHARS[i] = String.fromCharCode(i);\n}\n\n// Fast charFromCode - use lookup for ASCII, fallback for others\nfunction charFromCode(c: number): string {\n return c < 128 ? ASCII_CHARS[c] : String.fromCodePoint(c);\n}\n\n// Bitmap for ASCII name start chars (a-zA-Z_:)\nconst NAME_START_CHAR_ASCII = new Uint8Array(128);\nfor (let i = 0x61; i <= 0x7a; i++) {\n NAME_START_CHAR_ASCII[i] = 1;\n} // a-z\nfor (let i = 0x41; i <= 0x5a; i++) {\n NAME_START_CHAR_ASCII[i] = 1;\n} // A-Z\nNAME_START_CHAR_ASCII[0x5f] = 1; // _\nNAME_START_CHAR_ASCII[0x3a] = 1; // :\n\n// Bitmap for ASCII name chars (a-zA-Z0-9_:-.)\nconst NAME_CHAR_ASCII = new Uint8Array(128);\nfor (let i = 0x61; i <= 0x7a; i++) {\n NAME_CHAR_ASCII[i] = 1;\n} // a-z\nfor (let i = 0x41; i <= 0x5a; i++) {\n NAME_CHAR_ASCII[i] = 1;\n} // A-Z\nfor (let i = 0x30; i <= 0x39; i++) {\n NAME_CHAR_ASCII[i] = 1;\n} // 0-9\nNAME_CHAR_ASCII[0x5f] = 1; // _\nNAME_CHAR_ASCII[0x3a] = 1; // :\nNAME_CHAR_ASCII[0x2d] = 1; // -\nNAME_CHAR_ASCII[0x2e] = 1; // .\n\n// ============================================================================\n// Character classification (inlined for performance)\n// ============================================================================\n\n// isS: space characters (XML whitespace)\nfunction isS(c: number): boolean {\n return c === SPACE || c === NL || c === CR || c === TAB;\n}\n\n// isQuote: quote characters\nfunction isQuote(c: number): boolean {\n return c === DQUOTE || c === SQUOTE;\n}\n\n// isNameStartChar: valid first character of XML name\n// Optimized for common ASCII range first\nfunction isNameStartChar(c: number): boolean {\n // Fast path: ASCII lookup\n if (c < 128) {\n return NAME_START_CHAR_ASCII[c] === 1;\n }\n // Extended ranges (less common in Excel XML)\n return (\n (c >= 0xc0 && c <= 0xd6) ||\n (c >= 0xd8 && c <= 0xf6) ||\n (c >= 0xf8 && c <= 0x2ff) ||\n (c >= 0x370 && c <= 0x37d) ||\n (c >= 0x37f && c <= 0x1fff) ||\n c === 0x200c ||\n c === 0x200d ||\n (c >= 0x2070 && c <= 0x218f) ||\n (c >= 0x2c00 && c <= 0x2fef) ||\n (c >= 0x3001 && c <= 0xd7ff) ||\n (c >= 0xf900 && c <= 0xfdcf) ||\n (c >= 0xfdf0 && c <= 0xfffd) ||\n (c >= 0x10000 && c <= 0xeffff)\n );\n}\n\n// isNameChar: valid character in XML name (includes digits, hyphen, period)\nfunction isNameChar(c: number): boolean {\n // Fast path: ASCII lookup\n if (c < 128) {\n return NAME_CHAR_ASCII[c] === 1;\n }\n // Extended ranges\n return (\n c === 0xb7 ||\n (c >= 0xc0 && c <= 0xd6) ||\n (c >= 0xd8 && c <= 0xf6) ||\n (c >= 0xf8 && c <= 0x2ff) ||\n (c >= 0x300 && c <= 0x36f) ||\n (c >= 0x370 && c <= 0x37d) ||\n (c >= 0x37f && c <= 0x1fff) ||\n c === 0x200c ||\n c === 0x200d ||\n (c >= 0x203f && c <= 0x2040) ||\n (c >= 0x2070 && c <= 0x218f) ||\n (c >= 0x2c00 && c <= 0x2fef) ||\n (c >= 0x3001 && c <= 0xd7ff) ||\n (c >= 0xf900 && c <= 0xfdcf) ||\n (c >= 0xfdf0 && c <= 0xfffd) ||\n (c >= 0x10000 && c <= 0xeffff)\n );\n}\n\n// isChar10: valid XML 1.0 character\nfunction isChar10(c: number): boolean {\n return (\n (c >= SPACE && c <= 0xd7ff) ||\n c === NL ||\n c === CR ||\n c === TAB ||\n (c >= 0xe000 && c <= 0xfffd) ||\n (c >= 0x10000 && c <= 0x10ffff)\n );\n}\n\n// ============================================================================\n// Built-in XML entities\n// ============================================================================\n\nconst XML_ENTITIES: Record<string, string> = {\n amp: \"&\",\n gt: \">\",\n lt: \"<\",\n quot: '\"',\n apos: \"'\"\n};\n\n// ============================================================================\n// Parser States\n// ============================================================================\n\nconst S_TEXT = 0;\nconst S_OPEN_WAKA = 1; // <\nconst S_OPEN_WAKA_BANG = 2; // <!\nconst S_OPEN_TAG = 3; // <tagname\nconst S_OPEN_TAG_SLASH = 4; // <tagname /\nconst S_ATTRIB = 5; // <tagname attr\nconst S_ATTRIB_NAME = 6; // <tagname attr\nconst S_ATTRIB_NAME_SAW_WHITE = 7;\nconst S_ATTRIB_VALUE = 8; // <tagname attr=\nconst S_ATTRIB_VALUE_QUOTED = 9; // <tagname attr=\"\nconst S_ATTRIB_VALUE_CLOSED = 10;\nconst S_CLOSE_TAG = 11; // </tagname\nconst S_CLOSE_TAG_SAW_WHITE = 12;\nconst S_COMMENT = 13; // <!--\nconst S_COMMENT_ENDING = 14; // <!-- text -\nconst S_COMMENT_ENDED = 15; // <!-- text --\nconst S_CDATA = 16; // <![CDATA[\nconst S_CDATA_ENDING = 17; // <![CDATA[ text ]\nconst S_CDATA_ENDING_2 = 18; // <![CDATA[ text ]]\nconst S_PI = 19; // <?\nconst S_PI_ENDING = 20; // <? text ?\nconst S_DOCTYPE = 21; // <!DOCTYPE\nconst S_DOCTYPE_QUOTE = 22;\nconst S_DOCTYPE_DTD = 23;\nconst S_DOCTYPE_DTD_QUOTED = 24;\nconst S_ENTITY = 25; // &entity;\n\n// ============================================================================\n// SaxesParser Class - Minimal implementation for Excel XML\n// ============================================================================\n\nexport class SaxesParser {\n // Configuration\n private trackPosition: boolean;\n private fileName?: string;\n private fragment: boolean;\n\n // Parser state\n private state: number = S_TEXT;\n private chunk: string = \"\";\n private i: number = 0;\n private prevI: number = 0;\n private text: string = \"\";\n private name: string = \"\";\n private q: number | null = null;\n private tags: SaxesTagPlain[] = [];\n private tag: SaxesTagPlain | null = null;\n private attribList: Array<{ name: string; value: string }> = [];\n private entity: string = \"\";\n private entityReturnState: number = S_TEXT;\n private openWakaBang: string = \"\";\n private sawRoot: boolean = false;\n private closedRoot: boolean = false;\n private carriedFromPrevious?: string;\n private _closed: boolean = false;\n private reportedTextBeforeRoot: boolean = false;\n private reportedTextAfterRoot: boolean = false;\n\n // Position tracking\n line: number = 1;\n column: number = 0;\n private positionAtNewLine: number = 0;\n private chunkPosition: number = 0;\n\n // Entity storage\n ENTITIES: Record<string, string> = { ...XML_ENTITIES };\n\n // Event handlers\n private textHandler?: TextHandler;\n private openTagHandler?: OpenTagHandler;\n private closeTagHandler?: CloseTagHandler;\n private errorHandler?: ErrorHandler;\n\n constructor(opt?: SaxesOptions) {\n this.trackPosition = opt?.position !== false;\n this.fileName = opt?.fileName;\n this.fragment = opt?.fragment ?? false;\n this._init();\n }\n\n get closed(): boolean {\n return this._closed;\n }\n\n get position(): number {\n return this.chunkPosition + this.i;\n }\n\n private _init(): void {\n this.state = this.fragment ? S_TEXT : S_TEXT;\n this.text = \"\";\n this.name = \"\";\n this.q = null;\n this.tags = [];\n this.tag = null;\n this.attribList = [];\n this.entity = \"\";\n this.openWakaBang = \"\";\n this.sawRoot = this.fragment;\n this.closedRoot = this.fragment;\n this.reportedTextBeforeRoot = this.fragment;\n this.reportedTextAfterRoot = this.fragment;\n this.carriedFromPrevious = undefined;\n this._closed = false;\n this.line = 1;\n this.column = 0;\n this.positionAtNewLine = 0;\n this.chunkPosition = 0;\n this.chunk = \"\";\n this.i = 0;\n this.prevI = 0;\n }\n\n // Event registration\n on(name: \"text\", handler: TextHandler): void;\n on(name: \"opentag\", handler: OpenTagHandler): void;\n on(name: \"closetag\", handler: CloseTagHandler): void;\n on(name: \"error\", handler: ErrorHandler): void;\n on(name: string, handler: any): void {\n switch (name) {\n case \"text\":\n this.textHandler = handler;\n break;\n case \"opentag\":\n this.openTagHandler = handler;\n break;\n case \"closetag\":\n this.closeTagHandler = handler;\n break;\n case \"error\":\n this.errorHandler = handler;\n break;\n }\n }\n\n off(name: string): void {\n switch (name) {\n case \"text\":\n this.textHandler = undefined;\n break;\n case \"opentag\":\n this.openTagHandler = undefined;\n break;\n case \"closetag\":\n this.closeTagHandler = undefined;\n break;\n case \"error\":\n this.errorHandler = undefined;\n break;\n }\n }\n\n // Error handling\n private makeError(message: string): Error {\n let msg = this.fileName ?? \"\";\n if (this.trackPosition) {\n if (msg.length > 0) {\n msg += \":\";\n }\n msg += `${this.line}:${this.column}`;\n }\n if (msg.length > 0) {\n msg += \": \";\n }\n return new Error(msg + message);\n }\n\n fail(message: string): this {\n const err = this.makeError(message);\n if (this.errorHandler) {\n this.errorHandler(err);\n } else {\n throw err;\n }\n return this;\n }\n\n // Main write method\n write(chunk: string | null): this {\n if (this._closed) {\n return this.fail(\"cannot write after close\");\n }\n\n let end = false;\n if (chunk === null) {\n end = true;\n chunk = \"\";\n }\n\n if (this.carriedFromPrevious !== undefined) {\n chunk = this.carriedFromPrevious + chunk;\n this.carriedFromPrevious = undefined;\n }\n\n let limit = chunk.length;\n if (!end && limit > 0) {\n const lastCode = chunk.charCodeAt(limit - 1);\n // Carry CR or surrogate to next chunk\n if (lastCode === CR || (lastCode >= 0xd800 && lastCode <= 0xdbff)) {\n this.carriedFromPrevious = chunk[limit - 1];\n limit--;\n chunk = chunk.slice(0, limit);\n }\n }\n\n this.chunk = chunk;\n this.i = 0;\n\n while (this.i < limit) {\n this.processState();\n }\n\n this.chunkPosition += limit;\n\n return end ? this.end() : this;\n }\n\n close(): this {\n return this.write(null);\n }\n\n // Get next character code, handling newlines\n // Optimized: split into fast path (no position) and slow path\n private getCode(): number {\n const { chunk, i } = this;\n this.prevI = i;\n this.i = i + 1;\n\n if (i >= chunk.length) {\n return -1; // EOC\n }\n\n const code = chunk.charCodeAt(i);\n\n // Fast path: common ASCII chars (no surrogates, no CR/LF)\n // 0x0a = LF, 0x0d = CR - both need special handling\n if (code < 0x0a || (code > 0x0d && code < 0xd800)) {\n if (this.trackPosition) {\n this.column++;\n }\n return code;\n }\n\n // Handle surrogates\n if (code >= 0xd800 && code <= 0xdbff) {\n const next = chunk.charCodeAt(i + 1);\n if (next >= 0xdc00 && next <= 0xdfff) {\n this.i = i + 2;\n if (this.trackPosition) {\n this.column++;\n }\n return 0x10000 + ((code - 0xd800) * 0x400 + (next - 0xdc00));\n }\n }\n\n // Handle CR\n if (code === CR) {\n if (chunk.charCodeAt(i + 1) === NL) {\n this.i = i + 2;\n }\n if (this.trackPosition) {\n this.line++;\n this.column = 0;\n this.positionAtNewLine = this.position;\n }\n return NL;\n }\n\n // Handle LF (code === 0x0a) or other codes between 0x0a-0x0d\n if (code === NL && this.trackPosition) {\n this.line++;\n this.column = 0;\n this.positionAtNewLine = this.position;\n } else if (this.trackPosition) {\n this.column++;\n }\n return code;\n }\n\n private unget(): void {\n this.i = this.prevI;\n if (this.trackPosition) {\n this.column--;\n }\n }\n\n // State machine dispatcher\n private processState(): void {\n switch (this.state) {\n case S_TEXT:\n this.sText();\n break;\n case S_OPEN_WAKA:\n this.sOpenWaka();\n break;\n case S_OPEN_WAKA_BANG:\n this.sOpenWakaBang();\n break;\n case S_OPEN_TAG:\n this.sOpenTag();\n break;\n case S_OPEN_TAG_SLASH:\n this.sOpenTagSlash();\n break;\n case S_ATTRIB:\n this.sAttrib();\n break;\n case S_ATTRIB_NAME:\n this.sAttribName();\n break;\n case S_ATTRIB_NAME_SAW_WHITE:\n this.sAttribNameSawWhite();\n break;\n case S_ATTRIB_VALUE:\n this.sAttribValue();\n break;\n case S_ATTRIB_VALUE_QUOTED:\n this.sAttribValueQuoted();\n break;\n case S_ATTRIB_VALUE_CLOSED:\n this.sAttribValueClosed();\n break;\n case S_CLOSE_TAG:\n this.sCloseTag();\n break;\n case S_CLOSE_TAG_SAW_WHITE:\n this.sCloseTagSawWhite();\n break;\n case S_COMMENT:\n this.sComment();\n break;\n case S_COMMENT_ENDING:\n this.sCommentEnding();\n break;\n case S_COMMENT_ENDED:\n this.sCommentEnded();\n break;\n case S_CDATA:\n this.sCData();\n break;\n case S_CDATA_ENDING:\n this.sCDataEnding();\n break;\n case S_CDATA_ENDING_2:\n this.sCDataEnding2();\n break;\n case S_PI:\n this.sPI();\n break;\n case S_PI_ENDING:\n this.sPIEnding();\n break;\n case S_DOCTYPE:\n this.sDoctype();\n break;\n case S_DOCTYPE_QUOTE:\n this.sDoctypeQuote();\n break;\n case S_DOCTYPE_DTD:\n this.sDoctypeDTD();\n break;\n case S_DOCTYPE_DTD_QUOTED:\n this.sDoctypeDTDQuoted();\n break;\n case S_ENTITY:\n this.sEntity();\n break;\n }\n }\n\n // ============================================================================\n // State handlers\n // ============================================================================\n\n private sText(): void {\n // Check if we're inside or outside the root element\n if (this.tags.length !== 0) {\n this.handleTextInRoot();\n } else {\n this.handleTextOutsideRoot();\n }\n }\n\n private handleTextInRoot(): void {\n const { chunk } = this;\n let { i: start } = this;\n const handler = this.textHandler;\n\n while (true) {\n const c = this.getCode();\n\n if (c === -1) {\n // End of chunk\n if (handler && start < this.i) {\n this.text += chunk.slice(start, this.i);\n }\n return;\n }\n\n if (c === LESS) {\n // Start of tag\n if (handler) {\n const slice = chunk.slice(start, this.prevI);\n if (this.text.length > 0) {\n handler(this.text + slice);\n this.text = \"\";\n } else if (slice.length > 0) {\n handler(slice);\n }\n }\n this.state = S_OPEN_WAKA;\n return;\n }\n\n if (c === AMP) {\n // Entity reference\n if (handler) {\n this.text += chunk.slice(start, this.prevI);\n }\n this.state = S_ENTITY;\n this.entityReturnState = S_TEXT;\n this.entity = \"\";\n return;\n }\n\n if (c === NL) {\n // Handle newline in text\n if (handler) {\n this.text += chunk.slice(start, this.prevI) + \"\\n\";\n }\n start = this.i;\n }\n }\n }\n\n private handleTextOutsideRoot(): void {\n const { chunk } = this;\n let { i: start } = this;\n const handler = this.textHandler;\n let nonSpace = false;\n\n while (true) {\n const c = this.getCode();\n\n if (c === -1) {\n // End of chunk\n if (handler && start < this.i) {\n this.text += chunk.slice(start, this.i);\n }\n break;\n }\n\n if (c === LESS) {\n // Start of tag\n if (handler) {\n const slice = chunk.slice(start, this.prevI);\n if (this.text.length > 0) {\n handler(this.text + slice);\n this.text = \"\";\n } else if (slice.length > 0) {\n handler(slice);\n }\n }\n this.state = S_OPEN_WAKA;\n break;\n }\n\n if (c === AMP) {\n // Entity reference\n if (handler) {\n this.text += chunk.slice(start, this.prevI);\n }\n this.state = S_ENTITY;\n this.entityReturnState = S_TEXT;\n this.entity = \"\";\n nonSpace = true;\n break;\n }\n\n if (c === NL) {\n // Handle newline in text\n if (handler) {\n this.text += chunk.slice(start, this.prevI) + \"\\n\";\n }\n start = this.i;\n } else if (!isS(c)) {\n nonSpace = true;\n }\n }\n\n // Report error for non-whitespace text outside root\n if (nonSpace) {\n if (!this.sawRoot && !this.reportedTextBeforeRoot) {\n this.fail(\"text data outside of root node.\");\n this.reportedTextBeforeRoot = true;\n }\n if (this.closedRoot && !this.reportedTextAfterRoot) {\n this.fail(\"text data outside of root node.\");\n this.reportedTextAfterRoot = true;\n }\n }\n }\n\n private sOpenWaka(): void {\n const c = this.getCode();\n\n if (isNameStartChar(c)) {\n this.state = S_OPEN_TAG;\n this.name = charFromCode(c);\n return;\n }\n\n switch (c) {\n case FORWARD_SLASH:\n this.state = S_CLOSE_TAG;\n this.name = \"\";\n break;\n case BANG:\n this.state = S_OPEN_WAKA_BANG;\n this.openWakaBang = \"\";\n break;\n case QUESTION:\n this.state = S_PI;\n this.text = \"\";\n break;\n default:\n this.fail(\"unexpected character in tag\");\n this.state = S_TEXT;\n }\n }\n\n private sOpenWakaBang(): void {\n const c = this.getCode();\n this.openWakaBang += charFromCode(c);\n\n switch (this.openWakaBang) {\n case \"[CDATA[\":\n this.state = S_CDATA;\n this.text = \"\";\n this.openWakaBang = \"\";\n break;\n case \"--\":\n this.state = S_COMMENT;\n this.text = \"\";\n this.openWakaBang = \"\";\n break;\n case \"DOCTYPE\":\n this.state = S_DOCTYPE;\n this.text = \"\";\n this.openWakaBang = \"\";\n break;\n default:\n if (this.openWakaBang.length >= 7) {\n this.fail(\"incorrect syntax\");\n this.state = S_TEXT;\n }\n }\n }\n\n private sOpenTag(): void {\n const c = this.getCode();\n\n if (c === -1) {\n return;\n }\n\n if (isNameChar(c)) {\n this.name += charFromCode(c);\n return;\n }\n\n // Tag name complete\n this.tag = {\n name: this.name,\n attributes: Object.create(null) as Record<string, string>,\n isSelfClosing: false\n };\n this.attribList = [];\n this.sawRoot = true;\n\n if (c === GREATER) {\n this.openTag();\n } else if (c === FORWARD_SLASH) {\n this.state = S_OPEN_TAG_SLASH;\n } else if (isS(c)) {\n this.state = S_ATTRIB;\n } else {\n this.fail(\"unexpected character in tag\");\n this.state = S_ATTRIB;\n }\n }\n\n private sOpenTagSlash(): void {\n const c = this.getCode();\n if (c === GREATER) {\n this.openSelfClosingTag();\n } else {\n this.fail(\"expected >\");\n this.state = S_ATTRIB;\n }\n }\n\n private sAttrib(): void {\n const c = this.skipSpaces();\n if (c === -1) {\n return;\n }\n\n if (isNameStartChar(c)) {\n this.name = charFromCode(c);\n this.state = S_ATTRIB_NAME;\n } else if (c === GREATER) {\n this.openTag();\n } else if (c === FORWARD_SLASH) {\n this.state = S_OPEN_TAG_SLASH;\n } else {\n this.fail(\"unexpected character in attribute\");\n }\n }\n\n private sAttribName(): void {\n const c = this.getCode();\n\n if (c === -1) {\n return;\n }\n\n if (isNameChar(c)) {\n this.name += charFromCode(c);\n return;\n }\n\n if (c === EQUAL) {\n this.state = S_ATTRIB_VALUE;\n } else if (isS(c)) {\n this.state = S_ATTRIB_NAME_SAW_WHITE;\n } else if (c === GREATER) {\n this.fail(\"attribute without value\");\n this.attribList.push({ name: this.name, value: this.name });\n this.name = \"\";\n this.openTag();\n } else {\n this.fail(\"unexpected character in attribute name\");\n }\n }\n\n private sAttribNameSawWhite(): void {\n const c = this.skipSpaces();\n if (c === -1) {\n return;\n }\n\n if (c === EQUAL) {\n this.state = S_ATTRIB_VALUE;\n } else {\n this.fail(\"attribute without value\");\n this.name = \"\";\n this.text = \"\";\n if (c === GREATER) {\n this.openTag();\n } else if (isNameStartChar(c)) {\n this.name = charFromCode(c);\n this.state = S_ATTRIB_NAME;\n } else {\n this.fail(\"unexpected character\");\n this.state = S_ATTRIB;\n }\n }\n }\n\n private sAttribValue(): void {\n const c = this.skipSpaces();\n if (c === -1) {\n return;\n }\n\n if (isQuote(c)) {\n this.q = c;\n this.text = \"\";\n this.state = S_ATTRIB_VALUE_QUOTED;\n } else {\n this.fail(\"unquoted attribute value\");\n this.state = S_TEXT;\n }\n }\n\n private sAttribValueQuoted(): void {\n const { q, chunk } = this;\n let { i: start } = this;\n\n while (true) {\n const c = this.getCode();\n\n if (c === -1) {\n this.text += chunk.slice(start, this.i);\n return;\n }\n\n if (c === q) {\n // End of attribute value\n this.attribList.push({\n name: this.name,\n value: this.text + chunk.slice(start, this.prevI)\n });\n this.name = \"\";\n this.text = \"\";\n this.q = null;\n this.state = S_ATTRIB_VALUE_CLOSED;\n return;\n }\n\n if (c === AMP) {\n this.text += chunk.slice(start, this.prevI);\n this.state = S_ENTITY;\n this.entityReturnState = S_ATTRIB_VALUE_QUOTED;\n this.entity = \"\";\n return;\n }\n\n if (c === NL || c === TAB) {\n // Normalize whitespace in attributes\n this.text += chunk.slice(start, this.prevI) + \" \";\n start = this.i;\n }\n\n if (c === LESS) {\n this.text += chunk.slice(start, this.prevI);\n this.fail(\"< not allowed in attribute value\");\n return;\n }\n }\n }\n\n private sAttribValueClosed(): void {\n const c = this.getCode();\n if (c === -1) {\n return;\n }\n\n if (isS(c)) {\n this.state = S_ATTRIB;\n } else if (c === GREATER) {\n this.openTag();\n } else if (c === FORWARD_SLASH) {\n this.state = S_OPEN_TAG_SLASH;\n } else if (isNameStartChar(c)) {\n this.fail(\"no whitespace between attributes\");\n this.name = charFromCode(c);\n this.state = S_ATTRIB_NAME;\n } else {\n this.fail(\"unexpected character after attribute\");\n }\n }\n\n private sCloseTag(): void {\n const c = this.getCode();\n if (c === -1) {\n return;\n }\n\n if (isNameChar(c)) {\n this.name += charFromCode(c);\n } else if (c === GREATER) {\n this.closeTag();\n } else if (isS(c)) {\n this.state = S_CLOSE_TAG_SAW_WHITE;\n } else {\n this.fail(\"unexpected character in close tag\");\n }\n }\n\n private sCloseTagSawWhite(): void {\n const c = this.skipSpaces();\n if (c === -1) {\n return;\n }\n\n if (c === GREATER) {\n this.closeTag();\n } else {\n this.fail(\"unexpected character in close tag\");\n }\n }\n\n private sComment(): void {\n const c = this.getCode();\n if (c === -1) {\n return;\n }\n\n if (c === MINUS) {\n this.state = S_COMMENT_ENDING;\n } else {\n this.text += charFromCode(c);\n }\n }\n\n private sCommentEnding(): void {\n const c = this.getCode();\n if (c === MINUS) {\n this.state = S_COMMENT_ENDED;\n } else {\n this.text += \"-\" + charFromCode(c);\n this.state = S_COMMENT;\n }\n }\n\n private sCommentEnded(): void {\n const c = this.getCode();\n if (c === GREATER) {\n // Comment done, emit nothing (we don't have a comment handler)\n this.text = \"\";\n this.state = S_TEXT;\n } else if (c === MINUS) {\n this.text += \"-\";\n } else {\n this.fail(\"malformed comment\");\n this.text += \"--\" + charFromCode(c);\n this.state = S_COMMENT;\n }\n }\n\n private sCData(): void {\n const c = this.getCode();\n if (c === -1) {\n return;\n }\n\n if (c === CLOSE_BRACKET) {\n this.state = S_CDATA_ENDING;\n } else {\n this.text += charFromCode(c);\n }\n }\n\n private sCDataEnding(): void {\n const c = this.getCode();\n if (c === CLOSE_BRACKET) {\n this.state = S_CDATA_ENDING_2;\n } else {\n this.text += \"]\" + charFromCode(c);\n this.state = S_CDATA;\n }\n }\n\n private sCDataEnding2(): void {\n const c = this.getCode();\n if (c === GREATER) {\n // CDATA done - emit as text\n if (this.textHandler && this.text.length > 0) {\n this.textHandler(this.text);\n }\n this.text = \"\";\n this.state = S_TEXT;\n } else if (c === CLOSE_BRACKET) {\n this.text += \"]\";\n } else {\n this.text += \"]]\" + charFromCode(c);\n this.state = S_CDATA;\n }\n }\n\n private sPI(): void {\n const c = this.getCode();\n if (c === -1) {\n return;\n }\n\n if (c === QUESTION) {\n this.state = S_PI_ENDING;\n } else {\n this.text += charFromCode(c);\n }\n }\n\n private sPIEnding(): void {\n const c = this.getCode();\n if (c === GREATER) {\n // PI done, we don't emit PI events\n this.text = \"\";\n this.state = S_TEXT;\n } else if (c === QUESTION) {\n this.text += \"?\";\n } else {\n this.text += \"?\" + charFromCode(c);\n this.state = S_PI;\n }\n }\n\n private sDoctype(): void {\n const c = this.getCode();\n if (c === -1) {\n return;\n }\n\n if (c === GREATER) {\n // DOCTYPE done\n this.text = \"\";\n this.state = S_TEXT;\n } else if (isQuote(c)) {\n this.q = c;\n this.state = S_DOCTYPE_QUOTE;\n } else if (c === OPEN_BRACKET) {\n this.state = S_DOCTYPE_DTD;\n } else {\n this.text += charFromCode(c);\n }\n }\n\n private sDoctypeQuote(): void {\n const c = this.getCode();\n if (c === -1) {\n return;\n }\n\n if (c === this.q) {\n this.q = null;\n this.state = S_DOCTYPE;\n } else {\n this.text += charFromCode(c);\n }\n }\n\n private sDoctypeDTD(): void {\n const c = this.getCode();\n if (c === -1) {\n return;\n }\n\n if (c === CLOSE_BRACKET) {\n this.state = S_DOCTYPE;\n } else if (isQuote(c)) {\n this.q = c;\n this.state = S_DOCTYPE_DTD_QUOTED;\n }\n }\n\n private sDoctypeDTDQuoted(): void {\n const c = this.getCode();\n if (c === -1) {\n return;\n }\n\n if (c === this.q) {\n this.q = null;\n this.state = S_DOCTYPE_DTD;\n }\n }\n\n private sEntity(): void {\n const c = this.getCode();\n if (c === -1) {\n return;\n }\n\n if (c === SEMICOLON) {\n // Entity complete\n const entity = this.entity;\n let resolved: string;\n\n if (entity === \"\") {\n this.fail(\"empty entity\");\n resolved = \"&;\";\n } else {\n resolved = this.parseEntity(entity);\n }\n\n this.text += resolved;\n this.state = this.entityReturnState;\n this.entity = \"\";\n } else if (isNameChar(c) || c === HASH) {\n this.entity += charFromCode(c);\n } else {\n this.fail(\"invalid entity character\");\n this.text += \"&\" + this.entity + charFromCode(c);\n this.state = this.entityReturnState;\n this.entity = \"\";\n }\n }\n\n // Entity resolution\n private parseEntity(entity: string): string {\n if (entity[0] !== \"#\") {\n // Named entity\n const resolved = this.ENTITIES[entity];\n if (resolved !== undefined) {\n return resolved;\n }\n this.fail(\"undefined entity: \" + entity);\n return \"&\" + entity + \";\";\n }\n\n // Numeric entity\n let num: number;\n if (entity[1] === \"x\" || entity[1] === \"X\") {\n // Hexadecimal\n num = parseInt(entity.slice(2), 16);\n } else {\n // Decimal\n num = parseInt(entity.slice(1), 10);\n }\n\n if (isNaN(num) || !isChar10(num)) {\n this.fail(\"invalid character entity\");\n return \"&\" + entity + \";\";\n }\n\n return String.fromCodePoint(num);\n }\n\n // Helper to skip whitespace\n private skipSpaces(): number {\n while (true) {\n const c = this.getCode();\n if (c === -1 || !isS(c)) {\n return c;\n }\n }\n }\n\n // Tag handling\n private openTag(): void {\n const tag = this.tag!;\n tag.isSelfClosing = false;\n\n // Copy attributes from list to object\n for (const { name, value } of this.attribList) {\n tag.attributes[name] = value;\n }\n this.attribList = [];\n\n this.openTagHandler?.(tag);\n this.tags.push(tag);\n this.name = \"\";\n this.state = S_TEXT;\n }\n\n private openSelfClosingTag(): void {\n const tag = this.tag!;\n tag.isSelfClosing = true;\n\n // Copy attributes from list to object\n for (const { name, value } of this.attribList) {\n tag.attributes[name] = value;\n }\n this.attribList = [];\n\n this.openTagHandler?.(tag);\n this.closeTagHandler?.(tag);\n\n if (this.tags.length === 0) {\n this.closedRoot = true;\n }\n this.name = \"\";\n this.state = S_TEXT;\n }\n\n private closeTag(): void {\n const { tags, name } = this;\n this.state = S_TEXT;\n this.name = \"\";\n\n if (name === \"\") {\n this.fail(\"empty close tag\");\n this.text += \"</>\";\n return;\n }\n\n // Find matching open tag\n let found = false;\n for (let i = tags.length - 1; i >= 0; i--) {\n const tag = tags[i];\n if (tag.name === name) {\n // Pop all tags including the matching one\n while (tags.length > i) {\n const t = tags.pop()!;\n this.closeTagHandler?.(t);\n if (tags.length > i) {\n this.fail(\"unclosed tag: \" + t.name);\n }\n }\n found = true;\n break;\n }\n }\n\n if (!found) {\n this.fail(\"unmatched close tag: \" + name);\n this.text += \"</\" + name + \">\";\n }\n\n if (tags.length === 0) {\n this.closedRoot = true;\n }\n }\n\n // End parsing\n private end(): this {\n if (!this.sawRoot) {\n this.fail(\"document must contain a root element\");\n }\n\n while (this.tags.length > 0) {\n const tag = this.tags.pop()!;\n this.fail(\"unclosed tag: \" + tag.name);\n }\n\n if (this.text.length > 0 && this.textHandler) {\n this.textHandler(this.text);\n this.text = \"\";\n }\n\n this._closed = true;\n this._init();\n return this;\n }\n}\n\n// ============================================================================\n// parseSax generator function\n// ============================================================================\n\nasync function* parseSax(iterable: any): AsyncGenerator<SaxEvent[]> {\n const parser = new SaxesParser({\n xmlns: false,\n position: true // Keep position for error messages\n });\n\n let error: Error | undefined;\n parser.on(\"error\", (err: Error) => {\n error = err;\n });\n\n let events: SaxEvent[] = [];\n parser.on(\"opentag\", (value: any) => events.push({ eventType: \"opentag\", value }));\n parser.on(\"text\", (value: any) => events.push({ eventType: \"text\", value }));\n parser.on(\"closetag\", (value: any) => events.push({ eventType: \"closetag\", value }));\n\n for await (const chunk of iterable) {\n const chunkStr = bufferToString(chunk);\n\n parser.write(chunkStr);\n if (error) {\n throw error;\n }\n yield events;\n events = [];\n }\n\n parser.close();\n if (error) {\n throw error;\n }\n if (events.length > 0) {\n yield events;\n }\n}\n\nexport { parseSax };\n","import { parseSax } from \"@excel/utils/parse-sax\";\nimport { XmlStream } from \"@excel/utils/xml-stream\";\n\n/* 'virtual' methods used as a form of documentation */\n\ninterface ParseEvent {\n eventType: string;\n value: any;\n}\n\n// Base class for Xforms\nclass BaseXform {\n declare public map?: { [key: string]: any };\n declare public model?: any;\n\n // ============================================================\n // Virtual Interface\n prepare(_model?: any, _options?: any): void {\n // optional preparation (mutation) of model so it is ready for write\n }\n\n render(_xmlStream?: XmlStream, _model?: any): void {\n // convert model to xml\n }\n\n parseOpen(_node: any): void {\n // XML node opened\n }\n\n parseText(_text: string): void {\n // chunk of text encountered for current node\n }\n\n parseClose(_name: string): boolean {\n // XML node closed\n return false;\n }\n\n reconcile(_model: any, _options?: any): void {\n // optional post-parse step (opposite to prepare)\n }\n\n // ============================================================\n reset(): void {\n // to make sure parses don't bleed to next iteration\n (this as any).model = null;\n\n // if we have a map - reset them too\n if (this.map) {\n Object.values(this.map).forEach(xform => {\n if (xform instanceof BaseXform) {\n xform.reset();\n } else if (xform.xform) {\n xform.xform.reset();\n }\n });\n }\n }\n\n mergeModel(obj: any): void {\n // set obj's props to this.model\n (this as any).model = Object.assign((this as any).model || {}, obj);\n }\n\n async parse(saxParser: AsyncIterable<ParseEvent[]>): Promise<any> {\n // IMPORTANT:\n // Do not return early once parsing is \"done\".\n // In true streaming scenarios, `parseSax(stream)` is backed by a Node.js\n // Readable async iterator. Returning early would close the iterator, which\n // destroys the underlying stream and can surface as AbortError (ABORT_ERR).\n let done = false;\n let finalModel: any;\n\n for await (const events of saxParser) {\n if (done) {\n continue;\n }\n for (const { eventType, value } of events) {\n if (eventType === \"opentag\") {\n this.parseOpen(value);\n } else if (eventType === \"text\") {\n this.parseText(value);\n } else if (eventType === \"closetag\") {\n if (!this.parseClose(value.name)) {\n done = true;\n finalModel = (this as any).model;\n break;\n }\n }\n }\n }\n\n return done ? finalModel : (this as any).model;\n }\n\n async parseStream(stream: any): Promise<any> {\n return this.parse(parseSax(stream));\n }\n\n get xml(): string {\n // convenience function to get the xml of this.model\n // useful for manager types that are built during the prepare phase\n return this.toXml((this as any).model);\n }\n\n toXml(model: any): string {\n const xmlStream = new XmlStream();\n this.render(xmlStream, model);\n return xmlStream.xml;\n }\n\n // ============================================================\n // Useful Utilities\n static toAttribute(value: any, dflt?: any, always: boolean = false): string | undefined {\n if (value === undefined) {\n if (always) {\n return dflt;\n }\n } else if (always || value !== dflt) {\n return value.toString();\n }\n return undefined;\n }\n\n static toStringAttribute(value: any, dflt?: any, always: boolean = false): string | undefined {\n return BaseXform.toAttribute(value, dflt, always);\n }\n\n static toStringValue(attr: any, dflt?: any): any {\n return attr === undefined ? dflt : attr;\n }\n\n static toBoolAttribute(value: any, dflt?: any, always: boolean = false): string | undefined {\n if (value === undefined) {\n if (always) {\n return dflt;\n }\n } else if (always || value !== dflt) {\n return value ? \"1\" : \"0\";\n }\n return undefined;\n }\n\n static toBoolValue(attr: any, dflt?: any): boolean {\n return attr === undefined ? dflt : attr === \"1\";\n }\n\n static toIntAttribute(value: any, dflt?: any, always: boolean = false): string | undefined {\n return BaseXform.toAttribute(value, dflt, always);\n }\n\n static toIntValue(attr: any, dflt?: any): number {\n return attr === undefined ? dflt : parseInt(attr, 10);\n }\n\n static toFloatAttribute(value: any, dflt?: any, always: boolean = false): string | undefined {\n return BaseXform.toAttribute(value, dflt, always);\n }\n\n static toFloatValue(attr: any, dflt?: any): number {\n return attr === undefined ? dflt : parseFloat(attr);\n }\n}\n\nexport { BaseXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { XmlStream } from \"@excel/utils/xml-stream\";\n\ninterface StaticModel {\n tag: string;\n $?: any;\n c?: StaticModel[];\n t?: string;\n}\n\n// const model = {\n// tag: 'name',\n// $: {attr: 'value'},\n// c: [\n// { tag: 'child' }\n// ],\n// t: 'some text'\n// };\n\nfunction build(xmlStream: any, model: StaticModel): void {\n xmlStream.openNode(model.tag, model.$);\n if (model.c) {\n model.c.forEach(child => {\n build(xmlStream, child);\n });\n }\n if (model.t) {\n xmlStream.writeText(model.t);\n }\n xmlStream.closeNode();\n}\n\nclass StaticXform extends BaseXform {\n declare private _model: StaticModel;\n declare private _xml?: string;\n\n constructor(model: StaticModel) {\n super();\n\n // This class is an optimisation for static (unimportant and unchanging) xml\n // It is stateless - apart from its static model and so can be used as a singleton\n // Being stateless - it will only track entry to and exit from it's root xml tag during parsing and nothing else\n // Known limitations:\n // since stateless - parseOpen always returns true. Parent xform must know when to start using this xform\n // if the root tag is recursive, the parsing will behave unpredictably\n this._model = model;\n }\n\n render(xmlStream: any): void {\n if (!this._xml) {\n const stream = new XmlStream();\n build(stream, this._model);\n this._xml = stream.xml;\n }\n xmlStream.writeXml(this._xml);\n }\n\n parseOpen(): boolean {\n return true;\n }\n\n parseText(): void {}\n\n parseClose(name: string): boolean {\n switch (name) {\n case this._model.tag:\n return false;\n default:\n return true;\n }\n }\n}\n\nexport { StaticXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface ListXformOptions {\n tag: string;\n always?: boolean;\n count?: boolean;\n empty?: boolean;\n $count?: string;\n $?: any;\n childXform: any;\n maxItems?: number;\n}\n\nclass ListXform extends BaseXform {\n declare protected tag: string;\n declare protected always: boolean;\n declare protected count?: boolean;\n declare protected empty?: boolean;\n declare public $count: string;\n declare public $?: any;\n declare protected childXform: any;\n declare protected maxItems?: number;\n declare public parser: any;\n declare public model: any[];\n\n constructor(options: ListXformOptions) {\n super();\n\n this.tag = options.tag;\n this.always = !!options.always;\n this.count = options.count;\n this.empty = options.empty;\n this.$count = options.$count || \"count\";\n this.$ = options.$;\n this.childXform = options.childXform;\n this.maxItems = options.maxItems;\n }\n\n prepare(model: any[], options: any): void {\n const { childXform } = this;\n if (model) {\n model.forEach((childModel, index) => {\n options.index = index;\n childXform.prepare(childModel, options);\n });\n }\n }\n\n render(xmlStream: any, model?: any[]): void {\n if (this.always || (model && model.length)) {\n xmlStream.openNode(this.tag, this.$);\n if (this.count) {\n xmlStream.addAttribute(this.$count, (model && model.length) || 0);\n }\n\n const { childXform } = this;\n (model || []).forEach((childModel, index) => {\n childXform.render(xmlStream, childModel, index);\n });\n\n xmlStream.closeNode();\n } else if (this.empty) {\n xmlStream.leafNode(this.tag);\n }\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case this.tag:\n this.model = [];\n return true;\n default:\n if (this.childXform.parseOpen(node)) {\n this.parser = this.childXform;\n return true;\n }\n return false;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.model.push(this.parser.model);\n this.parser = undefined;\n\n if (this.maxItems && this.model.length > this.maxItems) {\n throw new Error(`Max ${this.childXform.tag} count (${this.maxItems}) exceeded`);\n }\n }\n return true;\n }\n\n return false;\n }\n\n reconcile(model: any[], options: any): void {\n if (model) {\n const { childXform } = this;\n model.forEach((childModel: any) => {\n childXform.reconcile(childModel, options);\n });\n }\n }\n\n reset(): void {\n super.reset();\n if (this.childXform) {\n this.childXform.reset();\n }\n }\n}\n\nexport { ListXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface ColorModel {\n argb?: string;\n theme?: number;\n tint?: number;\n indexed?: number;\n}\n\n// Color encapsulates translation from color model to/from xlsx\nclass ColorXform extends BaseXform {\n declare private name: string;\n\n constructor(name?: string) {\n super();\n\n // this.name controls the xm node name\n this.name = name || \"color\";\n }\n\n get tag(): string {\n return this.name;\n }\n\n render(xmlStream: any, model?: ColorModel): boolean {\n if (model) {\n xmlStream.openNode(this.name);\n if (model.argb) {\n xmlStream.addAttribute(\"rgb\", model.argb);\n } else if (model.theme !== undefined) {\n xmlStream.addAttribute(\"theme\", model.theme);\n if (model.tint !== undefined) {\n xmlStream.addAttribute(\"tint\", model.tint);\n }\n } else if (model.indexed !== undefined) {\n xmlStream.addAttribute(\"indexed\", model.indexed);\n } else {\n xmlStream.addAttribute(\"auto\", \"1\");\n }\n xmlStream.closeNode();\n return true;\n }\n return false;\n }\n\n parseOpen(node: any): boolean {\n if (node.name === this.name) {\n if (node.attributes.rgb) {\n this.model = { argb: node.attributes.rgb };\n } else if (node.attributes.theme) {\n this.model = { theme: parseInt(node.attributes.theme, 10) };\n if (node.attributes.tint) {\n this.model.tint = parseFloat(node.attributes.tint);\n }\n } else if (node.attributes.indexed) {\n this.model = { indexed: parseInt(node.attributes.indexed, 10) };\n } else {\n this.model = undefined;\n }\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { ColorXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface BooleanXformOptions {\n tag: string;\n attr: string;\n}\n\nclass BooleanXform extends BaseXform {\n declare private tag: string;\n declare private attr: string;\n\n constructor(options: BooleanXformOptions) {\n super();\n\n this.tag = options.tag;\n this.attr = options.attr;\n }\n\n render(xmlStream: any, model?: boolean): void {\n if (model) {\n xmlStream.openNode(this.tag);\n xmlStream.closeNode();\n }\n }\n\n parseOpen(node: any): void {\n if (node.name === this.tag) {\n this.model = true;\n }\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { BooleanXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface IntegerXformOptions {\n tag: string;\n attr?: string;\n attrs?: any;\n zero?: boolean;\n}\n\nclass IntegerXform extends BaseXform {\n declare private tag: string;\n declare private attr?: string;\n declare private attrs?: any;\n declare private zero?: boolean;\n declare private text: string[];\n\n constructor(options: IntegerXformOptions) {\n super();\n\n this.tag = options.tag;\n this.attr = options.attr;\n this.attrs = options.attrs;\n\n // option to render zero\n this.zero = options.zero;\n this.text = [];\n }\n\n render(xmlStream: any, model?: number): void {\n // int is different to float in that zero is not rendered\n if (model || this.zero) {\n xmlStream.openNode(this.tag);\n if (this.attrs) {\n xmlStream.addAttributes(this.attrs);\n }\n if (this.attr) {\n xmlStream.addAttribute(this.attr, model);\n } else {\n xmlStream.writeText(model);\n }\n xmlStream.closeNode();\n }\n }\n\n parseOpen(node: any): boolean {\n if (node.name === this.tag) {\n if (this.attr) {\n this.model = parseInt(node.attributes[this.attr], 10);\n } else {\n this.text = [];\n }\n return true;\n }\n return false;\n }\n\n parseText(text: string): void {\n if (!this.attr) {\n this.text.push(text);\n }\n }\n\n parseClose(): boolean {\n if (!this.attr) {\n this.model = parseInt(this.text.join(\"\") || \"0\", 10);\n }\n return false;\n }\n}\n\nexport { IntegerXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface StringXformOptions {\n tag: string;\n attr?: string;\n attrs?: any;\n}\n\nclass StringXform extends BaseXform {\n declare private tag: string;\n declare private attr?: string;\n declare private attrs?: any;\n declare private text: string[];\n\n constructor(options: StringXformOptions) {\n super();\n\n this.tag = options.tag;\n this.attr = options.attr;\n this.attrs = options.attrs;\n this.text = [];\n }\n\n render(xmlStream: any, model?: string): void {\n if (model !== undefined) {\n xmlStream.openNode(this.tag);\n if (this.attrs) {\n xmlStream.addAttributes(this.attrs);\n }\n if (this.attr) {\n xmlStream.addAttribute(this.attr, model);\n } else {\n xmlStream.writeText(model);\n }\n xmlStream.closeNode();\n }\n }\n\n parseOpen(node: any): void {\n if (node.name === this.tag) {\n if (this.attr) {\n this.model = node.attributes[this.attr];\n } else {\n this.text = [];\n }\n }\n }\n\n parseText(text: string): void {\n if (!this.attr) {\n this.text.push(text);\n }\n }\n\n parseClose(): boolean {\n if (!this.attr) {\n this.model = this.text.join(\"\");\n }\n return false;\n }\n}\n\nexport { StringXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ntype UnderlineType = boolean | \"single\" | \"double\" | \"singleAccounting\" | \"doubleAccounting\";\n\nclass UnderlineXform extends BaseXform {\n static Attributes: { [key: string]: any } = {\n single: {},\n double: { val: \"double\" },\n singleAccounting: { val: \"singleAccounting\" },\n doubleAccounting: { val: \"doubleAccounting\" }\n };\n\n constructor(model?: UnderlineType) {\n super();\n this.model = model;\n }\n\n get tag(): string {\n return \"u\";\n }\n\n render(xmlStream: any, model?: UnderlineType): void {\n model = model || this.model;\n\n if (model === true) {\n xmlStream.leafNode(\"u\");\n } else {\n const attr = UnderlineXform.Attributes[model as string];\n if (attr) {\n xmlStream.leafNode(\"u\", attr);\n }\n }\n }\n\n parseOpen(node: any): void {\n if (node.name === \"u\") {\n this.model = node.attributes.val || true;\n }\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { UnderlineXform };\n","import { ColorXform } from \"@excel/xlsx/xform/style/color-xform\";\nimport { BooleanXform } from \"@excel/xlsx/xform/simple/boolean-xform\";\nimport { IntegerXform } from \"@excel/xlsx/xform/simple/integer-xform\";\nimport { StringXform } from \"@excel/xlsx/xform/simple/string-xform\";\nimport { UnderlineXform } from \"@excel/xlsx/xform/style/underline-xform\";\nimport { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface FontModel {\n bold?: boolean;\n italic?: boolean;\n underline?: boolean | string;\n charset?: number;\n color?: any;\n condense?: boolean;\n extend?: boolean;\n family?: number;\n outline?: boolean;\n vertAlign?: string;\n scheme?: string;\n shadow?: boolean;\n strike?: boolean;\n size?: number;\n name?: string;\n}\n\ninterface FontOptions {\n tagName: string;\n fontNameTag: string;\n}\n\n// Font encapsulates translation from font model to xlsx\nclass FontXform extends BaseXform {\n declare private options: FontOptions;\n declare public parser: any;\n declare private renderOrder: string[];\n\n constructor(options?: FontOptions) {\n super();\n\n this.options = options || FontXform.OPTIONS;\n\n // Define properties in render order (Excel's expected order)\n const fontProperties = [\n { tag: \"b\", prop: \"bold\", xform: new BooleanXform({ tag: \"b\", attr: \"val\" }) },\n { tag: \"i\", prop: \"italic\", xform: new BooleanXform({ tag: \"i\", attr: \"val\" }) },\n { tag: \"u\", prop: \"underline\", xform: new UnderlineXform() },\n { tag: \"strike\", prop: \"strike\", xform: new BooleanXform({ tag: \"strike\", attr: \"val\" }) },\n {\n tag: \"condense\",\n prop: \"condense\",\n xform: new BooleanXform({ tag: \"condense\", attr: \"val\" })\n },\n { tag: \"extend\", prop: \"extend\", xform: new BooleanXform({ tag: \"extend\", attr: \"val\" }) },\n { tag: \"outline\", prop: \"outline\", xform: new BooleanXform({ tag: \"outline\", attr: \"val\" }) },\n { tag: \"shadow\", prop: \"shadow\", xform: new BooleanXform({ tag: \"shadow\", attr: \"val\" }) },\n { tag: \"sz\", prop: \"size\", xform: new IntegerXform({ tag: \"sz\", attr: \"val\" }) },\n { tag: \"color\", prop: \"color\", xform: new ColorXform() },\n {\n tag: this.options.fontNameTag,\n prop: \"name\",\n xform: new StringXform({ tag: this.options.fontNameTag, attr: \"val\" })\n },\n { tag: \"family\", prop: \"family\", xform: new IntegerXform({ tag: \"family\", attr: \"val\" }) },\n { tag: \"scheme\", prop: \"scheme\", xform: new StringXform({ tag: \"scheme\", attr: \"val\" }) },\n { tag: \"charset\", prop: \"charset\", xform: new IntegerXform({ tag: \"charset\", attr: \"val\" }) },\n {\n tag: \"vertAlign\",\n prop: \"vertAlign\",\n xform: new StringXform({ tag: \"vertAlign\", attr: \"val\" })\n }\n ];\n\n // Build map and renderOrder from single source of truth\n this.map = Object.fromEntries(\n fontProperties.map(p => [p.tag, { prop: p.prop, xform: p.xform }])\n );\n this.renderOrder = fontProperties.map(p => p.tag);\n }\n\n get tag(): string {\n return this.options.tagName;\n }\n\n render(xmlStream: any, model: FontModel): void {\n const { map, renderOrder } = this;\n\n xmlStream.openNode(this.options.tagName);\n renderOrder.forEach(tag => {\n map[tag].xform.render(xmlStream, model[map[tag].prop as keyof FontModel]);\n });\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n if (this.map[node.name]) {\n this.parser = this.map[node.name].xform;\n return this.parser.parseOpen(node);\n }\n switch (node.name) {\n case this.options.tagName:\n this.model = {};\n return true;\n default:\n return false;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser && !this.parser.parseClose(name)) {\n const item = this.map[name];\n if (this.parser.model) {\n this.model[item.prop] = this.parser.model;\n }\n this.parser = undefined;\n return true;\n }\n switch (name) {\n case this.options.tagName:\n return false;\n default:\n return true;\n }\n }\n\n static OPTIONS: FontOptions = {\n tagName: \"font\",\n fontNameTag: \"name\"\n };\n}\n\nexport { FontXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { ColorXform } from \"@excel/xlsx/xform/style/color-xform\";\n\ninterface StopModel {\n position: number;\n color: any;\n}\n\ninterface PatternFillModel {\n type: \"pattern\";\n pattern: string;\n fgColor?: any;\n bgColor?: any;\n}\n\ninterface GradientFillModel {\n type: \"gradient\";\n gradient: \"angle\" | \"path\";\n degree?: number;\n center?: {\n left: number;\n top: number;\n right?: number;\n bottom?: number;\n };\n stops: StopModel[];\n}\n\ntype FillModel = PatternFillModel | GradientFillModel;\n\nclass StopXform extends BaseXform {\n declare public map: { color: ColorXform };\n declare public parser: any;\n\n constructor() {\n super();\n\n this.map = {\n color: new ColorXform()\n };\n }\n\n get tag(): string {\n return \"stop\";\n }\n\n render(xmlStream: any, model: StopModel): void {\n xmlStream.openNode(\"stop\");\n xmlStream.addAttribute(\"position\", model.position);\n this.map.color.render(xmlStream, model.color);\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"stop\":\n this.model = {\n position: parseFloat(node.attributes.position)\n };\n return true;\n case \"color\":\n this.parser = this.map.color;\n this.parser.parseOpen(node);\n return true;\n default:\n return false;\n }\n }\n\n parseText(): void {}\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.model.color = this.parser.model;\n this.parser = undefined;\n }\n return true;\n }\n return false;\n }\n}\n\nclass PatternFillXform extends BaseXform {\n declare public map: { fgColor: ColorXform; bgColor: ColorXform };\n declare public parser: any;\n\n constructor() {\n super();\n\n this.map = {\n fgColor: new ColorXform(\"fgColor\"),\n bgColor: new ColorXform(\"bgColor\")\n };\n }\n\n get name(): string {\n return \"pattern\";\n }\n\n get tag(): string {\n return \"patternFill\";\n }\n\n render(xmlStream: any, model: PatternFillModel): void {\n xmlStream.openNode(\"patternFill\");\n xmlStream.addAttribute(\"patternType\", model.pattern);\n if (model.fgColor) {\n this.map.fgColor.render(xmlStream, model.fgColor);\n }\n if (model.bgColor) {\n this.map.bgColor.render(xmlStream, model.bgColor);\n }\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"patternFill\":\n this.model = {\n type: \"pattern\",\n pattern: node.attributes.patternType\n };\n return true;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n return false;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n if (this.parser.model) {\n this.model[name] = this.parser.model;\n }\n this.parser = undefined;\n }\n return true;\n }\n return false;\n }\n}\n\nclass GradientFillXform extends BaseXform {\n declare public map: { stop: StopXform };\n declare public parser: any;\n\n constructor() {\n super();\n\n this.map = {\n stop: new StopXform()\n };\n }\n\n get name(): string {\n return \"gradient\";\n }\n\n get tag(): string {\n return \"gradientFill\";\n }\n\n render(xmlStream: any, model: GradientFillModel): void {\n xmlStream.openNode(\"gradientFill\");\n switch (model.gradient) {\n case \"angle\":\n xmlStream.addAttribute(\"degree\", model.degree);\n break;\n case \"path\":\n xmlStream.addAttribute(\"type\", \"path\");\n if (model.center!.left) {\n xmlStream.addAttribute(\"left\", model.center!.left);\n if (model.center!.right === undefined) {\n xmlStream.addAttribute(\"right\", model.center!.left);\n }\n }\n if (model.center!.right) {\n xmlStream.addAttribute(\"right\", model.center!.right);\n }\n if (model.center!.top) {\n xmlStream.addAttribute(\"top\", model.center!.top);\n if (model.center!.bottom === undefined) {\n xmlStream.addAttribute(\"bottom\", model.center!.top);\n }\n }\n if (model.center!.bottom) {\n xmlStream.addAttribute(\"bottom\", model.center!.bottom);\n }\n break;\n\n default:\n break;\n }\n\n const stopXform = this.map.stop;\n model.stops.forEach(stopModel => {\n stopXform.render(xmlStream, stopModel);\n });\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"gradientFill\": {\n const model: any = (this.model = {\n stops: []\n });\n if (node.attributes.degree) {\n model.gradient = \"angle\";\n model.degree = parseInt(node.attributes.degree, 10);\n } else if (node.attributes.type === \"path\") {\n model.gradient = \"path\";\n model.center = {\n left: node.attributes.left ? parseFloat(node.attributes.left) : 0,\n top: node.attributes.top ? parseFloat(node.attributes.top) : 0\n };\n if (node.attributes.right !== node.attributes.left) {\n model.center.right = node.attributes.right ? parseFloat(node.attributes.right) : 0;\n }\n if (node.attributes.bottom !== node.attributes.top) {\n model.center.bottom = node.attributes.bottom ? parseFloat(node.attributes.bottom) : 0;\n }\n }\n return true;\n }\n\n case \"stop\":\n this.parser = this.map.stop;\n this.parser.parseOpen(node);\n return true;\n\n default:\n return false;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.model.stops.push(this.parser.model);\n this.parser = undefined;\n }\n return true;\n }\n return false;\n }\n}\n\n// Fill encapsulates translation from fill model to/from xlsx\nclass FillXform extends BaseXform {\n declare public map: { patternFill: PatternFillXform; gradientFill: GradientFillXform };\n declare public parser: any;\n\n constructor() {\n super();\n\n this.map = {\n patternFill: new PatternFillXform(),\n gradientFill: new GradientFillXform()\n };\n }\n\n get tag(): string {\n return \"fill\";\n }\n\n render(xmlStream: any, model: FillModel): void {\n xmlStream.addRollback();\n xmlStream.openNode(\"fill\");\n switch (model.type) {\n case \"pattern\":\n this.map.patternFill.render(xmlStream, model);\n break;\n case \"gradient\":\n this.map.gradientFill.render(xmlStream, model);\n break;\n default:\n xmlStream.rollback();\n return;\n }\n xmlStream.closeNode();\n xmlStream.commit();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"fill\":\n this.model = {};\n return true;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n return false;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.model = this.parser.model;\n this.model.type = this.parser.name;\n this.parser = undefined;\n }\n return true;\n }\n return false;\n }\n\n validStyle(value: string): boolean {\n return FillXform.validPatternValues[value];\n }\n\n static validPatternValues: { [key: string]: boolean } = [\n \"none\",\n \"solid\",\n \"darkVertical\",\n \"darkGray\",\n \"mediumGray\",\n \"lightGray\",\n \"gray125\",\n \"gray0625\",\n \"darkHorizontal\",\n \"darkVertical\",\n \"darkDown\",\n \"darkUp\",\n \"darkGrid\",\n \"darkTrellis\",\n \"lightHorizontal\",\n \"lightVertical\",\n \"lightDown\",\n \"lightUp\",\n \"lightGrid\",\n \"lightTrellis\",\n \"lightGrid\"\n ].reduce((p: { [key: string]: boolean }, v: string) => {\n p[v] = true;\n return p;\n }, {});\n\n static StopXform = StopXform;\n static PatternFillXform = PatternFillXform;\n static GradientFillXform = GradientFillXform;\n}\n\nexport { FillXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { parseBoolean } from \"@utils/utils\";\nimport { ColorXform } from \"@excel/xlsx/xform/style/color-xform\";\n\ninterface EdgeModel {\n style?: string;\n color?: any;\n}\n\ninterface BorderModel {\n top?: EdgeModel;\n left?: EdgeModel;\n bottom?: EdgeModel;\n right?: EdgeModel;\n diagonal?: EdgeModel & { up?: boolean; down?: boolean };\n color?: any;\n}\n\nclass EdgeXform extends BaseXform {\n declare private name: string;\n declare public map: { color: ColorXform };\n declare private defaultColor: any;\n declare public parser: any;\n\n constructor(name: string) {\n super();\n\n this.name = name;\n this.map = {\n color: new ColorXform()\n };\n }\n\n get tag(): string {\n return this.name;\n }\n\n render(xmlStream: any, model?: EdgeModel, defaultColor?: any): void {\n const color = (model && model.color) || defaultColor || this.defaultColor;\n xmlStream.openNode(this.name);\n if (model && model.style) {\n xmlStream.addAttribute(\"style\", model.style);\n if (color) {\n this.map.color.render(xmlStream, color);\n }\n }\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case this.name: {\n const { style } = node.attributes;\n if (style) {\n this.model = {\n style\n };\n } else {\n this.model = undefined;\n }\n return true;\n }\n case \"color\":\n this.parser = this.map.color;\n this.parser.parseOpen(node);\n return true;\n default:\n return false;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n\n if (name === this.name) {\n if (this.map.color.model) {\n if (!this.model) {\n this.model = {};\n }\n this.model.color = this.map.color.model;\n }\n }\n\n return false;\n }\n\n validStyle(value: string): boolean {\n return EdgeXform.validStyleValues[value];\n }\n\n static validStyleValues: { [key: string]: boolean } = [\n \"thin\",\n \"dashed\",\n \"dotted\",\n \"dashDot\",\n \"hair\",\n \"dashDotDot\",\n \"slantDashDot\",\n \"mediumDashed\",\n \"mediumDashDotDot\",\n \"mediumDashDot\",\n \"medium\",\n \"double\",\n \"thick\"\n ].reduce((p: { [key: string]: boolean }, v: string) => {\n p[v] = true;\n return p;\n }, {});\n}\n\n// Border encapsulates translation from border model to/from xlsx\nclass BorderXform extends BaseXform {\n declare public map: { [key: string]: EdgeXform };\n declare public parser: any;\n declare private diagonalUp: boolean | undefined;\n declare private diagonalDown: boolean | undefined;\n\n constructor() {\n super();\n\n this.map = {\n top: new EdgeXform(\"top\"),\n left: new EdgeXform(\"left\"),\n bottom: new EdgeXform(\"bottom\"),\n right: new EdgeXform(\"right\"),\n diagonal: new EdgeXform(\"diagonal\")\n };\n }\n\n render(xmlStream: any, model: BorderModel): void {\n const { color } = model;\n xmlStream.openNode(\"border\");\n if (model.diagonal && model.diagonal.style) {\n if (model.diagonal.up) {\n xmlStream.addAttribute(\"diagonalUp\", \"1\");\n }\n if (model.diagonal.down) {\n xmlStream.addAttribute(\"diagonalDown\", \"1\");\n }\n }\n const add = (edgeModel: EdgeModel | undefined, edgeXform: EdgeXform): void => {\n let edge = edgeModel;\n if (edge && !edge.color && model.color) {\n // don't mess with incoming models\n edge = {\n ...edge,\n color: model.color\n };\n }\n edgeXform.render(xmlStream, edge, color);\n };\n add(model.left, this.map.left);\n add(model.right, this.map.right);\n add(model.top, this.map.top);\n add(model.bottom, this.map.bottom);\n add(model.diagonal, this.map.diagonal);\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"border\":\n this.reset();\n this.diagonalUp = parseBoolean(node.attributes.diagonalUp);\n this.diagonalDown = parseBoolean(node.attributes.diagonalDown);\n return true;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n return false;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n if (name === \"border\") {\n const model: any = (this.model = {});\n const add = (key: string, edgeModel: any, extensions?: any): void => {\n if (edgeModel) {\n if (extensions) {\n Object.assign(edgeModel, extensions);\n }\n model[key] = edgeModel;\n }\n };\n add(\"left\", this.map.left.model);\n add(\"right\", this.map.right.model);\n add(\"top\", this.map.top.model);\n add(\"bottom\", this.map.bottom.model);\n add(\"diagonal\", this.map.diagonal.model, { up: this.diagonalUp, down: this.diagonalDown });\n }\n return false;\n }\n}\n\nexport { BorderXform };\n","interface NumFormat {\n f?: string;\n \"zh-tw\"?: string;\n \"zh-cn\"?: string;\n \"ja-jp\"?: string;\n \"ko-kr\"?: string;\n \"th-th\"?: string;\n}\n\nconst defaultNumFormats: { [key: number]: NumFormat } = {\n 0: { f: \"General\" },\n 1: { f: \"0\" },\n 2: { f: \"0.00\" },\n 3: { f: \"#,##0\" },\n 4: { f: \"#,##0.00\" },\n 9: { f: \"0%\" },\n 10: { f: \"0.00%\" },\n 11: { f: \"0.00E+00\" },\n 12: { f: \"# ?/?\" },\n 13: { f: \"# ??/??\" },\n 14: { f: \"mm-dd-yy\" },\n 15: { f: \"d-mmm-yy\" },\n 16: { f: \"d-mmm\" },\n 17: { f: \"mmm-yy\" },\n 18: { f: \"h:mm AM/PM\" },\n 19: { f: \"h:mm:ss AM/PM\" },\n 20: { f: \"h:mm\" },\n 21: { f: \"h:mm:ss\" },\n 22: { f: 'm/d/yy \"h\":mm' },\n\n 27: {\n \"zh-tw\": \"[$-404]e/m/d\",\n \"zh-cn\": 'yyyy\"年\"m\"月\"',\n \"ja-jp\": \"[$-411]ge.m.d\",\n \"ko-kr\": 'yyyy\"年\" mm\"月\" dd\"日\"'\n },\n 28: {\n \"zh-tw\": '[$-404]e\"年\"m\"月\"d\"日\"',\n \"zh-cn\": 'm\"月\"d\"日\"',\n \"ja-jp\": '[$-411]ggge\"年\"m\"月\"d\"日\"',\n \"ko-kr\": \"mm-dd\"\n },\n 29: {\n \"zh-tw\": '[$-404]e\"年\"m\"月\"d\"日\"',\n \"zh-cn\": 'm\"月\"d\"日\"',\n \"ja-jp\": '[$-411]ggge\"年\"m\"月\"d\"日\"',\n \"ko-kr\": \"mm-dd\"\n },\n 30: { \"zh-tw\": \"m/d/yy \", \"zh-cn\": \"m-d-yy\", \"ja-jp\": \"m/d/yy\", \"ko-kr\": \"mm-dd-yy\" },\n 31: {\n \"zh-tw\": 'yyyy\"年\"m\"月\"d\"日\"',\n \"zh-cn\": 'yyyy\"年\"m\"月\"d\"日\"',\n \"ja-jp\": 'yyyy\"年\"m\"月\"d\"日\"',\n \"ko-kr\": 'yyyy\"년\" mm\"월\" dd\"일\"'\n },\n 32: {\n \"zh-tw\": 'hh\"時\"mm\"分\"',\n \"zh-cn\": 'h\"时\"mm\"分\"',\n \"ja-jp\": 'h\"時\"mm\"分\"',\n \"ko-kr\": 'h\"시\" mm\"분\"'\n },\n 33: {\n \"zh-tw\": 'hh\"時\"mm\"分\"ss\"秒\"',\n \"zh-cn\": 'h\"时\"mm\"分\"ss\"秒\"',\n \"ja-jp\": 'h\"時\"mm\"分\"ss\"秒\"',\n \"ko-kr\": 'h\"시\" mm\"분\" ss\"초\"'\n },\n 34: {\n \"zh-tw\": '上午/下午 hh\"時\"mm\"分\"',\n \"zh-cn\": '上午/下午 h\"时\"mm\"分\"',\n \"ja-jp\": 'yyyy\"年\"m\"月\"',\n \"ko-kr\": \"yyyy-mm-dd\"\n },\n 35: {\n \"zh-tw\": '上午/下午 hh\"時\"mm\"分\"ss\"秒\"',\n \"zh-cn\": '上午/下午 h\"时\"mm\"分\"ss\"秒\"',\n \"ja-jp\": 'm\"月\"d\"日\"',\n \"ko-kr\": \"yyyy-mm-dd\"\n },\n 36: {\n \"zh-tw\": \"[$-404]e/m/d\",\n \"zh-cn\": 'yyyy\"年\"m\"月\"',\n \"ja-jp\": \"[$-411]ge.m.d\",\n \"ko-kr\": 'yyyy\"年\" mm\"月\" dd\"日\"'\n },\n\n 37: { f: \"#,##0 ;(#,##0)\" },\n 38: { f: \"#,##0 ;[Red](#,##0)\" },\n 39: { f: \"#,##0.00 ;(#,##0.00)\" },\n 40: { f: \"#,##0.00 ;[Red](#,##0.00)\" },\n 45: { f: \"mm:ss\" },\n 46: { f: \"[h]:mm:ss\" },\n 47: { f: \"mmss.0\" },\n 48: { f: \"##0.0E+0\" },\n 49: { f: \"@\" },\n\n 50: {\n \"zh-tw\": \"[$-404]e/m/d\",\n \"zh-cn\": 'yyyy\"年\"m\"月\"',\n \"ja-jp\": \"[$-411]ge.m.d\",\n \"ko-kr\": 'yyyy\"年\" mm\"月\" dd\"日\"'\n },\n 51: {\n \"zh-tw\": '[$-404]e\"年\"m\"月\"d\"日\"',\n \"zh-cn\": 'm\"月\"d\"日\"',\n \"ja-jp\": '[$-411]ggge\"年\"m\"月\"d\"日\"',\n \"ko-kr\": \"mm-dd\"\n },\n 52: {\n \"zh-tw\": '上午/下午 hh\"時\"mm\"分\"',\n \"zh-cn\": 'yyyy\"年\"m\"月\"',\n \"ja-jp\": 'yyyy\"年\"m\"月\"',\n \"ko-kr\": \"yyyy-mm-dd\"\n },\n 53: {\n \"zh-tw\": '上午/下午 hh\"時\"mm\"分\"ss\"秒\"',\n \"zh-cn\": 'm\"月\"d\"日\"',\n \"ja-jp\": 'm\"月\"d\"日\"',\n \"ko-kr\": \"yyyy-mm-dd\"\n },\n 54: {\n \"zh-tw\": '[$-404]e\"年\"m\"月\"d\"日\"',\n \"zh-cn\": 'm\"月\"d\"日\"',\n \"ja-jp\": '[$-411]ggge\"年\"m\"月\"d\"日\"',\n \"ko-kr\": \"mm-dd\"\n },\n 55: {\n \"zh-tw\": '上午/下午 hh\"時\"mm\"分\"',\n \"zh-cn\": '上午/下午 h\"时\"mm\"分\"',\n \"ja-jp\": 'yyyy\"年\"m\"月\"',\n \"ko-kr\": \"yyyy-mm-dd\"\n },\n 56: {\n \"zh-tw\": '上午/下午 hh\"時\"mm\"分\"ss\"秒\"',\n \"zh-cn\": '上午/下午 h\"时\"mm\"分\"ss\"秒\"',\n \"ja-jp\": 'm\"月\"d\"日\"',\n \"ko-kr\": \"yyyy-mm-dd\"\n },\n 57: {\n \"zh-tw\": \"[$-404]e/m/d\",\n \"zh-cn\": 'yyyy\"年\"m\"月\"',\n \"ja-jp\": \"[$-411]ge.m.d\",\n \"ko-kr\": 'yyyy\"年\" mm\"月\" dd\"日\"'\n },\n 58: {\n \"zh-tw\": '[$-404]e\"年\"m\"月\"d\"日\"',\n \"zh-cn\": 'm\"月\"d\"日\"',\n \"ja-jp\": '[$-411]ggge\"年\"m\"月\"d\"日\"',\n \"ko-kr\": \"mm-dd\"\n },\n\n 59: { \"th-th\": \"t0\" },\n 60: { \"th-th\": \"t0.00\" },\n 61: { \"th-th\": \"t#,##0\" },\n 62: { \"th-th\": \"t#,##0.00\" },\n 67: { \"th-th\": \"t0%\" },\n 68: { \"th-th\": \"t0.00%\" },\n 69: { \"th-th\": \"t# ?/?\" },\n 70: { \"th-th\": \"t# ??/??\" },\n\n 81: { \"th-th\": \"d/m/bb\" }\n};\n\nexport { defaultNumFormats };\n","import { defaultNumFormats } from \"@excel/xlsx/defaultnumformats\";\nimport { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface NumFmtModel {\n id: number;\n formatCode: string;\n}\n\nfunction hashDefaultFormats(): { [key: string]: number } {\n const hash: { [key: string]: number } = {};\n Object.entries(defaultNumFormats).forEach(([id, dnf]) => {\n if (dnf.f) {\n hash[dnf.f] = parseInt(id, 10);\n }\n // at some point, add the other cultures here...\n });\n return hash;\n}\nconst defaultFmtHash = hashDefaultFormats();\n\n// NumFmt encapsulates translation between number format and xlsx\nclass NumFmtXform extends BaseXform {\n declare private id?: number;\n declare private formatCode?: string;\n\n constructor(id?: number, formatCode?: string) {\n super();\n\n this.id = id;\n this.formatCode = formatCode;\n }\n\n get tag(): string {\n return \"numFmt\";\n }\n\n render(xmlStream: any, model: NumFmtModel): void {\n xmlStream.leafNode(\"numFmt\", { numFmtId: model.id, formatCode: model.formatCode });\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case \"numFmt\":\n this.model = {\n id: parseInt(node.attributes.numFmtId, 10),\n formatCode: node.attributes.formatCode.replace(/[\\\\](.)/g, \"$1\")\n };\n return true;\n default:\n return false;\n }\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n\n static getDefaultFmtId(formatCode: string): number | undefined {\n return defaultFmtHash[formatCode];\n }\n\n static getDefaultFmtCode(numFmtId: number): string | undefined {\n return defaultNumFormats[numFmtId] && defaultNumFormats[numFmtId].f;\n }\n}\n\nexport { NumFmtXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { validInt, parseBoolean } from \"@utils/utils\";\n\nconst Enums = {\n ReadingOrder: {\n LeftToRight: 1,\n RightToLeft: 2\n }\n};\n\ninterface AlignmentModel {\n horizontal?: string;\n vertical?: string;\n wrapText?: boolean;\n shrinkToFit?: boolean;\n indent?: number;\n textRotation?: number | \"vertical\";\n readingOrder?: \"ltr\" | \"rtl\";\n}\n\nconst validation = {\n horizontalValues: [\n \"left\",\n \"center\",\n \"right\",\n \"fill\",\n \"centerContinuous\",\n \"distributed\",\n \"justify\"\n ].reduce((p: { [key: string]: boolean }, v: string) => {\n p[v] = true;\n return p;\n }, {}),\n horizontal(value: string): string | undefined {\n return this.horizontalValues[value] ? value : undefined;\n },\n\n verticalValues: [\"top\", \"middle\", \"bottom\", \"distributed\", \"justify\"].reduce(\n (p: { [key: string]: boolean }, v: string) => {\n p[v] = true;\n return p;\n },\n {}\n ),\n vertical(value: string): string | undefined {\n if (value === \"middle\") {\n return \"center\";\n }\n return this.verticalValues[value] ? value : undefined;\n },\n wrapText(value: boolean): boolean | undefined {\n return value ? true : undefined;\n },\n shrinkToFit(value: boolean): boolean | undefined {\n return value ? true : undefined;\n },\n textRotation(value: number | \"vertical\"): number | \"vertical\" | undefined {\n switch (value) {\n case \"vertical\":\n return value;\n default: {\n const numValue = validInt(value as number);\n return numValue !== undefined && numValue >= -90 && numValue <= 90 ? numValue : undefined;\n }\n }\n },\n indent(value: number): number {\n const numValue = validInt(value);\n return Math.max(0, numValue!);\n },\n readingOrder(value: \"ltr\" | \"rtl\"): number | undefined {\n switch (value) {\n case \"ltr\":\n return Enums.ReadingOrder.LeftToRight;\n case \"rtl\":\n return Enums.ReadingOrder.RightToLeft;\n default:\n return undefined;\n }\n }\n};\n\nconst textRotationXform = {\n toXml(textRotation: number | \"vertical\"): number | undefined {\n const validated = validation.textRotation(textRotation);\n if (validated) {\n if (validated === \"vertical\") {\n return 255;\n }\n\n const tr = Math.round(validated);\n if (tr >= 0 && tr <= 90) {\n return tr;\n }\n\n if (tr < 0 && tr >= -90) {\n return 90 - tr;\n }\n }\n return undefined;\n },\n toModel(textRotation: string): number | \"vertical\" | undefined {\n const tr = validInt(textRotation);\n if (tr !== undefined) {\n if (tr === 255) {\n return \"vertical\";\n }\n if (tr >= 0 && tr <= 90) {\n return tr;\n }\n if (tr > 90 && tr <= 180) {\n return 90 - tr;\n }\n }\n return undefined;\n }\n};\n\n// Alignment encapsulates translation from style.alignment model to/from xlsx\nclass AlignmentXform extends BaseXform {\n get tag(): string {\n return \"alignment\";\n }\n\n render(xmlStream: any, model: AlignmentModel): void {\n xmlStream.addRollback();\n xmlStream.openNode(\"alignment\");\n\n let isValid = false;\n function add(name: string, value: string | number | boolean | undefined): void {\n if (value) {\n xmlStream.addAttribute(name, value);\n isValid = true;\n }\n }\n add(\"horizontal\", validation.horizontal(model.horizontal!));\n add(\"vertical\", validation.vertical(model.vertical!));\n add(\"wrapText\", validation.wrapText(model.wrapText!) ? \"1\" : false);\n add(\"shrinkToFit\", validation.shrinkToFit(model.shrinkToFit!) ? \"1\" : false);\n add(\"indent\", validation.indent(model.indent!));\n add(\"textRotation\", textRotationXform.toXml(model.textRotation!));\n add(\"readingOrder\", validation.readingOrder(model.readingOrder!));\n\n xmlStream.closeNode();\n\n if (isValid) {\n xmlStream.commit();\n } else {\n xmlStream.rollback();\n }\n }\n\n parseOpen(node: any): void {\n const model: any = {};\n\n let valid = false;\n function add(truthy: any, name: string, value: any): void {\n if (truthy) {\n model[name] = value;\n valid = true;\n }\n }\n add(node.attributes.horizontal, \"horizontal\", node.attributes.horizontal);\n add(\n node.attributes.vertical,\n \"vertical\",\n node.attributes.vertical === \"center\" ? \"middle\" : node.attributes.vertical\n );\n add(node.attributes.wrapText, \"wrapText\", parseBoolean(node.attributes.wrapText));\n add(node.attributes.shrinkToFit, \"shrinkToFit\", parseBoolean(node.attributes.shrinkToFit));\n add(node.attributes.indent, \"indent\", parseInt(node.attributes.indent, 10));\n add(\n node.attributes.textRotation,\n \"textRotation\",\n textRotationXform.toModel(node.attributes.textRotation)\n );\n add(\n node.attributes.readingOrder,\n \"readingOrder\",\n node.attributes.readingOrder === \"2\" ? \"rtl\" : \"ltr\"\n );\n\n this.model = valid ? model : null;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { AlignmentXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\nconst validation = {\n boolean(value: boolean | undefined, dflt: boolean): boolean {\n if (value === undefined) {\n return dflt;\n }\n return value;\n }\n};\n\ninterface ProtectionModel {\n locked?: boolean;\n hidden?: boolean;\n}\n\n// Protection encapsulates translation from style.protection model to/from xlsx\nclass ProtectionXform extends BaseXform {\n get tag(): string {\n return \"protection\";\n }\n\n render(xmlStream: any, model: ProtectionModel): void {\n xmlStream.addRollback();\n xmlStream.openNode(\"protection\");\n\n let isValid = false;\n function add(name: string, value: string | undefined): void {\n if (value !== undefined) {\n xmlStream.addAttribute(name, value);\n isValid = true;\n }\n }\n add(\"locked\", validation.boolean(model.locked, true) ? undefined : \"0\");\n add(\"hidden\", validation.boolean(model.hidden, false) ? \"1\" : undefined);\n\n xmlStream.closeNode();\n\n if (isValid) {\n xmlStream.commit();\n } else {\n xmlStream.rollback();\n }\n }\n\n parseOpen(node: any): void {\n const model: ProtectionModel = {\n locked: !(node.attributes.locked === \"0\"),\n hidden: node.attributes.hidden === \"1\"\n };\n\n // only want to record models that differ from defaults\n const isSignificant = !model.locked || model.hidden;\n\n this.model = isSignificant ? model : null;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { ProtectionXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { AlignmentXform } from \"@excel/xlsx/xform/style/alignment-xform\";\nimport { ProtectionXform } from \"@excel/xlsx/xform/style/protection-xform\";\n\n// <xf numFmtId=\"[numFmtId]\" fontId=\"[fontId]\" fillId=\"[fillId]\" borderId=\"[xf.borderId]\" xfId=\"[xfId]\">\n// Optional <alignment>\n// Optional <protection>\n// </xf>\n\ninterface StyleModel {\n numFmtId?: number;\n fontId?: number;\n fillId?: number;\n borderId?: number;\n xfId?: number;\n alignment?: any;\n protection?: any;\n}\n\ninterface StyleOptions {\n xfId?: boolean;\n}\n\n// Style assists translation from style model to/from xlsx\nclass StyleXform extends BaseXform {\n declare private xfId: boolean;\n declare public map: { alignment: AlignmentXform; protection: ProtectionXform };\n declare public parser: any;\n\n constructor(options?: StyleOptions) {\n super();\n\n this.xfId = !!(options && options.xfId);\n this.map = {\n alignment: new AlignmentXform(),\n protection: new ProtectionXform()\n };\n }\n\n get tag(): string {\n return \"xf\";\n }\n\n render(xmlStream: any, model: StyleModel): void {\n xmlStream.openNode(\"xf\", {\n numFmtId: model.numFmtId || 0,\n fontId: model.fontId || 0,\n fillId: model.fillId || 0,\n borderId: model.borderId || 0\n });\n if (this.xfId) {\n xmlStream.addAttribute(\"xfId\", model.xfId || 0);\n }\n\n if (model.numFmtId) {\n xmlStream.addAttribute(\"applyNumberFormat\", \"1\");\n }\n if (model.fontId) {\n xmlStream.addAttribute(\"applyFont\", \"1\");\n }\n if (model.fillId) {\n xmlStream.addAttribute(\"applyFill\", \"1\");\n }\n if (model.borderId) {\n xmlStream.addAttribute(\"applyBorder\", \"1\");\n }\n if (model.alignment) {\n xmlStream.addAttribute(\"applyAlignment\", \"1\");\n }\n if (model.protection) {\n xmlStream.addAttribute(\"applyProtection\", \"1\");\n }\n\n /**\n * Rendering tags causes close of XML stream.\n * Therefore adding attributes must be done before rendering tags.\n */\n\n if (model.alignment) {\n this.map.alignment.render(xmlStream, model.alignment);\n }\n if (model.protection) {\n this.map.protection.render(xmlStream, model.protection);\n }\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n // used during sax parsing of xml to build font object\n switch (node.name) {\n case \"xf\":\n this.model = {\n numFmtId: parseInt(node.attributes.numFmtId, 10),\n fontId: parseInt(node.attributes.fontId, 10),\n fillId: parseInt(node.attributes.fillId, 10),\n borderId: parseInt(node.attributes.borderId, 10)\n };\n if (this.xfId) {\n this.model.xfId = parseInt(node.attributes.xfId, 10);\n }\n return true;\n case \"alignment\":\n this.parser = this.map.alignment;\n this.parser.parseOpen(node);\n return true;\n case \"protection\":\n this.parser = this.map.protection;\n this.parser.parseOpen(node);\n return true;\n default:\n return false;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n if (this.map.protection === this.parser) {\n this.model.protection = this.parser.model;\n } else {\n this.model.alignment = this.parser.model;\n }\n this.parser = undefined;\n }\n return true;\n }\n return name !== \"xf\";\n }\n}\n\nexport { StyleXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { AlignmentXform } from \"@excel/xlsx/xform/style/alignment-xform\";\nimport { BorderXform } from \"@excel/xlsx/xform/style/border-xform\";\nimport { FillXform } from \"@excel/xlsx/xform/style/fill-xform\";\nimport { FontXform } from \"@excel/xlsx/xform/style/font-xform\";\nimport { NumFmtXform } from \"@excel/xlsx/xform/style/numfmt-xform\";\nimport { ProtectionXform } from \"@excel/xlsx/xform/style/protection-xform\";\n\n// <xf numFmtId=\"[numFmtId]\" fontId=\"[fontId]\" fillId=\"[fillId]\" borderId=\"[xf.borderId]\" xfId=\"[xfId]\">\n// Optional <alignment>\n// Optional <protection>\n// </xf>\n\ninterface DxfModel {\n alignment?: any;\n border?: any;\n fill?: any;\n font?: any;\n numFmt?: string;\n numFmtId?: number;\n protection?: any;\n}\n\n// Style assists translation from style model to/from xlsx\nclass DxfXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser: any;\n\n constructor() {\n super();\n\n this.map = {\n alignment: new AlignmentXform(),\n border: new BorderXform(),\n fill: new FillXform(),\n font: new FontXform(),\n numFmt: new NumFmtXform(),\n protection: new ProtectionXform()\n };\n }\n\n get tag(): string {\n return \"dxf\";\n }\n\n // how do we generate dxfid?\n\n render(xmlStream: any, model: DxfModel): void {\n xmlStream.openNode(this.tag);\n\n if (model.font) {\n this.map.font.render(xmlStream, model.font);\n }\n if (model.numFmt && model.numFmtId) {\n const numFmtModel = { id: model.numFmtId, formatCode: model.numFmt };\n this.map.numFmt.render(xmlStream, numFmtModel);\n }\n if (model.fill) {\n this.map.fill.render(xmlStream, model.fill);\n }\n if (model.alignment) {\n this.map.alignment.render(xmlStream, model.alignment);\n }\n if (model.border) {\n this.map.border.render(xmlStream, model.border);\n }\n if (model.protection) {\n this.map.protection.render(xmlStream, model.protection);\n }\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n\n switch (node.name) {\n case this.tag:\n // this node is often repeated. Need to reset children\n this.reset();\n return true;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n }\n return true;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n if (name === this.tag) {\n this.model = {\n alignment: this.map.alignment.model,\n border: this.map.border.model,\n fill: this.map.fill.model,\n font: this.map.font.model,\n numFmt: this.map.numFmt.model,\n protection: this.map.protection.model\n };\n return false;\n }\n\n return true;\n }\n}\n\nexport { DxfXform };\n","import { Enums } from \"@excel/enums\";\nimport { XmlStream } from \"@excel/utils/xml-stream\";\nimport { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { StaticXform } from \"@excel/xlsx/xform/static-xform\";\nimport { ListXform } from \"@excel/xlsx/xform/list-xform\";\nimport { FontXform } from \"@excel/xlsx/xform/style/font-xform\";\nimport { FillXform } from \"@excel/xlsx/xform/style/fill-xform\";\nimport { BorderXform } from \"@excel/xlsx/xform/style/border-xform\";\nimport { NumFmtXform } from \"@excel/xlsx/xform/style/numfmt-xform\";\nimport { StyleXform } from \"@excel/xlsx/xform/style/style-xform\";\nimport { DxfXform } from \"@excel/xlsx/xform/style/dxf-xform\";\n\n// custom numfmt ids start here\nconst NUMFMT_BASE = 164;\n\ninterface StylesModel {\n styles?: any[];\n numFmts?: any[];\n fonts?: any[];\n borders?: any[];\n fills?: any[];\n dxfs?: any[];\n}\n\ninterface StyleIndex {\n style?: { [key: string]: number };\n numFmt?: { [key: string]: number };\n numFmtNextId?: number;\n font?: { [key: string]: number };\n border?: { [key: string]: number };\n fill?: { [key: string]: number };\n model?: any[];\n}\n\n// =============================================================================\n// StylesXform is used to generate and parse the styles.xml file\n// it manages the collections of fonts, number formats, alignments, etc\nclass StylesXform extends BaseXform {\n declare private index?: StyleIndex;\n declare private weakMap?: WeakMap<any, number>;\n declare public parser: any;\n static Mock: typeof StylesXform;\n\n constructor(initialise?: boolean) {\n super();\n\n this.map = {\n numFmts: new ListXform({ tag: \"numFmts\", count: true, childXform: new NumFmtXform() }),\n fonts: new ListXform({\n tag: \"fonts\",\n count: true,\n childXform: new FontXform(),\n $: { \"x14ac:knownFonts\": 1 }\n }),\n fills: new ListXform({ tag: \"fills\", count: true, childXform: new FillXform() }),\n borders: new ListXform({ tag: \"borders\", count: true, childXform: new BorderXform() }),\n cellStyleXfs: new ListXform({\n tag: \"cellStyleXfs\",\n count: true,\n childXform: new StyleXform()\n }),\n cellXfs: new ListXform({\n tag: \"cellXfs\",\n count: true,\n childXform: new StyleXform({ xfId: true })\n }),\n dxfs: new ListXform({ tag: \"dxfs\", always: true, count: true, childXform: new DxfXform() }),\n\n // for style manager\n numFmt: new NumFmtXform(),\n font: new FontXform(),\n fill: new FillXform(),\n border: new BorderXform(),\n style: new StyleXform({ xfId: true }),\n\n cellStyles: StylesXform.STATIC_XFORMS.cellStyles,\n tableStyles: StylesXform.STATIC_XFORMS.tableStyles,\n extLst: StylesXform.STATIC_XFORMS.extLst\n };\n\n if (initialise) {\n // StylesXform also acts as style manager and is used to build up styles-model during worksheet processing\n this.init();\n }\n }\n\n initIndex(): void {\n this.index = {\n style: {},\n numFmt: {},\n numFmtNextId: 164, // start custom format ids here\n font: {},\n border: {},\n fill: {}\n };\n }\n\n init(): void {\n // Prepare for Style Manager role\n this.model = {\n styles: [],\n numFmts: [],\n fonts: [],\n borders: [],\n fills: [],\n dxfs: []\n };\n\n this.initIndex();\n\n // default (zero) border\n this._addBorder({});\n\n // add default (all zero) style\n this._addStyle({ numFmtId: 0, fontId: 0, fillId: 0, borderId: 0, xfId: 0 });\n\n // add default fills\n this._addFill({ type: \"pattern\", pattern: \"none\" });\n this._addFill({ type: \"pattern\", pattern: \"gray125\" });\n\n this.weakMap = new WeakMap();\n }\n\n render(xmlStream: any, model?: StylesModel): void {\n const renderModel = model || this.model;\n //\n // <fonts count=\"2\" x14ac:knownFonts=\"1\">\n xmlStream.openXml(XmlStream.StdDocAttributes);\n\n xmlStream.openNode(\"styleSheet\", StylesXform.STYLESHEET_ATTRIBUTES);\n\n if (this.index) {\n // model has been built by style manager role (contains xml)\n if (renderModel.numFmts && renderModel.numFmts.length) {\n xmlStream.openNode(\"numFmts\", { count: renderModel.numFmts.length });\n renderModel.numFmts.forEach((numFmtXml: string) => {\n xmlStream.writeXml(numFmtXml);\n });\n xmlStream.closeNode();\n }\n\n if (!renderModel.fonts!.length) {\n // default (zero) font\n this._addFont({\n size: 11,\n color: { theme: 1 },\n name: \"Calibri\",\n family: 2,\n scheme: \"minor\"\n });\n }\n xmlStream.openNode(\"fonts\", { count: renderModel.fonts!.length, \"x14ac:knownFonts\": 1 });\n renderModel.fonts!.forEach((fontXml: string) => {\n xmlStream.writeXml(fontXml);\n });\n xmlStream.closeNode();\n\n xmlStream.openNode(\"fills\", { count: renderModel.fills!.length });\n renderModel.fills!.forEach((fillXml: string) => {\n xmlStream.writeXml(fillXml);\n });\n xmlStream.closeNode();\n\n xmlStream.openNode(\"borders\", { count: renderModel.borders!.length });\n renderModel.borders!.forEach((borderXml: string) => {\n xmlStream.writeXml(borderXml);\n });\n xmlStream.closeNode();\n\n this.map.cellStyleXfs.render(xmlStream, [\n { numFmtId: 0, fontId: 0, fillId: 0, borderId: 0, xfId: 0 }\n ]);\n\n xmlStream.openNode(\"cellXfs\", { count: renderModel.styles!.length });\n renderModel.styles!.forEach((styleXml: string) => {\n xmlStream.writeXml(styleXml);\n });\n xmlStream.closeNode();\n } else {\n // model is plain JSON and needs to be xformed\n this.map.numFmts.render(xmlStream, renderModel.numFmts);\n this.map.fonts.render(xmlStream, renderModel.fonts);\n this.map.fills.render(xmlStream, renderModel.fills);\n this.map.borders.render(xmlStream, renderModel.borders);\n this.map.cellStyleXfs.render(xmlStream, [\n { numFmtId: 0, fontId: 0, fillId: 0, borderId: 0, xfId: 0 }\n ]);\n this.map.cellXfs.render(xmlStream, renderModel.styles);\n }\n\n StylesXform.STATIC_XFORMS.cellStyles.render(xmlStream);\n\n this.map.dxfs.render(xmlStream, renderModel.dxfs);\n\n StylesXform.STATIC_XFORMS.tableStyles.render(xmlStream);\n StylesXform.STATIC_XFORMS.extLst.render(xmlStream);\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"styleSheet\":\n this.initIndex();\n return true;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n }\n return true;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case \"styleSheet\": {\n this.model = {};\n const add = (propName: string, xform: any): void => {\n if (xform.model && xform.model.length) {\n this.model[propName] = xform.model;\n }\n };\n add(\"numFmts\", this.map.numFmts);\n add(\"fonts\", this.map.fonts);\n add(\"fills\", this.map.fills);\n add(\"borders\", this.map.borders);\n add(\"styles\", this.map.cellXfs);\n add(\"dxfs\", this.map.dxfs);\n\n // index numFmts\n this.index = {\n model: [],\n numFmt: {}\n };\n if (this.model.numFmts) {\n const numFmtIndex: any = this.index.numFmt;\n this.model.numFmts.forEach((numFmt: any) => {\n numFmtIndex[numFmt.id] = numFmt.formatCode;\n });\n }\n\n return false;\n }\n default:\n // not quite sure how we get here!\n return true;\n }\n }\n\n // add a cell's style model to the collection\n // each style property is processed and cross-referenced, etc.\n // the styleId is returned. Note: cellType is used when numFmt not defined\n addStyleModel(model: any, cellType?: number): number {\n if (!model) {\n return 0;\n }\n\n // if we have no default font, add it here now\n if (!this.model.fonts.length) {\n // default (zero) font\n this._addFont({ size: 11, color: { theme: 1 }, name: \"Calibri\", family: 2, scheme: \"minor\" });\n }\n\n // if we have seen this style object before, assume it has the same styleId\n if (this.weakMap && this.weakMap.has(model)) {\n return this.weakMap.get(model)!;\n }\n\n const style: any = {};\n const type = cellType || Enums.ValueType.Number;\n\n if (model.numFmt) {\n style.numFmtId = this._addNumFmtStr(model.numFmt);\n } else {\n switch (type) {\n case Enums.ValueType.Number:\n style.numFmtId = this._addNumFmtStr(\"General\");\n break;\n case Enums.ValueType.Date:\n style.numFmtId = this._addNumFmtStr(\"mm-dd-yy\");\n break;\n default:\n break;\n }\n }\n\n if (model.font) {\n style.fontId = this._addFont(model.font);\n }\n\n if (model.border) {\n style.borderId = this._addBorder(model.border);\n }\n\n if (model.fill) {\n style.fillId = this._addFill(model.fill);\n }\n\n if (model.alignment) {\n style.alignment = model.alignment;\n }\n\n if (model.protection) {\n style.protection = model.protection;\n }\n\n const styleId = this._addStyle(style);\n if (this.weakMap) {\n this.weakMap.set(model, styleId);\n }\n return styleId;\n }\n\n // given a styleId (i.e. s=\"n\"), get the cell's style model\n // objects are shared where possible.\n getStyleModel(id: number): any {\n // if the style doesn't exist return null\n const style = this.model.styles[id];\n if (!style) {\n return null;\n }\n\n // have we built this model before?\n let model = this.index!.model![id];\n if (model) {\n return model;\n }\n\n // build a new model\n model = this.index!.model![id] = {};\n\n // -------------------------------------------------------\n // number format\n if (style.numFmtId) {\n const numFmt =\n (this.index!.numFmt as any)[style.numFmtId] ||\n NumFmtXform.getDefaultFmtCode(style.numFmtId);\n if (numFmt) {\n model.numFmt = numFmt;\n }\n }\n\n function addStyle(name: string, group: any[], styleId: number): void {\n if (styleId || styleId === 0) {\n const part = group[styleId];\n if (part) {\n model[name] = part;\n }\n }\n }\n\n addStyle(\"font\", this.model.fonts, style.fontId);\n addStyle(\"border\", this.model.borders, style.borderId);\n addStyle(\"fill\", this.model.fills, style.fillId);\n\n // -------------------------------------------------------\n // alignment\n if (style.alignment) {\n model.alignment = style.alignment;\n }\n\n // -------------------------------------------------------\n // protection\n if (style.protection) {\n model.protection = style.protection;\n }\n\n return model;\n }\n\n addDxfStyle(style: any): number {\n if (style.numFmt) {\n // register numFmtId to use it during dxf-xform rendering\n style.numFmtId = this._addNumFmtStr(style.numFmt);\n }\n\n this.model.dxfs.push(style);\n return this.model.dxfs.length - 1;\n }\n\n getDxfStyle(id: number): any {\n return this.model.dxfs[id];\n }\n\n // =========================================================================\n // Private Interface\n _addStyle(style: any): number {\n const xml = this.map.style.toXml(style);\n let index = this.index!.style![xml];\n if (index === undefined) {\n index = this.index!.style![xml] = this.model.styles.length;\n this.model.styles.push(xml);\n }\n return index;\n }\n\n // =========================================================================\n // Number Formats\n _addNumFmtStr(formatCode: string): number {\n // check if default format\n let index = NumFmtXform.getDefaultFmtId(formatCode);\n if (index !== undefined) {\n return index;\n }\n\n // check if already in\n index = (this.index!.numFmt as any)[formatCode];\n if (index !== undefined) {\n return index;\n }\n\n index = (this.index!.numFmt as any)[formatCode] = NUMFMT_BASE + this.model.numFmts.length;\n const xml = this.map.numFmt.toXml({ id: index, formatCode });\n this.model.numFmts.push(xml);\n return index;\n }\n\n // =========================================================================\n // Fonts\n _addFont(font: any): number {\n const xml = this.map.font.toXml(font);\n let index = this.index!.font![xml];\n if (index === undefined) {\n index = this.index!.font![xml] = this.model.fonts.length;\n this.model.fonts.push(xml);\n }\n return index;\n }\n\n // =========================================================================\n // Borders\n _addBorder(border: any): number {\n const xml = this.map.border.toXml(border);\n let index = this.index!.border![xml];\n if (index === undefined) {\n index = this.index!.border![xml] = this.model.borders.length;\n this.model.borders.push(xml);\n }\n return index;\n }\n\n // =========================================================================\n // Fills\n _addFill(fill: any): number {\n const xml = this.map.fill.toXml(fill);\n let index = this.index!.fill![xml];\n if (index === undefined) {\n index = this.index!.fill![xml] = this.model.fills.length;\n this.model.fills.push(xml);\n }\n return index;\n }\n\n // =========================================================================\n static STYLESHEET_ATTRIBUTES = {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\n \"xmlns:mc\": \"http://schemas.openxmlformats.org/markup-compatibility/2006\",\n \"mc:Ignorable\": \"x14ac x16r2\",\n \"xmlns:x14ac\": \"http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac\",\n \"xmlns:x16r2\": \"http://schemas.microsoft.com/office/spreadsheetml/2015/02/main\"\n };\n\n static STATIC_XFORMS = {\n cellStyles: new StaticXform({\n tag: \"cellStyles\",\n $: { count: 1 },\n c: [{ tag: \"cellStyle\", $: { name: \"Normal\", xfId: 0, builtinId: 0 } }]\n }),\n dxfs: new StaticXform({ tag: \"dxfs\", $: { count: 0 } }),\n tableStyles: new StaticXform({\n tag: \"tableStyles\",\n $: {\n count: 0,\n defaultTableStyle: \"TableStyleMedium2\",\n defaultPivotStyle: \"PivotStyleLight16\"\n }\n }),\n extLst: new StaticXform({\n tag: \"extLst\",\n c: [\n {\n tag: \"ext\",\n $: {\n uri: \"{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}\",\n \"xmlns:x14\": \"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main\"\n },\n c: [{ tag: \"x14:slicerStyles\", $: { defaultSlicerStyle: \"SlicerStyleLight1\" } }]\n },\n {\n tag: \"ext\",\n $: {\n uri: \"{9260A510-F301-46a8-8635-F512D64BE5F5}\",\n \"xmlns:x15\": \"http://schemas.microsoft.com/office/spreadsheetml/2010/11/main\"\n },\n c: [{ tag: \"x15:timelineStyles\", $: { defaultTimelineStyle: \"TimeSlicerStyleLight1\" } }]\n }\n ]\n })\n };\n}\n\n// the stylemanager mock acts like StyleManager except that it always returns 0 or {}\nclass StylesXformMock extends StylesXform {\n declare private _dateStyleId?: number;\n\n constructor() {\n super();\n\n this.model = {\n styles: [{ numFmtId: 0, fontId: 0, fillId: 0, borderId: 0, xfId: 0 }],\n numFmts: [],\n fonts: [{ size: 11, color: { theme: 1 }, name: \"Calibri\", family: 2, scheme: \"minor\" }],\n borders: [{}],\n fills: [\n { type: \"pattern\", pattern: \"none\" },\n { type: \"pattern\", pattern: \"gray125\" }\n ]\n };\n }\n\n // =========================================================================\n // Style Manager Interface\n\n // override normal behaviour - consume and dispose\n parseStream(stream: any): Promise<void> {\n stream.autodrain();\n return Promise.resolve();\n }\n\n // add a cell's style model to the collection\n // each style property is processed and cross-referenced, etc.\n // the styleId is returned. Note: cellType is used when numFmt not defined\n addStyleModel(model: any, cellType?: number): number {\n switch (cellType) {\n case Enums.ValueType.Date:\n return this.dateStyleId;\n default:\n return 0;\n }\n }\n\n get dateStyleId(): number {\n if (!this._dateStyleId) {\n const dateStyle = {\n numFmtId: NumFmtXform.getDefaultFmtId(\"mm-dd-yy\")\n };\n this._dateStyleId = this.model.styles.length;\n this.model.styles.push(dateStyle);\n }\n return this._dateStyleId;\n }\n\n // given a styleId (i.e. s=\"n\"), get the cell's style model\n // objects are shared where possible.\n getStyleModel(/* id */): any {\n return {};\n }\n}\n\n// Assign Mock after class declaration to avoid \"used before declaration\" error\nStylesXform.Mock = StylesXformMock;\n\nexport { StylesXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface DateXformOptions {\n tag: string;\n attr?: string;\n attrs?: any;\n format?: (dt: Date) => string;\n parse?: (str: string) => Date;\n}\n\nclass DateXform extends BaseXform {\n declare private tag: string;\n declare private attr?: string;\n declare private attrs?: any;\n declare private text: string[];\n declare private _format: (dt: Date) => string;\n declare private _parse: (str: string) => Date;\n\n constructor(options: DateXformOptions) {\n super();\n\n this.tag = options.tag;\n this.attr = options.attr;\n this.attrs = options.attrs;\n this.text = [];\n this._format =\n options.format ||\n function (dt: Date): string {\n try {\n if (Number.isNaN(dt.getTime())) {\n return \"\";\n }\n return dt.toISOString();\n } catch {\n return \"\";\n }\n };\n this._parse =\n options.parse ||\n function (str: string): Date {\n return new Date(str);\n };\n }\n\n render(xmlStream: any, model?: Date): void {\n if (model) {\n xmlStream.openNode(this.tag);\n if (this.attrs) {\n xmlStream.addAttributes(this.attrs);\n }\n if (this.attr) {\n xmlStream.addAttribute(this.attr, this._format(model));\n } else {\n xmlStream.writeText(this._format(model));\n }\n xmlStream.closeNode();\n }\n }\n\n parseOpen(node: any): void {\n if (node.name === this.tag) {\n if (this.attr) {\n this.model = this._parse(node.attributes[this.attr]);\n } else {\n this.text = [];\n }\n }\n }\n\n parseText(text: string): void {\n if (!this.attr) {\n this.text.push(text);\n }\n }\n\n parseClose(): boolean {\n if (!this.attr) {\n this.model = this._parse(this.text.join(\"\"));\n }\n return false;\n }\n}\n\nexport { DateXform };\n","import { XmlStream } from \"@excel/utils/xml-stream\";\nimport { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { DateXform } from \"@excel/xlsx/xform/simple/date-xform\";\nimport { StringXform } from \"@excel/xlsx/xform/simple/string-xform\";\nimport { IntegerXform } from \"@excel/xlsx/xform/simple/integer-xform\";\n\ninterface CoreModel {\n creator?: string;\n title?: string;\n subject?: string;\n description?: string;\n identifier?: string;\n language?: string;\n keywords?: string;\n category?: string;\n lastModifiedBy?: string;\n lastPrinted?: Date;\n revision?: number;\n version?: string;\n contentStatus?: string;\n contentType?: string;\n created?: Date;\n modified?: Date;\n}\n\nclass CoreXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser: any;\n\n constructor() {\n super();\n\n this.map = {\n \"dc:creator\": new StringXform({ tag: \"dc:creator\" }),\n \"dc:title\": new StringXform({ tag: \"dc:title\" }),\n \"dc:subject\": new StringXform({ tag: \"dc:subject\" }),\n \"dc:description\": new StringXform({ tag: \"dc:description\" }),\n \"dc:identifier\": new StringXform({ tag: \"dc:identifier\" }),\n \"dc:language\": new StringXform({ tag: \"dc:language\" }),\n \"cp:keywords\": new StringXform({ tag: \"cp:keywords\" }),\n \"cp:category\": new StringXform({ tag: \"cp:category\" }),\n \"cp:lastModifiedBy\": new StringXform({ tag: \"cp:lastModifiedBy\" }),\n \"cp:lastPrinted\": new DateXform({ tag: \"cp:lastPrinted\", format: CoreXform.DateFormat }),\n \"cp:revision\": new IntegerXform({ tag: \"cp:revision\" }),\n \"cp:version\": new StringXform({ tag: \"cp:version\" }),\n \"cp:contentStatus\": new StringXform({ tag: \"cp:contentStatus\" }),\n \"cp:contentType\": new StringXform({ tag: \"cp:contentType\" }),\n \"dcterms:created\": new DateXform({\n tag: \"dcterms:created\",\n attrs: CoreXform.DateAttrs,\n format: CoreXform.DateFormat\n }),\n \"dcterms:modified\": new DateXform({\n tag: \"dcterms:modified\",\n attrs: CoreXform.DateAttrs,\n format: CoreXform.DateFormat\n })\n };\n }\n\n render(xmlStream: any, model: CoreModel): void {\n xmlStream.openXml(XmlStream.StdDocAttributes);\n\n xmlStream.openNode(\"cp:coreProperties\", CoreXform.CORE_PROPERTY_ATTRIBUTES);\n\n this.map[\"dc:creator\"].render(xmlStream, model.creator);\n this.map[\"dc:title\"].render(xmlStream, model.title);\n this.map[\"dc:subject\"].render(xmlStream, model.subject);\n this.map[\"dc:description\"].render(xmlStream, model.description);\n this.map[\"dc:identifier\"].render(xmlStream, model.identifier);\n this.map[\"dc:language\"].render(xmlStream, model.language);\n this.map[\"cp:keywords\"].render(xmlStream, model.keywords);\n this.map[\"cp:category\"].render(xmlStream, model.category);\n this.map[\"cp:lastModifiedBy\"].render(xmlStream, model.lastModifiedBy);\n this.map[\"cp:lastPrinted\"].render(xmlStream, model.lastPrinted);\n this.map[\"cp:revision\"].render(xmlStream, model.revision);\n this.map[\"cp:version\"].render(xmlStream, model.version);\n this.map[\"cp:contentStatus\"].render(xmlStream, model.contentStatus);\n this.map[\"cp:contentType\"].render(xmlStream, model.contentType);\n this.map[\"dcterms:created\"].render(xmlStream, model.created);\n this.map[\"dcterms:modified\"].render(xmlStream, model.modified);\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"cp:coreProperties\":\n case \"coreProperties\":\n return true;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n throw new Error(`Unexpected xml node in parseOpen: ${JSON.stringify(node)}`);\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case \"cp:coreProperties\":\n case \"coreProperties\":\n this.model = {\n creator: this.map[\"dc:creator\"].model,\n title: this.map[\"dc:title\"].model,\n subject: this.map[\"dc:subject\"].model,\n description: this.map[\"dc:description\"].model,\n identifier: this.map[\"dc:identifier\"].model,\n language: this.map[\"dc:language\"].model,\n keywords: this.map[\"cp:keywords\"].model,\n category: this.map[\"cp:category\"].model,\n lastModifiedBy: this.map[\"cp:lastModifiedBy\"].model,\n lastPrinted: this.map[\"cp:lastPrinted\"].model,\n revision: this.map[\"cp:revision\"].model,\n contentStatus: this.map[\"cp:contentStatus\"].model,\n contentType: this.map[\"cp:contentType\"].model,\n created: this.map[\"dcterms:created\"].model,\n modified: this.map[\"dcterms:modified\"].model\n };\n return false;\n default:\n throw new Error(`Unexpected xml node in parseClose: ${name}`);\n }\n }\n\n static DateFormat = function (dt: Date): string {\n return dt.toISOString().replace(/[.]\\d{3}/, \"\");\n };\n\n static DateAttrs = { \"xsi:type\": \"dcterms:W3CDTF\" };\n\n static CORE_PROPERTY_ATTRIBUTES = {\n \"xmlns:cp\": \"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\",\n \"xmlns:dc\": \"http://purl.org/dc/elements/1.1/\",\n \"xmlns:dcterms\": \"http://purl.org/dc/terms/\",\n \"xmlns:dcmitype\": \"http://purl.org/dc/dcmitype/\",\n \"xmlns:xsi\": \"http://www.w3.org/2001/XMLSchema-instance\"\n };\n}\n\nexport { CoreXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\n// <t xml:space=\"preserve\"> is </t>\n\nclass TextXform extends BaseXform {\n declare private _text: string[];\n\n get tag(): string {\n return \"t\";\n }\n\n render(xmlStream: any, model: string): void {\n xmlStream.openNode(\"t\");\n if (/^\\s|\\n|\\s$/.test(model)) {\n xmlStream.addAttribute(\"xml:space\", \"preserve\");\n }\n xmlStream.writeText(model);\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case \"t\":\n this._text = [];\n this.model = \"\"; // Initialize model to empty string\n return true;\n default:\n return false;\n }\n }\n\n parseText(text: string): void {\n this._text.push(text);\n // Update model immediately after receiving text\n this.model = this._text\n .join(\"\")\n .replace(/_x([0-9A-F]{4})_/g, ($0, $1) => String.fromCharCode(parseInt($1, 16)));\n }\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { TextXform };\n","import { TextXform } from \"@excel/xlsx/xform/strings/text-xform\";\nimport { FontXform } from \"@excel/xlsx/xform/style/font-xform\";\nimport { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\n// <r>\n// <rPr>\n// <sz val=\"11\"/>\n// <color theme=\"1\" tint=\"5\"/>\n// <rFont val=\"Calibri\"/>\n// <family val=\"2\"/>\n// <scheme val=\"minor\"/>\n// </rPr>\n// <t xml:space=\"preserve\"> is </t>\n// </r>\n\ninterface RichTextModel {\n font?: any;\n text: string;\n}\n\nclass RichTextXform extends BaseXform {\n declare private _textXform?: TextXform;\n declare private _fontXform?: FontXform;\n declare public parser: any;\n\n constructor(model?: RichTextModel) {\n super();\n\n this.model = model;\n }\n\n get tag(): string {\n return \"r\";\n }\n\n get textXform(): TextXform {\n return this._textXform || (this._textXform = new TextXform());\n }\n\n get fontXform(): FontXform {\n return this._fontXform || (this._fontXform = new FontXform(RichTextXform.FONT_OPTIONS));\n }\n\n render(xmlStream: any, model?: RichTextModel): void {\n const renderModel = model || this.model;\n\n xmlStream.openNode(\"r\");\n if (renderModel!.font) {\n this.fontXform.render(xmlStream, renderModel!.font);\n }\n this.textXform.render(xmlStream, renderModel!.text);\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"r\":\n this.model = {};\n return true;\n case \"t\":\n this.parser = this.textXform;\n this.parser.parseOpen(node);\n return true;\n case \"rPr\":\n this.parser = this.fontXform;\n this.parser.parseOpen(node);\n return true;\n default:\n return false;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n switch (name) {\n case \"r\":\n return false;\n case \"t\":\n this.model.text = this.parser.model;\n this.parser = undefined;\n return true;\n case \"rPr\":\n this.model.font = this.parser.model;\n this.parser = undefined;\n return true;\n default:\n if (this.parser) {\n this.parser.parseClose(name);\n }\n return true;\n }\n }\n\n static FONT_OPTIONS = {\n tagName: \"rPr\",\n fontNameTag: \"rFont\"\n };\n}\n\nexport { RichTextXform };\n","import { TextXform } from \"@excel/xlsx/xform/strings/text-xform\";\nimport { RichTextXform } from \"@excel/xlsx/xform/strings/rich-text-xform\";\nimport { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\n// <rPh sb=\"0\" eb=\"1\">\n// <t>(its pronounciation in KATAKANA)</t>\n// </rPh>\n\ninterface PhoneticTextModel {\n sb: number;\n eb: number;\n text?: string;\n richText?: any[];\n}\n\nclass PhoneticTextXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser: any;\n\n constructor() {\n super();\n\n this.map = {\n r: new RichTextXform(),\n t: new TextXform()\n };\n }\n\n get tag(): string {\n return \"rPh\";\n }\n\n render(xmlStream: any, model: PhoneticTextModel): void {\n xmlStream.openNode(this.tag, {\n sb: model.sb || 0,\n eb: model.eb || 0\n });\n if (model && Object.prototype.hasOwnProperty.call(model, \"richText\") && model.richText) {\n const { r } = this.map;\n model.richText.forEach(text => {\n r.render(xmlStream, text);\n });\n } else if (model) {\n this.map.t.render(xmlStream, model.text);\n }\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n const { name } = node;\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n if (name === this.tag) {\n this.model = {\n sb: parseInt(node.attributes.sb, 10),\n eb: parseInt(node.attributes.eb, 10)\n };\n return true;\n }\n this.parser = this.map[name];\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n return false;\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n switch (name) {\n case \"r\": {\n let rt = this.model.richText;\n if (!rt) {\n rt = this.model.richText = [];\n }\n rt.push(this.parser.model);\n break;\n }\n case \"t\":\n this.model.text = this.parser.model;\n break;\n default:\n break;\n }\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n return false;\n default:\n return true;\n }\n }\n}\n\nexport { PhoneticTextXform };\n","import { TextXform } from \"@excel/xlsx/xform/strings/text-xform\";\nimport { RichTextXform } from \"@excel/xlsx/xform/strings/rich-text-xform\";\nimport { PhoneticTextXform } from \"@excel/xlsx/xform/strings/phonetic-text-xform\";\nimport { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\n// <si>\n// <r></r><r></r>...\n// </si>\n// <si>\n// <t></t>\n// </si>\n\ntype SharedStringModel = string | { richText: any[] };\n\nclass SharedStringXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser: any;\n\n constructor(model?: SharedStringModel) {\n super();\n\n this.model = model;\n\n this.map = {\n r: new RichTextXform(),\n t: new TextXform(),\n rPh: new PhoneticTextXform()\n };\n }\n\n get tag(): string {\n return \"si\";\n }\n\n render(xmlStream: any, model?: SharedStringModel): void {\n xmlStream.openNode(this.tag);\n if (\n model &&\n typeof model === \"object\" &&\n Object.prototype.hasOwnProperty.call(model, \"richText\") &&\n model.richText\n ) {\n if (model.richText.length) {\n model.richText.forEach(text => {\n this.map.r.render(xmlStream, text);\n });\n } else {\n this.map.t.render(xmlStream, \"\");\n }\n } else if (model !== undefined && model !== null) {\n this.map.t.render(xmlStream, model as string);\n }\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n const { name } = node;\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n if (name === this.tag) {\n this.model = {};\n return true;\n }\n this.parser = this.map[name];\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n return false;\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n switch (name) {\n case \"r\": {\n let rt = (this.model as any).richText;\n if (!rt) {\n rt = (this.model as any).richText = [];\n }\n rt.push(this.parser.model);\n break;\n }\n case \"t\":\n this.model = this.parser.model;\n break;\n default:\n break;\n }\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n return false;\n default:\n return true;\n }\n }\n}\n\nexport { SharedStringXform };\n","import { XmlStream } from \"@excel/utils/xml-stream\";\nimport { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { SharedStringXform } from \"@excel/xlsx/xform/strings/shared-string-xform\";\n\ninterface SharedStringsModel {\n values: any[];\n count: number;\n}\n\nclass SharedStringsXform extends BaseXform {\n declare private hash: { [key: string]: number };\n declare private rich: { [key: string]: number };\n declare public parser: any;\n declare private _sharedStringXform?: SharedStringXform;\n declare private _values?: SharedStringsModel;\n\n constructor(model?: SharedStringsModel) {\n super();\n\n this.model = model || {\n values: [],\n count: 0\n };\n this.hash = Object.create(null);\n this.rich = Object.create(null);\n }\n\n get sharedStringXform(): SharedStringXform {\n return this._sharedStringXform || (this._sharedStringXform = new SharedStringXform());\n }\n\n get values(): any[] {\n return this.model.values;\n }\n\n get uniqueCount(): number {\n return this.model.values.length;\n }\n\n get count(): number {\n return this.model.count;\n }\n\n getString(index: number): any {\n return this.model.values[index];\n }\n\n add(value: any): number {\n return value.richText ? this.addRichText(value) : this.addText(value);\n }\n\n addText(value: string): number {\n let index = this.hash[value];\n if (index === undefined) {\n index = this.hash[value] = this.model.values.length;\n this.model.values.push(value);\n }\n this.model.count++;\n return index;\n }\n\n addRichText(value: any): number {\n // TODO: add WeakMap here\n const xml = this.sharedStringXform.toXml(value);\n let index = this.rich[xml];\n if (index === undefined) {\n index = this.rich[xml] = this.model.values.length;\n this.model.values.push(value);\n }\n this.model.count++;\n return index;\n }\n\n // <?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n // <sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" count=\"<%=totalRefs%>\" uniqueCount=\"<%=count%>\">\n // <si><t><%=text%></t></si>\n // <si><r><rPr></rPr><t></t></r></si>\n // </sst>\n\n render(xmlStream: any, model?: SharedStringsModel): void {\n const renderModel = model || this._values;\n xmlStream.openXml(XmlStream.StdDocAttributes);\n\n xmlStream.openNode(\"sst\", {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\n count: renderModel!.count,\n uniqueCount: renderModel!.values.length\n });\n\n const sx = this.sharedStringXform;\n renderModel!.values.forEach(sharedString => {\n sx.render(xmlStream, sharedString);\n });\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"sst\":\n return true;\n case \"si\":\n this.parser = this.sharedStringXform;\n this.parser.parseOpen(node);\n return true;\n default:\n throw new Error(`Unexpected xml node in parseOpen: ${JSON.stringify(node)}`);\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.model.values.push(this.parser.model);\n this.model.count++;\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case \"sst\":\n return false;\n default:\n throw new Error(`Unexpected xml node in parseClose: ${name}`);\n }\n }\n}\n\nexport { SharedStringsXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface RelationshipModel {\n Id?: string;\n Type?: string;\n Target?: string;\n TargetMode?: string;\n}\n\nclass RelationshipXform extends BaseXform {\n render(xmlStream: any, model: RelationshipModel): void {\n xmlStream.leafNode(\"Relationship\", model);\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case \"Relationship\":\n this.model = node.attributes;\n return true;\n default:\n return false;\n }\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { RelationshipXform };\n","import { XmlStream } from \"@excel/utils/xml-stream\";\nimport { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { RelationshipXform } from \"@excel/xlsx/xform/core/relationship-xform\";\n\nclass RelationshipsXform extends BaseXform {\n declare public parser: any;\n declare private _values?: any[];\n\n constructor() {\n super();\n\n this.map = {\n Relationship: new RelationshipXform()\n };\n }\n\n render(xmlStream: any, model?: any[]): void {\n const renderModel = model || this._values;\n xmlStream.openXml(XmlStream.StdDocAttributes);\n xmlStream.openNode(\"Relationships\", RelationshipsXform.RELATIONSHIPS_ATTRIBUTES);\n\n renderModel!.forEach(relationship => {\n this.map.Relationship.render(xmlStream, relationship);\n });\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"Relationships\":\n this.model = [];\n return true;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n throw new Error(`Unexpected xml node in parseOpen: ${JSON.stringify(node)}`);\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.model.push(this.parser.model);\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case \"Relationships\":\n return false;\n default:\n throw new Error(`Unexpected xml node in parseClose: ${name}`);\n }\n }\n\n static RELATIONSHIPS_ATTRIBUTES = {\n xmlns: \"http://schemas.openxmlformats.org/package/2006/relationships\"\n };\n}\n\nexport { RelationshipsXform };\n","export const OOXML_PATHS = {\n contentTypes: \"[Content_Types].xml\",\n rootRels: \"_rels/.rels\",\n\n docPropsApp: \"docProps/app.xml\",\n docPropsCore: \"docProps/core.xml\",\n\n xlWorkbook: \"xl/workbook.xml\",\n xlWorkbookRels: \"xl/_rels/workbook.xml.rels\",\n xlSharedStrings: \"xl/sharedStrings.xml\",\n xlStyles: \"xl/styles.xml\",\n xlTheme1: \"xl/theme/theme1.xml\"\n} as const;\n\nconst worksheetXmlRegex = /^xl\\/worksheets\\/sheet(\\d+)[.]xml$/;\nconst worksheetRelsXmlRegex = /^xl\\/worksheets\\/_rels\\/sheet(\\d+)[.]xml[.]rels$/;\nconst themeXmlRegex = /^xl\\/theme\\/[a-zA-Z0-9]+[.]xml$/;\n\nconst mediaFilenameRegex = /^xl\\/media\\/([a-zA-Z0-9]+[.][a-zA-Z0-9]{3,4})$/;\nconst drawingXmlRegex = /^xl\\/drawings\\/(drawing\\d+)[.]xml$/;\nconst drawingRelsXmlRegex = /^xl\\/drawings\\/_rels\\/(drawing\\d+)[.]xml[.]rels$/;\nconst vmlDrawingRegex = /^xl\\/drawings\\/(vmlDrawing\\d+)[.]vml$/;\nconst commentsXmlRegex = /^xl\\/comments(\\d+)[.]xml$/;\nconst tableXmlRegex = /^xl\\/tables\\/(table\\d+)[.]xml$/;\n\nconst pivotTableXmlRegex = /^xl\\/pivotTables\\/(pivotTable\\d+)[.]xml$/;\nconst pivotTableRelsXmlRegex = /^xl\\/pivotTables\\/_rels\\/(pivotTable\\d+)[.]xml[.]rels$/;\nconst pivotCacheDefinitionXmlRegex = /^xl\\/pivotCache\\/(pivotCacheDefinition\\d+)[.]xml$/;\nconst pivotCacheDefinitionRelsXmlRegex =\n /^xl\\/pivotCache\\/_rels\\/(pivotCacheDefinition\\d+)[.]xml[.]rels$/;\nconst pivotCacheRecordsXmlRegex = /^xl\\/pivotCache\\/(pivotCacheRecords\\d+)[.]xml$/;\n\nexport function normalizeZipPath(path: string): string {\n return path.startsWith(\"/\") ? path.slice(1) : path;\n}\n\nexport function getWorksheetNoFromWorksheetPath(path: string): number | undefined {\n const match = worksheetXmlRegex.exec(path);\n if (!match) {\n return undefined;\n }\n return parseInt(match[1], 10);\n}\n\nexport function getWorksheetNoFromWorksheetRelsPath(path: string): number | undefined {\n const match = worksheetRelsXmlRegex.exec(path);\n if (!match) {\n return undefined;\n }\n return parseInt(match[1], 10);\n}\n\nexport function isMediaPath(path: string): boolean {\n return path.startsWith(\"xl/media/\");\n}\n\nexport function getMediaFilenameFromPath(path: string): string | undefined {\n const match = mediaFilenameRegex.exec(path);\n return match ? match[1] : undefined;\n}\n\nexport function isThemePath(path: string): boolean {\n return themeXmlRegex.test(path);\n}\n\nexport function getThemeNameFromPath(path: string): string | undefined {\n const match = /^xl\\/theme\\/([a-zA-Z0-9]+)[.]xml$/.exec(path);\n return match ? match[1] : undefined;\n}\n\nexport function isBinaryEntryPath(path: string): boolean {\n // Media and themes should be treated as binary in the legacy buffer-based reader.\n // Everything else is parsed as text XML.\n return isMediaPath(path) || isThemePath(path);\n}\n\nexport function getDrawingNameFromPath(path: string): string | undefined {\n const match = drawingXmlRegex.exec(path);\n return match ? match[1] : undefined;\n}\n\nexport function getDrawingNameFromRelsPath(path: string): string | undefined {\n const match = drawingRelsXmlRegex.exec(path);\n return match ? match[1] : undefined;\n}\n\nexport function getVmlDrawingNameFromPath(path: string): string | undefined {\n const match = vmlDrawingRegex.exec(path);\n return match ? match[1] : undefined;\n}\n\nexport function getCommentsIndexFromPath(path: string): string | undefined {\n const match = commentsXmlRegex.exec(path);\n return match ? match[1] : undefined;\n}\n\nexport function getTableNameFromPath(path: string): string | undefined {\n const match = tableXmlRegex.exec(path);\n return match ? match[1] : undefined;\n}\n\nexport function getPivotTableNameFromPath(path: string): string | undefined {\n const match = pivotTableXmlRegex.exec(path);\n return match ? match[1] : undefined;\n}\n\nexport function getPivotTableNameFromRelsPath(path: string): string | undefined {\n const match = pivotTableRelsXmlRegex.exec(path);\n return match ? match[1] : undefined;\n}\n\nexport function getPivotCacheDefinitionNameFromPath(path: string): string | undefined {\n const match = pivotCacheDefinitionXmlRegex.exec(path);\n return match ? match[1] : undefined;\n}\n\nexport function getPivotCacheDefinitionNameFromRelsPath(path: string): string | undefined {\n const match = pivotCacheDefinitionRelsXmlRegex.exec(path);\n return match ? match[1] : undefined;\n}\n\nexport function getPivotCacheRecordsNameFromPath(path: string): string | undefined {\n const match = pivotCacheRecordsXmlRegex.exec(path);\n return match ? match[1] : undefined;\n}\n\nexport function toContentTypesPartName(zipPath: string): string {\n // ContentTypes uses leading slash PartName (e.g. \"/xl/workbook.xml\").\n return zipPath.startsWith(\"/\") ? zipPath : `/${zipPath}`;\n}\n\nexport function themePath(themeName: string): string {\n return `xl/theme/${themeName}.xml`;\n}\n\nexport function mediaPath(filename: string): string {\n return `xl/media/${filename}`;\n}\n\nexport function worksheetPath(sheetId: number | string): string {\n return `xl/worksheets/sheet${sheetId}.xml`;\n}\n\nexport function worksheetRelsPath(sheetId: number | string): string {\n return `xl/worksheets/_rels/sheet${sheetId}.xml.rels`;\n}\n\nexport function worksheetRelTarget(sheetId: number | string): string {\n return `worksheets/sheet${sheetId}.xml`;\n}\n\nexport function commentsPath(sheetId: number | string): string {\n return `xl/comments${sheetId}.xml`;\n}\n\nexport function commentsPathFromName(commentName: string): string {\n // For comments when the caller already has the logical name (e.g. \"comments1\").\n return `xl/${commentName}.xml`;\n}\n\nexport function vmlDrawingPath(sheetId: number | string): string {\n return `xl/drawings/vmlDrawing${sheetId}.vml`;\n}\n\nexport function tablePath(target: string): string {\n return `xl/tables/${target}`;\n}\n\nexport function drawingPath(drawingName: string): string {\n return `xl/drawings/${drawingName}.xml`;\n}\n\nexport function drawingRelsPath(drawingName: string): string {\n return `xl/drawings/_rels/${drawingName}.xml.rels`;\n}\n\nexport function pivotCacheDefinitionPath(n: number | string): string {\n return `xl/pivotCache/pivotCacheDefinition${n}.xml`;\n}\n\nexport function pivotCacheDefinitionRelsPath(n: number | string): string {\n return `xl/pivotCache/_rels/pivotCacheDefinition${n}.xml.rels`;\n}\n\nexport function pivotCacheRecordsPath(n: number | string): string {\n return `xl/pivotCache/pivotCacheRecords${n}.xml`;\n}\n\nexport function pivotCacheRecordsRelTarget(n: number | string): string {\n return `pivotCacheRecords${n}.xml`;\n}\n\nexport function pivotTablePath(n: number | string): string {\n return `xl/pivotTables/pivotTable${n}.xml`;\n}\n\nexport function pivotTableRelsPath(n: number | string): string {\n return `xl/pivotTables/_rels/pivotTable${n}.xml.rels`;\n}\n\nexport function pivotCacheDefinitionRelTargetFromPivotTable(n: number | string): string {\n return `../pivotCache/pivotCacheDefinition${n}.xml`;\n}\n\nexport const OOXML_REL_TARGETS = {\n // Targets inside xl/_rels/workbook.xml.rels (base: xl/)\n workbookStyles: \"styles.xml\",\n workbookSharedStrings: \"sharedStrings.xml\",\n workbookTheme1: \"theme/theme1.xml\"\n} as const;\n\nexport function pivotCacheDefinitionRelTargetFromWorkbook(n: number | string): string {\n // Target inside xl/_rels/workbook.xml.rels (base: xl/)\n return `pivotCache/pivotCacheDefinition${n}.xml`;\n}\n\nexport function commentsRelTargetFromWorksheet(sheetId: number | string): string {\n // Target inside xl/worksheets/_rels/sheetN.xml.rels (base: xl/worksheets/)\n return `../comments${sheetId}.xml`;\n}\n\nexport function vmlDrawingRelTargetFromWorksheet(sheetId: number | string): string {\n // Target inside xl/worksheets/_rels/sheetN.xml.rels (base: xl/worksheets/)\n return `../drawings/vmlDrawing${sheetId}.vml`;\n}\n\nexport function drawingRelTargetFromWorksheet(drawingName: string): string {\n // Target inside xl/worksheets/_rels/sheetN.xml.rels (base: xl/worksheets/)\n return `../drawings/${drawingName}.xml`;\n}\n\nexport function vmlDrawingRelTargetFromWorksheetName(vmlName: string): string {\n // For VML drawings when the caller already has the logical name (e.g. \"vmlDrawing1\").\n return `../drawings/${vmlName}.vml`;\n}\n\nexport function commentsRelTargetFromWorksheetName(commentName: string): string {\n // For comments when the caller already has the logical name (e.g. \"comments1\").\n return `../${commentName}.xml`;\n}\n\nexport function pivotTableRelTargetFromWorksheet(n: number | string): string {\n // Target inside xl/worksheets/_rels/sheetN.xml.rels (base: xl/worksheets/)\n return `../pivotTables/pivotTable${n}.xml`;\n}\n\nexport function pivotTableRelTargetFromWorksheetName(pivotName: string): string {\n // For pivot tables when the caller already has the logical name (e.g. \"pivotTable1\").\n return `../pivotTables/${pivotName}.xml`;\n}\n\nexport function tableRelTargetFromWorksheet(target: string): string {\n // Target inside xl/worksheets/_rels/sheetN.xml.rels (base: xl/worksheets/)\n return `../tables/${target}`;\n}\n\nexport function tableRelTargetFromWorksheetName(name: string): string {\n return `../tables/${name}.xml`;\n}\n\nexport function mediaRelTargetFromRels(filename: string): string {\n // Target from a rels file located under xl/*/_rels (base is one level deeper than xl/)\n return `../media/${filename}`;\n}\n","import { XmlStream } from \"@excel/utils/xml-stream\";\nimport { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport {\n OOXML_PATHS,\n commentsPathFromName,\n drawingPath,\n pivotCacheDefinitionPath,\n pivotCacheRecordsPath,\n pivotTablePath,\n tablePath,\n toContentTypesPartName,\n worksheetPath\n} from \"@excel/utils/ooxml-paths\";\n\n// used for rendering the [Content_Types].xml file\n// not used for parsing\nclass ContentTypesXform extends BaseXform {\n render(xmlStream: any, model: any): void {\n xmlStream.openXml(XmlStream.StdDocAttributes);\n\n xmlStream.openNode(\"Types\", ContentTypesXform.PROPERTY_ATTRIBUTES);\n\n const mediaHash: { [key: string]: boolean } = {};\n (model.media || []).forEach((medium: any) => {\n if (medium.type === \"image\") {\n const imageType = medium.extension;\n if (!mediaHash[imageType]) {\n mediaHash[imageType] = true;\n xmlStream.leafNode(\"Default\", {\n Extension: imageType,\n ContentType: `image/${imageType}`\n });\n }\n }\n });\n\n xmlStream.leafNode(\"Default\", {\n Extension: \"rels\",\n ContentType: \"application/vnd.openxmlformats-package.relationships+xml\"\n });\n xmlStream.leafNode(\"Default\", { Extension: \"xml\", ContentType: \"application/xml\" });\n\n xmlStream.leafNode(\"Override\", {\n PartName: toContentTypesPartName(OOXML_PATHS.xlWorkbook),\n ContentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"\n });\n\n model.worksheets.forEach((worksheet: any, index: number) => {\n // Use fileIndex if set, otherwise use sequential index (1-based)\n const fileIndex = worksheet.fileIndex || index + 1;\n xmlStream.leafNode(\"Override\", {\n PartName: toContentTypesPartName(worksheetPath(fileIndex)),\n ContentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"\n });\n });\n\n if ((model.pivotTables || []).length) {\n // Add content types for each pivot table\n (model.pivotTables || []).forEach((pivotTable: any) => {\n const n = pivotTable.tableNumber;\n xmlStream.leafNode(\"Override\", {\n PartName: toContentTypesPartName(pivotCacheDefinitionPath(n)),\n ContentType:\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml\"\n });\n xmlStream.leafNode(\"Override\", {\n PartName: toContentTypesPartName(pivotCacheRecordsPath(n)),\n ContentType:\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml\"\n });\n xmlStream.leafNode(\"Override\", {\n PartName: toContentTypesPartName(pivotTablePath(n)),\n ContentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml\"\n });\n });\n }\n\n xmlStream.leafNode(\"Override\", {\n PartName: toContentTypesPartName(OOXML_PATHS.xlTheme1),\n ContentType: \"application/vnd.openxmlformats-officedocument.theme+xml\"\n });\n xmlStream.leafNode(\"Override\", {\n PartName: toContentTypesPartName(OOXML_PATHS.xlStyles),\n ContentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"\n });\n\n const hasSharedStrings = model.sharedStrings && model.sharedStrings.count;\n if (hasSharedStrings) {\n xmlStream.leafNode(\"Override\", {\n PartName: toContentTypesPartName(OOXML_PATHS.xlSharedStrings),\n ContentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\"\n });\n }\n\n if (model.tables) {\n model.tables.forEach((table: any) => {\n xmlStream.leafNode(\"Override\", {\n PartName: toContentTypesPartName(tablePath(table.target)),\n ContentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml\"\n });\n });\n }\n\n if (model.drawings) {\n model.drawings.forEach((drawing: any) => {\n xmlStream.leafNode(\"Override\", {\n PartName: toContentTypesPartName(drawingPath(drawing.name)),\n ContentType: \"application/vnd.openxmlformats-officedocument.drawing+xml\"\n });\n });\n }\n\n if (model.commentRefs) {\n xmlStream.leafNode(\"Default\", {\n Extension: \"vml\",\n ContentType: \"application/vnd.openxmlformats-officedocument.vmlDrawing\"\n });\n\n model.commentRefs.forEach(({ commentName }: { commentName: string }) => {\n xmlStream.leafNode(\"Override\", {\n PartName: toContentTypesPartName(commentsPathFromName(commentName)),\n ContentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\"\n });\n });\n }\n\n xmlStream.leafNode(\"Override\", {\n PartName: toContentTypesPartName(OOXML_PATHS.docPropsCore),\n ContentType: \"application/vnd.openxmlformats-package.core-properties+xml\"\n });\n xmlStream.leafNode(\"Override\", {\n PartName: toContentTypesPartName(OOXML_PATHS.docPropsApp),\n ContentType: \"application/vnd.openxmlformats-officedocument.extended-properties+xml\"\n });\n\n xmlStream.closeNode();\n }\n\n parseOpen(): boolean {\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n\n static PROPERTY_ATTRIBUTES = {\n xmlns: \"http://schemas.openxmlformats.org/package/2006/content-types\"\n };\n}\n\nexport { ContentTypesXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\nclass AppHeadingPairsXform extends BaseXform {\n render(xmlStream: any, model: any[]): void {\n xmlStream.openNode(\"HeadingPairs\");\n xmlStream.openNode(\"vt:vector\", { size: 2, baseType: \"variant\" });\n\n xmlStream.openNode(\"vt:variant\");\n xmlStream.leafNode(\"vt:lpstr\", undefined, \"Worksheets\");\n xmlStream.closeNode();\n\n xmlStream.openNode(\"vt:variant\");\n xmlStream.leafNode(\"vt:i4\", undefined, model.length);\n xmlStream.closeNode();\n\n xmlStream.closeNode();\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n // no parsing\n return node.name === \"HeadingPairs\";\n }\n\n parseText(): void {}\n\n parseClose(name: string): boolean {\n return name !== \"HeadingPairs\";\n }\n}\n\nexport { AppHeadingPairsXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\nclass AppTitlesOfPartsXform extends BaseXform {\n render(xmlStream: any, model: any[]): void {\n xmlStream.openNode(\"TitlesOfParts\");\n xmlStream.openNode(\"vt:vector\", { size: model.length, baseType: \"lpstr\" });\n\n model.forEach(sheet => {\n xmlStream.leafNode(\"vt:lpstr\", undefined, sheet.name);\n });\n\n xmlStream.closeNode();\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n // no parsing\n return node.name === \"TitlesOfParts\";\n }\n\n parseText(): void {}\n\n parseClose(name: string): boolean {\n return name !== \"TitlesOfParts\";\n }\n}\n\nexport { AppTitlesOfPartsXform };\n","import { XmlStream } from \"@excel/utils/xml-stream\";\nimport { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { StringXform } from \"@excel/xlsx/xform/simple/string-xform\";\nimport { AppHeadingPairsXform } from \"@excel/xlsx/xform/core/app-heading-pairs-xform\";\nimport { AppTitlesOfPartsXform } from \"@excel/xlsx/xform/core/app-titles-of-parts-xform\";\n\ninterface AppModel {\n worksheets: any[];\n company?: string;\n manager?: string;\n}\n\nclass AppXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser: any;\n\n constructor() {\n super();\n\n this.map = {\n Company: new StringXform({ tag: \"Company\" }),\n Manager: new StringXform({ tag: \"Manager\" }),\n HeadingPairs: new AppHeadingPairsXform(),\n TitleOfParts: new AppTitlesOfPartsXform()\n };\n }\n\n render(xmlStream: any, model: AppModel): void {\n xmlStream.openXml(XmlStream.StdDocAttributes);\n\n xmlStream.openNode(\"Properties\", AppXform.PROPERTY_ATTRIBUTES);\n\n xmlStream.leafNode(\"Application\", undefined, \"Microsoft Excel\");\n xmlStream.leafNode(\"DocSecurity\", undefined, \"0\");\n xmlStream.leafNode(\"ScaleCrop\", undefined, \"false\");\n\n this.map.HeadingPairs.render(xmlStream, model.worksheets);\n this.map.TitleOfParts.render(xmlStream, model.worksheets);\n this.map.Company.render(xmlStream, model.company || \"\");\n this.map.Manager.render(xmlStream, model.manager);\n\n xmlStream.leafNode(\"LinksUpToDate\", undefined, \"false\");\n xmlStream.leafNode(\"SharedDoc\", undefined, \"false\");\n xmlStream.leafNode(\"HyperlinksChanged\", undefined, \"false\");\n xmlStream.leafNode(\"AppVersion\", undefined, \"16.0300\");\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"Properties\":\n return true;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n\n // there's a lot we don't bother to parse\n return false;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case \"Properties\":\n this.model = {\n worksheets: this.map.TitleOfParts.model,\n company: this.map.Company.model,\n manager: this.map.Manager.model\n };\n return false;\n default:\n return true;\n }\n }\n\n static DateFormat = function (dt: Date): string {\n return dt.toISOString().replace(/[.]\\d{3,6}/, \"\");\n };\n\n static DateAttrs = { \"xsi:type\": \"dcterms:W3CDTF\" };\n\n static PROPERTY_ATTRIBUTES = {\n xmlns: \"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\",\n \"xmlns:vt\": \"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes\"\n };\n}\n\nexport { AppXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { colCache } from \"@excel/utils/col-cache\";\n\ninterface DefinedNameModel {\n name: string;\n ranges: string[];\n localSheetId?: number;\n}\n\nclass DefinedNamesXform extends BaseXform {\n declare private _parsedName?: string;\n declare private _parsedLocalSheetId?: string;\n declare private _parsedText: string[];\n\n constructor() {\n super();\n this._parsedText = [];\n }\n\n render(xmlStream: any, model: DefinedNameModel): void {\n // <definedNames>\n // <definedName name=\"name\">name.ranges.join(',')</definedName>\n // <definedName name=\"_xlnm.Print_Area\" localSheetId=\"0\">name.ranges.join(',')</definedName>\n // </definedNames>\n xmlStream.openNode(\"definedName\", {\n name: model.name,\n localSheetId: model.localSheetId\n });\n xmlStream.writeText(model.ranges.join(\",\"));\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case \"definedName\":\n this._parsedName = node.attributes.name;\n this._parsedLocalSheetId = node.attributes.localSheetId;\n this._parsedText = [];\n return true;\n default:\n return false;\n }\n }\n\n parseText(text: string): void {\n this._parsedText.push(text);\n }\n\n parseClose(): boolean {\n this.model = {\n name: this._parsedName!,\n ranges: extractRanges(this._parsedText.join(\"\"))\n };\n if (this._parsedLocalSheetId !== undefined) {\n this.model.localSheetId = parseInt(this._parsedLocalSheetId, 10);\n }\n return false;\n }\n}\n\n// Regex to validate cell range format:\n// - Cell: $A$1 or A1\n// - Range: $A$1:$B$10 or A1:B10\n// - Row range: $1:$2 (for print titles)\n// - Column range: $A:$B (for print titles)\nconst cellRangeRegexp = /^[$]?[A-Za-z]{1,3}[$]?\\d+(:[$]?[A-Za-z]{1,3}[$]?\\d+)?$/;\nconst rowRangeRegexp = /^[$]?\\d+:[$]?\\d+$/;\nconst colRangeRegexp = /^[$]?[A-Za-z]{1,3}:[$]?[A-Za-z]{1,3}$/;\n\nfunction isValidRange(range: string): boolean {\n // Skip array constants wrapped in {} - these are not valid cell ranges\n // e.g., {\"'Sheet1'!$A$1:$B$10\"} or {#N/A,#N/A,FALSE,\"text\"}\n if (range.startsWith(\"{\") || range.endsWith(\"}\")) {\n return false;\n }\n\n // Extract the cell reference part (after the sheet name if present)\n const cellRef = range.split(\"!\").pop() || \"\";\n\n // Must match one of the valid patterns\n if (\n !cellRangeRegexp.test(cellRef) &&\n !rowRangeRegexp.test(cellRef) &&\n !colRangeRegexp.test(cellRef)\n ) {\n return false;\n }\n\n try {\n const decoded = colCache.decodeEx(range);\n // For cell ranges: row/col or top/bottom/left/right should be valid numbers\n // For row ranges ($1:$2): top/bottom are numbers, left/right are null\n // For column ranges ($A:$B): left/right are numbers, top/bottom are null\n if (\n (\"row\" in decoded && typeof decoded.row === \"number\") ||\n (\"top\" in decoded && typeof decoded.top === \"number\") ||\n (\"left\" in decoded && typeof decoded.left === \"number\")\n ) {\n return true;\n }\n return false;\n } catch {\n return false;\n }\n}\n\nfunction extractRanges(parsedText: string): string[] {\n // Skip if the entire text is wrapped in {} (array constant)\n const trimmed = parsedText.trim();\n if (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) {\n return [];\n }\n\n const ranges: string[] = [];\n let quotesOpened = false;\n let last = \"\";\n parsedText.split(\",\").forEach(item => {\n if (!item) {\n return;\n }\n const quotes = (item.match(/'/g) || []).length;\n\n if (!quotes) {\n if (quotesOpened) {\n last += `${item},`;\n } else if (isValidRange(item)) {\n ranges.push(item);\n }\n return;\n }\n const quotesEven = quotes % 2 === 0;\n\n if (!quotesOpened && quotesEven && isValidRange(item)) {\n ranges.push(item);\n } else if (quotesOpened && !quotesEven) {\n quotesOpened = false;\n if (isValidRange(last + item)) {\n ranges.push(last + item);\n }\n last = \"\";\n } else {\n quotesOpened = true;\n last += `${item},`;\n }\n });\n return ranges;\n}\n\nexport { DefinedNamesXform };\n","import { xmlDecode } from \"@utils/utils\";\nimport { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface SheetModel {\n id: number;\n name: string;\n state?: string;\n rId: string;\n}\n\nclass WorksheetXform extends BaseXform {\n render(xmlStream: any, model: SheetModel): void {\n xmlStream.leafNode(\"sheet\", {\n name: model.name,\n sheetId: model.id,\n // Excel doesn't output state when it's 'visible' (default)\n state: model.state === \"visible\" ? undefined : model.state,\n \"r:id\": model.rId\n });\n }\n\n parseOpen(node: any): boolean {\n if (node.name === \"sheet\") {\n this.model = {\n name: xmlDecode(node.attributes.name),\n id: parseInt(node.attributes.sheetId, 10),\n state: node.attributes.state,\n rId: node.attributes[\"r:id\"]\n };\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { WorksheetXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface WorkbookViewModel {\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n firstSheet?: number;\n activeTab?: number;\n visibility?: string;\n}\n\nclass WorkbookViewXform extends BaseXform {\n render(xmlStream: any, model: WorkbookViewModel): void {\n const attributes: any = {\n xWindow: model.x || 0,\n yWindow: model.y || 0,\n windowWidth: model.width || 12000,\n windowHeight: model.height || 24000,\n firstSheet: model.firstSheet,\n activeTab: model.activeTab\n };\n if (model.visibility && model.visibility !== \"visible\") {\n attributes.visibility = model.visibility;\n }\n xmlStream.leafNode(\"workbookView\", attributes);\n }\n\n parseOpen(node: any): boolean {\n if (node.name === \"workbookView\") {\n const model: any = (this.model = {});\n const addS = function (\n name: string,\n value: string | undefined,\n dflt: string | undefined\n ): void {\n const s = value !== undefined ? value : dflt;\n model[name] = s;\n };\n const addN = function (\n name: string,\n value: string | undefined,\n dflt: number | undefined\n ): void {\n const n = value !== undefined ? parseInt(value, 10) : dflt;\n if (n !== undefined) {\n model[name] = n;\n }\n };\n addN(\"x\", node.attributes.xWindow, 0);\n addN(\"y\", node.attributes.yWindow, 0);\n addN(\"width\", node.attributes.windowWidth, 25000);\n addN(\"height\", node.attributes.windowHeight, 10000);\n addS(\"visibility\", node.attributes.visibility, \"visible\");\n addN(\"activeTab\", node.attributes.activeTab, undefined);\n addN(\"firstSheet\", node.attributes.firstSheet, undefined);\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { WorkbookViewXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface WorkbookPropertiesModel {\n date1904?: boolean;\n}\n\nclass WorkbookPropertiesXform extends BaseXform {\n render(xmlStream: any, model: WorkbookPropertiesModel): void {\n xmlStream.leafNode(\"workbookPr\", {\n date1904: model.date1904 ? 1 : undefined,\n // Excel doesn't output defaultThemeVersion\n filterPrivacy: 1\n });\n }\n\n parseOpen(node: any): boolean {\n if (node.name === \"workbookPr\") {\n this.model = {\n date1904: node.attributes.date1904 === \"1\"\n };\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { WorkbookPropertiesXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface CalcPropertiesModel {\n fullCalcOnLoad?: boolean;\n}\n\nclass WorkbookCalcPropertiesXform extends BaseXform {\n render(xmlStream: any, model: CalcPropertiesModel): void {\n xmlStream.leafNode(\"calcPr\", {\n calcId: 171027,\n fullCalcOnLoad: model.fullCalcOnLoad ? 1 : undefined\n });\n }\n\n parseOpen(node: any): boolean {\n if (node.name === \"calcPr\") {\n this.model = {};\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { WorkbookCalcPropertiesXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface PivotCacheModel {\n cacheId: string;\n rId: string;\n}\n\nclass WorkbookPivotCacheXform extends BaseXform {\n render(xmlStream: any, model: PivotCacheModel): void {\n xmlStream.leafNode(\"pivotCache\", {\n cacheId: model.cacheId,\n \"r:id\": model.rId\n });\n }\n\n parseOpen(node: any): boolean {\n if (node.name === \"pivotCache\") {\n this.model = {\n cacheId: node.attributes.cacheId,\n rId: node.attributes[\"r:id\"]\n };\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { WorkbookPivotCacheXform };\n","import { colCache } from \"@excel/utils/col-cache\";\nimport { XmlStream } from \"@excel/utils/xml-stream\";\nimport { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { StaticXform } from \"@excel/xlsx/xform/static-xform\";\nimport { ListXform } from \"@excel/xlsx/xform/list-xform\";\nimport { DefinedNamesXform } from \"@excel/xlsx/xform/book/defined-name-xform\";\nimport { WorksheetXform } from \"@excel/xlsx/xform/book/sheet-xform\";\nimport { WorkbookViewXform } from \"@excel/xlsx/xform/book/workbook-view-xform\";\nimport { WorkbookPropertiesXform } from \"@excel/xlsx/xform/book/workbook-properties-xform\";\nimport { WorkbookCalcPropertiesXform } from \"@excel/xlsx/xform/book/workbook-calc-properties-xform\";\nimport { WorkbookPivotCacheXform } from \"@excel/xlsx/xform/book/workbook-pivot-cache-xform\";\n\nclass WorkbookXform extends BaseXform {\n declare public parser: any;\n\n constructor() {\n super();\n\n this.map = {\n fileVersion: WorkbookXform.STATIC_XFORMS.fileVersion,\n workbookPr: new WorkbookPropertiesXform(),\n bookViews: new ListXform({\n tag: \"bookViews\",\n count: false,\n childXform: new WorkbookViewXform()\n }),\n sheets: new ListXform({ tag: \"sheets\", count: false, childXform: new WorksheetXform() }),\n definedNames: new ListXform({\n tag: \"definedNames\",\n count: false,\n childXform: new DefinedNamesXform()\n }),\n calcPr: new WorkbookCalcPropertiesXform(),\n pivotCaches: new ListXform({\n tag: \"pivotCaches\",\n count: false,\n childXform: new WorkbookPivotCacheXform()\n })\n };\n }\n\n prepare(model: any): void {\n model.sheets = model.worksheets;\n\n // collate all the print areas from all of the sheets and add them to the defined names\n const printAreas: any[] = [];\n let index = 0; // sheets is sparse array - calc index manually\n model.sheets.forEach((sheet: any) => {\n if (sheet.pageSetup && sheet.pageSetup.printArea) {\n sheet.pageSetup.printArea.split(\"&&\").forEach((printArea: string) => {\n const printAreaComponents = printArea.split(\":\");\n const definedName = {\n name: \"_xlnm.Print_Area\",\n ranges: [`'${sheet.name}'!$${printAreaComponents[0]}:$${printAreaComponents[1]}`],\n localSheetId: index\n };\n printAreas.push(definedName);\n });\n }\n\n if (\n sheet.pageSetup &&\n (sheet.pageSetup.printTitlesRow || sheet.pageSetup.printTitlesColumn)\n ) {\n const ranges: string[] = [];\n\n if (sheet.pageSetup.printTitlesColumn) {\n const titlesColumns = sheet.pageSetup.printTitlesColumn.split(\":\");\n ranges.push(`'${sheet.name}'!$${titlesColumns[0]}:$${titlesColumns[1]}`);\n }\n\n if (sheet.pageSetup.printTitlesRow) {\n const titlesRows = sheet.pageSetup.printTitlesRow.split(\":\");\n ranges.push(`'${sheet.name}'!$${titlesRows[0]}:$${titlesRows[1]}`);\n }\n\n const definedName = {\n name: \"_xlnm.Print_Titles\",\n ranges,\n localSheetId: index\n };\n\n printAreas.push(definedName);\n }\n index++;\n });\n if (printAreas.length) {\n model.definedNames = model.definedNames.concat(printAreas);\n }\n\n (model.media || []).forEach((medium: any, i: number) => {\n // assign name\n medium.name = medium.type + (i + 1);\n });\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.openXml(XmlStream.StdDocAttributes);\n xmlStream.openNode(\"workbook\", WorkbookXform.WORKBOOK_ATTRIBUTES);\n\n this.map.fileVersion.render(xmlStream);\n this.map.workbookPr.render(xmlStream, model.properties);\n this.map.bookViews.render(xmlStream, model.views);\n this.map.sheets.render(xmlStream, model.sheets);\n this.map.definedNames.render(xmlStream, model.definedNames);\n this.map.calcPr.render(xmlStream, model.calcProperties);\n this.map.pivotCaches.render(xmlStream, model.pivotTables);\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"workbook\":\n return true;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n }\n return true;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case \"workbook\":\n this.model = {\n sheets: this.map.sheets.model,\n properties: this.map.workbookPr.model || {},\n views: this.map.bookViews.model,\n calcProperties: {}\n };\n if (this.map.definedNames.model) {\n this.model.definedNames = this.map.definedNames.model;\n }\n if (this.map.pivotCaches.model && this.map.pivotCaches.model.length > 0) {\n this.model.pivotCaches = this.map.pivotCaches.model;\n }\n\n return false;\n default:\n // not quite sure how we get here!\n return true;\n }\n }\n\n reconcile(model: any): void {\n const rels = (model.workbookRels || []).reduce((map: any, rel: any) => {\n map[rel.Id] = rel;\n return map;\n }, {});\n\n // reconcile sheet ids, rIds and names\n const worksheets: any[] = [];\n let worksheet: any;\n let index = 0;\n\n (model.sheets || []).forEach((sheet: any) => {\n const rel = rels[sheet.rId];\n if (!rel) {\n return;\n }\n // if rel.Target start with `[space]/xl/` or `/xl/` , then it will be replaced with `''` and spliced behind `xl/`,\n // otherwise it will be spliced directly behind `xl/`. i.g.\n worksheet = model.worksheetHash[`xl/${rel.Target.replace(/^(\\s|\\/xl\\/)+/, \"\")}`];\n // If there are \"chartsheets\" in the file, rel.Target will\n // come out as chartsheets/sheet1.xml or similar here, and\n // that won't be in model.worksheetHash.\n // As we don't have the infrastructure to support chartsheets,\n // we will ignore them for now:\n if (worksheet) {\n worksheet.name = sheet.name;\n worksheet.id = sheet.id;\n worksheet.state = sheet.state;\n worksheets[index++] = worksheet;\n }\n });\n\n // reconcile print areas\n const definedNames: any[] = [];\n if (model.definedNames) {\n model.definedNames.forEach((definedName: any) => {\n if (definedName.name === \"_xlnm.Print_Area\") {\n worksheet = worksheets[definedName.localSheetId];\n if (worksheet) {\n if (!worksheet.pageSetup) {\n worksheet.pageSetup = {};\n }\n const range: any = colCache.decodeEx(definedName.ranges[0]);\n worksheet.pageSetup.printArea = worksheet.pageSetup.printArea\n ? `${worksheet.pageSetup.printArea}&&${range.dimensions}`\n : range.dimensions;\n }\n } else if (definedName.name === \"_xlnm.Print_Titles\") {\n worksheet = worksheets[definedName.localSheetId];\n if (worksheet) {\n if (!worksheet.pageSetup) {\n worksheet.pageSetup = {};\n }\n\n const rangeString = definedName.ranges.join(\",\");\n\n const dollarRegex = /\\$/g;\n\n const rowRangeRegex = /\\$\\d+:\\$\\d+/;\n const rowRangeMatches = rangeString.match(rowRangeRegex);\n\n if (rowRangeMatches && rowRangeMatches.length) {\n const range = rowRangeMatches[0];\n worksheet.pageSetup.printTitlesRow = range.replace(dollarRegex, \"\");\n }\n\n const columnRangeRegex = /\\$[A-Z]+:\\$[A-Z]+/;\n const columnRangeMatches = rangeString.match(columnRangeRegex);\n\n if (columnRangeMatches && columnRangeMatches.length) {\n const range = columnRangeMatches[0];\n worksheet.pageSetup.printTitlesColumn = range.replace(dollarRegex, \"\");\n }\n }\n } else {\n definedNames.push(definedName);\n }\n });\n }\n model.definedNames = definedNames;\n\n // used by sheets to build their image models\n model.media.forEach((media: any, i: number) => {\n media.index = i;\n });\n }\n\n static WORKBOOK_ATTRIBUTES = {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\n \"xmlns:r\": \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\n \"xmlns:mc\": \"http://schemas.openxmlformats.org/markup-compatibility/2006\",\n \"mc:Ignorable\": \"x15\",\n \"xmlns:x15\": \"http://schemas.microsoft.com/office/spreadsheetml/2010/11/main\"\n };\n\n static STATIC_XFORMS = {\n fileVersion: new StaticXform({\n tag: \"fileVersion\",\n $: { appName: \"xl\", lastEdited: 5, lowestEdited: 5, rupBuild: 9303 }\n })\n };\n}\n\nexport { WorkbookXform };\n","const RelType = {\n OfficeDocument:\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\",\n Worksheet: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\",\n CalcChain: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain\",\n SharedStrings:\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\",\n Styles: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\",\n Theme: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\",\n Hyperlink: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\",\n Image: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\",\n CoreProperties:\n \"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\",\n ExtenderProperties:\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\",\n Comments: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments\",\n VmlDrawing: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing\",\n Table: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/table\",\n PivotCacheDefinition:\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheDefinition\",\n PivotCacheRecords:\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheRecords\",\n PivotTable: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotTable\"\n};\n\nexport { RelType };\n","import { Range } from \"@excel/range\";\nimport { colCache } from \"@excel/utils/col-cache\";\nimport { Enums } from \"@excel/enums\";\n\ninterface MergeData {\n address: string;\n master: string;\n}\n\nclass Merges {\n declare private merges: { [key: string]: Range };\n declare private hash?: { [key: string]: Range };\n\n constructor() {\n // optional mergeCells is array of ranges (like the xml)\n this.merges = {};\n }\n\n add(merge: MergeData): void {\n // merge is {address, master}\n if (this.merges[merge.master]) {\n this.merges[merge.master].expandToAddress(merge.address);\n } else {\n const range = `${merge.master}:${merge.address}`;\n this.merges[merge.master] = new Range(range);\n }\n }\n\n get mergeCells(): string[] {\n return Object.values(this.merges).map((merge: Range) => merge.range);\n }\n\n reconcile(mergeCells: string[], rows: any[]): void {\n // reconcile merge list with merge cells\n mergeCells.forEach((merge: string) => {\n const dimensions: any = colCache.decode(merge);\n for (let i = dimensions.top; i <= dimensions.bottom; i++) {\n const row = rows[i - 1];\n for (let j = dimensions.left; j <= dimensions.right; j++) {\n const cell = row.cells[j - 1];\n if (!cell) {\n // nulls are not included in document - so if master cell has no value - add a null one here\n row.cells[j] = {\n type: Enums.ValueType.Null,\n address: colCache.encodeAddress(i, j)\n };\n } else if (cell.type === Enums.ValueType.Merge) {\n cell.master = dimensions.tl;\n }\n }\n }\n });\n }\n\n getMasterAddress(address: string): string | undefined {\n // if address has been merged, return its master's address. Assumes reconcile has been called\n const range = this.hash![address];\n return range && range.tl;\n }\n}\n\nexport { Merges };\n","import { dateToExcel, xmlDecode, isDateFmt, excelToDate } from \"@utils/utils\";\nimport { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { Range } from \"@excel/range\";\nimport { Enums } from \"@excel/enums\";\nimport { RichTextXform } from \"@excel/xlsx/xform/strings/rich-text-xform\";\n\nfunction getValueType(v) {\n if (v === null || v === undefined) {\n return Enums.ValueType.Null;\n }\n if (v instanceof String || typeof v === \"string\") {\n return Enums.ValueType.String;\n }\n if (typeof v === \"number\") {\n return Enums.ValueType.Number;\n }\n if (typeof v === \"boolean\") {\n return Enums.ValueType.Boolean;\n }\n if (v instanceof Date) {\n return Enums.ValueType.Date;\n }\n if (v.text && v.hyperlink) {\n return Enums.ValueType.Hyperlink;\n }\n if (v.formula) {\n return Enums.ValueType.Formula;\n }\n if (v.error) {\n return Enums.ValueType.Error;\n }\n throw new Error(\"I could not understand type of value\");\n}\n\nfunction getEffectiveCellType(cell) {\n switch (cell.type) {\n case Enums.ValueType.Formula:\n return getValueType(cell.result);\n default:\n return cell.type;\n }\n}\n\nclass CellXform extends BaseXform {\n declare private richTextXform: any;\n declare public parser: any;\n declare private t: any;\n declare private currentNode: any;\n\n constructor() {\n super();\n\n this.richTextXform = new RichTextXform();\n }\n\n get tag() {\n return \"c\";\n }\n\n prepare(model, options) {\n const styleId = options.styles.addStyleModel(model.style || {}, getEffectiveCellType(model));\n if (styleId) {\n model.styleId = styleId;\n }\n\n if (model.comment) {\n options.comments.push({ ...model.comment, ref: model.address });\n }\n\n switch (model.type) {\n case Enums.ValueType.String:\n case Enums.ValueType.RichText:\n if (options.sharedStrings) {\n model.ssId = options.sharedStrings.add(model.value);\n }\n break;\n\n case Enums.ValueType.Date:\n if (options.date1904) {\n model.date1904 = true;\n }\n break;\n\n case Enums.ValueType.Hyperlink:\n if (options.sharedStrings && model.text !== undefined && model.text !== null) {\n model.ssId = options.sharedStrings.add(model.text);\n }\n options.hyperlinks.push({\n address: model.address,\n target: model.hyperlink,\n tooltip: model.tooltip\n });\n break;\n\n case Enums.ValueType.Merge:\n options.merges.add(model);\n break;\n\n case Enums.ValueType.Formula:\n if (options.date1904) {\n // in case valueType is date\n model.date1904 = true;\n }\n\n if (model.shareType === \"shared\") {\n model.si = options.siFormulae++;\n }\n\n if (model.formula) {\n options.formulae[model.address] = model;\n } else if (model.sharedFormula) {\n const master = options.formulae[model.sharedFormula];\n if (!master) {\n throw new Error(\n `Shared Formula master must exist above and or left of clone for cell ${model.address}`\n );\n }\n if (master.si === undefined) {\n master.shareType = \"shared\";\n master.si = options.siFormulae++;\n master.range = new Range(master.address, model.address);\n } else if (master.range) {\n master.range.expandToAddress(model.address);\n }\n model.si = master.si;\n }\n break;\n\n default:\n break;\n }\n }\n\n renderFormula(xmlStream, model) {\n let attrs = null;\n switch (model.shareType) {\n case \"shared\":\n attrs = {\n t: \"shared\",\n ref: model.ref || model.range.range,\n si: model.si\n };\n break;\n\n case \"array\":\n attrs = {\n t: \"array\",\n ref: model.ref\n };\n break;\n\n default:\n if (model.si !== undefined) {\n attrs = {\n t: \"shared\",\n si: model.si\n };\n }\n break;\n }\n\n switch (getValueType(model.result)) {\n case Enums.ValueType.Null: // ?\n xmlStream.leafNode(\"f\", attrs, model.formula);\n break;\n\n case Enums.ValueType.String:\n // oddly, formula results don't ever use shared strings\n xmlStream.addAttribute(\"t\", \"str\");\n xmlStream.leafNode(\"f\", attrs, model.formula);\n xmlStream.leafNode(\"v\", null, model.result);\n break;\n\n case Enums.ValueType.Number:\n xmlStream.leafNode(\"f\", attrs, model.formula);\n xmlStream.leafNode(\"v\", null, model.result);\n break;\n\n case Enums.ValueType.Boolean:\n xmlStream.addAttribute(\"t\", \"b\");\n xmlStream.leafNode(\"f\", attrs, model.formula);\n xmlStream.leafNode(\"v\", null, model.result ? 1 : 0);\n break;\n\n case Enums.ValueType.Error:\n xmlStream.addAttribute(\"t\", \"e\");\n xmlStream.leafNode(\"f\", attrs, model.formula);\n xmlStream.leafNode(\"v\", null, model.result.error);\n break;\n\n case Enums.ValueType.Date:\n xmlStream.leafNode(\"f\", attrs, model.formula);\n xmlStream.leafNode(\"v\", null, dateToExcel(model.result, model.date1904));\n break;\n\n // case Enums.ValueType.Hyperlink: // ??\n // case Enums.ValueType.Formula:\n default:\n throw new Error(\"I could not understand type of value\");\n }\n }\n\n render(xmlStream, model) {\n if (model.type === Enums.ValueType.Null && !model.styleId) {\n // if null and no style, exit\n return;\n }\n\n xmlStream.openNode(\"c\");\n xmlStream.addAttribute(\"r\", model.address);\n\n if (model.styleId) {\n xmlStream.addAttribute(\"s\", model.styleId);\n }\n\n switch (model.type) {\n case Enums.ValueType.Null:\n break;\n\n case Enums.ValueType.Number:\n xmlStream.leafNode(\"v\", null, model.value);\n break;\n\n case Enums.ValueType.Boolean:\n xmlStream.addAttribute(\"t\", \"b\");\n xmlStream.leafNode(\"v\", null, model.value ? \"1\" : \"0\");\n break;\n\n case Enums.ValueType.Error:\n xmlStream.addAttribute(\"t\", \"e\");\n xmlStream.leafNode(\"v\", null, model.value.error);\n break;\n\n case Enums.ValueType.String:\n case Enums.ValueType.RichText:\n if (model.ssId !== undefined) {\n xmlStream.addAttribute(\"t\", \"s\");\n xmlStream.leafNode(\"v\", null, model.ssId);\n } else if (model.value && model.value.richText) {\n xmlStream.addAttribute(\"t\", \"inlineStr\");\n xmlStream.openNode(\"is\");\n model.value.richText.forEach(text => {\n this.richTextXform.render(xmlStream, text);\n });\n xmlStream.closeNode(\"is\");\n } else {\n xmlStream.addAttribute(\"t\", \"str\");\n xmlStream.leafNode(\"v\", null, model.value);\n }\n break;\n\n case Enums.ValueType.Date:\n xmlStream.leafNode(\"v\", null, dateToExcel(model.value, model.date1904));\n break;\n\n case Enums.ValueType.Hyperlink:\n if (model.ssId !== undefined) {\n xmlStream.addAttribute(\"t\", \"s\");\n xmlStream.leafNode(\"v\", null, model.ssId);\n } else {\n xmlStream.addAttribute(\"t\", \"str\");\n xmlStream.leafNode(\"v\", null, model.text);\n }\n break;\n\n case Enums.ValueType.Formula:\n this.renderFormula(xmlStream, model);\n break;\n\n case Enums.ValueType.Merge:\n // nothing to add\n break;\n\n default:\n break;\n }\n\n xmlStream.closeNode(); // </c>\n }\n\n parseOpen(node) {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"c\":\n // const address = colCache.decodeAddress(node.attributes.r);\n this.model = {\n address: node.attributes.r\n };\n this.t = node.attributes.t;\n if (node.attributes.s) {\n this.model.styleId = parseInt(node.attributes.s, 10);\n }\n return true;\n\n case \"f\":\n this.currentNode = \"f\";\n this.model.si = node.attributes.si;\n this.model.shareType = node.attributes.t;\n this.model.ref = node.attributes.ref;\n return true;\n\n case \"v\":\n this.currentNode = \"v\";\n return true;\n\n case \"t\":\n this.currentNode = \"t\";\n return true;\n\n case \"r\":\n this.parser = this.richTextXform;\n this.parser.parseOpen(node);\n return true;\n\n default:\n return false;\n }\n }\n\n parseText(text) {\n if (this.parser) {\n this.parser.parseText(text);\n return;\n }\n switch (this.currentNode) {\n case \"f\":\n this.model.formula = this.model.formula ? this.model.formula + text : text;\n break;\n case \"v\":\n case \"t\":\n if (this.model.value && this.model.value.richText) {\n this.model.value.richText.text = this.model.value.richText.text\n ? this.model.value.richText.text + text\n : text;\n } else {\n this.model.value = this.model.value ? this.model.value + text : text;\n }\n break;\n default:\n break;\n }\n }\n\n parseClose(name) {\n switch (name) {\n case \"c\": {\n const { model } = this;\n\n // first guess on cell type\n if (model.formula || model.shareType) {\n model.type = Enums.ValueType.Formula;\n if (model.value) {\n if (this.t === \"str\") {\n model.result = xmlDecode(model.value);\n } else if (this.t === \"b\") {\n model.result = parseInt(model.value, 10) !== 0;\n } else if (this.t === \"e\") {\n model.result = { error: model.value };\n } else {\n model.result = parseFloat(model.value);\n }\n model.value = undefined;\n }\n } else if (model.value !== undefined) {\n switch (this.t) {\n case \"s\":\n model.type = Enums.ValueType.String;\n model.value = parseInt(model.value, 10);\n break;\n case \"str\":\n model.type = Enums.ValueType.String;\n model.value = xmlDecode(model.value);\n break;\n case \"inlineStr\":\n model.type = Enums.ValueType.String;\n break;\n case \"b\":\n model.type = Enums.ValueType.Boolean;\n model.value = parseInt(model.value, 10) !== 0;\n break;\n case \"e\":\n model.type = Enums.ValueType.Error;\n model.value = { error: model.value };\n break;\n case \"d\":\n // Strict OpenXML format stores dates as ISO strings with t=\"d\"\n // See: https://www.loc.gov/preservation/digital/formats/fdd/fdd000401.shtml\n model.type = Enums.ValueType.Date;\n model.value = new Date(model.value);\n break;\n default:\n model.type = Enums.ValueType.Number;\n model.value = parseFloat(model.value);\n break;\n }\n } else if (model.styleId) {\n model.type = Enums.ValueType.Null;\n } else {\n model.type = Enums.ValueType.Merge;\n }\n return false;\n }\n\n case \"f\":\n case \"v\":\n case \"is\":\n this.currentNode = undefined;\n return true;\n\n case \"t\":\n if (this.parser) {\n this.parser.parseClose(name);\n return true;\n }\n this.currentNode = undefined;\n return true;\n\n case \"r\":\n this.model.value = this.model.value || {};\n this.model.value.richText = this.model.value.richText || [];\n this.model.value.richText.push(this.parser.model);\n this.parser = undefined;\n this.currentNode = undefined;\n return true;\n\n default:\n if (this.parser) {\n this.parser.parseClose(name);\n return true;\n }\n return false;\n }\n }\n\n reconcile(model, options) {\n const style = model.styleId && options.styles && options.styles.getStyleModel(model.styleId);\n if (style) {\n model.style = style;\n }\n if (model.styleId !== undefined) {\n model.styleId = undefined;\n }\n\n switch (model.type) {\n case Enums.ValueType.String:\n if (typeof model.value === \"number\") {\n if (options.sharedStrings) {\n model.value = options.sharedStrings.getString(model.value);\n }\n }\n if (model.value.richText) {\n model.type = Enums.ValueType.RichText;\n }\n break;\n\n case Enums.ValueType.Number:\n if (style && isDateFmt(style.numFmt)) {\n model.type = Enums.ValueType.Date;\n model.value = excelToDate(model.value, options.date1904);\n }\n break;\n\n case Enums.ValueType.Formula:\n // Only convert formula result to date if the result is a number\n // String results (t=\"str\") should not be converted even if the cell has a date format\n if (\n model.result !== undefined &&\n typeof model.result === \"number\" &&\n style &&\n isDateFmt(style.numFmt)\n ) {\n model.result = excelToDate(model.result, options.date1904);\n }\n if (model.shareType === \"shared\") {\n if (model.ref) {\n // master\n options.formulae[model.si] = model.address;\n } else {\n // slave\n model.sharedFormula = options.formulae[model.si];\n delete model.shareType;\n }\n delete model.si;\n }\n break;\n\n default:\n break;\n }\n\n // look for hyperlink\n const hyperlink = options.hyperlinkMap[model.address];\n if (hyperlink) {\n if (model.type === Enums.ValueType.Formula) {\n model.text = model.result;\n model.result = undefined;\n } else {\n model.text = model.value;\n model.value = undefined;\n }\n model.type = Enums.ValueType.Hyperlink;\n model.hyperlink = hyperlink;\n }\n\n const comment = options.commentsMap && options.commentsMap[model.address];\n if (comment) {\n model.comment = comment;\n }\n }\n}\n\nexport { CellXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { CellXform } from \"@excel/xlsx/xform/sheet/cell-xform\";\nimport { parseBoolean } from \"@utils/utils\";\nimport { colCache } from \"@excel/utils/col-cache\";\n\ninterface RowXformOptions {\n maxItems?: number;\n}\n\ninterface RowModel {\n number: number;\n min?: number;\n max?: number;\n cells: any[];\n styleId?: number;\n hidden?: boolean;\n bestFit?: boolean;\n height?: number;\n outlineLevel?: number;\n collapsed?: boolean;\n style?: any;\n}\n\nclass RowXform extends BaseXform {\n declare private maxItems?: number;\n declare public map: { [key: string]: any };\n declare public model: RowModel;\n declare public parser: any;\n declare private numRowsSeen: number;\n declare private lastCellCol: number;\n\n constructor(options?: RowXformOptions) {\n super();\n\n this.maxItems = options && options.maxItems;\n this.map = {\n c: new CellXform()\n };\n }\n\n get tag(): string {\n return \"row\";\n }\n\n reset(): void {\n super.reset();\n this.numRowsSeen = 0;\n this.lastCellCol = 0;\n }\n\n prepare(model: RowModel, options: any): void {\n const styleId = options.styles.addStyleModel(model.style);\n if (styleId) {\n model.styleId = styleId;\n }\n const cellXform = this.map.c;\n model.cells.forEach((cellModel: any) => {\n cellXform.prepare(cellModel, options);\n });\n }\n\n render(xmlStream: any, model?: RowModel, options?: any): void {\n if (!model) {\n return;\n }\n xmlStream.openNode(\"row\");\n xmlStream.addAttribute(\"r\", model.number);\n if (model.height) {\n xmlStream.addAttribute(\"ht\", model.height);\n xmlStream.addAttribute(\"customHeight\", \"1\");\n }\n if (model.hidden) {\n xmlStream.addAttribute(\"hidden\", \"1\");\n }\n if (model.min! > 0 && model.max! > 0 && model.min! <= model.max!) {\n xmlStream.addAttribute(\"spans\", `${model.min}:${model.max}`);\n }\n if (model.styleId) {\n xmlStream.addAttribute(\"s\", model.styleId);\n xmlStream.addAttribute(\"customFormat\", \"1\");\n }\n // Note: dyDescent is MS extension, not output by default (Excel auto-calculates)\n if (model.outlineLevel) {\n xmlStream.addAttribute(\"outlineLevel\", model.outlineLevel);\n }\n if (model.collapsed) {\n xmlStream.addAttribute(\"collapsed\", \"1\");\n }\n\n const cellXform = this.map.c;\n model.cells.forEach((cellModel: any) => {\n cellXform.render(xmlStream, cellModel, options);\n });\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n if (node.name === \"row\") {\n this.numRowsSeen += 1;\n // Reset lastCellCol for each new row\n this.lastCellCol = 0;\n const spans = node.attributes.spans\n ? node.attributes.spans.split(\":\").map((span: string) => parseInt(span, 10))\n : [undefined, undefined];\n // If r attribute is missing, use numRowsSeen as the row number\n const rowNumber = node.attributes.r ? parseInt(node.attributes.r, 10) : this.numRowsSeen;\n const model: RowModel = (this.model = {\n number: rowNumber,\n min: spans[0],\n max: spans[1],\n cells: []\n });\n if (node.attributes.s) {\n model.styleId = parseInt(node.attributes.s, 10);\n }\n if (parseBoolean(node.attributes.hidden)) {\n model.hidden = true;\n }\n if (parseBoolean(node.attributes.bestFit)) {\n model.bestFit = true;\n }\n if (node.attributes.ht) {\n model.height = parseFloat(node.attributes.ht);\n }\n if (node.attributes.outlineLevel) {\n model.outlineLevel = parseInt(node.attributes.outlineLevel, 10);\n }\n if (parseBoolean(node.attributes.collapsed)) {\n model.collapsed = true;\n }\n return true;\n }\n\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n return false;\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n const cellModel = this.parser.model;\n // If cell has address, extract column number from it\n // Otherwise, calculate address based on position\n if (cellModel.address) {\n const decoded = colCache.decodeAddress(cellModel.address);\n this.lastCellCol = decoded.col;\n } else {\n // No r attribute, calculate address from position\n this.lastCellCol += 1;\n cellModel.address = colCache.encodeAddress(this.model.number, this.lastCellCol);\n }\n this.model.cells.push(cellModel);\n if (this.maxItems && this.model.cells.length > this.maxItems) {\n throw new Error(`Max column count (${this.maxItems}) exceeded`);\n }\n this.parser = undefined;\n }\n return true;\n }\n return false;\n }\n\n reconcile(model: RowModel, options: any): void {\n model.style = model.styleId ? options.styles.getStyleModel(model.styleId) : {};\n if (model.styleId !== undefined) {\n model.styleId = undefined;\n }\n\n const cellXform = this.map.c;\n model.cells.forEach((cellModel: any) => {\n cellXform.reconcile(cellModel, options);\n });\n }\n}\n\nexport { RowXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { parseBoolean } from \"@utils/utils\";\n\ninterface ColModel {\n min: number;\n max: number;\n width?: number;\n styleId?: number;\n hidden?: boolean;\n bestFit?: boolean;\n outlineLevel?: number;\n collapsed?: boolean;\n style?: any;\n}\n\nclass ColXform extends BaseXform {\n get tag(): string {\n return \"col\";\n }\n\n prepare(model: ColModel, options: any): void {\n const styleId = options.styles.addStyleModel(model.style || {});\n if (styleId) {\n model.styleId = styleId;\n }\n }\n\n render(xmlStream: any, model: ColModel): void {\n xmlStream.openNode(\"col\");\n xmlStream.addAttribute(\"min\", model.min);\n xmlStream.addAttribute(\"max\", model.max);\n if (model.width) {\n xmlStream.addAttribute(\"width\", model.width);\n }\n if (model.styleId) {\n xmlStream.addAttribute(\"style\", model.styleId);\n }\n if (model.hidden) {\n xmlStream.addAttribute(\"hidden\", \"1\");\n }\n if (model.bestFit) {\n xmlStream.addAttribute(\"bestFit\", \"1\");\n }\n if (model.outlineLevel) {\n xmlStream.addAttribute(\"outlineLevel\", model.outlineLevel);\n }\n if (model.collapsed) {\n xmlStream.addAttribute(\"collapsed\", \"1\");\n }\n xmlStream.addAttribute(\"customWidth\", \"1\");\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (node.name === \"col\") {\n const model: ColModel = (this.model = {\n min: parseInt(node.attributes.min || \"0\", 10),\n max: parseInt(node.attributes.max || \"0\", 10),\n width:\n node.attributes.width === undefined ? undefined : parseFloat(node.attributes.width || \"0\")\n });\n if (node.attributes.style) {\n model.styleId = parseInt(node.attributes.style, 10);\n }\n if (parseBoolean(node.attributes.hidden)) {\n model.hidden = true;\n }\n if (parseBoolean(node.attributes.bestFit)) {\n model.bestFit = true;\n }\n if (node.attributes.outlineLevel) {\n model.outlineLevel = parseInt(node.attributes.outlineLevel, 10);\n }\n if (parseBoolean(node.attributes.collapsed)) {\n model.collapsed = true;\n }\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n\n reconcile(model: ColModel, options: any): void {\n // reconcile column styles\n if (model.styleId) {\n model.style = options.styles.getStyleModel(model.styleId);\n }\n }\n}\n\nexport { ColXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\nclass DimensionXform extends BaseXform {\n declare public model: any;\n\n get tag(): string {\n return \"dimension\";\n }\n\n render(xmlStream: any, model: any): void {\n if (model) {\n xmlStream.leafNode(\"dimension\", { ref: model });\n }\n }\n\n parseOpen(node: any): boolean {\n if (node.name === \"dimension\") {\n this.model = node.attributes.ref;\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { DimensionXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface HyperlinkModel {\n address: string;\n rId: string;\n tooltip?: string;\n target?: string;\n}\n\nclass HyperlinkXform extends BaseXform {\n get tag(): string {\n return \"hyperlink\";\n }\n\n render(xmlStream: any, model: HyperlinkModel): void {\n if (this.isInternalLink(model)) {\n xmlStream.leafNode(\"hyperlink\", {\n ref: model.address,\n \"r:id\": model.rId,\n tooltip: model.tooltip,\n location: model.target\n });\n } else {\n xmlStream.leafNode(\"hyperlink\", {\n ref: model.address,\n \"r:id\": model.rId,\n tooltip: model.tooltip\n });\n }\n }\n\n parseOpen(node: any): boolean {\n if (node.name === \"hyperlink\") {\n this.model = {\n address: node.attributes.ref,\n rId: node.attributes[\"r:id\"],\n tooltip: node.attributes.tooltip\n };\n\n // This is an internal link\n if (node.attributes.location) {\n this.model.target = node.attributes.location;\n }\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n\n isInternalLink(model: HyperlinkModel): boolean {\n // @example: Sheet2!D3, return true\n return !!(model.target && /^[^!]+![a-zA-Z]+[\\d]+$/.test(model.target));\n }\n}\n\nexport { HyperlinkXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\nclass MergeCellXform extends BaseXform {\n get tag(): string {\n return \"mergeCell\";\n }\n\n render(xmlStream: any, model: string): void {\n xmlStream.leafNode(\"mergeCell\", { ref: model });\n }\n\n parseOpen(node: any): boolean {\n if (node.name === \"mergeCell\") {\n this.model = node.attributes.ref;\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { MergeCellXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { parseBoolean, dateToExcel, excelToDate } from \"@utils/utils\";\nimport { colCache } from \"@excel/utils/col-cache\";\nimport { isEqual } from \"@excel/utils/under-dash\";\n\nfunction assign(definedName: any, attributes: any, name: string, defaultValue?: any): void {\n const value = attributes[name];\n if (value !== undefined) {\n definedName[name] = value;\n } else if (defaultValue !== undefined) {\n definedName[name] = defaultValue;\n }\n}\n\nfunction assignBool(definedName: any, attributes: any, name: string, defaultValue?: any): void {\n const value = attributes[name];\n if (value !== undefined) {\n definedName[name] = parseBoolean(value);\n } else if (defaultValue !== undefined) {\n definedName[name] = defaultValue;\n }\n}\n\nfunction optimiseDataValidations(model: any): any[] {\n // Squeeze alike data validations together into rectangular ranges\n // to reduce file size and speed up Excel load time\n if (!model) {\n return [];\n }\n\n // First, handle range: prefixed keys directly (large ranges stored during parsing)\n const rangeValidations: any[] = [];\n const regularModel: any = {};\n\n for (const [key, value] of Object.entries(model)) {\n // Skip undefined/null values (removed validations)\n if (value === undefined || value === null) {\n continue;\n }\n if (key.startsWith(\"range:\")) {\n // Large range stored during parsing - output directly\n const rangeStr = key.slice(6); // Remove \"range:\" prefix\n const { sqref: _sqref, ...rest } = value as any;\n rangeValidations.push({\n ...rest,\n sqref: rangeStr\n });\n } else {\n regularModel[key] = value;\n }\n }\n\n // If no regular entries, just return range validations\n if (Object.keys(regularModel).length === 0) {\n return rangeValidations;\n }\n\n const dvList = Object.entries(regularModel)\n .map(([address, dataValidation]: [string, any]) => ({\n address,\n dataValidation,\n marked: false\n }))\n .sort((a: any, b: any) => a.address.localeCompare(b.address));\n const dvMap = Object.fromEntries(dvList.map(dv => [dv.address, dv]));\n const matchCol = (addr: any, height: number, col: number): boolean => {\n for (let i = 0; i < height; i++) {\n const otherAddress = colCache.encodeAddress(addr.row + i, col);\n if (\n !regularModel[otherAddress] ||\n !isEqual(regularModel[addr.address], regularModel[otherAddress])\n ) {\n return false;\n }\n }\n return true;\n };\n const optimized = dvList\n .map(dv => {\n if (!dv.marked) {\n const addr: any = colCache.decodeEx(dv.address);\n if (addr.dimensions) {\n dvMap[addr.dimensions].marked = true;\n return {\n ...dv.dataValidation,\n sqref: dv.address\n };\n }\n\n // iterate downwards - finding matching cells\n let height = 1;\n let otherAddress = colCache.encodeAddress(addr.row + height, addr.col);\n while (\n regularModel[otherAddress] &&\n isEqual(dv.dataValidation, regularModel[otherAddress])\n ) {\n height++;\n otherAddress = colCache.encodeAddress(addr.row + height, addr.col);\n }\n\n // iterate rightwards...\n\n let width = 1;\n while (matchCol(addr, height, addr.col + width)) {\n width++;\n }\n\n // mark all included addresses\n for (let i = 0; i < height; i++) {\n for (let j = 0; j < width; j++) {\n otherAddress = colCache.encodeAddress(addr.row + i, addr.col + j);\n dvMap[otherAddress].marked = true;\n }\n }\n\n if (height > 1 || width > 1) {\n const bottom = addr.row + (height - 1);\n const right = addr.col + (width - 1);\n return {\n ...dv.dataValidation,\n sqref: `${dv.address}:${colCache.encodeAddress(bottom, right)}`\n };\n }\n return {\n ...dv.dataValidation,\n sqref: dv.address\n };\n }\n return null;\n })\n .filter(Boolean);\n\n return [...rangeValidations, ...optimized];\n}\n\nclass DataValidationsXform extends BaseXform {\n declare private _address: string;\n declare private _dataValidation: any;\n declare private _formula: string[];\n\n get tag(): string {\n return \"dataValidations\";\n }\n\n render(xmlStream: any, model: any): void {\n const optimizedModel = optimiseDataValidations(model);\n if (optimizedModel.length) {\n xmlStream.openNode(\"dataValidations\", { count: optimizedModel.length });\n\n optimizedModel.forEach((value: any) => {\n xmlStream.openNode(\"dataValidation\");\n\n if (value.type !== \"any\") {\n xmlStream.addAttribute(\"type\", value.type);\n\n if (value.operator && value.type !== \"list\" && value.operator !== \"between\") {\n xmlStream.addAttribute(\"operator\", value.operator);\n }\n if (value.allowBlank) {\n xmlStream.addAttribute(\"allowBlank\", \"1\");\n }\n }\n if (value.showInputMessage) {\n xmlStream.addAttribute(\"showInputMessage\", \"1\");\n }\n if (value.promptTitle) {\n xmlStream.addAttribute(\"promptTitle\", value.promptTitle);\n }\n if (value.prompt) {\n xmlStream.addAttribute(\"prompt\", value.prompt);\n }\n if (value.showErrorMessage) {\n xmlStream.addAttribute(\"showErrorMessage\", \"1\");\n }\n if (value.errorStyle) {\n xmlStream.addAttribute(\"errorStyle\", value.errorStyle);\n }\n if (value.errorTitle) {\n xmlStream.addAttribute(\"errorTitle\", value.errorTitle);\n }\n if (value.error) {\n xmlStream.addAttribute(\"error\", value.error);\n }\n xmlStream.addAttribute(\"sqref\", value.sqref);\n (value.formulae || []).forEach((formula: any, index: number) => {\n xmlStream.openNode(`formula${index + 1}`);\n if (value.type === \"date\") {\n xmlStream.writeText(dateToExcel(new Date(formula)));\n } else {\n xmlStream.writeText(formula);\n }\n xmlStream.closeNode();\n });\n xmlStream.closeNode();\n });\n xmlStream.closeNode();\n }\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case \"dataValidations\":\n this.model = {};\n return true;\n\n case \"dataValidation\": {\n this._address = node.attributes.sqref;\n const dataValidation: any = { type: node.attributes.type || \"any\", formulae: [] };\n\n if (node.attributes.type) {\n assignBool(dataValidation, node.attributes, \"allowBlank\");\n }\n assignBool(dataValidation, node.attributes, \"showInputMessage\");\n assignBool(dataValidation, node.attributes, \"showErrorMessage\");\n\n switch (dataValidation.type) {\n case \"any\":\n case \"list\":\n case \"custom\":\n break;\n default:\n assign(dataValidation, node.attributes, \"operator\", \"between\");\n break;\n }\n assign(dataValidation, node.attributes, \"promptTitle\");\n assign(dataValidation, node.attributes, \"prompt\");\n assign(dataValidation, node.attributes, \"errorStyle\");\n assign(dataValidation, node.attributes, \"errorTitle\");\n assign(dataValidation, node.attributes, \"error\");\n\n this._dataValidation = dataValidation;\n return true;\n }\n\n case \"formula1\":\n case \"formula2\":\n this._formula = [];\n return true;\n\n default:\n return false;\n }\n }\n\n parseText(text: string): void {\n if (this._formula) {\n this._formula.push(text);\n }\n }\n\n parseClose(name: string): boolean {\n switch (name) {\n case \"dataValidations\":\n return false;\n case \"dataValidation\": {\n if (!this._dataValidation.formulae || !this._dataValidation.formulae.length) {\n delete this._dataValidation.formulae;\n delete this._dataValidation.operator;\n }\n // The four known cases: 1. E4:L9 N4:U9 2.E4 L9 3. N4:U9 4. E4\n const list = this._address.split(/\\s+/g) || [];\n list.forEach((addr: string) => {\n if (addr.includes(\":\")) {\n // Store ranges directly to avoid expanding large (or many) validations.\n // The key format \"range:A1:Z100\" allows DataValidations.find() to detect it.\n this.model[`range:${addr}`] = this._dataValidation;\n } else {\n this.model[addr] = this._dataValidation;\n }\n });\n return true;\n }\n case \"formula1\":\n case \"formula2\": {\n let formula: any = this._formula.join(\"\");\n switch (this._dataValidation.type) {\n case \"whole\":\n case \"textLength\":\n formula = parseInt(formula, 10);\n break;\n case \"decimal\":\n formula = parseFloat(formula);\n break;\n case \"date\":\n formula = excelToDate(parseFloat(formula));\n break;\n default:\n break;\n }\n this._dataValidation.formulae.push(formula);\n this._formula = undefined as any;\n return true;\n }\n default:\n return true;\n }\n }\n}\n\nexport { DataValidationsXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface PageSetupPropertiesModel {\n fitToPage: boolean;\n}\n\nclass PageSetupPropertiesXform extends BaseXform {\n get tag(): string {\n return \"pageSetUpPr\";\n }\n\n render(xmlStream: any, model?: PageSetupPropertiesModel): boolean {\n if (model && model.fitToPage) {\n xmlStream.leafNode(this.tag, {\n fitToPage: model.fitToPage ? \"1\" : undefined\n });\n return true;\n }\n return false;\n }\n\n parseOpen(node: any): boolean {\n if (node.name === this.tag) {\n this.model = {\n fitToPage: node.attributes.fitToPage === \"1\"\n };\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { PageSetupPropertiesXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\nconst isDefined = (attr: any): boolean => typeof attr !== \"undefined\";\n\ninterface OutlinePropertiesModel {\n summaryBelow?: boolean;\n summaryRight?: boolean;\n}\n\nclass OutlinePropertiesXform extends BaseXform {\n get tag(): string {\n return \"outlinePr\";\n }\n\n render(xmlStream: any, model?: OutlinePropertiesModel): boolean {\n if (model && (isDefined(model.summaryBelow) || isDefined(model.summaryRight))) {\n xmlStream.leafNode(this.tag, {\n summaryBelow: isDefined(model.summaryBelow) ? Number(model.summaryBelow) : undefined,\n summaryRight: isDefined(model.summaryRight) ? Number(model.summaryRight) : undefined\n });\n return true;\n }\n return false;\n }\n\n parseOpen(node: any): boolean {\n if (node.name === this.tag) {\n this.model = {\n summaryBelow: isDefined(node.attributes.summaryBelow)\n ? Boolean(Number(node.attributes.summaryBelow))\n : undefined,\n summaryRight: isDefined(node.attributes.summaryRight)\n ? Boolean(Number(node.attributes.summaryRight))\n : undefined\n };\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { OutlinePropertiesXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { ColorXform } from \"@excel/xlsx/xform/style/color-xform\";\nimport { PageSetupPropertiesXform } from \"@excel/xlsx/xform/sheet/page-setup-properties-xform\";\nimport { OutlinePropertiesXform } from \"@excel/xlsx/xform/sheet/outline-properties-xform\";\n\ninterface SheetPropertiesModel {\n tabColor?: any;\n pageSetup?: any;\n outlineProperties?: any;\n}\n\nclass SheetPropertiesXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser?: any;\n\n constructor() {\n super();\n\n this.map = {\n tabColor: new ColorXform(\"tabColor\"),\n pageSetUpPr: new PageSetupPropertiesXform(),\n outlinePr: new OutlinePropertiesXform()\n };\n }\n\n get tag(): string {\n return \"sheetPr\";\n }\n\n render(xmlStream: any, model?: SheetPropertiesModel): void {\n if (model) {\n xmlStream.addRollback();\n xmlStream.openNode(\"sheetPr\");\n\n let inner = false;\n inner = this.map.tabColor.render(xmlStream, model.tabColor) || inner;\n inner = this.map.pageSetUpPr.render(xmlStream, model.pageSetup) || inner;\n inner = this.map.outlinePr.render(xmlStream, model.outlineProperties) || inner;\n\n if (inner) {\n xmlStream.closeNode();\n xmlStream.commit();\n } else {\n xmlStream.rollback();\n }\n }\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n if (node.name === this.tag) {\n this.reset();\n return true;\n }\n if (this.map[node.name]) {\n this.parser = this.map[node.name];\n this.parser.parseOpen(node);\n return true;\n }\n return false;\n }\n\n parseText(text: string): boolean {\n if (this.parser) {\n this.parser.parseText(text);\n return true;\n }\n return false;\n }\n\n parseClose(_name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(_name)) {\n this.parser = undefined;\n }\n return true;\n }\n if (this.map.tabColor.model || this.map.pageSetUpPr.model || this.map.outlinePr.model) {\n this.model = {};\n if (this.map.tabColor.model) {\n this.model.tabColor = this.map.tabColor.model;\n }\n if (this.map.pageSetUpPr.model) {\n this.model.pageSetup = this.map.pageSetUpPr.model;\n }\n if (this.map.outlinePr.model) {\n this.model.outlineProperties = this.map.outlinePr.model;\n }\n } else {\n this.model = null;\n }\n return false;\n }\n}\n\nexport { SheetPropertiesXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface SheetFormatPropertiesModel {\n defaultRowHeight: number;\n dyDescent?: number;\n outlineLevelRow: number;\n outlineLevelCol: number;\n defaultColWidth?: number;\n}\n\nclass SheetFormatPropertiesXform extends BaseXform {\n get tag(): string {\n return \"sheetFormatPr\";\n }\n\n render(xmlStream: any, model?: SheetFormatPropertiesModel): void {\n if (model) {\n const attributes: any = {\n defaultRowHeight: model.defaultRowHeight,\n // Only output outlineLevelRow/Col when non-zero (matches Excel behavior)\n outlineLevelRow: model.outlineLevelRow || undefined,\n outlineLevelCol: model.outlineLevelCol || undefined,\n // Only output dyDescent if explicitly set (MS extension, not ECMA-376 standard)\n \"x14ac:dyDescent\": model.dyDescent || undefined\n };\n // Only output defaultColWidth if explicitly set\n if (model.defaultColWidth) {\n attributes.defaultColWidth = model.defaultColWidth;\n }\n\n // default value for 'defaultRowHeight' is 15, this should not be 'custom'\n if (!model.defaultRowHeight || model.defaultRowHeight !== 15) {\n attributes.customHeight = \"1\";\n }\n\n if (Object.values(attributes).some((value: any) => value !== undefined)) {\n xmlStream.leafNode(\"sheetFormatPr\", attributes);\n }\n }\n }\n\n parseOpen(node: any): boolean {\n if (node.name === \"sheetFormatPr\") {\n this.model = {\n defaultRowHeight: parseFloat(node.attributes.defaultRowHeight || \"0\"),\n dyDescent: parseFloat(node.attributes[\"x14ac:dyDescent\"] || \"0\"),\n outlineLevelRow: parseInt(node.attributes.outlineLevelRow || \"0\", 10),\n outlineLevelCol: parseInt(node.attributes.outlineLevelCol || \"0\", 10)\n };\n if (node.attributes.defaultColWidth) {\n this.model.defaultColWidth = parseFloat(node.attributes.defaultColWidth);\n }\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { SheetFormatPropertiesXform };\n","import { colCache } from \"@excel/utils/col-cache\";\nimport { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\nconst VIEW_STATES: { [key: string]: string } = {\n frozen: \"frozen\",\n frozenSplit: \"frozen\",\n split: \"split\"\n};\n\ninterface SheetViewModel {\n workbookViewId?: number;\n rightToLeft?: boolean;\n tabSelected?: boolean;\n showRuler?: boolean;\n showRowColHeaders?: boolean;\n showGridLines?: boolean;\n zoomScale?: number;\n zoomScaleNormal?: number;\n style?: string;\n state?: string;\n xSplit?: number;\n ySplit?: number;\n topLeftCell?: string;\n activePane?: string;\n activeCell?: string;\n}\n\nclass SheetViewXform extends BaseXform {\n declare public model: SheetViewModel;\n declare private sheetView: any;\n declare private pane: any;\n declare private selections: any;\n\n get tag(): string {\n return \"sheetView\";\n }\n\n prepare(model: SheetViewModel): void {\n switch (model.state) {\n case \"frozen\":\n case \"split\":\n break;\n default:\n model.state = \"normal\";\n break;\n }\n }\n\n render(xmlStream: any, model: SheetViewModel): void {\n // Build initial attributes with correct order to match Excel output\n const initialAttrs: any = {};\n if (model.tabSelected) {\n initialAttrs.tabSelected = \"1\";\n }\n initialAttrs.workbookViewId = model.workbookViewId || 0;\n\n xmlStream.openNode(\"sheetView\", initialAttrs);\n const add = function (name: string, value: any, included: any): void {\n if (included) {\n xmlStream.addAttribute(name, value);\n }\n };\n add(\"rightToLeft\", \"1\", model.rightToLeft === true);\n // tabSelected is now in initialAttrs\n add(\"showRuler\", \"0\", model.showRuler === false);\n add(\"showRowColHeaders\", \"0\", model.showRowColHeaders === false);\n add(\"showGridLines\", \"0\", model.showGridLines === false);\n add(\"zoomScale\", model.zoomScale, model.zoomScale);\n add(\"zoomScaleNormal\", model.zoomScaleNormal, model.zoomScaleNormal);\n add(\"view\", model.style, model.style);\n\n let topLeftCell;\n let xSplit;\n let ySplit;\n let activePane;\n switch (model.state) {\n case \"frozen\":\n xSplit = model.xSplit || 0;\n ySplit = model.ySplit || 0;\n topLeftCell = model.topLeftCell || colCache.getAddress(ySplit + 1, xSplit + 1).address;\n activePane =\n (model.xSplit && model.ySplit && \"bottomRight\") ||\n (model.xSplit && \"topRight\") ||\n \"bottomLeft\";\n\n xmlStream.leafNode(\"pane\", {\n xSplit: model.xSplit || undefined,\n ySplit: model.ySplit || undefined,\n topLeftCell,\n activePane,\n state: \"frozen\"\n });\n xmlStream.leafNode(\"selection\", {\n pane: activePane,\n activeCell: model.activeCell,\n sqref: model.activeCell\n });\n break;\n case \"split\":\n if (model.activePane === \"topLeft\") {\n model.activePane = undefined;\n }\n xmlStream.leafNode(\"pane\", {\n xSplit: model.xSplit || undefined,\n ySplit: model.ySplit || undefined,\n topLeftCell: model.topLeftCell,\n activePane: model.activePane\n });\n xmlStream.leafNode(\"selection\", {\n pane: model.activePane,\n activeCell: model.activeCell,\n sqref: model.activeCell\n });\n break;\n case \"normal\":\n if (model.activeCell) {\n xmlStream.leafNode(\"selection\", {\n activeCell: model.activeCell,\n sqref: model.activeCell\n });\n }\n break;\n default:\n break;\n }\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case \"sheetView\":\n this.sheetView = {\n workbookViewId: parseInt(node.attributes.workbookViewId, 10),\n rightToLeft: node.attributes.rightToLeft === \"1\",\n tabSelected: node.attributes.tabSelected === \"1\",\n showRuler: !(node.attributes.showRuler === \"0\"),\n showRowColHeaders: !(node.attributes.showRowColHeaders === \"0\"),\n showGridLines: !(node.attributes.showGridLines === \"0\"),\n zoomScale: parseInt(node.attributes.zoomScale || \"100\", 10),\n zoomScaleNormal: parseInt(node.attributes.zoomScaleNormal || \"100\", 10),\n style: node.attributes.view\n };\n this.pane = undefined;\n this.selections = {};\n return true;\n\n case \"pane\":\n this.pane = {\n xSplit: parseInt(node.attributes.xSplit || \"0\", 10),\n ySplit: parseInt(node.attributes.ySplit || \"0\", 10),\n topLeftCell: node.attributes.topLeftCell,\n activePane: node.attributes.activePane || \"topLeft\",\n state: node.attributes.state\n };\n return true;\n\n case \"selection\": {\n const name = node.attributes.pane || \"topLeft\";\n this.selections[name] = {\n pane: name,\n activeCell: node.attributes.activeCell\n };\n return true;\n }\n\n default:\n return false;\n }\n }\n\n parseText(): void {}\n\n parseClose(name: string): boolean {\n let model;\n let selection;\n switch (name) {\n case \"sheetView\":\n if (this.sheetView && this.pane) {\n model = this.model = {\n workbookViewId: this.sheetView.workbookViewId,\n rightToLeft: this.sheetView.rightToLeft,\n state: VIEW_STATES[this.pane.state] || \"split\", // split is default\n xSplit: this.pane.xSplit,\n ySplit: this.pane.ySplit,\n topLeftCell: this.pane.topLeftCell,\n showRuler: this.sheetView.showRuler,\n showRowColHeaders: this.sheetView.showRowColHeaders,\n showGridLines: this.sheetView.showGridLines,\n zoomScale: this.sheetView.zoomScale,\n zoomScaleNormal: this.sheetView.zoomScaleNormal\n };\n if (this.model.state === \"split\") {\n model.activePane = this.pane.activePane;\n }\n selection = this.selections[this.pane.activePane];\n if (selection && selection.activeCell) {\n model.activeCell = selection.activeCell;\n }\n if (this.sheetView.style) {\n model.style = this.sheetView.style;\n }\n } else {\n model = this.model = {\n workbookViewId: this.sheetView.workbookViewId,\n rightToLeft: this.sheetView.rightToLeft,\n state: \"normal\",\n showRuler: this.sheetView.showRuler,\n showRowColHeaders: this.sheetView.showRowColHeaders,\n showGridLines: this.sheetView.showGridLines,\n zoomScale: this.sheetView.zoomScale,\n zoomScaleNormal: this.sheetView.zoomScaleNormal\n };\n selection = this.selections.topLeft;\n if (selection && selection.activeCell) {\n model.activeCell = selection.activeCell;\n }\n if (this.sheetView.style) {\n model.style = this.sheetView.style;\n }\n }\n return false;\n default:\n return true;\n }\n }\n\n reconcile(): void {}\n}\n\nexport { SheetViewXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\nfunction booleanToXml(model: boolean, value: string): string | undefined {\n return model ? value : undefined;\n}\n\nfunction xmlToBoolean(value: string, equals: string): boolean | undefined {\n return value === equals ? true : undefined;\n}\n\ninterface SheetProtectionModel {\n sheet?: boolean;\n objects?: boolean;\n scenarios?: boolean;\n selectLockedCells?: boolean;\n selectUnlockedCells?: boolean;\n formatCells?: boolean;\n formatColumns?: boolean;\n formatRows?: boolean;\n insertColumns?: boolean;\n insertRows?: boolean;\n insertHyperlinks?: boolean;\n deleteColumns?: boolean;\n deleteRows?: boolean;\n sort?: boolean;\n autoFilter?: boolean;\n pivotTables?: boolean;\n algorithmName?: string;\n hashValue?: string;\n saltValue?: string;\n spinCount?: number;\n}\n\nclass SheetProtectionXform extends BaseXform {\n get tag(): string {\n return \"sheetProtection\";\n }\n\n render(xmlStream: any, model?: SheetProtectionModel): void {\n if (model) {\n const attributes: any = {\n sheet: booleanToXml(model.sheet!, \"1\"),\n selectLockedCells: model.selectLockedCells === false ? \"1\" : undefined,\n selectUnlockedCells: model.selectUnlockedCells === false ? \"1\" : undefined,\n formatCells: booleanToXml(model.formatCells!, \"0\"),\n formatColumns: booleanToXml(model.formatColumns!, \"0\"),\n formatRows: booleanToXml(model.formatRows!, \"0\"),\n insertColumns: booleanToXml(model.insertColumns!, \"0\"),\n insertRows: booleanToXml(model.insertRows!, \"0\"),\n insertHyperlinks: booleanToXml(model.insertHyperlinks!, \"0\"),\n deleteColumns: booleanToXml(model.deleteColumns!, \"0\"),\n deleteRows: booleanToXml(model.deleteRows!, \"0\"),\n sort: booleanToXml(model.sort!, \"0\"),\n autoFilter: booleanToXml(model.autoFilter!, \"0\"),\n pivotTables: booleanToXml(model.pivotTables!, \"0\")\n };\n if (model.sheet) {\n attributes.algorithmName = model.algorithmName;\n attributes.hashValue = model.hashValue;\n attributes.saltValue = model.saltValue;\n attributes.spinCount = model.spinCount;\n attributes.objects = booleanToXml(model.objects === false, \"1\");\n attributes.scenarios = booleanToXml(model.scenarios === false, \"1\");\n }\n if (Object.values(attributes).some((value: any) => value !== undefined)) {\n xmlStream.leafNode(this.tag, attributes);\n }\n }\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n this.model = {\n sheet: xmlToBoolean(node.attributes.sheet, \"1\"),\n objects: node.attributes.objects === \"1\" ? false : undefined,\n scenarios: node.attributes.scenarios === \"1\" ? false : undefined,\n selectLockedCells: node.attributes.selectLockedCells === \"1\" ? false : undefined,\n selectUnlockedCells: node.attributes.selectUnlockedCells === \"1\" ? false : undefined,\n formatCells: xmlToBoolean(node.attributes.formatCells, \"0\"),\n formatColumns: xmlToBoolean(node.attributes.formatColumns, \"0\"),\n formatRows: xmlToBoolean(node.attributes.formatRows, \"0\"),\n insertColumns: xmlToBoolean(node.attributes.insertColumns, \"0\"),\n insertRows: xmlToBoolean(node.attributes.insertRows, \"0\"),\n insertHyperlinks: xmlToBoolean(node.attributes.insertHyperlinks, \"0\"),\n deleteColumns: xmlToBoolean(node.attributes.deleteColumns, \"0\"),\n deleteRows: xmlToBoolean(node.attributes.deleteRows, \"0\"),\n sort: xmlToBoolean(node.attributes.sort, \"0\"),\n autoFilter: xmlToBoolean(node.attributes.autoFilter, \"0\"),\n pivotTables: xmlToBoolean(node.attributes.pivotTables, \"0\")\n };\n if (node.attributes.algorithmName) {\n this.model.algorithmName = node.attributes.algorithmName;\n this.model.hashValue = node.attributes.hashValue;\n this.model.saltValue = node.attributes.saltValue;\n this.model.spinCount = parseInt(node.attributes.spinCount, 10);\n }\n return true;\n default:\n return false;\n }\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { SheetProtectionXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface PageMarginsModel {\n left?: number;\n right?: number;\n top?: number;\n bottom?: number;\n header?: number;\n footer?: number;\n}\n\nclass PageMarginsXform extends BaseXform {\n get tag(): string {\n return \"pageMargins\";\n }\n\n render(xmlStream: any, model: PageMarginsModel): void {\n if (model) {\n const attributes = {\n left: model.left,\n right: model.right,\n top: model.top,\n bottom: model.bottom,\n header: model.header,\n footer: model.footer\n };\n if (Object.values(attributes).some((value: any) => value !== undefined)) {\n xmlStream.leafNode(this.tag, attributes);\n }\n }\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n this.model = {\n left: parseFloat(node.attributes.left || 0.7),\n right: parseFloat(node.attributes.right || 0.7),\n top: parseFloat(node.attributes.top || 0.75),\n bottom: parseFloat(node.attributes.bottom || 0.75),\n header: parseFloat(node.attributes.header || 0.3),\n footer: parseFloat(node.attributes.footer || 0.3)\n };\n return true;\n default:\n return false;\n }\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { PageMarginsXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\nfunction booleanToXml(model: boolean): string | undefined {\n return model ? \"1\" : undefined;\n}\nfunction pageOrderToXml(model: string): string | undefined {\n switch (model) {\n case \"overThenDown\":\n return model;\n default:\n return undefined;\n }\n}\nfunction cellCommentsToXml(model: string): string | undefined {\n switch (model) {\n case \"atEnd\":\n case \"asDisplyed\":\n return model;\n default:\n return undefined;\n }\n}\nfunction errorsToXml(model: string): string | undefined {\n switch (model) {\n case \"dash\":\n case \"blank\":\n case \"NA\":\n return model;\n default:\n return undefined;\n }\n}\nfunction pageSizeToModel(value: string): number | undefined {\n return value !== undefined ? parseInt(value, 10) : undefined;\n}\n\ninterface PageSetupModel {\n paperSize?: number;\n orientation?: string;\n horizontalDpi?: number;\n verticalDpi?: number;\n pageOrder?: string;\n blackAndWhite?: boolean;\n draft?: boolean;\n cellComments?: string;\n errors?: string;\n scale?: number;\n fitToWidth?: number;\n fitToHeight?: number;\n firstPageNumber?: number;\n useFirstPageNumber?: boolean;\n usePrinterDefaults?: boolean;\n copies?: number;\n}\n\nclass PageSetupXform extends BaseXform {\n get tag(): string {\n return \"pageSetup\";\n }\n\n render(xmlStream: any, model: PageSetupModel): void {\n if (model) {\n const attributes = {\n paperSize: model.paperSize,\n orientation: model.orientation,\n horizontalDpi: model.horizontalDpi,\n verticalDpi: model.verticalDpi,\n pageOrder: pageOrderToXml(model.pageOrder!),\n blackAndWhite: booleanToXml(model.blackAndWhite!),\n draft: booleanToXml(model.draft!),\n cellComments: cellCommentsToXml(model.cellComments!),\n errors: errorsToXml(model.errors!),\n // Only output non-default values (matches Excel behavior)\n scale: model.scale !== 100 ? model.scale : undefined,\n fitToWidth: model.fitToWidth !== 1 ? model.fitToWidth : undefined,\n fitToHeight: model.fitToHeight !== 1 ? model.fitToHeight : undefined,\n firstPageNumber: model.firstPageNumber,\n useFirstPageNumber: booleanToXml(!!model.firstPageNumber),\n usePrinterDefaults: booleanToXml(model.usePrinterDefaults!),\n copies: model.copies\n };\n if (Object.values(attributes).some((value: any) => value !== undefined)) {\n xmlStream.leafNode(this.tag, attributes);\n }\n }\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n this.model = {\n paperSize: pageSizeToModel(node.attributes.paperSize),\n orientation: node.attributes.orientation || \"portrait\",\n horizontalDpi: parseInt(node.attributes.horizontalDpi || \"4294967295\", 10),\n verticalDpi: parseInt(node.attributes.verticalDpi || \"4294967295\", 10),\n pageOrder: node.attributes.pageOrder || \"downThenOver\",\n blackAndWhite: node.attributes.blackAndWhite === \"1\",\n draft: node.attributes.draft === \"1\",\n cellComments: node.attributes.cellComments || \"None\",\n errors: node.attributes.errors || \"displayed\",\n scale: parseInt(node.attributes.scale || \"100\", 10),\n fitToWidth: parseInt(node.attributes.fitToWidth || \"1\", 10),\n fitToHeight: parseInt(node.attributes.fitToHeight || \"1\", 10),\n firstPageNumber: parseInt(node.attributes.firstPageNumber || \"1\", 10),\n useFirstPageNumber: node.attributes.useFirstPageNumber === \"1\",\n usePrinterDefaults: node.attributes.usePrinterDefaults === \"1\",\n copies: parseInt(node.attributes.copies || \"1\", 10)\n };\n return true;\n default:\n return false;\n }\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { PageSetupXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\nfunction booleanToXml(model: boolean): string | undefined {\n return model ? \"1\" : undefined;\n}\n\ninterface PrintOptionsModel {\n showRowColHeaders: boolean;\n showGridLines: boolean;\n horizontalCentered: boolean;\n verticalCentered: boolean;\n}\n\nclass PrintOptionsXform extends BaseXform {\n get tag(): string {\n return \"printOptions\";\n }\n\n render(xmlStream: any, model?: PrintOptionsModel): void {\n if (model) {\n const attributes = {\n headings: booleanToXml(model.showRowColHeaders),\n gridLines: booleanToXml(model.showGridLines),\n horizontalCentered: booleanToXml(model.horizontalCentered),\n verticalCentered: booleanToXml(model.verticalCentered)\n };\n if (Object.values(attributes).some((value: any) => value !== undefined)) {\n xmlStream.leafNode(this.tag, attributes);\n }\n }\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n this.model = {\n showRowColHeaders: node.attributes.headings === \"1\",\n showGridLines: node.attributes.gridLines === \"1\",\n horizontalCentered: node.attributes.horizontalCentered === \"1\",\n verticalCentered: node.attributes.verticalCentered === \"1\"\n };\n return true;\n default:\n return false;\n }\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { PrintOptionsXform };\n","import { colCache } from \"@excel/utils/col-cache\";\nimport { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\nclass AutoFilterXform extends BaseXform {\n declare public model: any;\n\n get tag(): string {\n return \"autoFilter\";\n }\n\n render(xmlStream: any, model: any): void {\n if (model) {\n if (typeof model === \"string\") {\n // assume range\n xmlStream.leafNode(\"autoFilter\", { ref: model });\n } else {\n const getAddress = function (addr: any): string {\n if (typeof addr === \"string\") {\n return addr;\n }\n return colCache.getAddress(addr.row, addr.column).address;\n };\n\n const firstAddress = getAddress(model.from);\n const secondAddress = getAddress(model.to);\n if (firstAddress && secondAddress) {\n xmlStream.leafNode(\"autoFilter\", { ref: `${firstAddress}:${secondAddress}` });\n }\n }\n }\n }\n\n parseOpen(node: any): void {\n if (node.name === \"autoFilter\") {\n this.model = node.attributes.ref;\n }\n }\n}\n\nexport { AutoFilterXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface PictureModel {\n rId: string;\n}\n\nclass PictureXform extends BaseXform {\n get tag(): string {\n return \"picture\";\n }\n\n render(xmlStream: any, model?: PictureModel): void {\n if (model) {\n xmlStream.leafNode(this.tag, { \"r:id\": model.rId });\n }\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n this.model = {\n rId: node.attributes[\"r:id\"]\n };\n return true;\n default:\n return false;\n }\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { PictureXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface DrawingModel {\n rId: string;\n}\n\nclass DrawingXform extends BaseXform {\n get tag(): string {\n return \"drawing\";\n }\n\n render(xmlStream: any, model?: DrawingModel): void {\n if (model) {\n xmlStream.leafNode(this.tag, { \"r:id\": model.rId });\n }\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n this.model = {\n rId: node.attributes[\"r:id\"]\n };\n return true;\n default:\n return false;\n }\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { DrawingXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface TablePartModel {\n rId: string;\n}\n\nclass TablePartXform extends BaseXform {\n get tag(): string {\n return \"tablePart\";\n }\n\n render(xmlStream: any, model?: TablePartModel): void {\n if (model) {\n xmlStream.leafNode(this.tag, { \"r:id\": model.rId });\n }\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n this.model = {\n rId: node.attributes[\"r:id\"]\n };\n return true;\n default:\n return false;\n }\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { TablePartXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\n/**\n * Xform for individual page break (brk element)\n * Used by both RowBreaksXform and ColBreaksXform\n */\nclass PageBreaksXform extends BaseXform {\n declare public model: any;\n\n get tag(): string {\n return \"brk\";\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.leafNode(\"brk\", model);\n }\n\n parseOpen(node: any): boolean {\n if (node.name === \"brk\") {\n const { id, max, man, min } = node.attributes;\n this.model = {\n id: +id,\n max: +max,\n man: +man\n };\n if (min !== undefined) {\n this.model.min = +min;\n }\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { PageBreaksXform };\n","import { PageBreaksXform } from \"@excel/xlsx/xform/sheet/page-breaks-xform\";\nimport { ListXform } from \"@excel/xlsx/xform/list-xform\";\n\n/**\n * Xform for row page breaks (rowBreaks element in worksheet XML)\n * Used to define manual page breaks between rows when printing.\n */\nclass RowBreaksXform extends ListXform {\n constructor() {\n super({\n tag: \"rowBreaks\",\n count: true,\n childXform: new PageBreaksXform()\n });\n }\n\n // Override to add manualBreakCount attribute required by Excel\n render(xmlStream: any, model: any): void {\n if (model && model.length) {\n xmlStream.openNode(this.tag, this.$);\n xmlStream.addAttribute(this.$count, model.length);\n xmlStream.addAttribute(\"manualBreakCount\", model.length);\n\n const { childXform } = this;\n for (const childModel of model) {\n childXform.render(xmlStream, childModel);\n }\n xmlStream.closeNode();\n }\n }\n}\n\nexport { RowBreaksXform };\n","import { PageBreaksXform } from \"@excel/xlsx/xform/sheet/page-breaks-xform\";\nimport { ListXform } from \"@excel/xlsx/xform/list-xform\";\n\n/**\n * Xform for column page breaks (colBreaks element in worksheet XML)\n * Used to define manual page breaks between columns when printing.\n *\n * XML structure:\n * <colBreaks count=\"3\" manualBreakCount=\"3\">\n * <brk id=\"3\" max=\"1048575\" man=\"1\"/>\n * <brk id=\"6\" max=\"1048575\" man=\"1\"/>\n * </colBreaks>\n */\nclass ColBreaksXform extends ListXform {\n constructor() {\n super({\n tag: \"colBreaks\",\n count: true,\n childXform: new PageBreaksXform()\n });\n }\n\n // Override to add manualBreakCount attribute required by Excel\n render(xmlStream: any, model: any): void {\n if (model && model.length) {\n xmlStream.openNode(this.tag, this.$);\n xmlStream.addAttribute(this.$count, model.length);\n xmlStream.addAttribute(\"manualBreakCount\", model.length);\n\n const { childXform } = this;\n for (const childModel of model) {\n childXform.render(xmlStream, childModel);\n }\n xmlStream.closeNode();\n }\n }\n}\n\nexport { ColBreaksXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface HeaderFooterModel {\n differentFirst?: boolean;\n differentOddEven?: boolean;\n oddHeader?: string;\n oddFooter?: string;\n evenHeader?: string;\n evenFooter?: string;\n firstHeader?: string;\n firstFooter?: string;\n}\n\nclass HeaderFooterXform extends BaseXform {\n declare private currentNode?: string;\n\n get tag(): string {\n return \"headerFooter\";\n }\n\n render(xmlStream: any, model?: HeaderFooterModel): void {\n if (model) {\n xmlStream.addRollback();\n\n let createTag = false;\n\n xmlStream.openNode(\"headerFooter\");\n if (model.differentFirst) {\n xmlStream.addAttribute(\"differentFirst\", \"1\");\n createTag = true;\n }\n if (model.differentOddEven) {\n xmlStream.addAttribute(\"differentOddEven\", \"1\");\n createTag = true;\n }\n if (model.oddHeader && typeof model.oddHeader === \"string\") {\n xmlStream.leafNode(\"oddHeader\", null, model.oddHeader);\n createTag = true;\n }\n if (model.oddFooter && typeof model.oddFooter === \"string\") {\n xmlStream.leafNode(\"oddFooter\", null, model.oddFooter);\n createTag = true;\n }\n if (model.evenHeader && typeof model.evenHeader === \"string\") {\n xmlStream.leafNode(\"evenHeader\", null, model.evenHeader);\n createTag = true;\n }\n if (model.evenFooter && typeof model.evenFooter === \"string\") {\n xmlStream.leafNode(\"evenFooter\", null, model.evenFooter);\n createTag = true;\n }\n if (model.firstHeader && typeof model.firstHeader === \"string\") {\n xmlStream.leafNode(\"firstHeader\", null, model.firstHeader);\n createTag = true;\n }\n if (model.firstFooter && typeof model.firstFooter === \"string\") {\n xmlStream.leafNode(\"firstFooter\", null, model.firstFooter);\n createTag = true;\n }\n\n if (createTag) {\n xmlStream.closeNode();\n xmlStream.commit();\n } else {\n xmlStream.rollback();\n }\n }\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case \"headerFooter\":\n this.model = {};\n if (node.attributes.differentFirst) {\n this.model.differentFirst = parseInt(node.attributes.differentFirst, 0) === 1;\n }\n if (node.attributes.differentOddEven) {\n this.model.differentOddEven = parseInt(node.attributes.differentOddEven, 0) === 1;\n }\n return true;\n\n case \"oddHeader\":\n this.currentNode = \"oddHeader\";\n return true;\n\n case \"oddFooter\":\n this.currentNode = \"oddFooter\";\n return true;\n\n case \"evenHeader\":\n this.currentNode = \"evenHeader\";\n return true;\n\n case \"evenFooter\":\n this.currentNode = \"evenFooter\";\n return true;\n\n case \"firstHeader\":\n this.currentNode = \"firstHeader\";\n return true;\n\n case \"firstFooter\":\n this.currentNode = \"firstFooter\";\n return true;\n\n default:\n return false;\n }\n }\n\n parseText(text: string): void {\n switch (this.currentNode) {\n case \"oddHeader\":\n this.model.oddHeader = (this.model.oddHeader || \"\") + text;\n break;\n\n case \"oddFooter\":\n this.model.oddFooter = (this.model.oddFooter || \"\") + text;\n break;\n\n case \"evenHeader\":\n this.model.evenHeader = (this.model.evenHeader || \"\") + text;\n break;\n\n case \"evenFooter\":\n this.model.evenFooter = (this.model.evenFooter || \"\") + text;\n break;\n\n case \"firstHeader\":\n this.model.firstHeader = (this.model.firstHeader || \"\") + text;\n break;\n\n case \"firstFooter\":\n this.model.firstFooter = (this.model.firstFooter || \"\") + text;\n break;\n\n default:\n break;\n }\n }\n\n parseClose(): boolean {\n switch (this.currentNode) {\n case \"oddHeader\":\n case \"oddFooter\":\n case \"evenHeader\":\n case \"evenFooter\":\n case \"firstHeader\":\n case \"firstFooter\":\n this.currentNode = undefined;\n return true;\n\n default:\n return false;\n }\n }\n}\n\nexport { HeaderFooterXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\n/* 'virtual' methods used as a form of documentation */\n\n// base class for xforms that are composed of other xforms\n// offers some default implementations\nclass CompositeXform extends BaseXform {\n declare public parser?: any;\n\n createNewModel(_node?: any): any {\n return {};\n }\n\n parseOpen(node: any): boolean {\n // Typical pattern for composite xform\n this.parser = this.parser || this.map![node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n\n if (node.name === this.tag) {\n this.model = this.createNewModel(node);\n return true;\n }\n\n return false;\n }\n\n parseText(text: string): void {\n // Default implementation. Send text to child parser\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n onParserClose(name: string, parser: any): void {\n // parseClose has seen a child parser close\n // now need to incorporate into this.model somehow\n this.model[name] = parser.model;\n }\n\n parseClose(name: string): boolean {\n // Default implementation\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.onParserClose(name, this.parser);\n this.parser = undefined;\n }\n return true;\n }\n\n return name !== this.tag;\n }\n\n get tag(): string {\n return \"\";\n }\n}\n\nexport { CompositeXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\nclass CfvoXform extends BaseXform {\n get tag(): string {\n return \"cfvo\";\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.leafNode(this.tag, {\n type: model.type,\n val: model.value\n });\n }\n\n parseOpen(node: any): void {\n this.model = {\n type: node.attributes.type,\n value: BaseXform.toFloatValue(node.attributes.val)\n };\n }\n\n parseClose(name: string): boolean {\n return name !== this.tag;\n }\n}\n\nexport { CfvoXform };\n","import { CompositeXform } from \"@excel/xlsx/xform/composite-xform\";\nimport { ColorXform } from \"@excel/xlsx/xform/style/color-xform\";\nimport { CfvoXform } from \"@excel/xlsx/xform/sheet/cf/cfvo-xform\";\n\nclass DatabarXform extends CompositeXform {\n cfvoXform: CfvoXform;\n colorXform: ColorXform;\n\n constructor() {\n super();\n\n this.map = {\n cfvo: (this.cfvoXform = new CfvoXform()),\n color: (this.colorXform = new ColorXform())\n };\n }\n\n get tag(): string {\n return \"dataBar\";\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.openNode(this.tag);\n\n model.cfvo.forEach((cfvo: any) => {\n this.cfvoXform.render(xmlStream, cfvo);\n });\n this.colorXform.render(xmlStream, model.color);\n\n xmlStream.closeNode();\n }\n\n createNewModel(): any {\n return {\n cfvo: []\n };\n }\n\n onParserClose(name: string, parser: any): void {\n switch (name) {\n case \"cfvo\":\n this.model.cfvo.push(parser.model);\n break;\n case \"color\":\n this.model.color = parser.model;\n break;\n }\n }\n}\n\nexport { DatabarXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { CompositeXform } from \"@excel/xlsx/xform/composite-xform\";\n\nclass X14IdXform extends BaseXform {\n get tag(): string {\n return \"x14:id\";\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.leafNode(this.tag, null, model);\n }\n\n parseOpen(): void {\n this.model = \"\";\n }\n\n parseText(text: string): void {\n this.model += text;\n }\n\n parseClose(name: string): boolean {\n return name !== this.tag;\n }\n}\n\nclass ExtXform extends CompositeXform {\n idXform: X14IdXform;\n\n constructor() {\n super();\n\n this.map = {\n \"x14:id\": (this.idXform = new X14IdXform())\n };\n }\n\n get tag(): string {\n return \"ext\";\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.openNode(this.tag, {\n uri: \"{B025F937-C7B1-47D3-B67F-A62EFF666E3E}\",\n \"xmlns:x14\": \"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main\"\n });\n\n this.idXform.render(xmlStream, model.x14Id);\n\n xmlStream.closeNode();\n }\n\n createNewModel(): any {\n return {};\n }\n\n onParserClose(name: string, parser: any): void {\n this.model.x14Id = parser.model;\n }\n}\n\nclass ExtLstRefXform extends CompositeXform {\n constructor() {\n super();\n this.map = {\n ext: new ExtXform()\n };\n }\n\n get tag(): string {\n return \"extLst\";\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.openNode(this.tag);\n this.map.ext.render(xmlStream, model);\n xmlStream.closeNode();\n }\n\n createNewModel(): any {\n return {};\n }\n\n onParserClose(name: string, parser: any): void {\n Object.assign(this.model, parser.model);\n }\n}\n\nexport { ExtLstRefXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\nclass FormulaXform extends BaseXform {\n get tag(): string {\n return \"formula\";\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.leafNode(this.tag, null, model);\n }\n\n parseOpen(): void {\n this.model = \"\";\n }\n\n parseText(text: string): void {\n this.model += text;\n }\n\n parseClose(name: string): boolean {\n return name !== this.tag;\n }\n}\n\nexport { FormulaXform };\n","import { CompositeXform } from \"@excel/xlsx/xform/composite-xform\";\nimport { ColorXform } from \"@excel/xlsx/xform/style/color-xform\";\nimport { CfvoXform } from \"@excel/xlsx/xform/sheet/cf/cfvo-xform\";\n\nclass ColorScaleXform extends CompositeXform {\n cfvoXform: CfvoXform;\n colorXform: ColorXform;\n\n constructor() {\n super();\n\n this.map = {\n cfvo: (this.cfvoXform = new CfvoXform()),\n color: (this.colorXform = new ColorXform())\n };\n }\n\n get tag(): string {\n return \"colorScale\";\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.openNode(this.tag);\n\n model.cfvo.forEach((cfvo: any) => {\n this.cfvoXform.render(xmlStream, cfvo);\n });\n model.color.forEach((color: any) => {\n this.colorXform.render(xmlStream, color);\n });\n\n xmlStream.closeNode();\n }\n\n createNewModel(node: any): any {\n return {\n cfvo: [],\n color: []\n };\n }\n\n onParserClose(name: string, parser: any): void {\n this.model[name].push(parser.model);\n }\n}\n\nexport { ColorScaleXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { CompositeXform } from \"@excel/xlsx/xform/composite-xform\";\nimport { CfvoXform } from \"@excel/xlsx/xform/sheet/cf/cfvo-xform\";\n\nclass IconSetXform extends CompositeXform {\n cfvoXform: CfvoXform;\n\n constructor() {\n super();\n\n this.map = {\n cfvo: (this.cfvoXform = new CfvoXform())\n };\n }\n\n get tag(): string {\n return \"iconSet\";\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.openNode(this.tag, {\n iconSet: BaseXform.toStringAttribute(model.iconSet, \"3TrafficLights\"),\n reverse: BaseXform.toBoolAttribute(model.reverse, false),\n showValue: BaseXform.toBoolAttribute(model.showValue, true)\n });\n\n model.cfvo.forEach((cfvo: any) => {\n this.cfvoXform.render(xmlStream, cfvo);\n });\n\n xmlStream.closeNode();\n }\n\n createNewModel({ attributes }: any): any {\n return {\n iconSet: BaseXform.toStringValue(attributes.iconSet, \"3TrafficLights\"),\n reverse: BaseXform.toBoolValue(attributes.reverse),\n showValue: BaseXform.toBoolValue(attributes.showValue),\n cfvo: []\n };\n }\n\n onParserClose(name: string, parser: any): void {\n this.model[name].push(parser.model);\n }\n}\n\nexport { IconSetXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { CompositeXform } from \"@excel/xlsx/xform/composite-xform\";\nimport { Range } from \"@excel/range\";\nimport { DatabarXform } from \"@excel/xlsx/xform/sheet/cf/databar-xform\";\nimport { ExtLstRefXform } from \"@excel/xlsx/xform/sheet/cf/ext-lst-ref-xform\";\nimport { FormulaXform } from \"@excel/xlsx/xform/sheet/cf/formula-xform\";\nimport { ColorScaleXform } from \"@excel/xlsx/xform/sheet/cf/color-scale-xform\";\nimport { IconSetXform } from \"@excel/xlsx/xform/sheet/cf/icon-set-xform\";\n\nconst extIcons = {\n \"3Triangles\": true,\n \"3Stars\": true,\n \"5Boxes\": true\n};\n\nconst getTextFormula = model => {\n if (model.formulae && model.formulae[0]) {\n return model.formulae[0];\n }\n\n const range = new Range(model.ref);\n const { tl } = range;\n switch (model.operator) {\n case \"containsText\":\n return `NOT(ISERROR(SEARCH(\"${model.text}\",${tl})))`;\n case \"containsBlanks\":\n return `LEN(TRIM(${tl}))=0`;\n case \"notContainsBlanks\":\n return `LEN(TRIM(${tl}))>0`;\n case \"containsErrors\":\n return `ISERROR(${tl})`;\n case \"notContainsErrors\":\n return `NOT(ISERROR(${tl}))`;\n default:\n return undefined;\n }\n};\n\nconst getTimePeriodFormula = model => {\n if (model.formulae && model.formulae[0]) {\n return model.formulae[0];\n }\n\n const range = new Range(model.ref);\n const { tl } = range;\n switch (model.timePeriod) {\n case \"thisWeek\":\n return `AND(TODAY()-ROUNDDOWN(${tl},0)<=WEEKDAY(TODAY())-1,ROUNDDOWN(${tl},0)-TODAY()<=7-WEEKDAY(TODAY()))`;\n case \"lastWeek\":\n return `AND(TODAY()-ROUNDDOWN(${tl},0)>=(WEEKDAY(TODAY())),TODAY()-ROUNDDOWN(${tl},0)<(WEEKDAY(TODAY())+7))`;\n case \"nextWeek\":\n return `AND(ROUNDDOWN(${tl},0)-TODAY()>(7-WEEKDAY(TODAY())),ROUNDDOWN(${tl},0)-TODAY()<(15-WEEKDAY(TODAY())))`;\n case \"yesterday\":\n return `FLOOR(${tl},1)=TODAY()-1`;\n case \"today\":\n return `FLOOR(${tl},1)=TODAY()`;\n case \"tomorrow\":\n return `FLOOR(${tl},1)=TODAY()+1`;\n case \"last7Days\":\n return `AND(TODAY()-FLOOR(${tl},1)<=6,FLOOR(${tl},1)<=TODAY())`;\n case \"lastMonth\":\n return `AND(MONTH(${tl})=MONTH(EDATE(TODAY(),0-1)),YEAR(${tl})=YEAR(EDATE(TODAY(),0-1)))`;\n case \"thisMonth\":\n return `AND(MONTH(${tl})=MONTH(TODAY()),YEAR(${tl})=YEAR(TODAY()))`;\n case \"nextMonth\":\n return `AND(MONTH(${tl})=MONTH(EDATE(TODAY(),0+1)),YEAR(${tl})=YEAR(EDATE(TODAY(),0+1)))`;\n default:\n return undefined;\n }\n};\n\nconst opType = attributes => {\n const { type, operator } = attributes;\n switch (type) {\n case \"containsText\":\n case \"containsBlanks\":\n case \"notContainsBlanks\":\n case \"containsErrors\":\n case \"notContainsErrors\":\n return {\n type: \"containsText\",\n operator: type\n };\n\n default:\n return { type, operator };\n }\n};\n\nclass CfRuleXform extends CompositeXform {\n databarXform: DatabarXform;\n extLstRefXform: ExtLstRefXform;\n formulaXform: FormulaXform;\n colorScaleXform: ColorScaleXform;\n iconSetXform: IconSetXform;\n\n constructor() {\n super();\n\n this.map = {\n dataBar: (this.databarXform = new DatabarXform()),\n extLst: (this.extLstRefXform = new ExtLstRefXform()),\n formula: (this.formulaXform = new FormulaXform()),\n colorScale: (this.colorScaleXform = new ColorScaleXform()),\n iconSet: (this.iconSetXform = new IconSetXform())\n };\n }\n\n get tag() {\n return \"cfRule\";\n }\n\n static isPrimitive(rule) {\n // is this rule primitive?\n if (rule.type === \"iconSet\") {\n if (rule.custom || extIcons[rule.iconSet]) {\n return false;\n }\n }\n return true;\n }\n\n render(xmlStream, model) {\n switch (model.type) {\n case \"expression\":\n this.renderExpression(xmlStream, model);\n break;\n case \"cellIs\":\n this.renderCellIs(xmlStream, model);\n break;\n case \"top10\":\n this.renderTop10(xmlStream, model);\n break;\n case \"aboveAverage\":\n this.renderAboveAverage(xmlStream, model);\n break;\n case \"dataBar\":\n this.renderDataBar(xmlStream, model);\n break;\n case \"colorScale\":\n this.renderColorScale(xmlStream, model);\n break;\n case \"iconSet\":\n this.renderIconSet(xmlStream, model);\n break;\n case \"containsText\":\n this.renderText(xmlStream, model);\n break;\n case \"timePeriod\":\n this.renderTimePeriod(xmlStream, model);\n break;\n }\n }\n\n renderExpression(xmlStream, model) {\n xmlStream.openNode(this.tag, {\n type: \"expression\",\n dxfId: model.dxfId,\n priority: model.priority\n });\n\n this.formulaXform.render(xmlStream, model.formulae[0]);\n\n xmlStream.closeNode();\n }\n\n renderCellIs(xmlStream, model) {\n xmlStream.openNode(this.tag, {\n type: \"cellIs\",\n dxfId: model.dxfId,\n priority: model.priority,\n operator: model.operator\n });\n\n model.formulae.forEach(formula => {\n this.formulaXform.render(xmlStream, formula);\n });\n\n xmlStream.closeNode();\n }\n\n renderTop10(xmlStream, model) {\n xmlStream.leafNode(this.tag, {\n type: \"top10\",\n dxfId: model.dxfId,\n priority: model.priority,\n percent: BaseXform.toBoolAttribute(model.percent, false),\n bottom: BaseXform.toBoolAttribute(model.bottom, false),\n rank: BaseXform.toIntValue(model.rank, 10)\n });\n }\n\n renderAboveAverage(xmlStream, model) {\n xmlStream.leafNode(this.tag, {\n type: \"aboveAverage\",\n dxfId: model.dxfId,\n priority: model.priority,\n aboveAverage: BaseXform.toBoolAttribute(model.aboveAverage, true)\n });\n }\n\n renderDataBar(xmlStream, model) {\n xmlStream.openNode(this.tag, {\n type: \"dataBar\",\n priority: model.priority\n });\n\n this.databarXform.render(xmlStream, model);\n this.extLstRefXform.render(xmlStream, model);\n\n xmlStream.closeNode();\n }\n\n renderColorScale(xmlStream, model) {\n xmlStream.openNode(this.tag, {\n type: \"colorScale\",\n priority: model.priority\n });\n\n this.colorScaleXform.render(xmlStream, model);\n\n xmlStream.closeNode();\n }\n\n renderIconSet(xmlStream, model) {\n // iconset is all primitive or all extLst\n if (!CfRuleXform.isPrimitive(model)) {\n return;\n }\n\n xmlStream.openNode(this.tag, {\n type: \"iconSet\",\n priority: model.priority\n });\n\n this.iconSetXform.render(xmlStream, model);\n\n xmlStream.closeNode();\n }\n\n renderText(xmlStream, model) {\n xmlStream.openNode(this.tag, {\n type: model.operator,\n dxfId: model.dxfId,\n priority: model.priority,\n operator: BaseXform.toStringAttribute(model.operator, \"containsText\")\n });\n\n const formula = getTextFormula(model);\n if (formula) {\n this.formulaXform.render(xmlStream, formula);\n }\n\n xmlStream.closeNode();\n }\n\n renderTimePeriod(xmlStream, model) {\n xmlStream.openNode(this.tag, {\n type: \"timePeriod\",\n dxfId: model.dxfId,\n priority: model.priority,\n timePeriod: model.timePeriod\n });\n\n const formula = getTimePeriodFormula(model);\n if (formula) {\n this.formulaXform.render(xmlStream, formula);\n }\n\n xmlStream.closeNode();\n }\n\n createNewModel({ attributes }) {\n return {\n ...opType(attributes),\n dxfId: BaseXform.toIntValue(attributes.dxfId),\n priority: BaseXform.toIntValue(attributes.priority),\n timePeriod: attributes.timePeriod,\n percent: BaseXform.toBoolValue(attributes.percent),\n bottom: BaseXform.toBoolValue(attributes.bottom),\n rank: BaseXform.toIntValue(attributes.rank),\n aboveAverage: BaseXform.toBoolValue(attributes.aboveAverage)\n };\n }\n\n onParserClose(name, parser) {\n switch (name) {\n case \"dataBar\":\n case \"extLst\":\n case \"colorScale\":\n case \"iconSet\":\n // merge parser model with ours\n Object.assign(this.model, parser.model);\n break;\n\n case \"formula\":\n // except - formula is a string and appends to formulae\n this.model.formulae = this.model.formulae || [];\n this.model.formulae.push(parser.model);\n break;\n }\n }\n}\n\nexport { CfRuleXform };\n","import { CompositeXform } from \"@excel/xlsx/xform/composite-xform\";\nimport { CfRuleXform } from \"@excel/xlsx/xform/sheet/cf/cf-rule-xform\";\n\nclass ConditionalFormattingXform extends CompositeXform {\n constructor() {\n super();\n\n this.map = {\n cfRule: new CfRuleXform()\n };\n }\n\n get tag(): string {\n return \"conditionalFormatting\";\n }\n\n render(xmlStream: any, model: any): void {\n // if there are no primitive rules, exit now\n if (!model.rules.some(CfRuleXform.isPrimitive)) {\n return;\n }\n\n xmlStream.openNode(this.tag, { sqref: model.ref });\n\n model.rules.forEach((rule: any) => {\n if (CfRuleXform.isPrimitive(rule)) {\n rule.ref = model.ref;\n this.map.cfRule.render(xmlStream, rule);\n }\n });\n\n xmlStream.closeNode();\n }\n\n createNewModel({ attributes }: any): any {\n return {\n ref: attributes.sqref,\n rules: []\n };\n }\n\n onParserClose(name: string, parser: any): void {\n this.model.rules.push(parser.model);\n }\n}\n\nexport { ConditionalFormattingXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { ConditionalFormattingXform } from \"@excel/xlsx/xform/sheet/cf/conditional-formatting-xform\";\n\nclass ConditionalFormattingsXform extends BaseXform {\n cfXform: ConditionalFormattingXform;\n parser: any;\n\n constructor() {\n super();\n\n this.cfXform = new ConditionalFormattingXform();\n }\n\n get tag(): string {\n return \"conditionalFormatting\";\n }\n\n reset(): void {\n this.model = [];\n }\n\n prepare(model: any, options: any): void {\n // ensure each rule has a priority value\n let nextPriority = model.reduce(\n (p: number, cf: any) => Math.max(p, ...cf.rules.map((rule: any) => rule.priority || 0)),\n 1\n );\n model.forEach((cf: any) => {\n cf.rules.forEach((rule: any) => {\n if (!rule.priority) {\n rule.priority = nextPriority++;\n }\n\n if (rule.style) {\n rule.dxfId = options.styles.addDxfStyle(rule.style);\n }\n });\n });\n }\n\n render(xmlStream: any, model: any): void {\n model.forEach((cf: any) => {\n this.cfXform.render(xmlStream, cf);\n });\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n\n switch (node.name) {\n case \"conditionalFormatting\":\n this.parser = this.cfXform;\n this.parser.parseOpen(node);\n return true;\n\n default:\n return false;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.model.push(this.parser.model);\n this.parser = undefined;\n return false;\n }\n return true;\n }\n return false;\n }\n\n reconcile(model: any, options: any): void {\n model.forEach((cf: any) => {\n cf.rules.forEach((rule: any) => {\n if (rule.dxfId !== undefined) {\n rule.style = options.styles.getDxfStyle(rule.dxfId);\n delete rule.dxfId;\n }\n });\n });\n }\n}\n\nexport { ConditionalFormattingsXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\nclass FExtXform extends BaseXform {\n get tag() {\n return \"xm:f\";\n }\n\n render(xmlStream, model) {\n xmlStream.leafNode(this.tag, null, model);\n }\n\n parseOpen() {\n this.model = \"\";\n }\n\n parseText(text) {\n this.model += text;\n }\n\n parseClose(name) {\n return name !== this.tag;\n }\n}\n\nexport { FExtXform };\n","import { CompositeXform } from \"@excel/xlsx/xform/composite-xform\";\nimport { FExtXform } from \"@excel/xlsx/xform/sheet/cf-ext/f-ext-xform\";\n\nclass CfvoExtXform extends CompositeXform {\n fExtXform: FExtXform;\n\n constructor() {\n super();\n\n this.map = {\n \"xm:f\": (this.fExtXform = new FExtXform())\n };\n }\n\n get tag() {\n return \"x14:cfvo\";\n }\n\n render(xmlStream, model) {\n xmlStream.openNode(this.tag, {\n type: model.type\n });\n if (model.value !== undefined) {\n this.fExtXform.render(xmlStream, model.value);\n }\n xmlStream.closeNode();\n }\n\n createNewModel(node) {\n return {\n type: node.attributes.type\n };\n }\n\n onParserClose(name, parser) {\n switch (name) {\n case \"xm:f\":\n this.model.value = parser.model ? parseFloat(parser.model) : 0;\n break;\n }\n }\n}\n\nexport { CfvoExtXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { CompositeXform } from \"@excel/xlsx/xform/composite-xform\";\nimport { ColorXform } from \"@excel/xlsx/xform/style/color-xform\";\nimport { CfvoExtXform } from \"@excel/xlsx/xform/sheet/cf-ext/cfvo-ext-xform\";\n\nclass DatabarExtXform extends CompositeXform {\n cfvoXform: CfvoExtXform;\n borderColorXform: ColorXform;\n negativeBorderColorXform: ColorXform;\n negativeFillColorXform: ColorXform;\n axisColorXform: ColorXform;\n\n constructor() {\n super();\n\n this.map = {\n \"x14:cfvo\": (this.cfvoXform = new CfvoExtXform()),\n \"x14:borderColor\": (this.borderColorXform = new ColorXform(\"x14:borderColor\")),\n \"x14:negativeBorderColor\": (this.negativeBorderColorXform = new ColorXform(\n \"x14:negativeBorderColor\"\n )),\n \"x14:negativeFillColor\": (this.negativeFillColorXform = new ColorXform(\n \"x14:negativeFillColor\"\n )),\n \"x14:axisColor\": (this.axisColorXform = new ColorXform(\"x14:axisColor\"))\n };\n }\n\n static isExt(rule) {\n // not all databars need ext\n // TODO: refine this\n return !rule.gradient;\n }\n\n get tag() {\n return \"x14:dataBar\";\n }\n\n render(xmlStream, model) {\n xmlStream.openNode(this.tag, {\n minLength: BaseXform.toIntAttribute(model.minLength, 0, true),\n maxLength: BaseXform.toIntAttribute(model.maxLength, 100, true),\n border: BaseXform.toBoolAttribute(model.border, false),\n gradient: BaseXform.toBoolAttribute(model.gradient, true),\n negativeBarColorSameAsPositive: BaseXform.toBoolAttribute(\n model.negativeBarColorSameAsPositive,\n true\n ),\n negativeBarBorderColorSameAsPositive: BaseXform.toBoolAttribute(\n model.negativeBarBorderColorSameAsPositive,\n true\n ),\n axisPosition: BaseXform.toAttribute(model.axisPosition, \"auto\"),\n direction: BaseXform.toAttribute(model.direction, \"leftToRight\")\n });\n\n model.cfvo.forEach(cfvo => {\n this.cfvoXform.render(xmlStream, cfvo);\n });\n\n this.borderColorXform.render(xmlStream, model.borderColor);\n this.negativeBorderColorXform.render(xmlStream, model.negativeBorderColor);\n this.negativeFillColorXform.render(xmlStream, model.negativeFillColor);\n this.axisColorXform.render(xmlStream, model.axisColor);\n\n xmlStream.closeNode();\n }\n\n createNewModel({ attributes }) {\n return {\n cfvo: [],\n minLength: BaseXform.toIntValue(attributes.minLength, 0),\n maxLength: BaseXform.toIntValue(attributes.maxLength, 100),\n border: BaseXform.toBoolValue(attributes.border, false),\n gradient: BaseXform.toBoolValue(attributes.gradient, true),\n negativeBarColorSameAsPositive: BaseXform.toBoolValue(\n attributes.negativeBarColorSameAsPositive,\n true\n ),\n negativeBarBorderColorSameAsPositive: BaseXform.toBoolValue(\n attributes.negativeBarBorderColorSameAsPositive,\n true\n ),\n axisPosition: BaseXform.toStringValue(attributes.axisPosition, \"auto\"),\n direction: BaseXform.toStringValue(attributes.direction, \"leftToRight\")\n };\n }\n\n onParserClose(name, parser) {\n const [, prop] = name.split(\":\");\n switch (prop) {\n case \"cfvo\":\n this.model.cfvo.push(parser.model);\n break;\n\n default:\n this.model[prop] = parser.model;\n break;\n }\n }\n}\n\nexport { DatabarExtXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\nclass CfIconExtXform extends BaseXform {\n get tag() {\n return \"x14:cfIcon\";\n }\n\n render(xmlStream, model) {\n xmlStream.leafNode(this.tag, {\n iconSet: model.iconSet,\n iconId: model.iconId\n });\n }\n\n parseOpen({ attributes }) {\n this.model = {\n iconSet: attributes.iconSet,\n iconId: BaseXform.toIntValue(attributes.iconId)\n };\n }\n\n parseClose(name) {\n return name !== this.tag;\n }\n}\n\nexport { CfIconExtXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { CompositeXform } from \"@excel/xlsx/xform/composite-xform\";\nimport { CfvoExtXform } from \"@excel/xlsx/xform/sheet/cf-ext/cfvo-ext-xform\";\nimport { CfIconExtXform } from \"@excel/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform\";\n\nclass IconSetExtXform extends CompositeXform {\n cfvoXform: CfvoExtXform;\n cfIconXform: CfIconExtXform;\n\n constructor() {\n super();\n\n this.map = {\n \"x14:cfvo\": (this.cfvoXform = new CfvoExtXform()),\n \"x14:cfIcon\": (this.cfIconXform = new CfIconExtXform())\n };\n }\n\n get tag() {\n return \"x14:iconSet\";\n }\n\n render(xmlStream, model) {\n xmlStream.openNode(this.tag, {\n iconSet: BaseXform.toStringAttribute(model.iconSet),\n reverse: BaseXform.toBoolAttribute(model.reverse, false),\n showValue: BaseXform.toBoolAttribute(model.showValue, true),\n custom: BaseXform.toBoolAttribute(model.icons, false)\n });\n\n model.cfvo.forEach(cfvo => {\n this.cfvoXform.render(xmlStream, cfvo);\n });\n\n if (model.icons) {\n model.icons.forEach((icon, i) => {\n icon.iconId = i;\n this.cfIconXform.render(xmlStream, icon);\n });\n }\n\n xmlStream.closeNode();\n }\n\n createNewModel({ attributes }) {\n return {\n cfvo: [],\n iconSet: BaseXform.toStringValue(attributes.iconSet, \"3TrafficLights\"),\n reverse: BaseXform.toBoolValue(attributes.reverse, false),\n showValue: BaseXform.toBoolValue(attributes.showValue, true)\n };\n }\n\n onParserClose(name, parser) {\n const [, prop] = name.split(\":\");\n switch (prop) {\n case \"cfvo\":\n this.model.cfvo.push(parser.model);\n break;\n\n case \"cfIcon\":\n if (!this.model.icons) {\n this.model.icons = [];\n }\n this.model.icons.push(parser.model);\n break;\n\n default:\n this.model[prop] = parser.model;\n break;\n }\n }\n}\n\nexport { IconSetExtXform };\n","function toHex(byte: number): string {\n return byte.toString(16).padStart(2, \"0\");\n}\n\nfunction bytesToUuidV4(bytes: Uint8Array): string {\n // RFC 4122, version 4 UUID\n // Set version (4) and variant (10xx)\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n\n const b = bytes;\n return (\n toHex(b[0]) +\n toHex(b[1]) +\n toHex(b[2]) +\n toHex(b[3]) +\n \"-\" +\n toHex(b[4]) +\n toHex(b[5]) +\n \"-\" +\n toHex(b[6]) +\n toHex(b[7]) +\n \"-\" +\n toHex(b[8]) +\n toHex(b[9]) +\n \"-\" +\n toHex(b[10]) +\n toHex(b[11]) +\n toHex(b[12]) +\n toHex(b[13]) +\n toHex(b[14]) +\n toHex(b[15])\n );\n}\n\n/**\n * Generate a UUID v4.\n *\n * This exists to avoid a hard dependency on `crypto.randomUUID()` so that\n * older supported browsers can still generate UUIDs.\n *\n * - Prefers `crypto.randomUUID()` when available.\n * - Falls back to `crypto.getRandomValues()`.\n * - Last-resort fallback uses `Math.random()` (NOT cryptographically secure).\n */\nexport function uuidV4(): string {\n const cryptoObj: any = (globalThis as any).crypto;\n\n if (cryptoObj?.randomUUID) {\n return cryptoObj.randomUUID();\n }\n\n const bytes = new Uint8Array(16);\n if (cryptoObj?.getRandomValues) {\n cryptoObj.getRandomValues(bytes);\n return bytesToUuidV4(bytes);\n }\n\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n return bytesToUuidV4(bytes);\n}\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { CompositeXform } from \"@excel/xlsx/xform/composite-xform\";\nimport { DatabarExtXform } from \"@excel/xlsx/xform/sheet/cf-ext/databar-ext-xform\";\nimport { IconSetExtXform } from \"@excel/xlsx/xform/sheet/cf-ext/icon-set-ext-xform\";\nimport { uuidV4 } from \"@utils/uuid\";\n\nconst extIcons = {\n \"3Triangles\": true,\n \"3Stars\": true,\n \"5Boxes\": true\n};\n\nclass CfRuleExtXform extends CompositeXform {\n databarXform: DatabarExtXform;\n iconSetXform: IconSetExtXform;\n\n constructor() {\n super();\n\n this.map = {\n \"x14:dataBar\": (this.databarXform = new DatabarExtXform()),\n \"x14:iconSet\": (this.iconSetXform = new IconSetExtXform())\n };\n }\n\n get tag() {\n return \"x14:cfRule\";\n }\n\n static isExt(rule) {\n // is this rule primitive?\n if (rule.type === \"dataBar\") {\n return DatabarExtXform.isExt(rule);\n }\n if (rule.type === \"iconSet\") {\n if (rule.custom || extIcons[rule.iconSet]) {\n return true;\n }\n }\n return false;\n }\n\n prepare(model) {\n if (CfRuleExtXform.isExt(model)) {\n model.x14Id = `{${uuidV4()}}`.toUpperCase();\n }\n }\n\n render(xmlStream, model) {\n if (!CfRuleExtXform.isExt(model)) {\n return;\n }\n\n switch (model.type) {\n case \"dataBar\":\n this.renderDataBar(xmlStream, model);\n break;\n case \"iconSet\":\n this.renderIconSet(xmlStream, model);\n break;\n }\n }\n\n renderDataBar(xmlStream, model) {\n xmlStream.openNode(this.tag, {\n type: \"dataBar\",\n id: model.x14Id\n });\n\n this.databarXform.render(xmlStream, model);\n\n xmlStream.closeNode();\n }\n\n renderIconSet(xmlStream, model) {\n xmlStream.openNode(this.tag, {\n type: \"iconSet\",\n priority: model.priority,\n id: model.x14Id || `{${uuidV4()}}`\n });\n\n this.iconSetXform.render(xmlStream, model);\n\n xmlStream.closeNode();\n }\n\n createNewModel({ attributes }) {\n return {\n type: attributes.type,\n x14Id: attributes.id,\n priority: BaseXform.toIntValue(attributes.priority)\n };\n }\n\n onParserClose(name, parser) {\n Object.assign(this.model, parser.model);\n }\n}\n\nexport { CfRuleExtXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\nclass SqrefExtXform extends BaseXform {\n get tag() {\n return \"xm:sqref\";\n }\n\n render(xmlStream, model) {\n xmlStream.leafNode(this.tag, null, model);\n }\n\n parseOpen() {\n this.model = \"\";\n }\n\n parseText(text) {\n this.model += text;\n }\n\n parseClose(name) {\n return name !== this.tag;\n }\n}\n\nexport { SqrefExtXform };\n","import { CompositeXform } from \"@excel/xlsx/xform/composite-xform\";\nimport { SqrefExtXform } from \"@excel/xlsx/xform/sheet/cf-ext/sqref-ext-xform\";\nimport { CfRuleExtXform } from \"@excel/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform\";\n\nclass ConditionalFormattingExtXform extends CompositeXform {\n sqRef: SqrefExtXform;\n cfRule: CfRuleExtXform;\n\n constructor() {\n super();\n\n this.map = {\n \"xm:sqref\": (this.sqRef = new SqrefExtXform()),\n \"x14:cfRule\": (this.cfRule = new CfRuleExtXform())\n };\n }\n\n get tag() {\n return \"x14:conditionalFormatting\";\n }\n\n prepare(model) {\n model.rules.forEach(rule => {\n this.cfRule.prepare(rule);\n });\n }\n\n render(xmlStream, model) {\n if (!model.rules.some(CfRuleExtXform.isExt)) {\n return;\n }\n\n xmlStream.openNode(this.tag, {\n \"xmlns:xm\": \"http://schemas.microsoft.com/office/excel/2006/main\"\n });\n\n model.rules.filter(CfRuleExtXform.isExt).forEach(rule => this.cfRule.render(xmlStream, rule));\n\n // for some odd reason, Excel needs the <xm:sqref> node to be after the rules\n this.sqRef.render(xmlStream, model.ref);\n\n xmlStream.closeNode();\n }\n\n createNewModel() {\n return {\n rules: []\n };\n }\n\n onParserClose(name, parser) {\n switch (name) {\n case \"xm:sqref\":\n this.model.ref = parser.model;\n break;\n\n case \"x14:cfRule\":\n this.model.rules.push(parser.model);\n break;\n }\n }\n}\n\nexport { ConditionalFormattingExtXform };\n","import { CompositeXform } from \"@excel/xlsx/xform/composite-xform\";\nimport { CfRuleExtXform } from \"@excel/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform\";\nimport { ConditionalFormattingExtXform } from \"@excel/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform\";\n\nclass ConditionalFormattingsExtXform extends CompositeXform {\n cfXform: ConditionalFormattingExtXform;\n\n constructor() {\n super();\n\n this.map = {\n \"x14:conditionalFormatting\": (this.cfXform = new ConditionalFormattingExtXform())\n };\n }\n\n get tag() {\n return \"x14:conditionalFormattings\";\n }\n\n hasContent(model) {\n if (model.hasExtContent === undefined) {\n model.hasExtContent = model.some(cf => cf.rules.some(CfRuleExtXform.isExt));\n }\n return model.hasExtContent;\n }\n\n prepare(model) {\n model.forEach(cf => {\n this.cfXform.prepare(cf);\n });\n }\n\n render(xmlStream, model) {\n if (this.hasContent(model)) {\n xmlStream.openNode(this.tag);\n model.forEach(cf => this.cfXform.render(xmlStream, cf));\n xmlStream.closeNode();\n }\n }\n\n createNewModel() {\n return [];\n }\n\n onParserClose(name, parser) {\n // model is array of conditional formatting objects\n this.model.push(parser.model);\n }\n}\n\nexport { ConditionalFormattingsExtXform };\n","import { CompositeXform } from \"@excel/xlsx/xform/composite-xform\";\nimport { ConditionalFormattingsExtXform } from \"@excel/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform\";\n\nclass ExtXform extends CompositeXform {\n declare public map: { [key: string]: any };\n declare public model: any;\n declare private conditionalFormattings: ConditionalFormattingsExtXform;\n\n constructor() {\n super();\n this.map = {\n \"x14:conditionalFormattings\": (this.conditionalFormattings =\n new ConditionalFormattingsExtXform())\n };\n }\n\n get tag(): string {\n return \"ext\";\n }\n\n hasContent(model: any): boolean {\n return this.conditionalFormattings.hasContent(model.conditionalFormattings);\n }\n\n prepare(model: any): void {\n this.conditionalFormattings.prepare(model.conditionalFormattings);\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.openNode(\"ext\", {\n uri: \"{78C0D931-6437-407d-A8EE-F0AAD7539E65}\",\n \"xmlns:x14\": \"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main\"\n });\n\n this.conditionalFormattings.render(xmlStream, model.conditionalFormattings);\n\n xmlStream.closeNode();\n }\n\n createNewModel(): any {\n return {};\n }\n\n onParserClose(name: string, parser: any): void {\n this.model[name] = parser.model;\n }\n}\n\nclass ExtLstXform extends CompositeXform {\n declare public map: { [key: string]: any };\n declare public model: any;\n declare private ext: ExtXform;\n\n constructor() {\n super();\n\n this.map = {\n ext: (this.ext = new ExtXform())\n };\n }\n\n get tag(): string {\n return \"extLst\";\n }\n\n prepare(model: any, _options?: any): void {\n this.ext.prepare(model);\n }\n\n hasContent(model: any): boolean {\n return this.ext.hasContent(model);\n }\n\n render(xmlStream: any, model: any): void {\n if (!this.hasContent(model)) {\n return;\n }\n\n xmlStream.openNode(\"extLst\");\n this.ext.render(xmlStream, model);\n xmlStream.closeNode();\n }\n\n createNewModel(): any {\n return {};\n }\n\n onParserClose(name: string, parser: any): void {\n this.model[name] = parser.model;\n }\n}\n\nexport { ExtLstXform };\n","import { colCache } from \"@excel/utils/col-cache\";\nimport { XmlStream } from \"@excel/utils/xml-stream\";\nimport { RelType } from \"@excel/xlsx/rel-type\";\nimport { Merges } from \"@excel/xlsx/xform/sheet/merges\";\nimport { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { ListXform } from \"@excel/xlsx/xform/list-xform\";\nimport { RowXform } from \"@excel/xlsx/xform/sheet/row-xform\";\nimport { ColXform } from \"@excel/xlsx/xform/sheet/col-xform\";\nimport { DimensionXform } from \"@excel/xlsx/xform/sheet/dimension-xform\";\nimport { HyperlinkXform } from \"@excel/xlsx/xform/sheet/hyperlink-xform\";\nimport { MergeCellXform } from \"@excel/xlsx/xform/sheet/merge-cell-xform\";\nimport { DataValidationsXform } from \"@excel/xlsx/xform/sheet/data-validations-xform\";\nimport { SheetPropertiesXform } from \"@excel/xlsx/xform/sheet/sheet-properties-xform\";\nimport { SheetFormatPropertiesXform } from \"@excel/xlsx/xform/sheet/sheet-format-properties-xform\";\nimport { SheetViewXform } from \"@excel/xlsx/xform/sheet/sheet-view-xform\";\nimport { SheetProtectionXform } from \"@excel/xlsx/xform/sheet/sheet-protection-xform\";\nimport { PageMarginsXform } from \"@excel/xlsx/xform/sheet/page-margins-xform\";\nimport { PageSetupXform } from \"@excel/xlsx/xform/sheet/page-setup-xform\";\nimport { PrintOptionsXform } from \"@excel/xlsx/xform/sheet/print-options-xform\";\nimport { AutoFilterXform } from \"@excel/xlsx/xform/sheet/auto-filter-xform\";\nimport { PictureXform } from \"@excel/xlsx/xform/sheet/picture-xform\";\nimport { DrawingXform } from \"@excel/xlsx/xform/sheet/drawing-xform\";\nimport { TablePartXform } from \"@excel/xlsx/xform/sheet/table-part-xform\";\nimport { RowBreaksXform } from \"@excel/xlsx/xform/sheet/row-breaks-xform\";\nimport { ColBreaksXform } from \"@excel/xlsx/xform/sheet/col-breaks-xform\";\nimport { HeaderFooterXform } from \"@excel/xlsx/xform/sheet/header-footer-xform\";\nimport { ConditionalFormattingsXform } from \"@excel/xlsx/xform/sheet/cf/conditional-formattings-xform\";\nimport { ExtLstXform } from \"@excel/xlsx/xform/sheet/ext-lst-xform\";\nimport {\n commentsRelTargetFromWorksheet,\n drawingRelTargetFromWorksheet,\n mediaRelTargetFromRels,\n pivotTableRelTargetFromWorksheet,\n tableRelTargetFromWorksheet,\n vmlDrawingRelTargetFromWorksheet\n} from \"@excel/utils/ooxml-paths\";\n\nconst mergeRule = (rule, extRule) => {\n Object.keys(extRule).forEach(key => {\n const value = rule[key];\n const extValue = extRule[key];\n if (value === undefined && extValue !== undefined) {\n rule[key] = extValue;\n }\n });\n};\n\nconst mergeConditionalFormattings = (model, extModel) => {\n // conditional formattings are rendered in worksheet.conditionalFormatting and also in\n // worksheet.extLst.ext.x14:conditionalFormattings\n // some (e.g. dataBar) are even spread across both!\n if (!extModel || !extModel.length) {\n return model;\n }\n if (!model || !model.length) {\n return extModel;\n }\n\n // index model rules by x14Id\n const cfMap = {};\n const ruleMap = {};\n model.forEach(cf => {\n cfMap[cf.ref] = cf;\n cf.rules.forEach(rule => {\n const { x14Id } = rule;\n if (x14Id) {\n ruleMap[x14Id] = rule;\n }\n });\n });\n\n extModel.forEach(extCf => {\n extCf.rules.forEach(extRule => {\n const rule = ruleMap[extRule.x14Id];\n if (rule) {\n // merge with matching rule\n mergeRule(rule, extRule);\n } else if (cfMap[extCf.ref]) {\n // reuse existing cf ref\n cfMap[extCf.ref].rules.push(extRule);\n } else {\n // create new cf\n model.push({\n ref: extCf.ref,\n rules: [extRule]\n });\n }\n });\n });\n\n // need to cope with rules in extModel that don't exist in model\n return model;\n};\n\nclass WorkSheetXform extends BaseXform {\n declare private ignoreNodes: string[];\n declare public parser: any;\n declare private preImageId: string | undefined;\n\n static WORKSHEET_ATTRIBUTES = {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\n \"xmlns:r\": \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\n \"xmlns:mc\": \"http://schemas.openxmlformats.org/markup-compatibility/2006\",\n \"xmlns:x14ac\": \"http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac\",\n \"mc:Ignorable\": \"x14ac\"\n };\n\n constructor(options?: any) {\n super();\n\n const { maxRows, maxCols, ignoreNodes } = options || {};\n\n this.ignoreNodes = ignoreNodes || [];\n\n this.map = {\n sheetPr: new SheetPropertiesXform(),\n dimension: new DimensionXform(),\n sheetViews: new ListXform({\n tag: \"sheetViews\",\n count: false,\n childXform: new SheetViewXform()\n }),\n sheetFormatPr: new SheetFormatPropertiesXform(),\n cols: new ListXform({ tag: \"cols\", count: false, childXform: new ColXform() }),\n sheetData: new ListXform({\n tag: \"sheetData\",\n count: false,\n empty: true,\n childXform: new RowXform({ maxItems: maxCols }),\n maxItems: maxRows\n }),\n autoFilter: new AutoFilterXform(),\n mergeCells: new ListXform({\n tag: \"mergeCells\",\n count: true,\n childXform: new MergeCellXform()\n }),\n rowBreaks: new RowBreaksXform(),\n colBreaks: new ColBreaksXform(),\n hyperlinks: new ListXform({\n tag: \"hyperlinks\",\n count: false,\n childXform: new HyperlinkXform()\n }),\n pageMargins: new PageMarginsXform(),\n dataValidations: new DataValidationsXform(),\n pageSetup: new PageSetupXform(),\n headerFooter: new HeaderFooterXform(),\n printOptions: new PrintOptionsXform(),\n picture: new PictureXform(),\n drawing: new DrawingXform(),\n sheetProtection: new SheetProtectionXform(),\n tableParts: new ListXform({\n tag: \"tableParts\",\n count: true,\n childXform: new TablePartXform()\n }),\n conditionalFormatting: new ConditionalFormattingsXform(),\n extLst: new ExtLstXform()\n };\n }\n\n prepare(model, options) {\n options.merges = new Merges();\n model.hyperlinks = options.hyperlinks = [];\n model.comments = options.comments = [];\n\n options.formulae = {};\n options.siFormulae = 0;\n this.map.cols.prepare(model.cols, options);\n this.map.sheetData.prepare(model.rows, options);\n this.map.conditionalFormatting.prepare(model.conditionalFormattings, options);\n\n model.mergeCells = options.merges.mergeCells;\n\n // prepare relationships\n const rels = (model.rels = []);\n\n function nextRid(r) {\n return `rId${r.length + 1}`;\n }\n\n model.hyperlinks.forEach(hyperlink => {\n const rId = nextRid(rels);\n hyperlink.rId = rId;\n rels.push({\n Id: rId,\n Type: RelType.Hyperlink,\n Target: hyperlink.target,\n TargetMode: \"External\"\n });\n });\n\n // prepare comment relationships\n if (model.comments.length > 0) {\n const comment = {\n Id: nextRid(rels),\n Type: RelType.Comments,\n Target: commentsRelTargetFromWorksheet(model.id)\n };\n rels.push(comment);\n const vmlDrawing = {\n Id: nextRid(rels),\n Type: RelType.VmlDrawing,\n Target: vmlDrawingRelTargetFromWorksheet(model.id)\n };\n rels.push(vmlDrawing);\n\n model.comments.forEach(item => {\n item.refAddress = colCache.decodeAddress(item.ref);\n });\n\n options.commentRefs.push({\n commentName: `comments${model.id}`,\n vmlDrawing: `vmlDrawing${model.id}`\n });\n }\n\n const drawingRelsHash = [];\n let bookImage;\n model.media.forEach(medium => {\n if (medium.type === \"background\") {\n const rId = nextRid(rels);\n bookImage = options.media[medium.imageId];\n rels.push({\n Id: rId,\n Type: RelType.Image,\n Target: mediaRelTargetFromRels(`${bookImage.name}.${bookImage.extension}`)\n });\n model.background = {\n rId\n };\n model.image = options.media[medium.imageId];\n } else if (medium.type === \"image\") {\n let { drawing } = model;\n bookImage = options.media[medium.imageId];\n if (!drawing) {\n drawing = model.drawing = {\n rId: nextRid(rels),\n name: `drawing${++options.drawingsCount}`,\n anchors: [],\n rels: []\n };\n options.drawings.push(drawing);\n rels.push({\n Id: drawing.rId,\n Type: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing\",\n Target: drawingRelTargetFromWorksheet(drawing.name)\n });\n }\n let rIdImage =\n this.preImageId === medium.imageId\n ? drawingRelsHash[medium.imageId]\n : drawingRelsHash[drawing.rels.length];\n if (!rIdImage) {\n rIdImage = nextRid(drawing.rels);\n drawingRelsHash[drawing.rels.length] = rIdImage;\n drawing.rels.push({\n Id: rIdImage,\n Type: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\",\n Target: mediaRelTargetFromRels(`${bookImage.name}.${bookImage.extension}`)\n });\n }\n\n const anchor: any = {\n picture: {\n rId: rIdImage\n },\n range: medium.range\n };\n if (medium.hyperlinks && medium.hyperlinks.hyperlink) {\n const rIdHyperLink = nextRid(drawing.rels);\n drawingRelsHash[drawing.rels.length] = rIdHyperLink;\n anchor.picture.hyperlinks = {\n tooltip: medium.hyperlinks.tooltip,\n rId: rIdHyperLink\n };\n drawing.rels.push({\n Id: rIdHyperLink,\n Type: RelType.Hyperlink,\n Target: medium.hyperlinks.hyperlink,\n TargetMode: \"External\"\n });\n }\n this.preImageId = medium.imageId;\n drawing.anchors.push(anchor);\n }\n });\n\n // prepare tables\n model.tables.forEach(table => {\n // relationships\n const rId = nextRid(rels);\n table.rId = rId;\n rels.push({\n Id: rId,\n Type: RelType.Table,\n Target: tableRelTargetFromWorksheet(table.target)\n });\n\n // dynamic styles\n table.columns.forEach(column => {\n const { style } = column;\n if (style) {\n column.dxfId = options.styles.addDxfStyle(style);\n }\n });\n });\n\n // prepare pivot tables\n (model.pivotTables || []).forEach((pivotTable: any) => {\n rels.push({\n Id: nextRid(rels),\n Type: RelType.PivotTable,\n Target: pivotTableRelTargetFromWorksheet(pivotTable.tableNumber)\n });\n });\n\n // prepare ext items\n this.map.extLst.prepare(model, options);\n }\n\n render(xmlStream, model) {\n xmlStream.openXml(XmlStream.StdDocAttributes);\n xmlStream.openNode(\"worksheet\", WorkSheetXform.WORKSHEET_ATTRIBUTES);\n\n const sheetFormatPropertiesModel: any = model.properties\n ? {\n defaultRowHeight: model.properties.defaultRowHeight,\n dyDescent: model.properties.dyDescent,\n outlineLevelCol: model.properties.outlineLevelCol,\n outlineLevelRow: model.properties.outlineLevelRow\n }\n : undefined;\n if (model.properties && model.properties.defaultColWidth) {\n sheetFormatPropertiesModel.defaultColWidth = model.properties.defaultColWidth;\n }\n const sheetPropertiesModel = {\n outlineProperties: model.properties && model.properties.outlineProperties,\n tabColor: model.properties && model.properties.tabColor,\n pageSetup:\n model.pageSetup && model.pageSetup.fitToPage\n ? {\n fitToPage: model.pageSetup.fitToPage\n }\n : undefined\n };\n const pageMarginsModel = model.pageSetup && model.pageSetup.margins;\n const printOptionsModel = {\n showRowColHeaders: model.pageSetup && model.pageSetup.showRowColHeaders,\n showGridLines: model.pageSetup && model.pageSetup.showGridLines,\n horizontalCentered: model.pageSetup && model.pageSetup.horizontalCentered,\n verticalCentered: model.pageSetup && model.pageSetup.verticalCentered\n };\n const sheetProtectionModel = model.sheetProtection;\n\n this.map.sheetPr.render(xmlStream, sheetPropertiesModel);\n this.map.dimension.render(xmlStream, model.dimensions);\n this.map.sheetViews.render(xmlStream, model.views);\n this.map.sheetFormatPr.render(xmlStream, sheetFormatPropertiesModel);\n this.map.cols.render(xmlStream, model.cols);\n this.map.sheetData.render(xmlStream, model.rows);\n this.map.sheetProtection.render(xmlStream, sheetProtectionModel); // Note: must be after sheetData and before autoFilter\n this.map.autoFilter.render(xmlStream, model.autoFilter);\n this.map.mergeCells.render(xmlStream, model.mergeCells);\n this.map.conditionalFormatting.render(xmlStream, model.conditionalFormattings); // Note: must be before dataValidations\n this.map.dataValidations.render(xmlStream, model.dataValidations);\n\n // For some reason hyperlinks have to be after the data validations\n this.map.hyperlinks.render(xmlStream, model.hyperlinks);\n\n this.map.printOptions.render(xmlStream, printOptionsModel); // Note: must be before pageMargins\n this.map.pageMargins.render(xmlStream, pageMarginsModel);\n this.map.pageSetup.render(xmlStream, model.pageSetup);\n this.map.headerFooter.render(xmlStream, model.headerFooter);\n this.map.rowBreaks.render(xmlStream, model.rowBreaks);\n this.map.colBreaks.render(xmlStream, model.colBreaks);\n this.map.drawing.render(xmlStream, model.drawing); // Note: must be after rowBreaks/colBreaks\n this.map.picture.render(xmlStream, model.background); // Note: must be after drawing\n this.map.tableParts.render(xmlStream, model.tables);\n\n this.map.extLst.render(xmlStream, model);\n\n if (model.rels) {\n // add a <legacyDrawing /> node for each comment\n model.rels.forEach(rel => {\n if (rel.Type === RelType.VmlDrawing) {\n xmlStream.leafNode(\"legacyDrawing\", { \"r:id\": rel.Id });\n }\n });\n }\n\n xmlStream.closeNode();\n }\n\n parseOpen(node) {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n\n if (node.name === \"worksheet\") {\n Object.values(this.map).forEach((xform: any) => {\n xform.reset();\n });\n return true;\n }\n\n if (this.map[node.name] && !this.ignoreNodes.includes(node.name)) {\n this.parser = this.map[node.name];\n this.parser.parseOpen(node);\n }\n return true;\n }\n\n parseText(text) {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name) {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case \"worksheet\": {\n const properties = this.map.sheetFormatPr.model || {};\n if (this.map.sheetPr.model && this.map.sheetPr.model.tabColor) {\n properties.tabColor = this.map.sheetPr.model.tabColor;\n }\n if (this.map.sheetPr.model && this.map.sheetPr.model.outlineProperties) {\n properties.outlineProperties = this.map.sheetPr.model.outlineProperties;\n }\n const sheetProperties = {\n fitToPage:\n (this.map.sheetPr.model &&\n this.map.sheetPr.model.pageSetup &&\n this.map.sheetPr.model.pageSetup.fitToPage) ||\n false,\n margins: this.map.pageMargins.model\n };\n const pageSetup = Object.assign(\n sheetProperties,\n this.map.pageSetup.model,\n this.map.printOptions.model\n );\n const conditionalFormattings = mergeConditionalFormattings(\n this.map.conditionalFormatting.model,\n this.map.extLst.model && this.map.extLst.model[\"x14:conditionalFormattings\"]\n );\n this.model = {\n dimensions: this.map.dimension.model,\n cols: this.map.cols.model,\n rows: this.map.sheetData.model,\n mergeCells: this.map.mergeCells.model,\n hyperlinks: this.map.hyperlinks.model,\n dataValidations: this.map.dataValidations.model,\n properties,\n views: this.map.sheetViews.model,\n pageSetup,\n headerFooter: this.map.headerFooter.model,\n background: this.map.picture.model,\n drawing: this.map.drawing.model,\n tables: this.map.tableParts.model,\n conditionalFormattings,\n rowBreaks: this.map.rowBreaks.model || [],\n colBreaks: this.map.colBreaks.model || []\n };\n\n if (this.map.autoFilter.model) {\n this.model.autoFilter = this.map.autoFilter.model;\n }\n if (this.map.sheetProtection.model) {\n this.model.sheetProtection = this.map.sheetProtection.model;\n }\n\n return false;\n }\n\n default:\n // not quite sure how we get here!\n return true;\n }\n }\n\n reconcile(model, options) {\n // options.merges = new Merges();\n // options.merges.reconcile(model.mergeCells, model.rows);\n const rels = (model.relationships || []).reduce((h, rel) => {\n h[rel.Id] = rel;\n if (rel.Type === RelType.Comments) {\n model.comments = options.comments[rel.Target].comments;\n }\n if (rel.Type === RelType.VmlDrawing && model.comments && model.comments.length) {\n const vmlComment = options.vmlDrawings[rel.Target].comments;\n model.comments.forEach((comment, index) => {\n comment.note = Object.assign({}, comment.note, vmlComment[index]);\n });\n }\n return h;\n }, {});\n options.commentsMap = (model.comments || []).reduce((h, comment) => {\n if (comment.ref) {\n h[comment.ref] = comment;\n }\n return h;\n }, {});\n options.hyperlinkMap = (model.hyperlinks || []).reduce((h, hyperlink) => {\n if (hyperlink.rId) {\n h[hyperlink.address] = rels[hyperlink.rId].Target;\n }\n return h;\n }, {});\n options.formulae = {};\n\n // compact the rows and cells\n model.rows = (model.rows && model.rows.filter(Boolean)) || [];\n model.rows.forEach(row => {\n row.cells = (row.cells && row.cells.filter(Boolean)) || [];\n });\n\n this.map.cols.reconcile(model.cols, options);\n this.map.sheetData.reconcile(model.rows, options);\n this.map.conditionalFormatting.reconcile(model.conditionalFormattings, options);\n\n model.media = [];\n if (model.drawing) {\n const drawingRel = rels[model.drawing.rId];\n const match = drawingRel.Target.match(/\\/drawings\\/([a-zA-Z0-9]+)[.][a-zA-Z]{3,4}$/);\n if (match) {\n const drawingName = match[1];\n const drawing = options.drawings[drawingName];\n drawing.anchors.forEach(anchor => {\n if (anchor.medium) {\n const image = {\n type: \"image\",\n imageId: anchor.medium.index,\n range: anchor.range,\n hyperlinks: anchor.picture.hyperlinks\n };\n model.media.push(image);\n }\n });\n }\n }\n\n const backgroundRel = model.background && rels[model.background.rId];\n if (backgroundRel) {\n const target = backgroundRel.Target.split(\"/media/\")[1];\n const imageId = options.mediaIndex && options.mediaIndex[target];\n if (imageId !== undefined) {\n model.media.push({\n type: \"background\",\n imageId\n });\n }\n }\n\n model.tables = (model.tables || []).map(tablePart => {\n const rel = rels[tablePart.rId];\n return options.tables[rel.Target];\n });\n\n // Link pivot tables from relationships to worksheet\n // This is needed so that when writing, the worksheet knows which pivot tables it contains\n model.pivotTables = [];\n (model.relationships || []).forEach(rel => {\n if (rel.Type === RelType.PivotTable && options.pivotTables) {\n const pivotTable = options.pivotTables[rel.Target];\n if (pivotTable) {\n model.pivotTables.push(pivotTable);\n }\n }\n });\n\n delete model.relationships;\n delete model.hyperlinks;\n delete model.comments;\n }\n}\n\nexport { WorkSheetXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\nabstract class BaseCellAnchorXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser: any;\n declare public model: any;\n\n abstract get tag(): string;\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case this.tag:\n this.reset();\n this.model = {\n range: {\n editAs: node.attributes.editAs || \"oneCell\"\n }\n };\n break;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n }\n break;\n }\n return true;\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n reconcilePicture(model: any, options: any): any {\n if (model && model.rId) {\n const rel = options.rels[model.rId];\n const match = rel.Target.match(/.*\\/media\\/(.+[.][a-zA-Z]{3,4})/);\n if (match) {\n const name = match[1];\n const mediaId = options.mediaIndex[name];\n return options.media[mediaId];\n }\n }\n return undefined;\n }\n}\n\nexport { BaseCellAnchorXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { IntegerXform } from \"@excel/xlsx/xform/simple/integer-xform\";\n\ninterface PositionModel {\n nativeCol: number;\n nativeColOff: number;\n nativeRow: number;\n nativeRowOff: number;\n}\n\nclass CellPositionXform extends BaseXform {\n declare private tag: string;\n declare public map: { [key: string]: IntegerXform };\n declare public parser: any;\n declare public model: PositionModel;\n\n constructor(options: { tag: string }) {\n super();\n\n this.tag = options.tag;\n this.map = {\n \"xdr:col\": new IntegerXform({ tag: \"xdr:col\", zero: true }),\n \"xdr:colOff\": new IntegerXform({ tag: \"xdr:colOff\", zero: true }),\n \"xdr:row\": new IntegerXform({ tag: \"xdr:row\", zero: true }),\n \"xdr:rowOff\": new IntegerXform({ tag: \"xdr:rowOff\", zero: true })\n };\n this.model = { nativeCol: 0, nativeColOff: 0, nativeRow: 0, nativeRowOff: 0 };\n }\n\n render(xmlStream: any, model: PositionModel): void {\n xmlStream.openNode(this.tag);\n\n this.map[\"xdr:col\"].render(xmlStream, model.nativeCol);\n this.map[\"xdr:colOff\"].render(xmlStream, model.nativeColOff);\n\n this.map[\"xdr:row\"].render(xmlStream, model.nativeRow);\n this.map[\"xdr:rowOff\"].render(xmlStream, model.nativeRowOff);\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case this.tag:\n this.reset();\n break;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n }\n break;\n }\n return true;\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n this.model = {\n nativeCol: this.map[\"xdr:col\"].model,\n nativeColOff: this.map[\"xdr:colOff\"].model,\n nativeRow: this.map[\"xdr:row\"].model,\n nativeRowOff: this.map[\"xdr:rowOff\"].model\n };\n return false;\n default:\n // not quite sure how we get here!\n return true;\n }\n }\n}\n\nexport { CellPositionXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface BlipModel {\n rId: string;\n}\n\nclass BlipXform extends BaseXform {\n declare public model: BlipModel;\n\n constructor() {\n super();\n this.model = { rId: \"\" };\n }\n\n get tag(): string {\n return \"a:blip\";\n }\n\n render(xmlStream: any, model: BlipModel): void {\n xmlStream.leafNode(this.tag, {\n \"xmlns:r\": \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\n \"r:embed\": model.rId,\n cstate: \"print\"\n });\n // TODO: handle children (e.g. a:extLst=>a:ext=>a14:useLocalDpi\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n this.model = {\n rId: node.attributes[\"r:embed\"]\n };\n return true;\n default:\n return true;\n }\n }\n\n parseText(): void {}\n\n parseClose(name: string): boolean {\n switch (name) {\n case this.tag:\n return false;\n default:\n // unprocessed internal nodes\n return true;\n }\n }\n}\n\nexport { BlipXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { BlipXform } from \"@excel/xlsx/xform/drawing/blip-xform\";\n\nclass BlipFillXform extends BaseXform {\n declare public map: { [key: string]: BlipXform };\n declare public parser: any;\n declare public model: any;\n\n constructor() {\n super();\n\n this.map = {\n \"a:blip\": new BlipXform()\n };\n }\n\n get tag(): string {\n return \"xdr:blipFill\";\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.openNode(this.tag);\n\n this.map[\"a:blip\"].render(xmlStream, model);\n\n // TODO: options for this + parsing\n xmlStream.openNode(\"a:stretch\");\n xmlStream.leafNode(\"a:fillRect\");\n xmlStream.closeNode();\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n\n switch (node.name) {\n case this.tag:\n this.reset();\n break;\n\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n }\n break;\n }\n return true;\n }\n\n parseText(): void {}\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n this.model = this.map[\"a:blip\"].model;\n return false;\n\n default:\n return true;\n }\n }\n}\n\nexport { BlipFillXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\nclass HLinkClickXform extends BaseXform {\n declare public model: any;\n\n constructor() {\n super();\n this.model = {};\n }\n\n get tag(): string {\n return \"a:hlinkClick\";\n }\n\n render(xmlStream: any, model: any): void {\n if (!(model.hyperlinks && model.hyperlinks.rId)) {\n return;\n }\n xmlStream.leafNode(this.tag, {\n \"xmlns:r\": \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\n \"r:id\": model.hyperlinks.rId,\n tooltip: model.hyperlinks.tooltip\n });\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n this.model = {\n hyperlinks: {\n rId: node.attributes[\"r:id\"],\n tooltip: node.attributes.tooltip\n }\n };\n return true;\n default:\n return true;\n }\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { HLinkClickXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\nclass ExtLstXform extends BaseXform {\n get tag(): string {\n return \"a:extLst\";\n }\n\n render(xmlStream: any): void {\n xmlStream.openNode(this.tag);\n xmlStream.openNode(\"a:ext\", {\n uri: \"{FF2B5EF4-FFF2-40B4-BE49-F238E27FC236}\"\n });\n xmlStream.leafNode(\"a16:creationId\", {\n \"xmlns:a16\": \"http://schemas.microsoft.com/office/drawing/2014/main\",\n id: \"{00000000-0008-0000-0000-000002000000}\"\n });\n xmlStream.closeNode();\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n return true;\n default:\n return true;\n }\n }\n\n parseText(): void {}\n\n parseClose(name: string): boolean {\n switch (name) {\n case this.tag:\n return false;\n default:\n // unprocessed internal nodes\n return true;\n }\n }\n}\n\nexport { ExtLstXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { HLinkClickXform } from \"@excel/xlsx/xform/drawing/hlink-click-xform\";\nimport { ExtLstXform } from \"@excel/xlsx/xform/drawing/ext-lst-xform\";\n\ninterface CNvPrModel {\n index: number;\n}\n\nclass CNvPrXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser: any;\n declare public model: any;\n\n constructor() {\n super();\n\n this.map = {\n \"a:hlinkClick\": new HLinkClickXform(),\n \"a:extLst\": new ExtLstXform()\n };\n }\n\n get tag(): string {\n return \"xdr:cNvPr\";\n }\n\n render(xmlStream: any, model: CNvPrModel): void {\n xmlStream.openNode(this.tag, {\n id: model.index,\n name: `Picture ${model.index}`\n });\n this.map[\"a:hlinkClick\"].render(xmlStream, model);\n this.map[\"a:extLst\"].render(xmlStream, model);\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n\n switch (node.name) {\n case this.tag:\n this.reset();\n break;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n }\n break;\n }\n return true;\n }\n\n parseText(): void {}\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n this.model = this.map[\"a:hlinkClick\"].model;\n return false;\n default:\n return true;\n }\n }\n}\n\nexport { CNvPrXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\nclass CNvPicPrXform extends BaseXform {\n get tag(): string {\n return \"xdr:cNvPicPr\";\n }\n\n render(xmlStream: any): void {\n xmlStream.openNode(this.tag);\n xmlStream.leafNode(\"a:picLocks\", {\n noChangeAspect: \"1\"\n });\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n return true;\n default:\n return true;\n }\n }\n\n parseText(): void {}\n\n parseClose(name: string): boolean {\n switch (name) {\n case this.tag:\n return false;\n default:\n // unprocessed internal nodes\n return true;\n }\n }\n}\n\nexport { CNvPicPrXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { CNvPrXform } from \"@excel/xlsx/xform/drawing/c-nv-pr-xform\";\nimport { CNvPicPrXform } from \"@excel/xlsx/xform/drawing/c-nv-pic-pr-xform\";\n\nclass NvPicPrXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser: any;\n declare public model: any;\n\n constructor() {\n super();\n\n this.map = {\n \"xdr:cNvPr\": new CNvPrXform(),\n \"xdr:cNvPicPr\": new CNvPicPrXform()\n };\n }\n\n get tag(): string {\n return \"xdr:nvPicPr\";\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.openNode(this.tag);\n this.map[\"xdr:cNvPr\"].render(xmlStream, model);\n this.map[\"xdr:cNvPicPr\"].render(xmlStream, model);\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n\n switch (node.name) {\n case this.tag:\n this.reset();\n break;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n }\n break;\n }\n return true;\n }\n\n parseText(): void {}\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n this.model = this.map[\"xdr:cNvPr\"].model;\n return false;\n default:\n return true;\n }\n }\n}\n\nexport { NvPicPrXform };\n","export const spPrJSON = {\n tag: \"xdr:spPr\",\n c: [\n {\n tag: \"a:xfrm\",\n c: [\n { tag: \"a:off\", $: { x: \"0\", y: \"0\" } },\n { tag: \"a:ext\", $: { cx: \"0\", cy: \"0\" } }\n ]\n },\n {\n tag: \"a:prstGeom\",\n $: { prst: \"rect\" },\n c: [{ tag: \"a:avLst\" }]\n }\n ]\n};\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { StaticXform } from \"@excel/xlsx/xform/static-xform\";\nimport { BlipFillXform } from \"@excel/xlsx/xform/drawing/blip-fill-xform\";\nimport { NvPicPrXform } from \"@excel/xlsx/xform/drawing/nv-pic-pr-xform\";\nimport { spPrJSON } from \"@excel/xlsx/xform/drawing/sp-pr\";\n\ninterface PicModel {\n index?: number;\n [key: string]: any;\n}\n\nclass PicXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser: any;\n declare public model: any;\n\n constructor() {\n super();\n\n this.map = {\n \"xdr:nvPicPr\": new NvPicPrXform(),\n \"xdr:blipFill\": new BlipFillXform(),\n \"xdr:spPr\": new StaticXform(spPrJSON)\n };\n }\n\n get tag(): string {\n return \"xdr:pic\";\n }\n\n prepare(model: PicModel, options: { index: number }): void {\n model.index = options.index + 1;\n }\n\n render(xmlStream: any, model: PicModel): void {\n xmlStream.openNode(this.tag);\n\n this.map[\"xdr:nvPicPr\"].render(xmlStream, model);\n this.map[\"xdr:blipFill\"].render(xmlStream, model);\n this.map[\"xdr:spPr\"].render(xmlStream, model);\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case this.tag:\n this.reset();\n break;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n }\n break;\n }\n return true;\n }\n\n parseText(): void {}\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.mergeModel(this.parser.model);\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n return false;\n default:\n // not quite sure how we get here!\n return true;\n }\n }\n}\n\nexport { PicXform };\n","import { BaseCellAnchorXform } from \"@excel/xlsx/xform/drawing/base-cell-anchor-xform\";\nimport { StaticXform } from \"@excel/xlsx/xform/static-xform\";\nimport { CellPositionXform } from \"@excel/xlsx/xform/drawing/cell-position-xform\";\nimport { PicXform } from \"@excel/xlsx/xform/drawing/pic-xform\";\n\ninterface TwoCellModel {\n range: {\n editAs?: string;\n tl: any;\n br: any;\n };\n picture: any;\n}\n\nclass TwoCellAnchorXform extends BaseCellAnchorXform {\n constructor() {\n super();\n\n this.map = {\n \"xdr:from\": new CellPositionXform({ tag: \"xdr:from\" }),\n \"xdr:to\": new CellPositionXform({ tag: \"xdr:to\" }),\n \"xdr:pic\": new PicXform(),\n \"xdr:clientData\": new StaticXform({ tag: \"xdr:clientData\" })\n };\n }\n\n get tag(): string {\n return \"xdr:twoCellAnchor\";\n }\n\n prepare(model: TwoCellModel, options: { index: number }): void {\n this.map[\"xdr:pic\"].prepare(model.picture, options);\n }\n\n render(xmlStream: any, model: TwoCellModel): void {\n xmlStream.openNode(this.tag, { editAs: model.range.editAs || \"oneCell\" });\n\n this.map[\"xdr:from\"].render(xmlStream, model.range.tl);\n this.map[\"xdr:to\"].render(xmlStream, model.range.br);\n this.map[\"xdr:pic\"].render(xmlStream, model.picture);\n this.map[\"xdr:clientData\"].render(xmlStream, {});\n\n xmlStream.closeNode();\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n this.model.range.tl = this.map[\"xdr:from\"].model;\n this.model.range.br = this.map[\"xdr:to\"].model;\n this.model.picture = this.map[\"xdr:pic\"].model;\n return false;\n default:\n // could be some unrecognised tags\n return true;\n }\n }\n\n reconcile(model: any, options: any): void {\n model.medium = this.reconcilePicture(model.picture, options);\n }\n}\n\nexport { TwoCellAnchorXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\n/** https://en.wikipedia.org/wiki/Office_Open_XML_file_formats#DrawingML */\nconst EMU_PER_PIXEL_AT_96_DPI = 9525;\n\ninterface ExtModel {\n width: number;\n height: number;\n}\n\nclass ExtXform extends BaseXform {\n declare private tag: string;\n declare public map: { [key: string]: any };\n declare public model: ExtModel;\n\n constructor(options: { tag: string }) {\n super();\n\n this.tag = options.tag;\n this.map = {};\n this.model = { width: 0, height: 0 };\n }\n\n render(xmlStream: any, model: ExtModel): void {\n xmlStream.openNode(this.tag);\n\n const width = Math.floor(model.width * EMU_PER_PIXEL_AT_96_DPI);\n const height = Math.floor(model.height * EMU_PER_PIXEL_AT_96_DPI);\n\n xmlStream.addAttribute(\"cx\", width);\n xmlStream.addAttribute(\"cy\", height);\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (node.name === this.tag) {\n this.model = {\n width: parseInt(node.attributes.cx || \"0\", 10) / EMU_PER_PIXEL_AT_96_DPI,\n height: parseInt(node.attributes.cy || \"0\", 10) / EMU_PER_PIXEL_AT_96_DPI\n };\n return true;\n }\n return false;\n }\n\n parseText(_text?: string): void {}\n\n parseClose(_name?: string): boolean {\n return false;\n }\n}\n\nexport { ExtXform };\n","import { BaseCellAnchorXform } from \"@excel/xlsx/xform/drawing/base-cell-anchor-xform\";\nimport { StaticXform } from \"@excel/xlsx/xform/static-xform\";\nimport { CellPositionXform } from \"@excel/xlsx/xform/drawing/cell-position-xform\";\nimport { ExtXform } from \"@excel/xlsx/xform/drawing/ext-xform\";\nimport { PicXform } from \"@excel/xlsx/xform/drawing/pic-xform\";\n\ninterface OneCellModel {\n range: {\n editAs?: string;\n tl: any;\n ext: any;\n };\n picture: any;\n}\n\nclass OneCellAnchorXform extends BaseCellAnchorXform {\n constructor() {\n super();\n\n this.map = {\n \"xdr:from\": new CellPositionXform({ tag: \"xdr:from\" }),\n \"xdr:ext\": new ExtXform({ tag: \"xdr:ext\" }),\n \"xdr:pic\": new PicXform(),\n \"xdr:clientData\": new StaticXform({ tag: \"xdr:clientData\" })\n };\n }\n\n get tag(): string {\n return \"xdr:oneCellAnchor\";\n }\n\n prepare(model: OneCellModel, options: { index: number }): void {\n this.map[\"xdr:pic\"].prepare(model.picture, options);\n }\n\n render(xmlStream: any, model: OneCellModel): void {\n xmlStream.openNode(this.tag, { editAs: model.range.editAs || \"oneCell\" });\n\n this.map[\"xdr:from\"].render(xmlStream, model.range.tl);\n this.map[\"xdr:ext\"].render(xmlStream, model.range.ext);\n this.map[\"xdr:pic\"].render(xmlStream, model.picture);\n this.map[\"xdr:clientData\"].render(xmlStream, {});\n\n xmlStream.closeNode();\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n this.model.range.tl = this.map[\"xdr:from\"].model;\n this.model.range.ext = this.map[\"xdr:ext\"].model;\n this.model.picture = this.map[\"xdr:pic\"].model;\n return false;\n default:\n // could be some unrecognised tags\n return true;\n }\n }\n\n reconcile(model: any, options: any): void {\n model.medium = this.reconcilePicture(model.picture, options);\n }\n}\n\nexport { OneCellAnchorXform };\n","import { colCache } from \"@excel/utils/col-cache\";\nimport { XmlStream } from \"@excel/utils/xml-stream\";\nimport { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { TwoCellAnchorXform } from \"@excel/xlsx/xform/drawing/two-cell-anchor-xform\";\nimport { OneCellAnchorXform } from \"@excel/xlsx/xform/drawing/one-cell-anchor-xform\";\n\nfunction getAnchorType(model: any): string {\n const range = typeof model.range === \"string\" ? colCache.decode(model.range) : model.range;\n\n return range.br ? \"xdr:twoCellAnchor\" : \"xdr:oneCellAnchor\";\n}\n\ninterface DrawingModel {\n anchors: any[];\n}\n\nclass DrawingXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser: any;\n declare public model: DrawingModel;\n\n constructor() {\n super();\n\n this.map = {\n \"xdr:twoCellAnchor\": new TwoCellAnchorXform(),\n \"xdr:oneCellAnchor\": new OneCellAnchorXform()\n };\n this.model = { anchors: [] };\n }\n\n prepare(model: DrawingModel): void {\n model.anchors.forEach((item, index) => {\n item.anchorType = getAnchorType(item);\n const anchor = this.map[item.anchorType];\n anchor.prepare(item, { index });\n });\n }\n\n get tag(): string {\n return \"xdr:wsDr\";\n }\n\n render(xmlStream: any, model?: DrawingModel): void {\n const renderModel = model || this.model;\n xmlStream.openXml(XmlStream.StdDocAttributes);\n xmlStream.openNode(this.tag, DrawingXform.DRAWING_ATTRIBUTES);\n\n renderModel.anchors.forEach(item => {\n const anchor = this.map[item.anchorType];\n anchor.render(xmlStream, item);\n });\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case this.tag:\n this.reset();\n this.model = {\n anchors: []\n };\n break;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n }\n break;\n }\n return true;\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.model.anchors.push(this.parser.model);\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n return false;\n default:\n // could be some unrecognised tags\n return true;\n }\n }\n\n reconcile(model: DrawingModel, options: any): void {\n model.anchors.forEach(anchor => {\n if (anchor.br) {\n this.map[\"xdr:twoCellAnchor\"].reconcile(anchor, options);\n } else {\n this.map[\"xdr:oneCellAnchor\"].reconcile(anchor, options);\n }\n });\n }\n\n static DRAWING_ATTRIBUTES = {\n \"xmlns:xdr\": \"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\",\n \"xmlns:a\": \"http://schemas.openxmlformats.org/drawingml/2006/main\"\n };\n}\n\nexport { DrawingXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface CustomFilterModel {\n val: string;\n operator?: string;\n}\n\nclass CustomFilterXform extends BaseXform {\n declare public model: CustomFilterModel;\n\n constructor() {\n super();\n this.model = { val: \"\" };\n }\n\n get tag(): string {\n return \"customFilter\";\n }\n\n render(xmlStream: any, model: CustomFilterModel): void {\n xmlStream.leafNode(this.tag, {\n val: model.val,\n operator: model.operator\n });\n }\n\n parseOpen(node: any): boolean {\n if (node.name === this.tag) {\n this.model = {\n val: node.attributes.val,\n operator: node.attributes.operator\n };\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { CustomFilterXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface FilterModel {\n val: string;\n}\n\nclass FilterXform extends BaseXform {\n declare public model: FilterModel;\n\n constructor() {\n super();\n this.model = { val: \"\" };\n }\n\n get tag(): string {\n return \"filter\";\n }\n\n render(xmlStream: any, model: FilterModel): void {\n xmlStream.leafNode(this.tag, {\n val: model.val\n });\n }\n\n parseOpen(node: any): boolean {\n if (node.name === this.tag) {\n this.model = {\n val: node.attributes.val\n };\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { FilterXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { ListXform } from \"@excel/xlsx/xform/list-xform\";\nimport { CustomFilterXform } from \"@excel/xlsx/xform/table/custom-filter-xform\";\nimport { FilterXform } from \"@excel/xlsx/xform/table/filter-xform\";\n\ninterface FilterColumnModel {\n colId?: string;\n filterButton: boolean;\n customFilters?: any[];\n}\n\nclass FilterColumnXform extends BaseXform {\n declare public map: { [key: string]: ListXform };\n declare public parser: any;\n declare public model: FilterColumnModel;\n\n constructor() {\n super();\n\n this.map = {\n customFilters: new ListXform({\n tag: \"customFilters\",\n count: false,\n empty: true,\n childXform: new CustomFilterXform()\n }),\n filters: new ListXform({\n tag: \"filters\",\n count: false,\n empty: true,\n childXform: new FilterXform()\n })\n };\n this.model = { filterButton: false };\n }\n\n get tag(): string {\n return \"filterColumn\";\n }\n\n prepare(model: FilterColumnModel, options: { index: number }): void {\n model.colId = options.index.toString();\n }\n\n render(xmlStream: any, model: FilterColumnModel): void {\n if (model.customFilters) {\n xmlStream.openNode(this.tag, {\n colId: model.colId,\n hiddenButton: model.filterButton ? \"0\" : \"1\"\n });\n\n this.map.customFilters.render(xmlStream, model.customFilters);\n\n xmlStream.closeNode();\n return;\n }\n xmlStream.leafNode(this.tag, {\n colId: model.colId,\n hiddenButton: model.filterButton ? \"0\" : \"1\"\n });\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n const { attributes } = node;\n switch (node.name) {\n case this.tag:\n this.model = {\n filterButton: attributes.hiddenButton === \"0\"\n };\n return true;\n case \"dynamicFilter\":\n // Ignore dynamicFilter nodes - we don't need to preserve them for reading\n return true;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parseOpen(node);\n return true;\n }\n throw new Error(`Unexpected xml node in parseOpen: ${JSON.stringify(node)}`);\n }\n }\n\n parseText(): void {}\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n this.model.customFilters = this.map.customFilters.model;\n return false;\n default:\n // could be some unrecognised tags\n return true;\n }\n }\n}\n\nexport { FilterColumnXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { FilterColumnXform } from \"@excel/xlsx/xform/table/filter-column-xform\";\n\ninterface AutoFilterModel {\n autoFilterRef: string;\n columns: any[];\n}\n\nclass AutoFilterXform extends BaseXform {\n declare public map: { [key: string]: FilterColumnXform };\n declare public parser: any;\n declare public model: AutoFilterModel;\n\n constructor() {\n super();\n\n this.map = {\n filterColumn: new FilterColumnXform()\n };\n this.model = { autoFilterRef: \"\", columns: [] };\n }\n\n get tag(): string {\n return \"autoFilter\";\n }\n\n prepare(model: any): void {\n model.columns.forEach((column: any, index: number) => {\n this.map.filterColumn.prepare(column, { index });\n });\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.openNode(this.tag, {\n ref: model.autoFilterRef\n });\n\n model.columns.forEach((column: any) => {\n this.map.filterColumn.render(xmlStream, column);\n });\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case this.tag:\n this.model = {\n autoFilterRef: node.attributes.ref,\n columns: []\n };\n return true;\n\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parseOpen(node);\n return true;\n }\n throw new Error(`Unexpected xml node in parseOpen: ${JSON.stringify(node)}`);\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.model.columns.push(this.parser.model);\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n return false;\n default:\n throw new Error(`Unexpected xml node in parseClose: ${name}`);\n }\n }\n}\n\nexport { AutoFilterXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface TableColumnModel {\n id?: number;\n name: string;\n totalsRowLabel?: string;\n totalsRowFunction?: string;\n dxfId?: string;\n}\n\nclass TableColumnXform extends BaseXform {\n declare public model: TableColumnModel;\n\n constructor() {\n super();\n this.model = { name: \"\" };\n }\n\n get tag(): string {\n return \"tableColumn\";\n }\n\n prepare(model: TableColumnModel, options: { index: number }): void {\n model.id = options.index + 1;\n }\n\n render(xmlStream: any, model: TableColumnModel): void {\n xmlStream.leafNode(this.tag, {\n id: model.id!.toString(),\n name: model.name,\n totalsRowLabel: model.totalsRowLabel,\n // Excel doesn't output totalsRowFunction when value is 'none'\n totalsRowFunction: model.totalsRowFunction === \"none\" ? undefined : model.totalsRowFunction,\n dxfId: model.dxfId\n });\n }\n\n parseOpen(node: any): boolean {\n if (node.name === this.tag) {\n const { attributes } = node;\n this.model = {\n name: attributes.name,\n totalsRowLabel: attributes.totalsRowLabel,\n totalsRowFunction: attributes.totalsRowFunction,\n dxfId: attributes.dxfId\n };\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { TableColumnXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface TableStyleModel {\n theme?: string | null;\n showFirstColumn: boolean;\n showLastColumn: boolean;\n showRowStripes: boolean;\n showColumnStripes: boolean;\n}\n\nclass TableStyleInfoXform extends BaseXform {\n declare public model: TableStyleModel;\n\n constructor() {\n super();\n this.model = {\n theme: null,\n showFirstColumn: false,\n showLastColumn: false,\n showRowStripes: false,\n showColumnStripes: false\n };\n }\n\n get tag(): string {\n return \"tableStyleInfo\";\n }\n\n render(xmlStream: any, model: TableStyleModel): void {\n xmlStream.leafNode(this.tag, {\n name: model.theme ? model.theme : undefined,\n showFirstColumn: model.showFirstColumn ? \"1\" : \"0\",\n showLastColumn: model.showLastColumn ? \"1\" : \"0\",\n showRowStripes: model.showRowStripes ? \"1\" : \"0\",\n showColumnStripes: model.showColumnStripes ? \"1\" : \"0\"\n });\n }\n\n parseOpen(node: any): boolean {\n if (node.name === this.tag) {\n const { attributes } = node;\n this.model = {\n theme: attributes.name ? attributes.name : null,\n showFirstColumn: attributes.showFirstColumn === \"1\",\n showLastColumn: attributes.showLastColumn === \"1\",\n showRowStripes: attributes.showRowStripes === \"1\",\n showColumnStripes: attributes.showColumnStripes === \"1\"\n };\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { TableStyleInfoXform };\n","import { XmlStream } from \"@excel/utils/xml-stream\";\nimport { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { ListXform } from \"@excel/xlsx/xform/list-xform\";\nimport { AutoFilterXform } from \"@excel/xlsx/xform/table/auto-filter-xform\";\nimport { TableColumnXform } from \"@excel/xlsx/xform/table/table-column-xform\";\nimport { TableStyleInfoXform } from \"@excel/xlsx/xform/table/table-style-info-xform\";\n\ninterface TableModel {\n id?: number;\n name: string;\n displayName?: string;\n ref?: string;\n tableRef: string;\n totalsRow?: boolean;\n headerRow?: boolean;\n columns?: any[];\n rows?: any[];\n autoFilterRef?: string;\n style?: any;\n}\n\nclass TableXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser: any;\n declare public model: TableModel;\n\n constructor() {\n super();\n\n this.map = {\n autoFilter: new AutoFilterXform(),\n tableColumns: new ListXform({\n tag: \"tableColumns\",\n count: true,\n empty: true,\n childXform: new TableColumnXform()\n }),\n tableStyleInfo: new TableStyleInfoXform()\n };\n this.model = {\n id: 0,\n name: \"\",\n tableRef: \"\",\n columns: []\n };\n }\n\n prepare(model: TableModel, options: any): void {\n this.map.autoFilter.prepare(model);\n this.map.tableColumns.prepare(model.columns, options);\n }\n\n get tag(): string {\n return \"table\";\n }\n\n render(xmlStream: any, model: TableModel): void {\n xmlStream.openXml(XmlStream.StdDocAttributes);\n xmlStream.openNode(this.tag, {\n ...TableXform.TABLE_ATTRIBUTES,\n id: model.id,\n name: model.name,\n displayName: model.displayName || model.name,\n ref: model.tableRef,\n totalsRowCount: model.totalsRow ? \"1\" : undefined,\n // Excel doesn't output headerRowCount when it's 1 (default) or when there's a header row\n headerRowCount: model.headerRow ? undefined : \"0\"\n });\n\n this.map.autoFilter.render(xmlStream, model);\n this.map.tableColumns.render(xmlStream, model.columns);\n this.map.tableStyleInfo.render(xmlStream, model.style);\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n const { name, attributes } = node;\n switch (name) {\n case this.tag:\n this.reset();\n this.model = {\n name: attributes.name,\n displayName: attributes.displayName || attributes.name,\n tableRef: attributes.ref,\n totalsRow: attributes.totalsRowCount === \"1\",\n // ECMA-376: headerRowCount defaults to 1, so missing attribute means has header\n headerRow: attributes.headerRowCount !== \"0\"\n };\n break;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n }\n break;\n }\n return true;\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n this.model.columns = this.map.tableColumns.model;\n if (this.map.autoFilter.model) {\n this.model.autoFilterRef = this.map.autoFilter.model.autoFilterRef;\n this.map.autoFilter.model.columns.forEach((column: any, index: number) => {\n this.model.columns[index].filterButton = column.filterButton;\n });\n }\n this.model.style = this.map.tableStyleInfo.model;\n return false;\n default:\n // could be some unrecognised tags\n return true;\n }\n }\n\n reconcile(model: TableModel, options: any): void {\n // Map tableRef to ref for Table constructor compatibility\n if (model.tableRef && !model.ref) {\n model.ref = model.tableRef;\n }\n // Add empty rows array if not present (tables loaded from file don't have row data)\n if (!model.rows) {\n model.rows = [];\n }\n // fetch the dfxs from styles\n model.columns.forEach(column => {\n if (column.dxfId !== undefined) {\n column.style = options.styles.getDxfStyle(column.dxfId);\n }\n });\n }\n\n static TABLE_ATTRIBUTES = {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"\n };\n}\n\nexport { TableXform };\n","import { XmlStream } from \"@excel/utils/xml-stream\";\nimport { xmlEncode, xmlDecode } from \"@utils/utils\";\nimport { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport type { PivotTableSource } from \"@excel/pivot-table\";\n\n/**\n * Model for generating pivot cache records (with live source)\n */\ninterface CacheRecordsModel {\n source: PivotTableSource;\n cacheFields: any[];\n}\n\n/**\n * Parsed record value - can be:\n * - { type: 'x', value: number } - Shared item index\n * - { type: 'n', value: number } - Numeric value\n * - { type: 's', value: string } - String value\n * - { type: 'b', value: boolean } - Boolean value\n * - { type: 'm' } - Missing/null value\n * - { type: 'd', value: Date } - Date value\n * - { type: 'e', value: string } - Error value\n */\ninterface RecordValue {\n type: \"x\" | \"n\" | \"s\" | \"b\" | \"m\" | \"d\" | \"e\";\n value?: any;\n}\n\n/**\n * Parsed cache records model\n */\ninterface ParsedCacheRecordsModel {\n // Array of records, each record is an array of values\n records: RecordValue[][];\n // Record count\n count: number;\n // Flag indicating this was loaded from file (not newly created)\n isLoaded?: boolean;\n}\n\nclass PivotCacheRecordsXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public model: ParsedCacheRecordsModel | null;\n\n // Parser state\n private currentRecord: RecordValue[] | null;\n\n constructor() {\n super();\n\n this.map = {};\n this.model = null;\n this.currentRecord = null;\n }\n\n prepare(_model: any): void {\n // No preparation needed\n }\n\n get tag(): string {\n // http://www.datypic.com/sc/ooxml/e-ssml_pivotCacheRecords.html\n return \"pivotCacheRecords\";\n }\n\n reset(): void {\n this.model = null;\n this.currentRecord = null;\n }\n\n /**\n * Render pivot cache records XML.\n * Supports both newly created models (with PivotTableSource) and loaded models.\n */\n render(xmlStream: any, model: CacheRecordsModel | ParsedCacheRecordsModel): void {\n // Check if this is a loaded model\n const isLoaded = (model as ParsedCacheRecordsModel).isLoaded || !(\"source\" in model);\n\n if (isLoaded) {\n this.renderLoaded(xmlStream, model as ParsedCacheRecordsModel);\n } else {\n this.renderNew(xmlStream, model as CacheRecordsModel);\n }\n }\n\n /**\n * Render newly created pivot cache records\n */\n private renderNew(xmlStream: any, model: CacheRecordsModel): void {\n const { source, cacheFields } = model;\n const sourceBodyRows = source.getSheetValues().slice(2);\n\n xmlStream.openXml(XmlStream.StdDocAttributes);\n xmlStream.openNode(this.tag, {\n ...PivotCacheRecordsXform.PIVOT_CACHE_RECORDS_ATTRIBUTES,\n count: sourceBodyRows.length\n });\n xmlStream.writeXml(this.renderTableNew(sourceBodyRows, cacheFields));\n xmlStream.closeNode();\n }\n\n /**\n * Render loaded pivot cache records\n */\n private renderLoaded(xmlStream: any, model: ParsedCacheRecordsModel): void {\n xmlStream.openXml(XmlStream.StdDocAttributes);\n xmlStream.openNode(this.tag, {\n ...PivotCacheRecordsXform.PIVOT_CACHE_RECORDS_ATTRIBUTES,\n count: model.count\n });\n\n // Render each record\n for (const record of model.records) {\n xmlStream.writeXml(\"\\n <r>\");\n for (const value of record) {\n xmlStream.writeXml(\"\\n \");\n xmlStream.writeXml(this.renderRecordValue(value));\n }\n xmlStream.writeXml(\"\\n </r>\");\n }\n\n xmlStream.closeNode();\n }\n\n /**\n * Render a single record value to XML\n */\n private renderRecordValue(value: RecordValue): string {\n switch (value.type) {\n case \"x\":\n return `<x v=\"${value.value}\" />`;\n case \"n\":\n return `<n v=\"${value.value}\" />`;\n case \"s\":\n return `<s v=\"${xmlEncode(String(value.value))}\" />`;\n case \"b\":\n return `<b v=\"${value.value ? \"1\" : \"0\"}\" />`;\n case \"m\":\n return \"<m />\";\n case \"d\":\n return `<d v=\"${(value.value as Date).toISOString()}\" />`;\n case \"e\":\n return `<e v=\"${value.value}\" />`;\n default:\n return \"<m />\";\n }\n }\n\n // Helper methods for rendering new records\n private renderTableNew(sourceBodyRows: any[], cacheFields: any[]): string {\n const parts: string[] = [];\n for (const row of sourceBodyRows) {\n const realRow = row.slice(1);\n parts.push(\"\\n <r>\");\n for (let i = 0; i < realRow.length; i++) {\n parts.push(\"\\n \");\n parts.push(this.renderCellNew(realRow[i], cacheFields[i].sharedItems));\n }\n parts.push(\"\\n </r>\");\n }\n return parts.join(\"\");\n }\n\n private renderCellNew(value: any, sharedItems: any[] | null): string {\n // Handle null/undefined values first\n if (value === null || value === undefined) {\n return \"<m />\";\n }\n\n // no shared items\n if (sharedItems === null) {\n if (Number.isFinite(value)) {\n return `<n v=\"${value}\" />`;\n }\n return `<s v=\"${xmlEncode(String(value))}\" />`;\n }\n\n // shared items - use indexOf for value lookup (works for both string and numeric)\n const sharedItemsIndex = sharedItems.indexOf(value);\n if (sharedItemsIndex < 0) {\n throw new Error(`${JSON.stringify(value)} not in sharedItems ${JSON.stringify(sharedItems)}`);\n }\n return `<x v=\"${sharedItemsIndex}\" />`;\n }\n\n parseOpen(node: any): boolean {\n const { name, attributes } = node;\n\n switch (name) {\n case this.tag:\n // pivotCacheRecords root element\n this.reset();\n this.model = {\n records: [],\n count: parseInt(attributes.count || \"0\", 10),\n isLoaded: true\n };\n break;\n\n case \"r\":\n // Start of a new record\n this.currentRecord = [];\n break;\n\n case \"x\":\n // Shared item index\n if (this.currentRecord) {\n this.currentRecord.push({\n type: \"x\",\n value: parseInt(attributes.v || \"0\", 10)\n });\n }\n break;\n\n case \"n\":\n // Numeric value\n if (this.currentRecord) {\n this.currentRecord.push({\n type: \"n\",\n value: parseFloat(attributes.v || \"0\")\n });\n }\n break;\n\n case \"s\":\n // String value\n if (this.currentRecord) {\n this.currentRecord.push({\n type: \"s\",\n value: xmlDecode(attributes.v || \"\")\n });\n }\n break;\n\n case \"b\":\n // Boolean value\n if (this.currentRecord) {\n this.currentRecord.push({\n type: \"b\",\n value: attributes.v === \"1\"\n });\n }\n break;\n\n case \"m\":\n // Missing/null value\n if (this.currentRecord) {\n this.currentRecord.push({ type: \"m\" });\n }\n break;\n\n case \"d\":\n // Date value\n if (this.currentRecord) {\n this.currentRecord.push({\n type: \"d\",\n value: new Date(attributes.v || \"\")\n });\n }\n break;\n\n case \"e\":\n // Error value\n if (this.currentRecord) {\n this.currentRecord.push({\n type: \"e\",\n value: attributes.v || \"\"\n });\n }\n break;\n }\n\n return true;\n }\n\n parseText(_text: string): void {\n // No text content in cache records elements\n }\n\n parseClose(name: string): boolean {\n switch (name) {\n case this.tag:\n // End of pivotCacheRecords\n return false;\n\n case \"r\":\n // End of record - add to model\n if (this.model && this.currentRecord) {\n this.model.records.push(this.currentRecord);\n this.currentRecord = null;\n }\n break;\n }\n\n return true;\n }\n\n reconcile(_model: any, _options: any): void {\n // No reconciliation needed\n }\n\n static PIVOT_CACHE_RECORDS_ATTRIBUTES = {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\n \"xmlns:r\": \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\n \"xmlns:mc\": \"http://schemas.openxmlformats.org/markup-compatibility/2006\",\n \"mc:Ignorable\": \"xr\",\n \"xmlns:xr\": \"http://schemas.microsoft.com/office/spreadsheetml/2014/revision\"\n };\n}\n\nexport { PivotCacheRecordsXform, type ParsedCacheRecordsModel };\n","import { xmlEncode } from \"@utils/utils\";\n\ninterface CacheFieldConfig {\n name: string;\n sharedItems: any[] | null;\n minValue?: number;\n maxValue?: number;\n}\n\nclass CacheField {\n declare private name: string;\n declare private sharedItems: any[] | null;\n declare private minValue?: number;\n declare private maxValue?: number;\n\n constructor({ name, sharedItems, minValue, maxValue }: CacheFieldConfig) {\n // string type\n //\n // {\n // 'name': 'A',\n // 'sharedItems': ['a1', 'a2', 'a3']\n // }\n //\n // or\n //\n // integer type (no sharedItems)\n //\n // {\n // 'name': 'D',\n // 'sharedItems': null,\n // 'minValue': 5,\n // 'maxValue': 45\n // }\n //\n // or\n //\n // numeric type with shared items (used as both row/column and value field)\n //\n // {\n // 'name': 'C',\n // 'sharedItems': [5, 24, 35, 45]\n // }\n this.name = name;\n this.sharedItems = sharedItems;\n this.minValue = minValue;\n this.maxValue = maxValue;\n }\n\n render(): string {\n // PivotCache Field: http://www.datypic.com/sc/ooxml/e-ssml_cacheField-1.html\n // Shared Items: http://www.datypic.com/sc/ooxml/e-ssml_sharedItems-1.html\n\n // Escape XML special characters in name attribute\n const escapedName = xmlEncode(this.name);\n\n // No shared items - field not used for rows/columns\n if (this.sharedItems === null) {\n // If no minValue/maxValue, this is an unused field - use empty sharedItems like Excel does\n if (this.minValue === undefined || this.maxValue === undefined) {\n return `<cacheField name=\"${escapedName}\" numFmtId=\"0\">\n <sharedItems />\n </cacheField>`;\n }\n // Numeric field used only for values (not rows/columns) - include min/max\n return `<cacheField name=\"${escapedName}\" numFmtId=\"0\">\n <sharedItems containsSemiMixedTypes=\"0\" containsString=\"0\" containsNumber=\"1\" containsInteger=\"1\" minValue=\"${this.minValue}\" maxValue=\"${this.maxValue}\" />\n </cacheField>`;\n }\n\n // Shared items exist - check if all values are numeric\n // Note: empty array returns true for every(), so check length first\n const allNumeric =\n this.sharedItems.length > 0 &&\n this.sharedItems.every(item => typeof item === \"number\" && Number.isFinite(item));\n const allInteger = allNumeric && this.sharedItems.every(item => Number.isInteger(item));\n\n if (allNumeric) {\n // Numeric shared items - used when field is both a row/column field AND a value field\n // This allows Excel to both group by unique values AND perform aggregation\n const minValue = Math.min(...this.sharedItems);\n const maxValue = Math.max(...this.sharedItems);\n const integerAttr = allInteger ? ' containsInteger=\"1\"' : \"\";\n return `<cacheField name=\"${escapedName}\" numFmtId=\"0\">\n <sharedItems containsSemiMixedTypes=\"0\" containsString=\"0\" containsNumber=\"1\"${integerAttr} minValue=\"${minValue}\" maxValue=\"${maxValue}\" count=\"${this.sharedItems.length}\">\n ${this.sharedItems.map(item => `<n v=\"${item}\" />`).join(\"\")}\n </sharedItems>\n </cacheField>`;\n }\n\n // String shared items - escape XML special characters in each value\n return `<cacheField name=\"${escapedName}\" numFmtId=\"0\">\n <sharedItems count=\"${this.sharedItems.length}\">\n ${this.sharedItems.map(item => `<s v=\"${xmlEncode(String(item))}\" />`).join(\"\")}\n </sharedItems>\n </cacheField>`;\n }\n}\n\nexport { CacheField };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { xmlDecode } from \"@utils/utils\";\n\n/**\n * Parsed cache field model containing name and shared items (if any)\n */\ninterface CacheFieldModel {\n name: string;\n sharedItems: any[] | null;\n // Numeric field metadata\n containsNumber?: boolean;\n containsInteger?: boolean;\n minValue?: number;\n maxValue?: number;\n}\n\n/**\n * Xform for parsing individual <cacheField> elements within a pivot cache definition.\n *\n * Example XML:\n * ```xml\n * <cacheField name=\"Category\" numFmtId=\"0\">\n * <sharedItems count=\"3\">\n * <s v=\"A\" />\n * <s v=\"B\" />\n * <s v=\"C\" />\n * </sharedItems>\n * </cacheField>\n *\n * <cacheField name=\"Value\" numFmtId=\"0\">\n * <sharedItems containsSemiMixedTypes=\"0\" containsString=\"0\"\n * containsNumber=\"1\" containsInteger=\"1\" minValue=\"5\" maxValue=\"45\" />\n * </cacheField>\n * ```\n */\nclass CacheFieldXform extends BaseXform {\n declare public model: CacheFieldModel | null;\n private inSharedItems: boolean;\n\n constructor() {\n super();\n this.model = null;\n this.inSharedItems = false;\n }\n\n get tag(): string {\n return \"cacheField\";\n }\n\n reset(): void {\n this.model = null;\n this.inSharedItems = false;\n }\n\n parseOpen(node: any): boolean {\n const { name, attributes } = node;\n\n switch (name) {\n case \"cacheField\":\n // Initialize the model with field name\n this.model = {\n name: xmlDecode(attributes.name || \"\"),\n sharedItems: null\n };\n break;\n\n case \"sharedItems\":\n this.inSharedItems = true;\n // Store numeric field metadata\n if (this.model) {\n this.model.containsNumber = attributes.containsNumber === \"1\";\n this.model.containsInteger = attributes.containsInteger === \"1\";\n if (attributes.minValue !== undefined) {\n this.model.minValue = parseFloat(attributes.minValue);\n }\n if (attributes.maxValue !== undefined) {\n this.model.maxValue = parseFloat(attributes.maxValue);\n }\n // Initialize sharedItems array if count > 0 (for both string and numeric fields)\n const count = parseInt(attributes.count || \"0\", 10);\n if (count > 0) {\n this.model.sharedItems = [];\n } else {\n // No count means no individual items (pure numeric field)\n this.model.sharedItems = null;\n }\n }\n break;\n\n case \"s\":\n // String value in sharedItems\n if (this.inSharedItems && this.model?.sharedItems !== null) {\n // Decode XML entities in the value\n const value = xmlDecode(attributes.v || \"\");\n this.model.sharedItems!.push(value);\n }\n break;\n\n case \"n\":\n // Numeric value in sharedItems (less common, but possible)\n if (this.inSharedItems && this.model?.sharedItems !== null) {\n const value = parseFloat(attributes.v || \"0\");\n this.model.sharedItems!.push(value as any);\n }\n break;\n\n case \"b\":\n // Boolean value in sharedItems\n if (this.inSharedItems && this.model?.sharedItems !== null) {\n const value = attributes.v === \"1\";\n this.model.sharedItems!.push(value as any);\n }\n break;\n\n case \"e\":\n // Error value in sharedItems\n if (this.inSharedItems && this.model?.sharedItems !== null) {\n const value = `#${attributes.v || \"ERROR!\"}`;\n this.model.sharedItems!.push(value);\n }\n break;\n\n case \"m\":\n // Missing/null value in sharedItems\n if (this.inSharedItems && this.model?.sharedItems !== null) {\n this.model.sharedItems!.push(null as any);\n }\n break;\n\n case \"d\":\n // Date value in sharedItems\n if (this.inSharedItems && this.model?.sharedItems !== null) {\n const value = new Date(attributes.v || \"\");\n this.model.sharedItems!.push(value as any);\n }\n break;\n }\n\n return true;\n }\n\n parseText(_text: string): void {\n // No text content in cacheField elements\n }\n\n parseClose(name: string): boolean {\n switch (name) {\n case \"cacheField\":\n // End of this cacheField element\n return false;\n\n case \"sharedItems\":\n this.inSharedItems = false;\n break;\n }\n\n return true;\n }\n}\n\nexport { CacheFieldXform, type CacheFieldModel };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { CacheField } from \"@excel/xlsx/xform/pivot-table/cache-field\";\nimport { CacheFieldXform, type CacheFieldModel } from \"@excel/xlsx/xform/pivot-table/cache-field-xform\";\nimport { XmlStream } from \"@excel/utils/xml-stream\";\nimport type { PivotTableSource } from \"@excel/pivot-table\";\n\n/**\n * Model for parsed pivot cache definition\n */\ninterface ParsedCacheDefinitionModel {\n // Source worksheet reference\n sourceRef?: string;\n sourceSheet?: string;\n // Cache fields with their shared items\n cacheFields: CacheFieldModel[];\n // Record count\n recordCount?: number;\n // Relationship ID for cache records\n rId?: string;\n // Additional attributes to preserve\n refreshOnLoad?: string;\n createdVersion?: string;\n refreshedVersion?: string;\n minRefreshableVersion?: string;\n // Flag indicating this was loaded from file (not newly created)\n isLoaded?: boolean;\n}\n\n/**\n * Model for generating pivot cache definition (with live source)\n */\ninterface CacheDefinitionModel {\n source: PivotTableSource;\n cacheFields: any[];\n}\n\nclass PivotCacheDefinitionXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public model: ParsedCacheDefinitionModel | null;\n\n // Parser state\n private currentCacheField: CacheFieldXform | null;\n private inCacheFields: boolean;\n private inCacheSource: boolean;\n\n constructor() {\n super();\n\n this.map = {};\n this.model = null;\n this.currentCacheField = null;\n this.inCacheFields = false;\n this.inCacheSource = false;\n }\n\n prepare(_model: any): void {\n // No preparation needed for writing\n }\n\n get tag(): string {\n // http://www.datypic.com/sc/ooxml/e-ssml_pivotCacheDefinition.html\n return \"pivotCacheDefinition\";\n }\n\n reset(): void {\n this.model = null;\n this.currentCacheField = null;\n this.inCacheFields = false;\n this.inCacheSource = false;\n }\n\n /**\n * Render pivot cache definition XML.\n * Supports both newly created models (with PivotTableSource) and loaded models.\n */\n render(xmlStream: any, model: CacheDefinitionModel | ParsedCacheDefinitionModel): void {\n // Check if this is a loaded model (has isLoaded flag or no source property)\n const isLoaded = (model as ParsedCacheDefinitionModel).isLoaded || !(\"source\" in model);\n\n if (isLoaded) {\n this.renderLoaded(xmlStream, model as ParsedCacheDefinitionModel);\n } else {\n this.renderNew(xmlStream, model as CacheDefinitionModel);\n }\n }\n\n /**\n * Render newly created pivot cache definition\n */\n private renderNew(xmlStream: any, model: CacheDefinitionModel): void {\n const { source, cacheFields } = model;\n\n // Record count = number of data rows (excluding header row)\n const recordCount = source.getSheetValues().slice(2).length;\n\n xmlStream.openXml(XmlStream.StdDocAttributes);\n xmlStream.openNode(this.tag, {\n ...PivotCacheDefinitionXform.PIVOT_CACHE_DEFINITION_ATTRIBUTES,\n \"r:id\": \"rId1\",\n refreshOnLoad: \"1\", // important for our implementation to work\n createdVersion: \"8\",\n refreshedVersion: \"8\",\n minRefreshableVersion: \"3\",\n recordCount\n });\n\n xmlStream.openNode(\"cacheSource\", { type: \"worksheet\" });\n xmlStream.leafNode(\"worksheetSource\", {\n ref: source.dimensions.shortRange,\n sheet: source.name\n });\n xmlStream.closeNode();\n\n xmlStream.openNode(\"cacheFields\", { count: cacheFields.length });\n // Note: keeping this pretty-printed for now to ease debugging.\n xmlStream.writeXml(\n cacheFields.map((cacheField: any) => new CacheField(cacheField).render()).join(\"\\n \")\n );\n xmlStream.closeNode();\n\n xmlStream.closeNode();\n }\n\n /**\n * Render loaded pivot cache definition (preserving original structure)\n */\n private renderLoaded(xmlStream: any, model: ParsedCacheDefinitionModel): void {\n const { cacheFields, sourceRef, sourceSheet, recordCount } = model;\n\n xmlStream.openXml(XmlStream.StdDocAttributes);\n xmlStream.openNode(this.tag, {\n ...PivotCacheDefinitionXform.PIVOT_CACHE_DEFINITION_ATTRIBUTES,\n \"r:id\": model.rId || \"rId1\",\n refreshOnLoad: model.refreshOnLoad || \"1\",\n createdVersion: model.createdVersion || \"8\",\n refreshedVersion: model.refreshedVersion || \"8\",\n minRefreshableVersion: model.minRefreshableVersion || \"3\",\n recordCount: recordCount || cacheFields.length + 1\n });\n\n xmlStream.openNode(\"cacheSource\", { type: \"worksheet\" });\n xmlStream.leafNode(\"worksheetSource\", {\n ref: sourceRef,\n sheet: sourceSheet\n });\n xmlStream.closeNode();\n\n xmlStream.openNode(\"cacheFields\", { count: cacheFields.length });\n xmlStream.writeXml(\n cacheFields\n .map((cacheField: CacheFieldModel) => new CacheField(cacheField).render())\n .join(\"\\n \")\n );\n xmlStream.closeNode();\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n const { name, attributes } = node;\n\n // Delegate to current cacheField parser if active\n if (this.currentCacheField) {\n this.currentCacheField.parseOpen(node);\n return true;\n }\n\n switch (name) {\n case this.tag:\n // pivotCacheDefinition root element\n this.reset();\n this.model = {\n cacheFields: [],\n rId: attributes[\"r:id\"],\n refreshOnLoad: attributes.refreshOnLoad,\n createdVersion: attributes.createdVersion,\n refreshedVersion: attributes.refreshedVersion,\n minRefreshableVersion: attributes.minRefreshableVersion,\n recordCount: attributes.recordCount ? parseInt(attributes.recordCount, 10) : undefined,\n isLoaded: true\n };\n break;\n\n case \"cacheSource\":\n this.inCacheSource = true;\n break;\n\n case \"worksheetSource\":\n if (this.inCacheSource && this.model) {\n this.model.sourceRef = attributes.ref;\n this.model.sourceSheet = attributes.sheet;\n }\n break;\n\n case \"cacheFields\":\n this.inCacheFields = true;\n break;\n\n case \"cacheField\":\n if (this.inCacheFields) {\n this.currentCacheField = new CacheFieldXform();\n this.currentCacheField.parseOpen(node);\n }\n break;\n }\n\n return true;\n }\n\n parseText(text: string): void {\n if (this.currentCacheField) {\n this.currentCacheField.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n // Delegate to current cacheField parser if active\n if (this.currentCacheField) {\n if (!this.currentCacheField.parseClose(name)) {\n // cacheField parsing complete, add to model\n if (this.model && this.currentCacheField.model) {\n this.model.cacheFields.push(this.currentCacheField.model);\n }\n this.currentCacheField = null;\n }\n return true;\n }\n\n switch (name) {\n case this.tag:\n // End of pivotCacheDefinition\n return false;\n\n case \"cacheSource\":\n this.inCacheSource = false;\n break;\n\n case \"cacheFields\":\n this.inCacheFields = false;\n break;\n }\n\n return true;\n }\n\n reconcile(_model: any, _options: any): void {\n // No reconciliation needed\n }\n\n static PIVOT_CACHE_DEFINITION_ATTRIBUTES = {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\n \"xmlns:r\": \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\n };\n}\n\nexport { PivotCacheDefinitionXform, type ParsedCacheDefinitionModel };\n","import { XmlStream } from \"@excel/utils/xml-stream\";\nimport { xmlEncode, xmlDecode } from \"@utils/utils\";\nimport { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\n/**\n * Model for generating pivot table (with live source)\n */\ninterface PivotTableModel {\n rows: number[];\n columns: number[];\n values: number[];\n metric: \"sum\" | \"count\";\n cacheFields: any[];\n cacheId: number;\n applyWidthHeightFormats: \"0\" | \"1\";\n}\n\n/**\n * Parsed pivot field\n */\ninterface ParsedPivotField {\n axis?: \"axisRow\" | \"axisCol\" | \"axisPage\" | \"axisValues\";\n dataField?: boolean;\n items?: number[];\n compact?: boolean;\n outline?: boolean;\n showAll?: boolean;\n defaultSubtotal?: boolean;\n}\n\n/**\n * Parsed data field\n */\ninterface ParsedDataField {\n name: string;\n fld: number;\n baseField?: number;\n baseItem?: number;\n subtotal?:\n | \"sum\"\n | \"count\"\n | \"average\"\n | \"max\"\n | \"min\"\n | \"product\"\n | \"countNums\"\n | \"stdDev\"\n | \"stdDevP\"\n | \"var\"\n | \"varP\";\n}\n\n/**\n * Parsed pivot table model (loaded from file)\n */\ninterface ParsedPivotTableModel {\n // Core identifiers\n name?: string;\n cacheId: number;\n uid?: string;\n\n // Location info\n location?: {\n ref: string;\n firstHeaderRow?: number;\n firstDataRow?: number;\n firstDataCol?: number;\n };\n\n // Field configurations\n pivotFields: ParsedPivotField[];\n rowFields: number[]; // Field indices for rows\n colFields: number[]; // Field indices for columns\n dataFields: ParsedDataField[];\n\n // Style and formatting\n applyNumberFormats?: string;\n applyBorderFormats?: string;\n applyFontFormats?: string;\n applyPatternFormats?: string;\n applyAlignmentFormats?: string;\n applyWidthHeightFormats?: string;\n dataCaption?: string;\n styleName?: string;\n\n // Version info\n updatedVersion?: string;\n minRefreshableVersion?: string;\n createdVersion?: string;\n\n // Other attributes\n useAutoFormatting?: boolean;\n itemPrintTitles?: boolean;\n indent?: number;\n compact?: boolean;\n compactData?: boolean;\n multipleFieldFilters?: boolean;\n\n // Row/col items (for grand totals etc)\n rowItems?: any[];\n colItems?: any[];\n\n // Flag indicating this was loaded from file\n isLoaded?: boolean;\n\n // Extended attributes to preserve any custom extensions\n extensions?: any[];\n}\n\nclass PivotTableXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public model: ParsedPivotTableModel | null;\n\n // Parser state\n private inPivotFields: boolean;\n private inRowFields: boolean;\n private inColFields: boolean;\n private inDataFields: boolean;\n private inRowItems: boolean;\n private inColItems: boolean;\n private inLocation: boolean;\n private currentPivotField: ParsedPivotField | null;\n private inItems: boolean;\n private inPivotTableStyleInfo: boolean;\n\n constructor() {\n super();\n\n this.map = {};\n this.model = null;\n this.inPivotFields = false;\n this.inRowFields = false;\n this.inColFields = false;\n this.inDataFields = false;\n this.inRowItems = false;\n this.inColItems = false;\n this.inLocation = false;\n this.currentPivotField = null;\n this.inItems = false;\n this.inPivotTableStyleInfo = false;\n }\n\n prepare(_model: any): void {\n // No preparation needed\n }\n\n get tag(): string {\n // http://www.datypic.com/sc/ooxml/e-ssml_pivotTableDefinition.html\n return \"pivotTableDefinition\";\n }\n\n reset(): void {\n this.model = null;\n this.inPivotFields = false;\n this.inRowFields = false;\n this.inColFields = false;\n this.inDataFields = false;\n this.inRowItems = false;\n this.inColItems = false;\n this.inLocation = false;\n this.currentPivotField = null;\n this.inItems = false;\n this.inPivotTableStyleInfo = false;\n }\n\n /**\n * Render pivot table XML.\n * Supports both newly created models and loaded models.\n */\n render(xmlStream: any, model: PivotTableModel | ParsedPivotTableModel): void {\n const isLoaded = (model as ParsedPivotTableModel).isLoaded;\n\n if (isLoaded) {\n this.renderLoaded(xmlStream, model as ParsedPivotTableModel);\n } else {\n this.renderNew(xmlStream, model as PivotTableModel);\n }\n }\n\n /**\n * Render newly created pivot table\n */\n private renderNew(xmlStream: any, model: PivotTableModel): void {\n const { rows, columns, values, cacheFields, cacheId, applyWidthHeightFormats } = model;\n\n // Build rowItems - need one <i> for each unique value in row fields, plus grand total\n const rowItems = buildRowItems(rows, cacheFields);\n // Build colItems - need one <i> for each unique value in col fields, plus grand total\n const colItems = buildColItems(columns, cacheFields, values.length);\n\n // Calculate pivot table dimensions\n const rowFieldItemCount = rows.length > 0 ? cacheFields[rows[0]]?.sharedItems?.length || 0 : 0;\n const colFieldItemCount =\n columns.length > 0 ? cacheFields[columns[0]]?.sharedItems?.length || 0 : 0;\n\n // Location: A3 is where pivot table starts\n // - firstHeaderRow: 1 (column headers are in first row of pivot table)\n // - firstDataRow: 2 (data starts in second row)\n // - firstDataCol: 1 (data starts in second column, after row labels)\n // Calculate ref based on actual data size:\n // - Start row: 3\n // - Header rows: 2 (column label row + subheader row)\n // - Data rows: rowFieldItemCount\n // - Grand total row: 1\n // endRow = 3 + 2 + rowFieldItemCount + 1 - 1 = 5 + rowFieldItemCount\n // Or simplified: startRow (3) + 1 (column labels) + rowFieldItemCount (data) + 1 (grand total)\n const endRow = 3 + 1 + rowFieldItemCount + 1; // = 5 + rowFieldItemCount\n const endCol = 1 + colFieldItemCount + 1; // start col + data cols + grand total\n const endColLetter = String.fromCharCode(64 + endCol);\n const locationRef = `A3:${endColLetter}${endRow}`;\n\n xmlStream.openXml(XmlStream.StdDocAttributes);\n xmlStream.openNode(this.tag, {\n ...PivotTableXform.PIVOT_TABLE_ATTRIBUTES,\n name: \"PivotTable2\",\n cacheId,\n applyNumberFormats: \"0\",\n applyBorderFormats: \"0\",\n applyFontFormats: \"0\",\n applyPatternFormats: \"0\",\n applyAlignmentFormats: \"0\",\n applyWidthHeightFormats,\n dataCaption: \"Values\",\n updatedVersion: \"8\",\n minRefreshableVersion: \"3\",\n useAutoFormatting: \"1\",\n itemPrintTitles: \"1\",\n createdVersion: \"8\",\n indent: \"0\",\n compact: \"0\",\n compactData: \"0\",\n multipleFieldFilters: \"0\"\n });\n\n xmlStream.writeXml(`\n <location ref=\"${locationRef}\" firstHeaderRow=\"1\" firstDataRow=\"2\" firstDataCol=\"1\" />\n <pivotFields count=\"${cacheFields.length}\">\n ${renderPivotFields(model)}\n </pivotFields>\n <rowFields count=\"${rows.length}\">\n ${rows.map(rowIndex => `<field x=\"${rowIndex}\" />`).join(\"\\n \")}\n </rowFields>\n <rowItems count=\"${rowItems.count}\">\n ${rowItems.xml}\n </rowItems>\n <colFields count=\"${columns.length === 0 ? 1 : columns.length}\">\n ${\n columns.length === 0\n ? '<field x=\"-2\" />'\n : columns.map(columnIndex => `<field x=\"${columnIndex}\" />`).join(\"\\n \")\n }\n </colFields>\n <colItems count=\"${colItems.count}\">\n ${colItems.xml}\n </colItems>\n <dataFields count=\"${values.length}\">\n ${buildDataFields(cacheFields, values, model.metric)}\n </dataFields>\n <pivotTableStyleInfo\n name=\"PivotStyleLight16\"\n showRowHeaders=\"1\"\n showColHeaders=\"1\"\n showRowStripes=\"0\"\n showColStripes=\"0\"\n showLastColumn=\"1\"\n />\n <extLst>\n <ext\n uri=\"{962EF5D1-5CA2-4c93-8EF4-DBF5C05439D2}\"\n xmlns:x14=\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main\"\n >\n <x14:pivotTableDefinition\n hideValuesRow=\"1\"\n xmlns:xm=\"http://schemas.microsoft.com/office/excel/2006/main\"\n />\n </ext>\n <ext\n uri=\"{747A6164-185A-40DC-8AA5-F01512510D54}\"\n xmlns:xpdl=\"http://schemas.microsoft.com/office/spreadsheetml/2016/pivotdefaultlayout\"\n >\n <xpdl:pivotTableDefinition16\n EnabledSubtotalsDefault=\"0\"\n SubtotalsOnTopDefault=\"0\"\n />\n </ext>\n </extLst>\n `);\n\n xmlStream.closeNode();\n }\n\n /**\n * Render loaded pivot table (preserving original structure)\n */\n private renderLoaded(xmlStream: any, model: ParsedPivotTableModel): void {\n xmlStream.openXml(XmlStream.StdDocAttributes);\n xmlStream.openNode(this.tag, {\n ...PivotTableXform.PIVOT_TABLE_ATTRIBUTES,\n name: model.name || \"PivotTable1\",\n cacheId: model.cacheId,\n applyNumberFormats: model.applyNumberFormats || \"0\",\n applyBorderFormats: model.applyBorderFormats || \"0\",\n applyFontFormats: model.applyFontFormats || \"0\",\n applyPatternFormats: model.applyPatternFormats || \"0\",\n applyAlignmentFormats: model.applyAlignmentFormats || \"0\",\n applyWidthHeightFormats: model.applyWidthHeightFormats || \"0\",\n dataCaption: model.dataCaption || \"Values\",\n updatedVersion: model.updatedVersion || \"8\",\n minRefreshableVersion: model.minRefreshableVersion || \"3\",\n useAutoFormatting: model.useAutoFormatting ? \"1\" : \"0\",\n itemPrintTitles: model.itemPrintTitles ? \"1\" : \"0\",\n createdVersion: model.createdVersion || \"8\",\n indent: model.indent !== undefined ? String(model.indent) : \"0\",\n compact: model.compact ? \"1\" : \"0\",\n compactData: model.compactData ? \"1\" : \"0\",\n multipleFieldFilters: model.multipleFieldFilters ? \"1\" : \"0\"\n });\n\n // Location\n if (model.location) {\n xmlStream.leafNode(\"location\", {\n ref: model.location.ref,\n firstHeaderRow: model.location.firstHeaderRow,\n firstDataRow: model.location.firstDataRow,\n firstDataCol: model.location.firstDataCol\n });\n }\n\n // Pivot fields\n if (model.pivotFields.length > 0) {\n xmlStream.openNode(\"pivotFields\", { count: model.pivotFields.length });\n for (const pivotField of model.pivotFields) {\n this.renderPivotFieldLoaded(xmlStream, pivotField);\n }\n xmlStream.closeNode();\n }\n\n // Row fields\n if (model.rowFields.length > 0) {\n xmlStream.openNode(\"rowFields\", { count: model.rowFields.length });\n for (const fieldIndex of model.rowFields) {\n xmlStream.leafNode(\"field\", { x: fieldIndex });\n }\n xmlStream.closeNode();\n }\n\n // Row items (simplified - just grand total)\n xmlStream.writeXml(`\n <rowItems count=\"1\">\n <i t=\"grand\"><x /></i>\n </rowItems>`);\n\n // Col fields\n const colFieldCount = model.colFields.length === 0 ? 1 : model.colFields.length;\n xmlStream.openNode(\"colFields\", { count: colFieldCount });\n if (model.colFields.length === 0) {\n xmlStream.leafNode(\"field\", { x: -2 });\n } else {\n for (const fieldIndex of model.colFields) {\n xmlStream.leafNode(\"field\", { x: fieldIndex });\n }\n }\n xmlStream.closeNode();\n\n // Col items (simplified - just grand total)\n xmlStream.writeXml(`\n <colItems count=\"1\">\n <i t=\"grand\"><x /></i>\n </colItems>`);\n\n // Data fields\n if (model.dataFields.length > 0) {\n xmlStream.openNode(\"dataFields\", { count: model.dataFields.length });\n for (const dataField of model.dataFields) {\n const attrs: any = {\n name: dataField.name,\n fld: dataField.fld,\n baseField: dataField.baseField ?? 0,\n baseItem: dataField.baseItem ?? 0\n };\n if (dataField.subtotal && dataField.subtotal !== \"sum\") {\n attrs.subtotal = dataField.subtotal;\n }\n xmlStream.leafNode(\"dataField\", attrs);\n }\n xmlStream.closeNode();\n }\n\n // Style info\n xmlStream.leafNode(\"pivotTableStyleInfo\", {\n name: model.styleName || \"PivotStyleLight16\",\n showRowHeaders: \"1\",\n showColHeaders: \"1\",\n showRowStripes: \"0\",\n showColStripes: \"0\",\n showLastColumn: \"1\"\n });\n\n // Extensions\n xmlStream.writeXml(`\n <extLst>\n <ext\n uri=\"{962EF5D1-5CA2-4c93-8EF4-DBF5C05439D2}\"\n xmlns:x14=\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main\"\n >\n <x14:pivotTableDefinition\n hideValuesRow=\"1\"\n xmlns:xm=\"http://schemas.microsoft.com/office/excel/2006/main\"\n />\n </ext>\n <ext\n uri=\"{747A6164-185A-40DC-8AA5-F01512510D54}\"\n xmlns:xpdl=\"http://schemas.microsoft.com/office/spreadsheetml/2016/pivotdefaultlayout\"\n >\n <xpdl:pivotTableDefinition16\n EnabledSubtotalsDefault=\"0\"\n SubtotalsOnTopDefault=\"0\"\n />\n </ext>\n </extLst>\n `);\n\n xmlStream.closeNode();\n }\n\n /**\n * Render a loaded pivot field\n */\n private renderPivotFieldLoaded(xmlStream: any, field: ParsedPivotField): void {\n const attrs: any = {\n compact: field.compact ? \"1\" : \"0\",\n outline: field.outline ? \"1\" : \"0\",\n showAll: field.showAll ? \"1\" : \"0\",\n defaultSubtotal: field.defaultSubtotal ? \"1\" : \"0\"\n };\n\n if (field.axis) {\n attrs.axis = field.axis;\n }\n if (field.dataField) {\n attrs.dataField = \"1\";\n }\n\n if (field.items && field.items.length > 0) {\n xmlStream.openNode(\"pivotField\", attrs);\n xmlStream.openNode(\"items\", { count: field.items.length + 1 });\n for (const itemIndex of field.items) {\n xmlStream.leafNode(\"item\", { x: itemIndex });\n }\n // Grand total item\n xmlStream.writeXml('<item t=\"default\" />');\n xmlStream.closeNode(); // items\n xmlStream.closeNode(); // pivotField\n } else {\n xmlStream.leafNode(\"pivotField\", attrs);\n }\n }\n\n parseOpen(node: any): boolean {\n const { name, attributes } = node;\n\n switch (name) {\n case this.tag:\n // pivotTableDefinition root element\n this.reset();\n this.model = {\n name: attributes.name,\n cacheId: parseInt(attributes.cacheId || \"0\", 10),\n uid: attributes[\"xr:uid\"],\n pivotFields: [],\n rowFields: [],\n colFields: [],\n dataFields: [],\n applyNumberFormats: attributes.applyNumberFormats,\n applyBorderFormats: attributes.applyBorderFormats,\n applyFontFormats: attributes.applyFontFormats,\n applyPatternFormats: attributes.applyPatternFormats,\n applyAlignmentFormats: attributes.applyAlignmentFormats,\n applyWidthHeightFormats: attributes.applyWidthHeightFormats,\n dataCaption: attributes.dataCaption,\n updatedVersion: attributes.updatedVersion,\n minRefreshableVersion: attributes.minRefreshableVersion,\n createdVersion: attributes.createdVersion,\n useAutoFormatting: attributes.useAutoFormatting === \"1\",\n itemPrintTitles: attributes.itemPrintTitles === \"1\",\n indent: attributes.indent ? parseInt(attributes.indent, 10) : 0,\n compact: attributes.compact === \"1\",\n compactData: attributes.compactData === \"1\",\n multipleFieldFilters: attributes.multipleFieldFilters === \"1\",\n isLoaded: true\n };\n break;\n\n case \"location\":\n if (this.model) {\n this.model.location = {\n ref: attributes.ref,\n firstHeaderRow: attributes.firstHeaderRow\n ? parseInt(attributes.firstHeaderRow, 10)\n : undefined,\n firstDataRow: attributes.firstDataRow\n ? parseInt(attributes.firstDataRow, 10)\n : undefined,\n firstDataCol: attributes.firstDataCol\n ? parseInt(attributes.firstDataCol, 10)\n : undefined\n };\n }\n break;\n\n case \"pivotFields\":\n this.inPivotFields = true;\n break;\n\n case \"pivotField\":\n if (this.inPivotFields) {\n this.currentPivotField = {\n axis: attributes.axis as any,\n dataField: attributes.dataField === \"1\",\n items: [],\n compact: attributes.compact === \"1\",\n outline: attributes.outline === \"1\",\n showAll: attributes.showAll === \"1\",\n defaultSubtotal: attributes.defaultSubtotal === \"1\"\n };\n }\n break;\n\n case \"items\":\n if (this.currentPivotField) {\n this.inItems = true;\n }\n break;\n\n case \"item\":\n if (this.inItems && this.currentPivotField && attributes.x !== undefined) {\n this.currentPivotField.items!.push(parseInt(attributes.x, 10));\n }\n break;\n\n case \"rowFields\":\n this.inRowFields = true;\n break;\n\n case \"colFields\":\n this.inColFields = true;\n break;\n\n case \"dataFields\":\n this.inDataFields = true;\n break;\n\n case \"rowItems\":\n this.inRowItems = true;\n break;\n\n case \"colItems\":\n this.inColItems = true;\n break;\n\n case \"field\":\n // Handle field element (used in rowFields, colFields)\n if (this.model) {\n const fieldIndex = parseInt(attributes.x || \"0\", 10);\n if (this.inRowFields) {\n this.model.rowFields.push(fieldIndex);\n } else if (this.inColFields) {\n this.model.colFields.push(fieldIndex);\n }\n }\n break;\n\n case \"dataField\":\n if (this.inDataFields && this.model) {\n this.model.dataFields.push({\n name: xmlDecode(attributes.name || \"\"),\n fld: parseInt(attributes.fld || \"0\", 10),\n baseField: attributes.baseField ? parseInt(attributes.baseField, 10) : 0,\n baseItem: attributes.baseItem ? parseInt(attributes.baseItem, 10) : 0,\n subtotal: attributes.subtotal as any\n });\n }\n break;\n\n case \"pivotTableStyleInfo\":\n if (this.model) {\n this.model.styleName = attributes.name;\n }\n break;\n }\n\n return true;\n }\n\n parseText(_text: string): void {\n // No text content in pivot table elements\n }\n\n parseClose(name: string): boolean {\n switch (name) {\n case this.tag:\n // End of pivotTableDefinition\n return false;\n\n case \"pivotFields\":\n this.inPivotFields = false;\n break;\n\n case \"pivotField\":\n if (this.currentPivotField && this.model) {\n this.model.pivotFields.push(this.currentPivotField);\n this.currentPivotField = null;\n }\n break;\n\n case \"items\":\n this.inItems = false;\n break;\n\n case \"rowFields\":\n this.inRowFields = false;\n break;\n\n case \"colFields\":\n this.inColFields = false;\n break;\n\n case \"dataFields\":\n this.inDataFields = false;\n break;\n\n case \"rowItems\":\n this.inRowItems = false;\n break;\n\n case \"colItems\":\n this.inColItems = false;\n break;\n }\n\n return true;\n }\n\n reconcile(_model: any, _options: any): void {\n // No reconciliation needed\n }\n\n static PIVOT_TABLE_ATTRIBUTES = {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"\n };\n}\n\n// Helpers\n\n/**\n * Build rowItems XML - one item for each unique value in row fields, plus grand total.\n * Each <i> represents a row in the pivot table.\n * - Regular items: <i><x/></i> for index 0, <i><x v=\"index\"/></i> for index > 0\n * - Grand total: <i t=\"grand\"><x/></i>\n * Note: When v=0, the v attribute should be omitted (Excel convention)\n */\nfunction buildRowItems(rows: number[], cacheFields: any[]): { count: number; xml: string } {\n if (rows.length === 0) {\n // No row fields - just grand total\n return { count: 1, xml: '<i t=\"grand\"><x /></i>' };\n }\n\n // Get unique values count from the first row field\n const rowFieldIndex = rows[0];\n const sharedItems = cacheFields[rowFieldIndex]?.sharedItems || [];\n const itemCount = sharedItems.length;\n\n // Build items: one for each unique value + grand total\n const items: string[] = [];\n\n // Regular items - reference each unique value by index\n // Note: v=\"0\" should be omitted (Excel uses <x/> instead of <x v=\"0\"/>)\n for (let i = 0; i < itemCount; i++) {\n if (i === 0) {\n items.push(\"<i><x /></i>\");\n } else {\n items.push(`<i><x v=\"${i}\" /></i>`);\n }\n }\n\n // Grand total row\n items.push('<i t=\"grand\"><x /></i>');\n\n return {\n count: items.length,\n xml: items.join(\"\\n \")\n };\n}\n\n/**\n * Build colItems XML - one item for each unique value in column fields, plus grand total.\n * When there are multiple data fields (values), each column value may have sub-columns.\n * Note: When v=0, the v attribute should be omitted (Excel convention)\n */\nfunction buildColItems(\n columns: number[],\n cacheFields: any[],\n valueCount: number\n): { count: number; xml: string } {\n if (columns.length === 0) {\n // No column fields - columns are based on data fields (values)\n if (valueCount > 1) {\n // Multiple values: one column per value + grand total\n const items: string[] = [];\n for (let i = 0; i < valueCount; i++) {\n if (i === 0) {\n items.push(\"<i><x /></i>\");\n } else {\n items.push(`<i><x v=\"${i}\" /></i>`);\n }\n }\n items.push('<i t=\"grand\"><x /></i>');\n return { count: items.length, xml: items.join(\"\\n \") };\n }\n // Single value: just grand total\n return { count: 1, xml: '<i t=\"grand\"><x /></i>' };\n }\n\n // Get unique values count from the first column field\n const colFieldIndex = columns[0];\n const sharedItems = cacheFields[colFieldIndex]?.sharedItems || [];\n const itemCount = sharedItems.length;\n\n // Build items: one for each unique value + grand total\n const items: string[] = [];\n\n // Regular items - reference each unique value by index\n // Note: v=\"0\" should be omitted (Excel uses <x/> instead of <x v=\"0\"/>)\n for (let i = 0; i < itemCount; i++) {\n if (i === 0) {\n items.push(\"<i><x /></i>\");\n } else {\n items.push(`<i><x v=\"${i}\" /></i>`);\n }\n }\n\n // Grand total column\n items.push('<i t=\"grand\"><x /></i>');\n\n return {\n count: items.length,\n xml: items.join(\"\\n \")\n };\n}\n\n/**\n * Build dataField XML elements for all values in the pivot table.\n * Supports multiple values when columns is empty.\n */\nfunction buildDataFields(cacheFields: any[], values: number[], metric: \"sum\" | \"count\"): string {\n const metricName = metric === \"count\" ? \"Count\" : \"Sum\";\n // For 'count' metric, Excel requires subtotal=\"count\" attribute\n const subtotalAttr = metric === \"count\" ? ' subtotal=\"count\"' : \"\";\n\n return values\n .map(\n valueIndex => `<dataField\n name=\"${metricName} of ${xmlEncode(cacheFields[valueIndex].name)}\"\n fld=\"${valueIndex}\"\n baseField=\"0\"\n baseItem=\"0\"${subtotalAttr}\n />`\n )\n .join(\"\");\n}\n\nfunction renderPivotFields(pivotTable: PivotTableModel): string {\n // Pre-compute field type lookup for O(1) access\n const rowSet = new Set(pivotTable.rows);\n const colSet = new Set(pivotTable.columns);\n const valueSet = new Set(pivotTable.values);\n\n return pivotTable.cacheFields\n .map((cacheField: any, fieldIndex: number) => {\n const isRow = rowSet.has(fieldIndex);\n const isCol = colSet.has(fieldIndex);\n const isValue = valueSet.has(fieldIndex);\n return renderPivotField(isRow, isCol, isValue, cacheField.sharedItems);\n })\n .join(\"\");\n}\n\nfunction renderPivotField(\n isRow: boolean,\n isCol: boolean,\n isValue: boolean,\n sharedItems: any[] | null\n): string {\n // A field can be both a row/column field AND a value field\n // In this case, it needs both axis attribute AND dataField=\"1\"\n\n if (isRow || isCol) {\n const axis = isRow ? \"axisRow\" : \"axisCol\";\n // Row and column fields should NOT have defaultSubtotal=\"0\"\n let axisAttributes = 'compact=\"0\" outline=\"0\" showAll=\"0\"';\n // If also a value field, add dataField=\"1\"\n if (isValue) {\n axisAttributes = `dataField=\"1\" ${axisAttributes}`;\n }\n // items = one for each shared item + one default item\n const itemsXml = [\n ...sharedItems!.map((_item: any, index: number) => `<item x=\"${index}\" />`),\n '<item t=\"default\" />' // Required default item for subtotals/grand totals\n ].join(\"\\n \");\n return `\n <pivotField axis=\"${axis}\" ${axisAttributes}>\n <items count=\"${sharedItems!.length + 1}\">\n ${itemsXml}\n </items>\n </pivotField>\n `;\n }\n // Value fields and non-axis fields should have defaultSubtotal=\"0\"\n const defaultAttributes = 'compact=\"0\" outline=\"0\" showAll=\"0\" defaultSubtotal=\"0\"';\n return `\n <pivotField\n ${isValue ? 'dataField=\"1\"' : \"\"}\n ${defaultAttributes}\n />\n `;\n}\n\nexport { PivotTableXform, type ParsedPivotTableModel };\n","import { RichTextXform } from \"@excel/xlsx/xform/strings/rich-text-xform\";\nimport { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface NoteText {\n font?: any;\n text: string;\n}\n\ninterface CommentNote {\n texts: NoteText[];\n}\n\ninterface CommentModel {\n type: string;\n note: CommentNote;\n ref: string;\n authorId?: number;\n}\n\nclass CommentXform extends BaseXform {\n declare public model: CommentModel;\n declare public parser: any;\n declare private _richTextXform?: RichTextXform;\n\n constructor(model?: CommentModel) {\n super();\n this.model = model || { type: \"note\", note: { texts: [] }, ref: \"\" };\n }\n\n get tag(): string {\n return \"r\";\n }\n\n get richTextXform(): RichTextXform {\n if (!this._richTextXform) {\n this._richTextXform = new RichTextXform();\n }\n return this._richTextXform;\n }\n\n render(xmlStream: any, model?: CommentModel): void {\n const renderModel = model || this.model;\n\n xmlStream.openNode(\"comment\", {\n ref: renderModel.ref,\n authorId: 0\n });\n xmlStream.openNode(\"text\");\n if (renderModel && renderModel.note && renderModel.note.texts) {\n renderModel.note.texts.forEach(text => {\n this.richTextXform.render(xmlStream, text);\n });\n }\n xmlStream.closeNode();\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"comment\":\n this.model = {\n type: \"note\",\n note: {\n texts: []\n },\n ...node.attributes\n };\n return true;\n case \"r\":\n this.parser = this.richTextXform;\n this.parser.parseOpen(node);\n return true;\n default:\n return false;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n switch (name) {\n case \"comment\":\n return false;\n case \"r\":\n this.model.note.texts.push(this.parser.model);\n this.parser = undefined;\n return true;\n default:\n if (this.parser) {\n this.parser.parseClose(name);\n }\n return true;\n }\n }\n}\n\nexport { CommentXform };\n","import { XmlStream } from \"@excel/utils/xml-stream\";\nimport { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { CommentXform } from \"@excel/xlsx/xform/comment/comment-xform\";\n\ninterface CommentsModel {\n comments: any[];\n}\n\nclass CommentsXform extends BaseXform {\n declare public map: { [key: string]: CommentXform };\n declare public parser: any;\n declare public model: CommentsModel;\n\n constructor() {\n super();\n this.map = {\n comment: new CommentXform()\n };\n this.model = { comments: [] };\n }\n\n render(xmlStream: any, model?: CommentsModel): void {\n const renderModel = model || this.model;\n xmlStream.openXml(XmlStream.StdDocAttributes);\n xmlStream.openNode(\"comments\", CommentsXform.COMMENTS_ATTRIBUTES);\n\n // authors\n // TODO: support authors properly\n xmlStream.openNode(\"authors\");\n xmlStream.leafNode(\"author\", null, \"Author\");\n xmlStream.closeNode();\n\n // comments\n xmlStream.openNode(\"commentList\");\n renderModel.comments.forEach(comment => {\n this.map.comment.render(xmlStream, comment);\n });\n xmlStream.closeNode();\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"commentList\":\n this.model = {\n comments: []\n };\n return true;\n case \"comment\":\n this.parser = this.map.comment;\n this.parser.parseOpen(node);\n return true;\n default:\n return false;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n switch (name) {\n case \"commentList\":\n return false;\n case \"comment\":\n this.model.comments.push(this.parser.model);\n this.parser = undefined;\n return true;\n default:\n if (this.parser) {\n this.parser.parseClose(name);\n }\n return true;\n }\n }\n\n static COMMENTS_ATTRIBUTES = {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"\n };\n}\n\nexport { CommentsXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface Margins {\n inset?: number[] | string;\n}\n\ninterface NoteModel {\n margins?: Margins;\n}\n\ninterface TextboxModel {\n note?: NoteModel;\n inset?: number[];\n}\n\nclass VmlTextboxXform extends BaseXform {\n declare public model: TextboxModel;\n\n constructor() {\n super();\n this.model = {};\n }\n\n get tag(): string {\n return \"v:textbox\";\n }\n\n conversionUnit(value: string | number, multiple: number, unit: string): string {\n return `${(parseFloat(value.toString()) * multiple).toFixed(2)}${unit}`;\n }\n\n reverseConversionUnit(inset?: string): number[] {\n return (inset || \"\").split(\",\").map(margin => {\n return Number(parseFloat(this.conversionUnit(parseFloat(margin), 0.1, \"\")).toFixed(2));\n });\n }\n\n render(xmlStream: any, model: TextboxModel): void {\n const attributes: any = {\n style: \"mso-direction-alt:auto\"\n };\n if (model && model.note) {\n let { inset } = (model.note && model.note.margins) || {};\n if (Array.isArray(inset)) {\n inset = inset\n .map(margin => {\n return this.conversionUnit(margin, 10, \"mm\");\n })\n .join(\",\");\n }\n if (inset) {\n attributes.inset = inset;\n }\n }\n xmlStream.openNode(\"v:textbox\", attributes);\n xmlStream.leafNode(\"div\", { style: \"text-align:left\" });\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n this.model = {\n inset: this.reverseConversionUnit(node.attributes.inset)\n };\n return true;\n default:\n return true;\n }\n }\n\n parseText(): void {}\n\n parseClose(name: string): boolean {\n switch (name) {\n case this.tag:\n return false;\n default:\n return true;\n }\n }\n}\n\nexport { VmlTextboxXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\ninterface AnchorModel {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\ninterface RefAddress {\n col: number;\n row: number;\n}\n\ninterface RenderModel {\n anchor?: AnchorModel;\n refAddress?: RefAddress;\n}\n\n// render the triangle in the cell for the comment\nclass VmlAnchorXform extends BaseXform {\n declare private text: string;\n\n constructor() {\n super();\n this.text = \"\";\n }\n\n get tag(): string {\n return \"x:Anchor\";\n }\n\n getAnchorRect(anchor: AnchorModel): number[] {\n const l = Math.floor(anchor.left);\n const lf = Math.floor((anchor.left - l) * 68);\n const t = Math.floor(anchor.top);\n const tf = Math.floor((anchor.top - t) * 18);\n const r = Math.floor(anchor.right);\n const rf = Math.floor((anchor.right - r) * 68);\n const b = Math.floor(anchor.bottom);\n const bf = Math.floor((anchor.bottom - b) * 18);\n return [l, lf, t, tf, r, rf, b, bf];\n }\n\n getDefaultRect(ref: RefAddress): number[] {\n const l = ref.col;\n const lf = 6;\n const t = Math.max(ref.row - 2, 0);\n const tf = 14;\n const r = l + 2;\n const rf = 2;\n const b = t + 4;\n const bf = 16;\n return [l, lf, t, tf, r, rf, b, bf];\n }\n\n render(xmlStream: any, model: RenderModel): void {\n const rect = model.anchor\n ? this.getAnchorRect(model.anchor)\n : this.getDefaultRect(model.refAddress!);\n\n xmlStream.leafNode(\"x:Anchor\", null, rect.join(\", \"));\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n this.text = \"\";\n return true;\n default:\n return false;\n }\n }\n\n parseText(text: string): void {\n this.text = text;\n }\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { VmlAnchorXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\nclass VmlProtectionXform extends BaseXform {\n declare private _model: { tag?: string };\n declare private text: string;\n\n constructor(model?: { tag?: string }) {\n super();\n this._model = model || {};\n this.text = \"\";\n }\n\n get tag(): string {\n return (this._model && this._model.tag) || \"\";\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.leafNode(this.tag, null, model);\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n this.text = \"\";\n return true;\n default:\n return false;\n }\n }\n\n parseText(text: string): void {\n this.text = text;\n }\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { VmlProtectionXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\n\nclass VmlPositionXform extends BaseXform {\n declare private _model: { tag?: string };\n declare public model: { [key: string]: boolean };\n\n constructor(model?: { tag?: string }) {\n super();\n this._model = model || {};\n this.model = {};\n }\n\n get tag(): string {\n return (this._model && this._model.tag) || \"\";\n }\n\n render(xmlStream: any, model: string, type?: string[]): void {\n if (type && model === type[2]) {\n xmlStream.leafNode(this.tag);\n } else if (type && this.tag === \"x:SizeWithCells\" && model === type[1]) {\n xmlStream.leafNode(this.tag);\n }\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n this.model = {};\n this.model[this.tag] = true;\n return true;\n default:\n return false;\n }\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { VmlPositionXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { VmlAnchorXform } from \"@excel/xlsx/xform/comment/vml-anchor-xform\";\nimport { VmlProtectionXform } from \"@excel/xlsx/xform/comment/style/vml-protection-xform\";\nimport { VmlPositionXform } from \"@excel/xlsx/xform/comment/style/vml-position-xform\";\n\nconst POSITION_TYPE = [\"twoCells\", \"oneCells\", \"absolute\"];\n\ninterface Protection {\n locked?: string;\n lockText?: string;\n}\n\ninterface ClientDataModel {\n anchor: any;\n protection: Protection;\n editAs: string;\n}\n\ninterface RenderModel {\n note: {\n protection: Protection;\n editAs: string;\n };\n refAddress: {\n row: number;\n col: number;\n };\n}\n\nclass VmlClientDataXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser: any;\n declare public model: ClientDataModel;\n\n constructor() {\n super();\n this.map = {\n \"x:Anchor\": new VmlAnchorXform(),\n \"x:Locked\": new VmlProtectionXform({ tag: \"x:Locked\" }),\n \"x:LockText\": new VmlProtectionXform({ tag: \"x:LockText\" }),\n \"x:SizeWithCells\": new VmlPositionXform({ tag: \"x:SizeWithCells\" }),\n \"x:MoveWithCells\": new VmlPositionXform({ tag: \"x:MoveWithCells\" })\n };\n this.model = { anchor: [], protection: {}, editAs: \"\" };\n }\n\n get tag(): string {\n return \"x:ClientData\";\n }\n\n render(xmlStream: any, model: RenderModel): void {\n const { protection, editAs } = model.note;\n xmlStream.openNode(this.tag, { ObjectType: \"Note\" });\n this.map[\"x:MoveWithCells\"].render(xmlStream, editAs, POSITION_TYPE);\n this.map[\"x:SizeWithCells\"].render(xmlStream, editAs, POSITION_TYPE);\n this.map[\"x:Anchor\"].render(xmlStream, model);\n this.map[\"x:Locked\"].render(xmlStream, protection.locked);\n xmlStream.leafNode(\"x:AutoFill\", null, \"False\");\n this.map[\"x:LockText\"].render(xmlStream, protection.lockText);\n xmlStream.leafNode(\"x:Row\", null, model.refAddress.row - 1);\n xmlStream.leafNode(\"x:Column\", null, model.refAddress.col - 1);\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n this.reset();\n this.model = {\n anchor: [],\n protection: {},\n editAs: \"\"\n };\n break;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n }\n break;\n }\n return true;\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n this.normalizeModel();\n return false;\n default:\n return true;\n }\n }\n\n normalizeModel(): void {\n const position = Object.assign(\n {},\n this.map[\"x:MoveWithCells\"].model,\n this.map[\"x:SizeWithCells\"].model\n );\n const len = Object.keys(position).length;\n this.model.editAs = POSITION_TYPE[len];\n this.model.anchor = this.map[\"x:Anchor\"].text;\n this.model.protection.locked = this.map[\"x:Locked\"].text;\n this.model.protection.lockText = this.map[\"x:LockText\"].text;\n }\n}\n\nexport { VmlClientDataXform };\n","import { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { VmlTextboxXform } from \"@excel/xlsx/xform/comment/vml-textbox-xform\";\nimport { VmlClientDataXform } from \"@excel/xlsx/xform/comment/vml-client-data-xform\";\n\ninterface ShapeModel {\n note: {\n margins?: {\n insetmode?: string;\n inset?: number[];\n };\n };\n refAddress?: any;\n}\n\nclass VmlShapeXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser: any;\n declare public model: any;\n\n constructor() {\n super();\n this.map = {\n \"v:textbox\": new VmlTextboxXform(),\n \"x:ClientData\": new VmlClientDataXform()\n };\n }\n\n get tag(): string {\n return \"v:shape\";\n }\n\n render(xmlStream: any, model: ShapeModel, index?: number): void {\n xmlStream.openNode(\"v:shape\", VmlShapeXform.V_SHAPE_ATTRIBUTES(model, index || 0));\n\n xmlStream.leafNode(\"v:fill\", { color2: \"infoBackground [80]\" });\n xmlStream.leafNode(\"v:shadow\", { color: \"none [81]\", obscured: \"t\" });\n xmlStream.leafNode(\"v:path\", { \"o:connecttype\": \"none\" });\n this.map[\"v:textbox\"].render(xmlStream, model);\n this.map[\"x:ClientData\"].render(xmlStream, model);\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n\n switch (node.name) {\n case this.tag:\n this.reset();\n this.model = {\n margins: {\n insetmode: node.attributes[\"o:insetmode\"]\n },\n anchor: \"\",\n editAs: \"\",\n protection: {}\n };\n break;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n }\n break;\n }\n return true;\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n this.model.margins.inset = this.map[\"v:textbox\"].model && this.map[\"v:textbox\"].model.inset;\n this.model.protection =\n this.map[\"x:ClientData\"].model && this.map[\"x:ClientData\"].model.protection;\n this.model.anchor = this.map[\"x:ClientData\"].model && this.map[\"x:ClientData\"].model.anchor;\n this.model.editAs = this.map[\"x:ClientData\"].model && this.map[\"x:ClientData\"].model.editAs;\n return false;\n default:\n return true;\n }\n }\n\n static V_SHAPE_ATTRIBUTES = (model: ShapeModel, index: number): any => ({\n id: `_x0000_s${1025 + index}`,\n type: \"#_x0000_t202\",\n style:\n \"position:absolute; margin-left:105.3pt;margin-top:10.5pt;width:97.8pt;height:59.1pt;z-index:1;visibility:hidden\",\n fillcolor: \"infoBackground [80]\",\n strokecolor: \"none [81]\",\n \"o:insetmode\": model.note.margins && model.note.margins.insetmode\n });\n}\n\nexport { VmlShapeXform };\n","import { XmlStream } from \"@excel/utils/xml-stream\";\nimport { BaseXform } from \"@excel/xlsx/xform/base-xform\";\nimport { VmlShapeXform } from \"@excel/xlsx/xform/comment/vml-shape-xform\";\n\ninterface VmlNotesModel {\n comments: any[];\n}\n\n// This class is (currently) single purposed to insert the triangle\n// drawing icons on commented cells\nclass VmlNotesXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser: any;\n declare public model: VmlNotesModel;\n\n constructor() {\n super();\n this.map = {\n \"v:shape\": new VmlShapeXform()\n };\n this.model = { comments: [] };\n }\n\n get tag(): string {\n return \"xml\";\n }\n\n render(xmlStream: any, model?: VmlNotesModel): void {\n const renderModel = model || this.model;\n xmlStream.openXml(XmlStream.StdDocAttributes);\n xmlStream.openNode(this.tag, VmlNotesXform.DRAWING_ATTRIBUTES);\n\n xmlStream.openNode(\"o:shapelayout\", { \"v:ext\": \"edit\" });\n xmlStream.leafNode(\"o:idmap\", { \"v:ext\": \"edit\", data: 1 });\n xmlStream.closeNode();\n\n xmlStream.openNode(\"v:shapetype\", {\n id: \"_x0000_t202\",\n coordsize: \"21600,21600\",\n \"o:spt\": 202,\n path: \"m,l,21600r21600,l21600,xe\"\n });\n xmlStream.leafNode(\"v:stroke\", { joinstyle: \"miter\" });\n xmlStream.leafNode(\"v:path\", { gradientshapeok: \"t\", \"o:connecttype\": \"rect\" });\n xmlStream.closeNode();\n\n renderModel.comments.forEach((item, index) => {\n this.map[\"v:shape\"].render(xmlStream, item, index);\n });\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case this.tag:\n this.reset();\n this.model = {\n comments: []\n };\n break;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n }\n break;\n }\n return true;\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.model.comments.push(this.parser.model);\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n return false;\n default:\n // could be some unrecognised tags\n return true;\n }\n }\n\n reconcile(model: any, options: any): void {\n model.anchors.forEach((anchor: any) => {\n if (anchor.br) {\n this.map[\"xdr:twoCellAnchor\"].reconcile(anchor, options);\n } else {\n this.map[\"xdr:oneCellAnchor\"].reconcile(anchor, options);\n }\n });\n }\n\n static DRAWING_ATTRIBUTES = {\n \"xmlns:v\": \"urn:schemas-microsoft-com:vml\",\n \"xmlns:o\": \"urn:schemas-microsoft-com:office:office\",\n \"xmlns:x\": \"urn:schemas-microsoft-com:office:excel\"\n };\n}\n\nexport { VmlNotesXform };\n","export const theme1Xml =\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<a:theme xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" name=\"Office Theme\"> <a:themeElements> <a:clrScheme name=\"Office\"> <a:dk1> <a:sysClr val=\"windowText\" lastClr=\"000000\"/> </a:dk1> <a:lt1> <a:sysClr val=\"window\" lastClr=\"FFFFFF\"/> </a:lt1> <a:dk2> <a:srgbClr val=\"1F497D\"/> </a:dk2> <a:lt2> <a:srgbClr val=\"EEECE1\"/> </a:lt2> <a:accent1> <a:srgbClr val=\"4F81BD\"/> </a:accent1> <a:accent2> <a:srgbClr val=\"C0504D\"/> </a:accent2> <a:accent3> <a:srgbClr val=\"9BBB59\"/> </a:accent3> <a:accent4> <a:srgbClr val=\"8064A2\"/> </a:accent4> <a:accent5> <a:srgbClr val=\"4BACC6\"/> </a:accent5> <a:accent6> <a:srgbClr val=\"F79646\"/> </a:accent6> <a:hlink> <a:srgbClr val=\"0000FF\"/> </a:hlink> <a:folHlink> <a:srgbClr val=\"800080\"/> </a:folHlink> </a:clrScheme> <a:fontScheme name=\"Office\"> <a:majorFont> <a:latin typeface=\"Cambria\"/> <a:ea typeface=\"\"/> <a:cs typeface=\"\"/> <a:font script=\"Jpan\" typeface=\"MS Pゴシック\"/> <a:font script=\"Hang\" typeface=\"맑은 고딕\"/> <a:font script=\"Hans\" typeface=\"宋体\"/> <a:font script=\"Hant\" typeface=\"新細明體\"/> <a:font script=\"Arab\" typeface=\"Times New Roman\"/> <a:font script=\"Hebr\" typeface=\"Times New Roman\"/> <a:font script=\"Thai\" typeface=\"Tahoma\"/> <a:font script=\"Ethi\" typeface=\"Nyala\"/> <a:font script=\"Beng\" typeface=\"Vrinda\"/> <a:font script=\"Gujr\" typeface=\"Shruti\"/> <a:font script=\"Khmr\" typeface=\"MoolBoran\"/> <a:font script=\"Knda\" typeface=\"Tunga\"/> <a:font script=\"Guru\" typeface=\"Raavi\"/> <a:font script=\"Cans\" typeface=\"Euphemia\"/> <a:font script=\"Cher\" typeface=\"Plantagenet Cherokee\"/> <a:font script=\"Yiii\" typeface=\"Microsoft Yi Baiti\"/> <a:font script=\"Tibt\" typeface=\"Microsoft Himalaya\"/> <a:font script=\"Thaa\" typeface=\"MV Boli\"/> <a:font script=\"Deva\" typeface=\"Mangal\"/> <a:font script=\"Telu\" typeface=\"Gautami\"/> <a:font script=\"Taml\" typeface=\"Latha\"/> <a:font script=\"Syrc\" typeface=\"Estrangelo Edessa\"/> <a:font script=\"Orya\" typeface=\"Kalinga\"/> <a:font script=\"Mlym\" typeface=\"Kartika\"/> <a:font script=\"Laoo\" typeface=\"DokChampa\"/> <a:font script=\"Sinh\" typeface=\"Iskoola Pota\"/> <a:font script=\"Mong\" typeface=\"Mongolian Baiti\"/> <a:font script=\"Viet\" typeface=\"Times New Roman\"/> <a:font script=\"Uigh\" typeface=\"Microsoft Uighur\"/> <a:font script=\"Geor\" typeface=\"Sylfaen\"/> </a:majorFont> <a:minorFont> <a:latin typeface=\"Calibri\"/> <a:ea typeface=\"\"/> <a:cs typeface=\"\"/> <a:font script=\"Jpan\" typeface=\"MS Pゴシック\"/> <a:font script=\"Hang\" typeface=\"맑은 고딕\"/> <a:font script=\"Hans\" typeface=\"宋体\"/> <a:font script=\"Hant\" typeface=\"新細明體\"/> <a:font script=\"Arab\" typeface=\"Arial\"/> <a:font script=\"Hebr\" typeface=\"Arial\"/> <a:font script=\"Thai\" typeface=\"Tahoma\"/> <a:font script=\"Ethi\" typeface=\"Nyala\"/> <a:font script=\"Beng\" typeface=\"Vrinda\"/> <a:font script=\"Gujr\" typeface=\"Shruti\"/> <a:font script=\"Khmr\" typeface=\"DaunPenh\"/> <a:font script=\"Knda\" typeface=\"Tunga\"/> <a:font script=\"Guru\" typeface=\"Raavi\"/> <a:font script=\"Cans\" typeface=\"Euphemia\"/> <a:font script=\"Cher\" typeface=\"Plantagenet Cherokee\"/> <a:font script=\"Yiii\" typeface=\"Microsoft Yi Baiti\"/> <a:font script=\"Tibt\" typeface=\"Microsoft Himalaya\"/> <a:font script=\"Thaa\" typeface=\"MV Boli\"/> <a:font script=\"Deva\" typeface=\"Mangal\"/> <a:font script=\"Telu\" typeface=\"Gautami\"/> <a:font script=\"Taml\" typeface=\"Latha\"/> <a:font script=\"Syrc\" typeface=\"Estrangelo Edessa\"/> <a:font script=\"Orya\" typeface=\"Kalinga\"/> <a:font script=\"Mlym\" typeface=\"Kartika\"/> <a:font script=\"Laoo\" typeface=\"DokChampa\"/> <a:font script=\"Sinh\" typeface=\"Iskoola Pota\"/> <a:font script=\"Mong\" typeface=\"Mongolian Baiti\"/> <a:font script=\"Viet\" typeface=\"Arial\"/> <a:font script=\"Uigh\" typeface=\"Microsoft Uighur\"/> <a:font script=\"Geor\" typeface=\"Sylfaen\"/> </a:minorFont> </a:fontScheme> <a:fmtScheme name=\"Office\"> <a:fillStyleLst> <a:solidFill> <a:schemeClr val=\"phClr\"/> </a:solidFill> <a:gradFill rotWithShape=\"1\"> <a:gsLst> <a:gs pos=\"0\"> <a:schemeClr val=\"phClr\"> <a:tint val=\"50000\"/> <a:satMod val=\"300000\"/> </a:schemeClr> </a:gs> <a:gs pos=\"35000\"> <a:schemeClr val=\"phClr\"> <a:tint val=\"37000\"/> <a:satMod val=\"300000\"/> </a:schemeClr> </a:gs> <a:gs pos=\"100000\"> <a:schemeClr val=\"phClr\"> <a:tint val=\"15000\"/> <a:satMod val=\"350000\"/> </a:schemeClr> </a:gs> </a:gsLst> <a:lin ang=\"16200000\" scaled=\"1\"/> </a:gradFill> <a:gradFill rotWithShape=\"1\"> <a:gsLst> <a:gs pos=\"0\"> <a:schemeClr val=\"phClr\"> <a:tint val=\"100000\"/> <a:shade val=\"100000\"/> <a:satMod val=\"130000\"/> </a:schemeClr> </a:gs> <a:gs pos=\"100000\"> <a:schemeClr val=\"phClr\"> <a:tint val=\"50000\"/> <a:shade val=\"100000\"/> <a:satMod val=\"350000\"/> </a:schemeClr> </a:gs> </a:gsLst> <a:lin ang=\"16200000\" scaled=\"0\"/> </a:gradFill> </a:fillStyleLst> <a:lnStyleLst> <a:ln w=\"9525\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"> <a:solidFill> <a:schemeClr val=\"phClr\"> <a:shade val=\"95000\"/> <a:satMod val=\"105000\"/> </a:schemeClr> </a:solidFill> <a:prstDash val=\"solid\"/> </a:ln> <a:ln w=\"25400\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"> <a:solidFill> <a:schemeClr val=\"phClr\"/> </a:solidFill> <a:prstDash val=\"solid\"/> </a:ln> <a:ln w=\"38100\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"> <a:solidFill> <a:schemeClr val=\"phClr\"/> </a:solidFill> <a:prstDash val=\"solid\"/> </a:ln> </a:lnStyleLst> <a:effectStyleLst> <a:effectStyle> <a:effectLst> <a:outerShdw blurRad=\"40000\" dist=\"20000\" dir=\"5400000\" rotWithShape=\"0\"> <a:srgbClr val=\"000000\"> <a:alpha val=\"38000\"/> </a:srgbClr> </a:outerShdw> </a:effectLst> </a:effectStyle> <a:effectStyle> <a:effectLst> <a:outerShdw blurRad=\"40000\" dist=\"23000\" dir=\"5400000\" rotWithShape=\"0\"> <a:srgbClr val=\"000000\"> <a:alpha val=\"35000\"/> </a:srgbClr> </a:outerShdw> </a:effectLst> </a:effectStyle> <a:effectStyle> <a:effectLst> <a:outerShdw blurRad=\"40000\" dist=\"23000\" dir=\"5400000\" rotWithShape=\"0\"> <a:srgbClr val=\"000000\"> <a:alpha val=\"35000\"/> </a:srgbClr> </a:outerShdw> </a:effectLst> <a:scene3d> <a:camera prst=\"orthographicFront\"> <a:rot lat=\"0\" lon=\"0\" rev=\"0\"/> </a:camera> <a:lightRig rig=\"threePt\" dir=\"t\"> <a:rot lat=\"0\" lon=\"0\" rev=\"1200000\"/> </a:lightRig> </a:scene3d> <a:sp3d> <a:bevelT w=\"63500\" h=\"25400\"/> </a:sp3d> </a:effectStyle> </a:effectStyleLst> <a:bgFillStyleLst> <a:solidFill> <a:schemeClr val=\"phClr\"/> </a:solidFill> <a:gradFill rotWithShape=\"1\"> <a:gsLst> <a:gs pos=\"0\"> <a:schemeClr val=\"phClr\"> <a:tint val=\"40000\"/> <a:satMod val=\"350000\"/> </a:schemeClr> </a:gs> <a:gs pos=\"40000\"> <a:schemeClr val=\"phClr\"> <a:tint val=\"45000\"/> <a:shade val=\"99000\"/> <a:satMod val=\"350000\"/> </a:schemeClr> </a:gs> <a:gs pos=\"100000\"> <a:schemeClr val=\"phClr\"> <a:shade val=\"20000\"/> <a:satMod val=\"255000\"/> </a:schemeClr> </a:gs> </a:gsLst> <a:path path=\"circle\"> <a:fillToRect l=\"50000\" t=\"-80000\" r=\"50000\" b=\"180000\"/> </a:path> </a:gradFill> <a:gradFill rotWithShape=\"1\"> <a:gsLst> <a:gs pos=\"0\"> <a:schemeClr val=\"phClr\"> <a:tint val=\"80000\"/> <a:satMod val=\"300000\"/> </a:schemeClr> </a:gs> <a:gs pos=\"100000\"> <a:schemeClr val=\"phClr\"> <a:shade val=\"30000\"/> <a:satMod val=\"200000\"/> </a:schemeClr> </a:gs> </a:gsLst> <a:path path=\"circle\"> <a:fillToRect l=\"50000\" t=\"50000\" r=\"50000\" b=\"50000\"/> </a:path> </a:gradFill> </a:bgFillStyleLst> </a:fmtScheme> </a:themeElements> <a:objectDefaults> <a:spDef> <a:spPr/> <a:bodyPr/> <a:lstStyle/> <a:style> <a:lnRef idx=\"1\"> <a:schemeClr val=\"accent1\"/> </a:lnRef> <a:fillRef idx=\"3\"> <a:schemeClr val=\"accent1\"/> </a:fillRef> <a:effectRef idx=\"2\"> <a:schemeClr val=\"accent1\"/> </a:effectRef> <a:fontRef idx=\"minor\"> <a:schemeClr val=\"lt1\"/> </a:fontRef> </a:style> </a:spDef> <a:lnDef> <a:spPr/> <a:bodyPr/> <a:lstStyle/> <a:style> <a:lnRef idx=\"2\"> <a:schemeClr val=\"accent1\"/> </a:lnRef> <a:fillRef idx=\"0\"> <a:schemeClr val=\"accent1\"/> </a:fillRef> <a:effectRef idx=\"1\"> <a:schemeClr val=\"accent1\"/> </a:effectRef> <a:fontRef idx=\"minor\"> <a:schemeClr val=\"tx1\"/> </a:fontRef> </a:style> </a:lnDef> </a:objectDefaults> <a:extraClrSchemeLst/> </a:theme>';\n","/**\n * StringBuf - Cross-Platform String Buffer\n *\n * A way to keep string memory operations to a minimum while building XML strings.\n * Uses TextEncoder and Uint8Array for cross-platform compatibility (Node.js + Browser).\n */\n\ninterface StringBufOptions {\n size?: number;\n encoding?: string; // Only UTF-8 is supported (TextEncoder limitation)\n}\n\nconst encoder = new TextEncoder();\n\n/**\n * StringBuf - efficient string builder using Uint8Array\n * Works identically in Node.js and Browser environments.\n */\nclass StringBuf {\n private _buf: Uint8Array;\n private _inPos: number;\n private _buffer: Uint8Array | undefined;\n\n constructor(options?: StringBufOptions) {\n this._buf = new Uint8Array((options && options.size) || 16384);\n // TextEncoder only supports UTF-8, so encoding option is ignored\n this._inPos = 0;\n this._buffer = undefined;\n }\n\n get length(): number {\n return this._inPos;\n }\n\n get capacity(): number {\n return this._buf.length;\n }\n\n get buffer(): Uint8Array {\n return this._buf;\n }\n\n toBuffer(): Uint8Array {\n // Return the current data as a single enclosing buffer\n if (!this._buffer) {\n this._buffer = this._buf.slice(0, this._inPos);\n }\n return this._buffer;\n }\n\n reset(position?: number): void {\n position = position || 0;\n this._buffer = undefined;\n this._inPos = position;\n }\n\n private _grow(min: number): void {\n let size = this._buf.length * 2;\n while (size < min) {\n size *= 2;\n }\n const buf = new Uint8Array(size);\n buf.set(this._buf);\n this._buf = buf;\n }\n\n addText(text: string): void {\n this._buffer = undefined;\n\n // Encode string to UTF-8 bytes\n const encoded = encoder.encode(text);\n const minSpace = this._inPos + encoded.length;\n\n // Grow preemptively: if remaining space < 4 bytes margin, double\n // This matches original Buffer behavior where growth is triggered proactively\n if (minSpace > this._buf.length - 4) {\n this._grow(minSpace);\n }\n\n // Copy encoded bytes to buffer\n this._buf.set(encoded, this._inPos);\n this._inPos += encoded.length;\n }\n\n addStringBuf(inBuf: StringBuf): void {\n if (inBuf.length) {\n this._buffer = undefined;\n\n if (this.length + inBuf.length > this.capacity) {\n this._grow(this.length + inBuf.length);\n }\n\n // Copy bytes from input buffer\n this._buf.set(inBuf._buf.subarray(0, inBuf.length), this._inPos);\n this._inPos += inBuf.length;\n }\n }\n}\n\nexport { StringBuf };\n","/**\n * StreamBuf - Cross-Platform Multi-purpose Read-Write Stream\n *\n * A unified implementation that works in both Node.js and Browser environments\n * using the cross-platform EventEmitter from modules/stream.\n *\n * Features:\n * - As MemBuf: write data, then call toBuffer() to consolidate\n * - As StreamHub: pipe to multiple writable streams\n * - As readable stream: feed data into writable part and read from it\n */\n\nimport { EventEmitter } from \"@stream\";\nimport { StringBuf } from \"@excel/utils/string-buf\";\n\n// =============================================================================\n// Data Chunks - encapsulating incoming data\n// =============================================================================\n\n// Encoding type - simplified from Node.js BufferEncoding (TextEncoder only supports UTF-8)\ntype TextEncoding = \"utf-8\" | \"utf8\" | BufferEncoding;\n\nclass StringChunk {\n private _data: string;\n private _buffer?: Uint8Array;\n\n constructor(data: string) {\n this._data = data;\n }\n\n get length(): number {\n return this.toBuffer().length;\n }\n\n copy(target: Uint8Array, targetOffset: number, offset: number, length: number): number {\n const buf = this.toBuffer();\n const bytesToCopy = Math.min(length, buf.length - offset);\n target.set(buf.subarray(offset, offset + bytesToCopy), targetOffset);\n return bytesToCopy;\n }\n\n toBuffer(): Uint8Array {\n if (!this._buffer) {\n this._buffer = new TextEncoder().encode(this._data);\n }\n return this._buffer;\n }\n}\n\nclass StringBufChunk {\n private _data: StringBuf;\n\n constructor(data: StringBuf) {\n this._data = data;\n }\n\n get length(): number {\n return this._data.length;\n }\n\n copy(target: Uint8Array, targetOffset: number, offset: number, length: number): number {\n const buf = this.toBuffer();\n const bytesToCopy = Math.min(length, buf.length - offset);\n target.set(buf.subarray(offset, offset + bytesToCopy), targetOffset);\n return bytesToCopy;\n }\n\n toBuffer(): Uint8Array {\n return this._data.toBuffer();\n }\n}\n\nclass BufferChunk {\n private _data: Uint8Array;\n\n constructor(data: Uint8Array) {\n this._data = data;\n }\n\n get length(): number {\n return this._data.length;\n }\n\n copy(target: Uint8Array, targetOffset: number, offset: number, length: number): number {\n const bytesToCopy = Math.min(length, this._data.length - offset);\n target.set(this._data.subarray(offset, offset + bytesToCopy), targetOffset);\n return bytesToCopy;\n }\n\n toBuffer(): Uint8Array {\n return this._data;\n }\n}\n\ntype Chunk = StringChunk | StringBufChunk | BufferChunk;\n\n// =============================================================================\n// ReadWriteBuf - a single buffer supporting simple read-write\n// =============================================================================\n\nclass ReadWriteBuf {\n size: number;\n buffer: Uint8Array;\n iRead: number;\n iWrite: number;\n\n constructor(size: number) {\n this.size = size;\n this.buffer = new Uint8Array(size);\n this.iRead = 0;\n this.iWrite = 0;\n }\n\n toBuffer(): Uint8Array {\n if (this.iRead === 0 && this.iWrite === this.size) {\n return this.buffer;\n }\n return this.buffer.slice(this.iRead, this.iWrite);\n }\n\n get length(): number {\n return this.iWrite - this.iRead;\n }\n\n get eod(): boolean {\n return this.iRead === this.iWrite;\n }\n\n get full(): boolean {\n return this.iWrite === this.size;\n }\n\n read(size?: number): Uint8Array | null {\n if (size === 0) {\n return null;\n }\n\n if (size === undefined || size >= this.length) {\n const buf = this.toBuffer();\n this.iRead = this.iWrite;\n return buf;\n }\n\n const buf = this.buffer.slice(this.iRead, this.iRead + size);\n this.iRead += size;\n return buf;\n }\n\n write(chunk: Chunk, offset: number, length: number): number {\n const size = Math.min(length, this.size - this.iWrite);\n chunk.copy(this.buffer, this.iWrite, offset, offset + size);\n this.iWrite += size;\n return size;\n }\n}\n\n// =============================================================================\n// StreamBuf Options\n// =============================================================================\n\ninterface StreamBufOptions {\n bufSize?: number;\n batch?: boolean;\n}\n\n// =============================================================================\n// StreamBuf - Cross-Platform Implementation\n// =============================================================================\n\n/**\n * StreamBuf is a multi-purpose read-write stream that works in both\n * Node.js and Browser environments.\n *\n * It extends EventEmitter to provide stream-like events:\n * - 'data': emitted when data is written (flowing mode)\n * - 'readable': emitted when data is available to read\n * - 'finish': emitted when end() is called\n * - 'error': emitted on errors\n * - 'drain': emitted when buffer drains (after pipe)\n */\nclass StreamBuf extends EventEmitter {\n private bufSize: number;\n private buffers: ReadWriteBuf[];\n private batch: boolean;\n private corked: boolean;\n private paused: boolean;\n private encoding: string | null;\n private pipes: any[];\n private _ended: boolean;\n // Native WritableStream support\n private _writableStream: WritableStream<Uint8Array> | null = null;\n private _writableStreamWriter: WritableStreamDefaultWriter<Uint8Array> | null = null;\n private _asyncWriteQueue: Promise<void> = Promise.resolve();\n\n constructor(options?: StreamBufOptions) {\n super();\n this.bufSize = options?.bufSize || 1024 * 1024;\n this.buffers = [];\n this.batch = options?.batch || false;\n this.corked = false;\n this.paused = false;\n this.encoding = null;\n this.pipes = [];\n this._ended = false;\n }\n\n /**\n * Returns true if the stream is writable (not ended)\n * Required for compatibility with Node.js pipe()\n */\n get writable(): boolean {\n return !this._ended;\n }\n\n /**\n * Consolidate all buffers into a single Uint8Array\n */\n toBuffer(): Uint8Array | null {\n switch (this.buffers.length) {\n case 0:\n return null;\n case 1:\n return this.buffers[0].toBuffer();\n default: {\n const totalLength = this.buffers.reduce((acc, buf) => acc + buf.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const rwBuf of this.buffers) {\n const buf = rwBuf.toBuffer();\n result.set(buf, offset);\n offset += buf.length;\n }\n return result;\n }\n }\n }\n\n private _getWritableBuffer(): ReadWriteBuf {\n if (this.buffers.length) {\n const last = this.buffers[this.buffers.length - 1];\n if (!last.full) {\n return last;\n }\n }\n const buf = new ReadWriteBuf(this.bufSize);\n this.buffers.push(buf);\n return buf;\n }\n\n private async _pipeChunk(chunk: Chunk): Promise<void> {\n const writePromises = this.pipes.map(\n (pipe: any) =>\n new Promise<void>(resolve => {\n pipe.write(chunk.toBuffer(), () => resolve());\n })\n );\n await Promise.all(writePromises);\n }\n\n private _writeToBuffers(chunk: Chunk): void {\n let inPos = 0;\n const inLen = chunk.length;\n while (inPos < inLen) {\n const buffer = this._getWritableBuffer();\n inPos += buffer.write(chunk, inPos, inLen - inPos);\n }\n }\n\n /**\n * Write data to the stream\n */\n async write(\n data: Uint8Array | string | StringBuf | ArrayBuffer | ArrayBufferView,\n encoding?: TextEncoding | Function,\n callback?: Function\n ): Promise<boolean> {\n const nop = () => {};\n if (typeof encoding === \"function\") {\n callback = encoding;\n }\n callback = callback || nop;\n\n // Create chunk from data\n let chunk: Chunk;\n if (data instanceof StringBuf || (data && (data as any).constructor?.name === \"StringBuf\")) {\n chunk = new StringBufChunk(data as StringBuf);\n } else if (data instanceof Uint8Array) {\n chunk = new BufferChunk(data);\n } else if (ArrayBuffer.isView(data)) {\n chunk = new BufferChunk(new Uint8Array(data.buffer, data.byteOffset, data.byteLength));\n } else if (data instanceof ArrayBuffer) {\n chunk = new BufferChunk(new Uint8Array(data));\n } else if (typeof data === \"string\") {\n chunk = new StringChunk(data);\n } else {\n throw new Error(\"Chunk must be one of type String, Uint8Array, ArrayBuffer or StringBuf.\");\n }\n\n // Handle piping and buffering\n if (this.pipes.length) {\n if (this.batch) {\n this._writeToBuffers(chunk);\n while (!this.corked && this.buffers.length > 1) {\n const buf = this.buffers.shift()!;\n await this._pipeChunk(new BufferChunk(buf.toBuffer()));\n }\n } else if (!this.corked) {\n await this._pipeChunk(chunk);\n callback();\n } else {\n this._writeToBuffers(chunk);\n queueMicrotask(() => callback!());\n }\n } else {\n const chunkBuffer = chunk.toBuffer();\n\n if (!this.paused) {\n this.emit(\"data\", chunkBuffer);\n }\n\n // Also write to native WritableStream if connected\n if (this._writableStreamWriter) {\n this._asyncWriteQueue = this._asyncWriteQueue.then(() =>\n this._writableStreamWriter!.write(chunkBuffer)\n );\n }\n\n this._writeToBuffers(chunk);\n this.emit(\"readable\");\n }\n\n return true;\n }\n\n /**\n * Cork the stream - buffer writes until uncork\n */\n cork(): void {\n this.corked = true;\n }\n\n private _flush(): void {\n if (this.pipes.length) {\n const flushAll = async () => {\n while (this.buffers.length) {\n const buf = this.buffers.shift()!;\n await this._pipeChunk(new BufferChunk(buf.toBuffer()));\n }\n };\n flushAll().catch(err => this.emit(\"error\", err));\n }\n }\n\n /**\n * Uncork the stream - flush buffered writes\n */\n uncork(): void {\n this.corked = false;\n this._flush();\n }\n\n /**\n * End the stream\n */\n end(chunk?: any, encoding?: TextEncoding, callback?: Function): void {\n const writeComplete = (error?: Error) => {\n if (error) {\n callback?.(error);\n return;\n }\n\n this._ended = true;\n this._flush();\n this.pipes.forEach((pipe: any) => {\n if (typeof pipe.end === \"function\") {\n pipe.end();\n }\n });\n\n // If we have a native WritableStream, wait for all async writes to complete\n if (this._writableStreamWriter) {\n this._asyncWriteQueue\n .then(() => this._writableStreamWriter!.close())\n .then(() => {\n this.emit(\"finish\");\n })\n .catch(err => {\n this.emit(\"error\", err);\n });\n } else {\n this.emit(\"finish\");\n }\n };\n\n if (chunk) {\n this.write(chunk, encoding, writeComplete);\n } else {\n writeComplete();\n }\n }\n\n /**\n * Read from the stream\n */\n read(size?: number): Uint8Array {\n if (size) {\n const buffers: Uint8Array[] = [];\n let remaining = size;\n while (remaining && this.buffers.length && !this.buffers[0].eod) {\n const first = this.buffers[0];\n const buffer = first.read(remaining);\n if (buffer) {\n remaining -= buffer.length;\n buffers.push(buffer);\n }\n if (first.eod && first.full) {\n this.buffers.shift();\n }\n }\n return concatUint8Arrays(buffers);\n }\n\n const buffers = this.buffers.map(buf => buf.toBuffer()).filter(Boolean) as Uint8Array[];\n this.buffers = [];\n return concatUint8Arrays(buffers);\n }\n\n /**\n * Read from the stream and return as string.\n * Cross-platform compatible - works identically in Node.js and Browser.\n */\n readString(encoding?: TextEncoding): string {\n const enc = encoding || (this.encoding as TextEncoding) || \"utf-8\";\n const buf = this.read();\n if (typeof Buffer !== \"undefined\" && buf instanceof Buffer) {\n return buf.toString(enc);\n }\n return new TextDecoder(enc).decode(buf);\n }\n\n /**\n * Set encoding for string reads\n */\n setEncoding(encoding: string): void {\n this.encoding = encoding;\n }\n\n /**\n * Pause the stream\n */\n pause(): void {\n this.paused = true;\n }\n\n /**\n * Resume the stream\n */\n resume(): void {\n this.paused = false;\n }\n\n /**\n * Check if stream is paused\n */\n isPaused(): boolean {\n return this.paused;\n }\n\n /**\n * Pipe to a writable stream\n */\n pipe<T extends { write: Function; end?: Function }>(destination: T): T {\n this.pipes.push(destination);\n if (!this.paused && this.buffers.length) {\n this.end();\n }\n return destination;\n }\n\n /**\n * Pipe to a native WritableStream (browser Streams API).\n * This properly handles async writes and waits for completion before finish.\n */\n pipeTo(writableStream: WritableStream<Uint8Array>): void {\n this._writableStream = writableStream;\n this._writableStreamWriter = writableStream.getWriter();\n }\n\n /**\n * Remove a piped destination\n */\n unpipe(destination: any): void {\n this.pipes = this.pipes.filter((pipe: any) => pipe !== destination);\n }\n\n /**\n * Put data back at the front (not implemented)\n */\n unshift(): void {\n throw new Error(\"Not Implemented\");\n }\n\n /**\n * Wrap a stream (not implemented)\n */\n wrap(): void {\n throw new Error(\"Not Implemented\");\n }\n\n /**\n * Push data to the stream (alias for write)\n */\n push(chunk: any): boolean {\n if (chunk !== null) {\n this.write(chunk);\n }\n return true;\n }\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Concatenate multiple Uint8Arrays into one\n * Returns Buffer in Node.js for better toString() compatibility\n */\nfunction concatUint8Arrays(arrays: Uint8Array[]): Uint8Array {\n // In Node.js, use Buffer.concat for better compatibility (Buffer.toString() works)\n if (typeof Buffer !== \"undefined\" && typeof Buffer.concat === \"function\") {\n return Buffer.concat(arrays);\n }\n\n if (arrays.length === 0) {\n return new Uint8Array(0);\n }\n if (arrays.length === 1) {\n return arrays[0];\n }\n\n const totalLength = arrays.reduce((acc, arr) => acc + arr.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const arr of arrays) {\n result.set(arr, offset);\n offset += arr.length;\n }\n return result;\n}\n\nexport { StreamBuf };\n","/**\n * CRC32 calculation core (shared between Node.js and browser).\n *\n * Implements CRC-32 IEEE 802.3 using the reversed polynomial 0xEDB88320.\n *\n * Notes:\n * - Uses a lazily-initialized 256-entry lookup table.\n * - Exposes an incremental update API for streaming use cases.\n */\n\nlet _crc32Table: Uint32Array | null = null;\n\nfunction getCrc32Table(): Uint32Array {\n if (_crc32Table) {\n return _crc32Table;\n }\n\n const table = new Uint32Array(256);\n for (let i = 0; i < 256; i++) {\n let crc = i;\n for (let j = 0; j < 8; j++) {\n crc = crc & 1 ? 0xedb88320 ^ (crc >>> 1) : crc >>> 1;\n }\n table[i] = crc;\n }\n\n _crc32Table = table;\n return table;\n}\n\n/**\n * Update a CRC32 value with a new data chunk.\n *\n * The CRC state here is the non-finalized (inverted) form:\n * - initial state: 0xffffffff\n * - finalize: xor with 0xffffffff\n */\nexport function crc32UpdateJS(crc: number, data: Uint8Array): number {\n const table = getCrc32Table();\n for (let i = 0; i < data.length; i++) {\n crc = table[(crc ^ data[i]) & 0xff] ^ (crc >>> 8);\n }\n return crc;\n}\n\n/**\n * Finalize CRC32 calculation.\n */\nexport function crc32Finalize(crc: number): number {\n return (crc ^ 0xffffffff) >>> 0;\n}\n\n/**\n * Compute CRC32 for the full input using the JS table implementation.\n */\nexport function crc32JS(data: Uint8Array): number {\n return crc32Finalize(crc32UpdateJS(0xffffffff, data));\n}\n","export function sumUint8ArrayLengths(arrays: readonly Uint8Array[]): number {\n let totalLength = 0;\n for (let i = 0; i < arrays.length; i++) {\n totalLength += arrays[i].length;\n }\n return totalLength;\n}\n\nexport function concatUint8Arrays(arrays: readonly Uint8Array[]): Uint8Array {\n const len = arrays.length;\n if (len === 0) {\n return new Uint8Array(0);\n }\n if (len === 1) {\n return arrays[0];\n }\n\n const totalLength = sumUint8ArrayLengths(arrays);\n const result = new Uint8Array(totalLength);\n\n let offset = 0;\n for (let i = 0; i < len; i++) {\n const arr = arrays[i];\n result.set(arr, offset);\n offset += arr.length;\n }\n\n return result;\n}\n\n/**\n * Find the first index of `pattern` within `buffer`.\n * Returns -1 when not found.\n */\nexport function indexOfUint8ArrayPattern(\n buffer: Uint8Array,\n pattern: Uint8Array,\n startIndex = 0\n): number {\n const bufLen = buffer.length;\n const patLen = pattern.length;\n if (patLen === 0) {\n return 0;\n }\n if (patLen > bufLen) {\n return -1;\n }\n\n let start = startIndex | 0;\n if (start < 0) {\n start = 0;\n }\n if (start > bufLen - patLen) {\n return -1;\n }\n\n // Fast paths for small patterns (very common in ZIP parsing: 2/3/4-byte signatures).\n if (patLen === 1) {\n const p0 = pattern[0];\n for (let i = start; i < bufLen; i++) {\n if (buffer[i] === p0) {\n return i;\n }\n }\n return -1;\n }\n\n if (patLen === 2) {\n const p0 = pattern[0];\n const p1 = pattern[1];\n for (let i = start; i <= bufLen - 2; i++) {\n if (buffer[i] === p0 && buffer[i + 1] === p1) {\n return i;\n }\n }\n return -1;\n }\n\n if (patLen === 3) {\n const p0 = pattern[0];\n const p1 = pattern[1];\n const p2 = pattern[2];\n for (let i = start; i <= bufLen - 3; i++) {\n if (buffer[i] === p0 && buffer[i + 1] === p1 && buffer[i + 2] === p2) {\n return i;\n }\n }\n return -1;\n }\n\n if (patLen === 4) {\n const p0 = pattern[0];\n const p1 = pattern[1];\n const p2 = pattern[2];\n const p3 = pattern[3];\n for (let i = start; i <= bufLen - 4; i++) {\n if (\n buffer[i] === p0 &&\n buffer[i + 1] === p1 &&\n buffer[i + 2] === p2 &&\n buffer[i + 3] === p3\n ) {\n return i;\n }\n }\n return -1;\n }\n\n outer: for (let i = start; i <= bufLen - patLen; i++) {\n for (let j = 0; j < patLen; j++) {\n if (buffer[i + j] !== pattern[j]) {\n continue outer;\n }\n }\n return i;\n }\n return -1;\n}\n","/**\n * Pure JavaScript DEFLATE implementation for browsers without CompressionStream support\n *\n * This fallback supports:\n * - Decompression: Full DEFLATE decompression (RFC 1951)\n * - Compression: STORE mode only (no compression, but valid DEFLATE format)\n *\n * Used automatically when CompressionStream with \"deflate-raw\" is unavailable:\n * - Firefox < 113\n * - Safari < 16.4\n * - Chrome < 103\n */\n\nimport { concatUint8Arrays } from \"@archive/utils/bytes\";\n\n// ============================================================================\n// DEFLATE Decompression (Full implementation)\n// ============================================================================\n\n// Fixed Huffman code lengths for literals/lengths (RFC 1951)\nconst FIXED_LITERAL_LENGTHS = new Uint8Array(288);\nfor (let i = 0; i <= 143; i++) {\n FIXED_LITERAL_LENGTHS[i] = 8;\n}\nfor (let i = 144; i <= 255; i++) {\n FIXED_LITERAL_LENGTHS[i] = 9;\n}\nfor (let i = 256; i <= 279; i++) {\n FIXED_LITERAL_LENGTHS[i] = 7;\n}\nfor (let i = 280; i <= 287; i++) {\n FIXED_LITERAL_LENGTHS[i] = 8;\n}\n\n// Fixed Huffman code lengths for distances\nconst FIXED_DISTANCE_LENGTHS = new Uint8Array(32).fill(5);\n\n// Length base values and extra bits (codes 257-285)\nconst LENGTH_BASE = [\n 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131,\n 163, 195, 227, 258\n];\nconst LENGTH_EXTRA = [\n 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0\n];\n\n// Distance base values and extra bits (codes 0-29)\nconst DISTANCE_BASE = [\n 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049,\n 3073, 4097, 6145, 8193, 12289, 16385, 24577\n];\nconst DISTANCE_EXTRA = [\n 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13\n];\n\n// Code length order for dynamic Huffman tables\nconst CODE_LENGTH_ORDER = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];\n\n/**\n * Huffman tree node\n */\ninterface HuffmanNode {\n symbol?: number;\n left?: HuffmanNode;\n right?: HuffmanNode;\n}\n\n/**\n * Build Huffman tree from code lengths\n */\nfunction buildHuffmanTree(lengths: Uint8Array, maxSymbol: number): HuffmanNode {\n // Count codes of each length\n const blCount = new Uint16Array(16);\n for (let i = 0; i < maxSymbol; i++) {\n if (lengths[i] > 0) {\n blCount[lengths[i]]++;\n }\n }\n\n // Find first code value for each length\n const nextCode = new Uint16Array(16);\n let code = 0;\n for (let bits = 1; bits <= 15; bits++) {\n code = (code + blCount[bits - 1]) << 1;\n nextCode[bits] = code;\n }\n\n // Build tree\n const root: HuffmanNode = {};\n\n for (let symbol = 0; symbol < maxSymbol; symbol++) {\n const len = lengths[symbol];\n if (len === 0) {\n continue;\n }\n\n code = nextCode[len]++;\n let node = root;\n\n for (let bit = len - 1; bit >= 0; bit--) {\n const b = (code >> bit) & 1;\n if (b === 0) {\n if (!node.left) {\n node.left = {};\n }\n node = node.left;\n } else {\n if (!node.right) {\n node.right = {};\n }\n node = node.right;\n }\n }\n node.symbol = symbol;\n }\n\n return root;\n}\n\n/**\n * Bit reader for DEFLATE streams\n */\nclass BitReader {\n private data: Uint8Array;\n private pos: number;\n private bitBuf: number;\n private bitCount: number;\n\n constructor(data: Uint8Array) {\n this.data = data;\n this.pos = 0;\n this.bitBuf = 0;\n this.bitCount = 0;\n }\n\n /**\n * Read n bits (LSB first)\n */\n readBits(n: number): number {\n while (this.bitCount < n) {\n if (this.pos >= this.data.length) {\n throw new Error(\"Unexpected end of DEFLATE data\");\n }\n this.bitBuf |= this.data[this.pos++] << this.bitCount;\n this.bitCount += 8;\n }\n const result = this.bitBuf & ((1 << n) - 1);\n this.bitBuf >>= n;\n this.bitCount -= n;\n return result;\n }\n\n /**\n * Decode a symbol using Huffman tree\n */\n decodeSymbol(tree: HuffmanNode): number {\n let node = tree;\n while (node.symbol === undefined) {\n const bit = this.readBits(1);\n node = bit === 0 ? node.left! : node.right!;\n if (!node) {\n throw new Error(\"Invalid Huffman code\");\n }\n }\n return node.symbol;\n }\n\n /**\n * Align to byte boundary\n */\n alignToByte(): void {\n this.bitBuf = 0;\n this.bitCount = 0;\n }\n\n /**\n * Read a byte directly (must be aligned)\n */\n readByte(): number {\n if (this.pos >= this.data.length) {\n throw new Error(\"Unexpected end of data\");\n }\n return this.data[this.pos++];\n }\n\n /**\n * Read 16-bit little-endian value (must be aligned)\n */\n readUint16(): number {\n return this.readByte() | (this.readByte() << 8);\n }\n}\n\n/**\n * Decompress DEFLATE data (raw format, no zlib header)\n *\n * @param data - Compressed data in deflate-raw format\n * @returns Decompressed data\n */\nexport function inflateRaw(data: Uint8Array): Uint8Array {\n const reader = new BitReader(data);\n const output: number[] = [];\n\n let isFinal = false;\n\n while (!isFinal) {\n isFinal = reader.readBits(1) === 1;\n const blockType = reader.readBits(2);\n\n if (blockType === 0) {\n // Stored block (no compression)\n reader.alignToByte();\n const len = reader.readUint16();\n const nlen = reader.readUint16();\n\n if ((len ^ nlen) !== 0xffff) {\n throw new Error(\"Invalid stored block length\");\n }\n\n for (let i = 0; i < len; i++) {\n output.push(reader.readByte());\n }\n } else if (blockType === 1 || blockType === 2) {\n // Compressed block\n let literalTree: HuffmanNode;\n let distanceTree: HuffmanNode;\n\n if (blockType === 1) {\n // Fixed Huffman codes\n literalTree = buildHuffmanTree(FIXED_LITERAL_LENGTHS, 288);\n distanceTree = buildHuffmanTree(FIXED_DISTANCE_LENGTHS, 32);\n } else {\n // Dynamic Huffman codes\n const hlit = reader.readBits(5) + 257;\n const hdist = reader.readBits(5) + 1;\n const hclen = reader.readBits(4) + 4;\n\n // Read code length code lengths\n const codeLengthLengths = new Uint8Array(19);\n for (let i = 0; i < hclen; i++) {\n codeLengthLengths[CODE_LENGTH_ORDER[i]] = reader.readBits(3);\n }\n\n const codeLengthTree = buildHuffmanTree(codeLengthLengths, 19);\n\n // Decode literal/length and distance code lengths\n const allLengths = new Uint8Array(hlit + hdist);\n let i = 0;\n\n while (i < hlit + hdist) {\n const symbol = reader.decodeSymbol(codeLengthTree);\n\n if (symbol < 16) {\n allLengths[i++] = symbol;\n } else if (symbol === 16) {\n // Copy previous length 3-6 times\n const repeat = reader.readBits(2) + 3;\n const prev = allLengths[i - 1];\n for (let j = 0; j < repeat; j++) {\n allLengths[i++] = prev;\n }\n } else if (symbol === 17) {\n // Repeat 0 for 3-10 times\n const repeat = reader.readBits(3) + 3;\n for (let j = 0; j < repeat; j++) {\n allLengths[i++] = 0;\n }\n } else if (symbol === 18) {\n // Repeat 0 for 11-138 times\n const repeat = reader.readBits(7) + 11;\n for (let j = 0; j < repeat; j++) {\n allLengths[i++] = 0;\n }\n }\n }\n\n literalTree = buildHuffmanTree(allLengths.subarray(0, hlit), hlit);\n distanceTree = buildHuffmanTree(allLengths.subarray(hlit), hdist);\n }\n\n // Decode compressed data\n while (true) {\n const symbol = reader.decodeSymbol(literalTree);\n\n if (symbol < 256) {\n // Literal byte\n output.push(symbol);\n } else if (symbol === 256) {\n // End of block\n break;\n } else {\n // Length/distance pair\n const lengthCode = symbol - 257;\n const length = LENGTH_BASE[lengthCode] + reader.readBits(LENGTH_EXTRA[lengthCode]);\n\n const distCode = reader.decodeSymbol(distanceTree);\n const distance = DISTANCE_BASE[distCode] + reader.readBits(DISTANCE_EXTRA[distCode]);\n\n // Copy from output buffer\n const start = output.length - distance;\n for (let i = 0; i < length; i++) {\n output.push(output[start + i]);\n }\n }\n }\n } else {\n throw new Error(\"Invalid DEFLATE block type: \" + blockType);\n }\n }\n\n return new Uint8Array(output);\n}\n\n// ============================================================================\n// DEFLATE Compression (STORE mode only - no actual compression)\n// ============================================================================\n\n/**\n * Compress data using DEFLATE STORE mode (no compression)\n *\n * This creates valid DEFLATE data but without actual compression.\n * Files will be larger but this works on all browsers.\n *\n * @param data - Data to \"compress\"\n * @returns DEFLATE-formatted data (stored, not compressed)\n */\nexport function deflateRawStore(data: Uint8Array): Uint8Array {\n // Maximum stored block size is 65535 bytes\n const MAX_BLOCK_SIZE = 65535;\n const numBlocks = Math.ceil(data.length / MAX_BLOCK_SIZE) || 1;\n\n // Calculate output size: 5 bytes header per block + data\n const outputSize = numBlocks * 5 + data.length;\n const output = new Uint8Array(outputSize);\n let outPos = 0;\n let inPos = 0;\n\n for (let block = 0; block < numBlocks; block++) {\n const isLast = block === numBlocks - 1;\n const blockSize = Math.min(MAX_BLOCK_SIZE, data.length - inPos);\n\n // Block header: BFINAL (1 bit) + BTYPE=00 (2 bits) = stored block\n // Then align to byte boundary (5 bits padding)\n output[outPos++] = isLast ? 0x01 : 0x00;\n\n // LEN (16-bit little-endian)\n output[outPos++] = blockSize & 0xff;\n output[outPos++] = (blockSize >> 8) & 0xff;\n\n // NLEN (one's complement of LEN)\n output[outPos++] = ~blockSize & 0xff;\n output[outPos++] = (~blockSize >> 8) & 0xff;\n\n // Data\n output.set(data.subarray(inPos, inPos + blockSize), outPos);\n outPos += blockSize;\n inPos += blockSize;\n }\n\n return output.subarray(0, outPos);\n}\n\n// ============================================================================\n// LZ77 + Huffman Compression (Basic implementation)\n// ============================================================================\n\n/**\n * Compress data using DEFLATE with fixed Huffman codes\n *\n * This provides real compression using LZ77 + fixed Huffman codes.\n * Not as efficient as full DEFLATE but much better than STORE mode.\n *\n * @param data - Data to compress\n * @returns Compressed data in deflate-raw format\n */\nexport function deflateRawCompressed(data: Uint8Array): Uint8Array {\n if (data.length === 0) {\n // Empty input: single final block with just end-of-block symbol\n return new Uint8Array([0x03, 0x00]);\n }\n\n // For small data, use STORE mode\n if (data.length < 100) {\n return deflateRawStore(data);\n }\n\n const output = new BitWriter();\n\n // Write final block header with fixed Huffman (BFINAL=1, BTYPE=01)\n output.writeBits(1, 1); // BFINAL\n output.writeBits(1, 2); // BTYPE = 01 (fixed Huffman)\n\n // LZ77 compression with hash table\n const hashTable = new Map<number, number>();\n let pos = 0;\n\n while (pos < data.length) {\n // Try to find a match\n let bestLen = 0;\n let bestDist = 0;\n\n if (pos + 2 < data.length) {\n const hash = (data[pos] << 16) | (data[pos + 1] << 8) | data[pos + 2];\n const matchPos = hashTable.get(hash);\n\n if (matchPos !== undefined && pos - matchPos <= 32768) {\n const dist = pos - matchPos;\n let len = 0;\n const maxLen = Math.min(258, data.length - pos);\n\n while (len < maxLen && data[matchPos + len] === data[pos + len]) {\n len++;\n }\n\n if (len >= 3) {\n bestLen = len;\n bestDist = dist;\n }\n }\n\n // Update hash table\n hashTable.set(hash, pos);\n }\n\n if (bestLen >= 3) {\n // Write length/distance pair\n writeLengthCode(output, bestLen);\n writeDistanceCode(output, bestDist);\n pos += bestLen;\n } else {\n // Write literal\n writeLiteralCode(output, data[pos]);\n pos++;\n }\n }\n\n // Write end-of-block symbol (256)\n writeLiteralCode(output, 256);\n\n return output.finish();\n}\n\n/**\n * Bit writer for DEFLATE output\n */\nclass BitWriter {\n private chunks: Uint8Array[] = [];\n private buffer: number[] = [];\n private bitBuf = 0;\n private bitCount = 0;\n\n writeBits(value: number, count: number): void {\n this.bitBuf |= value << this.bitCount;\n this.bitCount += count;\n\n while (this.bitCount >= 8) {\n this.buffer.push(this.bitBuf & 0xff);\n this.bitBuf >>= 8;\n this.bitCount -= 8;\n\n if (this.buffer.length >= 65536) {\n this.chunks.push(new Uint8Array(this.buffer));\n this.buffer = [];\n }\n }\n }\n\n writeBitsReverse(value: number, count: number): void {\n // Write bits in reverse order (MSB first, used for Huffman codes)\n let reversed = 0;\n for (let i = 0; i < count; i++) {\n reversed = (reversed << 1) | ((value >> i) & 1);\n }\n this.writeBits(reversed, count);\n }\n\n finish(): Uint8Array {\n // Flush remaining bits\n if (this.bitCount > 0) {\n this.buffer.push(this.bitBuf & 0xff);\n }\n\n if (this.chunks.length === 0) {\n return new Uint8Array(this.buffer);\n }\n\n this.chunks.push(new Uint8Array(this.buffer));\n return concatUint8Arrays(this.chunks);\n }\n}\n\n// Fixed Huffman code tables\nconst LITERAL_CODES: Array<[number, number]> = [];\nconst LITERAL_LENGTHS_TABLE: number[] = [];\n\n// Build fixed literal/length Huffman codes\nfor (let i = 0; i <= 287; i++) {\n let code: number;\n let len: number;\n\n if (i <= 143) {\n // 00110000 - 10111111 (8 bits)\n code = 0x30 + i;\n len = 8;\n } else if (i <= 255) {\n // 110010000 - 111111111 (9 bits)\n code = 0x190 + (i - 144);\n len = 9;\n } else if (i <= 279) {\n // 0000000 - 0010111 (7 bits)\n code = i - 256;\n len = 7;\n } else {\n // 11000000 - 11000111 (8 bits)\n code = 0xc0 + (i - 280);\n len = 8;\n }\n\n LITERAL_CODES[i] = [code, len];\n LITERAL_LENGTHS_TABLE[i] = len;\n}\n\n/**\n * Write a literal or end-of-block symbol using fixed Huffman codes\n */\nfunction writeLiteralCode(output: BitWriter, symbol: number): void {\n const [code, len] = LITERAL_CODES[symbol];\n output.writeBitsReverse(code, len);\n}\n\n/**\n * Write a length code (257-285)\n */\nfunction writeLengthCode(output: BitWriter, length: number): void {\n let code: number;\n let extraBits: number;\n let extraValue: number;\n\n if (length <= 10) {\n code = 257 + length - 3;\n extraBits = 0;\n extraValue = 0;\n } else if (length <= 18) {\n const base = length - 11;\n code = 265 + Math.floor(base / 2);\n extraBits = 1;\n extraValue = base % 2;\n } else if (length <= 34) {\n const base = length - 19;\n code = 269 + Math.floor(base / 4);\n extraBits = 2;\n extraValue = base % 4;\n } else if (length <= 66) {\n const base = length - 35;\n code = 273 + Math.floor(base / 8);\n extraBits = 3;\n extraValue = base % 8;\n } else if (length <= 130) {\n const base = length - 67;\n code = 277 + Math.floor(base / 16);\n extraBits = 4;\n extraValue = base % 16;\n } else if (length <= 257) {\n const base = length - 131;\n code = 281 + Math.floor(base / 32);\n extraBits = 5;\n extraValue = base % 32;\n } else {\n code = 285;\n extraBits = 0;\n extraValue = 0;\n }\n\n writeLiteralCode(output, code);\n if (extraBits > 0) {\n output.writeBits(extraValue, extraBits);\n }\n}\n\n/**\n * Write a distance code\n */\nfunction writeDistanceCode(output: BitWriter, distance: number): void {\n // Distance code table from RFC 1951\n // Each entry: [maxDistance, code, extraBits]\n const DIST_TABLE: Array<[number, number, number]> = [\n [1, 0, 0],\n [2, 1, 0],\n [3, 2, 0],\n [4, 3, 0],\n [6, 4, 1],\n [8, 5, 1],\n [12, 6, 2],\n [16, 7, 2],\n [24, 8, 3],\n [32, 9, 3],\n [48, 10, 4],\n [64, 11, 4],\n [96, 12, 5],\n [128, 13, 5],\n [192, 14, 6],\n [256, 15, 6],\n [384, 16, 7],\n [512, 17, 7],\n [768, 18, 8],\n [1024, 19, 8],\n [1536, 20, 9],\n [2048, 21, 9],\n [3072, 22, 10],\n [4096, 23, 10],\n [6144, 24, 11],\n [8192, 25, 11],\n [12288, 26, 12],\n [16384, 27, 12],\n [24576, 28, 13],\n [32768, 29, 13]\n ];\n\n // Find the appropriate distance code\n let code = 0;\n let extraBits = 0;\n let baseDistance = 1;\n\n for (const [maxDist, c, extra] of DIST_TABLE) {\n if (distance <= maxDist) {\n code = c;\n extraBits = extra;\n break;\n }\n baseDistance = maxDist + 1;\n }\n\n const extraValue = distance - baseDistance;\n\n // Distance codes use 5-bit fixed code (reversed for Huffman)\n output.writeBitsReverse(code, 5);\n if (extraBits > 0) {\n output.writeBits(extraValue, extraBits);\n }\n}\n","export class ByteQueue {\n private static readonly EMPTY = new Uint8Array(0);\n\n private _buf: Uint8Array;\n private _start = 0;\n private _end = 0;\n\n private _cachedView: Uint8Array | null = null;\n private _cachedBuf: Uint8Array | null = null;\n private _cachedStart = 0;\n private _cachedEnd = 0;\n\n constructor(initial?: Uint8Array) {\n this._buf = new Uint8Array(0);\n if (initial && initial.length > 0) {\n this.reset(initial);\n }\n }\n\n get length(): number {\n return this._end - this._start;\n }\n\n isEmpty(): boolean {\n return this.length === 0;\n }\n\n view(): Uint8Array {\n if (this._start === this._end) {\n return ByteQueue.EMPTY;\n }\n\n if (\n this._cachedView &&\n this._cachedBuf === this._buf &&\n this._cachedStart === this._start &&\n this._cachedEnd === this._end\n ) {\n return this._cachedView;\n }\n\n const view = this._buf.subarray(this._start, this._end);\n this._cachedView = view;\n this._cachedBuf = this._buf;\n this._cachedStart = this._start;\n this._cachedEnd = this._end;\n return view;\n }\n\n reset(data?: Uint8Array): void {\n this._cachedView = null;\n this._cachedBuf = null;\n if (!data || data.length === 0) {\n this._buf = ByteQueue.EMPTY;\n this._start = 0;\n this._end = 0;\n return;\n }\n\n // Keep a private copy to ensure future writes cannot mutate the source.\n const copy = new Uint8Array(data.length);\n copy.set(data);\n this._buf = copy;\n this._start = 0;\n this._end = copy.length;\n }\n\n append(chunk: Uint8Array): void {\n if (chunk.length === 0) {\n return;\n }\n\n this._cachedView = null;\n this._cachedBuf = null;\n\n const unread = this.length;\n\n // Fast path: enough tail room.\n if (this._end + chunk.length <= this._buf.length) {\n this._buf.set(chunk, this._end);\n this._end += chunk.length;\n return;\n }\n\n // Allocate a new buffer and copy unread bytes (never compacts in-place).\n const required = unread + chunk.length;\n const nextSize = this._buf.length === 0 ? required : Math.max(this._buf.length * 2, required);\n const next = new Uint8Array(nextSize);\n\n if (unread > 0) {\n next.set(this._buf.subarray(this._start, this._end), 0);\n }\n next.set(chunk, unread);\n\n this._buf = next;\n this._start = 0;\n this._end = required;\n }\n\n read(length: number): Uint8Array {\n if (length <= 0) {\n return new Uint8Array(0);\n }\n if (length > this.length) {\n throw new RangeError(\"ByteQueue: read beyond available data\");\n }\n\n // Return a view for performance.\n // To keep this safe for async consumers, we must ensure we never write into\n // the same backing buffer again after it becomes fully consumed.\n const out = this._buf.subarray(this._start, this._start + length);\n this._start += length;\n\n this._cachedView = null;\n this._cachedBuf = null;\n\n if (this._start === this._end) {\n // Release backing storage to avoid reusing memory that might still be\n // referenced by previously returned views.\n this._buf = ByteQueue.EMPTY;\n this._start = 0;\n this._end = 0;\n }\n\n return out;\n }\n\n discard(length: number): void {\n if (length <= 0) {\n return;\n }\n if (length >= this.length) {\n // Release backing storage for the same reason as read(): previously\n // returned views may still be referenced by consumers.\n this._buf = ByteQueue.EMPTY;\n this._start = 0;\n this._end = 0;\n\n this._cachedView = null;\n this._cachedBuf = null;\n return;\n }\n this._start += length;\n\n this._cachedView = null;\n this._cachedBuf = null;\n\n if (this._start === this._end) {\n this._buf = ByteQueue.EMPTY;\n this._start = 0;\n this._end = 0;\n }\n }\n}\n","/**\n * Base compression utilities using Web Streams API\n * Shared between Node.js and Browser implementations\n *\n * Uses CompressionStream/DecompressionStream API with \"deflate-raw\" format\n * (raw DEFLATE without zlib header/trailer, required for ZIP files)\n *\n * Browser fallback: For browsers without deflate-raw support (Firefox < 113, Safari < 16.4),\n * see deflate-fallback.ts for pure JS implementation\n */\n\nimport { ByteQueue } from \"@archive/byte-queue\";\n\n/**\n * Compression options\n */\nexport interface CompressOptions {\n /**\n * Compression level (0-9)\n * - 0: No compression (STORE)\n * - 1: Fastest compression\n * - 6: Default compression (good balance)\n * - 9: Best compression (slowest)\n *\n * Note: CompressionStream does not support level configuration,\n * it uses a fixed level (~6)\n */\n level?: number;\n\n /**\n * Threshold (in bytes) to choose the lower-overhead path.\n *\n * - Node.js: inputs <= threshold use sync zlib fast-path (avoid threadpool overhead)\n * - Browser: inputs <= threshold use the pure-JS fallback (avoid stream scheduling overhead)\n */\n thresholdBytes?: number;\n}\n\n/**\n * Default threshold (in bytes) to choose the lower-overhead path.\n *\n * This is a performance knob, not a correctness requirement.\n */\nexport const DEFAULT_COMPRESS_THRESHOLD_BYTES = 8 * 1024 * 1024;\n\n/**\n * Resolve the effective threshold bytes.\n */\nexport function resolveCompressThresholdBytes(options: CompressOptions): number {\n const value = options.thresholdBytes;\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n return DEFAULT_COMPRESS_THRESHOLD_BYTES;\n }\n return value;\n}\n\n/**\n * Check if CompressionStream is available\n */\nexport function hasCompressionStream(): boolean {\n return typeof CompressionStream !== \"undefined\";\n}\n\n/**\n * Non-cached probe for CompressionStream(\"deflate-raw\") support.\n *\n * Prefer this in code paths that want up-to-date environment checks\n * (e.g. tests that stub globals).\n */\nexport function probeDeflateRawCompressionStream(): boolean {\n try {\n if (typeof CompressionStream === \"undefined\") {\n return false;\n }\n new CompressionStream(\"deflate-raw\");\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Non-cached probe for DecompressionStream(\"deflate-raw\") support.\n */\nexport function probeDeflateRawDecompressionStream(): boolean {\n try {\n if (typeof DecompressionStream === \"undefined\") {\n return false;\n }\n new DecompressionStream(\"deflate-raw\");\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Non-cached probe for full deflate-raw Web Streams support.\n *\n * Returns true only if BOTH CompressionStream(\"deflate-raw\") and\n * DecompressionStream(\"deflate-raw\") are supported.\n */\nexport function probeDeflateRawWebStreams(): boolean {\n return probeDeflateRawCompressionStream() && probeDeflateRawDecompressionStream();\n}\n\nlet _hasDeflateRawCompressionStream: boolean | null = null;\nlet _hasDeflateRawDecompressionStream: boolean | null = null;\n\n/**\n * Check if CompressionStream supports the \"deflate-raw\" format.\n *\n * This is a stricter check than {@link hasCompressionStream} because some\n * environments expose CompressionStream but do not support \"deflate-raw\".\n */\nexport function hasDeflateRawCompressionStream(): boolean {\n if (typeof CompressionStream === \"undefined\") {\n return false;\n }\n\n if (_hasDeflateRawCompressionStream !== null) {\n return _hasDeflateRawCompressionStream;\n }\n\n _hasDeflateRawCompressionStream = probeDeflateRawCompressionStream();\n\n return _hasDeflateRawCompressionStream;\n}\n\n/**\n * Check if DecompressionStream supports the \"deflate-raw\" format.\n */\nexport function hasDeflateRawDecompressionStream(): boolean {\n if (typeof DecompressionStream === \"undefined\") {\n return false;\n }\n\n if (_hasDeflateRawDecompressionStream !== null) {\n return _hasDeflateRawDecompressionStream;\n }\n\n _hasDeflateRawDecompressionStream = probeDeflateRawDecompressionStream();\n\n return _hasDeflateRawDecompressionStream;\n}\n\n/**\n * Cached check for full deflate-raw Web Streams support.\n *\n * Returns true only if BOTH CompressionStream(\"deflate-raw\") and\n * DecompressionStream(\"deflate-raw\") are supported.\n */\nexport function hasDeflateRawWebStreams(): boolean {\n return hasDeflateRawCompressionStream() && hasDeflateRawDecompressionStream();\n}\n\nasync function streamToUint8Array(\n reader: ReadableStreamDefaultReader<Uint8Array>\n): Promise<Uint8Array> {\n const out = new ByteQueue();\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n out.append(value);\n }\n\n return out.read(out.length);\n}\n\nasync function transformWithStream(\n data: Uint8Array,\n stream: CompressionStream | DecompressionStream\n): Promise<Uint8Array> {\n const writer = stream.writable.getWriter();\n const reader = stream.readable.getReader();\n\n try {\n // Start reading immediately to avoid potential backpressure deadlocks\n // (writer.write/close may wait for the readable side to be consumed).\n const readPromise = streamToUint8Array(reader);\n\n await writer.write(data as BufferSource);\n await writer.close();\n\n return await readPromise;\n } finally {\n try {\n writer.releaseLock();\n } catch {\n // ignore\n }\n try {\n reader.releaseLock();\n } catch {\n // ignore\n }\n }\n}\n\n/**\n * Compress using CompressionStream API\n * Uses \"deflate-raw\" format (required for ZIP files)\n *\n * @param data - Data to compress\n * @returns Compressed data\n */\nexport async function compressWithStream(data: Uint8Array): Promise<Uint8Array> {\n const cs = new CompressionStream(\"deflate-raw\");\n return transformWithStream(data, cs);\n}\n\n/**\n * Decompress using DecompressionStream API\n *\n * @param data - Compressed data (deflate-raw format)\n * @returns Decompressed data\n */\nexport async function decompressWithStream(data: Uint8Array): Promise<Uint8Array> {\n const ds = new DecompressionStream(\"deflate-raw\");\n return transformWithStream(data, ds);\n}\n","import type { ZipTimestampMode } from \"@archive/utils/timestamps\";\n\nexport const DEFAULT_COMPRESS_LEVEL = 6;\nexport const DEFAULT_ZIP_LEVEL = 6;\nexport const DEFAULT_ZIP_TIMESTAMPS: ZipTimestampMode = \"dos+utc\";\n","/**\n * Shared types for true streaming compression.\n *\n * Kept in a dedicated base module so Node.js and browser implementations\n * don't depend on each other.\n */\n\nexport interface StreamCompressOptions {\n level?: number;\n}\n\nexport type StreamCallback = (err?: Error | null) => void;\n\n/**\n * Minimal cross-platform streaming codec surface.\n *\n * Both Node.js (zlib / stream.Transform) and browser implementations\n * support this subset.\n */\nexport interface StreamingCodec {\n on(event: \"data\", listener: (chunk: Uint8Array) => void): this;\n on(event: \"end\", listener: () => void): this;\n on(event: \"error\", listener: (err: Error) => void): this;\n on(event: string, listener: (...args: any[]) => void): this;\n\n once(event: \"data\", listener: (chunk: Uint8Array) => void): this;\n once(event: \"end\", listener: () => void): this;\n once(event: \"error\", listener: (err: Error) => void): this;\n once(event: string, listener: (...args: any[]) => void): this;\n\n off(event: \"data\", listener: (chunk: Uint8Array) => void): this;\n off(event: \"end\", listener: () => void): this;\n off(event: \"error\", listener: (err: Error) => void): this;\n off(event: string, listener: (...args: any[]) => void): this;\n\n write(chunk: Uint8Array, callback?: StreamCallback): boolean;\n end(callback?: StreamCallback): unknown;\n destroy(err?: Error): unknown;\n}\n\nexport type DeflateStream = StreamingCodec;\nexport type InflateStream = StreamingCodec;\n\nexport function asError(err: unknown): Error {\n return err instanceof Error ? err : new Error(String(err));\n}\n","/**\n * Browser True Streaming Compression\n *\n * Uses native CompressionStream(\"deflate-raw\") for real chunk-by-chunk streaming.\n * Falls back to buffered compression if not supported.\n *\n * API compatible with Node.js version - supports .on(\"data\"), .on(\"end\"), .write(callback), .end()\n */\n\nimport { EventEmitter } from \"@stream\";\nimport { deflateRawCompressed, inflateRaw } from \"@archive/deflate-fallback\";\nimport { hasDeflateRawWebStreams } from \"@archive/compress.base\";\nimport { concatUint8Arrays } from \"@archive/utils/bytes\";\nimport { DEFAULT_COMPRESS_LEVEL } from \"@archive/defaults\";\n\nexport type { StreamCompressOptions } from \"@archive/streaming-compress.base\";\nimport {\n asError,\n type DeflateStream,\n type InflateStream,\n type StreamCallback,\n type StreamCompressOptions\n} from \"@archive/streaming-compress.base\";\n\n/**\n * Check if deflate-raw streaming compression is supported by this library.\n *\n * In browsers, the library always supports deflate-raw via the JS fallback.\n * Native deflate-raw Web Streams support (CompressionStream/DecompressionStream)\n * is used when available, but is not required.\n */\nexport function hasDeflateRaw(): boolean {\n return true;\n}\n\nfunction hasNativeDeflateRawWebStreams(): boolean {\n return hasDeflateRawWebStreams();\n}\n\nclass WebStreamCodec extends EventEmitter {\n private writer: WritableStreamDefaultWriter<Uint8Array>;\n private reader: ReadableStreamDefaultReader<Uint8Array>;\n private readPromise: Promise<void>;\n private ended = false;\n\n constructor(\n writer: WritableStreamDefaultWriter<Uint8Array>,\n reader: ReadableStreamDefaultReader<Uint8Array>\n ) {\n super();\n this.writer = writer;\n this.reader = reader;\n this.readPromise = this._startReading();\n }\n\n private async _startReading(): Promise<void> {\n try {\n while (true) {\n const { value, done } = await this.reader.read();\n if (done) {\n break;\n }\n if (value) {\n this.emit(\"data\", value);\n }\n }\n this.emit(\"end\");\n } catch (err) {\n this.emit(\"error\", asError(err));\n }\n }\n\n write(chunk: Uint8Array, callback?: StreamCallback): boolean {\n if (this.ended) {\n const err = new Error(\"write after end\");\n if (callback) {\n callback(err);\n } else {\n this.emit(\"error\", err);\n }\n return false;\n }\n\n this.writer\n .write(chunk)\n .then(() => {\n if (callback) {\n callback();\n }\n })\n .catch(err => {\n const error = asError(err);\n if (callback) {\n callback(error);\n } else {\n this.emit(\"error\", error);\n }\n });\n\n return true;\n }\n\n end(callback?: StreamCallback): void {\n if (this.ended) {\n if (callback) {\n callback();\n }\n return;\n }\n this.ended = true;\n\n this.writer\n .close()\n .then(() => this.readPromise)\n .then(() => {\n if (callback) {\n callback();\n }\n })\n .catch(err => {\n const error = asError(err);\n if (callback) {\n callback(error);\n } else {\n this.emit(\"error\", error);\n }\n });\n }\n\n destroy(err?: Error): void {\n this.ended = true;\n if (err) {\n this.emit(\"error\", err);\n }\n try {\n this.reader.cancel(err);\n } catch {\n // Ignore\n }\n try {\n this.writer.abort(err);\n } catch {\n // Ignore\n }\n }\n}\n\n/**\n * Browser True Streaming Deflate using CompressionStream API\n * Simple EventEmitter-based - emits \"data\" as compressed chunks arrive\n */\nclass TrueStreamingDeflate extends EventEmitter {\n private codec: WebStreamCodec;\n\n constructor(_level: number) {\n super();\n const compressionStream = new CompressionStream(\"deflate-raw\");\n const writer =\n compressionStream.writable.getWriter() as WritableStreamDefaultWriter<Uint8Array>;\n const reader = compressionStream.readable.getReader();\n\n this.codec = new WebStreamCodec(writer, reader);\n this.codec.on(\"data\", chunk => this.emit(\"data\", chunk));\n this.codec.on(\"end\", () => this.emit(\"end\"));\n this.codec.on(\"error\", err => this.emit(\"error\", err));\n }\n\n write(chunk: Uint8Array, callback?: StreamCallback): boolean {\n return this.codec.write(chunk, callback);\n }\n\n end(callback?: StreamCallback): void {\n this.codec.end(callback);\n }\n\n destroy(err?: Error): void {\n this.codec.destroy(err);\n }\n}\n\n/**\n * Fallback Deflate - buffers all data, compresses at end\n */\nclass FallbackDeflate extends EventEmitter {\n private codec: BufferedCodec;\n\n constructor(_level: number) {\n super();\n this.codec = new BufferedCodec(deflateRawCompressed);\n this.codec.on(\"data\", chunk => this.emit(\"data\", chunk));\n this.codec.on(\"end\", () => this.emit(\"end\"));\n this.codec.on(\"error\", err => this.emit(\"error\", err));\n }\n\n write(chunk: Uint8Array, callback?: StreamCallback): boolean {\n return this.codec.write(chunk, callback);\n }\n\n end(callback?: StreamCallback): void {\n this.codec.end(callback);\n }\n\n destroy(err?: Error): void {\n this.codec.destroy(err);\n }\n}\n\nclass BufferedCodec extends EventEmitter {\n private chunks: Uint8Array[] = [];\n private ended = false;\n\n constructor(private readonly process: (data: Uint8Array) => Uint8Array) {\n super();\n }\n\n write(chunk: Uint8Array, callback?: StreamCallback): boolean {\n if (this.ended) {\n const err = new Error(\"write after end\");\n if (callback) {\n callback(err);\n } else {\n this.emit(\"error\", err);\n }\n return false;\n }\n\n this.chunks.push(chunk);\n if (callback) {\n queueMicrotask(() => callback());\n }\n return true;\n }\n\n end(callback?: StreamCallback): void {\n if (this.ended) {\n if (callback) {\n callback();\n }\n return;\n }\n this.ended = true;\n\n try {\n const data = concatUint8Arrays(this.chunks);\n const output = this.process(data);\n this.emit(\"data\", output);\n this.emit(\"end\");\n if (callback) {\n callback();\n }\n } catch (err) {\n const error = asError(err);\n this.emit(\"error\", error);\n if (callback) {\n callback(error);\n }\n }\n }\n\n destroy(err?: Error): void {\n this.ended = true;\n if (err) {\n this.emit(\"error\", err);\n }\n }\n}\n\n/**\n * Create a streaming DEFLATE compressor\n */\nexport function createDeflateStream(options: StreamCompressOptions = {}): DeflateStream {\n const level = options.level ?? DEFAULT_COMPRESS_LEVEL;\n\n if (hasNativeDeflateRawWebStreams()) {\n return new TrueStreamingDeflate(level);\n } else {\n return new FallbackDeflate(level);\n }\n}\n\n/**\n * Browser True Streaming Inflate using DecompressionStream API\n */\nclass TrueStreamingInflate extends EventEmitter {\n private codec: WebStreamCodec;\n\n constructor() {\n super();\n const decompressionStream = new DecompressionStream(\"deflate-raw\");\n const writer =\n decompressionStream.writable.getWriter() as WritableStreamDefaultWriter<Uint8Array>;\n const reader = decompressionStream.readable.getReader();\n\n this.codec = new WebStreamCodec(writer, reader);\n this.codec.on(\"data\", chunk => this.emit(\"data\", chunk));\n this.codec.on(\"end\", () => this.emit(\"end\"));\n this.codec.on(\"error\", err => this.emit(\"error\", err));\n }\n\n write(chunk: Uint8Array, callback?: StreamCallback): boolean {\n return this.codec.write(chunk, callback);\n }\n\n end(callback?: StreamCallback): void {\n this.codec.end(callback);\n }\n\n destroy(err?: Error): void {\n this.codec.destroy(err);\n }\n}\n\n/**\n * Fallback Inflate - buffers all data, decompresses at end\n */\nclass FallbackInflate extends EventEmitter {\n private codec: BufferedCodec;\n\n constructor() {\n super();\n this.codec = new BufferedCodec(inflateRaw);\n this.codec.on(\"data\", chunk => this.emit(\"data\", chunk));\n this.codec.on(\"end\", () => this.emit(\"end\"));\n this.codec.on(\"error\", err => this.emit(\"error\", err));\n }\n\n write(chunk: Uint8Array, callback?: StreamCallback): boolean {\n return this.codec.write(chunk, callback);\n }\n\n end(callback?: StreamCallback): void {\n this.codec.end(callback);\n }\n\n destroy(err?: Error): void {\n this.codec.destroy(err);\n }\n}\n\n/**\n * Create a streaming INFLATE decompressor\n */\nexport function createInflateStream(): InflateStream {\n if (hasNativeDeflateRawWebStreams()) {\n return new TrueStreamingInflate();\n } else {\n return new FallbackInflate();\n }\n}\n","/**\n * Shared text encoding/decoding utilities.\n *\n * Caches encoder/decoder instances for performance.\n */\n\nexport const utf8Encoder = new TextEncoder();\nexport const utf8Decoder = new TextDecoder(\"utf-8\");\n\n/**\n * Encode a string as UTF-8.\n */\nexport function encodeUtf8(value: string): Uint8Array {\n return utf8Encoder.encode(value);\n}\n\n/**\n * Decode bytes as UTF-8.\n */\nexport function decodeUtf8(bytes: Uint8Array): string {\n return utf8Decoder.decode(bytes);\n}\n\n/**\n * Decode bytes as Latin-1/byte-to-char.\n * Used as a fallback when UTF-8 flag is not set.\n */\nexport function decodeLatin1(bytes: Uint8Array): string {\n // Avoid spreading huge arrays; build incrementally.\n let out = \"\";\n const chunkSize = 0x8000;\n for (let i = 0; i < bytes.length; i += chunkSize) {\n const chunk = bytes.subarray(i, i + chunkSize);\n out += String.fromCharCode(...chunk);\n }\n return out;\n}\n","const EXTENDED_TIMESTAMP_ID = 0x5455;\n\nfunction clampUint32(value: number): number {\n if (!Number.isFinite(value)) {\n return 0;\n }\n if (value <= 0) {\n return 0;\n }\n // 0xFFFFFFFF fits JS safe integer.\n if (value >= 0xffffffff) {\n return 0xffffffff;\n }\n return value >>> 0;\n}\n\nexport function unixSecondsFromDate(date: Date): number {\n return clampUint32(Math.floor(date.getTime() / 1000));\n}\n\n/**\n * Build Info-ZIP \"Extended Timestamp\" extra field (0x5455).\n * We write only mtime (UTC, Unix seconds) to minimize size.\n *\n * Layout:\n * - Header ID: 2 bytes (0x5455)\n * - Data size: 2 bytes\n * - Flags: 1 byte (bit0 = mtime)\n * - mtime: 4 bytes (Unix seconds)\n */\nexport function buildExtendedTimestampExtraFieldFromUnixSeconds(unixSeconds: number): Uint8Array {\n const ts = clampUint32(unixSeconds);\n\n // flags(1) + mtime(4)\n const payloadSize = 5;\n const out = new Uint8Array(4 + payloadSize);\n const view = new DataView(out.buffer);\n\n view.setUint16(0, EXTENDED_TIMESTAMP_ID, true);\n view.setUint16(2, payloadSize, true);\n\n out[4] = 0x01; // mtime present\n view.setUint32(5, ts, true);\n\n return out;\n}\n\nexport function buildExtendedTimestampExtraFieldFromDate(date: Date): Uint8Array {\n return buildExtendedTimestampExtraFieldFromUnixSeconds(unixSecondsFromDate(date));\n}\n\n/**\n * Parse Info-ZIP \"Extended Timestamp\" extra field (0x5455) and return mtime.\n * Returns Unix seconds (UTC) if present.\n */\nexport function parseExtendedTimestampMtimeUnixSeconds(extraField: Uint8Array): number | undefined {\n const view = new DataView(extraField.buffer, extraField.byteOffset, extraField.byteLength);\n let offset = 0;\n\n while (offset + 4 <= extraField.length) {\n const headerId = view.getUint16(offset, true);\n const dataSize = view.getUint16(offset + 2, true);\n const dataStart = offset + 4;\n const dataEnd = dataStart + dataSize;\n\n if (dataEnd > extraField.length) {\n break;\n }\n\n if (headerId === EXTENDED_TIMESTAMP_ID && dataSize >= 1) {\n const flags = extraField[dataStart];\n if ((flags & 0x01) !== 0 && dataSize >= 5) {\n // mtime is 4 bytes right after flags.\n return view.getUint32(dataStart + 1, true) >>> 0;\n }\n }\n\n offset = dataEnd;\n }\n\n return undefined;\n}\n","import {\n buildExtendedTimestampExtraFieldFromDate,\n parseExtendedTimestampMtimeUnixSeconds\n} from \"@archive/utils/zip-extra\";\n\n/**\n * DOS date/time helpers for ZIP files.\n */\n\n/**\n * Convert Date to DOS time/date fields.\n *\n * Note: uses local time fields (getHours/getMinutes/getSeconds),\n * which matches common ZIP writer behavior.\n */\nexport function dateToDos(date: Date): [number, number] {\n const dosTime =\n ((date.getHours() & 0x1f) << 11) |\n ((date.getMinutes() & 0x3f) << 5) |\n ((date.getSeconds() >> 1) & 0x1f);\n\n const dosDate =\n (((date.getFullYear() - 1980) & 0x7f) << 9) |\n (((date.getMonth() + 1) & 0x0f) << 5) |\n (date.getDate() & 0x1f);\n\n return [dosTime, dosDate];\n}\n\n/**\n * Parse DOS date/time to JS Date.\n */\nexport function parseDosDateTimeUTC(date: number, time?: number): Date {\n const day = date & 0x1f;\n const month = (date >> 5) & 0x0f;\n const year = ((date >> 9) & 0x7f) + 1980;\n const seconds = time ? (time & 0x1f) * 2 : 0;\n const minutes = time ? (time >> 5) & 0x3f : 0;\n const hours = time ? time >> 11 : 0;\n\n return new Date(Date.UTC(year, month - 1, day, hours, minutes, seconds));\n}\n\n/**\n * How to write timestamps in ZIP headers.\n *\n * ZIP always has DOS date/time fields; `dos+utc` additionally writes the Info-ZIP\n * extended timestamp extra field (0x5455) for a UTC mtime.\n */\nexport type ZipTimestampMode = \"dos\" | \"dos+utc\";\n\nexport function resolveZipLastModifiedDateFromUnixSeconds(\n dosDate: number,\n dosTime: number,\n mtimeUnixSeconds?: number\n): Date {\n if (mtimeUnixSeconds === undefined) {\n return parseDosDateTimeUTC(dosDate, dosTime);\n }\n return new Date(mtimeUnixSeconds * 1000);\n}\n\nexport function resolveZipLastModifiedDateFromExtraField(\n dosDate: number,\n dosTime: number,\n extraField: Uint8Array\n): Date {\n const unixSeconds = parseExtendedTimestampMtimeUnixSeconds(extraField);\n return resolveZipLastModifiedDateFromUnixSeconds(dosDate, dosTime, unixSeconds);\n}\n\nexport function buildZipTimestampExtraField(modTime: Date, mode: ZipTimestampMode): Uint8Array {\n return mode === \"dos+utc\" ? buildExtendedTimestampExtraFieldFromDate(modTime) : new Uint8Array(0);\n}\n\nexport function dateToZipDos(modTime: Date): { dosTime: number; dosDate: number } {\n const [dosTime, dosDate] = dateToDos(modTime);\n return { dosTime, dosDate };\n}\n","/**\n * ZIP format constants (PKWARE APPNOTE)\n * Shared by ZIP writer and parser implementations.\n */\n\n// Signatures\nexport const LOCAL_FILE_HEADER_SIG = 0x04034b50;\nexport const CENTRAL_DIR_HEADER_SIG = 0x02014b50;\nexport const END_OF_CENTRAL_DIR_SIG = 0x06054b50;\nexport const DATA_DESCRIPTOR_SIG = 0x08074b50;\n\nexport const ZIP64_END_OF_CENTRAL_DIR_SIG = 0x06064b50;\nexport const ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIG = 0x07064b50;\n\n// Versions\nexport const VERSION_NEEDED = 20; // 2.0 - supports DEFLATE\nexport const VERSION_MADE_BY = 20; // 2.0\n\n// Compression methods\nexport const COMPRESSION_STORE = 0;\nexport const COMPRESSION_DEFLATE = 8;\n\n// General purpose bit flags\nexport const FLAG_UTF8 = 0x0800;\nexport const FLAG_DATA_DESCRIPTOR = 0x0008;\n\n// ZIP64 / sentinel sizes\nexport const UINT16_MAX = 0xffff;\nexport const UINT32_MAX = 0xffffffff;\n","import { encodeUtf8 } from \"@archive/utils/text\";\nimport {\n buildZipTimestampExtraField,\n dateToZipDos,\n type ZipTimestampMode\n} from \"@archive/utils/timestamps\";\nimport {\n COMPRESSION_DEFLATE,\n COMPRESSION_STORE,\n FLAG_DATA_DESCRIPTOR,\n FLAG_UTF8\n} from \"@archive/zip-constants\";\n\nexport interface ZipEntryMetadata {\n nameBytes: Uint8Array;\n commentBytes: Uint8Array;\n dosTime: number;\n dosDate: number;\n extraField: Uint8Array;\n compressionMethod: number;\n flags: number;\n}\n\nexport interface ZipEntryMetadataInput {\n name: string;\n comment?: string;\n modTime: Date;\n timestamps: ZipTimestampMode;\n /** If true, set FLAG_DATA_DESCRIPTOR and expect CRC/sizes written later. */\n useDataDescriptor: boolean;\n /** If true, use DEFLATE; else STORE. */\n deflate: boolean;\n}\n\nexport function resolveZipCompressionMethod(deflate: boolean): number {\n return deflate ? COMPRESSION_DEFLATE : COMPRESSION_STORE;\n}\n\nexport function resolveZipFlags(useDataDescriptor: boolean): number {\n return useDataDescriptor ? FLAG_UTF8 | FLAG_DATA_DESCRIPTOR : FLAG_UTF8;\n}\n\nexport function buildZipEntryMetadata(input: ZipEntryMetadataInput): ZipEntryMetadata {\n const nameBytes = encodeUtf8(input.name);\n const commentBytes = encodeUtf8(input.comment ?? \"\");\n const { dosTime, dosDate } = dateToZipDos(input.modTime);\n const extraField = buildZipTimestampExtraField(input.modTime, input.timestamps);\n\n return {\n nameBytes,\n commentBytes,\n dosTime,\n dosDate,\n extraField,\n compressionMethod: resolveZipCompressionMethod(input.deflate),\n flags: resolveZipFlags(input.useDataDescriptor)\n };\n}\n","/**\n * ZIP record builders (PKWARE APPNOTE)\n *\n * Shared by streaming zip writer and buffer zip builder.\n */\n\nimport {\n CENTRAL_DIR_HEADER_SIG,\n DATA_DESCRIPTOR_SIG,\n END_OF_CENTRAL_DIR_SIG,\n LOCAL_FILE_HEADER_SIG,\n VERSION_MADE_BY,\n VERSION_NEEDED\n} from \"@archive/zip-constants\";\n\nexport interface ZipLocalFileHeaderInput {\n fileName: Uint8Array;\n extraField: Uint8Array;\n flags: number;\n compressionMethod: number;\n dosTime: number;\n dosDate: number;\n crc32: number;\n compressedSize: number;\n uncompressedSize: number;\n versionNeeded?: number;\n}\n\nexport function buildLocalFileHeader(input: ZipLocalFileHeaderInput): Uint8Array {\n const versionNeeded = input.versionNeeded ?? VERSION_NEEDED;\n\n const header = new Uint8Array(30 + input.fileName.length + input.extraField.length);\n const view = new DataView(header.buffer);\n\n view.setUint32(0, LOCAL_FILE_HEADER_SIG, true);\n view.setUint16(4, versionNeeded, true);\n view.setUint16(6, input.flags, true);\n view.setUint16(8, input.compressionMethod, true);\n view.setUint16(10, input.dosTime, true);\n view.setUint16(12, input.dosDate, true);\n view.setUint32(14, input.crc32, true);\n view.setUint32(18, input.compressedSize, true);\n view.setUint32(22, input.uncompressedSize, true);\n view.setUint16(26, input.fileName.length, true);\n view.setUint16(28, input.extraField.length, true);\n\n header.set(input.fileName, 30);\n if (input.extraField.length > 0) {\n header.set(input.extraField, 30 + input.fileName.length);\n }\n\n return header;\n}\n\nexport interface ZipCentralDirectoryHeaderInput {\n fileName: Uint8Array;\n extraField: Uint8Array;\n comment: Uint8Array;\n flags: number;\n compressionMethod: number;\n dosTime: number;\n dosDate: number;\n crc32: number;\n compressedSize: number;\n uncompressedSize: number;\n localHeaderOffset: number;\n versionMadeBy?: number;\n versionNeeded?: number;\n externalAttributes?: number;\n}\n\nexport function buildCentralDirectoryHeader(input: ZipCentralDirectoryHeaderInput): Uint8Array {\n const versionMadeBy = input.versionMadeBy ?? VERSION_MADE_BY;\n const versionNeeded = input.versionNeeded ?? VERSION_NEEDED;\n const externalAttributes = input.externalAttributes ?? 0;\n\n const header = new Uint8Array(\n 46 + input.fileName.length + input.extraField.length + input.comment.length\n );\n const view = new DataView(header.buffer);\n\n view.setUint32(0, CENTRAL_DIR_HEADER_SIG, true);\n view.setUint16(4, versionMadeBy, true);\n view.setUint16(6, versionNeeded, true);\n view.setUint16(8, input.flags, true);\n view.setUint16(10, input.compressionMethod, true);\n view.setUint16(12, input.dosTime, true);\n view.setUint16(14, input.dosDate, true);\n view.setUint32(16, input.crc32, true);\n view.setUint32(20, input.compressedSize, true);\n view.setUint32(24, input.uncompressedSize, true);\n view.setUint16(28, input.fileName.length, true);\n view.setUint16(30, input.extraField.length, true);\n view.setUint16(32, input.comment.length, true);\n view.setUint16(34, 0, true); // disk number start\n view.setUint16(36, 0, true); // internal file attributes\n view.setUint32(38, externalAttributes, true);\n view.setUint32(42, input.localHeaderOffset, true);\n\n header.set(input.fileName, 46);\n if (input.extraField.length > 0) {\n header.set(input.extraField, 46 + input.fileName.length);\n }\n if (input.comment.length > 0) {\n header.set(input.comment, 46 + input.fileName.length + input.extraField.length);\n }\n\n return header;\n}\n\nexport interface ZipEndOfCentralDirectoryInput {\n entryCount: number;\n centralDirSize: number;\n centralDirOffset: number;\n comment: Uint8Array;\n}\n\nexport function buildEndOfCentralDirectory(input: ZipEndOfCentralDirectoryInput): Uint8Array {\n const record = new Uint8Array(22 + input.comment.length);\n const view = new DataView(record.buffer);\n\n view.setUint32(0, END_OF_CENTRAL_DIR_SIG, true);\n view.setUint16(4, 0, true);\n view.setUint16(6, 0, true);\n view.setUint16(8, input.entryCount, true);\n view.setUint16(10, input.entryCount, true);\n view.setUint32(12, input.centralDirSize, true);\n view.setUint32(16, input.centralDirOffset, true);\n view.setUint16(20, input.comment.length, true);\n\n if (input.comment.length > 0) {\n record.set(input.comment, 22);\n }\n\n return record;\n}\n\nexport function buildDataDescriptor(\n crc32: number,\n compressedSize: number,\n uncompressedSize: number\n) {\n const descriptor = new Uint8Array(16);\n const view = new DataView(descriptor.buffer);\n\n view.setUint32(0, DATA_DESCRIPTOR_SIG, true);\n view.setUint32(4, crc32, true);\n view.setUint32(8, compressedSize, true);\n view.setUint32(12, uncompressedSize, true);\n\n return descriptor;\n}\n","/**\n * True Streaming ZIP creator - shared implementation.\n *\n * This module is intentionally platform-agnostic.\n * - In Node builds it uses `./crc32` + `./streaming-compress` (zlib-backed).\n * - In browser builds the bundler aliases those imports to their browser variants.\n */\n\nimport { crc32Update, crc32Finalize } from \"@archive/crc32\";\nimport { createDeflateStream } from \"@archive/streaming-compress\";\nimport type { ZipTimestampMode } from \"@archive/utils/timestamps\";\nimport { DEFAULT_ZIP_LEVEL, DEFAULT_ZIP_TIMESTAMPS } from \"@archive/defaults\";\nimport { buildZipEntryMetadata } from \"@archive/zip-entry-metadata\";\nimport type { ZipEntryInfo as UnzipZipEntryInfo } from \"@archive/zip-entry-info\";\nimport {\n buildCentralDirectoryHeader,\n buildDataDescriptor,\n buildEndOfCentralDirectory,\n buildLocalFileHeader\n} from \"@archive/zip-records\";\nimport { VERSION_MADE_BY, VERSION_NEEDED } from \"@archive/zip-constants\";\n\n/**\n * Internal entry info for central directory\n */\ninterface ZipEntryInfo {\n name: Uint8Array;\n extraField: Uint8Array;\n flags: number;\n crc: number;\n compressedSize: number;\n uncompressedSize: number;\n compressionMethod: number;\n dosTime: number;\n dosDate: number;\n offset: number;\n}\n\ntype CentralDirectoryEntryInfo = ZipEntryInfo;\n\n/**\n * True Streaming ZIP File - compresses chunk by chunk\n */\nexport class ZipDeflateFile {\n private _deflate: ReturnType<typeof createDeflateStream> | null = null;\n private _crc: number = 0xffffffff;\n private _uncompressedSize: number = 0;\n private _compressedSize: number = 0;\n private _finalized = false;\n private _headerEmitted = false;\n private _ondata: ((data: Uint8Array, final: boolean) => void) | null = null;\n private _centralDirEntryInfo: CentralDirectoryEntryInfo | null = null;\n private _pendingEnd = false;\n private _emittedDataDescriptor = false;\n private _localHeader: Uint8Array;\n\n // Promise resolution for completion (including data descriptor)\n private _completeResolve: (() => void) | null = null;\n private _completeReject: ((err: Error) => void) | null = null;\n private _completePromise: Promise<void> | null = null;\n private _completeError: Error | null = null;\n\n // Queue for incoming data before ondata is set\n private _dataQueue: Uint8Array[] = [];\n private _finalQueued = false;\n\n readonly name: string;\n readonly level: number;\n readonly nameBytes: Uint8Array;\n readonly dosTime: number;\n readonly dosDate: number;\n readonly extraField: Uint8Array;\n private readonly _flags: number;\n private readonly _compressionMethod: number;\n private readonly _modTime: Date;\n\n constructor(\n name: string,\n options?: { level?: number; modTime?: Date; timestamps?: ZipTimestampMode }\n ) {\n this.name = name;\n const modTime = options?.modTime ?? new Date();\n this._modTime = modTime;\n this.level = options?.level ?? DEFAULT_ZIP_LEVEL;\n\n const metadata = buildZipEntryMetadata({\n name,\n comment: \"\",\n modTime,\n timestamps: options?.timestamps ?? DEFAULT_ZIP_TIMESTAMPS,\n useDataDescriptor: true,\n deflate: this.level > 0\n });\n\n this.nameBytes = metadata.nameBytes;\n this.dosTime = metadata.dosTime;\n this.dosDate = metadata.dosDate;\n this.extraField = metadata.extraField;\n this._flags = metadata.flags;\n this._compressionMethod = metadata.compressionMethod;\n\n // Create deflate stream for compression\n if (this.level > 0) {\n this._deflate = createDeflateStream({ level: this.level });\n\n this._deflate.on(\"error\", (err: Error) => {\n this._rejectComplete(err);\n });\n\n // Handle compressed output - this is true streaming!\n this._deflate.on(\"data\", (chunk: Uint8Array) => {\n this._compressedSize += chunk.length;\n this._enqueueData(chunk, false);\n });\n\n // Handle end - emit data descriptor\n // IMPORTANT: Only use 'end' event, NOT 'finish'!\n // Node.js zlib emits events in order: finish -> data -> end\n this._deflate.on(\"end\", () => {\n if (this._pendingEnd && !this._emittedDataDescriptor) {\n this._emittedDataDescriptor = true;\n this._emitDataDescriptor();\n }\n });\n }\n\n this._localHeader = this._buildLocalHeader();\n }\n\n private _buildLocalHeader(): Uint8Array {\n // CRC + sizes are written via data descriptor for true streaming.\n return buildLocalFileHeader({\n fileName: this.nameBytes,\n extraField: this.extraField,\n flags: this._flags,\n compressionMethod: this._compressionMethod,\n dosTime: this.dosTime,\n dosDate: this.dosDate,\n crc32: 0,\n compressedSize: 0,\n uncompressedSize: 0,\n versionNeeded: VERSION_NEEDED\n });\n }\n\n private _enqueueData(data: Uint8Array, final: boolean): void {\n if (this._ondata) {\n this._ondata(data, final);\n } else {\n this._dataQueue.push(data);\n if (final) {\n this._finalQueued = true;\n }\n }\n }\n\n private _flushQueue(): void {\n if (!this._ondata) {\n return;\n }\n\n const len = this._dataQueue.length;\n const finalIndex = this._finalQueued ? len - 1 : -1;\n for (let i = 0; i < len; i++) {\n this._ondata(this._dataQueue[i], i === finalIndex);\n }\n this._dataQueue = [];\n this._finalQueued = false;\n }\n\n get ondata(): ((data: Uint8Array, final: boolean) => void) | undefined {\n return this._ondata ?? undefined;\n }\n\n set ondata(cb: (data: Uint8Array, final: boolean) => void) {\n this._ondata = cb;\n // Flush any queued data\n this._flushQueue();\n }\n\n private _resolveComplete(): void {\n if (this._completeResolve) {\n this._completeResolve();\n }\n }\n\n private _rejectComplete(err: Error): void {\n this._completeError = err;\n if (this._completeReject) {\n this._completeReject(err);\n }\n }\n\n private _ensureCompletePromise(): Promise<void> {\n if (this._completeError) {\n return Promise.reject(this._completeError);\n }\n if (this._emittedDataDescriptor) {\n return Promise.resolve();\n }\n if (!this._completePromise) {\n this._completePromise = new Promise<void>((resolve, reject) => {\n this._completeResolve = resolve;\n this._completeReject = reject;\n });\n }\n return this._completePromise;\n }\n\n private _tapCallback(promise: Promise<void>, callback?: (err?: Error | null) => void): void {\n if (!callback) {\n return;\n }\n promise.then(() => callback()).catch(err => callback(err));\n }\n\n private _emitHeaderIfNeeded(): void {\n if (this._headerEmitted) {\n return;\n }\n this._emitHeader();\n this._headerEmitted = true;\n }\n\n private _writeData(data: Uint8Array): Promise<void> {\n if (data.length === 0) {\n return Promise.resolve();\n }\n\n // Update CRC32 on uncompressed data\n this._crc = crc32Update(this._crc, data);\n this._uncompressedSize += data.length;\n\n if (this._deflate) {\n // Write to deflate stream - returns Promise for async streaming\n return new Promise<void>((resolve, reject) => {\n this._deflate!.write(data, (err?: Error | null) => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n });\n });\n }\n\n // STORE mode - pass through\n this._compressedSize += data.length;\n this._enqueueData(data, false);\n return Promise.resolve();\n }\n\n private _endDeflateAndWait(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const deflate = this._deflate!;\n const onError = (err: Error) => {\n cleanup();\n reject(err);\n };\n const onEnd = () => {\n cleanup();\n resolve();\n };\n const cleanup = () => {\n deflate.off(\"error\", onError);\n deflate.off(\"end\", onEnd);\n };\n\n deflate.once(\"error\", onError);\n deflate.once(\"end\", onEnd);\n deflate.end();\n });\n }\n\n private _finalizeAfterWrite(writePromise: Promise<void>): Promise<void> {\n this._finalized = true;\n this._pendingEnd = true;\n\n const completePromise = this._ensureCompletePromise();\n if (this._deflate) {\n return writePromise.then(() => this._endDeflateAndWait()).then(() => completePromise);\n }\n\n // STORE mode - emit data descriptor directly\n this._emittedDataDescriptor = true;\n this._emitDataDescriptor();\n return completePromise;\n }\n\n /**\n * Push data - immediately compresses and outputs\n * Returns a Promise that resolves when the write is complete.\n * If final=true, it resolves after the data descriptor is emitted.\n */\n push(data: Uint8Array, final = false, callback?: (err?: Error | null) => void): Promise<void> {\n if (this._finalized) {\n const promise = Promise.reject(new Error(\"Cannot push to finalized ZipDeflateFile\"));\n this._tapCallback(promise, callback);\n return promise;\n }\n\n this._emitHeaderIfNeeded();\n\n const writePromise = this._writeData(data);\n const promise = final ? this._finalizeAfterWrite(writePromise) : writePromise;\n this._tapCallback(promise, callback);\n return promise;\n }\n\n /**\n * Emit local file header with Data Descriptor flag\n */\n private _emitHeader(): void {\n this._enqueueData(this._localHeader, false);\n }\n\n /**\n * Emit Data Descriptor with CRC and sizes\n */\n private _emitDataDescriptor(): void {\n const crcValue = crc32Finalize(this._crc);\n\n const descriptor = buildDataDescriptor(crcValue, this._compressedSize, this._uncompressedSize);\n\n // Store entry info for central directory\n this._centralDirEntryInfo = {\n name: this.nameBytes,\n extraField: this.extraField,\n flags: this._flags,\n crc: crcValue,\n compressedSize: this._compressedSize,\n uncompressedSize: this._uncompressedSize,\n compressionMethod: this._compressionMethod,\n dosTime: this.dosTime,\n dosDate: this.dosDate,\n offset: -1\n };\n\n this._enqueueData(descriptor, true);\n\n this._resolveComplete();\n }\n\n /**\n * Returns a promise that resolves when the file is completely written\n * (including data descriptor)\n */\n complete(): Promise<void> {\n return this._ensureCompletePromise();\n }\n\n /**\n * Get entry metadata in the same shape as unzip parser outputs.\n * This is best-effort: writer-only fields like encryption are always false.\n */\n getEntryInfo(): UnzipZipEntryInfo | null {\n if (!this._centralDirEntryInfo) {\n return null;\n }\n\n const path = this.name;\n const isDirectory = path.endsWith(\"/\") || path.endsWith(\"\\\\\");\n\n return {\n path,\n isDirectory,\n compressedSize: this._centralDirEntryInfo.compressedSize,\n uncompressedSize: this._centralDirEntryInfo.uncompressedSize,\n compressionMethod: this._centralDirEntryInfo.compressionMethod,\n crc32: this._centralDirEntryInfo.crc,\n lastModified: this._modTime,\n localHeaderOffset: this._centralDirEntryInfo.offset,\n comment: \"\",\n externalAttributes: 0,\n isEncrypted: false\n };\n }\n\n /** Writer-only metadata for building the Central Directory. */\n getCentralDirectoryEntryInfo(): CentralDirectoryEntryInfo | null {\n return this._centralDirEntryInfo;\n }\n\n isComplete(): boolean {\n return this._emittedDataDescriptor && this._centralDirEntryInfo !== null;\n }\n}\n\n/**\n * Streaming ZIP Creator - processes files sequentially\n */\nexport class StreamingZip {\n private callback: (err: Error | null, data: Uint8Array, final: boolean) => void;\n private entries: CentralDirectoryEntryInfo[] = [];\n private currentOffset = 0;\n private ended = false;\n private endPending = false;\n\n // Queue for sequential file processing\n private fileQueue: ZipDeflateFile[] = [];\n private fileQueueIndex = 0;\n private activeFile: ZipDeflateFile | null = null;\n\n constructor(callback: (err: Error | null, data: Uint8Array, final: boolean) => void) {\n this.callback = callback;\n }\n\n add(file: ZipDeflateFile): void {\n if (this.ended) {\n throw new Error(\"Cannot add files after calling end()\");\n }\n\n this.fileQueue.push(file);\n\n // If no active file, process this one\n if (!this.activeFile) {\n this._processNextFile();\n }\n }\n\n private _processNextFile(): void {\n if (this.fileQueueIndex >= this.fileQueue.length) {\n this.activeFile = null;\n\n // Reset queue storage\n this.fileQueue = [];\n this.fileQueueIndex = 0;\n\n // Check if we can finalize\n if (this.endPending) {\n this._finalize();\n }\n return;\n }\n\n const file = this.fileQueue[this.fileQueueIndex++]!;\n this.activeFile = file;\n const startOffset = this.currentOffset;\n\n file.ondata = (data: Uint8Array, final: boolean) => {\n this.currentOffset += data.length;\n this.callback(null, data, false);\n\n if (final) {\n const entryInfo = file.getCentralDirectoryEntryInfo();\n if (entryInfo) {\n entryInfo.offset = startOffset;\n this.entries.push(entryInfo);\n }\n\n // Process next file\n this._processNextFile();\n }\n };\n }\n\n private _finalize(): void {\n if (this.ended) {\n return;\n }\n this.ended = true;\n\n const centralDirOffset = this.currentOffset;\n let centralDirSize = 0;\n const empty = new Uint8Array(0);\n\n for (const entry of this.entries) {\n const header = buildCentralDirectoryHeader({\n fileName: entry.name,\n extraField: entry.extraField,\n comment: empty,\n flags: entry.flags,\n compressionMethod: entry.compressionMethod,\n dosTime: entry.dosTime,\n dosDate: entry.dosDate,\n crc32: entry.crc,\n compressedSize: entry.compressedSize,\n uncompressedSize: entry.uncompressedSize,\n localHeaderOffset: entry.offset,\n versionMadeBy: VERSION_MADE_BY,\n versionNeeded: VERSION_NEEDED\n });\n\n centralDirSize += header.length;\n this.callback(null, header, false);\n }\n\n const eocd = buildEndOfCentralDirectory({\n entryCount: this.entries.length,\n centralDirSize,\n centralDirOffset,\n comment: empty\n });\n\n this.callback(null, eocd, true);\n }\n\n end(): void {\n if (this.endPending || this.ended) {\n return;\n }\n this.endPending = true;\n\n // If no active file (all complete), finalize now\n if (!this.activeFile) {\n this._finalize();\n }\n // Otherwise, _processNextFile will call _finalize when done\n }\n}\n\n// =============================================================================\n// Export aliases for fflate compatibility\nexport { StreamingZip as Zip, ZipDeflateFile as ZipDeflate };\n","/**\n * Browser compression utilities\n *\n * Primary: CompressionStream API (Chrome 103+, Firefox 113+, Safari 16.4+)\n * Fallback: Pure JS DEFLATE implementation for older browsers\n *\n * Supported browsers with fallback:\n * - Chrome >= 89\n * - Firefox >= 102\n * - Safari >= 14.1\n * - Edge >= 89\n */\n\nimport {\n type CompressOptions,\n compressWithStream,\n decompressWithStream,\n hasDeflateRawCompressionStream,\n hasDeflateRawDecompressionStream,\n resolveCompressThresholdBytes\n} from \"@archive/compress.base\";\nimport { inflateRaw, deflateRawCompressed } from \"@archive/deflate-fallback\";\nimport { DEFAULT_COMPRESS_LEVEL } from \"@archive/defaults\";\n\n// Re-export shared types\nexport { type CompressOptions };\n\n/**\n * Check if CompressionStream is available in this environment.\n *\n * Note: Some environments may expose CompressionStream but not support\n * the \"deflate-raw\" format that ZIP requires.\n */\nexport function hasCompressionStream(): boolean {\n return typeof CompressionStream !== \"undefined\";\n}\n\n/**\n * Compress data using browser's native CompressionStream or JS fallback\n *\n * @param data - Data to compress\n * @param options - Compression options\n * @returns Compressed data\n *\n * @example\n * ```ts\n * const data = new TextEncoder().encode(\"Hello, World!\");\n * const compressed = await compress(data, { level: 6 });\n * ```\n */\nexport async function compress(\n data: Uint8Array,\n options: CompressOptions = {}\n): Promise<Uint8Array> {\n const level = options.level ?? DEFAULT_COMPRESS_LEVEL;\n const thresholdBytes = resolveCompressThresholdBytes(options);\n\n // Level 0 means no compression\n if (level === 0) {\n return data;\n }\n\n // Use native CompressionStream only for larger inputs.\n if (hasDeflateRawCompressionStream() && data.byteLength > thresholdBytes) {\n return compressWithStream(data);\n }\n\n // Fallback to pure JS implementation\n return deflateRawCompressed(data);\n}\n\n/**\n * Compress data synchronously using pure JS implementation\n *\n * @param data - Data to compress\n * @param options - Compression options\n * @returns Compressed data\n */\nexport function compressSync(data: Uint8Array, options: CompressOptions = {}): Uint8Array {\n const level = options.level ?? DEFAULT_COMPRESS_LEVEL;\n\n // Level 0 means no compression\n if (level === 0) {\n return data;\n }\n\n // Pure JS implementation\n return deflateRawCompressed(data);\n}\n\n/**\n * Decompress data using browser's native DecompressionStream or JS fallback\n *\n * @param data - Compressed data (deflate-raw format)\n * @returns Decompressed data\n */\nexport async function decompress(\n data: Uint8Array,\n options: CompressOptions = {}\n): Promise<Uint8Array> {\n const thresholdBytes = resolveCompressThresholdBytes(options);\n\n // Use native DecompressionStream only for larger inputs.\n if (hasDeflateRawDecompressionStream() && data.byteLength > thresholdBytes) {\n return decompressWithStream(data);\n }\n\n // Fallback to pure JS implementation\n return inflateRaw(data);\n}\n\n/**\n * Decompress data synchronously using pure JS implementation\n *\n * @param data - Compressed data (deflate-raw format)\n * @returns Decompressed data\n */\nexport function decompressSync(data: Uint8Array): Uint8Array {\n return inflateRaw(data);\n}\n","/**\n * Tiny binary reader for Uint8Array-backed DataView.\n * Shared by ZIP parsers.\n */\n\nimport { decodeLatin1, decodeUtf8 } from \"@archive/utils/text\";\n\nexport function writeUint32LE(value: number): Uint8Array {\n const out = new Uint8Array(4);\n const view = new DataView(out.buffer);\n view.setUint32(0, value >>> 0, true);\n return out;\n}\n\nexport function readUint32LE(data: Uint8Array, offset: number): number {\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n return view.getUint32(offset, true);\n}\n\nexport class BinaryReader {\n private view: DataView;\n private offset: number;\n private data: Uint8Array;\n\n constructor(data: Uint8Array, offset = 0) {\n this.data = data;\n this.view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n this.offset = offset;\n }\n\n get position(): number {\n return this.offset;\n }\n\n set position(value: number) {\n this.offset = value;\n }\n\n get remaining(): number {\n return this.data.length - this.offset;\n }\n\n readUint8(): number {\n const value = this.view.getUint8(this.offset);\n this.offset += 1;\n return value;\n }\n\n readUint16(): number {\n const value = this.view.getUint16(this.offset, true);\n this.offset += 2;\n return value;\n }\n\n readUint32(): number {\n const value = this.view.getUint32(this.offset, true);\n this.offset += 4;\n return value;\n }\n\n readBigUint64(): bigint {\n const value = this.view.getBigUint64(this.offset, true);\n this.offset += 8;\n return value;\n }\n\n readBytes(length: number): Uint8Array {\n const bytes = this.data.subarray(this.offset, this.offset + length);\n this.offset += length;\n return bytes;\n }\n\n readString(length: number, utf8 = true): string {\n const bytes = this.readBytes(length);\n return utf8 ? decodeUtf8(bytes) : decodeLatin1(bytes);\n }\n\n skip(length: number): void {\n this.offset += length;\n }\n\n slice(start: number, end: number): Uint8Array {\n return this.data.subarray(start, end);\n }\n\n peekUint32(offset: number): number {\n return this.view.getUint32(offset, true);\n }\n}\n","/**\n * ZIP extra field parsing helpers.\n *\n * Kept standalone so both streaming parser (`parse.base.ts`) and buffer parser\n * (`zip-parser.ts`) can share ZIP64 + Info-ZIP timestamp handling.\n */\n\nimport { parseExtendedTimestampMtimeUnixSeconds } from \"@archive/utils/zip-extra\";\n\nexport interface ZipVars {\n uncompressedSize: number;\n compressedSize: number;\n offsetToLocalFileHeader?: number;\n}\n\nexport interface ZipExtraFields {\n uncompressedSize?: number;\n compressedSize?: number;\n offsetToLocalFileHeader?: number;\n /** Info-ZIP extended timestamp (0x5455) mtime, Unix seconds (UTC). */\n mtimeUnixSeconds?: number;\n}\n\nfunction readUint64LE(view: DataView, offset: number): number {\n // Convert to Number via 2x Uint32 to avoid BigInt requirements.\n const low = view.getUint32(offset, true);\n const high = view.getUint32(offset + 4, true);\n return high * 0x100000000 + low;\n}\n\nexport function parseZipExtraFields(extraField: Uint8Array, vars: ZipVars): ZipExtraFields {\n const extra: ZipExtraFields = {};\n\n if (extraField.length < 4) {\n return extra;\n }\n\n const view = new DataView(extraField.buffer, extraField.byteOffset, extraField.byteLength);\n let offset = 0;\n\n while (offset + 4 <= extraField.length) {\n const signature = view.getUint16(offset, true);\n const partSize = view.getUint16(offset + 2, true);\n const dataStart = offset + 4;\n const dataEnd = dataStart + partSize;\n\n if (dataEnd > extraField.length) {\n break;\n }\n\n if (signature === 0x0001) {\n // ZIP64 extended information.\n // Field presence and order depends on which values are 0xFFFFFFFF in the header.\n let cursor = dataStart;\n\n if (vars.uncompressedSize === 0xffffffff && cursor + 8 <= dataEnd) {\n extra.uncompressedSize = readUint64LE(view, cursor);\n cursor += 8;\n }\n if (vars.compressedSize === 0xffffffff && cursor + 8 <= dataEnd) {\n extra.compressedSize = readUint64LE(view, cursor);\n cursor += 8;\n }\n if (vars.offsetToLocalFileHeader === 0xffffffff && cursor + 8 <= dataEnd) {\n extra.offsetToLocalFileHeader = readUint64LE(view, cursor);\n }\n } else if (signature === 0x5455) {\n // Fast-path parse for Info-ZIP extended timestamp (mtime only).\n if (partSize >= 1) {\n const flags = extraField[dataStart];\n if ((flags & 0x01) !== 0 && partSize >= 5) {\n extra.mtimeUnixSeconds = view.getUint32(dataStart + 1, true) >>> 0;\n } else {\n const unixSeconds = parseExtendedTimestampMtimeUnixSeconds(\n extraField.subarray(offset, dataEnd)\n );\n if (unixSeconds !== undefined) {\n extra.mtimeUnixSeconds = unixSeconds;\n }\n }\n }\n }\n\n offset = dataEnd;\n }\n\n if (vars.compressedSize === 0xffffffff) {\n vars.compressedSize = extra.compressedSize!;\n }\n\n if (vars.uncompressedSize === 0xffffffff) {\n vars.uncompressedSize = extra.uncompressedSize!;\n }\n\n if (vars.offsetToLocalFileHeader === 0xffffffff) {\n vars.offsetToLocalFileHeader = extra.offsetToLocalFileHeader;\n }\n\n return extra;\n}\n","/**\n * Pure Uint8Array-based ZIP parser\n * Works in both Node.js and browser environments\n * No dependency on Node.js stream module\n */\n\nimport { decompress, decompressSync } from \"@archive/compress\";\nimport { BinaryReader } from \"@archive/utils/binary\";\nimport { resolveZipLastModifiedDateFromUnixSeconds } from \"@archive/utils/timestamps\";\nimport { parseZipExtraFields } from \"@archive/utils/zip-extra-fields\";\nimport type { ZipEntryInfo } from \"@archive/zip-entry-info\";\nimport {\n CENTRAL_DIR_HEADER_SIG,\n COMPRESSION_DEFLATE,\n COMPRESSION_STORE,\n END_OF_CENTRAL_DIR_SIG,\n LOCAL_FILE_HEADER_SIG,\n UINT16_MAX,\n UINT32_MAX,\n ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIG,\n ZIP64_END_OF_CENTRAL_DIR_SIG\n} from \"@archive/zip-constants\";\n\nexport type { ZipEntryInfo };\n\n/**\n * ZIP parsing options\n */\nexport interface ZipParseOptions {\n /** Whether to decode file names as UTF-8 (default: true) */\n decodeStrings?: boolean;\n}\n\n/**\n * Find the End of Central Directory record\n * Searches backwards from the end of the file\n */\nfunction findEndOfCentralDir(data: Uint8Array): number {\n // EOCD is at least 22 bytes, search backwards\n // Comment can be up to 65535 bytes\n const minOffset = Math.max(0, data.length - 65557);\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\n for (let i = data.length - 22; i >= minOffset; i--) {\n if (view.getUint32(i, true) === END_OF_CENTRAL_DIR_SIG) {\n return i;\n }\n }\n\n return -1;\n}\n\n/**\n * Find ZIP64 End of Central Directory Locator\n */\nfunction findZip64EOCDLocator(data: Uint8Array, eocdOffset: number): number {\n // ZIP64 EOCD Locator is 20 bytes and appears right before EOCD\n const locatorOffset = eocdOffset - 20;\n if (locatorOffset < 0) {\n return -1;\n }\n\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n if (view.getUint32(locatorOffset, true) === ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIG) {\n return locatorOffset;\n }\n\n return -1;\n}\n\n/**\n * Parse ZIP file entries from Central Directory\n */\nfunction parseZipEntries(data: Uint8Array, options: ZipParseOptions = {}): ZipEntryInfo[] {\n const { decodeStrings = true } = options;\n const entries: ZipEntryInfo[] = [];\n\n // Find End of Central Directory\n const eocdOffset = findEndOfCentralDir(data);\n if (eocdOffset === -1) {\n throw new Error(\"Invalid ZIP file: End of Central Directory not found\");\n }\n\n const reader = new BinaryReader(data, eocdOffset);\n\n // Read EOCD\n // Offset Size Description\n // 0 4 EOCD signature (0x06054b50)\n // 4 2 Number of this disk\n // 6 2 Disk where central directory starts\n // 8 2 Number of central directory records on this disk\n // 10 2 Total number of central directory records\n // 12 4 Size of central directory (bytes)\n // 16 4 Offset of start of central directory\n // 20 2 Comment length\n reader.skip(4); // signature\n reader.skip(2); // disk number\n reader.skip(2); // disk where central dir starts\n reader.skip(2); // entries on this disk\n let totalEntries = reader.readUint16(); // total entries\n reader.skip(4); // central directory size (unused)\n let centralDirOffset = reader.readUint32();\n\n // Check for ZIP64\n const zip64LocatorOffset = findZip64EOCDLocator(data, eocdOffset);\n if (zip64LocatorOffset !== -1) {\n const locatorReader = new BinaryReader(data, zip64LocatorOffset);\n locatorReader.skip(4); // signature\n locatorReader.skip(4); // disk number with ZIP64 EOCD\n const zip64EOCDOffset = Number(locatorReader.readBigUint64());\n\n // Read ZIP64 EOCD\n const zip64Reader = new BinaryReader(data, zip64EOCDOffset);\n const zip64Sig = zip64Reader.readUint32();\n if (zip64Sig === ZIP64_END_OF_CENTRAL_DIR_SIG) {\n zip64Reader.skip(8); // size of ZIP64 EOCD\n zip64Reader.skip(2); // version made by\n zip64Reader.skip(2); // version needed\n zip64Reader.skip(4); // disk number\n zip64Reader.skip(4); // disk with central dir\n const zip64TotalEntries = Number(zip64Reader.readBigUint64());\n zip64Reader.skip(8); // central directory size (unused)\n const zip64CentralDirOffset = Number(zip64Reader.readBigUint64());\n\n // Use ZIP64 values if standard values are maxed out\n if (totalEntries === UINT16_MAX) {\n totalEntries = zip64TotalEntries;\n }\n if (centralDirOffset === UINT32_MAX) {\n centralDirOffset = zip64CentralDirOffset;\n }\n }\n }\n\n // Read Central Directory entries\n const centralReader = new BinaryReader(data, centralDirOffset);\n\n for (let i = 0; i < totalEntries; i++) {\n const sig = centralReader.readUint32();\n if (sig !== CENTRAL_DIR_HEADER_SIG) {\n throw new Error(`Invalid Central Directory header signature at entry ${i}`);\n }\n\n // Central Directory File Header format:\n // Offset Size Description\n // 0 4 Central directory file header signature (0x02014b50)\n // 4 2 Version made by\n // 6 2 Version needed to extract\n // 8 2 General purpose bit flag\n // 10 2 Compression method\n // 12 2 File last modification time\n // 14 2 File last modification date\n // 16 4 CRC-32\n // 20 4 Compressed size\n // 24 4 Uncompressed size\n // 28 2 File name length\n // 30 2 Extra field length\n // 32 2 File comment length\n // 34 2 Disk number where file starts\n // 36 2 Internal file attributes\n // 38 4 External file attributes\n // 42 4 Relative offset of local file header\n // 46 n File name\n // 46+n m Extra field\n // 46+n+m k File comment\n\n centralReader.skip(2); // version made by\n centralReader.skip(2); // version needed\n const flags = centralReader.readUint16();\n const compressionMethod = centralReader.readUint16();\n const lastModTime = centralReader.readUint16();\n const lastModDate = centralReader.readUint16();\n const crc32 = centralReader.readUint32();\n let compressedSize = centralReader.readUint32();\n let uncompressedSize = centralReader.readUint32();\n const fileNameLength = centralReader.readUint16();\n const extraFieldLength = centralReader.readUint16();\n const commentLength = centralReader.readUint16();\n centralReader.skip(2); // disk number start\n centralReader.skip(2); // internal attributes\n const externalAttributes = centralReader.readUint32();\n let localHeaderOffset = centralReader.readUint32();\n\n // Check for UTF-8 flag (bit 11)\n const isUtf8 = (flags & 0x800) !== 0;\n const useUtf8 = decodeStrings && isUtf8;\n\n const fileName = centralReader.readString(fileNameLength, useUtf8);\n const extraField = centralReader.readBytes(extraFieldLength);\n const comment = centralReader.readString(commentLength, useUtf8);\n\n const vars = {\n compressedSize,\n uncompressedSize,\n offsetToLocalFileHeader: localHeaderOffset\n };\n const extraFields = extraFieldLength > 0 ? parseZipExtraFields(extraField, vars) : {};\n\n compressedSize = vars.compressedSize;\n uncompressedSize = vars.uncompressedSize;\n localHeaderOffset = vars.offsetToLocalFileHeader ?? localHeaderOffset;\n\n const isDirectory = fileName.endsWith(\"/\") || (externalAttributes & 0x10) !== 0;\n const isEncrypted = (flags & 0x01) !== 0;\n\n const unixSecondsMtime = extraFields.mtimeUnixSeconds;\n const lastModified = resolveZipLastModifiedDateFromUnixSeconds(\n lastModDate,\n lastModTime,\n unixSecondsMtime\n );\n\n entries.push({\n path: fileName,\n isDirectory,\n compressedSize,\n uncompressedSize,\n compressionMethod,\n crc32,\n lastModified,\n localHeaderOffset,\n comment,\n externalAttributes,\n isEncrypted\n });\n }\n\n return entries;\n}\n\n/**\n * Extract file data for a specific entry\n */\nasync function extractEntryData(data: Uint8Array, entry: ZipEntryInfo): Promise<Uint8Array> {\n if (entry.isDirectory) {\n return new Uint8Array(0);\n }\n\n if (entry.isEncrypted) {\n throw new Error(`File \"${entry.path}\" is encrypted and cannot be extracted`);\n }\n\n const compressedData = readEntryCompressedData(data, entry);\n\n if (entry.compressionMethod === COMPRESSION_STORE) {\n return compressedData;\n }\n if (entry.compressionMethod === COMPRESSION_DEFLATE) {\n return decompress(compressedData);\n }\n throw new Error(`Unsupported compression method: ${entry.compressionMethod}`);\n}\n\n/**\n * Extract file data synchronously\n */\nfunction extractEntryDataSync(data: Uint8Array, entry: ZipEntryInfo): Uint8Array {\n if (entry.isDirectory) {\n return new Uint8Array(0);\n }\n\n if (entry.isEncrypted) {\n throw new Error(`File \"${entry.path}\" is encrypted and cannot be extracted`);\n }\n\n const compressedData = readEntryCompressedData(data, entry);\n\n if (entry.compressionMethod === COMPRESSION_STORE) {\n return compressedData;\n }\n if (entry.compressionMethod === COMPRESSION_DEFLATE) {\n return decompressSync(compressedData);\n }\n throw new Error(`Unsupported compression method: ${entry.compressionMethod}`);\n}\n\nfunction readEntryCompressedData(data: Uint8Array, entry: ZipEntryInfo): Uint8Array {\n const reader = new BinaryReader(data, entry.localHeaderOffset);\n\n const sig = reader.readUint32();\n if (sig !== LOCAL_FILE_HEADER_SIG) {\n throw new Error(`Invalid local file header signature for \"${entry.path}\"`);\n }\n\n reader.skip(2); // version needed\n reader.skip(2); // flags\n reader.skip(2); // compression method\n reader.skip(2); // last mod time\n reader.skip(2); // last mod date\n reader.skip(4); // crc32\n reader.skip(4); // compressed size\n reader.skip(4); // uncompressed size\n const fileNameLength = reader.readUint16();\n const extraFieldLength = reader.readUint16();\n\n reader.skip(fileNameLength);\n reader.skip(extraFieldLength);\n\n return reader.readBytes(entry.compressedSize);\n}\n\n/**\n * High-level ZIP parser class\n */\nexport class ZipParser {\n private data: Uint8Array;\n private entries: ZipEntryInfo[];\n private entryMap: Map<string, ZipEntryInfo>;\n\n constructor(data: Uint8Array | ArrayBuffer, options: ZipParseOptions = {}) {\n this.data = data instanceof ArrayBuffer ? new Uint8Array(data) : data;\n this.entries = parseZipEntries(this.data, options);\n this.entryMap = new Map(this.entries.map(e => [e.path, e]));\n }\n\n /**\n * Get all entries in the ZIP file\n */\n getEntries(): ZipEntryInfo[] {\n return this.entries;\n }\n\n /**\n * Get entry by path\n */\n getEntry(path: string): ZipEntryInfo | undefined {\n return this.entryMap.get(path);\n }\n\n /**\n * Check if entry exists\n */\n hasEntry(path: string): boolean {\n return this.entryMap.has(path);\n }\n\n /**\n * List all file paths\n */\n listFiles(): string[] {\n return this.entries.map(e => e.path);\n }\n\n /**\n * Extract a single file (async)\n */\n async extract(path: string): Promise<Uint8Array | null> {\n const entry = this.entryMap.get(path);\n if (!entry) {\n return null;\n }\n return extractEntryData(this.data, entry);\n }\n\n /**\n * Extract a single file (sync)\n *\n * This is supported in both Node.js and browser builds.\n */\n extractSync(path: string): Uint8Array | null {\n const entry = this.entryMap.get(path);\n if (!entry) {\n return null;\n }\n return extractEntryDataSync(this.data, entry);\n }\n\n /**\n * Extract all files (async)\n */\n async extractAll(): Promise<Map<string, Uint8Array>> {\n const result = new Map<string, Uint8Array>();\n for (const entry of this.entries) {\n const data = await extractEntryData(this.data, entry);\n result.set(entry.path, data);\n }\n return result;\n }\n\n /**\n * Extract all files (sync)\n * Returns object with file paths as keys and Uint8Array content as values\n */\n extractAllSync(): Record<string, Uint8Array> {\n const result: Record<string, Uint8Array> = {};\n for (const entry of this.entries) {\n result[entry.path] = extractEntryDataSync(this.data, entry);\n }\n return result;\n }\n\n /**\n * Iterate over entries with async callback\n */\n async forEach(\n callback: (entry: ZipEntryInfo, getData: () => Promise<Uint8Array>) => Promise<boolean | void>\n ): Promise<void> {\n for (const entry of this.entries) {\n let dataPromise: Promise<Uint8Array> | null = null;\n const getData = () => {\n if (!dataPromise) {\n dataPromise = extractEntryData(this.data, entry);\n }\n return dataPromise;\n };\n\n const shouldContinue = await callback(entry, getData);\n if (shouldContinue === false) {\n break;\n }\n }\n }\n}\n","/**\n * Read unsigned little-endian integer from Uint8Array\n */\nfunction readUIntLE(buffer: Uint8Array, offset: number, size: number): number {\n const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);\n switch (size) {\n case 1:\n return view.getUint8(offset);\n case 2:\n return view.getUint16(offset, true);\n case 4:\n return view.getUint32(offset, true);\n case 8: {\n // Read as BigUint64 and convert to Number\n const low = view.getUint32(offset, true);\n const high = view.getUint32(offset + 4, true);\n return high * 0x100000000 + low;\n }\n default:\n throw new Error(\"Unsupported UInt LE size!\");\n }\n}\n\n/**\n * Parses sequential unsigned little endian numbers from the head of the passed buffer according to\n * the specified format passed. If the buffer is not large enough to satisfy the full format,\n * null values will be assigned to the remaining keys.\n * @param buffer The buffer to sequentially extract numbers from.\n * @param format Expected format to follow when extracting values from the buffer. A list of list entries\n * with the following structure:\n * [\n * [\n * <key>, // Name of the key to assign the extracted number to.\n * <size> // The size in bytes of the number to extract. possible values are 1, 2, 4, 8.\n * ],\n * ...\n * ]\n * @returns An object with keys set to their associated extracted values.\n */\nexport function parse(\n buffer: Uint8Array,\n format: [string, number][]\n): Record<string, number | null> {\n const result: Record<string, number | null> = {};\n let offset = 0;\n for (const [key, size] of format) {\n if (buffer.length >= offset + size) {\n result[key] = readUIntLE(buffer, offset, size);\n } else {\n result[key] = null;\n }\n offset += size;\n }\n return result;\n}\n\nexport function parseTyped<T>(buffer: Uint8Array, format: [string, number][]): T {\n return parse(buffer, format) as T;\n}\n","import { parseDosDateTimeUTC, resolveZipLastModifiedDateFromUnixSeconds } from \"@archive/utils/timestamps\";\nimport {\n Duplex,\n PassThrough,\n Transform,\n concatUint8Arrays,\n pipeline,\n type Readable\n} from \"@stream\";\nimport { parseTyped as parseBuffer } from \"@archive/utils/parse-buffer\";\nimport { ByteQueue } from \"@archive/byte-queue\";\nimport { indexOfUint8ArrayPattern } from \"@archive/utils/bytes\";\nimport { readUint32LE, writeUint32LE } from \"@archive/utils/binary\";\nimport { parseZipExtraFields, type ZipExtraFields, type ZipVars } from \"@archive/utils/zip-extra-fields\";\nimport {\n CENTRAL_DIR_HEADER_SIG,\n END_OF_CENTRAL_DIR_SIG,\n LOCAL_FILE_HEADER_SIG,\n ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIG,\n ZIP64_END_OF_CENTRAL_DIR_SIG\n} from \"@archive/zip-constants\";\n\n// Shared parseBuffer() formats\nexport const CRX_HEADER_FORMAT: [string, number][] = [\n [\"version\", 4],\n [\"pubKeyLength\", 4],\n [\"signatureLength\", 4]\n];\n\nexport const LOCAL_FILE_HEADER_FORMAT: [string, number][] = [\n [\"versionsNeededToExtract\", 2],\n [\"flags\", 2],\n [\"compressionMethod\", 2],\n [\"lastModifiedTime\", 2],\n [\"lastModifiedDate\", 2],\n [\"crc32\", 4],\n [\"compressedSize\", 4],\n [\"uncompressedSize\", 4],\n [\"fileNameLength\", 2],\n [\"extraFieldLength\", 2]\n];\n\nexport const DATA_DESCRIPTOR_FORMAT: [string, number][] = [\n [\"dataDescriptorSignature\", 4],\n [\"crc32\", 4],\n [\"compressedSize\", 4],\n [\"uncompressedSize\", 4]\n];\n\nexport const CENTRAL_DIRECTORY_FILE_HEADER_FORMAT: [string, number][] = [\n [\"versionMadeBy\", 2],\n [\"versionsNeededToExtract\", 2],\n [\"flags\", 2],\n [\"compressionMethod\", 2],\n [\"lastModifiedTime\", 2],\n [\"lastModifiedDate\", 2],\n [\"crc32\", 4],\n [\"compressedSize\", 4],\n [\"uncompressedSize\", 4],\n [\"fileNameLength\", 2],\n [\"extraFieldLength\", 2],\n [\"fileCommentLength\", 2],\n [\"diskNumber\", 2],\n [\"internalFileAttributes\", 2],\n [\"externalFileAttributes\", 4],\n [\"offsetToLocalFileHeader\", 4]\n];\n\nexport const END_OF_CENTRAL_DIRECTORY_FORMAT: [string, number][] = [\n [\"diskNumber\", 2],\n [\"diskStart\", 2],\n [\"numberOfRecordsOnDisk\", 2],\n [\"numberOfRecords\", 2],\n [\"sizeOfCentralDirectory\", 4],\n [\"offsetToStartOfCentralDirectory\", 4],\n [\"commentLength\", 2]\n];\n\n// Shared entry metadata helpers\nexport interface ZipEntryVarsMeta {\n flags: number | null;\n uncompressedSize: number;\n lastModifiedDate: number | null;\n lastModifiedTime: number | null;\n}\n\nexport type { ZipVars, ZipExtraFields };\n\nexport interface ZipEntryPropsMeta {\n path: string;\n pathBuffer: Uint8Array;\n flags: {\n isUnicode: boolean;\n };\n}\n\nexport interface CrxHeader {\n version: number | null;\n pubKeyLength: number | null;\n signatureLength: number | null;\n publicKey?: Uint8Array;\n signature?: Uint8Array;\n}\n\nexport interface LocalFileHeaderVars {\n versionsNeededToExtract: number | null;\n flags: number | null;\n compressionMethod: number | null;\n lastModifiedTime: number | null;\n lastModifiedDate: number | null;\n crc32: number | null;\n compressedSize: number | null;\n uncompressedSize: number | null;\n fileNameLength: number | null;\n extraFieldLength: number | null;\n}\n\nexport interface DataDescriptorVars {\n dataDescriptorSignature: number | null;\n crc32: number | null;\n compressedSize: number | null;\n uncompressedSize: number | null;\n}\n\nconst textDecoder = new TextDecoder();\nconst textEncoder = new TextEncoder();\n\nexport function decodeZipEntryPath(pathBuffer: Uint8Array): string {\n return textDecoder.decode(pathBuffer);\n}\n\nexport function isZipUnicodeFlag(flags: number | null): boolean {\n return ((flags || 0) & 0x800) !== 0;\n}\n\nexport function isZipDirectoryPath(path: string): boolean {\n if (path.length === 0) {\n return false;\n }\n const last = path.charCodeAt(path.length - 1);\n return last === 47 || last === 92;\n}\n\nexport function getZipEntryType(path: string, uncompressedSize: number): \"Directory\" | \"File\" {\n return uncompressedSize === 0 && isZipDirectoryPath(path) ? \"Directory\" : \"File\";\n}\n\nexport function buildZipEntryProps(\n path: string,\n pathBuffer: Uint8Array,\n flags: number | null\n): ZipEntryPropsMeta {\n return {\n path,\n pathBuffer,\n flags: {\n isUnicode: isZipUnicodeFlag(flags)\n }\n };\n}\n\nexport function resolveZipEntryLastModifiedDateTime(\n vars: ZipEntryVarsMeta,\n extraFields: ZipExtraFields\n): Date {\n const dosDate = vars.lastModifiedDate || 0;\n const dosTime = vars.lastModifiedTime || 0;\n\n const dosDateTime = parseDosDateTimeUTC(dosDate, dosTime);\n\n const unixSecondsMtime = extraFields.mtimeUnixSeconds;\n if (unixSecondsMtime === undefined) {\n return dosDateTime;\n }\n\n return resolveZipLastModifiedDateFromUnixSeconds(dosDate, dosTime, unixSecondsMtime);\n}\n\nexport const parseExtraField = parseZipExtraFields;\n\nexport function hasDataDescriptorFlag(flags: number | null): boolean {\n return ((flags || 0) & 0x08) !== 0;\n}\n\nexport function isFileSizeKnown(flags: number | null, compressedSize: number | null): boolean {\n return !hasDataDescriptorFlag(flags) || (compressedSize || 0) > 0;\n}\n\nexport type DrainStream = Transform & { promise: () => Promise<void> };\n\nexport function autodrain(stream: { pipe: (dest: Transform) => unknown }): DrainStream {\n const draining = stream.pipe(\n new Transform({\n transform(_chunk: Uint8Array, _encoding: string, callback: () => void) {\n callback();\n }\n })\n ) as DrainStream;\n\n draining.promise = () =>\n new Promise<void>((resolve, reject) => {\n draining.on(\"finish\", resolve);\n draining.on(\"error\", reject);\n });\n\n return draining;\n}\n\n/**\n * Collects all data from a readable stream into a single Uint8Array.\n */\nexport function bufferStream(entry: Readable): Promise<Uint8Array> {\n return new Promise((resolve, reject) => {\n const chunks: Uint8Array[] = [];\n const stream = new Transform({\n transform(d: Uint8Array, _encoding: string, callback: () => void) {\n chunks.push(d);\n callback();\n }\n });\n\n stream.on(\"finish\", () => {\n resolve(chunks.length === 1 ? chunks[0] : concatUint8Arrays(chunks));\n });\n stream.on(\"error\", reject);\n\n entry.on(\"error\", reject).pipe(stream);\n });\n}\n\nexport type PullFn = (length: number) => Promise<Uint8Array>;\n\nconst STR_FUNCTION = \"function\";\n\nexport class PullStream extends Duplex {\n protected readonly _queue = new ByteQueue();\n\n get buffer(): Uint8Array {\n return this._queue.view();\n }\n set buffer(value: Uint8Array) {\n this._queue.reset(value);\n }\n\n cb?: () => void;\n finished: boolean;\n match?: number;\n __emittedError?: Error;\n\n constructor() {\n super({ decodeStrings: false, objectMode: true });\n this.finished = false;\n\n this.on(\"finish\", () => {\n this.finished = true;\n this.emit(\"chunk\", false);\n });\n }\n\n _write(chunk: Uint8Array | string, _encoding: string, callback: () => void): void {\n const data = typeof chunk === \"string\" ? textEncoder.encode(chunk) : chunk;\n this._queue.append(data);\n this.cb = callback;\n this.emit(\"chunk\");\n }\n\n _read(): void {}\n\n protected _maybeReleaseWriteCallback(): void {\n if (typeof this.cb === STR_FUNCTION) {\n const callback = this.cb;\n this.cb = undefined;\n callback();\n }\n }\n\n /**\n * The `eof` parameter is interpreted as `file_length` if the type is number\n * otherwise (i.e. Uint8Array) it is interpreted as a pattern signaling end of stream\n */\n stream(eof: number | Uint8Array, includeEof?: boolean): PassThrough {\n const p = new PassThrough();\n let done = false;\n\n const cb = (): void => {\n this._maybeReleaseWriteCallback();\n };\n\n const pull = (): void => {\n let packet: Uint8Array | undefined;\n const available = this._queue.length;\n if (available) {\n if (typeof eof === \"number\") {\n const toRead = Math.min(eof, available);\n if (toRead > 0) {\n packet = this._queue.read(toRead);\n eof -= toRead;\n }\n done = done || eof === 0;\n } else {\n const view = this._queue.view();\n let match = indexOfUint8ArrayPattern(view, eof);\n if (match !== -1) {\n // store signature match byte offset to allow us to reference\n // this for zip64 offset\n this.match = match;\n if (includeEof) {\n match = match + eof.length;\n }\n if (match > 0) {\n packet = this._queue.read(match);\n }\n done = true;\n } else {\n const len = view.length - eof.length;\n if (len <= 0) {\n cb();\n } else {\n packet = this._queue.read(len);\n }\n }\n }\n if (packet) {\n p.write(packet, () => {\n if (\n this._queue.length === 0 ||\n (typeof eof !== \"number\" && eof.length && this._queue.length <= eof.length)\n ) {\n cb();\n }\n\n if (done) {\n cb();\n this.removeListener(\"chunk\", pull);\n p.end();\n return;\n }\n\n // Continue draining regardless of downstream read timing.\n queueMicrotask(pull);\n });\n return;\n }\n }\n\n if (!done) {\n if (this.finished) {\n this.removeListener(\"chunk\", pull);\n cb();\n p.destroy(new Error(\"FILE_ENDED\"));\n return;\n }\n } else {\n this.removeListener(\"chunk\", pull);\n cb();\n p.end();\n }\n };\n\n this.on(\"chunk\", pull);\n pull();\n return p;\n }\n\n pull(eof: number | Uint8Array, includeEof?: boolean): Promise<Uint8Array> {\n if (eof === 0) {\n return Promise.resolve(new Uint8Array(0));\n }\n\n // If we already have the required data in buffer\n // we can resolve the request immediately\n if (typeof eof === \"number\" && this._queue.length >= eof) {\n const data = this._queue.read(eof);\n\n // If we drained the internal buffer, allow the upstream writer to continue.\n if (this._queue.length === 0) {\n this._maybeReleaseWriteCallback();\n }\n return Promise.resolve(data);\n }\n\n // Otherwise we stream until we have it\n const chunks: Uint8Array[] = [];\n const concatStream = new Transform({\n transform(d: Uint8Array, _encoding: string, cb: () => void) {\n chunks.push(d);\n cb();\n }\n });\n\n let pullStreamRejectHandler: (e: Error) => void;\n\n return new Promise<Uint8Array>((resolve, reject) => {\n pullStreamRejectHandler = (e: Error) => {\n this.__emittedError = e;\n reject(e);\n };\n if (this.finished) {\n return reject(new Error(\"FILE_ENDED\"));\n }\n this.once(\"error\", pullStreamRejectHandler); // reject any errors from pullstream itself\n this.stream(eof, includeEof)\n .on(\"error\", reject)\n .pipe(concatStream)\n .on(\"finish\", () => {\n resolve(chunks.length === 1 ? chunks[0] : concatUint8Arrays(chunks));\n })\n .on(\"error\", reject);\n }).finally(() => {\n this.removeListener(\"error\", pullStreamRejectHandler);\n });\n }\n\n pullUntil(pattern: Uint8Array, includeEof?: boolean): Promise<Uint8Array> {\n return this.pull(pattern, includeEof);\n }\n}\n\n// Structural public API for PullStream-like consumers.\n//\n// NOTE: Do not use the PullStream class type directly for cross-environment typing,\n// because it contains protected members (nominal typing).\nexport type PullStreamPublicApi = {\n buffer: Uint8Array;\n cb?: () => void;\n finished: boolean;\n match?: number;\n stream(eof: number | Uint8Array, includeEof?: boolean): PassThrough;\n pull(eof: number | Uint8Array, includeEof?: boolean): Promise<Uint8Array>;\n pullUntil(pattern: Uint8Array, includeEof?: boolean): Promise<Uint8Array>;\n};\n\nexport async function readCrxHeader(pull: PullFn): Promise<CrxHeader> {\n const data = await pull(12);\n const header = parseBuffer<CrxHeader>(data, CRX_HEADER_FORMAT);\n const pubKeyLength = header.pubKeyLength || 0;\n const signatureLength = header.signatureLength || 0;\n\n const keyAndSig = await pull(pubKeyLength + signatureLength);\n header.publicKey = keyAndSig.subarray(0, pubKeyLength);\n header.signature = keyAndSig.subarray(pubKeyLength);\n return header;\n}\n\nexport async function readLocalFileHeader(pull: PullFn): Promise<{\n vars: EntryVars;\n fileNameBuffer: Uint8Array;\n extraFieldData: Uint8Array;\n}> {\n const data = await pull(26);\n const vars = parseBuffer<EntryVars>(data, LOCAL_FILE_HEADER_FORMAT);\n const fileNameBuffer = await pull(vars.fileNameLength || 0);\n const extraFieldData = await pull(vars.extraFieldLength || 0);\n return { vars, fileNameBuffer, extraFieldData };\n}\n\nexport async function readDataDescriptor(pull: PullFn): Promise<DataDescriptorVars> {\n const data = await pull(16);\n return parseBuffer<DataDescriptorVars>(data, DATA_DESCRIPTOR_FORMAT);\n}\n\nexport async function consumeCentralDirectoryFileHeader(pull: PullFn): Promise<void> {\n const data = await pull(42);\n const vars = parseBuffer<Record<string, number | null>>(\n data,\n CENTRAL_DIRECTORY_FILE_HEADER_FORMAT\n );\n await pull(vars.fileNameLength || 0);\n await pull(vars.extraFieldLength || 0);\n await pull(vars.fileCommentLength || 0);\n}\n\nexport async function consumeEndOfCentralDirectoryRecord(pull: PullFn): Promise<void> {\n const data = await pull(18);\n const vars = parseBuffer<Record<string, number | null>>(data, END_OF_CENTRAL_DIRECTORY_FORMAT);\n await pull(vars.commentLength || 0);\n}\n\n// =============================================================================\n// Validated Data Descriptor Scan (shared by Node + Browser)\n// =============================================================================\n\nfunction isValidZipRecordSignature(sig: number): boolean {\n switch (sig) {\n case LOCAL_FILE_HEADER_SIG:\n case CENTRAL_DIR_HEADER_SIG:\n case END_OF_CENTRAL_DIR_SIG:\n case ZIP64_END_OF_CENTRAL_DIR_SIG:\n case ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIG:\n return true;\n default:\n return false;\n }\n}\n\nfunction readUint32LEFromBytes(view: Uint8Array, offset: number): number {\n return (\n (view[offset] |\n 0 |\n ((view[offset + 1] | 0) << 8) |\n ((view[offset + 2] | 0) << 16) |\n ((view[offset + 3] | 0) << 24)) >>>\n 0\n );\n}\n\nfunction indexOf4BytesPattern(buffer: Uint8Array, pattern: Uint8Array, startIndex: number): number {\n if (pattern.length !== 4) {\n return indexOfUint8ArrayPattern(buffer, pattern, startIndex);\n }\n\n const b0 = pattern[0];\n const b1 = pattern[1];\n const b2 = pattern[2];\n const b3 = pattern[3];\n\n const bufLen = buffer.length;\n let start = startIndex | 0;\n if (start < 0) {\n start = 0;\n }\n if (start > bufLen - 4) {\n return -1;\n }\n\n for (let i = start; i <= bufLen - 4; i++) {\n if (buffer[i] === b0 && buffer[i + 1] === b1 && buffer[i + 2] === b2 && buffer[i + 3] === b3) {\n return i;\n }\n }\n\n return -1;\n}\n\nexport interface ValidatedDataDescriptorScanResult {\n /** Start index of the descriptor within `view`, or -1 when not found yet. */\n foundIndex: number;\n /** Where the caller should resume searching on the next scan of (a mostly unchanged) view. */\n nextSearchFrom: number;\n}\n\nfunction initScanResult(\n out?: ValidatedDataDescriptorScanResult\n): ValidatedDataDescriptorScanResult {\n if (out) {\n return out;\n }\n return { foundIndex: -1, nextSearchFrom: 0 };\n}\n\n/**\n * Scan for a validated DATA_DESCRIPTOR record boundary.\n *\n * Scanning for the 4-byte signature alone is unsafe because it can appear inside\n * compressed data. We validate a candidate by requiring:\n * - the next 4 bytes after the 16-byte descriptor form a known ZIP record signature, and\n * - the descriptor's compressedSize matches the number of compressed bytes emitted so far.\n */\nexport function scanValidatedDataDescriptor(\n view: Uint8Array,\n dataDescriptorSignature: Uint8Array,\n bytesEmitted: number,\n startIndex = 0,\n out?: ValidatedDataDescriptorScanResult\n): ValidatedDataDescriptorScanResult {\n const result = initScanResult(out);\n\n let searchFrom = startIndex | 0;\n if (searchFrom < 0) {\n searchFrom = 0;\n }\n if (searchFrom > view.length) {\n searchFrom = view.length;\n }\n\n // To avoid missing a signature split across chunk boundaries, we may need\n // to re-check the last (sigLen - 1) bytes on the next scan.\n const sigLen = dataDescriptorSignature.length | 0;\n const overlap = sigLen > 0 ? sigLen - 1 : 0;\n\n while (searchFrom < view.length) {\n const match = indexOf4BytesPattern(view, dataDescriptorSignature, searchFrom);\n if (match === -1) {\n result.foundIndex = -1;\n result.nextSearchFrom = Math.max(searchFrom, Math.max(0, view.length - overlap));\n return result;\n }\n\n const idx = match;\n\n // Need 16 bytes for descriptor + 4 bytes for next record signature.\n const nextSigOffset = idx + 16;\n if (nextSigOffset + 4 <= view.length) {\n const nextSig = readUint32LEFromBytes(view, nextSigOffset);\n\n const descriptorCompressedSize = readUint32LEFromBytes(view, idx + 8);\n const expectedCompressedSize = (bytesEmitted + idx) >>> 0;\n\n if (\n isValidZipRecordSignature(nextSig) &&\n descriptorCompressedSize === expectedCompressedSize\n ) {\n result.foundIndex = idx;\n result.nextSearchFrom = idx;\n return result;\n }\n\n searchFrom = idx + 1;\n continue;\n }\n\n // Not enough bytes to validate yet. Re-check this candidate once more bytes arrive.\n result.foundIndex = -1;\n result.nextSearchFrom = idx;\n return result;\n }\n\n result.foundIndex = -1;\n result.nextSearchFrom = Math.max(searchFrom, Math.max(0, view.length - overlap));\n return result;\n}\n\nexport interface StreamUntilValidatedDataDescriptorSource {\n getView(): Uint8Array;\n getLength(): number;\n read(length: number): Uint8Array;\n isFinished(): boolean;\n onDataAvailable(cb: () => void): () => void;\n maybeReleaseWriteCallback?: () => void;\n}\n\nexport interface StreamUntilValidatedDataDescriptorOptions {\n source: StreamUntilValidatedDataDescriptorSource;\n dataDescriptorSignature: Uint8Array;\n /** Keep enough bytes to validate: descriptor(16) + next record sig(4) = 20. */\n keepTailBytes?: number;\n errorMessage?: string;\n}\n\n/**\n * Stream compressed file data until we reach a validated DATA_DESCRIPTOR boundary.\n *\n * This encapsulates the shared logic used by both Node and browser parsers.\n */\nexport function streamUntilValidatedDataDescriptor(\n options: StreamUntilValidatedDataDescriptorOptions\n): PassThrough {\n const { source, dataDescriptorSignature } = options;\n const keepTailBytes = options.keepTailBytes ?? 20;\n const errorMessage = options.errorMessage ?? \"FILE_ENDED: Data descriptor not found\";\n\n const output = new PassThrough();\n let done = false;\n\n // Total number of compressed bytes already emitted for this entry.\n let bytesEmitted = 0;\n let searchFrom = 0;\n\n const scanResult: ValidatedDataDescriptorScanResult = { foundIndex: -1, nextSearchFrom: 0 };\n\n let unsubscribe: (() => void) | undefined;\n\n const cleanup = (): void => {\n if (unsubscribe) {\n unsubscribe();\n unsubscribe = undefined;\n }\n };\n\n const pull = (): void => {\n if (done) {\n return;\n }\n\n while (source.getLength() > 0) {\n const view = source.getView();\n scanValidatedDataDescriptor(\n view,\n dataDescriptorSignature,\n bytesEmitted,\n searchFrom,\n scanResult\n );\n const foundIndex = scanResult.foundIndex;\n searchFrom = scanResult.nextSearchFrom;\n\n if (foundIndex !== -1) {\n if (foundIndex > 0) {\n output.write(source.read(foundIndex));\n bytesEmitted += foundIndex;\n searchFrom = Math.max(0, searchFrom - foundIndex);\n }\n\n done = true;\n source.maybeReleaseWriteCallback?.();\n cleanup();\n output.end();\n return;\n }\n\n // Flush most of the buffered data but keep a tail so a potential signature\n // split across chunks can still be detected/validated.\n const flushLen = Math.max(0, view.length - keepTailBytes);\n if (flushLen > 0) {\n output.write(source.read(flushLen));\n bytesEmitted += flushLen;\n searchFrom = Math.max(0, searchFrom - flushLen);\n\n if (source.getLength() <= keepTailBytes) {\n source.maybeReleaseWriteCallback?.();\n }\n\n return;\n }\n\n // Need more data.\n break;\n }\n\n if (!done && source.isFinished()) {\n done = true;\n cleanup();\n output.destroy(new Error(errorMessage));\n }\n };\n\n unsubscribe = source.onDataAvailable(pull);\n queueMicrotask(pull);\n return output;\n}\n\n// =============================================================================\n// Shared Parse Loop (used by Node + Browser)\n// =============================================================================\n\nexport interface ParseOptions {\n verbose?: boolean;\n forceStream?: boolean;\n}\n\nexport interface EntryVars {\n versionsNeededToExtract: number | null;\n flags: number | null;\n compressionMethod: number | null;\n lastModifiedTime: number | null;\n lastModifiedDate: number | null;\n crc32: number | null;\n compressedSize: number | null;\n uncompressedSize: number | null;\n fileNameLength: number | null;\n extraFieldLength: number | null;\n lastModifiedDateTime?: Date;\n crxHeader?: CrxHeader;\n}\n\nexport interface EntryProps {\n path: string;\n pathBuffer: Uint8Array;\n flags: {\n isUnicode: boolean;\n };\n}\n\nexport interface ZipEntry extends PassThrough {\n path: string;\n props: EntryProps;\n type: \"Directory\" | \"File\";\n vars: EntryVars;\n extraFields: ZipExtraFields;\n size?: number;\n __autodraining?: boolean;\n autodrain: () => DrainStream;\n buffer: () => Promise<Uint8Array>;\n}\n\nexport interface ParseDriverState {\n crxHeader?: CrxHeader;\n reachedCD?: boolean;\n}\n\nexport interface ParseIO {\n pull(length: number): Promise<Uint8Array>;\n pullUntil(pattern: Uint8Array, includeEof?: boolean): Promise<Uint8Array>;\n stream(length: number): PassThrough;\n streamUntilDataDescriptor(): PassThrough;\n setDone(): void;\n}\n\nexport interface ParseEmitter {\n emitEntry(entry: ZipEntry): void;\n pushEntry(entry: ZipEntry): void;\n pushEntryIfPiped(entry: ZipEntry): void;\n emitCrxHeader(header: CrxHeader): void;\n emitError(err: Error): void;\n emitClose(): void;\n}\n\nexport type InflateFactory = () => Transform | Duplex | PassThrough;\n\nconst endDirectorySignature = writeUint32LE(END_OF_CENTRAL_DIR_SIG);\n\nexport async function runParseLoop(\n opts: ParseOptions,\n io: ParseIO,\n emitter: ParseEmitter,\n inflateFactory: InflateFactory,\n state: ParseDriverState\n): Promise<void> {\n while (true) {\n const sigBytes = await io.pull(4);\n if (sigBytes.length === 0) {\n emitter.emitClose();\n return;\n }\n\n const signature = readUint32LE(sigBytes, 0);\n\n if (signature === 0x34327243) {\n state.crxHeader = await readCrxHeader(async length => io.pull(length));\n emitter.emitCrxHeader(state.crxHeader);\n continue;\n }\n\n if (signature === LOCAL_FILE_HEADER_SIG) {\n await readFileRecord(opts, io, emitter, inflateFactory, state);\n continue;\n }\n\n if (signature === CENTRAL_DIR_HEADER_SIG) {\n state.reachedCD = true;\n await consumeCentralDirectoryFileHeader(async length => io.pull(length));\n continue;\n }\n\n if (signature === END_OF_CENTRAL_DIR_SIG) {\n await consumeEndOfCentralDirectoryRecord(async length => io.pull(length));\n io.setDone();\n emitter.emitClose();\n return;\n }\n\n if (state.reachedCD) {\n // We are in central directory trailing data; resync by scanning for EOCD signature.\n // consumeEndOfCentralDirectoryRecord expects the EOCD signature to be consumed, so includeEof=true.\n const includeEof = true;\n await io.pullUntil(endDirectorySignature, includeEof);\n await consumeEndOfCentralDirectoryRecord(async length => io.pull(length));\n io.setDone();\n emitter.emitClose();\n return;\n }\n\n emitter.emitError(new Error(\"invalid signature: 0x\" + signature.toString(16)));\n emitter.emitClose();\n return;\n }\n}\n\nasync function readFileRecord(\n opts: ParseOptions,\n io: ParseIO,\n emitter: ParseEmitter,\n inflateFactory: InflateFactory,\n state: ParseDriverState\n): Promise<void> {\n const {\n vars: headerVars,\n fileNameBuffer,\n extraFieldData\n } = await readLocalFileHeader(async l => io.pull(l));\n const vars = headerVars;\n\n if (state.crxHeader) {\n vars.crxHeader = state.crxHeader;\n }\n\n const fileName = decodeZipEntryPath(fileNameBuffer);\n\n const entry = new PassThrough() as ZipEntry;\n let autodraining = false;\n\n entry.autodrain = function () {\n autodraining = true;\n entry.__autodraining = true;\n return autodrain(entry);\n };\n\n entry.buffer = function () {\n return bufferStream(entry);\n };\n\n entry.path = fileName;\n entry.props = buildZipEntryProps(fileName, fileNameBuffer, vars.flags) as EntryProps;\n entry.type = getZipEntryType(fileName, vars.uncompressedSize || 0);\n\n if (opts.verbose) {\n if (entry.type === \"Directory\") {\n console.log(\" creating:\", fileName);\n } else if (entry.type === \"File\") {\n if (vars.compressionMethod === 0) {\n console.log(\" extracting:\", fileName);\n } else {\n console.log(\" inflating:\", fileName);\n }\n }\n }\n\n const extra = parseExtraField(extraFieldData, vars);\n vars.lastModifiedDateTime = resolveZipEntryLastModifiedDateTime(vars, extra);\n\n entry.vars = vars;\n entry.extraFields = extra;\n entry.__autodraining = autodraining;\n\n const fileSizeKnown = isFileSizeKnown(vars.flags, vars.compressedSize);\n if (fileSizeKnown) {\n entry.size = vars.uncompressedSize || 0;\n }\n\n if (opts.forceStream) {\n emitter.pushEntry(entry);\n } else {\n emitter.emitEntry(entry);\n emitter.pushEntryIfPiped(entry);\n }\n\n if (opts.verbose) {\n console.log({\n filename: fileName,\n vars: vars,\n extraFields: entry.extraFields\n });\n }\n\n const inflater = vars.compressionMethod && !autodraining ? inflateFactory() : new PassThrough();\n\n if (fileSizeKnown) {\n await pipeline(io.stream(vars.compressedSize || 0) as any, inflater as any, entry as any);\n return;\n }\n\n await pipeline(io.streamUntilDataDescriptor() as any, inflater as any, entry as any);\n const dd = await readDataDescriptor(async l => io.pull(l));\n entry.size = dd.uncompressedSize || 0;\n}\n","/**\n * ZIP Stream Parser - Browser Version\n *\n * A streaming ZIP parser for browsers using native DecompressionStream.\n * Falls back to pure JavaScript implementation for older browsers.\n * Uses the browser Duplex stream implementation for compatibility.\n */\n\nimport { Duplex, PassThrough, concatUint8Arrays } from \"@stream\";\nimport { writeUint32LE } from \"@archive/utils/binary\";\nimport { indexOfUint8ArrayPattern } from \"@archive/utils/bytes\";\nimport {\n runParseLoop,\n type CrxHeader,\n type PullStreamPublicApi,\n type EntryProps,\n type EntryVars,\n type InflateFactory,\n type ParseDriverState,\n type ParseEmitter,\n type ParseIO,\n type ParseOptions,\n type ZipEntry,\n streamUntilValidatedDataDescriptor\n} from \"@archive/parse.base\";\nimport { inflateRaw as fallbackInflateRaw } from \"@archive/deflate-fallback\";\nimport { ByteQueue } from \"@archive/byte-queue\";\nimport { DATA_DESCRIPTOR_SIG } from \"@archive/zip-constants\";\nimport { hasDeflateRawDecompressionStream } from \"@archive/compress.base\";\n\n// =============================================================================\n// Browser InflateRaw using DecompressionStream\n// =============================================================================\n\n/**\n * Duplex stream that wraps browser's native DecompressionStream.\n * Handles the \"Junk found after end of compressed data\" error gracefully\n * by treating it as end of stream when using data descriptors.\n *\n * Uses Duplex instead of Transform because DecompressionStream's output\n * is inherently async and doesn't fit the Transform's sync callback model.\n */\nclass BrowserInflateRaw extends Duplex {\n private decompressionStream: DecompressionStream;\n private writer: WritableStreamDefaultWriter<Uint8Array>;\n private reader: ReadableStreamDefaultReader<Uint8Array>;\n private reading = false;\n private writeClosed = false;\n private _junkError = false;\n private _bytesIn = 0;\n private _bytesOut = 0;\n private _readingDone = false;\n private _readingDonePromise: Promise<void>;\n private _resolveReadingDone!: () => void;\n // Track pending write count for proper ordering\n private _pendingWrites = 0;\n private _writeFinishedPromise: Promise<void> | null = null;\n private _resolveWriteFinished: (() => void) | null = null;\n\n constructor() {\n // Pass write handler to Duplex so pipe() calls our write method\n // Also pass final handler to close the DecompressionStream when _writable ends\n super({\n write: (chunk: Uint8Array, _encoding: string, callback: (error?: Error | null) => void) => {\n this._doWrite(chunk, callback);\n },\n final: (callback: (error?: Error | null) => void) => {\n this._closeWriter(() => {\n callback();\n });\n }\n });\n this.decompressionStream = new DecompressionStream(\"deflate-raw\");\n this.writer =\n this.decompressionStream.writable.getWriter() as WritableStreamDefaultWriter<Uint8Array>;\n this.reader = this.decompressionStream.readable.getReader();\n this._readingDonePromise = new Promise(resolve => {\n this._resolveReadingDone = resolve;\n });\n this._startReading();\n }\n\n // Internal write implementation\n private _doWrite(chunk: Uint8Array, callback?: (error?: Error | null) => void): void {\n if (this._junkError) {\n // Already got junk error, don't write more\n if (callback) {\n callback();\n }\n return;\n }\n\n this._bytesIn += chunk.length;\n this._pendingWrites++;\n\n this.writer\n .write(chunk)\n .then(() => {\n this._pendingWrites--;\n if (this._pendingWrites === 0 && this._resolveWriteFinished) {\n this._resolveWriteFinished();\n }\n if (callback) {\n callback();\n }\n })\n .catch(e => {\n this._pendingWrites--;\n if (this._pendingWrites === 0 && this._resolveWriteFinished) {\n this._resolveWriteFinished();\n }\n const msg = e instanceof Error ? e.message : String(e);\n if (msg.includes(\"Junk\") || msg.includes(\"junk\")) {\n this._junkError = true;\n if (callback) {\n callback();\n }\n } else {\n if (callback) {\n callback(e);\n } else {\n this.emit(\"error\", e);\n }\n }\n });\n }\n\n private async _startReading(): Promise<void> {\n if (this.reading) {\n return;\n }\n this.reading = true;\n\n try {\n while (true) {\n const { done, value } = await this.reader.read();\n if (done) {\n break;\n }\n this._bytesOut += value.length;\n // Directly push to the readable side of Duplex\n this.push(value);\n }\n } catch (e) {\n // \"Junk found after end of compressed data\" is expected when using data descriptors\n // because we can't know the exact compressed size upfront\n const msg = e instanceof Error ? e.message : String(e);\n if (msg.includes(\"Junk\") || msg.includes(\"junk\")) {\n this._junkError = true;\n // This is OK - we've read all decompressed data\n } else {\n // Re-throw other errors\n this.emit(\"error\", e);\n }\n } finally {\n this._readingDone = true;\n this._resolveReadingDone();\n // Signal end of readable side\n this.push(null);\n }\n }\n\n // Override write to feed data into DecompressionStream\n override write(\n chunk: Uint8Array,\n encodingOrCallback?: string | ((error?: Error | null) => void),\n callback?: (error?: Error | null) => void\n ): boolean {\n // Handle overload\n let cb: ((error?: Error | null) => void) | undefined;\n if (typeof encodingOrCallback === \"function\") {\n cb = encodingOrCallback;\n } else {\n cb = callback;\n }\n\n this._doWrite(chunk, cb);\n return true;\n }\n\n // Override end to close the DecompressionStream writer\n override end(\n chunkOrCallback?: Uint8Array | (() => void),\n encodingOrCallback?: string | (() => void),\n callback?: () => void\n ): this {\n // Handle overloads\n let chunk: Uint8Array | undefined;\n let cb: (() => void) | undefined;\n\n if (typeof chunkOrCallback === \"function\") {\n cb = chunkOrCallback;\n } else if (chunkOrCallback !== undefined) {\n chunk = chunkOrCallback;\n if (typeof encodingOrCallback === \"function\") {\n cb = encodingOrCallback;\n } else {\n cb = callback;\n }\n }\n\n // Write final chunk if provided\n if (chunk) {\n this.write(chunk, () => {\n this._closeWriter(cb);\n });\n } else {\n this._closeWriter(cb);\n }\n\n return this;\n }\n\n private _closeWriter(callback?: () => void): void {\n if (this.writeClosed) {\n this._readingDonePromise.then(() => {\n if (callback) {\n callback();\n }\n });\n return;\n }\n this.writeClosed = true;\n\n // Wait for pending writes to complete before closing\n const waitForWrites =\n this._pendingWrites > 0\n ? new Promise<void>(resolve => {\n this._writeFinishedPromise = new Promise(r => {\n this._resolveWriteFinished = r;\n });\n this._writeFinishedPromise.then(resolve);\n })\n : Promise.resolve();\n\n waitForWrites\n .then(() => this.writer.close())\n .catch(() => {})\n .finally(() => {\n this._readingDonePromise.then(() => {\n if (callback) {\n callback();\n }\n this.emit(\"finish\");\n });\n });\n }\n\n override destroy(error?: Error | null): this {\n if (!this.writeClosed) {\n this.writer.abort(error || undefined).catch(() => {});\n }\n this.reader.cancel(error || undefined).catch(() => {});\n return super.destroy(error);\n }\n}\n\n// =============================================================================\n// Fallback InflateRaw for browsers without DecompressionStream\n// =============================================================================\n\n/**\n * Fallback Inflate that buffers all data, then decompresses at end.\n * Used for older browsers without native DecompressionStream support.\n */\nclass FallbackInflateRaw extends Duplex {\n private chunks: Uint8Array[] = [];\n private _finished = false;\n\n constructor() {\n super({\n write: (chunk: Uint8Array, _encoding: string, callback: (error?: Error | null) => void) => {\n if (this._finished) {\n callback(new Error(\"write after end\"));\n return;\n }\n this.chunks.push(chunk);\n callback();\n },\n final: (callback: (error?: Error | null) => void) => {\n this._decompress(callback);\n }\n });\n }\n\n private _decompress(callback: (error?: Error | null) => void): void {\n try {\n // Combine all chunks\n const data = concatUint8Arrays(this.chunks);\n\n // Decompress using fallback\n const decompressed = fallbackInflateRaw(data);\n this.push(decompressed);\n this.push(null);\n this._finished = true;\n callback();\n } catch (err) {\n callback(err instanceof Error ? err : new Error(String(err)));\n }\n }\n\n override destroy(error?: Error | null): this {\n this._finished = true;\n this.chunks = [];\n return super.destroy(error);\n }\n}\n\n// =============================================================================\n// Factory function with fallback\n// =============================================================================\n\nfunction createInflateRaw(): Duplex {\n if (hasDeflateRawDecompressionStream()) {\n return new BrowserInflateRaw();\n } else {\n return new FallbackInflateRaw();\n }\n}\n\n// =============================================================================\n// Utilities\n// =============================================================================\n\nconst dataDescriptorSignature = writeUint32LE(DATA_DESCRIPTOR_SIG);\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type { CrxHeader, EntryProps, EntryVars, ParseOptions, ZipEntry };\n\nexport type ParseStream = Duplex & {\n promise(): Promise<void>;\n} & PullStreamPublicApi & {\n crxHeader?: CrxHeader;\n };\n\nexport function createParseClass(createInflateRawFn: InflateFactory): {\n new (opts?: ParseOptions): ParseStream;\n} {\n /**\n * ZIP Stream Parser for browsers.\n *\n * Extends Duplex to be compatible with stream.pipe(zip) pattern.\n * - Writable side: accepts ZIP data\n * - Readable side: emits ZipEntry objects\n */\n return class Parse extends Duplex {\n private _opts: ParseOptions;\n private readonly _buffer = new ByteQueue();\n cb?: () => void;\n finished = false;\n match?: number;\n private _pendingResolve?: () => void;\n private _driverState: ParseDriverState = {};\n private _parsingDone: Promise<void> = Promise.resolve();\n\n crxHeader?: CrxHeader;\n __emittedError?: Error;\n\n constructor(opts: ParseOptions = {}) {\n super({\n objectMode: true,\n write: (chunk: Uint8Array, _encoding: string, callback: (err?: Error | null) => void) => {\n this._handleWrite(chunk);\n callback();\n },\n final: (callback: (err?: Error | null) => void) => {\n this.finished = true;\n this._wakeUp();\n this.emit(\"data-available\");\n this.emit(\"chunk\", false);\n this._parsingDone.then(() => callback()).catch(callback);\n }\n });\n\n this._opts = opts;\n\n const io: ParseIO = {\n pull: (length: number) => this.pull(length),\n pullUntil: (pattern: Uint8Array, includeEof?: boolean) =>\n this.pullUntil(pattern, includeEof),\n stream: (length: number) => this.stream(length),\n streamUntilDataDescriptor: () => this._streamUntilDataDescriptor(),\n setDone: () => {\n this.push(null);\n }\n };\n\n const emitter: ParseEmitter = {\n emitEntry: (entry: ZipEntry) => {\n this.emit(\"entry\", entry);\n },\n pushEntry: (entry: ZipEntry) => {\n this.push(entry);\n },\n // Browser version historically only pushed entries when forceStream=true.\n // Keep this behavior to avoid changing stream piping semantics.\n pushEntryIfPiped: (_entry: ZipEntry) => {\n return;\n },\n emitCrxHeader: (header: CrxHeader) => {\n this.crxHeader = header;\n this.emit(\"crx-header\", header);\n },\n emitError: (err: Error) => {\n this.__emittedError = err;\n this.emit(\"error\", err);\n },\n emitClose: () => {\n this.emit(\"close\");\n }\n };\n\n queueMicrotask(() => {\n this._parsingDone = runParseLoop(\n this._opts,\n io,\n emitter,\n () => createInflateRawFn(),\n this._driverState\n );\n this._parsingDone.catch((e: Error) => {\n if (!this.__emittedError || this.__emittedError !== e) {\n this.__emittedError = e;\n this.emit(\"error\", e);\n }\n this.emit(\"close\");\n });\n });\n }\n\n private _handleWrite(chunk: Uint8Array): void {\n this._buffer.append(chunk);\n this._wakeUp();\n this.emit(\"data-available\");\n this.emit(\"chunk\");\n }\n\n get buffer(): Uint8Array {\n return this._buffer.view();\n }\n\n set buffer(value: Uint8Array) {\n this._buffer.reset(value);\n }\n\n private _maybeReleaseWriteCallback(): void {\n if (typeof this.cb === \"function\") {\n const callback = this.cb;\n this.cb = undefined;\n callback();\n }\n }\n\n private _wakeUp(): void {\n if (this._pendingResolve) {\n const resolve = this._pendingResolve;\n this._pendingResolve = undefined;\n resolve();\n }\n }\n\n private _waitForData(): Promise<void> {\n return new Promise(resolve => {\n this._pendingResolve = resolve;\n });\n }\n\n private async _pullInternal(length: number): Promise<Uint8Array> {\n if (length === 0) {\n return new Uint8Array(0);\n }\n\n while (this._buffer.length < length) {\n if (this.finished) {\n if (this._buffer.length > 0) {\n const data = this._buffer.read(this._buffer.length);\n return data;\n }\n throw new Error(\"FILE_ENDED\");\n }\n await this._waitForData();\n }\n\n return this._buffer.read(length);\n }\n\n private async _pullUntilInternal(pattern: Uint8Array, includeEof = false): Promise<Uint8Array> {\n const chunks: Uint8Array[] = [];\n let searchFrom = 0;\n const overlap = Math.max(0, pattern.length - 1);\n\n while (true) {\n const view = this._buffer.view();\n const match = indexOfUint8ArrayPattern(view, pattern, searchFrom);\n\n if (match !== -1) {\n this.match = match;\n const toRead = match + (includeEof ? pattern.length : 0);\n if (toRead > 0) {\n chunks.push(this._buffer.read(toRead));\n }\n return concatUint8Arrays(chunks);\n }\n\n // No match yet. Avoid rescanning bytes that can't start a match.\n searchFrom = Math.max(searchFrom, Math.max(0, view.length - overlap));\n\n if (this.finished) {\n throw new Error(\"FILE_ENDED\");\n }\n\n const safeLen = Math.max(0, this._buffer.length - pattern.length);\n if (safeLen > 0) {\n chunks.push(this._buffer.read(safeLen));\n searchFrom = Math.max(0, searchFrom - safeLen);\n }\n\n await this._waitForData();\n }\n }\n\n private _streamFixedLength(length: number): PassThrough {\n const output = new PassThrough();\n let remaining = length;\n let done = false;\n\n const pull = (): void => {\n if (done) {\n return;\n }\n\n while (remaining > 0 && this._buffer.length > 0) {\n const toRead = Math.min(remaining, this._buffer.length);\n const chunk = this._buffer.read(toRead);\n remaining -= toRead;\n output.write(chunk);\n }\n\n if (remaining === 0) {\n done = true;\n this.removeListener(\"data-available\", pull);\n this._maybeReleaseWriteCallback();\n output.end();\n } else if (this.finished) {\n done = true;\n this.removeListener(\"data-available\", pull);\n output.destroy(new Error(\"FILE_ENDED\"));\n }\n };\n\n this.on(\"data-available\", pull);\n queueMicrotask(() => pull());\n return output;\n }\n\n private _streamUntilPattern(pattern: Uint8Array, includeEof = false): PassThrough {\n const output = new PassThrough();\n let done = false;\n let searchFrom = 0;\n const overlap = Math.max(0, pattern.length - 1);\n\n const pull = (): void => {\n if (done) {\n return;\n }\n\n const view = this._buffer.view();\n const match = indexOfUint8ArrayPattern(view, pattern, searchFrom);\n\n if (match !== -1) {\n this.match = match;\n const endIndex = includeEof ? match + pattern.length : match;\n if (endIndex > 0) {\n output.write(this._buffer.read(endIndex));\n }\n done = true;\n this.removeListener(\"data-available\", pull);\n this._maybeReleaseWriteCallback();\n output.end();\n return;\n }\n\n // No match yet. Avoid rescanning bytes that can't start a match.\n searchFrom = Math.max(searchFrom, Math.max(0, view.length - overlap));\n\n if (this.finished) {\n done = true;\n this.removeListener(\"data-available\", pull);\n this._maybeReleaseWriteCallback();\n output.destroy(new Error(\"FILE_ENDED\"));\n return;\n }\n\n const safeLen = Math.max(0, this._buffer.length - pattern.length);\n if (safeLen > 0) {\n output.write(this._buffer.read(safeLen));\n searchFrom = Math.max(0, searchFrom - safeLen);\n this._maybeReleaseWriteCallback();\n }\n };\n\n this.on(\"data-available\", pull);\n queueMicrotask(() => pull());\n return output;\n }\n\n stream(eof: number | Uint8Array, includeEof?: boolean): PassThrough {\n if (typeof eof === \"number\") {\n return this._streamFixedLength(eof);\n }\n return this._streamUntilPattern(eof, includeEof ?? false);\n }\n\n pull(eof: number | Uint8Array, includeEof?: boolean): Promise<Uint8Array> {\n if (eof === 0) {\n return Promise.resolve(new Uint8Array(0));\n }\n\n if (typeof eof === \"number\") {\n // Node-compatible behavior: if finished and not enough bytes, reject.\n if (this.finished && this._buffer.length < eof) {\n return Promise.reject(new Error(\"FILE_ENDED\"));\n }\n if (this._buffer.length >= eof) {\n const data = this._buffer.read(eof);\n if (this._buffer.length === 0) {\n this._maybeReleaseWriteCallback();\n }\n return Promise.resolve(data);\n }\n return this._pullInternal(eof);\n }\n\n // Pattern mode\n if (this.finished) {\n return Promise.reject(new Error(\"FILE_ENDED\"));\n }\n return this._pullUntilInternal(eof, includeEof ?? false);\n }\n\n pullUntil(pattern: Uint8Array, includeEof?: boolean): Promise<Uint8Array> {\n return this.pull(pattern, includeEof);\n }\n\n private _streamUntilDataDescriptor(): PassThrough {\n return streamUntilValidatedDataDescriptor({\n source: {\n getView: () => this._buffer.view(),\n getLength: () => this._buffer.length,\n read: (length: number) => this._buffer.read(length),\n isFinished: () => this.finished,\n onDataAvailable: (cb: () => void) => {\n this.on(\"data-available\", cb);\n return () => this.removeListener(\"data-available\", cb);\n }\n },\n dataDescriptorSignature\n });\n }\n\n promise(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.on(\"finish\", resolve);\n this.on(\"end\", resolve);\n this.on(\"error\", reject);\n });\n }\n };\n}\n\nconst BaseParse = createParseClass(createInflateRaw);\n\nexport class Parse extends BaseParse {}\n\nexport function createParse(opts?: ParseOptions): ParseStream {\n return new Parse(opts);\n}\n","/**\n * XLSX - Abstract base class for XLSX operations\n *\n * Contains all platform-agnostic logic shared between Node.js and Browser versions:\n * - reconcile: Reconcile model after parsing\n * - _process*Entry: Process individual ZIP entries\n * - add*: Add content to ZIP during writing\n * - prepareModel: Prepare model for writing\n * - loadFromFiles: Load from pre-extracted ZIP data\n */\n\nimport { XmlStream } from \"@excel/utils/xml-stream\";\nimport { StylesXform } from \"@excel/xlsx/xform/style/styles-xform\";\nimport { CoreXform } from \"@excel/xlsx/xform/core/core-xform\";\nimport { SharedStringsXform } from \"@excel/xlsx/xform/strings/shared-strings-xform\";\nimport { RelationshipsXform } from \"@excel/xlsx/xform/core/relationships-xform\";\nimport { ContentTypesXform } from \"@excel/xlsx/xform/core/content-types-xform\";\nimport { AppXform } from \"@excel/xlsx/xform/core/app-xform\";\nimport { WorkbookXform } from \"@excel/xlsx/xform/book/workbook-xform\";\nimport { WorkSheetXform } from \"@excel/xlsx/xform/sheet/worksheet-xform\";\nimport { DrawingXform } from \"@excel/xlsx/xform/drawing/drawing-xform\";\nimport { TableXform } from \"@excel/xlsx/xform/table/table-xform\";\nimport { PivotCacheRecordsXform } from \"@excel/xlsx/xform/pivot-table/pivot-cache-records-xform\";\nimport {\n PivotCacheDefinitionXform,\n type ParsedCacheDefinitionModel\n} from \"@excel/xlsx/xform/pivot-table/pivot-cache-definition-xform\";\nimport { PivotTableXform, type ParsedPivotTableModel } from \"@excel/xlsx/xform/pivot-table/pivot-table-xform\";\nimport { CommentsXform } from \"@excel/xlsx/xform/comment/comments-xform\";\nimport { VmlNotesXform } from \"@excel/xlsx/xform/comment/vml-notes-xform\";\nimport { theme1Xml } from \"@excel/xlsx/xml/theme1\";\nimport { RelType } from \"@excel/xlsx/rel-type\";\nimport { StreamBuf } from \"@excel/utils/stream-buf\";\nimport { bufferToString, base64ToUint8Array } from \"@utils/utils\";\nimport { StreamingZip, ZipDeflateFile } from \"@archive/streaming-zip\";\nimport { ZipParser } from \"@archive\";\nimport { PassThrough, concatUint8Arrays, type IEventEmitter } from \"@stream\";\nimport type { Workbook } from \"@excel/workbook\";\nimport {\n commentsPath,\n commentsRelTargetFromWorksheetName,\n drawingPath,\n drawingRelsPath,\n OOXML_REL_TARGETS,\n pivotTableRelTargetFromWorksheetName,\n pivotCacheDefinitionRelTargetFromWorkbook,\n getCommentsIndexFromPath,\n getDrawingNameFromPath,\n getDrawingNameFromRelsPath,\n getMediaFilenameFromPath,\n mediaPath,\n getPivotCacheDefinitionNameFromPath,\n getPivotCacheDefinitionNameFromRelsPath,\n getPivotCacheRecordsNameFromPath,\n getPivotTableNameFromPath,\n getPivotTableNameFromRelsPath,\n pivotCacheDefinitionPath,\n pivotCacheDefinitionRelsPath,\n pivotCacheDefinitionRelTargetFromPivotTable,\n pivotCacheRecordsPath,\n pivotCacheRecordsRelTarget,\n pivotTablePath,\n pivotTableRelsPath,\n getTableNameFromPath,\n tablePath,\n tableRelTargetFromWorksheetName,\n themePath,\n getThemeNameFromPath,\n getVmlDrawingNameFromPath,\n getWorksheetNoFromWorksheetPath,\n getWorksheetNoFromWorksheetRelsPath,\n isBinaryEntryPath,\n normalizeZipPath,\n OOXML_PATHS,\n vmlDrawingRelTargetFromWorksheetName,\n vmlDrawingPath,\n worksheetPath,\n worksheetRelsPath\n} from \"@excel/utils/ooxml-paths\";\n\nimport type { ZipTimestampMode } from \"@archive/utils/timestamps\";\n\ntype StreamListener = Parameters<IEventEmitter[\"on\"]>[1];\n\ninterface EmitterLike {\n on(event: string, listener: StreamListener): this;\n once(event: string, listener: StreamListener): this;\n off(event: string, listener: StreamListener): this;\n}\n\nexport interface IParseStream extends EmitterLike {\n pipe(dest: any): any;\n [Symbol.asyncIterator]?: () => AsyncIterator<Uint8Array | string>;\n}\n\nexport interface IStreamBuf extends EmitterLike {\n write(data: any): void;\n end(): void;\n read(): any;\n toBuffer?(): any;\n pipe?(dest: any): any;\n}\n\nexport interface IZipWriter extends EmitterLike {\n append(data: any, options: { name: string; base64?: boolean }): void;\n pipe(stream: any): void;\n finalize(): void;\n}\n\nclass StreamingZipWriterAdapter implements IZipWriter {\n private static textEncoder = new TextEncoder();\n\n private readonly zip: StreamingZip;\n private readonly events: Map<string, Set<StreamListener>> = new Map();\n private pipedStream: Pick<IStreamBuf, \"write\" | \"end\"> | null = null;\n private level: number;\n private modTime: Date | undefined;\n private timestamps: ZipTimestampMode | undefined;\n private finalized = false;\n\n constructor(options?: ZipWriterOptions) {\n this.level = options?.level ?? 6;\n this.modTime = options?.modTime;\n this.timestamps = options?.timestamps;\n this.zip = new StreamingZip((err: Error | null, data: Uint8Array, final: boolean) => {\n if (err) {\n this._emit(\"error\", err);\n return;\n }\n\n if (data && data.length > 0) {\n this._emit(\"data\", data);\n if (this.pipedStream) {\n this.pipedStream.write(data);\n }\n }\n\n if (final) {\n if (this.pipedStream) {\n this.pipedStream.end();\n }\n this._emit(\"finish\");\n }\n });\n }\n\n private _emit(event: string, ...args: any[]): void {\n const callbacks = this.events.get(event);\n if (!callbacks) {\n return;\n }\n for (const cb of callbacks) {\n cb(...args);\n }\n }\n\n on(event: string, callback: StreamListener): this {\n const callbacks = this.events.get(event) || new Set<StreamListener>();\n callbacks.add(callback);\n this.events.set(event, callbacks);\n return this;\n }\n\n once(event: string, callback: StreamListener): this {\n const wrapped: StreamListener = (...args: any[]) => {\n this.off(event, wrapped);\n callback(...args);\n };\n return this.on(event, wrapped);\n }\n\n off(event: string, callback: StreamListener): this {\n const callbacks = this.events.get(event);\n if (!callbacks) {\n return this;\n }\n callbacks.delete(callback);\n if (callbacks.size === 0) {\n this.events.delete(event);\n }\n return this;\n }\n\n pipe(stream: any): void {\n this.pipedStream = stream;\n }\n\n append(data: any, options: { name: string; base64?: boolean }): void {\n if (this.finalized) {\n throw new Error(\"Cannot append after finalize\");\n }\n\n let buffer: Uint8Array;\n if (options.base64) {\n buffer = base64ToUint8Array(typeof data === \"string\" ? data : String(data));\n } else if (typeof data === \"string\") {\n buffer = StreamingZipWriterAdapter.textEncoder.encode(data);\n } else if (data instanceof Uint8Array) {\n buffer = data;\n } else if (ArrayBuffer.isView(data)) {\n buffer = new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n } else if (data instanceof ArrayBuffer) {\n buffer = new Uint8Array(data);\n } else {\n buffer = data;\n }\n\n const file = new ZipDeflateFile(options.name, {\n level: this.level,\n modTime: this.modTime,\n timestamps: this.timestamps\n });\n this.zip.add(file);\n\n const pushResult = (file as any).push(buffer, true);\n if (pushResult && typeof pushResult.catch === \"function\") {\n pushResult.catch((err: unknown) => this._emit(\"error\", err));\n }\n }\n\n finalize(): void {\n if (this.finalized) {\n return;\n }\n this.finalized = true;\n this.zip.end();\n }\n}\n\n// =============================================================================\n// Minimal shared types (keep internal model flexible)\n// =============================================================================\n\nexport interface XlsxReadOptions {\n base64?: boolean;\n [key: string]: unknown;\n}\n\nexport interface ZipWriterOptions {\n level?: number;\n /** ZIP entry modification time (optional). If omitted, defaults to current time. */\n modTime?: Date;\n /** Timestamp writing strategy for ZIP entry metadata (optional). */\n timestamps?: ZipTimestampMode;\n}\n\nexport interface XlsxWriteOptions {\n zip?: ZipWriterOptions;\n [key: string]: unknown;\n}\n\nexport type XlsxOptions = XlsxReadOptions & XlsxWriteOptions;\n\nexport interface WorkbookMediaLike {\n type: string;\n extension: string;\n name?: string;\n filename?: string;\n buffer?: Uint8Array;\n base64?: string;\n}\n\nexport interface MediaModel {\n media: WorkbookMediaLike[];\n}\n\ninterface ZipEntryLike {\n name: string;\n type: \"Directory\" | \"File\";\n stream: IParseStream;\n drain: () => Promise<void>;\n}\n\n/**\n * XLSX class - handles Excel file operations\n * Works in both Node.js and Browser environments\n */\nclass XLSX {\n declare public workbook: Workbook;\n\n static RelType = RelType;\n\n constructor(workbook: Workbook) {\n this.workbook = workbook;\n }\n\n // ===========================================================================\n // Stream creation - cross-platform implementation using modules/stream\n // ===========================================================================\n\n /**\n * Create a stream from binary data (for media/themes)\n */\n protected createBinaryStream(data: Uint8Array): IParseStream {\n const stream = new PassThrough();\n stream.end(data);\n return stream;\n }\n\n /**\n * Create a stream from string content (for XML parsing)\n */\n protected createTextStream(content: string): IParseStream {\n const stream = new PassThrough();\n stream.end(content);\n return stream;\n }\n\n // ===========================================================================\n // Shared implementations - used by all platforms\n // ===========================================================================\n\n /**\n * Create a StreamBuf instance for buffering data\n */\n protected createStreamBuf(): IStreamBuf {\n return new StreamBuf();\n }\n\n /**\n * Convert buffer/Uint8Array to string\n */\n protected bufferToString(data: string | ArrayBuffer | Uint8Array): string {\n return bufferToString(data);\n }\n\n /**\n * Create a ZIP writer adapter.\n * Can be overridden by subclasses for platform-specific implementations.\n */\n protected createZipWriter(options?: XlsxWriteOptions[\"zip\"]): IZipWriter {\n return new StreamingZipWriterAdapter(options);\n }\n\n /**\n * Write all workbook content to a ZIP writer\n * Shared by both Node.js write() and browser writeBuffer()\n */\n protected async writeToZip(zip: IZipWriter, options?: XlsxWriteOptions): Promise<void> {\n const { model } = this.workbook;\n this.prepareModel(model, options);\n\n await this.addContentTypes(zip, model);\n await this.addOfficeRels(zip, model);\n await this.addWorkbookRels(zip, model);\n await this.addWorksheets(zip, model);\n await this.addSharedStrings(zip, model);\n this.addDrawings(zip, model);\n this.addTables(zip, model);\n this.addPivotTables(zip, model);\n await Promise.all([this.addThemes(zip, model), this.addStyles(zip, model)]);\n await this.addMedia(zip, model);\n await Promise.all([this.addApp(zip, model), this.addCore(zip, model)]);\n await this.addWorkbook(zip, model);\n }\n\n // ===========================================================================\n // Stream/Buffer operations - shared by all platforms\n // ===========================================================================\n\n /**\n * Read workbook from a stream\n */\n async read(stream: IParseStream, options?: XlsxReadOptions): Promise<any> {\n // Collect all stream data into a single buffer\n const chunks: Uint8Array[] = [];\n\n await new Promise<void>((resolve, reject) => {\n const onData = (chunk: Uint8Array) => {\n chunks.push(chunk);\n };\n\n const onEnd = () => {\n stream.off(\"data\", onData);\n stream.off(\"end\", onEnd);\n stream.off(\"error\", onError);\n resolve();\n };\n\n const onError = (err: Error) => {\n stream.off(\"data\", onData);\n stream.off(\"end\", onEnd);\n stream.off(\"error\", onError);\n reject(err);\n };\n\n stream.on(\"data\", onData);\n stream.on(\"end\", onEnd);\n stream.on(\"error\", onError);\n });\n\n return this.loadBuffer(concatUint8Arrays(chunks), options);\n }\n\n /**\n * Write workbook to a stream\n */\n async write(stream: any, options?: XlsxWriteOptions): Promise<XLSX> {\n options = options || {};\n\n options.zip = options.zip || {};\n options.zip.modTime ??= this.workbook.modified ?? this.workbook.created;\n\n const zip = this.createZipWriter(options.zip);\n zip.pipe(stream);\n await this.writeToZip(zip, options);\n return this._finalize(zip) as Promise<XLSX>;\n }\n\n /**\n * Load workbook from buffer/ArrayBuffer/Uint8Array\n */\n async load(data: any, options?: XlsxReadOptions): Promise<any> {\n let buffer: Uint8Array;\n\n // Validate input\n const isBuffer = typeof Buffer !== \"undefined\" ? Buffer.isBuffer(data) : false;\n if (\n !data ||\n (typeof data === \"object\" &&\n !isBuffer &&\n !(data instanceof Uint8Array) &&\n !(data instanceof ArrayBuffer))\n ) {\n throw new Error(\n \"Can't read the data of 'the loaded zip file'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?\"\n );\n }\n\n // Handle base64 input\n if (options && options.base64) {\n buffer = base64ToUint8Array(data.toString());\n } else if (data instanceof ArrayBuffer) {\n buffer = new Uint8Array(data);\n } else if (data instanceof Uint8Array) {\n buffer = data;\n } else {\n // Node.js Buffer or other array-like\n buffer = new Uint8Array(data);\n }\n\n return this.loadBuffer(buffer, options);\n }\n\n /**\n * Internal: Load from Uint8Array buffer\n */\n protected async loadBuffer(buffer: Uint8Array, options?: XlsxReadOptions): Promise<any> {\n const parser = new ZipParser(buffer);\n const filesMap = await parser.extractAll();\n\n // Convert Map to Record for loadFromFiles\n const allFiles: Record<string, Uint8Array> = {};\n for (const [path, content] of filesMap) {\n allFiles[path] = content;\n }\n\n return this.loadFromFiles(allFiles, options);\n }\n\n /**\n * Internal: Load workbook from an async stream of ZIP entries.\n *\n * This is the foundation for TRUE streaming reads on platforms that have a\n * streaming ZIP parser (e.g. Node.js `modules/archive` Parse).\n */\n protected async loadFromZipEntries(\n entries: AsyncIterable<ZipEntryLike>,\n options?: XlsxOptions\n ): Promise<any> {\n const model: any = {\n worksheets: [],\n worksheetHash: {},\n worksheetRels: [],\n themes: {},\n media: [],\n mediaIndex: {},\n drawings: {},\n drawingRels: {},\n comments: {},\n tables: {},\n vmlDrawings: {},\n pivotTables: {},\n pivotTableRels: {},\n pivotCacheDefinitions: {},\n pivotCacheDefinitionRels: {},\n pivotCacheRecords: {}\n };\n\n for await (const entry of entries) {\n let drained = false;\n const drainEntry = async () => {\n if (drained) {\n return;\n }\n drained = true;\n await entry.drain();\n };\n\n if (entry.type === \"Directory\") {\n await drainEntry();\n continue;\n }\n\n const entryName = normalizeZipPath(entry.name);\n\n const stream = entry.stream;\n try {\n const sheetNo = getWorksheetNoFromWorksheetPath(entryName);\n if (sheetNo !== undefined) {\n await this._processWorksheetEntry(stream, model, sheetNo, options, entryName);\n continue;\n }\n\n switch (entryName) {\n case OOXML_PATHS.rootRels:\n model.globalRels = await this.parseRels(stream);\n break;\n case OOXML_PATHS.xlWorkbook: {\n const workbook = await this.parseWorkbook(stream);\n model.sheets = workbook.sheets;\n model.definedNames = workbook.definedNames;\n model.views = workbook.views;\n model.properties = workbook.properties;\n model.calcProperties = workbook.calcProperties;\n model.pivotCaches = workbook.pivotCaches;\n break;\n }\n case OOXML_PATHS.xlSharedStrings:\n model.sharedStrings = new SharedStringsXform();\n await model.sharedStrings.parseStream(stream);\n break;\n case OOXML_PATHS.xlWorkbookRels:\n model.workbookRels = await this.parseRels(stream);\n break;\n case OOXML_PATHS.docPropsApp: {\n const appXform = new AppXform();\n const appProperties = await appXform.parseStream(stream);\n model.company = appProperties.company;\n model.manager = appProperties.manager;\n break;\n }\n case OOXML_PATHS.docPropsCore: {\n const coreXform = new CoreXform();\n const coreProperties = await coreXform.parseStream(stream);\n Object.assign(model, coreProperties);\n break;\n }\n case OOXML_PATHS.xlStyles:\n model.styles = new StylesXform();\n await model.styles.parseStream(stream);\n break;\n default: {\n const handled = await this._processDefaultEntry(stream, model, entryName);\n if (!handled) {\n // Important for true streaming parsers: always consume unknown entries\n await drainEntry();\n }\n break;\n }\n }\n } finally {\n // Make sure we don't leave the entry stream partially consumed.\n // This is critical for true streaming parsers which may otherwise abort\n // the underlying entry stream (showing up as AbortError/ABORT_ERR).\n try {\n await drainEntry();\n } catch {\n // ignore drain errors; the primary parse error (if any) is more useful\n }\n }\n }\n\n this.reconcile(model, options);\n this.workbook.model = model;\n return this.workbook;\n }\n\n /**\n * Write workbook to buffer\n */\n async writeBuffer(options?: XlsxWriteOptions): Promise<Uint8Array> {\n options = options || {};\n\n options.zip = options.zip || {};\n options.zip.modTime ??= this.workbook.modified ?? this.workbook.created;\n\n const zip = this.createZipWriter(options.zip);\n const stream = this.createStreamBuf();\n zip.pipe(stream);\n await this.writeToZip(zip, options);\n await this._finalize(zip);\n return stream.read() || new Uint8Array(0);\n }\n\n // ===========================================================================\n // Media handling - base implementation (buffer/base64 only)\n // ===========================================================================\n\n /**\n * Add media files to ZIP\n * Supports buffer, base64, and filename (if readFileAsync is provided)\n */\n async addMedia(zip: IZipWriter, model: MediaModel): Promise<void> {\n await Promise.all(\n model.media.map(async (medium: WorkbookMediaLike) => {\n if (medium.type !== \"image\") {\n throw new Error(\"Unsupported media\");\n }\n\n // Preserve legacy behavior: `${undefined}` becomes \"undefined\" in template strings\n const mediaName = medium.name ?? \"undefined\";\n const filename = mediaPath(`${mediaName}.${medium.extension}`);\n\n if (medium.filename) {\n if (this.readFileAsync) {\n const data = await this.readFileAsync(medium.filename);\n return zip.append(data, { name: filename });\n }\n throw new Error(\"Loading images from filename is not supported in this environment\");\n }\n\n if (medium.buffer) {\n return zip.append(medium.buffer, { name: filename });\n }\n\n if (medium.base64) {\n const content = medium.base64.substring(medium.base64.indexOf(\",\") + 1);\n return zip.append(content, { name: filename, base64: true });\n }\n\n throw new Error(\"Unsupported media\");\n })\n );\n }\n\n /**\n * Optional file reader - can be overridden by subclasses (e.g., Node.js version)\n */\n protected readFileAsync?: (filename: string) => Promise<Uint8Array>;\n\n // ===========================================================================\n // Parse helpers - shared by all platforms\n // ===========================================================================\n\n parseRels(stream: IParseStream): Promise<any> {\n const xform = new RelationshipsXform();\n return xform.parseStream(stream);\n }\n\n parseWorkbook(stream: IParseStream): Promise<any> {\n const xform = new WorkbookXform();\n return xform.parseStream(stream);\n }\n\n parseSharedStrings(stream: IParseStream): Promise<any> {\n const xform = new SharedStringsXform();\n return xform.parseStream(stream);\n }\n\n // ===========================================================================\n // Reconcile - shared by all platforms\n // ===========================================================================\n\n reconcile(model: any, options?: XlsxOptions): void {\n const workbookXform = new WorkbookXform();\n const worksheetXform = new WorkSheetXform(options);\n const drawingXform = new DrawingXform();\n const tableXform = new TableXform();\n\n workbookXform.reconcile(model);\n\n // reconcile drawings with their rels\n const drawingOptions: any = {\n media: model.media,\n mediaIndex: model.mediaIndex\n };\n Object.keys(model.drawings).forEach(name => {\n const drawing = model.drawings[name];\n const drawingRel = model.drawingRels[name];\n if (drawingRel) {\n drawingOptions.rels = drawingRel.reduce((o: any, rel: any) => {\n o[rel.Id] = rel;\n return o;\n }, {});\n (drawing.anchors || []).forEach((anchor: any) => {\n const hyperlinks = anchor.picture && anchor.picture.hyperlinks;\n if (hyperlinks && drawingOptions.rels[hyperlinks.rId]) {\n hyperlinks.hyperlink = drawingOptions.rels[hyperlinks.rId].Target;\n delete hyperlinks.rId;\n }\n });\n drawingXform.reconcile(drawing, drawingOptions);\n }\n });\n\n // reconcile tables with the default styles\n const tableOptions = {\n styles: model.styles\n };\n Object.values(model.tables).forEach((table: any) => {\n tableXform.reconcile(table, tableOptions);\n });\n\n // Reconcile pivot tables\n this._reconcilePivotTables(model);\n\n const sheetOptions = {\n styles: model.styles,\n sharedStrings: model.sharedStrings,\n media: model.media,\n mediaIndex: model.mediaIndex,\n date1904: model.properties && model.properties.date1904,\n drawings: model.drawings,\n comments: model.comments,\n tables: model.tables,\n vmlDrawings: model.vmlDrawings,\n pivotTables: model.pivotTablesIndexed\n };\n model.worksheets.forEach((worksheet: any) => {\n worksheet.relationships = model.worksheetRels[worksheet.sheetNo];\n worksheetXform.reconcile(worksheet, sheetOptions);\n });\n\n // delete unnecessary parts\n delete model.worksheetHash;\n delete model.worksheetRels;\n delete model.globalRels;\n delete model.sharedStrings;\n delete model.workbookRels;\n delete model.sheetDefs;\n delete model.styles;\n delete model.mediaIndex;\n delete model.drawings;\n delete model.drawingRels;\n delete model.vmlDrawings;\n delete model.pivotTableRels;\n delete model.pivotCacheDefinitionRels;\n }\n\n /**\n * Reconcile pivot tables by linking them to worksheets and their cache data.\n */\n protected _reconcilePivotTables(model: any): void {\n const rawPivotTables = model.pivotTables || {};\n if (typeof rawPivotTables !== \"object\" || Object.keys(rawPivotTables).length === 0) {\n model.pivotTables = [];\n model.pivotTablesIndexed = {};\n return;\n }\n\n const definitionToCacheId = this._buildDefinitionToCacheIdMap(model);\n\n const cacheMap = new Map<\n number,\n {\n definition: ParsedCacheDefinitionModel;\n records: any;\n definitionName: string;\n }\n >();\n\n Object.entries(model.pivotCacheDefinitions || {}).forEach(\n ([name, definition]: [string, any]) => {\n const cacheId = definitionToCacheId.get(name);\n if (cacheId !== undefined) {\n const recordsName = name.replace(\"Definition\", \"Records\");\n cacheMap.set(cacheId, {\n definition,\n records: model.pivotCacheRecords?.[recordsName],\n definitionName: name\n });\n }\n }\n );\n\n const loadedPivotTables: any[] = [];\n const pivotTablesIndexed: Record<string, any> = {};\n\n Object.entries(rawPivotTables).forEach(([pivotName, pivotTable]: [string, any]) => {\n const pt = pivotTable as ParsedPivotTableModel;\n const tableNumber = this._extractTableNumber(pivotName);\n const cacheData = cacheMap.get(pt.cacheId);\n\n const completePivotTable = {\n ...pt,\n tableNumber,\n cacheDefinition: cacheData?.definition,\n cacheRecords: cacheData?.records,\n cacheFields: cacheData?.definition?.cacheFields || [],\n rows: pt.rowFields.filter(f => f >= 0),\n columns: pt.colFields.filter(f => f >= 0 && f !== -2),\n values: pt.dataFields.map(df => df.fld),\n metric: this._determineMetric(pt.dataFields),\n applyWidthHeightFormats: pt.applyWidthHeightFormats || \"0\"\n };\n\n loadedPivotTables.push(completePivotTable);\n pivotTablesIndexed[pivotTableRelTargetFromWorksheetName(pivotName)] = completePivotTable;\n });\n\n loadedPivotTables.sort((a, b) => a.tableNumber - b.tableNumber);\n model.pivotTables = loadedPivotTables;\n model.pivotTablesIndexed = pivotTablesIndexed;\n model.loadedPivotTables = loadedPivotTables;\n }\n\n protected _extractTableNumber(name: string): number {\n const match = name.match(/pivotTable(\\d+)/);\n return match ? parseInt(match[1], 10) : 1;\n }\n\n protected _buildCacheIdMap(model: any): Map<string, number> {\n const rIdToCacheId = new Map<string, number>();\n const pivotCaches = model.pivotCaches || [];\n for (const cache of pivotCaches) {\n if (cache.cacheId && cache.rId) {\n rIdToCacheId.set(cache.rId, parseInt(cache.cacheId, 10));\n }\n }\n return rIdToCacheId;\n }\n\n protected _buildDefinitionToCacheIdMap(model: any): Map<string, number> {\n const definitionToCacheId = new Map<string, number>();\n const rIdToCacheId = this._buildCacheIdMap(model);\n const workbookRels = model.workbookRels || [];\n\n for (const rel of workbookRels) {\n if (rel.Type === XLSX.RelType.PivotCacheDefinition && rel.Target) {\n const match = rel.Target.match(/pivotCacheDefinition(\\d+)\\.xml/);\n if (match) {\n const defName = `pivotCacheDefinition${match[1]}`;\n const cacheId = rIdToCacheId.get(rel.Id);\n if (cacheId !== undefined) {\n definitionToCacheId.set(defName, cacheId);\n }\n }\n }\n }\n\n return definitionToCacheId;\n }\n\n protected _determineMetric(dataFields: Array<{ subtotal?: string }>): \"sum\" | \"count\" {\n if (dataFields.length > 0 && dataFields[0].subtotal === \"count\") {\n return \"count\";\n }\n return \"sum\";\n }\n\n // ===========================================================================\n // Process Entry methods - shared by all platforms\n // ===========================================================================\n\n async _processWorksheetEntry(\n stream: IParseStream,\n model: any,\n sheetNo: number,\n options: XlsxOptions | undefined,\n path: string\n ): Promise<void> {\n const xform = new WorkSheetXform(options);\n const worksheet = await xform.parseStream(stream);\n if (!worksheet) {\n throw new Error(`Failed to parse worksheet ${path}`);\n }\n worksheet.sheetNo = sheetNo;\n model.worksheetHash[path] = worksheet;\n model.worksheets.push(worksheet);\n }\n\n async _processCommentEntry(stream: IParseStream, model: any, name: string): Promise<void> {\n const xform = new CommentsXform();\n const comments = await xform.parseStream(stream);\n model.comments[commentsRelTargetFromWorksheetName(name)] = comments;\n }\n\n async _processTableEntry(stream: IParseStream, model: any, name: string): Promise<void> {\n const xform = new TableXform();\n const table = await xform.parseStream(stream);\n model.tables[tableRelTargetFromWorksheetName(name)] = table;\n }\n\n async _processWorksheetRelsEntry(\n stream: IParseStream,\n model: any,\n sheetNo: number\n ): Promise<void> {\n const xform = new RelationshipsXform();\n const relationships = await xform.parseStream(stream);\n model.worksheetRels[sheetNo] = relationships;\n }\n\n async _processMediaEntry(stream: IParseStream, model: any, filename: string): Promise<void> {\n const lastDot = filename.lastIndexOf(\".\");\n if (lastDot >= 1) {\n const extension = filename.substr(lastDot + 1);\n const name = filename.substr(0, lastDot);\n await new Promise<void>((resolve, reject) => {\n const streamBuf = this.createStreamBuf();\n\n const cleanup = () => {\n stream.off(\"error\", onError);\n streamBuf.off(\"error\", onError);\n streamBuf.off(\"finish\", onFinish);\n };\n\n const onFinish = () => {\n cleanup();\n model.mediaIndex[filename] = model.media.length;\n model.mediaIndex[name] = model.media.length;\n const medium = {\n type: \"image\",\n name,\n extension,\n buffer: streamBuf.read()\n };\n model.media.push(medium);\n resolve();\n };\n\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n\n streamBuf.once(\"finish\", onFinish);\n stream.on(\"error\", onError);\n streamBuf.on(\"error\", onError);\n stream.pipe(streamBuf);\n });\n }\n }\n\n async _processDrawingEntry(entry: any, model: any, name: string): Promise<void> {\n const xform = new DrawingXform();\n const drawing = await xform.parseStream(entry);\n model.drawings[name] = drawing;\n }\n\n async _processDrawingRelsEntry(entry: any, model: any, name: string): Promise<void> {\n const xform = new RelationshipsXform();\n const relationships = await xform.parseStream(entry);\n model.drawingRels[name] = relationships;\n }\n\n async _processVmlDrawingEntry(entry: any, model: any, name: string): Promise<void> {\n const xform = new VmlNotesXform();\n const vmlDrawing = await xform.parseStream(entry);\n model.vmlDrawings[vmlDrawingRelTargetFromWorksheetName(name)] = vmlDrawing;\n }\n\n async _processThemeEntry(stream: IParseStream, model: any, name: string): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const streamBuf = this.createStreamBuf();\n\n const cleanup = () => {\n stream.off(\"error\", onError);\n streamBuf.off(\"error\", onError);\n streamBuf.off(\"finish\", onFinish);\n };\n\n const onFinish = () => {\n cleanup();\n const data = streamBuf.read();\n model.themes[name] = data\n ? typeof data === \"string\"\n ? data\n : this.bufferToString(data)\n : \"\";\n resolve();\n };\n\n const onError = (err: Error) => {\n cleanup();\n reject(err);\n };\n\n streamBuf.once(\"finish\", onFinish);\n stream.on(\"error\", onError);\n streamBuf.on(\"error\", onError);\n stream.pipe(streamBuf);\n });\n }\n\n async _processPivotTableEntry(stream: IParseStream, model: any, name: string): Promise<void> {\n const xform = new PivotTableXform();\n const pivotTable = await xform.parseStream(stream);\n if (pivotTable) {\n model.pivotTables[name] = pivotTable;\n }\n }\n\n async _processPivotTableRelsEntry(stream: IParseStream, model: any, name: string): Promise<void> {\n const xform = new RelationshipsXform();\n const relationships = await xform.parseStream(stream);\n model.pivotTableRels[name] = relationships;\n }\n\n async _processPivotCacheDefinitionEntry(\n stream: IParseStream,\n model: any,\n name: string\n ): Promise<void> {\n const xform = new PivotCacheDefinitionXform();\n const cacheDefinition = await xform.parseStream(stream);\n if (cacheDefinition) {\n model.pivotCacheDefinitions[name] = cacheDefinition;\n }\n }\n\n async _processPivotCacheDefinitionRelsEntry(\n stream: IParseStream,\n model: any,\n name: string\n ): Promise<void> {\n const xform = new RelationshipsXform();\n const relationships = await xform.parseStream(stream);\n model.pivotCacheDefinitionRels[name] = relationships;\n }\n\n async _processPivotCacheRecordsEntry(\n stream: IParseStream,\n model: any,\n name: string\n ): Promise<void> {\n const xform = new PivotCacheRecordsXform();\n const cacheRecords = await xform.parseStream(stream);\n if (cacheRecords) {\n model.pivotCacheRecords[name] = cacheRecords;\n }\n }\n\n // ===========================================================================\n // loadFromFiles - shared logic for loading from pre-extracted ZIP data\n // ===========================================================================\n\n async loadFromFiles(zipData: Record<string, Uint8Array>, options?: any): Promise<any> {\n const model: any = {\n worksheets: [],\n worksheetHash: {},\n worksheetRels: [],\n themes: {},\n media: [],\n mediaIndex: {},\n drawings: {},\n drawingRels: {},\n comments: {},\n tables: {},\n vmlDrawings: {},\n pivotTables: {},\n pivotTableRels: {},\n pivotCacheDefinitions: {},\n pivotCacheDefinitionRels: {},\n pivotCacheRecords: {}\n };\n\n const entries = Object.keys(zipData).map(name => ({\n name,\n dir: name.endsWith(\"/\"),\n data: zipData[name]\n }));\n\n for (const entry of entries) {\n if (!entry.dir) {\n const entryName = normalizeZipPath(entry.name);\n\n // Create appropriate stream based on entry type\n const isBinaryEntry = isBinaryEntryPath(entryName);\n const stream = isBinaryEntry\n ? this.createBinaryStream(entry.data)\n : this.createTextStream(this.bufferToString(entry.data));\n\n const sheetNo = getWorksheetNoFromWorksheetPath(entryName);\n if (sheetNo !== undefined) {\n await this._processWorksheetEntry(stream, model, sheetNo, options, entryName);\n } else {\n switch (entryName) {\n case OOXML_PATHS.rootRels:\n model.globalRels = await this.parseRels(stream);\n break;\n case OOXML_PATHS.xlWorkbook: {\n const workbook = await this.parseWorkbook(stream);\n model.sheets = workbook.sheets;\n model.definedNames = workbook.definedNames;\n model.views = workbook.views;\n model.properties = workbook.properties;\n model.calcProperties = workbook.calcProperties;\n model.pivotCaches = workbook.pivotCaches;\n break;\n }\n case OOXML_PATHS.xlSharedStrings:\n model.sharedStrings = new SharedStringsXform();\n await model.sharedStrings.parseStream(stream);\n break;\n case OOXML_PATHS.xlWorkbookRels:\n model.workbookRels = await this.parseRels(stream);\n break;\n case OOXML_PATHS.docPropsApp: {\n const appXform = new AppXform();\n const appProperties = await appXform.parseStream(stream);\n model.company = appProperties.company;\n model.manager = appProperties.manager;\n break;\n }\n case OOXML_PATHS.docPropsCore: {\n const coreXform = new CoreXform();\n const coreProperties = await coreXform.parseStream(stream);\n Object.assign(model, coreProperties);\n break;\n }\n case OOXML_PATHS.xlStyles:\n model.styles = new StylesXform();\n await model.styles.parseStream(stream);\n break;\n default:\n await this._processDefaultEntry(stream, model, entryName);\n }\n }\n }\n }\n\n this.reconcile(model, options);\n this.workbook.model = model;\n return this.workbook;\n }\n\n /**\n * Process default entries (drawings, comments, tables, etc.)\n */\n protected async _processDefaultEntry(\n stream: IParseStream,\n model: any,\n entryName: string\n ): Promise<boolean> {\n const worksheetRelsSheetNo = getWorksheetNoFromWorksheetRelsPath(entryName);\n if (worksheetRelsSheetNo !== undefined) {\n const sheetNo = worksheetRelsSheetNo;\n await this._processWorksheetRelsEntry(stream, model, sheetNo);\n return true;\n }\n\n const mediaFilename = getMediaFilenameFromPath(entryName);\n if (mediaFilename) {\n await this._processMediaEntry(stream, model, mediaFilename);\n return true;\n }\n\n const drawingName = getDrawingNameFromPath(entryName);\n if (drawingName) {\n await this._processDrawingEntry(stream, model, drawingName);\n return true;\n }\n\n const drawingRelsName = getDrawingNameFromRelsPath(entryName);\n if (drawingRelsName) {\n await this._processDrawingRelsEntry(stream, model, drawingRelsName);\n return true;\n }\n\n const vmlDrawingName = getVmlDrawingNameFromPath(entryName);\n if (vmlDrawingName) {\n await this._processVmlDrawingEntry(stream, model, vmlDrawingName);\n return true;\n }\n\n const commentsIndex = getCommentsIndexFromPath(entryName);\n if (commentsIndex) {\n await this._processCommentEntry(stream, model, `comments${commentsIndex}`);\n return true;\n }\n\n const tableName = getTableNameFromPath(entryName);\n if (tableName) {\n await this._processTableEntry(stream, model, tableName);\n return true;\n }\n\n const themeName = getThemeNameFromPath(entryName);\n if (themeName) {\n await this._processThemeEntry(stream, model, themeName);\n return true;\n }\n\n // Pivot table files\n const pivotTableName = getPivotTableNameFromPath(entryName);\n if (pivotTableName) {\n await this._processPivotTableEntry(stream, model, pivotTableName);\n return true;\n }\n\n const pivotTableRelsName = getPivotTableNameFromRelsPath(entryName);\n if (pivotTableRelsName) {\n await this._processPivotTableRelsEntry(stream, model, pivotTableRelsName);\n return true;\n }\n\n // Pivot cache files\n const pivotCacheDefinitionName = getPivotCacheDefinitionNameFromPath(entryName);\n if (pivotCacheDefinitionName) {\n await this._processPivotCacheDefinitionEntry(stream, model, pivotCacheDefinitionName);\n return true;\n }\n\n const pivotCacheDefinitionRelsName = getPivotCacheDefinitionNameFromRelsPath(entryName);\n if (pivotCacheDefinitionRelsName) {\n await this._processPivotCacheDefinitionRelsEntry(stream, model, pivotCacheDefinitionRelsName);\n return true;\n }\n\n const pivotCacheRecordsName = getPivotCacheRecordsNameFromPath(entryName);\n if (pivotCacheRecordsName) {\n await this._processPivotCacheRecordsEntry(stream, model, pivotCacheRecordsName);\n return true;\n }\n\n return false;\n }\n\n // ===========================================================================\n // Write methods - shared by all platforms\n // ===========================================================================\n\n async addContentTypes(zip: IZipWriter, model: any): Promise<void> {\n const xform = new ContentTypesXform();\n const xml = xform.toXml(model);\n zip.append(xml, { name: OOXML_PATHS.contentTypes });\n }\n\n async addApp(zip: IZipWriter, model: any): Promise<void> {\n const xform = new AppXform();\n const xml = xform.toXml(model);\n zip.append(xml, { name: OOXML_PATHS.docPropsApp });\n }\n\n async addCore(zip: IZipWriter, model: any): Promise<void> {\n const xform = new CoreXform();\n zip.append(xform.toXml(model), { name: OOXML_PATHS.docPropsCore });\n }\n\n async addThemes(zip: IZipWriter, model: any): Promise<void> {\n const themes = model.themes || { theme1: theme1Xml };\n Object.keys(themes).forEach(name => {\n const xml = themes[name];\n zip.append(xml, { name: themePath(name) });\n });\n }\n\n async addOfficeRels(zip: IZipWriter, _model: any): Promise<void> {\n const xform = new RelationshipsXform();\n const xml = xform.toXml([\n { Id: \"rId1\", Type: XLSX.RelType.OfficeDocument, Target: OOXML_PATHS.xlWorkbook },\n { Id: \"rId2\", Type: XLSX.RelType.CoreProperties, Target: OOXML_PATHS.docPropsCore },\n { Id: \"rId3\", Type: XLSX.RelType.ExtenderProperties, Target: OOXML_PATHS.docPropsApp }\n ]);\n zip.append(xml, { name: OOXML_PATHS.rootRels });\n }\n\n async addWorkbookRels(zip: IZipWriter, model: any): Promise<void> {\n let count = 1;\n const relationships: any[] = [\n { Id: `rId${count++}`, Type: XLSX.RelType.Styles, Target: OOXML_REL_TARGETS.workbookStyles },\n { Id: `rId${count++}`, Type: XLSX.RelType.Theme, Target: OOXML_REL_TARGETS.workbookTheme1 }\n ];\n if (model.sharedStrings.count) {\n relationships.push({\n Id: `rId${count++}`,\n Type: XLSX.RelType.SharedStrings,\n Target: OOXML_REL_TARGETS.workbookSharedStrings\n });\n }\n (model.pivotTables || []).forEach((pivotTable: any) => {\n pivotTable.rId = `rId${count++}`;\n relationships.push({\n Id: pivotTable.rId,\n Type: XLSX.RelType.PivotCacheDefinition,\n Target: pivotCacheDefinitionRelTargetFromWorkbook(pivotTable.tableNumber)\n });\n });\n model.worksheets.forEach((worksheet: any, index: number) => {\n worksheet.rId = `rId${count++}`;\n worksheet.fileIndex = index + 1;\n relationships.push({\n Id: worksheet.rId,\n Type: XLSX.RelType.Worksheet,\n Target: `worksheets/sheet${worksheet.fileIndex}.xml`\n });\n });\n const xform = new RelationshipsXform();\n const xml = xform.toXml(relationships);\n zip.append(xml, { name: OOXML_PATHS.xlWorkbookRels });\n }\n\n async addSharedStrings(zip: IZipWriter, model: any): Promise<void> {\n if (model.sharedStrings && model.sharedStrings.count) {\n zip.append(model.sharedStrings.xml, { name: OOXML_PATHS.xlSharedStrings });\n }\n }\n\n async addStyles(zip: IZipWriter, model: any): Promise<void> {\n const { xml } = model.styles;\n if (xml) {\n zip.append(xml, { name: OOXML_PATHS.xlStyles });\n }\n }\n\n async addWorkbook(zip: IZipWriter, model: any): Promise<void> {\n const xform = new WorkbookXform();\n zip.append(xform.toXml(model), { name: OOXML_PATHS.xlWorkbook });\n }\n\n async addWorksheets(zip: IZipWriter, model: any): Promise<void> {\n const worksheetXform = new WorkSheetXform();\n const relationshipsXform = new RelationshipsXform();\n const commentsXform = new CommentsXform();\n const vmlNotesXform = new VmlNotesXform();\n\n model.worksheets.forEach((worksheet: any, index: number) => {\n const fileIndex = worksheet.fileIndex || index + 1;\n let xmlStream = new XmlStream();\n worksheetXform.render(xmlStream, worksheet);\n zip.append(xmlStream.xml, { name: worksheetPath(fileIndex) });\n\n if (worksheet.rels && worksheet.rels.length) {\n xmlStream = new XmlStream();\n relationshipsXform.render(xmlStream, worksheet.rels);\n zip.append(xmlStream.xml, { name: worksheetRelsPath(fileIndex) });\n }\n\n if (worksheet.comments.length > 0) {\n xmlStream = new XmlStream();\n commentsXform.render(xmlStream, worksheet);\n zip.append(xmlStream.xml, { name: commentsPath(fileIndex) });\n\n xmlStream = new XmlStream();\n vmlNotesXform.render(xmlStream, worksheet);\n zip.append(xmlStream.xml, { name: vmlDrawingPath(fileIndex) });\n }\n });\n }\n\n addDrawings(zip: IZipWriter, model: any): void {\n const drawingXform = new DrawingXform();\n const relsXform = new RelationshipsXform();\n\n model.worksheets.forEach((worksheet: any) => {\n const { drawing } = worksheet;\n if (drawing) {\n drawingXform.prepare(drawing);\n let xml = drawingXform.toXml(drawing);\n zip.append(xml, { name: drawingPath(drawing.name) });\n\n xml = relsXform.toXml(drawing.rels);\n zip.append(xml, { name: drawingRelsPath(drawing.name) });\n }\n });\n }\n\n addTables(zip: IZipWriter, model: any): void {\n const tableXform = new TableXform();\n\n model.worksheets.forEach((worksheet: any) => {\n const { tables } = worksheet;\n tables.forEach((table: any) => {\n tableXform.prepare(table, {});\n const tableXml = tableXform.toXml(table);\n zip.append(tableXml, { name: tablePath(table.target) });\n });\n });\n }\n\n addPivotTables(zip: IZipWriter, model: any): void {\n if (!model.pivotTables.length) {\n return;\n }\n\n const pivotCacheRecordsXform = new PivotCacheRecordsXform();\n const pivotCacheDefinitionXform = new PivotCacheDefinitionXform();\n const pivotTableXform = new PivotTableXform();\n const relsXform = new RelationshipsXform();\n\n model.pivotTables.forEach((pivotTable: any) => {\n const n = pivotTable.tableNumber;\n const isLoaded = pivotTable.isLoaded;\n\n if (isLoaded) {\n if (pivotTable.cacheDefinition) {\n const xml = pivotCacheDefinitionXform.toXml(pivotTable.cacheDefinition);\n zip.append(xml, { name: pivotCacheDefinitionPath(n) });\n }\n if (pivotTable.cacheRecords) {\n const xml = pivotCacheRecordsXform.toXml(pivotTable.cacheRecords);\n zip.append(xml, { name: pivotCacheRecordsPath(n) });\n }\n } else {\n let xml = pivotCacheRecordsXform.toXml(pivotTable);\n zip.append(xml, { name: pivotCacheRecordsPath(n) });\n\n xml = pivotCacheDefinitionXform.toXml(pivotTable);\n zip.append(xml, { name: pivotCacheDefinitionPath(n) });\n }\n\n let xml = relsXform.toXml([\n {\n Id: \"rId1\",\n Type: XLSX.RelType.PivotCacheRecords,\n Target: pivotCacheRecordsRelTarget(n)\n }\n ]);\n zip.append(xml, { name: pivotCacheDefinitionRelsPath(n) });\n\n xml = pivotTableXform.toXml(pivotTable);\n zip.append(xml, { name: pivotTablePath(n) });\n\n xml = relsXform.toXml([\n {\n Id: \"rId1\",\n Type: XLSX.RelType.PivotCacheDefinition,\n Target: pivotCacheDefinitionRelTargetFromPivotTable(n)\n }\n ]);\n zip.append(xml, { name: pivotTableRelsPath(n) });\n });\n }\n\n _finalize(zip: IZipWriter): Promise<this> {\n return new Promise((resolve, reject) => {\n zip.on(\"finish\", () => {\n resolve(this);\n });\n zip.on(\"error\", reject);\n zip.finalize();\n });\n }\n\n prepareModel(model: any, options: any): void {\n model.creator = model.creator || \"ExcelTS\";\n model.lastModifiedBy = model.lastModifiedBy || \"ExcelTS\";\n model.created = model.created || new Date();\n model.modified = model.modified || new Date();\n\n model.useSharedStrings =\n options.useSharedStrings !== undefined ? options.useSharedStrings : true;\n model.useStyles = options.useStyles !== undefined ? options.useStyles : true;\n\n model.sharedStrings = new SharedStringsXform();\n model.styles = model.useStyles ? new StylesXform(true) : new (StylesXform as any).Mock();\n\n const workbookXform = new WorkbookXform();\n const worksheetXform = new WorkSheetXform();\n\n workbookXform.prepare(model);\n\n const worksheetOptions: any = {\n sharedStrings: model.sharedStrings,\n styles: model.styles,\n date1904: model.properties.date1904,\n drawingsCount: 0,\n media: model.media\n };\n worksheetOptions.drawings = model.drawings = [];\n worksheetOptions.commentRefs = model.commentRefs = [];\n let tableCount = 0;\n model.tables = [];\n model.worksheets.forEach((worksheet: any) => {\n worksheet.tables.forEach((table: any) => {\n tableCount++;\n table.target = `table${tableCount}.xml`;\n table.id = tableCount;\n model.tables.push(table);\n });\n\n worksheetXform.prepare(worksheet, worksheetOptions);\n });\n }\n}\n\nexport { XLSX };\n","/**\n * High-performance native date parsing and formatting utilities\n *\n * Zero external dependencies. Optimized for CSV batch processing.\n * Uses character code operations and lookup tables for maximum speed.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Supported date format strings */\nexport type DateFormat =\n | \"YYYY-MM-DD[T]HH:mm:ssZ\"\n | \"YYYY-MM-DD[T]HH:mm:ss\"\n | \"YYYY-MM-DD[T]HH:mm:ss.SSSZ\"\n | \"YYYY-MM-DD\"\n | \"YYYY-MM-DD HH:mm:ss\"\n | \"MM-DD-YYYY\"\n | \"MM-DD-YYYY HH:mm:ss\"\n | \"MM/DD/YYYY HH:mm:ss\"\n | \"DD-MM-YYYY\"\n | \"DD-MM-YYYY HH:mm:ss\"\n | \"DD/MM/YYYY HH:mm:ss\";\n\n// ============================================================================\n// Constants - Pre-computed lookup tables for zero-allocation operations\n// ============================================================================\n\n// Padding lookup (0-59 covers hours, minutes, seconds, and months/days)\nconst PAD2 = Array.from({ length: 60 }, (_, i) => (i < 10 ? `0${i}` : `${i}`));\n\n// Character codes for fast comparison\nconst C_0 = 48;\nconst C_DASH = 45;\nconst C_SLASH = 47;\nconst C_COLON = 58;\nconst C_T = 84;\nconst C_SPACE = 32;\nconst C_Z = 90;\nconst C_PLUS = 43;\nconst C_DOT = 46;\n\n// ============================================================================\n// Low-level utilities (inlined for JIT optimization)\n// ============================================================================\n\n// Inline digit extraction - avoid function call overhead\n// Using bitwise OR for integer coercion (faster than Math.floor)\nconst digit2 = (s: string, i: number) =>\n ((s.charCodeAt(i) - C_0) * 10 + s.charCodeAt(i + 1) - C_0) | 0;\nconst digit4 = (s: string, i: number) =>\n ((s.charCodeAt(i) - C_0) * 1000 +\n (s.charCodeAt(i + 1) - C_0) * 100 +\n (s.charCodeAt(i + 2) - C_0) * 10 +\n s.charCodeAt(i + 3) -\n C_0) |\n 0;\n\n// Days in month lookup (index 0 unused, 1-12 for Jan-Dec)\n// Using 31 for Feb; actual validation done by Date constructor\nconst DAYS_IN_MONTH = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\nfunction validateDate(y: number, m: number, d: number): Date | null {\n // Fast bounds check using lookup table\n if (m < 1 || m > 12 || d < 1 || d > DAYS_IN_MONTH[m]) {\n return null;\n }\n const date = new Date(y, m - 1, d);\n // Check for overflow (e.g., Feb 30 -> Mar 2)\n return date.getMonth() === m - 1 ? date : null;\n}\n\nfunction validateDateTime(\n y: number,\n m: number,\n d: number,\n h: number,\n min: number,\n s: number\n): Date | null {\n if (m < 1 || m > 12 || d < 1 || d > DAYS_IN_MONTH[m]) {\n return null;\n }\n if (h > 23 || min > 59 || s > 59) {\n return null;\n }\n return new Date(y, m - 1, d, h, min, s);\n}\n\n// ============================================================================\n// Specialized parsers (length-based dispatch for speed)\n// ============================================================================\n\n// YYYY-MM-DD (10 chars)\nfunction parseISO(s: string): Date | null {\n if (s.charCodeAt(4) !== C_DASH || s.charCodeAt(7) !== C_DASH) {\n return null;\n }\n return validateDate(digit4(s, 0), digit2(s, 5), digit2(s, 8));\n}\n\n// YYYY-MM-DDTHH:mm:ss (19 chars)\nfunction parseISOT(s: string): Date | null {\n if (\n s.charCodeAt(4) !== C_DASH ||\n s.charCodeAt(7) !== C_DASH ||\n s.charCodeAt(10) !== C_T ||\n s.charCodeAt(13) !== C_COLON ||\n s.charCodeAt(16) !== C_COLON\n ) {\n return null;\n }\n return validateDateTime(\n digit4(s, 0),\n digit2(s, 5),\n digit2(s, 8),\n digit2(s, 11),\n digit2(s, 14),\n digit2(s, 17)\n );\n}\n\n// YYYY-MM-DD HH:mm:ss (19 chars, space separator)\nfunction parseISOSpace(s: string): Date | null {\n if (\n s.charCodeAt(4) !== C_DASH ||\n s.charCodeAt(7) !== C_DASH ||\n s.charCodeAt(10) !== C_SPACE ||\n s.charCodeAt(13) !== C_COLON ||\n s.charCodeAt(16) !== C_COLON\n ) {\n return null;\n }\n return validateDateTime(\n digit4(s, 0),\n digit2(s, 5),\n digit2(s, 8),\n digit2(s, 11),\n digit2(s, 14),\n digit2(s, 17)\n );\n}\n\n// YYYY-MM-DDTHH:mm:ssZ (20 chars)\nfunction parseISOZ(s: string): Date | null {\n if (s.charCodeAt(19) !== C_Z) {\n return null;\n }\n const d = new Date(s);\n return isNaN(d.getTime()) ? null : d;\n}\n\n// YYYY-MM-DDTHH:mm:ss.SSSZ (24 chars)\nfunction parseISOMsZ(s: string): Date | null {\n if (s.charCodeAt(19) !== C_DOT || s.charCodeAt(23) !== C_Z) {\n return null;\n }\n const d = new Date(s);\n return isNaN(d.getTime()) ? null : d;\n}\n\n// YYYY-MM-DDTHH:mm:ss+HH:mm (25 chars)\nfunction parseISOOffset(s: string): Date | null {\n const c = s.charCodeAt(19);\n if (c !== C_PLUS && c !== C_DASH) {\n return null;\n }\n const d = new Date(s);\n return isNaN(d.getTime()) ? null : d;\n}\n\n// YYYY-MM-DDTHH:mm:ss.SSS+HH:mm (29 chars)\nfunction parseISOMsOffset(s: string): Date | null {\n if (s.charCodeAt(19) !== C_DOT) {\n return null;\n }\n const c = s.charCodeAt(23);\n if (c !== C_PLUS && c !== C_DASH) {\n return null;\n }\n const d = new Date(s);\n return isNaN(d.getTime()) ? null : d;\n}\n\n// MM-DD-YYYY or MM/DD/YYYY (10 chars)\nfunction parseUS(s: string): Date | null {\n const sep = s.charCodeAt(2);\n if ((sep !== C_DASH && sep !== C_SLASH) || s.charCodeAt(5) !== sep) {\n return null;\n }\n return validateDate(digit4(s, 6), digit2(s, 0), digit2(s, 3));\n}\n\n// DD-MM-YYYY or DD/MM/YYYY (10 chars)\nfunction parseEU(s: string): Date | null {\n const sep = s.charCodeAt(2);\n if ((sep !== C_DASH && sep !== C_SLASH) || s.charCodeAt(5) !== sep) {\n return null;\n }\n return validateDate(digit4(s, 6), digit2(s, 3), digit2(s, 0));\n}\n\n// MM-DD-YYYY HH:mm:ss or MM/DD/YYYY HH:mm:ss (19 chars)\nfunction parseUSTime(s: string): Date | null {\n const sep = s.charCodeAt(2);\n if ((sep !== C_DASH && sep !== C_SLASH) || s.charCodeAt(5) !== sep) {\n return null;\n }\n if (\n s.charCodeAt(10) !== C_SPACE ||\n s.charCodeAt(13) !== C_COLON ||\n s.charCodeAt(16) !== C_COLON\n ) {\n return null;\n }\n return validateDateTime(\n digit4(s, 6),\n digit2(s, 0),\n digit2(s, 3),\n digit2(s, 11),\n digit2(s, 14),\n digit2(s, 17)\n );\n}\n\n// DD-MM-YYYY HH:mm:ss or DD/MM/YYYY HH:mm:ss (19 chars)\nfunction parseEUTime(s: string): Date | null {\n const sep = s.charCodeAt(2);\n if ((sep !== C_DASH && sep !== C_SLASH) || s.charCodeAt(5) !== sep) {\n return null;\n }\n if (\n s.charCodeAt(10) !== C_SPACE ||\n s.charCodeAt(13) !== C_COLON ||\n s.charCodeAt(16) !== C_COLON\n ) {\n return null;\n }\n return validateDateTime(\n digit4(s, 6),\n digit2(s, 3),\n digit2(s, 0),\n digit2(s, 11),\n digit2(s, 14),\n digit2(s, 17)\n );\n}\n\n// ============================================================================\n// Format dispatch tables\n// ============================================================================\n\ntype Parser = (s: string) => Date | null;\n\nconst PARSERS: Record<DateFormat, Parser> = {\n \"YYYY-MM-DD\": parseISO,\n \"YYYY-MM-DD[T]HH:mm:ss\": parseISOT,\n \"YYYY-MM-DD HH:mm:ss\": parseISOSpace,\n \"YYYY-MM-DD[T]HH:mm:ssZ\": s =>\n s.length === 20 ? parseISOZ(s) : s.length === 25 ? parseISOOffset(s) : null,\n \"YYYY-MM-DD[T]HH:mm:ss.SSSZ\": s =>\n s.length === 24 ? parseISOMsZ(s) : s.length === 29 ? parseISOMsOffset(s) : null,\n \"MM-DD-YYYY\": parseUS,\n \"MM-DD-YYYY HH:mm:ss\": parseUSTime,\n \"MM/DD/YYYY HH:mm:ss\": parseUSTime,\n \"DD-MM-YYYY\": parseEU,\n \"DD-MM-YYYY HH:mm:ss\": parseEUTime,\n \"DD/MM/YYYY HH:mm:ss\": parseEUTime\n};\n\n// Length-based auto-detection (ISO formats only, US/EU excluded due to ambiguity)\nconst AUTO_DETECT: Array<[number, Parser[]]> = [\n [10, [parseISO]],\n [19, [parseISOT, parseISOSpace]],\n [20, [parseISOZ]],\n [24, [parseISOMsZ]],\n [25, [parseISOOffset]],\n [29, [parseISOMsOffset]]\n];\n\n// ============================================================================\n// High-performance batch processors (class-based for state encapsulation)\n// ============================================================================\n\n/**\n * Optimized date parser for batch processing\n *\n * @example\n * const parser = DateParser.create([\"YYYY-MM-DD\"]);\n * const dates = parser.parseAll(csvStrings);\n */\nexport class DateParser {\n private readonly fns: Parser[];\n private readonly single: boolean;\n private readonly fn0: Parser;\n\n private constructor(fns: Parser[]) {\n this.fns = fns;\n this.single = fns.length === 1;\n this.fn0 = fns[0];\n }\n\n /** Create parser for specific formats */\n static create(formats: readonly DateFormat[]): DateParser {\n return new DateParser(formats.map(f => PARSERS[f]).filter(Boolean));\n }\n\n /** Create parser for auto-detecting ISO formats */\n static iso(): DateParser {\n const fns: Parser[] = [];\n for (const [, parsers] of AUTO_DETECT) {\n fns.push(...parsers);\n }\n return new DateParser(fns);\n }\n\n /** Parse single value */\n parse = (value: string): Date | null => {\n if (!value) {\n return null;\n }\n const s = value.trim();\n if (!s) {\n return null;\n }\n // Fast path for single parser\n if (this.single) {\n return this.fn0(s);\n }\n // Multi-parser path\n for (let i = 0, len = this.fns.length; i < len; i++) {\n const r = this.fns[i](s);\n if (r) {\n return r;\n }\n }\n return null;\n };\n\n /** Parse array of values */\n parseAll(values: string[]): (Date | null)[] {\n const len = values.length;\n const out = new Array<Date | null>(len);\n const parse = this.parse;\n for (let i = 0; i < len; i++) {\n out[i] = parse(values[i]);\n }\n return out;\n }\n\n /** Parse and filter valid dates */\n parseValid(values: string[]): Date[] {\n const out: Date[] = [];\n const parse = this.parse;\n for (let i = 0, len = values.length; i < len; i++) {\n const d = parse(values[i]);\n if (d) {\n out.push(d);\n }\n }\n return out;\n }\n}\n\nfunction tzOffset(d: Date): string {\n const off = -d.getTimezoneOffset();\n const sign = off >= 0 ? \"+\" : \"-\";\n const h = (Math.abs(off) / 60) | 0; // Bitwise OR faster than Math.floor\n const m = Math.abs(off) % 60;\n return `${sign}${PAD2[h]}:${PAD2[m]}`;\n}\n\n/**\n * Optimized date formatter for batch processing\n *\n * @example\n * const formatter = DateFormatter.create(\"YYYY-MM-DD\", { utc: true });\n * const strings = formatter.formatAll(dates);\n */\nexport class DateFormatter {\n private readonly fn: (d: Date) => string;\n\n private constructor(fn: (d: Date) => string) {\n this.fn = fn;\n }\n\n /** Create ISO formatter (fastest) */\n static iso(utc = false): DateFormatter {\n // Direct string building is faster than toISOString() + slice\n return utc\n ? new DateFormatter(d => {\n if (!(d instanceof Date)) {\n return \"\";\n }\n const t = d.getTime();\n if (t !== t) {\n return \"\";\n } // NaN check\n const y = d.getUTCFullYear();\n const M = d.getUTCMonth() + 1;\n const D = d.getUTCDate();\n const H = d.getUTCHours();\n const m = d.getUTCMinutes();\n const s = d.getUTCSeconds();\n const ms = d.getUTCMilliseconds();\n return `${y}-${PAD2[M]}-${PAD2[D]}T${PAD2[H]}:${PAD2[m]}:${PAD2[s]}.${ms < 10 ? \"00\" + ms : ms < 100 ? \"0\" + ms : ms}Z`;\n })\n : new DateFormatter(d => {\n if (!(d instanceof Date)) {\n return \"\";\n }\n const t = d.getTime();\n if (t !== t) {\n return \"\";\n } // NaN check\n const y = d.getFullYear();\n const M = d.getMonth() + 1;\n const D = d.getDate();\n const H = d.getHours();\n const m = d.getMinutes();\n const s = d.getSeconds();\n const ms = d.getMilliseconds();\n return `${y}-${PAD2[M]}-${PAD2[D]}T${PAD2[H]}:${PAD2[m]}:${PAD2[s]}.${ms < 10 ? \"00\" + ms : ms < 100 ? \"0\" + ms : ms}${tzOffset(d)}`;\n });\n }\n\n /** Create custom format formatter */\n static create(format: string, options?: { utc?: boolean }): DateFormatter {\n const utc = options?.utc ?? false;\n\n // Fast paths for common formats (no regex, direct string building)\n if (format === \"YYYY-MM-DD\") {\n return utc\n ? new DateFormatter(d => {\n if (!(d instanceof Date)) {\n return \"\";\n }\n const t = d.getTime();\n if (t !== t) {\n return \"\";\n }\n return `${d.getUTCFullYear()}-${PAD2[d.getUTCMonth() + 1]}-${PAD2[d.getUTCDate()]}`;\n })\n : new DateFormatter(d => {\n if (!(d instanceof Date)) {\n return \"\";\n }\n const t = d.getTime();\n if (t !== t) {\n return \"\";\n }\n return `${d.getFullYear()}-${PAD2[d.getMonth() + 1]}-${PAD2[d.getDate()]}`;\n });\n }\n\n if (format === \"YYYY-MM-DD HH:mm:ss\") {\n return utc\n ? new DateFormatter(d => {\n if (!(d instanceof Date)) {\n return \"\";\n }\n const t = d.getTime();\n if (t !== t) {\n return \"\";\n }\n return `${d.getUTCFullYear()}-${PAD2[d.getUTCMonth() + 1]}-${PAD2[d.getUTCDate()]} ${PAD2[d.getUTCHours()]}:${PAD2[d.getUTCMinutes()]}:${PAD2[d.getUTCSeconds()]}`;\n })\n : new DateFormatter(d => {\n if (!(d instanceof Date)) {\n return \"\";\n }\n const t = d.getTime();\n if (t !== t) {\n return \"\";\n }\n return `${d.getFullYear()}-${PAD2[d.getMonth() + 1]}-${PAD2[d.getDate()]} ${PAD2[d.getHours()]}:${PAD2[d.getMinutes()]}:${PAD2[d.getSeconds()]}`;\n });\n }\n\n if (format === \"MM-DD-YYYY\" || format === \"MM/DD/YYYY\") {\n const sep = format.charAt(2);\n return utc\n ? new DateFormatter(d => {\n if (!(d instanceof Date)) {\n return \"\";\n }\n const t = d.getTime();\n if (t !== t) {\n return \"\";\n }\n return `${PAD2[d.getUTCMonth() + 1]}${sep}${PAD2[d.getUTCDate()]}${sep}${d.getUTCFullYear()}`;\n })\n : new DateFormatter(d => {\n if (!(d instanceof Date)) {\n return \"\";\n }\n const t = d.getTime();\n if (t !== t) {\n return \"\";\n }\n return `${PAD2[d.getMonth() + 1]}${sep}${PAD2[d.getDate()]}${sep}${d.getFullYear()}`;\n });\n }\n\n if (format === \"DD-MM-YYYY\" || format === \"DD/MM/YYYY\") {\n const sep = format.charAt(2);\n return utc\n ? new DateFormatter(d => {\n if (!(d instanceof Date)) {\n return \"\";\n }\n const t = d.getTime();\n if (t !== t) {\n return \"\";\n }\n return `${PAD2[d.getUTCDate()]}${sep}${PAD2[d.getUTCMonth() + 1]}${sep}${d.getUTCFullYear()}`;\n })\n : new DateFormatter(d => {\n if (!(d instanceof Date)) {\n return \"\";\n }\n const t = d.getTime();\n if (t !== t) {\n return \"\";\n }\n return `${PAD2[d.getDate()]}${sep}${PAD2[d.getMonth() + 1]}${sep}${d.getFullYear()}`;\n });\n }\n\n // Generic path with pre-compiled template\n return DateFormatter.createGeneric(format, utc);\n }\n\n /** Generic formatter for arbitrary formats */\n private static createGeneric(format: string, utc: boolean): DateFormatter {\n // Pre-process escaped sections\n const esc: string[] = [];\n const tpl = format.replace(/\\[([^\\]]*)\\]/g, (_, c) => {\n esc.push(c);\n return `\\x00${esc.length - 1}\\x00`;\n });\n\n // Detect used tokens for conditional computation\n const hasY = tpl.includes(\"YYYY\");\n const hasMs = tpl.includes(\"SSS\");\n const hasM = tpl.includes(\"MM\");\n const hasD = tpl.includes(\"DD\");\n const hasH = tpl.includes(\"HH\");\n const hasMin = tpl.includes(\"mm\");\n const hasS = tpl.includes(\"ss\");\n const hasZ = tpl.includes(\"Z\");\n\n return new DateFormatter(d => {\n if (!(d instanceof Date)) {\n return \"\";\n }\n const t = d.getTime();\n if (t !== t) {\n return \"\";\n }\n\n let out = tpl;\n if (hasY) {\n out = out.replace(/YYYY/g, String(utc ? d.getUTCFullYear() : d.getFullYear()));\n }\n if (hasMs) {\n const ms = utc ? d.getUTCMilliseconds() : d.getMilliseconds();\n out = out.replace(/SSS/g, ms < 10 ? `00${ms}` : ms < 100 ? `0${ms}` : String(ms));\n }\n if (hasM) {\n out = out.replace(/MM/g, PAD2[utc ? d.getUTCMonth() + 1 : d.getMonth() + 1]);\n }\n if (hasD) {\n out = out.replace(/DD/g, PAD2[utc ? d.getUTCDate() : d.getDate()]);\n }\n if (hasH) {\n out = out.replace(/HH/g, PAD2[utc ? d.getUTCHours() : d.getHours()]);\n }\n if (hasMin) {\n out = out.replace(/mm/g, PAD2[utc ? d.getUTCMinutes() : d.getMinutes()]);\n }\n if (hasS) {\n out = out.replace(/ss/g, PAD2[utc ? d.getUTCSeconds() : d.getSeconds()]);\n }\n if (hasZ) {\n out = out.replace(/Z/g, utc ? \"Z\" : tzOffset(d));\n }\n\n if (esc.length) {\n // oxlint-disable-next-line no-control-regex\n out = out.replace(/\\x00(\\d+)\\x00/g, (_, i) => esc[+i]);\n }\n return out;\n });\n }\n\n /** Format single date */\n format = (date: Date): string => this.fn(date);\n\n /** Format array of dates */\n formatAll(dates: Date[]): string[] {\n const len = dates.length;\n const out = new Array<string>(len);\n const fn = this.fn;\n for (let i = 0; i < len; i++) {\n out[i] = fn(dates[i]);\n }\n return out;\n }\n}\n\n/** Get supported format strings */\nexport function getSupportedFormats(): DateFormat[] {\n return Object.keys(PARSERS) as DateFormat[];\n}\n","export type DecimalSeparator = \".\" | \",\";\n\nexport function formatNumberForCsv(value: number, decimalSeparator: DecimalSeparator): string {\n if (decimalSeparator !== \",\") {\n return String(value);\n }\n // Keep JS numeric string form but replace the decimal point.\n // Use split/join for broad runtime compatibility.\n return String(value).split(\".\").join(\",\");\n}\n\nexport function parseNumberFromCsv(value: string, decimalSeparator: DecimalSeparator): number {\n if (decimalSeparator !== \",\") {\n return Number(value);\n }\n\n const trimmed = value.trim();\n\n // Minimal locale support: treat a single comma as the decimal separator.\n // Common EU CSV uses delimiter ';' and decimal ',' (e.g. 12,34).\n if (/^-?\\d+(,\\d+)?([eE][+-]?\\d+)?$/.test(trimmed)) {\n return Number(trimmed.replace(\",\", \".\"));\n }\n\n return Number(value);\n}\n","/**\n * CSV Parser and Formatter - RFC 4180 compliant\n *\n * A lightweight, cross-platform CSV implementation that works in both\n * Node.js and Browser environments with zero dependencies.\n *\n * High-performance RFC 4180 compliant CSV parser and formatter.\n *\n * @see https://tools.ietf.org/html/rfc4180\n */\n\nimport { formatNumberForCsv, type DecimalSeparator } from \"@csv/csv-number\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Header array type (can include undefined to skip columns) */\nexport type HeaderArray = (string | undefined | null)[];\n\n/** Header transform function */\nexport type HeaderTransformFunction = (headers: string[]) => HeaderArray;\n\n/** Row types */\nexport type RowArray = string[];\nexport type RowMap = Record<string, string>;\nexport type Row = RowArray | RowMap;\n\n/** Row transform callback */\nexport type RowTransformCallback<T> = (error?: Error | null, row?: T | null) => void;\n\n/** Row transform function - sync or async */\nexport type RowTransformFunction<I = Row, O = Row> =\n | ((row: I) => O | null)\n | ((row: I, callback: RowTransformCallback<O>) => void);\n\n/** Row validate callback */\nexport type RowValidateCallback = (\n error?: Error | null,\n isValid?: boolean,\n reason?: string\n) => void;\n\n/** Row validate function - sync or async */\nexport type RowValidateFunction<T = Row> =\n | ((row: T) => boolean)\n | ((row: T, callback: RowValidateCallback) => void);\n\n/**\n * CSV parsing options\n */\nexport interface CsvParseOptions {\n /** Field delimiter (default: \",\") */\n delimiter?: string;\n /** Quote character (default: '\"'), set to false or null to disable quoting */\n quote?: string | false | null;\n /** Escape character for quotes (default: '\"'), set to false or null to disable */\n escape?: string | false | null;\n /** Skip empty lines (default: false) */\n skipEmptyLines?: boolean;\n /** Alias for skipEmptyLines */\n ignoreEmpty?: boolean;\n /** Trim whitespace from both sides of fields (default: false) */\n trim?: boolean;\n /** Left trim whitespace from fields (default: false) */\n ltrim?: boolean;\n /** Right trim whitespace from fields (default: false) */\n rtrim?: boolean;\n /**\n * Header handling:\n * - true: first row is headers, return objects\n * - false: no headers, return arrays\n * - string[]: use these as headers\n * - function: transform first row headers\n */\n headers?: boolean | HeaderArray | HeaderTransformFunction;\n /**\n * If true and headers is string[], discard first row and use provided headers\n */\n renameHeaders?: boolean;\n /** Comment character - lines starting with this are ignored */\n comment?: string;\n /**\n * Decimal separator used when parsing numbers from CSV (default: \".\").\n *\n * Note: core CSV parsing returns strings; number conversion is handled by higher-level\n * consumers (e.g. the default value mapper in the CSV module).\n *\n * @deprecated Use CsvReadOptions.valueMapperOptions.decimalSeparator instead.\n */\n decimalSeparator?: \".\" | \",\";\n /** Maximum number of data rows to parse (excluding header) */\n maxRows?: number;\n /** Number of lines to skip at the beginning (before header detection) */\n skipLines?: number;\n /** Number of data rows to skip (after header detection) */\n skipRows?: number;\n /**\n * Strict column handling:\n * - If true, rows with column count mismatch emit 'data-invalid' event\n * - If false (default), throws error on mismatch (unless discardUnmappedColumns)\n */\n strictColumnHandling?: boolean;\n /**\n * If true, discard columns that exceed header count\n * Only valid when headers are specified\n */\n discardUnmappedColumns?: boolean;\n /**\n * Enable object mode (default: true for Node.js streams)\n * - true: push row objects/arrays\n * - false: push JSON strings\n */\n objectMode?: boolean;\n /**\n * Character encoding for input (default: \"utf8\")\n * Only used in Node.js streaming context\n */\n encoding?: BufferEncoding;\n /**\n * Synchronous transform function to apply to each row after parsing\n * Return null/undefined to skip the row\n * Works in both Node.js and Browser environments\n *\n * @example\n * // With headers (row is Record<string, string>)\n * transform: (row) => ({ ...row, name: row.name.toUpperCase() })\n *\n * // Without headers (row is string[])\n * transform: (row) => [row[0].toUpperCase(), row[1]]\n */\n transform?: (row: Row) => Row | null | undefined;\n /**\n * Synchronous validate function to check each row\n * Return false to mark row as invalid (will be in invalidRows)\n * Can also return { isValid: boolean, reason?: string }\n * Works in both Node.js and Browser environments\n *\n * @example\n * // With headers\n * validate: (row) => row.name !== ''\n *\n * // With custom reason\n * validate: (row) => ({ isValid: row.age >= 18, reason: 'Must be adult' })\n */\n validate?: (row: Row) => boolean | { isValid: boolean; reason?: string };\n}\n\n/**\n * CSV formatting options\n */\nexport interface CsvFormatOptions {\n /** Field delimiter (default: \",\") */\n delimiter?: string;\n /** Quote character (default: '\"'), set to false or null to disable quoting */\n quote?: string | false | null;\n /** Escape character (default: same as quote) */\n escape?: string | false | null;\n /** Row delimiter (default: \"\\n\") */\n rowDelimiter?: string;\n /**\n * Decimal separator used when formatting numbers to CSV (default: \".\").\n * For European-style CSV, this is commonly \",\" (often together with delimiter \";\").\n */\n decimalSeparator?: \".\" | \",\";\n /** Always quote all fields (default: false, only quote when necessary) */\n alwaysQuote?: boolean;\n /** Quote specific columns by name or index */\n quoteColumns?: boolean | boolean[] | Record<string, boolean>;\n /** Quote header fields */\n quoteHeaders?: boolean | boolean[] | Record<string, boolean>;\n /**\n * Header handling:\n * - true: auto-detect headers from first object\n * - false/null: no headers\n * - string[]: use these as headers\n */\n headers?: string[] | boolean | null;\n /**\n * Whether to write headers (default: true when headers is provided)\n * Set to false to suppress header row output\n */\n writeHeaders?: boolean;\n /** Include BOM for UTF-8 (default: false) */\n writeBOM?: boolean;\n /** Include final row delimiter (default: true) */\n includeEndRowDelimiter?: boolean;\n /** Write headers even when there's no data (default: false) */\n alwaysWriteHeaders?: boolean;\n /**\n * Transform function to apply to each row before formatting\n * Can be sync (returns row) or async (calls callback)\n */\n transform?: RowTransformFunction<Row, Row>;\n /**\n * Enable object mode (default: true for Node.js streams)\n * - true: accept row objects/arrays directly\n * - false: accept JSON strings\n */\n objectMode?: boolean;\n}\n\n/**\n * Parsed CSV result with headers\n */\nexport interface CsvParseResult<T = string[]> {\n /** Header row (if headers option was true) */\n headers?: string[];\n /** Data rows */\n rows: T[];\n /** Invalid rows (when strictColumnHandling is true) */\n invalidRows?: { row: string[]; reason: string }[];\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Escape special regex characters\n */\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Check if a transform function is synchronous (1 argument) vs async (2 arguments)\n */\nexport function isSyncTransform<I, O>(\n transform: RowTransformFunction<I, O>\n): transform is (row: I) => O | null {\n return transform.length === 1;\n}\n\n/**\n * Check if a validate function is synchronous (1 argument) vs async (2 arguments)\n */\nexport function isSyncValidate<T>(\n validate: RowValidateFunction<T>\n): validate is (row: T) => boolean {\n return validate.length === 1;\n}\n\n/**\n * Check if headers are unique\n */\nfunction validateUniqueHeaders(headers: HeaderArray): void {\n const seen = new Set<string>();\n const duplicates: string[] = [];\n\n for (const header of headers) {\n if (header !== null && header !== undefined) {\n if (seen.has(header)) {\n duplicates.push(header);\n }\n seen.add(header);\n }\n }\n\n if (duplicates.length > 0) {\n throw new Error(`Duplicate headers found ${JSON.stringify(duplicates)}`);\n }\n}\n\n// =============================================================================\n// Parse Functions\n// =============================================================================\n\n/**\n * Parse a CSV string into rows of fields\n */\nexport function parseCsv(\n input: string,\n options: CsvParseOptions = {}\n): string[][] | CsvParseResult<Record<string, string>> {\n const {\n delimiter = \",\",\n quote: quoteOption = '\"',\n escape: escapeOption = '\"',\n skipEmptyLines = false,\n ignoreEmpty = false,\n trim = false,\n ltrim = false,\n rtrim = false,\n headers = false,\n renameHeaders = false,\n comment,\n maxRows,\n skipLines = 0,\n skipRows = 0,\n strictColumnHandling = false,\n discardUnmappedColumns = false,\n transform,\n validate\n } = options;\n\n const shouldSkipEmpty = skipEmptyLines || ignoreEmpty;\n\n // Handle quote: null/false to disable quoting\n const quoteEnabled = quoteOption !== null && quoteOption !== false;\n const quote = quoteEnabled ? String(quoteOption) : \"\";\n const escape = escapeOption !== null && escapeOption !== false ? String(escapeOption) : \"\";\n\n const rows: string[][] = [];\n const invalidRows: { row: string[]; reason: string }[] = [];\n let currentRow: string[] = [];\n let currentField = \"\";\n let inQuotes = false;\n let i = 0;\n let lineNumber = 0;\n let dataRowCount = 0;\n let skippedDataRows = 0;\n\n // Header handling\n let headerRow: HeaderArray | null = null;\n let headersLength = 0;\n let useHeaders = false;\n let headerRowProcessed = false;\n\n // Determine header mode\n if (headers === true) {\n useHeaders = true;\n } else if (Array.isArray(headers)) {\n headerRow = headers;\n headersLength = headers.filter(h => h !== null && h !== undefined).length;\n validateUniqueHeaders(headers);\n useHeaders = true;\n if (!renameHeaders) {\n headerRowProcessed = true; // We already have headers, don't wait for first row\n }\n } else if (typeof headers === \"function\") {\n useHeaders = true;\n }\n\n // Pre-compute trim function to avoid repeated condition checks\n const trimField =\n trim || (ltrim && rtrim)\n ? (s: string) => s.trim()\n : ltrim\n ? (s: string) => s.trimStart()\n : rtrim\n ? (s: string) => s.trimEnd()\n : (s: string) => s;\n\n const processRow = (row: string[]): boolean => {\n // If we have headers defined and this is the first data row (for headers: true)\n // or we need to validate headers from a function\n if (useHeaders && !headerRowProcessed) {\n // First row is headers\n if (typeof headers === \"function\") {\n const transformed = headers(row);\n validateUniqueHeaders(transformed);\n headerRow = transformed;\n } else if (!Array.isArray(headers)) {\n validateUniqueHeaders(row);\n headerRow = row;\n }\n headersLength = headerRow!.filter(h => h !== null && h !== undefined).length;\n headerRowProcessed = true;\n\n // If renameHeaders and custom headers provided, discard this row\n if (renameHeaders) {\n return false;\n }\n\n // For headers: true, don't add header row to data\n if (headers === true || typeof headers === \"function\") {\n return false;\n }\n\n return false;\n }\n\n // Skip data rows\n if (skippedDataRows < skipRows) {\n skippedDataRows++;\n return false;\n }\n\n // Column validation when using headers\n if (headerRow && headerRow.length > 0) {\n const expectedCols = headersLength;\n const actualCols = row.length;\n\n if (actualCols > expectedCols) {\n if (strictColumnHandling && !discardUnmappedColumns) {\n // Mark as invalid but continue\n invalidRows.push({\n row,\n reason: `Column header mismatch expected: ${expectedCols} columns got: ${actualCols}`\n });\n return false;\n } else {\n // Default: trim extra columns\n row.length = headerRow.length;\n }\n } else if (actualCols < expectedCols) {\n if (strictColumnHandling) {\n invalidRows.push({\n row,\n reason: `Column header mismatch expected: ${expectedCols} columns got: ${actualCols}`\n });\n return false;\n }\n // Pad with empty strings\n while (row.length < headerRow.length) {\n row.push(\"\");\n }\n }\n }\n\n return true;\n };\n\n const len = input.length;\n while (i < len) {\n const char = input[i];\n\n if (inQuotes && quoteEnabled) {\n // Inside quoted field\n if (escape && char === escape && input[i + 1] === quote) {\n // Escaped quote\n currentField += quote;\n i += 2;\n } else if (char === quote) {\n // End of quoted field\n inQuotes = false;\n i++;\n } else if (char === \"\\r\") {\n // Normalize CRLF to LF inside quoted fields\n if (input[i + 1] === \"\\n\") {\n i++; // Skip \\r, will add \\n on next iteration\n } else {\n currentField += \"\\n\"; // Convert standalone \\r to \\n\n i++;\n }\n } else {\n currentField += char;\n i++;\n }\n } else {\n // Outside quoted field\n if (quoteEnabled && char === quote && currentField === \"\") {\n // Start of quoted field\n inQuotes = true;\n i++;\n } else if (char === delimiter) {\n // Field separator\n currentRow.push(trimField(currentField));\n currentField = \"\";\n i++;\n } else if (char === \"\\n\" || char === \"\\r\") {\n // End of row - handle \\r\\n, \\r, and \\n\n if (char === \"\\r\" && input[i + 1] === \"\\n\") {\n i++; // Skip the \\n in \\r\\n\n }\n currentRow.push(trimField(currentField));\n currentField = \"\";\n\n lineNumber++;\n\n // Skip lines at beginning\n if (lineNumber <= skipLines) {\n currentRow = [];\n i++;\n continue;\n }\n\n // Skip comment lines\n if (comment && currentRow[0]?.startsWith(comment)) {\n currentRow = [];\n i++;\n continue;\n }\n\n // Skip empty lines\n const isEmpty = currentRow.length === 1 && currentRow[0] === \"\";\n if (shouldSkipEmpty && isEmpty) {\n currentRow = [];\n i++;\n continue;\n }\n\n // Process row (handles headers, validation)\n if (processRow(currentRow)) {\n rows.push(currentRow);\n dataRowCount++;\n }\n\n currentRow = [];\n i++;\n\n // Check max rows - after resetting currentRow\n if (maxRows !== undefined && dataRowCount >= maxRows) {\n break;\n }\n } else {\n currentField += char;\n i++;\n }\n }\n }\n\n // Handle last field/row\n if (currentField !== \"\" || currentRow.length > 0) {\n currentRow.push(trimField(currentField));\n\n // Skip lines at beginning\n if (lineNumber >= skipLines) {\n // Skip comment lines\n if (!(comment && currentRow[0]?.startsWith(comment))) {\n // Skip empty lines\n const isEmpty = currentRow.length === 1 && currentRow[0] === \"\";\n if (!(shouldSkipEmpty && isEmpty)) {\n if (!(maxRows !== undefined && dataRowCount >= maxRows)) {\n if (processRow(currentRow)) {\n rows.push(currentRow);\n }\n }\n }\n }\n }\n }\n\n // Convert to objects if headers enabled\n if (useHeaders && headerRow) {\n let dataRows = rows.map(row => {\n const obj: Record<string, string> = {};\n headerRow!.forEach((header, index) => {\n if (header !== null && header !== undefined) {\n obj[header] = row[index] ?? \"\";\n }\n });\n return obj;\n });\n\n // Apply transform if provided\n if (transform) {\n dataRows = dataRows\n .map(row => transform(row))\n .filter((row): row is Record<string, string> => row !== null && row !== undefined);\n }\n\n // Apply validate if provided\n if (validate) {\n const validatedRows: Record<string, string>[] = [];\n for (const row of dataRows) {\n const result = validate(row);\n if (typeof result === \"boolean\") {\n if (result) {\n validatedRows.push(row);\n } else {\n invalidRows.push({ row: Object.values(row), reason: \"Validation failed\" });\n }\n } else {\n if (result.isValid) {\n validatedRows.push(row);\n } else {\n invalidRows.push({\n row: Object.values(row),\n reason: result.reason || \"Validation failed\"\n });\n }\n }\n }\n dataRows = validatedRows;\n }\n\n if ((strictColumnHandling || validate) && invalidRows.length > 0) {\n return {\n headers: headerRow.filter((h): h is string => h !== null && h !== undefined),\n rows: dataRows,\n invalidRows\n };\n }\n\n return {\n headers: headerRow.filter((h): h is string => h !== null && h !== undefined),\n rows: dataRows\n };\n }\n\n // For array mode (no headers), apply transform and validate\n let resultRows: string[][] = rows;\n\n if (transform) {\n resultRows = resultRows\n .map(row => transform(row))\n .filter((row): row is string[] => row !== null && row !== undefined);\n }\n\n if (validate) {\n const validatedRows: string[][] = [];\n const arrayInvalidRows: { row: string[]; reason: string }[] = [];\n for (const row of resultRows) {\n const result = validate(row);\n if (typeof result === \"boolean\") {\n if (result) {\n validatedRows.push(row);\n } else {\n arrayInvalidRows.push({ row, reason: \"Validation failed\" });\n }\n } else {\n if (result.isValid) {\n validatedRows.push(row);\n } else {\n arrayInvalidRows.push({ row, reason: result.reason || \"Validation failed\" });\n }\n }\n }\n resultRows = validatedRows;\n\n if (arrayInvalidRows.length > 0) {\n return {\n rows: resultRows,\n invalidRows: arrayInvalidRows\n } as any; // Return with invalidRows for array mode too\n }\n }\n\n return resultRows;\n}\n\n// =============================================================================\n// Format Functions\n// =============================================================================\n\n/**\n * Format data as a CSV string\n */\nexport function formatCsv(\n data: (string | number | boolean | null | undefined)[][] | Record<string, any>[],\n options: CsvFormatOptions = {}\n): string {\n const {\n delimiter = \",\",\n quote: quoteOption = '\"',\n escape: escapeOption,\n rowDelimiter = \"\\n\",\n alwaysQuote = false,\n quoteColumns = false,\n quoteHeaders = false,\n headers,\n writeHeaders: writeHeadersOption,\n writeBOM = false,\n includeEndRowDelimiter = false,\n alwaysWriteHeaders = false,\n transform,\n decimalSeparator = \".\"\n } = options;\n\n // Determine if headers should be written (default: true when headers is provided)\n const shouldWriteHeaders = writeHeadersOption ?? true;\n\n // If quote is false or null, disable quoting entirely\n const quoteEnabled = quoteOption !== false && quoteOption !== null;\n const quote = quoteEnabled ? String(quoteOption) : \"\";\n const escape =\n escapeOption !== undefined && escapeOption !== false && escapeOption !== null\n ? String(escapeOption)\n : quote;\n\n // Pre-compile regex patterns for performance\n const needsQuoteRegex = quoteEnabled\n ? new RegExp(`[${escapeRegex(delimiter)}${escapeRegex(quote)}\\r\\n]`)\n : null;\n const escapeQuoteRegex = quoteEnabled ? new RegExp(escapeRegex(quote), \"g\") : null;\n const escapedQuote = escape + quote;\n\n const lines: string[] = [];\n\n const shouldQuoteColumn = (\n index: number,\n header?: string,\n isHeader: boolean = false\n ): boolean => {\n const quoteConfig = isHeader ? quoteHeaders : quoteColumns;\n\n if (typeof quoteConfig === \"boolean\") {\n return quoteConfig;\n }\n if (Array.isArray(quoteConfig)) {\n return quoteConfig[index] === true;\n }\n if (typeof quoteConfig === \"object\" && header) {\n return quoteConfig[header] === true;\n }\n return false;\n };\n\n const formatField = (\n value: any,\n index: number,\n header?: string,\n isHeader: boolean = false\n ): string => {\n if (value === null || value === undefined) {\n return \"\";\n }\n\n const str =\n typeof value === \"number\"\n ? formatNumberForCsv(value, decimalSeparator as DecimalSeparator)\n : String(value);\n\n // If quoting is disabled, return raw string\n if (!quoteEnabled) {\n return str;\n }\n\n // Check if quoting is needed\n const forceQuote = alwaysQuote || shouldQuoteColumn(index, header, isHeader);\n const needsQuote = forceQuote || needsQuoteRegex!.test(str);\n\n if (needsQuote) {\n // Escape quotes using pre-compiled regex\n const escaped = str.replace(escapeQuoteRegex!, escapedQuote);\n return quote + escaped + quote;\n }\n\n return str;\n };\n\n const formatRow = (row: any[], rowHeaders?: string[], isHeader: boolean = false): string => {\n return row\n .map((value, index) => formatField(value, index, rowHeaders?.[index], isHeader))\n .join(delimiter);\n };\n\n // Determine headers\n let keys: string[] | null = null;\n\n // Helper to apply transform if provided (sync only)\n const applyTransform = (row: any): any | null => {\n if (transform) {\n // Check if it's a sync transform (1 argument)\n if (transform.length === 1) {\n return (transform as (row: any) => any)(row);\n }\n // For async transform in sync context, just return the row unchanged\n // Async transforms should use streaming API\n return row;\n }\n return row;\n };\n\n // Handle array of objects\n if (data.length > 0 && !Array.isArray(data[0])) {\n const objects = data as Record<string, any>[];\n keys = headers === true ? Object.keys(objects[0]) : Array.isArray(headers) ? headers : null;\n\n if (keys && shouldWriteHeaders) {\n // Add header row\n lines.push(formatRow(keys, keys, true));\n }\n\n // Add data rows\n for (const obj of objects) {\n const transformedObj = applyTransform(obj);\n if (transformedObj === null || transformedObj === undefined) {\n continue; // Skip row if transform returns null\n }\n const row = keys ? keys.map(key => transformedObj[key]) : Object.values(transformedObj);\n lines.push(formatRow(row, keys ?? undefined));\n }\n } else if (data.length > 0) {\n // Handle 2D array with data\n const arrays = data as any[][];\n\n // Add custom headers if provided\n if (Array.isArray(headers)) {\n keys = headers;\n if (shouldWriteHeaders) {\n lines.push(formatRow(headers, headers, true));\n }\n }\n\n for (const row of arrays) {\n const transformedRow = applyTransform(row);\n if (transformedRow === null || transformedRow === undefined) {\n continue; // Skip row if transform returns null\n }\n lines.push(formatRow(transformedRow, keys ?? undefined));\n }\n } else if (alwaysWriteHeaders && Array.isArray(headers) && shouldWriteHeaders) {\n // Handle empty data with alwaysWriteHeaders\n lines.push(formatRow(headers, headers, true));\n }\n\n let result = lines.join(rowDelimiter);\n\n // Add trailing row delimiter\n if (result.length > 0 && includeEndRowDelimiter) {\n result += rowDelimiter;\n }\n\n // Add BOM for UTF-8\n if (writeBOM) {\n result = \"\\uFEFF\" + result;\n }\n\n return result;\n}\n\n// =============================================================================\n// Streaming Parser\n// =============================================================================\n\n/**\n * Async CSV parser that yields rows one at a time\n */\nexport async function* parseCsvStream(\n input: string | AsyncIterable<string>,\n options: CsvParseOptions = {}\n): AsyncGenerator<string[] | Record<string, string>, void, unknown> {\n const {\n delimiter = \",\",\n quote: quoteOption = '\"',\n escape: escapeOption = '\"',\n skipEmptyLines = false,\n ignoreEmpty = false,\n trim = false,\n ltrim = false,\n rtrim = false,\n headers = false,\n renameHeaders = false,\n comment,\n maxRows,\n skipLines = 0,\n skipRows = 0,\n strictColumnHandling = false,\n discardUnmappedColumns = false\n } = options;\n\n const shouldSkipEmpty = skipEmptyLines || ignoreEmpty;\n\n // Handle quote: null/false to disable quoting\n const quoteEnabled = quoteOption !== null && quoteOption !== false;\n const quote = quoteEnabled ? String(quoteOption) : \"\";\n const escape = escapeOption !== null && escapeOption !== false ? String(escapeOption) : \"\";\n\n let headerRow: HeaderArray | null = null;\n let headersLength = 0;\n let useHeaders = false;\n let headerRowProcessed = false;\n let buffer = \"\";\n let currentRow: string[] = [];\n let currentField = \"\";\n let inQuotes = false;\n let lineNumber = 0;\n let dataRowCount = 0;\n let skippedDataRows = 0;\n\n // Determine header mode\n if (headers === true) {\n useHeaders = true;\n } else if (Array.isArray(headers)) {\n headerRow = headers;\n headersLength = headers.filter(h => h !== null && h !== undefined).length;\n validateUniqueHeaders(headers);\n useHeaders = true;\n if (!renameHeaders) {\n headerRowProcessed = true;\n }\n } else if (typeof headers === \"function\") {\n useHeaders = true;\n }\n\n // Pre-compute trim function to avoid repeated condition checks\n const trimField =\n trim || (ltrim && rtrim)\n ? (s: string) => s.trim()\n : ltrim\n ? (s: string) => s.trimStart()\n : rtrim\n ? (s: string) => s.trimEnd()\n : (s: string) => s;\n\n const processRow = (\n row: string[]\n ): { valid: boolean; row: string[] | Record<string, string> | null } => {\n // Header handling\n if (useHeaders && !headerRowProcessed) {\n if (typeof headers === \"function\") {\n const transformed = headers(row);\n validateUniqueHeaders(transformed);\n headerRow = transformed;\n } else if (!Array.isArray(headers)) {\n validateUniqueHeaders(row);\n headerRow = row;\n }\n headersLength = headerRow!.filter(h => h !== null && h !== undefined).length;\n headerRowProcessed = true;\n\n if (renameHeaders) {\n return { valid: false, row: null };\n }\n if (headers === true || typeof headers === \"function\") {\n return { valid: false, row: null };\n }\n return { valid: false, row: null };\n }\n\n // Skip data rows\n if (skippedDataRows < skipRows) {\n skippedDataRows++;\n return { valid: false, row: null };\n }\n\n // Column validation\n if (headerRow && headerRow.length > 0) {\n const expectedCols = headersLength;\n const actualCols = row.length;\n\n if (actualCols > expectedCols) {\n if (strictColumnHandling && !discardUnmappedColumns) {\n return { valid: false, row: null };\n } else {\n // Default: trim extra columns\n row.length = headerRow.length;\n }\n } else if (actualCols < expectedCols) {\n if (strictColumnHandling) {\n return { valid: false, row: null };\n }\n while (row.length < headerRow.length) {\n row.push(\"\");\n }\n }\n }\n\n // Convert to object if using headers\n if (useHeaders && headerRow) {\n const obj: Record<string, string> = {};\n headerRow.forEach((header, index) => {\n if (header !== null && header !== undefined) {\n obj[header] = row[index] ?? \"\";\n }\n });\n return { valid: true, row: obj };\n }\n\n return { valid: true, row };\n };\n\n const processBuffer = function* (): Generator<string[] | Record<string, string>> {\n let i = 0;\n const len = buffer.length;\n\n while (i < len) {\n const char = buffer[i];\n\n if (inQuotes && quoteEnabled) {\n if (escape && char === escape && buffer[i + 1] === quote) {\n currentField += quote;\n i += 2;\n } else if (char === quote) {\n inQuotes = false;\n i++;\n } else if (i === len - 1) {\n // Need more data for quoted field\n buffer = buffer.slice(i);\n return;\n } else if (char === \"\\r\") {\n // Normalize CRLF to LF inside quoted fields\n if (buffer[i + 1] === \"\\n\") {\n i++; // Skip \\r, will add \\n on next iteration\n } else {\n currentField += \"\\n\"; // Convert standalone \\r to \\n\n i++;\n }\n } else {\n currentField += char;\n i++;\n }\n } else {\n if (quoteEnabled && char === quote && currentField === \"\") {\n inQuotes = true;\n i++;\n } else if (char === delimiter) {\n currentRow.push(trimField(currentField));\n currentField = \"\";\n i++;\n } else if (char === \"\\n\" || char === \"\\r\") {\n if (char === \"\\r\" && buffer[i + 1] === \"\\n\") {\n i++;\n }\n\n currentRow.push(trimField(currentField));\n currentField = \"\";\n lineNumber++;\n\n if (lineNumber <= skipLines) {\n currentRow = [];\n i++;\n continue;\n }\n\n if (comment && currentRow[0]?.startsWith(comment)) {\n currentRow = [];\n i++;\n continue;\n }\n\n const isEmpty = currentRow.length === 1 && currentRow[0] === \"\";\n if (shouldSkipEmpty && isEmpty) {\n currentRow = [];\n i++;\n continue;\n }\n\n const result = processRow(currentRow);\n if (result.valid && result.row) {\n dataRowCount++;\n\n if (maxRows !== undefined && dataRowCount > maxRows) {\n return;\n }\n\n yield result.row;\n }\n\n currentRow = [];\n i++;\n } else {\n currentField += char;\n i++;\n }\n }\n }\n\n buffer = \"\";\n };\n\n // Handle string input\n if (typeof input === \"string\") {\n buffer = input;\n yield* processBuffer();\n\n // Handle last row\n if (currentField !== \"\" || currentRow.length > 0) {\n currentRow.push(trimField(currentField));\n\n if (!(maxRows !== undefined && dataRowCount >= maxRows)) {\n const result = processRow(currentRow);\n if (result.valid && result.row) {\n yield result.row;\n }\n }\n }\n return;\n }\n\n // Handle async iterable\n for await (const chunk of input) {\n buffer += chunk;\n yield* processBuffer();\n }\n\n // Handle last row\n if (currentField !== \"\" || currentRow.length > 0) {\n currentRow.push(trimField(currentField));\n\n if (!(maxRows !== undefined && dataRowCount >= maxRows)) {\n const result = processRow(currentRow);\n if (result.valid && result.row) {\n yield result.row;\n }\n }\n }\n}\n","/**\n * CSV Streaming Support - Cross-Platform\n *\n * Provides true streaming CSV parsing and formatting using our cross-platform stream module.\n * Works identically in both Node.js and Browser environments.\n */\n\nimport { Transform } from \"@stream\";\nimport type { IReadable } from \"@stream/types\";\nimport type {\n CsvParseOptions,\n CsvFormatOptions,\n RowTransformFunction,\n RowValidateFunction,\n Row,\n RowTransformCallback,\n RowValidateCallback\n} from \"@csv/csv-core\";\nimport { isSyncTransform, isSyncValidate } from \"@csv/csv-core\";\nimport { formatNumberForCsv } from \"@csv/csv-number\";\n\n/**\n * Transform stream that parses CSV data row by row\n *\n * @example\n * ```ts\n * const parser = new CsvParserStream({ headers: true });\n * readable.pipe(parser).on('data', (row) => console.log(row));\n * ```\n */\nexport class CsvParserStream extends Transform {\n private options: CsvParseOptions;\n private buffer: string = \"\";\n private currentRow: string[] = [];\n private currentField: string = \"\";\n private currentFieldParts: string[] | null = null;\n private currentFieldLength: number = 0;\n private inQuotes: boolean = false;\n private lineNumber: number = 0;\n private rowCount: number = 0;\n private skippedDataRows: number = 0;\n private headerRow: string[] | null = null;\n private headersEmitted: boolean = false;\n private delimiter: string;\n private quote: string;\n private escape: string;\n private quoteEnabled: boolean;\n private trimField: (s: string) => string;\n private decoder: TextDecoder;\n private _rowTransform: ((row: Row, cb: RowTransformCallback<Row>) => void) | null = null;\n private _rowValidator: ((row: Row, cb: RowValidateCallback) => void) | null = null;\n\n constructor(options: CsvParseOptions = {}) {\n super({ objectMode: options.objectMode !== false });\n this.options = options;\n\n // Reuse a single decoder instance and enable streaming decode to correctly handle\n // multi-byte characters split across chunks.\n this.decoder = new TextDecoder();\n\n const quoteOption = options.quote ?? '\"';\n this.quoteEnabled = quoteOption !== null && quoteOption !== false;\n this.quote = this.quoteEnabled ? String(quoteOption) : \"\";\n\n const escapeOption = options.escape ?? '\"';\n this.escape =\n escapeOption !== null && escapeOption !== false ? String(escapeOption) : this.quote;\n\n this.delimiter = options.delimiter ?? \",\";\n\n // Pre-compute trim function for performance\n const { trim = false, ltrim = false, rtrim = false } = options;\n this.trimField =\n trim || (ltrim && rtrim)\n ? (s: string) => s.trim()\n : ltrim\n ? (s: string) => s.trimStart()\n : rtrim\n ? (s: string) => s.trimEnd()\n : (s: string) => s;\n }\n\n /**\n * Set a transform function to modify rows before emitting\n * Supports both sync and async transforms\n */\n transform<I extends Row = Row, O extends Row = Row>(\n transformFunction: RowTransformFunction<I, O>\n ): this {\n if (typeof transformFunction !== \"function\") {\n throw new TypeError(\"The transform should be a function\");\n }\n\n if (isSyncTransform(transformFunction)) {\n this._rowTransform = (row: Row, cb: RowTransformCallback<Row>): void => {\n try {\n const result = transformFunction(row as I);\n cb(null, result as Row);\n } catch (e) {\n cb(e as Error);\n }\n };\n } else {\n this._rowTransform = transformFunction as (row: Row, cb: RowTransformCallback<Row>) => void;\n }\n return this;\n }\n\n /**\n * Set a validate function to filter rows\n * Invalid rows emit 'data-invalid' event\n */\n validate<T extends Row = Row>(validateFunction: RowValidateFunction<T>): this {\n if (typeof validateFunction !== \"function\") {\n throw new TypeError(\"The validate should be a function\");\n }\n\n if (isSyncValidate(validateFunction)) {\n this._rowValidator = (row: Row, cb: RowValidateCallback): void => {\n try {\n const isValid = validateFunction(row as T);\n cb(null, isValid);\n } catch (e) {\n cb(e as Error);\n }\n };\n } else {\n this._rowValidator = validateFunction as (row: Row, cb: RowValidateCallback) => void;\n }\n return this;\n }\n\n override _transform(\n chunk: Uint8Array | string,\n _encoding: string,\n callback: (error?: Error | null, data?: Row) => void\n ): void {\n try {\n const data = typeof chunk === \"string\" ? chunk : this.decoder.decode(chunk, { stream: true });\n this.buffer += data;\n this.processBuffer(callback);\n } catch (error) {\n callback(error as Error);\n }\n }\n\n override _flush(callback: (error?: Error | null) => void): void {\n try {\n const remainingDecoded = this.decoder.decode();\n if (remainingDecoded) {\n this.buffer += remainingDecoded;\n }\n\n if (this.buffer) {\n this.processBuffer(err => {\n if (err) {\n callback(err);\n return;\n }\n this.flushCurrentRow(callback);\n });\n return;\n }\n\n this.flushCurrentRow(callback);\n } catch (error) {\n callback(error as Error);\n }\n }\n\n private flushCurrentRow(callback: (error?: Error | null) => void): void {\n // Process any remaining data without a trailing newline.\n if (this.currentFieldLength !== 0 || this.currentRow.length > 0) {\n this.currentRow.push(this.trimField(this.takeCurrentField()));\n this.emitRow(callback);\n return;\n }\n callback();\n }\n\n private appendToField(text: string): void {\n if (text.length === 0) {\n return;\n }\n\n const nextLength = this.currentFieldLength + text.length;\n\n // For small fields, string concatenation is fast enough.\n // For very large fields, switch to chunk accumulation to avoid pathological O(n^2) behavior.\n const LARGE_FIELD_THRESHOLD = 1024;\n if (!this.currentFieldParts && nextLength <= LARGE_FIELD_THRESHOLD) {\n this.currentField += text;\n this.currentFieldLength = nextLength;\n return;\n }\n\n if (!this.currentFieldParts) {\n this.currentFieldParts = this.currentFieldLength === 0 ? [text] : [this.currentField, text];\n this.currentField = \"\";\n this.currentFieldLength = nextLength;\n return;\n }\n\n this.currentFieldParts.push(text);\n this.currentFieldLength = nextLength;\n }\n\n private takeCurrentField(): string {\n if (this.currentFieldLength === 0) {\n return \"\";\n }\n\n const value = this.currentFieldParts ? this.currentFieldParts.join(\"\") : this.currentField;\n this.currentField = \"\";\n this.currentFieldParts = null;\n this.currentFieldLength = 0;\n return value;\n }\n\n private processBuffer(callback: (error?: Error | null) => void): void {\n const {\n skipEmptyLines = false,\n ignoreEmpty = false,\n headers = false,\n renameHeaders = false,\n comment,\n maxRows,\n skipLines = 0,\n skipRows = 0,\n strictColumnHandling = false,\n discardUnmappedColumns = false\n } = this.options;\n\n const shouldSkipEmpty = skipEmptyLines || ignoreEmpty;\n let i = 0;\n const len = this.buffer.length;\n const pendingRows: Row[] = [];\n\n while (i < len) {\n const char = this.buffer[i];\n\n if (this.inQuotes && this.quoteEnabled) {\n if (this.escape && char === this.escape && this.buffer[i + 1] === this.quote) {\n this.appendToField(this.quote);\n i += 2;\n } else if (char === this.quote) {\n this.inQuotes = false;\n i++;\n } else if (i === len - 1) {\n // Need more data - preserve buffer from current position\n this.buffer = this.buffer.slice(i);\n this.processPendingRows(pendingRows, callback);\n return;\n } else if (char === \"\\r\") {\n // Normalize CRLF to LF inside quoted fields\n if (this.buffer[i + 1] === \"\\n\") {\n i++; // Skip \\r, will add \\n on next iteration\n } else {\n this.appendToField(\"\\n\"); // Convert standalone \\r to \\n\n i++;\n }\n } else {\n this.appendToField(char);\n i++;\n }\n } else {\n if (this.quoteEnabled && char === this.quote && this.currentFieldLength === 0) {\n this.inQuotes = true;\n i++;\n } else if (char === this.delimiter) {\n this.currentRow.push(this.trimField(this.takeCurrentField()));\n i++;\n } else if (char === \"\\n\" || char === \"\\r\") {\n // Handle \\r\\n\n if (char === \"\\r\" && this.buffer[i + 1] === \"\\n\") {\n i++;\n }\n\n this.currentRow.push(this.trimField(this.takeCurrentField()));\n this.lineNumber++;\n\n // Skip lines at beginning\n if (this.lineNumber <= skipLines) {\n this.currentRow = [];\n i++;\n continue;\n }\n\n // Skip comment lines\n if (comment && this.currentRow[0]?.startsWith(comment)) {\n this.currentRow = [];\n i++;\n continue;\n }\n\n // Skip empty lines\n const isEmpty = this.currentRow.length === 1 && this.currentRow[0] === \"\";\n if (shouldSkipEmpty && isEmpty) {\n this.currentRow = [];\n i++;\n continue;\n }\n\n // Handle headers\n if (\n (headers === true ||\n typeof headers === \"function\" ||\n (Array.isArray(headers) && renameHeaders)) &&\n this.headerRow === null\n ) {\n if (typeof headers === \"function\") {\n const transformed = headers(this.currentRow);\n this.headerRow = transformed.filter((h): h is string => h != null);\n } else if (Array.isArray(headers) && renameHeaders) {\n // Discard first row, use provided headers\n this.headerRow = headers.filter((h): h is string => h != null);\n } else {\n this.headerRow = this.currentRow;\n }\n // Emit headers event\n if (!this.headersEmitted) {\n this.headersEmitted = true;\n this.emit(\"headers\", this.headerRow);\n }\n this.currentRow = [];\n i++;\n continue;\n }\n\n // Use provided headers array directly if no renameHeaders\n if (Array.isArray(headers) && !renameHeaders && this.headerRow === null) {\n this.headerRow = headers.filter((h): h is string => h != null);\n // Emit headers event for provided headers\n if (!this.headersEmitted) {\n this.headersEmitted = true;\n this.emit(\"headers\", this.headerRow);\n }\n }\n\n // Skip data rows\n if (this.skippedDataRows < skipRows) {\n this.skippedDataRows++;\n this.currentRow = [];\n i++;\n continue;\n }\n\n // Column validation\n if (this.headerRow && this.headerRow.length > 0) {\n const expectedCols = this.headerRow.length;\n const actualCols = this.currentRow.length;\n\n if (actualCols > expectedCols) {\n if (strictColumnHandling && !discardUnmappedColumns) {\n // Emit data-invalid event\n this.emit(\n \"data-invalid\",\n this.currentRow,\n `Column mismatch: expected ${expectedCols}, got ${actualCols}`\n );\n this.currentRow = [];\n i++;\n continue;\n } else {\n // Discard extra columns\n this.currentRow.length = expectedCols;\n }\n } else if (actualCols < expectedCols) {\n if (strictColumnHandling) {\n this.emit(\n \"data-invalid\",\n this.currentRow,\n `Column mismatch: expected ${expectedCols}, got ${actualCols}`\n );\n this.currentRow = [];\n i++;\n continue;\n }\n // Pad with empty strings\n while (this.currentRow.length < expectedCols) {\n this.currentRow.push(\"\");\n }\n }\n }\n\n this.rowCount++;\n\n // Check max rows\n if (maxRows !== undefined && this.rowCount > maxRows) {\n this.buffer = \"\";\n this.processPendingRows(pendingRows, callback);\n return;\n }\n\n // Queue this row for emission\n const rowToEmit = this.currentRow;\n this.currentRow = [];\n pendingRows.push(this.buildRow(rowToEmit));\n i++;\n } else {\n this.appendToField(char);\n i++;\n }\n }\n }\n\n this.buffer = \"\";\n this.processPendingRows(pendingRows, callback);\n }\n\n private buildRow(rawRow: string[]): Row {\n if (this.options.headers && this.headerRow) {\n const obj: Record<string, string> = {};\n for (let index = 0; index < this.headerRow.length; index++) {\n const header = this.headerRow[index];\n obj[header] = rawRow[index] ?? \"\";\n }\n return obj;\n }\n return rawRow;\n }\n\n private processPendingRows(rows: Row[], callback: (error?: Error | null) => void): void {\n if (rows.length === 0) {\n callback();\n return;\n }\n\n let index = 0;\n const processNext = (): void => {\n if (index >= rows.length) {\n callback();\n return;\n }\n\n const row = rows[index];\n index++;\n\n this.transformAndValidateRow(row, (err, result) => {\n if (err) {\n callback(err);\n return;\n }\n\n if (result && result.isValid && result.row !== null) {\n // Push the row (respect objectMode)\n if (this.options.objectMode === false) {\n this.push(JSON.stringify(result.row));\n } else {\n this.push(result.row);\n }\n } else if (result && !result.isValid) {\n this.emit(\"data-invalid\", result.row, result.reason);\n }\n\n // Use setTimeout to prevent stack overflow for large datasets\n if (index % 1000 === 0) {\n setTimeout(processNext, 0);\n } else {\n processNext();\n }\n });\n };\n\n processNext();\n }\n\n private transformAndValidateRow(\n row: Row,\n callback: (\n err: Error | null,\n result?: { row: Row | null; isValid: boolean; reason?: string }\n ) => void\n ): void {\n // First apply transform\n if (this._rowTransform) {\n this._rowTransform(row, (transformErr, transformedRow) => {\n if (transformErr) {\n callback(transformErr);\n return;\n }\n\n if (transformedRow === null || transformedRow === undefined) {\n callback(null, { row: null, isValid: true });\n return;\n }\n\n // Then validate\n this.validateRow(transformedRow, callback);\n });\n } else {\n this.validateRow(row, callback);\n }\n }\n\n private validateRow(\n row: Row,\n callback: (\n err: Error | null,\n result?: { row: Row | null; isValid: boolean; reason?: string }\n ) => void\n ): void {\n if (this._rowValidator) {\n this._rowValidator(row, (validateErr, isValid, reason) => {\n if (validateErr) {\n callback(validateErr);\n return;\n }\n\n callback(null, { row, isValid: isValid ?? false, reason });\n });\n } else {\n callback(null, { row, isValid: true });\n }\n }\n\n private emitRow(callback?: (error?: Error | null) => void): void {\n const row = this.buildRow(this.currentRow);\n this.transformAndValidateRow(row, (err, result) => {\n if (err) {\n if (callback) {\n callback(err);\n }\n return;\n }\n\n if (result && result.isValid && result.row !== null) {\n if (this.options.objectMode === false) {\n this.push(JSON.stringify(result.row));\n } else {\n this.push(result.row);\n }\n } else if (result && !result.isValid) {\n this.emit(\"data-invalid\", result.row, result.reason);\n }\n\n if (callback) {\n callback();\n }\n });\n }\n}\n\n/**\n * Options for CSV formatter stream\n */\nexport interface CsvFormatterStreamOptions extends CsvFormatOptions {\n /** Whether input is objects (vs arrays) */\n objectMode?: boolean;\n}\n\n/**\n * Transform stream that formats rows to CSV\n *\n * @example\n * ```ts\n * const formatter = new CsvFormatterStream({ headers: ['name', 'age'] });\n * formatter.pipe(writable);\n * formatter.write(['Alice', 30]);\n * formatter.write(['Bob', 25]);\n * formatter.end();\n * ```\n */\nexport class CsvFormatterStream extends Transform {\n private options: CsvFormatterStreamOptions;\n private delimiter: string;\n private quote: string;\n private escape: string;\n private rowDelimiter: string;\n private quoteEnabled: boolean;\n private alwaysQuote: boolean;\n private decimalSeparator: \".\" | \",\";\n private headerWritten: boolean = false;\n private headers: string[] | null = null;\n private shouldWriteHeaders: boolean;\n private rowCount: number = 0;\n private _rowTransform: ((row: Row, cb: RowTransformCallback<Row>) => void) | null = null;\n // Pre-compiled regex for quote escaping\n private escapeQuoteRegex: RegExp | null = null;\n private escapedQuote: string = \"\";\n\n constructor(options: CsvFormatterStreamOptions = {}) {\n super({\n objectMode: options.objectMode !== false,\n writableObjectMode: options.objectMode !== false\n });\n this.options = options;\n\n const quoteOption = options.quote ?? '\"';\n this.quoteEnabled = quoteOption !== null && quoteOption !== false;\n this.quote = this.quoteEnabled ? String(quoteOption) : \"\";\n\n const escapeOption = options.escape;\n this.escape =\n escapeOption !== undefined && escapeOption !== null && escapeOption !== false\n ? String(escapeOption)\n : this.quote;\n\n this.delimiter = options.delimiter ?? \",\";\n this.rowDelimiter = options.rowDelimiter ?? \"\\n\";\n this.alwaysQuote = options.alwaysQuote ?? false;\n this.decimalSeparator = options.decimalSeparator ?? \".\";\n // writeHeaders defaults to true when headers is provided\n this.shouldWriteHeaders = options.writeHeaders ?? true;\n\n // Pre-compile regex for performance\n if (this.quoteEnabled) {\n this.escapeQuoteRegex = new RegExp(escapeRegex(this.quote), \"g\");\n this.escapedQuote = this.escape + this.quote;\n }\n\n if (Array.isArray(options.headers)) {\n this.headers = options.headers;\n }\n\n // Set up transform from options\n if (options.transform) {\n this.transform(options.transform);\n }\n }\n\n /**\n * Set a transform function to modify rows before formatting\n */\n transform<I extends Row = Row, O extends Row = Row>(\n transformFunction: RowTransformFunction<I, O>\n ): this {\n if (typeof transformFunction !== \"function\") {\n throw new TypeError(\"The transform should be a function\");\n }\n\n if (isSyncTransform(transformFunction)) {\n this._rowTransform = (row: Row, cb: RowTransformCallback<Row>): void => {\n try {\n const result = transformFunction(row as I);\n cb(null, result as Row);\n } catch (e) {\n cb(e as Error);\n }\n };\n } else {\n this._rowTransform = transformFunction as (row: Row, cb: RowTransformCallback<Row>) => void;\n }\n return this;\n }\n\n override _transform(\n chunk: Row,\n _encoding: string,\n callback: (error?: Error | null, data?: string) => void\n ): void {\n try {\n // Write BOM if first chunk\n if (!this.headerWritten && this.options.writeBOM) {\n this.push(\"\\uFEFF\");\n }\n\n // Write headers if needed\n if (!this.headerWritten && this.headers && this.shouldWriteHeaders) {\n this.push(this.formatRow(this.headers, true));\n this.headerWritten = true;\n } else if (\n !this.headerWritten &&\n this.options.headers === true &&\n !Array.isArray(chunk) &&\n this.shouldWriteHeaders\n ) {\n // Auto-detect headers from first object\n this.headers = Object.keys(chunk);\n this.push(this.formatRow(this.headers, true));\n this.headerWritten = true;\n } else if (!this.headerWritten) {\n // Mark header as \"written\" even if we skip it (to handle subsequent rows)\n if (this.options.headers === true && !Array.isArray(chunk)) {\n this.headers = Object.keys(chunk);\n }\n this.headerWritten = true;\n }\n\n // Apply transform if set\n if (this._rowTransform) {\n this._rowTransform(chunk, (err, transformedRow) => {\n if (err) {\n callback(err);\n return;\n }\n\n if (transformedRow === null || transformedRow === undefined) {\n callback();\n return;\n }\n\n this.formatAndPush(transformedRow);\n callback();\n });\n } else {\n this.formatAndPush(chunk);\n callback();\n }\n } catch (error) {\n callback(error as Error);\n }\n }\n\n override _flush(callback: (error?: Error | null) => void): void {\n // Handle alwaysWriteHeaders with no data\n if (\n !this.headerWritten &&\n this.options.alwaysWriteHeaders &&\n this.headers &&\n this.shouldWriteHeaders\n ) {\n if (this.options.writeBOM) {\n this.push(\"\\uFEFF\");\n }\n this.push(this.formatRow(this.headers, true));\n this.headerWritten = true;\n }\n\n // Add trailing row delimiter if includeEndRowDelimiter is true\n if (this.options.includeEndRowDelimiter && this.rowCount > 0) {\n this.push(this.rowDelimiter);\n }\n\n callback();\n }\n\n private formatAndPush(chunk: Row): void {\n let row: unknown[];\n if (Array.isArray(chunk)) {\n row = chunk;\n } else if (typeof chunk === \"object\" && chunk !== null) {\n row = this.headers\n ? this.headers.map(h => (chunk as Record<string, unknown>)[h])\n : Object.values(chunk);\n } else {\n row = [chunk];\n }\n\n this.push(this.formatRow(row, false));\n }\n\n private formatRow(row: unknown[], isHeader: boolean = false): string {\n const { quoteColumns, quoteHeaders } = this.options;\n const quoteConfig = isHeader ? quoteHeaders : quoteColumns;\n\n const fields = row.map((field, index) => {\n const headerName = this.headers?.[index];\n const shouldForceQuote = this.shouldQuoteField(index, headerName, quoteConfig);\n return this.formatField(field, shouldForceQuote);\n });\n\n const formattedRow = fields.join(this.delimiter);\n\n // Use row delimiter as prefix (except for first row)\n // rowDelimiter separates rows, no trailing delimiter by default\n if (this.rowCount === 0) {\n this.rowCount++;\n return formattedRow;\n }\n\n this.rowCount++;\n return this.rowDelimiter + formattedRow;\n }\n\n private shouldQuoteField(\n index: number,\n header: string | undefined,\n quoteConfig: boolean | boolean[] | Record<string, boolean> | undefined\n ): boolean {\n if (quoteConfig === true) {\n return true;\n }\n if (quoteConfig === false || quoteConfig === undefined) {\n return false;\n }\n if (Array.isArray(quoteConfig)) {\n return quoteConfig[index] === true;\n }\n if (typeof quoteConfig === \"object\" && header) {\n return quoteConfig[header] === true;\n }\n return false;\n }\n\n private formatField(value: unknown, forceQuote: boolean = false): string {\n if (value === null || value === undefined) {\n return \"\";\n }\n\n const str =\n typeof value === \"number\" ? formatNumberForCsv(value, this.decimalSeparator) : String(value);\n\n if (!this.quoteEnabled) {\n return str;\n }\n\n // Check if quoting is needed\n const needsQuote =\n this.alwaysQuote ||\n forceQuote ||\n str.includes(this.delimiter) ||\n str.includes(this.quote) ||\n str.includes(\"\\r\") ||\n str.includes(\"\\n\");\n\n if (needsQuote) {\n // Use pre-compiled regex for escaping\n const escaped = str.replace(this.escapeQuoteRegex!, this.escapedQuote);\n return this.quote + escaped + this.quote;\n }\n\n return str;\n }\n}\n\n/**\n * Escape special regex characters\n */\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Create a readable stream from an array of rows\n */\nexport function createCsvReadableStream(\n rows: unknown[][],\n options: CsvFormatOptions = {}\n): IReadable<any> {\n const formatter = new CsvFormatterStream(options);\n\n // Use setTimeout to allow piping before data flows\n setTimeout(() => {\n for (const row of rows) {\n formatter.write(row);\n }\n formatter.end();\n }, 0);\n\n return formatter;\n}\n\n/**\n * Create parser stream factory\n */\nexport function createCsvParserStream(options: CsvParseOptions = {}): CsvParserStream {\n return new CsvParserStream(options);\n}\n\n/**\n * Create formatter stream factory\n */\nexport function createCsvFormatterStream(\n options: CsvFormatterStreamOptions = {}\n): CsvFormatterStream {\n return new CsvFormatterStream(options);\n}\n","/**\n * CSV class - Cross-Platform Base Implementation\n *\n * Provides CSV read/write functionality for both Node.js and Browser.\n * Node.js version (csv.ts) extends this with file system support.\n */\n\nimport { DateParser, DateFormatter, type DateFormat } from \"@utils/datetime\";\nimport { parseCsv, formatCsv, type CsvParseOptions, type CsvFormatOptions } from \"@csv/csv-core\";\nimport { CsvParserStream, CsvFormatterStream, type CsvFormatterStreamOptions } from \"@csv/csv-stream\";\nimport { parseNumberFromCsv, type DecimalSeparator } from \"@csv/csv-number\";\nimport { pipeline } from \"@stream\";\nimport type { IReadable, IWritable } from \"@stream/types\";\nimport type { Workbook } from \"@excel/workbook\";\nimport type { Worksheet } from \"@excel/worksheet\";\nimport type { CellErrorValue } from \"@excel/types\";\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst DEFAULT_DATE_FORMATS: readonly DateFormat[] = [\n \"YYYY-MM-DD[T]HH:mm:ssZ\",\n \"YYYY-MM-DD[T]HH:mm:ss\",\n \"MM-DD-YYYY\",\n \"YYYY-MM-DD\"\n];\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface CsvReadOptions {\n dateFormats?: readonly DateFormat[];\n map?(value: any, index: number): any;\n sheetName?: string;\n parserOptions?: Partial<CsvParseOptions>;\n /** Options for the default value mapper (string -> number/date/etc). */\n valueMapperOptions?: DefaultValueMapperOptions;\n}\n\nexport interface CsvWriteOptions {\n dateFormat?: string;\n dateUTC?: boolean;\n sheetName?: string;\n sheetId?: number;\n encoding?: string;\n map?(value: any, index: number): any;\n includeEmptyRows?: boolean;\n formatterOptions?: Partial<CsvFormatOptions>;\n}\n\nexport interface CsvStreamReadOptions extends CsvReadOptions {\n highWaterMark?: number;\n}\n\nexport interface CsvStreamWriteOptions extends CsvWriteOptions {\n highWaterMark?: number;\n}\n\n// =============================================================================\n// Value Mappers\n// =============================================================================\n\nconst SpecialValues: Record<string, boolean | CellErrorValue> = {\n true: true,\n false: false,\n \"#N/A\": { error: \"#N/A\" },\n \"#REF!\": { error: \"#REF!\" },\n \"#NAME?\": { error: \"#NAME?\" },\n \"#DIV/0!\": { error: \"#DIV/0!\" },\n \"#NULL!\": { error: \"#NULL!\" },\n \"#VALUE!\": { error: \"#VALUE!\" },\n \"#NUM!\": { error: \"#NUM!\" }\n};\n\nexport interface DefaultValueMapperOptions {\n decimalSeparator?: DecimalSeparator;\n}\n\nexport function createDefaultValueMapper(\n dateFormats: readonly DateFormat[],\n options?: DefaultValueMapperOptions\n) {\n const dateParser = DateParser.create(dateFormats);\n const decimalSeparator: DecimalSeparator = options?.decimalSeparator ?? \".\";\n\n return function mapValue(datum: any): any {\n if (datum === \"\") {\n return null;\n }\n\n if (typeof datum === \"string\") {\n const datumNumber = parseNumberFromCsv(datum, decimalSeparator);\n if (!Number.isNaN(datumNumber) && datumNumber !== Infinity) {\n return datumNumber;\n }\n } else {\n const datumNumber = Number(datum);\n if (!Number.isNaN(datumNumber) && datumNumber !== Infinity) {\n return datumNumber;\n }\n }\n\n const date = dateParser.parse(datum);\n if (date) {\n return date;\n }\n\n const special = SpecialValues[datum];\n if (special !== undefined) {\n return special;\n }\n\n return datum;\n };\n}\n\nexport function createDefaultWriteMapper(dateFormat?: string, dateUTC?: boolean) {\n const formatter = dateFormat\n ? DateFormatter.create(dateFormat, { utc: dateUTC })\n : DateFormatter.iso(dateUTC);\n\n return function mapValue(value: any): any {\n if (value) {\n if (value.text || value.hyperlink) {\n return value.hyperlink || value.text || \"\";\n }\n if (value.formula || value.result) {\n return value.result || \"\";\n }\n if (value instanceof Date) {\n return formatter.format(value);\n }\n if (value.error) {\n return value.error;\n }\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n }\n }\n return value;\n };\n}\n\n// =============================================================================\n// CSV Class\n// =============================================================================\n\nclass CSV {\n public workbook: Workbook;\n\n constructor(workbook: Workbook) {\n this.workbook = workbook;\n }\n\n // ---------------------------------------------------------------------------\n // In-Memory Operations\n // ---------------------------------------------------------------------------\n\n load(content: string | ArrayBuffer | Uint8Array, options?: CsvReadOptions): Worksheet {\n let str: string;\n if (typeof content === \"string\") {\n str = content;\n } else if (content instanceof ArrayBuffer || content instanceof Uint8Array) {\n str = new TextDecoder().decode(content);\n } else {\n str = String(content);\n }\n\n const worksheet = this.workbook.addWorksheet(options?.sheetName);\n const dateFormats = options?.dateFormats ?? DEFAULT_DATE_FORMATS;\n const map =\n options?.map ||\n createDefaultValueMapper(dateFormats, {\n decimalSeparator:\n options?.valueMapperOptions?.decimalSeparator ?? options?.parserOptions?.decimalSeparator\n });\n const rows = parseCsv(str, options?.parserOptions) as string[][];\n\n for (const row of rows) {\n worksheet.addRow(row.map(map));\n }\n\n return worksheet;\n }\n\n writeString(options?: CsvWriteOptions): string {\n const worksheet = this.workbook.getWorksheet(options?.sheetName || options?.sheetId);\n if (!worksheet) {\n return \"\";\n }\n\n const { dateFormat, dateUTC } = options || {};\n const map = options?.map || createDefaultWriteMapper(dateFormat, dateUTC);\n const includeEmptyRows = options?.includeEmptyRows !== false;\n\n const rows: any[][] = [];\n let lastRow = 1;\n\n worksheet.eachRow((row: any, rowNumber: number) => {\n if (includeEmptyRows) {\n while (lastRow++ < rowNumber - 1) {\n rows.push([]);\n }\n }\n const { values } = row;\n values.shift();\n rows.push(values.map(map));\n lastRow = rowNumber;\n });\n\n return formatCsv(rows, options?.formatterOptions);\n }\n\n async writeBuffer(options?: CsvWriteOptions): Promise<Uint8Array> {\n return new TextEncoder().encode(this.writeString(options));\n }\n\n // ---------------------------------------------------------------------------\n // Stream Operations\n // ---------------------------------------------------------------------------\n\n async read(stream: IReadable<any>, options?: CsvReadOptions): Promise<Worksheet> {\n const worksheet = this.workbook.addWorksheet(options?.sheetName);\n const dateFormats = options?.dateFormats ?? DEFAULT_DATE_FORMATS;\n const map =\n options?.map ||\n createDefaultValueMapper(dateFormats, {\n decimalSeparator:\n options?.valueMapperOptions?.decimalSeparator ?? options?.parserOptions?.decimalSeparator\n });\n const parser = new CsvParserStream(options?.parserOptions);\n\n return new Promise((resolve, reject) => {\n parser.on(\"data\", (row: string[]) => worksheet.addRow(row.map(map)));\n pipeline(stream, parser)\n .then(() => resolve(worksheet))\n .catch(reject);\n });\n }\n\n async write(stream: IWritable<any>, options?: CsvWriteOptions): Promise<void> {\n const worksheet = this.workbook.getWorksheet(options?.sheetName || options?.sheetId);\n if (!worksheet) {\n stream.end();\n return;\n }\n\n const { dateFormat, dateUTC } = options || {};\n const map = options?.map || createDefaultWriteMapper(dateFormat, dateUTC);\n const includeEmptyRows = options?.includeEmptyRows !== false;\n const formatterOptions: CsvFormatterStreamOptions = { ...options?.formatterOptions };\n const formatter = new CsvFormatterStream(formatterOptions);\n const pipelinePromise = pipeline(formatter, stream);\n\n let lastRow = 1;\n worksheet.eachRow((row: any, rowNumber: number) => {\n if (includeEmptyRows) {\n while (lastRow++ < rowNumber - 1) {\n formatter.write([]);\n }\n }\n const { values } = row;\n values.shift();\n formatter.write(values.map(map));\n lastRow = rowNumber;\n });\n\n formatter.end();\n await pipelinePromise;\n }\n\n createReadStream(options?: CsvWriteOptions): IReadable<any> {\n const worksheet = this.workbook.getWorksheet(options?.sheetName || options?.sheetId);\n const { dateFormat, dateUTC } = options || {};\n const map = options?.map || createDefaultWriteMapper(dateFormat, dateUTC);\n const includeEmptyRows = options?.includeEmptyRows !== false;\n const formatter = new CsvFormatterStream({ ...options?.formatterOptions });\n\n if (worksheet) {\n setTimeout(() => {\n let lastRow = 1;\n worksheet.eachRow((row: any, rowNumber: number) => {\n if (includeEmptyRows) {\n while (lastRow++ < rowNumber - 1) {\n formatter.write([]);\n }\n }\n const { values } = row;\n values.shift();\n formatter.write(values.map(map));\n lastRow = rowNumber;\n });\n formatter.end();\n }, 0);\n } else {\n setTimeout(() => formatter.end(), 0);\n }\n\n return formatter;\n }\n\n createWriteStream(options?: CsvReadOptions): IWritable<any> {\n const worksheet = this.workbook.addWorksheet(options?.sheetName);\n const dateFormats = options?.dateFormats ?? DEFAULT_DATE_FORMATS;\n const map =\n options?.map ||\n createDefaultValueMapper(dateFormats, {\n decimalSeparator:\n options?.valueMapperOptions?.decimalSeparator ?? options?.parserOptions?.decimalSeparator\n });\n const parser = new CsvParserStream(options?.parserOptions);\n parser.on(\"data\", (row: string[]) => worksheet.addRow(row.map(map)));\n return parser;\n }\n\n // ---------------------------------------------------------------------------\n // File Operations (Browser stubs - overridden in Node.js)\n // ---------------------------------------------------------------------------\n\n async readFile(_filename: string, _options?: CsvStreamReadOptions): Promise<Worksheet> {\n throw new Error(\n \"csv.readFile() is not available in browser.\\n\" +\n \"Use csv.load(csvString) or csv.read(stream) instead.\\n\" +\n \"Example: const response = await fetch('/data.csv');\\n\" +\n \" workbook.csv.load(await response.text());\"\n );\n }\n\n async writeFile(_filename: string, _options?: CsvStreamWriteOptions): Promise<void> {\n throw new Error(\n \"csv.writeFile() is not available in browser.\\n\" +\n \"Use csv.writeBuffer() and trigger a download instead.\\n\" +\n \"Example: const buffer = await workbook.csv.writeBuffer();\\n\" +\n \" download(new Blob([buffer]), 'output.csv');\"\n );\n }\n}\n\n// =============================================================================\n// Standalone Functions (for backward compatibility)\n// =============================================================================\n\nexport function parseCsvToWorksheet(\n content: string,\n workbook: Workbook,\n options?: CsvReadOptions\n): Worksheet {\n const csv = new CSV(workbook);\n return csv.load(content, options);\n}\n\nexport function formatWorksheetToCsv(\n worksheet: Worksheet | undefined,\n options?: CsvWriteOptions\n): string {\n if (!worksheet) {\n return \"\";\n }\n const csv = new CSV(worksheet.workbook);\n return csv.writeString({ ...options, sheetId: worksheet.id });\n}\n\nexport { CSV };\nexport { CsvParserStream, CsvFormatterStream } from \"@csv/csv-stream\";\nexport { parseCsv, formatCsv } from \"@csv/csv-core\";\nexport type { CsvParseOptions, CsvFormatOptions } from \"@csv/csv-core\";\n","class SharedStrings {\n declare private _values: any[];\n declare private _totalRefs: number;\n declare private _hash: Record<string, number>;\n\n constructor() {\n this._values = [];\n this._totalRefs = 0;\n this._hash = Object.create(null);\n }\n\n get count(): number {\n return this._values.length;\n }\n\n get values(): any[] {\n return this._values;\n }\n\n get totalRefs(): number {\n return this._totalRefs;\n }\n\n getString(index: number): any {\n return this._values[index];\n }\n\n add(value: any): number {\n let index = this._hash[value];\n if (index === undefined) {\n index = this._hash[value] = this._values.length;\n this._values.push(value);\n }\n this._totalRefs++;\n return index;\n }\n}\n\nexport { SharedStrings };\n","import { xmlEncode } from \"@utils/utils\";\nimport { RelType } from \"@excel/xlsx/rel-type\";\nimport { worksheetRelsPath } from \"@excel/utils/ooxml-paths\";\n\ninterface Hyperlink {\n address: string;\n target: string;\n}\n\ninterface Relationship {\n Type: string;\n Target: string;\n TargetMode?: string;\n}\n\nclass HyperlinksProxy {\n writer: SheetRelsWriter;\n\n constructor(sheetRelsWriter: SheetRelsWriter) {\n this.writer = sheetRelsWriter;\n }\n\n push(hyperlink: Hyperlink): void {\n this.writer.addHyperlink(hyperlink);\n }\n}\n\ninterface SheetRelsWriterOptions {\n id: number;\n workbook: any;\n}\n\nclass SheetRelsWriter {\n id: number;\n count: number;\n _hyperlinks: Array<{ rId: string; address: string }>;\n _workbook: any;\n _stream?: any;\n _hyperlinksProxy?: HyperlinksProxy;\n\n constructor(options: SheetRelsWriterOptions) {\n // in a workbook, each sheet will have a number\n this.id = options.id;\n\n // count of all relationships\n this.count = 0;\n\n // keep record of all hyperlinks\n this._hyperlinks = [];\n\n this._workbook = options.workbook;\n }\n\n get stream(): any {\n if (!this._stream) {\n this._stream = this._workbook._openStream(worksheetRelsPath(this.id));\n }\n return this._stream;\n }\n\n get length(): number {\n return this._hyperlinks.length;\n }\n\n each(fn: (hyperlink: { rId: string; address: string }) => void): void {\n return this._hyperlinks.forEach(fn);\n }\n\n get hyperlinksProxy(): HyperlinksProxy {\n return this._hyperlinksProxy || (this._hyperlinksProxy = new HyperlinksProxy(this));\n }\n\n addHyperlink(hyperlink: Hyperlink): void {\n // Write to stream\n const relationship: Relationship = {\n Target: hyperlink.target,\n Type: RelType.Hyperlink,\n TargetMode: \"External\"\n };\n const rId = this._writeRelationship(relationship);\n\n // store sheet stuff for later\n this._hyperlinks.push({\n rId,\n address: hyperlink.address\n });\n }\n\n addMedia(media: Relationship): string {\n return this._writeRelationship(media);\n }\n\n addRelationship(rel: Relationship): string {\n return this._writeRelationship(rel);\n }\n\n commit(): void {\n if (this.count) {\n // write xml utro\n this._writeClose();\n // and close stream\n this.stream.end();\n }\n }\n\n // ================================================================================\n _writeOpen(): void {\n this.stream.write(\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n <Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">`\n );\n }\n\n _writeRelationship(relationship: Relationship): string {\n if (!this.count) {\n this._writeOpen();\n }\n\n const rId = `rId${++this.count}`;\n\n if (relationship.TargetMode) {\n this.stream.write(\n `<Relationship Id=\"${rId}\"` +\n ` Type=\"${relationship.Type}\"` +\n ` Target=\"${xmlEncode(relationship.Target)}\"` +\n ` TargetMode=\"${relationship.TargetMode}\"` +\n \"/>\"\n );\n } else {\n this.stream.write(\n `<Relationship Id=\"${rId}\" Type=\"${relationship.Type}\" Target=\"${relationship.Target}\"/>`\n );\n }\n\n return rId;\n }\n\n _writeClose(): void {\n this.stream.write(\"</Relationships>\");\n }\n}\n\nexport { SheetRelsWriter };\n","import { XmlStream } from \"@excel/utils/xml-stream\";\nimport { RelType } from \"@excel/xlsx/rel-type\";\nimport { colCache } from \"@excel/utils/col-cache\";\nimport { CommentXform } from \"@excel/xlsx/xform/comment/comment-xform\";\nimport { VmlShapeXform } from \"@excel/xlsx/xform/comment/vml-shape-xform\";\nimport {\n commentsPath,\n commentsRelTargetFromWorksheet,\n vmlDrawingPath,\n vmlDrawingRelTargetFromWorksheet\n} from \"@excel/utils/ooxml-paths\";\n\ninterface SheetCommentsWriterOptions {\n id: number;\n workbook: any;\n}\n\nclass SheetCommentsWriter {\n id: number;\n count: number;\n _worksheet: any;\n _workbook: any;\n _sheetRelsWriter: any;\n _commentsStream?: any;\n _vmlStream?: any;\n vmlRelId?: string;\n startedData?: boolean;\n\n constructor(worksheet: any, sheetRelsWriter: any, options: SheetCommentsWriterOptions) {\n // in a workbook, each sheet will have a number\n this.id = options.id;\n this.count = 0;\n this._worksheet = worksheet;\n this._workbook = options.workbook;\n this._sheetRelsWriter = sheetRelsWriter;\n }\n\n get commentsStream(): any {\n if (!this._commentsStream) {\n this._commentsStream = this._workbook._openStream(commentsPath(this.id));\n }\n return this._commentsStream;\n }\n\n get vmlStream(): any {\n if (!this._vmlStream) {\n this._vmlStream = this._workbook._openStream(vmlDrawingPath(this.id));\n }\n return this._vmlStream;\n }\n\n _addRelationships(): void {\n const commentRel = {\n Type: RelType.Comments,\n Target: commentsRelTargetFromWorksheet(this.id)\n };\n this._sheetRelsWriter.addRelationship(commentRel);\n\n const vmlDrawingRel = {\n Type: RelType.VmlDrawing,\n Target: vmlDrawingRelTargetFromWorksheet(this.id)\n };\n this.vmlRelId = this._sheetRelsWriter.addRelationship(vmlDrawingRel);\n }\n\n _addCommentRefs(): void {\n this._workbook.commentRefs.push({\n commentName: `comments${this.id}`,\n vmlDrawing: `vmlDrawing${this.id}`\n });\n }\n\n _writeOpen(): void {\n this.commentsStream.write(\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<comments xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">' +\n \"<authors><author>Author</author></authors>\" +\n \"<commentList>\"\n );\n this.vmlStream.write(\n '<?xml version=\"1.0\" encoding=\"UTF-8\"?>' +\n '<xml xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\">' +\n '<o:shapelayout v:ext=\"edit\">' +\n '<o:idmap v:ext=\"edit\" data=\"1\" />' +\n \"</o:shapelayout>\" +\n '<v:shapetype id=\"_x0000_t202\" coordsize=\"21600,21600\" o:spt=\"202\" path=\"m,l,21600r21600,l21600,xe\">' +\n '<v:stroke joinstyle=\"miter\" />' +\n '<v:path gradientshapeok=\"t\" o:connecttype=\"rect\" />' +\n \"</v:shapetype>\"\n );\n }\n\n _writeComment(comment: any, index: number): void {\n const commentXform = new CommentXform();\n const commentsXmlStream = new XmlStream();\n commentXform.render(commentsXmlStream, comment);\n this.commentsStream.write(commentsXmlStream.xml);\n\n const vmlShapeXform = new VmlShapeXform();\n const vmlXmlStream = new XmlStream();\n vmlShapeXform.render(vmlXmlStream, comment, index);\n this.vmlStream.write(vmlXmlStream.xml);\n }\n\n _writeClose(): void {\n this.commentsStream.write(\"</commentList></comments>\");\n this.vmlStream.write(\"</xml>\");\n }\n\n addComments(comments: any[]): void {\n if (comments && comments.length) {\n if (!this.startedData) {\n this._worksheet.comments = [];\n this._writeOpen();\n this._addRelationships();\n this._addCommentRefs();\n this.startedData = true;\n }\n\n comments.forEach(item => {\n item.refAddress = colCache.decodeAddress(item.ref);\n });\n\n comments.forEach(comment => {\n this._writeComment(comment, this.count);\n this.count += 1;\n });\n }\n }\n\n commit(): void {\n if (this.count) {\n this._writeClose();\n this.commentsStream.end();\n this.vmlStream.end();\n }\n }\n}\n\nexport { SheetCommentsWriter };\n","import { RelType } from \"@excel/xlsx/rel-type\";\nimport { colCache } from \"@excel/utils/col-cache\";\nimport { Encryptor } from \"@excel/utils/encryptor\";\nimport { uint8ArrayToBase64 } from \"@utils/utils\";\nimport { Dimensions } from \"@excel/range\";\nimport { StringBuf } from \"@excel/utils/string-buf\";\nimport { Row } from \"@excel/row\";\nimport { Column } from \"@excel/column\";\nimport { SheetRelsWriter } from \"@excel/stream/sheet-rels-writer\";\nimport { SheetCommentsWriter } from \"@excel/stream/sheet-comments-writer\";\nimport { DataValidations } from \"@excel/data-validations\";\nimport type { StreamBuf } from \"@excel/utils/stream-buf\";\nimport { mediaRelTargetFromRels, worksheetPath } from \"@excel/utils/ooxml-paths\";\n\nconst xmlBuffer = new StringBuf();\n\n// ============================================================================================\n// Xforms\nimport { ListXform } from \"@excel/xlsx/xform/list-xform\";\nimport { DataValidationsXform } from \"@excel/xlsx/xform/sheet/data-validations-xform\";\nimport { SheetPropertiesXform } from \"@excel/xlsx/xform/sheet/sheet-properties-xform\";\nimport { SheetFormatPropertiesXform } from \"@excel/xlsx/xform/sheet/sheet-format-properties-xform\";\nimport { ColXform } from \"@excel/xlsx/xform/sheet/col-xform\";\nimport { RowXform } from \"@excel/xlsx/xform/sheet/row-xform\";\nimport { HyperlinkXform } from \"@excel/xlsx/xform/sheet/hyperlink-xform\";\nimport { SheetViewXform } from \"@excel/xlsx/xform/sheet/sheet-view-xform\";\nimport { SheetProtectionXform } from \"@excel/xlsx/xform/sheet/sheet-protection-xform\";\nimport { PageMarginsXform } from \"@excel/xlsx/xform/sheet/page-margins-xform\";\nimport { PageSetupXform } from \"@excel/xlsx/xform/sheet/page-setup-xform\";\nimport { AutoFilterXform } from \"@excel/xlsx/xform/sheet/auto-filter-xform\";\nimport { PictureXform } from \"@excel/xlsx/xform/sheet/picture-xform\";\nimport { ConditionalFormattingsXform } from \"@excel/xlsx/xform/sheet/cf/conditional-formattings-xform\";\nimport { HeaderFooterXform } from \"@excel/xlsx/xform/sheet/header-footer-xform\";\nimport { RowBreaksXform } from \"@excel/xlsx/xform/sheet/row-breaks-xform\";\nimport { ColBreaksXform } from \"@excel/xlsx/xform/sheet/col-breaks-xform\";\nimport type {\n RowBreak,\n ColBreak,\n PageSetup,\n HeaderFooter,\n WorksheetProperties,\n WorksheetView,\n WorksheetState,\n AutoFilter,\n WorksheetProtection,\n ConditionalFormattingOptions\n} from \"@excel/types\";\n\n// since prepare and render are functional, we can use singletons\nconst xform = {\n dataValidations: new DataValidationsXform(),\n sheetProperties: new SheetPropertiesXform(),\n sheetFormatProperties: new SheetFormatPropertiesXform(),\n columns: new ListXform({ tag: \"cols\", count: false, childXform: new ColXform() } as any),\n row: new RowXform(),\n hyperlinks: new ListXform({\n tag: \"hyperlinks\",\n count: false,\n childXform: new HyperlinkXform()\n } as any),\n sheetViews: new ListXform({\n tag: \"sheetViews\",\n count: false,\n childXform: new SheetViewXform()\n } as any),\n sheetProtection: new SheetProtectionXform(),\n pageMargins: new PageMarginsXform(),\n pageSeteup: new PageSetupXform(),\n autoFilter: new AutoFilterXform(),\n picture: new PictureXform(),\n conditionalFormattings: new ConditionalFormattingsXform(),\n headerFooter: new HeaderFooterXform(),\n rowBreaks: new RowBreaksXform(),\n colBreaks: new ColBreaksXform()\n};\n\n// ============================================================================================\n\ninterface WorksheetWriterOptions {\n id: number;\n name?: string;\n // WorkbookWriter reference - any due to circular dependency\n workbook: any;\n useSharedStrings?: boolean;\n properties?: Partial<WorksheetProperties>;\n state?: WorksheetState;\n pageSetup?: Partial<PageSetup>;\n views?: Partial<WorksheetView>[];\n autoFilter?: AutoFilter;\n headerFooter?: Partial<HeaderFooter>;\n}\n\nclass WorksheetWriter {\n id: number;\n name: string;\n state: WorksheetState;\n /** Rows stored while being worked on. Set to null after commit. */\n _rows: Row[] | null;\n /** Column definitions */\n _columns: Column[] | null;\n /** Column keys mapping: key => Column */\n _keys: { [key: string]: Column };\n /** Merged cell ranges */\n _merges: Dimensions[];\n _sheetRelsWriter: SheetRelsWriter;\n _sheetCommentsWriter: SheetCommentsWriter;\n _dimensions: Dimensions;\n _rowZero: number;\n _rowOffset: number;\n committed: boolean;\n dataValidations: DataValidations;\n /** Shared formulae by address */\n _formulae: { [key: string]: unknown };\n _siFormulae: number;\n conditionalFormatting: ConditionalFormattingOptions[];\n rowBreaks: RowBreak[];\n colBreaks: ColBreak[];\n properties: Partial<WorksheetProperties> & {\n defaultRowHeight: number;\n dyDescent?: number;\n outlineLevelCol: number;\n outlineLevelRow: number;\n };\n headerFooter: Partial<HeaderFooter>;\n pageSetup: Partial<PageSetup> & { margins: PageSetup[\"margins\"] };\n useSharedStrings: boolean;\n // WorkbookWriter - circular dependency, keep as any\n _workbook: any;\n hasComments: boolean;\n _views: Partial<WorksheetView>[];\n autoFilter: AutoFilter | null;\n _media: unknown[];\n sheetProtection: {\n sheet?: boolean;\n algorithmName?: string;\n saltValue?: string;\n spinCount?: number;\n hashValue?: string;\n [key: string]: unknown;\n } | null;\n _stream?: InstanceType<typeof StreamBuf>;\n startedData: boolean;\n _background?: { imageId?: number; rId?: string };\n _headerRowCount?: number;\n /** Relationship Id - assigned by WorkbookWriter */\n rId?: string;\n\n constructor(options: WorksheetWriterOptions) {\n // in a workbook, each sheet will have a number\n this.id = options.id;\n\n // and a name\n this.name = options.name || `Sheet${this.id}`;\n\n // add a state\n this.state = options.state || \"visible\";\n\n // rows are stored here while they need to be worked on.\n // when they are committed, they will be deleted.\n this._rows = [];\n\n // column definitions\n this._columns = null;\n\n // column keys (addRow convenience): key ==> this._columns index\n this._keys = {};\n\n // keep a record of all row and column pageBreaks\n this._merges = [];\n (this._merges as any).add = function () {}; // ignore cell instruction\n\n // keep record of all hyperlinks\n this._sheetRelsWriter = new SheetRelsWriter(options);\n\n this._sheetCommentsWriter = new SheetCommentsWriter(this, this._sheetRelsWriter, options);\n\n // keep a record of dimensions\n this._dimensions = new Dimensions();\n\n // first uncommitted row\n this._rowZero = 1;\n\n // Internal offset into `_rows` to avoid O(n) `Array.shift()` in hot path.\n this._rowOffset = 0;\n\n // committed flag\n this.committed = false;\n\n // for data validations\n this.dataValidations = new DataValidations();\n\n // for sharing formulae\n this._formulae = {};\n this._siFormulae = 0;\n\n // keep a record of conditionalFormattings\n this.conditionalFormatting = [];\n\n // keep a record of all row and column pageBreaks\n this.rowBreaks = [];\n this.colBreaks = [];\n\n // for default row height, outline levels, etc\n this.properties = Object.assign(\n {},\n {\n defaultRowHeight: 15,\n outlineLevelCol: 0,\n outlineLevelRow: 0\n },\n options.properties\n );\n\n this.headerFooter = Object.assign(\n {},\n {\n differentFirst: false,\n differentOddEven: false,\n oddHeader: null,\n oddFooter: null,\n evenHeader: null,\n evenFooter: null,\n firstHeader: null,\n firstFooter: null\n },\n options.headerFooter\n );\n\n // for all things printing\n this.pageSetup = Object.assign(\n {},\n {\n margins: { left: 0.7, right: 0.7, top: 0.75, bottom: 0.75, header: 0.3, footer: 0.3 },\n orientation: \"portrait\",\n horizontalDpi: 4294967295,\n verticalDpi: 4294967295,\n fitToPage: !!(\n options.pageSetup &&\n (options.pageSetup.fitToWidth || options.pageSetup.fitToHeight) &&\n !options.pageSetup.scale\n ),\n pageOrder: \"downThenOver\",\n blackAndWhite: false,\n draft: false,\n cellComments: \"None\",\n errors: \"displayed\",\n scale: 100,\n fitToWidth: 1,\n fitToHeight: 1,\n paperSize: undefined,\n showRowColHeaders: false,\n showGridLines: false,\n horizontalCentered: false,\n verticalCentered: false,\n rowBreaks: null,\n colBreaks: null\n },\n options.pageSetup\n );\n\n // using shared strings creates a smaller xlsx file but may use more memory\n this.useSharedStrings = options.useSharedStrings || false;\n\n this._workbook = options.workbook;\n\n this.hasComments = false;\n\n // views\n this._views = options.views || [];\n\n // auto filter\n this.autoFilter = options.autoFilter || null;\n\n this._media = [];\n\n // worksheet protection\n this.sheetProtection = null;\n\n // start writing to stream now\n this._writeOpenWorksheet();\n\n this.startedData = false;\n }\n\n get workbook(): any {\n return this._workbook;\n }\n\n get stream(): any {\n if (!this._stream) {\n this._stream = this._workbook._openStream(worksheetPath(this.id));\n\n // DO NOT pause stream - fflate migration requires data events to flow\n // The stream uses 'data' events to pipe to ZipPassThrough\n // this._stream.pause();\n }\n return this._stream;\n }\n\n // destroy - not a valid operation for a streaming writer\n // even though some streamers might be able to, it's a bad idea.\n destroy(): void {\n throw new Error(\"Invalid Operation: destroy\");\n }\n\n commit(): void {\n if (this.committed) {\n return;\n }\n // commit all rows\n for (let i = this._rowOffset; i < this._rows!.length; i++) {\n const cRow = this._rows![i];\n if (cRow) {\n this._writeRow(cRow);\n }\n }\n\n // we _cannot_ accept new rows from now on\n this._rows = null;\n\n if (!this.startedData) {\n this._writeOpenSheetData();\n }\n this._writeCloseSheetData();\n this._writeSheetProtection(); // Note: must be after sheetData and before autoFilter\n this._writeAutoFilter();\n this._writeMergeCells();\n\n // for some reason, Excel can't handle dimensions at the bottom of the file\n // this._writeDimensions();\n\n this._writeHyperlinks();\n this._writeConditionalFormatting();\n this._writeDataValidations();\n this._writePageMargins();\n this._writePageSetup();\n this._writeBackground();\n this._writeHeaderFooter();\n this._writeRowBreaks();\n this._writeColBreaks();\n\n // Legacy Data tag for comments\n this._writeLegacyData();\n\n this._writeCloseWorksheet();\n // signal end of stream to workbook\n this.stream.end();\n\n this._sheetCommentsWriter.commit();\n // also commit the hyperlinks if any\n this._sheetRelsWriter.commit();\n\n this.committed = true;\n }\n\n // return the current dimensions of the writer\n get dimensions(): Dimensions {\n return this._dimensions;\n }\n\n get views(): Partial<WorksheetView>[] {\n return this._views;\n }\n\n // =========================================================================\n // Columns\n\n // get the current columns array.\n get columns(): Column[] | null {\n return this._columns;\n }\n\n // set the columns from an array of column definitions.\n // Note: any headers defined will overwrite existing values.\n set columns(value: Partial<Column>[]) {\n // calculate max header row count\n this._headerRowCount = value.reduce((pv, cv) => {\n const headerCount = (cv.header && 1) || (cv.headers && cv.headers.length) || 0;\n return Math.max(pv, headerCount);\n }, 0);\n\n // construct Column objects\n let count = 1;\n const columns = (this._columns = []);\n value.forEach(defn => {\n const column = new Column(this as any, count++, false as any);\n columns.push(column);\n column.defn = defn;\n });\n }\n\n getColumnKey(key: string): Column | undefined {\n return this._keys[key];\n }\n\n setColumnKey(key: string, value: Column): void {\n this._keys[key] = value;\n }\n\n deleteColumnKey(key: string): void {\n delete this._keys[key];\n }\n\n eachColumnKey(f: (column: Column, key: string) => void): void {\n Object.keys(this._keys).forEach(key => f(this._keys[key], key));\n }\n\n // get a single column by col number. If it doesn't exist, it and any gaps before it\n // are created.\n getColumn(c: string | number): Column {\n if (typeof c === \"string\") {\n // if it matches a key'd column, return that\n const col = this._keys[c];\n if (col) {\n return col;\n }\n\n // otherwise, assume letter\n c = colCache.l2n(c);\n }\n if (!this._columns) {\n this._columns = [];\n }\n if (c > this._columns.length) {\n let n = this._columns.length + 1;\n while (n <= c) {\n this._columns.push(new Column(this as any, n++));\n }\n }\n return this._columns[c - 1];\n }\n\n // =========================================================================\n // Rows\n get _nextRow(): number {\n return this._rowZero + (this._rows!.length - this._rowOffset);\n }\n\n // iterate over every uncommitted row in the worksheet, including maybe empty rows\n eachRow(\n options: { includeEmpty?: boolean } | ((row: Row, rowNumber: number) => void),\n iteratee?: (row: Row, rowNumber: number) => void\n ): void {\n let callback: ((row: Row, rowNumber: number) => void) | undefined;\n let opts: { includeEmpty?: boolean } | undefined;\n\n if (typeof options === \"function\") {\n callback = options;\n opts = undefined;\n } else {\n callback = iteratee;\n opts = options;\n }\n\n if (opts && opts.includeEmpty) {\n const n = this._nextRow;\n for (let i = this._rowZero; i < n; i++) {\n callback!(this.getRow(i), i);\n }\n } else {\n this._rows!.forEach(row => {\n if (row.hasValues) {\n callback!(row, row.number);\n }\n });\n }\n }\n\n _commitRow(cRow: Row): void {\n // since rows must be written in order, we commit all rows up till and including cRow\n let found = false;\n\n const rows = this._rows!;\n while (this._rowOffset < rows.length && !found) {\n const row = rows[this._rowOffset];\n rows[this._rowOffset] = undefined as any;\n this._rowOffset++;\n this._rowZero++;\n if (row) {\n this._writeRow(row);\n found = row.number === cRow.number;\n this._rowZero = row.number + 1;\n }\n\n // Occasionally compact the buffer to keep indices small and reduce memory.\n if (this._rowOffset > 1024 && this._rowOffset > rows.length >> 1) {\n rows.splice(0, this._rowOffset);\n this._rowOffset = 0;\n }\n }\n }\n\n get lastRow(): Row | undefined {\n // returns last uncommitted row\n const rows = this._rows!;\n for (let i = rows.length - 1; i >= this._rowOffset; i--) {\n const row = rows[i];\n if (row) {\n return row;\n }\n }\n return undefined;\n }\n\n // find a row (if exists) by row number\n findRow(rowNumber: number): Row | undefined {\n const index = rowNumber - this._rowZero + this._rowOffset;\n return this._rows![index];\n }\n\n getRow(rowNumber: number): Row {\n const index = rowNumber - this._rowZero + this._rowOffset;\n\n // may fail if rows have been comitted\n if (index < this._rowOffset) {\n throw new Error(\"Out of bounds: this row has been committed\");\n }\n let row = this._rows![index];\n if (!row) {\n this._rows![index] = row = new Row(this as any, rowNumber);\n }\n return row;\n }\n\n addRow(value: any[] | Record<string, any>): Row {\n const row = new Row(this as any, this._nextRow);\n this._rows![row.number - this._rowZero + this._rowOffset] = row;\n row.values = value;\n return row;\n }\n\n // ================================================================================\n // Cells\n\n // returns the cell at [r,c] or address given by r. If not found, return undefined\n findCell(r: string | number, c?: number): any {\n const address: any = colCache.getAddress(r, c);\n const row = this.findRow(address.row);\n return row ? row.findCell(address.column) : undefined;\n }\n\n // return the cell at [r,c] or address given by r. If not found, create a new one.\n getCell(r: string | number, c?: number): any {\n const address = colCache.getAddress(r, c);\n const row = this.getRow(address.row);\n return row.getCellEx(address);\n }\n\n mergeCells(...cells: (string | number)[]): void {\n // may fail if rows have been comitted\n const dimensions = new Dimensions(cells);\n\n // check cells aren't already merged\n this._merges.forEach(merge => {\n if (merge.intersects(dimensions)) {\n throw new Error(\"Cannot merge already merged cells\");\n }\n });\n\n // apply merge\n const master = this.getCell(dimensions.top, dimensions.left);\n for (let i = dimensions.top; i <= dimensions.bottom; i++) {\n for (let j = dimensions.left; j <= dimensions.right; j++) {\n if (i > dimensions.top || j > dimensions.left) {\n this.getCell(i, j).merge(master);\n }\n }\n }\n\n // index merge\n this._merges.push(dimensions);\n }\n\n // ===========================================================================\n // Conditional Formatting\n addConditionalFormatting(cf: ConditionalFormattingOptions): void {\n this.conditionalFormatting.push(cf);\n }\n\n removeConditionalFormatting(\n filter?: number | ((cf: ConditionalFormattingOptions) => boolean)\n ): void {\n if (typeof filter === \"number\") {\n this.conditionalFormatting.splice(filter, 1);\n } else if (filter instanceof Function) {\n this.conditionalFormatting = this.conditionalFormatting.filter(filter);\n } else {\n this.conditionalFormatting = [];\n }\n }\n\n // =========================================================================\n\n addBackgroundImage(imageId: number): void {\n this._background = {\n imageId\n };\n }\n\n getBackgroundImageId(): number | undefined {\n return this._background && this._background.imageId;\n }\n\n // =========================================================================\n // Worksheet Protection\n async protect(password?: string, options?: Partial<WorksheetProtection>): Promise<void> {\n this.sheetProtection = {\n sheet: true\n };\n if (options && \"spinCount\" in options) {\n // force spinCount to be integer >= 0\n options.spinCount = Number.isFinite(options.spinCount)\n ? Math.round(Math.max(0, options.spinCount))\n : 100000;\n }\n if (password) {\n this.sheetProtection.algorithmName = \"SHA-512\";\n this.sheetProtection.saltValue = uint8ArrayToBase64(Encryptor.randomBytes(16));\n this.sheetProtection.spinCount =\n options && \"spinCount\" in options ? options.spinCount : 100000; // allow user specified spinCount\n this.sheetProtection.hashValue = await Encryptor.convertPasswordToHash(\n password,\n \"SHA-512\",\n this.sheetProtection.saltValue,\n this.sheetProtection.spinCount\n );\n }\n if (options) {\n this.sheetProtection = Object.assign(this.sheetProtection, options);\n if (!password && \"spinCount\" in options) {\n delete this.sheetProtection.spinCount;\n }\n }\n }\n\n unprotect(): void {\n this.sheetProtection = null;\n }\n\n // ================================================================================\n\n _write(text: string): void {\n xmlBuffer.reset();\n xmlBuffer.addText(text);\n this.stream.write(xmlBuffer);\n }\n\n _writeSheetProperties(\n xmlBuf: StringBuf,\n properties: Partial<WorksheetProperties> | undefined,\n pageSetup: Partial<PageSetup> | undefined\n ): void {\n const sheetPropertiesModel = {\n outlineProperties: properties && properties.outlineProperties,\n tabColor: properties && properties.tabColor,\n pageSetup:\n pageSetup && pageSetup.fitToPage\n ? {\n fitToPage: pageSetup.fitToPage\n }\n : undefined\n };\n\n xmlBuf.addText(xform.sheetProperties.toXml(sheetPropertiesModel));\n }\n\n _writeSheetFormatProperties(\n xmlBuf: StringBuf,\n properties: Partial<WorksheetProperties> | undefined\n ): void {\n const sheetFormatPropertiesModel = properties\n ? {\n defaultRowHeight: properties.defaultRowHeight,\n dyDescent: properties.dyDescent,\n outlineLevelCol: properties.outlineLevelCol,\n outlineLevelRow: properties.outlineLevelRow\n }\n : undefined;\n if (properties && properties.defaultColWidth) {\n (sheetFormatPropertiesModel as any).defaultColWidth = properties.defaultColWidth;\n }\n\n xmlBuf.addText(xform.sheetFormatProperties.toXml(sheetFormatPropertiesModel));\n }\n\n _writeOpenWorksheet(): void {\n xmlBuffer.reset();\n\n xmlBuffer.addText('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>');\n xmlBuffer.addText(\n '<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"' +\n ' xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"' +\n ' xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"' +\n ' mc:Ignorable=\"x14ac\"' +\n ' xmlns:x14ac=\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac\">'\n );\n\n this._writeSheetProperties(xmlBuffer, this.properties, this.pageSetup);\n\n xmlBuffer.addText(xform.sheetViews.toXml(this.views));\n\n this._writeSheetFormatProperties(xmlBuffer, this.properties);\n\n this.stream.write(xmlBuffer);\n }\n\n _writeColumns(): void {\n const cols = (Column as any).toModel(this.columns);\n if (cols) {\n xform.columns.prepare(cols, { styles: this._workbook.styles });\n this.stream.write(xform.columns.toXml(cols));\n }\n }\n\n _writeOpenSheetData(): void {\n this._write(\"<sheetData>\");\n }\n\n _writeRow(row: any): void {\n if (!this.startedData) {\n this._writeColumns();\n this._writeOpenSheetData();\n this.startedData = true;\n }\n\n if (row.hasValues || row.height) {\n const { model } = row;\n const options = {\n styles: this._workbook.styles,\n sharedStrings: this.useSharedStrings ? this._workbook.sharedStrings : undefined,\n hyperlinks: this._sheetRelsWriter.hyperlinksProxy,\n merges: this._merges,\n formulae: this._formulae,\n siFormulae: this._siFormulae,\n comments: []\n };\n xform.row.prepare(model, options);\n this.stream.write(xform.row.toXml(model));\n\n if (options.comments.length) {\n this.hasComments = true;\n this._sheetCommentsWriter.addComments(options.comments);\n }\n }\n }\n\n _writeCloseSheetData(): void {\n this._write(\"</sheetData>\");\n }\n\n _writeMergeCells(): void {\n if (this._merges.length) {\n xmlBuffer.reset();\n xmlBuffer.addText(`<mergeCells count=\"${this._merges.length}\">`);\n this._merges.forEach(merge => {\n xmlBuffer.addText(`<mergeCell ref=\"${merge}\"/>`);\n });\n xmlBuffer.addText(\"</mergeCells>\");\n\n this.stream.write(xmlBuffer);\n }\n }\n\n _writeHyperlinks(): void {\n this.stream.write(xform.hyperlinks.toXml(this._sheetRelsWriter._hyperlinks));\n }\n\n _writeConditionalFormatting(): void {\n const options = {\n styles: this._workbook.styles\n };\n xform.conditionalFormattings.prepare(this.conditionalFormatting, options);\n this.stream.write(xform.conditionalFormattings.toXml(this.conditionalFormatting));\n }\n\n _writeRowBreaks(): void {\n this.stream.write(xform.rowBreaks.toXml(this.rowBreaks));\n }\n\n _writeColBreaks(): void {\n this.stream.write(xform.colBreaks.toXml(this.colBreaks));\n }\n\n _writeDataValidations(): void {\n this.stream.write(xform.dataValidations.toXml(this.dataValidations.model));\n }\n\n _writeSheetProtection(): void {\n this.stream.write(xform.sheetProtection.toXml(this.sheetProtection));\n }\n\n _writePageMargins(): void {\n this.stream.write(xform.pageMargins.toXml(this.pageSetup.margins));\n }\n\n _writePageSetup(): void {\n this.stream.write(xform.pageSeteup.toXml(this.pageSetup));\n }\n\n _writeHeaderFooter(): void {\n this.stream.write(xform.headerFooter.toXml(this.headerFooter));\n }\n\n _writeAutoFilter(): void {\n this.stream.write(xform.autoFilter.toXml(this.autoFilter));\n }\n\n _writeBackground(): void {\n if (this._background) {\n if (this._background.imageId !== undefined) {\n const image = this._workbook.getImage(this._background.imageId);\n const pictureId = this._sheetRelsWriter.addMedia({\n Target: mediaRelTargetFromRels(image.name),\n Type: RelType.Image\n });\n\n this._background = {\n ...this._background,\n rId: pictureId\n };\n }\n this.stream.write(xform.picture.toXml({ rId: this._background.rId }));\n }\n }\n\n _writeLegacyData(): void {\n if (this.hasComments) {\n xmlBuffer.reset();\n xmlBuffer.addText(`<legacyDrawing r:id=\"${this._sheetCommentsWriter.vmlRelId}\"/>`);\n this.stream.write(xmlBuffer);\n }\n }\n\n _writeDimensions(): void {\n // for some reason, Excel can't handle dimensions at the bottom of the file\n // and we don't know the dimensions until the commit, so don't write them.\n // this._write('<dimension ref=\"' + this._dimensions + '\"/>');\n }\n\n _writeCloseWorksheet(): void {\n this._write(\"</worksheet>\");\n }\n}\n\nexport { WorksheetWriter };\n","/**\n * WorkbookWriter - Browser Streaming Excel Writer\n *\n * This module contains the full cross-platform implementation for the streaming\n * workbook writer and a browser-compatible `WorkbookWriter` class.\n *\n * Node.js uses `workbook-writer.ts`, which extends the same base implementation\n * with filesystem-specific features (filename output + image loading).\n */\n\nimport { Zip, ZipDeflate } from \"@archive/streaming-zip\";\nimport { StreamBuf } from \"@excel/utils/stream-buf\";\nimport { base64ToUint8Array } from \"@utils/utils\";\nimport { RelType } from \"@excel/xlsx/rel-type\";\nimport { StylesXform } from \"@excel/xlsx/xform/style/styles-xform\";\nimport { SharedStrings } from \"@excel/utils/shared-strings\";\nimport { DefinedNames } from \"@excel/defined-names\";\nimport { CoreXform } from \"@excel/xlsx/xform/core/core-xform\";\nimport { RelationshipsXform } from \"@excel/xlsx/xform/core/relationships-xform\";\nimport { ContentTypesXform } from \"@excel/xlsx/xform/core/content-types-xform\";\nimport { AppXform } from \"@excel/xlsx/xform/core/app-xform\";\nimport { WorkbookXform } from \"@excel/xlsx/xform/book/workbook-xform\";\nimport { SharedStringsXform } from \"@excel/xlsx/xform/strings/shared-strings-xform\";\nimport { theme1Xml } from \"@excel/xlsx/xml/theme1\";\nimport type { Writable } from \"@stream\";\nimport { Writeable, stringToUint8Array } from \"@stream\";\nimport {\n mediaPath,\n OOXML_PATHS,\n OOXML_REL_TARGETS,\n worksheetRelTarget\n} from \"@excel/utils/ooxml-paths\";\nimport type { Image, WorkbookView, AddWorksheetOptions } from \"@excel/types\";\nimport { WorksheetWriter } from \"@excel/stream/worksheet-writer\";\n\nconst EMPTY_U8 = new Uint8Array(0);\nconst TEXT_DECODER = new TextDecoder();\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface Medium extends Image {\n type: \"image\";\n name: string;\n}\n\ninterface CommentRef {\n commentName: string;\n vmlDrawing: string;\n}\n\nexport interface ZlibOptions {\n flush?: number;\n finishFlush?: number;\n chunkSize?: number;\n windowBits?: number;\n level?: number;\n memLevel?: number;\n strategy?: number;\n dictionary?: Uint8Array | ArrayBuffer;\n}\n\nexport interface ZipOptions {\n comment?: string;\n forceLocalTime?: boolean;\n forceZip64?: boolean;\n store?: boolean;\n zlib?: Partial<ZlibOptions>;\n compressionOptions?: { level?: number };\n}\n\nexport interface WorkbookWriterOptions {\n created?: Date;\n modified?: Date;\n creator?: string;\n lastModifiedBy?: string;\n lastPrinted?: Date;\n useSharedStrings?: boolean;\n useStyles?: boolean;\n zip?: Partial<ZipOptions>;\n stream?: Writable | WritableStream<Uint8Array>;\n filename?: string; // Node.js only\n trueStreaming?: boolean;\n}\n\ninterface OutputStreamLike {\n emit(eventName: string | symbol, ...args: any[]): boolean;\n write(chunk: any): boolean | Promise<boolean>;\n end(): void;\n once(eventName: string | symbol, listener: (...args: any[]) => void): this;\n removeListener(eventName: string | symbol, listener: (...args: any[]) => void): this;\n}\n\n// ============================================================================\n// WorksheetWriter interface (to avoid circular dependency)\n// ============================================================================\n\nexport interface WorksheetWriterLike {\n id: number;\n name: string;\n rId?: string;\n committed?: boolean;\n stream: any;\n commit(): void;\n}\n\nexport interface WorksheetWriterConstructor<T extends WorksheetWriterLike> {\n new (options: {\n id: number;\n name: string;\n workbook: any;\n useSharedStrings: boolean;\n properties?: any;\n state?: any;\n pageSetup?: any;\n views?: any;\n autoFilter?: any;\n headerFooter?: any;\n }): T;\n}\n\n// ============================================================================\n// Base Class\n// ============================================================================\n\nexport abstract class WorkbookWriterBase<TWorksheetWriter extends WorksheetWriterLike> {\n created: Date;\n modified: Date;\n creator: string;\n lastModifiedBy: string;\n lastPrinted?: Date;\n useSharedStrings: boolean;\n sharedStrings: SharedStrings;\n styles: StylesXform;\n _definedNames: DefinedNames;\n _worksheets: TWorksheetWriter[];\n views: WorkbookView[];\n zipOptions?: Partial<ZipOptions>;\n compressionLevel: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;\n media: Medium[];\n commentRefs: CommentRef[];\n zip: Zip;\n stream: OutputStreamLike;\n promise: Promise<void[]>;\n protected _trueStreaming: boolean;\n protected WorksheetWriterClass: WorksheetWriterConstructor<TWorksheetWriter>;\n\n constructor(\n options: WorkbookWriterOptions,\n WorksheetWriterClass: WorksheetWriterConstructor<TWorksheetWriter>\n ) {\n this.WorksheetWriterClass = WorksheetWriterClass;\n this.created = options.created || new Date();\n this.modified = options.modified || this.created;\n this.creator = options.creator || \"ExcelTS\";\n this.lastModifiedBy = options.lastModifiedBy || \"ExcelTS\";\n this.lastPrinted = options.lastPrinted;\n\n this.useSharedStrings = options.useSharedStrings || false;\n this.sharedStrings = new SharedStrings();\n this.styles = options.useStyles ? new StylesXform(true) : new (StylesXform as any).Mock(true);\n this._definedNames = new DefinedNames();\n this._worksheets = [];\n this.views = [];\n\n this.zipOptions = options.zip;\n const level = options.zip?.zlib?.level ?? options.zip?.compressionOptions?.level ?? 1;\n this.compressionLevel = Math.max(0, Math.min(9, level)) as\n | 0\n | 1\n | 2\n | 3\n | 4\n | 5\n | 6\n | 7\n | 8\n | 9;\n\n this.media = [];\n this.commentRefs = [];\n this._trueStreaming = options.trueStreaming ?? false;\n\n // Create Zip instance\n this.zip = new Zip((err, data, final) => {\n if (err) {\n this.stream.emit(\"error\", err);\n } else {\n // `streaming-zip` already emits `Uint8Array`; avoid copying per chunk.\n this.stream.write(data);\n if (final) {\n this.stream.end();\n }\n }\n });\n\n // Setup output stream\n this.stream = this._createOutputStream(options);\n\n // Add initial files\n this.promise = Promise.all([this.addThemes(), this.addOfficeRels()]);\n }\n\n /**\n * Create output stream - can be overridden by Node.js to support filename\n */\n protected _createOutputStream(options: WorkbookWriterOptions): OutputStreamLike {\n if (options.stream) {\n return Writeable(options.stream);\n }\n return new StreamBuf();\n }\n\n get definedNames(): DefinedNames {\n return this._definedNames;\n }\n\n _openStream(path: string): InstanceType<typeof StreamBuf> {\n const stream = new StreamBuf({\n bufSize: this._trueStreaming ? 4096 : 65536,\n batch: !this._trueStreaming\n });\n\n const zipFile = new ZipDeflate(path, { level: this.compressionLevel });\n this.zip.add(zipFile);\n\n const onData = (chunk: Uint8Array) => zipFile.push(chunk);\n stream.on(\"data\", onData);\n\n stream.once(\"finish\", () => {\n stream.removeListener(\"data\", onData);\n zipFile.push(EMPTY_U8, true);\n stream.emit(\"zipped\");\n });\n\n return stream;\n }\n\n _addFile(data: string | Uint8Array, name: string, base64?: boolean): void {\n const zipFile = new ZipDeflate(name, { level: this.compressionLevel });\n this.zip.add(zipFile);\n\n let buffer: Uint8Array;\n if (base64) {\n const base64Data = typeof data === \"string\" ? data : TEXT_DECODER.decode(data);\n buffer = base64ToUint8Array(base64Data);\n } else if (typeof data === \"string\") {\n buffer = stringToUint8Array(data);\n } else {\n buffer = data;\n }\n\n zipFile.push(buffer, true);\n }\n\n _commitWorksheets(): Promise<void> {\n const commitWorksheet = (worksheet: TWorksheetWriter): Promise<void> => {\n if (!worksheet.committed) {\n return new Promise(resolve => {\n worksheet.stream.once(\"zipped\", () => resolve());\n worksheet.commit();\n });\n }\n return Promise.resolve();\n };\n const promises = this._worksheets.map(commitWorksheet);\n return promises.length ? Promise.all(promises).then(() => {}) : Promise.resolve();\n }\n\n async commit(): Promise<void> {\n await this.promise;\n await this._commitWorksheets();\n await this.addMedia();\n await Promise.all([\n this.addContentTypes(),\n this.addApp(),\n this.addCore(),\n this.addSharedStrings(),\n this.addStyles(),\n this.addWorkbookRels()\n ]);\n await this.addWorkbook();\n await this._finalize();\n }\n\n get nextId(): number {\n for (let i = 1; i < this._worksheets.length; i++) {\n if (!this._worksheets[i]) {\n return i;\n }\n }\n return this._worksheets.length || 1;\n }\n\n addImage(image: Image): number {\n const id = this.media.length;\n const medium: Medium = {\n ...image,\n type: \"image\" as const,\n name: `image${id}.${image.extension}`\n };\n this.media.push(medium);\n return id;\n }\n\n getImage(id: number): Image | undefined {\n return this.media[id];\n }\n\n addWorksheet(name?: string, options?: Partial<AddWorksheetOptions>): TWorksheetWriter {\n const opts = options || {};\n const useSharedStrings =\n opts.useSharedStrings !== undefined ? opts.useSharedStrings : this.useSharedStrings;\n\n if ((opts as any).tabColor) {\n console.trace(\"tabColor option has moved to { properties: tabColor: {...} }\");\n opts.properties = { tabColor: (opts as any).tabColor, ...opts.properties };\n }\n\n const id = this.nextId;\n name = name || `sheet${id}`;\n\n const worksheet = new this.WorksheetWriterClass({\n id,\n name,\n workbook: this,\n useSharedStrings,\n properties: opts.properties,\n state: opts.state,\n pageSetup: opts.pageSetup,\n views: opts.views,\n autoFilter: opts.autoFilter,\n headerFooter: opts.headerFooter\n });\n\n this._worksheets[id] = worksheet;\n return worksheet;\n }\n\n getWorksheet(id?: string | number): TWorksheetWriter | undefined {\n if (id === undefined) {\n return this._worksheets.find(() => true);\n }\n if (typeof id === \"number\") {\n return this._worksheets[id];\n }\n if (typeof id === \"string\") {\n return this._worksheets.find(ws => ws?.name === id);\n }\n return undefined;\n }\n\n addStyles(): Promise<void> {\n return new Promise(resolve => {\n this._addFile(this.styles.xml, OOXML_PATHS.xlStyles);\n resolve();\n });\n }\n\n addThemes(): Promise<void> {\n return new Promise(resolve => {\n this._addFile(theme1Xml, OOXML_PATHS.xlTheme1);\n resolve();\n });\n }\n\n addOfficeRels(): Promise<void> {\n return new Promise(resolve => {\n const xform = new RelationshipsXform();\n const xml = xform.toXml([\n { Id: \"rId1\", Type: RelType.OfficeDocument, Target: OOXML_PATHS.xlWorkbook },\n { Id: \"rId2\", Type: RelType.CoreProperties, Target: OOXML_PATHS.docPropsCore },\n { Id: \"rId3\", Type: RelType.ExtenderProperties, Target: OOXML_PATHS.docPropsApp }\n ]);\n this._addFile(xml, OOXML_PATHS.rootRels);\n resolve();\n });\n }\n\n addContentTypes(): Promise<void> {\n return new Promise(resolve => {\n const model = {\n worksheets: this._worksheets.filter(Boolean),\n sharedStrings: this.sharedStrings,\n commentRefs: this.commentRefs,\n media: this.media\n };\n const xform = new ContentTypesXform();\n this._addFile(xform.toXml(model), OOXML_PATHS.contentTypes);\n resolve();\n });\n }\n\n /**\n * Add media files - can be overridden by Node.js for file system support\n */\n addMedia(): Promise<void[]> {\n return Promise.all(\n this.media.map(async medium => {\n if (medium.type === \"image\") {\n const filename = mediaPath(medium.name);\n if (medium.buffer) {\n this._addFile(medium.buffer, filename);\n return;\n }\n if (medium.base64) {\n const content = medium.base64.substring(medium.base64.indexOf(\",\") + 1);\n this._addFile(content, filename, true);\n return;\n }\n if (medium.filename) {\n throw new Error(\n \"Loading images from filename is not supported in browser. Use buffer or base64.\"\n );\n }\n }\n throw new Error(\"Unsupported media\");\n })\n );\n }\n\n addApp(): Promise<void> {\n return new Promise(resolve => {\n const xform = new AppXform();\n this._addFile(\n xform.toXml({ worksheets: this._worksheets.filter(Boolean) }),\n OOXML_PATHS.docPropsApp\n );\n resolve();\n });\n }\n\n addCore(): Promise<void> {\n return new Promise(resolve => {\n const xform = new CoreXform();\n this._addFile(xform.toXml(this), OOXML_PATHS.docPropsCore);\n resolve();\n });\n }\n\n addSharedStrings(): Promise<void> {\n if (this.sharedStrings.count) {\n return new Promise(resolve => {\n const xform = new SharedStringsXform();\n this._addFile(xform.toXml(this.sharedStrings), OOXML_PATHS.xlSharedStrings);\n resolve();\n });\n }\n return Promise.resolve();\n }\n\n addWorkbookRels(): Promise<void> {\n let count = 1;\n const relationships: Array<{ Id: string; Type: string; Target: string }> = [\n { Id: `rId${count++}`, Type: RelType.Styles, Target: OOXML_REL_TARGETS.workbookStyles },\n { Id: `rId${count++}`, Type: RelType.Theme, Target: OOXML_REL_TARGETS.workbookTheme1 }\n ];\n if (this.sharedStrings.count) {\n relationships.push({\n Id: `rId${count++}`,\n Type: RelType.SharedStrings,\n Target: OOXML_REL_TARGETS.workbookSharedStrings\n });\n }\n this._worksheets.forEach(ws => {\n if (ws) {\n ws.rId = `rId${count++}`;\n relationships.push({\n Id: ws.rId,\n Type: RelType.Worksheet,\n Target: worksheetRelTarget(ws.id)\n });\n }\n });\n\n return new Promise(resolve => {\n const xform = new RelationshipsXform();\n this._addFile(xform.toXml(relationships), OOXML_PATHS.xlWorkbookRels);\n resolve();\n });\n }\n\n addWorkbook(): Promise<void> {\n const model = {\n worksheets: this._worksheets.filter(Boolean),\n definedNames: this._definedNames.model,\n views: this.views,\n properties: {},\n calcProperties: {}\n };\n return new Promise(resolve => {\n const xform = new WorkbookXform();\n xform.prepare(model);\n this._addFile(xform.toXml(model), OOXML_PATHS.xlWorkbook);\n resolve();\n });\n }\n\n _finalize(): Promise<this> {\n return new Promise((resolve, reject) => {\n const onError = (err: Error) => {\n this.stream.removeListener(\"finish\", onFinish);\n reject(err);\n };\n const onFinish = () => {\n this.stream.removeListener(\"error\", onError);\n resolve(this);\n };\n this.stream.once(\"error\", onError);\n this.stream.once(\"finish\", onFinish);\n this.zip.end();\n });\n }\n}\n\nexport const WorkbookWriterOptionsSchema = {\n useSharedStrings: [\"boolean\"],\n useStyles: [\"boolean\"],\n trueStreaming: [\"boolean\"]\n} as const;\n\n// ============================================================================\n// Browser-compatible WorkbookWriter\n// ============================================================================\n\nclass WorkbookWriter extends WorkbookWriterBase<WorksheetWriter> {\n constructor(options: WorkbookWriterOptions = {}) {\n super(options, WorksheetWriter);\n }\n}\n\nexport { WorkbookWriter };\n","type Listener = (...args: any[]) => void;\n\ninterface EventEmitterLike {\n on(event: string, listener: Listener): this;\n removeListener(event: string, listener: Listener): this;\n}\n\ninterface Readable extends EventEmitterLike {\n resume(): void;\n pause(): void;\n on(event: \"data\", listener: (chunk: any) => void): this;\n on(event: \"end\", listener: () => void): this;\n on(event: \"error\", listener: (err: Error) => void): this;\n}\n\nasync function* iterateStream(stream: Readable): AsyncGenerator<any> {\n const contents: any[] = [];\n let resolveDataPromise: (() => void) | null = null;\n\n const onData = (data: any) => {\n contents.push(data);\n if (resolveDataPromise) {\n resolveDataPromise();\n resolveDataPromise = null;\n }\n };\n stream.on(\"data\", onData);\n\n let ended = false;\n const onEnd = () => {\n ended = true;\n if (resolveDataPromise) {\n resolveDataPromise();\n resolveDataPromise = null;\n }\n };\n stream.on(\"end\", onEnd);\n\n let error: Error | false = false;\n const onError = (err: Error) => {\n error = err;\n if (resolveDataPromise) {\n resolveDataPromise();\n resolveDataPromise = null;\n }\n };\n stream.on(\"error\", onError);\n\n try {\n while (!ended || contents.length > 0) {\n if (contents.length === 0) {\n stream.resume();\n await new Promise<void>(resolve => {\n resolveDataPromise = resolve;\n });\n } else {\n stream.pause();\n const data = contents.shift();\n yield data;\n }\n if (error) {\n throw error;\n }\n }\n } finally {\n // Clean up listeners\n stream.removeListener(\"data\", onData);\n stream.removeListener(\"end\", onEnd);\n stream.removeListener(\"error\", onError);\n }\n}\n\nexport { iterateStream };\n","/**\n * WorksheetReader - Cross-Platform Streaming Worksheet Reader\n *\n * Works in both Node.js and Browser.\n */\n\nimport { EventEmitter } from \"@stream\";\nimport { parseSax } from \"@excel/utils/parse-sax\";\nimport { xmlDecode, isDateFmt, excelToDate } from \"@utils/utils\";\nimport { colCache } from \"@excel/utils/col-cache\";\nimport { Dimensions } from \"@excel/range\";\nimport { Row } from \"@excel/row\";\nimport { Column } from \"@excel/column\";\nimport type { InternalWorksheetOptions } from \"@excel/stream/workbook-reader.browser\";\nimport type { WorksheetState, CellErrorValue } from \"@excel/types\";\n\n// ============================================================================\n// Internal Types\n// ============================================================================\n\n/** Column model from parsed XML */\ninterface ParsedColumnModel {\n min: number;\n max: number;\n width: number;\n styleId: number;\n}\n\n/** Cell parsing state during XML processing */\ninterface CellParseState {\n ref: string;\n s: number;\n t?: string;\n f?: { text: string };\n v?: { text: string };\n}\n\n/** Hyperlink reference from worksheet XML */\nexport interface WorksheetHyperlink {\n ref: string;\n rId: string;\n}\n\n/** Events emitted during worksheet parsing */\nexport type WorksheetEventType = RowEvent[\"eventType\"] | HyperlinkEvent[\"eventType\"];\n\n/** Row event emitted during parsing */\nexport interface RowEvent {\n eventType: \"row\";\n value: Row;\n}\n\n/** Hyperlink event emitted during parsing */\nexport interface HyperlinkEvent {\n eventType: \"hyperlink\";\n value: WorksheetHyperlink;\n}\n\nexport type WorksheetEvent = RowEvent | HyperlinkEvent;\n\n// ============================================================================\n// Public Types\n// ============================================================================\n\nexport interface WorksheetReaderOptions {\n workbook: any;\n id: number;\n iterator: AsyncIterable<unknown>;\n options?: InternalWorksheetOptions;\n}\n\nclass WorksheetReader extends EventEmitter {\n workbook: any;\n id: number | string;\n sheetNo: number;\n iterator: AsyncIterable<unknown>;\n options: InternalWorksheetOptions;\n name: string;\n state?: WorksheetState;\n declare private _columns: Column[] | null;\n declare private _keys: Record<string, Column>;\n declare private _dimensions: Dimensions;\n hyperlinks?: Record<string, WorksheetHyperlink>;\n\n constructor({ workbook, id, iterator, options }: WorksheetReaderOptions) {\n super();\n\n this.workbook = workbook;\n this.id = id;\n this.sheetNo = typeof id === \"number\" ? id : parseInt(String(id), 10);\n this.iterator = iterator;\n this.options = options || {};\n\n // and a name\n this.name = `Sheet${this.id}`;\n\n // column definitions\n this._columns = null;\n this._keys = Object.create(null) as Record<string, Column>;\n\n // keep a record of dimensions\n this._dimensions = new Dimensions();\n }\n\n // destroy - not a valid operation for a streaming writer\n // even though some streamers might be able to, it's a bad idea.\n destroy(): void {\n throw new Error(\"Invalid Operation: destroy\");\n }\n\n // return the current dimensions of the reader\n get dimensions(): Dimensions {\n return this._dimensions;\n }\n\n // =========================================================================\n // Columns\n\n // get the current columns array.\n get columns(): Column[] | null {\n return this._columns;\n }\n\n // get a single column by col number. If it doesn't exist, it and any gaps before it\n // are created.\n getColumn(c: string | number): Column {\n if (typeof c === \"string\") {\n // if it matches a key'd column, return that\n const col = this._keys[c];\n if (col) {\n return col;\n }\n\n // otherwise, assume letter\n c = colCache.l2n(c);\n }\n if (!this._columns) {\n this._columns = [];\n }\n if (c > this._columns.length) {\n let n = this._columns.length + 1;\n while (n <= c) {\n this._columns.push(new Column(this as any, n++));\n }\n }\n return this._columns[c - 1];\n }\n\n getColumnKey(key: string): Column | undefined {\n return this._keys[key];\n }\n\n setColumnKey(key: string, value: Column): void {\n this._keys[key] = value;\n }\n\n deleteColumnKey(key: string): void {\n delete this._keys[key];\n }\n\n eachColumnKey(f: (column: Column, key: string) => void): void {\n const keys = this._keys;\n for (const key in keys) {\n f(keys[key], key);\n }\n }\n\n async read(): Promise<void> {\n try {\n for await (const events of this.parse()) {\n for (let i = 0; i < events.length; i++) {\n const event = events[i]!;\n this.emit(event.eventType, event.value);\n }\n }\n this.emit(\"finished\");\n } catch (error) {\n this.emit(\"error\", error);\n }\n }\n\n async *[Symbol.asyncIterator](): AsyncIterableIterator<Row> {\n for await (const events of this.parse()) {\n for (let i = 0; i < events.length; i++) {\n const event = events[i]!;\n if (event.eventType === \"row\") {\n yield event.value;\n }\n }\n }\n }\n\n async *parse(): AsyncIterableIterator<WorksheetEvent[]> {\n const { iterator, options } = this;\n let emitSheet = false;\n let emitHyperlinks = false;\n let hyperlinks: Record<string, WorksheetHyperlink> | null = null;\n switch (options.worksheets) {\n case \"emit\":\n emitSheet = true;\n break;\n case \"prep\":\n break;\n default:\n break;\n }\n switch (options.hyperlinks) {\n case \"emit\":\n emitHyperlinks = true;\n break;\n case \"cache\":\n this.hyperlinks = hyperlinks = Object.create(null) as Record<string, WorksheetHyperlink>;\n break;\n default:\n break;\n }\n if (!emitSheet && !emitHyperlinks && !hyperlinks) {\n return;\n }\n\n const shouldHandleHyperlinks = emitHyperlinks || hyperlinks !== null;\n\n // references\n const { sharedStrings, styles, properties } = this.workbook;\n\n // xml position\n let inCols = false;\n let inRows = false;\n let inHyperlinks = false;\n\n // parse state\n let cols: ParsedColumnModel[] | null = null;\n let row: Row | null = null;\n let c: CellParseState | null = null;\n let current: { text: string } | null = null;\n for await (const events of parseSax(iterator)) {\n let worksheetEvents: WorksheetEvent[] | null = null;\n for (let i = 0; i < events.length; i++) {\n const evt = events[i];\n const eventType = evt.eventType;\n const value = evt.value;\n if (eventType === \"opentag\") {\n const node = value;\n if (emitSheet) {\n switch (node.name) {\n case \"cols\":\n inCols = true;\n cols = [];\n break;\n case \"sheetData\":\n inRows = true;\n break;\n\n case \"col\":\n if (inCols) {\n cols!.push({\n min: parseInt(node.attributes.min, 10),\n max: parseInt(node.attributes.max, 10),\n width: parseFloat(node.attributes.width),\n styleId: parseInt(node.attributes.style || \"0\", 10)\n });\n }\n break;\n\n case \"row\":\n if (inRows) {\n const r = parseInt(node.attributes.r, 10);\n row = new Row(this as any, r);\n if (node.attributes.ht) {\n row.height = parseFloat(node.attributes.ht);\n }\n if (node.attributes.s) {\n const styleId = parseInt(node.attributes.s, 10);\n const style = styles.getStyleModel(styleId);\n if (style) {\n row.style = style;\n }\n }\n }\n break;\n case \"c\":\n if (row) {\n const styleAttr = node.attributes.s;\n c = {\n ref: node.attributes.r,\n s: styleAttr ? parseInt(styleAttr, 10) : 0,\n t: node.attributes.t\n };\n }\n break;\n case \"f\":\n if (c) {\n current = c.f = { text: \"\" };\n }\n break;\n case \"v\":\n if (c) {\n current = c.v = { text: \"\" };\n }\n break;\n case \"is\":\n case \"t\":\n if (c) {\n current = c.v = { text: \"\" };\n }\n break;\n case \"mergeCell\":\n break;\n default:\n break;\n }\n }\n\n // =================================================================\n //\n if (shouldHandleHyperlinks) {\n switch (node.name) {\n case \"hyperlinks\":\n inHyperlinks = true;\n break;\n case \"hyperlink\":\n if (inHyperlinks) {\n const hyperlink = {\n ref: node.attributes.ref,\n rId: node.attributes[\"r:id\"]\n };\n if (emitHyperlinks) {\n (worksheetEvents ||= []).push({ eventType: \"hyperlink\", value: hyperlink });\n } else {\n hyperlinks![hyperlink.ref] = hyperlink;\n }\n }\n break;\n default:\n break;\n }\n }\n } else if (eventType === \"text\") {\n // only text data is for sheet values\n if (emitSheet) {\n if (current) {\n current.text += value;\n }\n }\n } else if (eventType === \"closetag\") {\n const node = value;\n if (emitSheet) {\n switch (node.name) {\n case \"cols\":\n inCols = false;\n this._columns = Column.fromModel(cols!);\n break;\n case \"sheetData\":\n inRows = false;\n break;\n\n case \"row\":\n if (row) {\n this._dimensions.expandRow(row);\n (worksheetEvents ||= []).push({ eventType: \"row\", value: row });\n }\n row = null;\n break;\n\n case \"c\":\n if (row && c) {\n const address = colCache.decodeAddress(c.ref);\n const cell = row.getCell(address.col);\n if (c.s) {\n const style = styles.getStyleModel(c.s);\n if (style) {\n cell.style = style;\n }\n }\n\n if (c.f) {\n const cellValue: any = {\n formula: c.f.text\n };\n if (c.v) {\n if (c.t === \"str\") {\n cellValue.result = xmlDecode(c.v.text);\n } else {\n cellValue.result = parseFloat(c.v.text);\n }\n }\n cell.value = cellValue;\n } else if (c.v) {\n switch (c.t) {\n case \"s\": {\n const index = parseInt(c.v.text, 10);\n if (sharedStrings) {\n cell.value = sharedStrings[index];\n } else {\n // Streaming format - unresolved shared string reference\n (cell as { value: unknown }).value = {\n sharedString: index\n };\n }\n break;\n }\n\n case \"inlineStr\":\n case \"str\":\n cell.value = xmlDecode(c.v.text);\n break;\n\n case \"e\":\n cell.value = { error: c.v.text as CellErrorValue[\"error\"] };\n break;\n\n case \"b\":\n cell.value = parseInt(c.v.text, 10) !== 0;\n break;\n\n default: {\n const numFmtStr =\n typeof cell.numFmt === \"string\" ? cell.numFmt : cell.numFmt?.formatCode;\n if (numFmtStr && isDateFmt(numFmtStr)) {\n cell.value = excelToDate(\n parseFloat(c.v.text),\n properties?.model?.date1904\n );\n } else {\n cell.value = parseFloat(c.v.text);\n }\n break;\n }\n }\n }\n if (hyperlinks) {\n const hyperlink = hyperlinks[c.ref];\n if (hyperlink) {\n // Streaming-specific: assign text and hyperlink for further processing\n (cell as { text: unknown }).text = cell.value;\n cell.value = undefined;\n (cell as { hyperlink: unknown }).hyperlink = hyperlink;\n }\n }\n c = null;\n current = null;\n }\n break;\n default:\n break;\n }\n }\n if (shouldHandleHyperlinks) {\n switch (node.name) {\n case \"hyperlinks\":\n inHyperlinks = false;\n break;\n default:\n break;\n }\n }\n }\n }\n if (worksheetEvents && worksheetEvents.length > 0) {\n yield worksheetEvents;\n }\n }\n }\n}\n\nexport { WorksheetReader };\n","/**\n * HyperlinkReader - Streaming Hyperlink Reader\n *\n * Cross-platform implementation.\n */\n\nimport { EventEmitter } from \"@stream\";\nimport { parseSax } from \"@excel/utils/parse-sax\";\nimport { Enums } from \"@excel/enums\";\nimport { RelType } from \"@excel/xlsx/rel-type\";\nimport type { InternalWorksheetOptions } from \"@excel/stream/workbook-reader.browser\";\n\nexport interface HyperlinkReaderOptions<TWorkbook = unknown> {\n workbook: TWorkbook;\n id: number;\n iterator: AsyncIterable<unknown>;\n options: InternalWorksheetOptions;\n}\n\n/** Hyperlink relationship parsed from worksheet rels */\nexport interface Hyperlink {\n type: number;\n rId: string;\n target: string;\n targetMode: string;\n}\n\nclass HyperlinkReader extends EventEmitter {\n workbook: unknown;\n id: number;\n iterator: AsyncIterable<unknown>;\n options: InternalWorksheetOptions;\n hyperlinks?: Record<string, Hyperlink>;\n private _hyperlinkCount = 0;\n\n constructor({ workbook, id, iterator, options }: HyperlinkReaderOptions) {\n super();\n\n this.workbook = workbook;\n this.id = id;\n this.iterator = iterator;\n this.options = options;\n }\n\n get count(): number {\n return this.hyperlinks ? this._hyperlinkCount : 0;\n }\n\n each(fn: (hyperlink: Hyperlink, rId: string) => void): void {\n const hyperlinks = this.hyperlinks;\n if (!hyperlinks) {\n return;\n }\n\n for (const rId in hyperlinks) {\n fn(hyperlinks[rId], rId);\n }\n }\n\n async read(): Promise<void> {\n const { iterator } = this;\n const hyperlinkMode = this.options.hyperlinks;\n\n const emitHyperlinks = hyperlinkMode === \"emit\";\n const cacheHyperlinks = hyperlinkMode === \"cache\";\n\n let cachedHyperlinks: Record<string, Hyperlink> | null = null;\n if (cacheHyperlinks) {\n this._hyperlinkCount = 0;\n this.hyperlinks = cachedHyperlinks = Object.create(null) as Record<string, Hyperlink>;\n }\n\n if (!emitHyperlinks && !cacheHyperlinks) {\n this.emit(\"finished\");\n return;\n }\n\n try {\n for await (const events of parseSax(iterator)) {\n for (const { eventType, value } of events) {\n if (eventType !== \"opentag\") {\n continue;\n }\n\n const node = value;\n if (node.name !== \"Relationship\") {\n continue;\n }\n\n const attributes = node.attributes;\n if (attributes.Type !== RelType.Hyperlink) {\n continue;\n }\n\n const relationship: Hyperlink = {\n type: Enums.RelationshipType.Hyperlink,\n rId: attributes.Id,\n target: attributes.Target,\n targetMode: attributes.TargetMode\n };\n\n if (emitHyperlinks) {\n this.emit(\"hyperlink\", relationship);\n continue;\n }\n\n // cache mode\n const rId = relationship.rId;\n if (cachedHyperlinks && cachedHyperlinks[rId] === undefined) {\n this._hyperlinkCount += 1;\n }\n cachedHyperlinks![rId] = relationship;\n }\n }\n this.emit(\"finished\");\n } catch (error) {\n this.emit(\"error\", error);\n }\n }\n}\n\nexport { HyperlinkReader };\n","/**\n * WorkbookReader - Browser Streaming Workbook Reader\n *\n * This module contains the full shared implementation for the streaming\n * workbook reader and a browser-compatible `WorkbookReader` that buffers\n * waiting worksheets in memory.\n *\n * Node.js uses `workbook-reader.ts`, which extends the same base implementation\n * with filesystem-specific features (filename input + temp-file buffering).\n */\n\nimport { EventEmitter, Readable } from \"@stream\";\nimport { createParse } from \"@archive/parse\";\nimport { iterateStream } from \"@excel/utils/iterate-stream\";\nimport {\n getWorksheetNoFromWorksheetPath,\n getWorksheetNoFromWorksheetRelsPath,\n normalizeZipPath,\n OOXML_PATHS,\n worksheetRelTarget\n} from \"@excel/utils/ooxml-paths\";\nimport { parseSax } from \"@excel/utils/parse-sax\";\nimport { StylesXform } from \"@excel/xlsx/xform/style/styles-xform\";\nimport { WorkbookXform } from \"@excel/xlsx/xform/book/workbook-xform\";\nimport { RelationshipsXform } from \"@excel/xlsx/xform/core/relationships-xform\";\nimport type { WorksheetState, Font, WorkbookProperties } from \"@excel/types\";\n\nimport { WorksheetReader } from \"@excel/stream/worksheet-reader\";\nimport { HyperlinkReader, type Hyperlink } from \"@excel/stream/hyperlink-reader\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface InternalWorksheetOptions {\n worksheets?: \"emit\" | \"ignore\" | \"prep\";\n sharedStrings?: \"cache\" | \"emit\" | \"ignore\";\n hyperlinks?: \"cache\" | \"emit\" | \"ignore\";\n styles?: \"cache\" | \"ignore\";\n entries?: \"emit\" | \"ignore\";\n}\n\nexport interface SharedStringRichText {\n richText: Array<{ font: Partial<Font> | null; text: string | null }>;\n}\n\nexport type SharedStringValue = string | SharedStringRichText;\n\nexport interface WorkbookRelationship {\n Id: string;\n Target: string;\n Type?: string;\n}\n\nexport interface SheetMetadata {\n id: number;\n name: string;\n state?: WorksheetState;\n rId: string;\n}\n\nexport interface WorkbookModel {\n sheets?: SheetMetadata[];\n properties?: Partial<WorkbookProperties>;\n views?: unknown[];\n definedNames?: unknown[];\n}\n\nexport interface WorkbookPropertiesXform {\n model?: Partial<WorkbookProperties>;\n}\n\nexport interface EntryPayload {\n type: \"shared-strings\" | \"styles\" | \"workbook\" | \"worksheet\" | \"hyperlinks\";\n id?: string;\n}\n\nexport type ParseEventType = \"shared-strings\" | \"worksheet\" | \"hyperlinks\";\n\nexport interface SharedStringEvent {\n eventType: \"shared-strings\";\n value: { index: number; text: SharedStringValue };\n}\n\nexport interface WorksheetReadyEvent<TWorksheetReader> {\n eventType: \"worksheet\";\n value: TWorksheetReader;\n}\n\nexport interface HyperlinksEvent<THyperlinkReader> {\n eventType: \"hyperlinks\";\n value: THyperlinkReader;\n}\n\nexport type ParseEvent<TWorksheetReader, THyperlinkReader> =\n | SharedStringEvent\n | WorksheetReadyEvent<TWorksheetReader>\n | HyperlinksEvent<THyperlinkReader>;\n\nexport interface WaitingWorksheetEntry {\n eventType: \"waiting-worksheet\";\n sheetNo: string;\n entry: any;\n}\n\nexport type CommonInput = Uint8Array | ArrayBuffer | Readable | ReadableStream<Uint8Array>;\n\nexport interface WorkbookReaderOptions {\n worksheets?: \"emit\" | \"ignore\";\n sharedStrings?: \"cache\" | \"emit\" | \"ignore\";\n hyperlinks?: \"cache\" | \"emit\" | \"ignore\";\n styles?: \"cache\" | \"ignore\";\n entries?: \"emit\" | \"ignore\";\n}\n\n/** Constructor type for WorksheetReader/HyperlinkReader */\nexport interface ReaderConstructor<TReader, TWorkbook> {\n new (params: {\n workbook: TWorkbook;\n id: number;\n iterator: AsyncIterable<never>;\n options: InternalWorksheetOptions;\n }): TReader;\n}\n\n// ============================================================================\n// Base Class\n// ============================================================================\n\nexport abstract class WorkbookReaderBase<\n TInput,\n TWorksheetReader extends EventEmitter & {\n id?: number | string;\n name?: string;\n state?: WorksheetState;\n },\n THyperlinkReader extends EventEmitter & { hyperlinks?: Record<string, Hyperlink> },\n TWaitingWorksheet = unknown\n> extends EventEmitter {\n input: TInput;\n options: {\n worksheets: \"emit\" | \"ignore\";\n sharedStrings: \"cache\" | \"emit\" | \"ignore\";\n hyperlinks: \"cache\" | \"emit\" | \"ignore\";\n styles: \"cache\" | \"ignore\";\n entries: \"emit\" | \"ignore\";\n };\n styles: StylesXform;\n stream?: Readable;\n sharedStrings?: SharedStringValue[];\n workbookRels?: WorkbookRelationship[];\n properties?: WorkbookPropertiesXform;\n model?: WorkbookModel;\n\n protected _hyperlinkReadersBySheetNo?: Record<string, THyperlinkReader>;\n\n protected _workbookRelIdByTarget?: Record<string, string>;\n protected _sheetByRelId?: Record<string, SheetMetadata>;\n\n getHyperlinkReader(sheetNo: number | string): THyperlinkReader | undefined {\n return this._hyperlinkReadersBySheetNo?.[String(sheetNo)];\n }\n\n getHyperlink(sheetNo: number | string, rId: string): Hyperlink | undefined {\n return this.getHyperlinkReader(sheetNo)?.hyperlinks?.[rId];\n }\n\n getHyperlinkTarget(sheetNo: number | string, rId: string): string | undefined {\n return this.getHyperlink(sheetNo, rId)?.target;\n }\n\n // Reader classes passed by subclass\n protected WorksheetReaderClass: ReaderConstructor<TWorksheetReader, this>;\n protected HyperlinkReaderClass: ReaderConstructor<THyperlinkReader, this>;\n\n constructor(\n input: TInput,\n options: WorkbookReaderOptions,\n WorksheetReaderClass: ReaderConstructor<TWorksheetReader, any>,\n HyperlinkReaderClass: ReaderConstructor<THyperlinkReader, any>\n ) {\n super();\n this.input = input;\n this.WorksheetReaderClass = WorksheetReaderClass;\n this.HyperlinkReaderClass = HyperlinkReaderClass;\n\n this.options = {\n worksheets: \"emit\",\n sharedStrings: \"cache\",\n hyperlinks: \"ignore\",\n styles: \"ignore\",\n entries: \"ignore\",\n ...options\n };\n\n this.styles = new StylesXform();\n this.styles.init();\n }\n\n // Default implementation for CommonInput types\n _getStream(input: TInput): Readable {\n if (input instanceof Readable) {\n return input;\n }\n\n // Accept Web ReadableStream (browser fetch() body, Node 18+ fetch(), etc.)\n if (\n input &&\n typeof input === \"object\" &&\n typeof (input as unknown as ReadableStream<Uint8Array>).getReader === \"function\"\n ) {\n const fromWeb = (Readable as any).fromWeb as\n | undefined\n | ((stream: ReadableStream<Uint8Array>) => Readable);\n if (typeof fromWeb === \"function\") {\n return fromWeb(input as unknown as ReadableStream<Uint8Array>);\n }\n\n // Browser wrapper supports `{ stream }` constructor option.\n // Node's Readable does not, so this is best-effort.\n try {\n return new (Readable as any)({\n stream: input as unknown as ReadableStream<Uint8Array>\n });\n } catch {\n throw new Error(\"Could not recognise input: ReadableStream\");\n }\n }\n\n let data: unknown = input;\n if (data instanceof ArrayBuffer) {\n data = new Uint8Array(data);\n }\n if (data instanceof Uint8Array) {\n // Cross-platform: both Node's Readable and our browser Readable implement `.from()`.\n return (Readable as any).from([data]) as Readable;\n }\n throw new Error(`Could not recognise input: ${input}`);\n }\n\n // Subclass implements storage strategy\n abstract _storeWaitingWorksheet(sheetNo: string, entry: any): Promise<TWaitingWorksheet>;\n abstract _processWaitingWorksheets(\n waitingWorksheets: TWaitingWorksheet[]\n ): AsyncIterableIterator<WorksheetReadyEvent<TWorksheetReader>>;\n\n _cleanupWaitingWorksheets(_waitingWorksheets: TWaitingWorksheet[]): void {\n // Default: attempt best-effort cleanup if the stored object provides it.\n for (const ws of _waitingWorksheets as any[]) {\n if (ws && typeof ws.cleanup === \"function\") {\n ws.cleanup();\n }\n }\n }\n\n // Unified implementations using passed-in classes\n _createWorksheetReader(params: {\n id: number;\n iterator: AsyncIterable<unknown>;\n options: InternalWorksheetOptions;\n }): TWorksheetReader {\n return new this.WorksheetReaderClass({\n workbook: this,\n id: params.id,\n iterator: params.iterator as AsyncIterable<never>,\n options: params.options\n });\n }\n\n _createHyperlinkReader(params: {\n id: number;\n iterator: AsyncIterable<unknown>;\n options: InternalWorksheetOptions;\n }): THyperlinkReader {\n return new this.HyperlinkReaderClass({\n workbook: this,\n id: params.id,\n iterator: params.iterator as AsyncIterable<never>,\n options: params.options\n });\n }\n\n async read(input?: TInput, options?: WorkbookReaderOptions): Promise<void> {\n try {\n for await (const { eventType, value } of this.parse(input, options)) {\n switch (eventType) {\n case \"shared-strings\":\n this.emit(eventType, value);\n break;\n case \"worksheet\":\n this.emit(eventType, value);\n await (value as TWorksheetReader & { read(): Promise<void> }).read();\n break;\n case \"hyperlinks\":\n this.emit(eventType, value);\n break;\n }\n }\n this.emit(\"end\");\n this.emit(\"finished\");\n } catch (error) {\n this.emit(\"error\", error);\n }\n }\n\n async *[Symbol.asyncIterator](): AsyncIterableIterator<TWorksheetReader> {\n for await (const { eventType, value } of this.parse()) {\n if (eventType === \"worksheet\") {\n yield value as TWorksheetReader;\n }\n }\n }\n\n async *parse(\n input?: TInput,\n options?: WorkbookReaderOptions\n ): AsyncIterableIterator<ParseEvent<TWorksheetReader, THyperlinkReader>> {\n if (options) {\n this.options = options as typeof this.options;\n }\n const stream = (this.stream = this._getStream(input || this.input));\n const waitingWorksheets: TWaitingWorksheet[] = [];\n\n try {\n for await (const event of this._parseEntries(stream)) {\n if (event.eventType === \"waiting-worksheet\") {\n const stored = await this._storeWaitingWorksheet(event.sheetNo, event.entry);\n waitingWorksheets.push(stored);\n } else {\n yield event as ParseEvent<TWorksheetReader, THyperlinkReader>;\n }\n }\n yield* this._processWaitingWorksheets(waitingWorksheets);\n } catch (error) {\n this._cleanupWaitingWorksheets(waitingWorksheets);\n throw error;\n }\n }\n\n _emitEntry(payload: EntryPayload): void {\n if (this.options.entries === \"emit\") {\n this.emit(\"entry\", payload);\n }\n }\n\n async _parseRels(entry: Parameters<typeof iterateStream>[0]): Promise<void> {\n const xform = new RelationshipsXform();\n this.workbookRels = await xform.parseStream(iterateStream(entry));\n\n // Build fast lookup for worksheet relationship ids.\n this._workbookRelIdByTarget = Object.create(null) as Record<string, string>;\n for (const rel of this.workbookRels || []) {\n if (rel?.Target && rel?.Id) {\n this._workbookRelIdByTarget[rel.Target] = rel.Id;\n }\n }\n }\n\n async _parseWorkbook(entry: Parameters<typeof iterateStream>[0]): Promise<void> {\n this._emitEntry({ type: \"workbook\" });\n const workbook = new WorkbookXform();\n this.model = await workbook.parseStream(iterateStream(entry));\n this.properties = workbook.map?.workbookPr as WorkbookPropertiesXform;\n\n // Build fast lookup for sheet metadata by relationship id.\n this._sheetByRelId = Object.create(null) as Record<string, SheetMetadata>;\n for (const sheet of this.model?.sheets || []) {\n this._sheetByRelId[sheet.rId] = sheet;\n }\n }\n\n async *_parseSharedStrings(\n entry: Parameters<typeof iterateStream>[0]\n ): AsyncIterableIterator<{ index: number; text: SharedStringValue }> {\n this._emitEntry({ type: \"shared-strings\" });\n switch (this.options.sharedStrings) {\n case \"cache\":\n this.sharedStrings = [];\n break;\n case \"emit\":\n break;\n default:\n return;\n }\n\n let text: string | null = null;\n let richText: Array<{ font: Partial<Font> | null; text: string | null }> = [];\n let index = 0;\n let font: Partial<Font> | null = null;\n let inRichText = false;\n\n for await (const events of parseSax(iterateStream(entry))) {\n for (const { eventType, value } of events) {\n if (eventType === \"opentag\") {\n const node = value;\n switch (node.name) {\n case \"b\":\n font = font || {};\n font.bold = true;\n break;\n case \"charset\":\n font = font || {};\n font.charset = parseInt(node.attributes.charset, 10);\n break;\n case \"color\":\n font = font || {};\n font.color = {};\n if (node.attributes.rgb) {\n font.color.argb = node.attributes.rgb;\n }\n if (node.attributes.val) {\n font.color.argb = node.attributes.val;\n }\n if (node.attributes.theme) {\n font.color.theme = node.attributes.theme;\n }\n break;\n case \"family\":\n font = font || {};\n font.family = parseInt(node.attributes.val, 10);\n break;\n case \"i\":\n font = font || {};\n font.italic = true;\n break;\n case \"outline\":\n font = font || {};\n font.outline = true;\n break;\n case \"rFont\":\n font = font || {};\n font.name = node.attributes.val;\n break;\n case \"r\":\n inRichText = true;\n break;\n case \"si\":\n font = null;\n richText = [];\n text = null;\n inRichText = false;\n break;\n case \"sz\":\n font = font || {};\n font.size = parseInt(node.attributes.val, 10);\n break;\n case \"strike\":\n font = font || {};\n font.strike = true;\n break;\n case \"t\":\n text = null;\n break;\n case \"u\":\n font = font || {};\n font.underline = true;\n break;\n case \"vertAlign\":\n font = font || {};\n font.vertAlign = node.attributes.val;\n break;\n }\n } else if (eventType === \"text\") {\n text = text ? text + value : value;\n } else if (eventType === \"closetag\") {\n const node = value;\n switch (node.name) {\n case \"r\":\n if (inRichText) {\n richText.push({ font, text });\n font = null;\n text = null;\n }\n break;\n case \"si\":\n if (this.options.sharedStrings === \"cache\") {\n this.sharedStrings!.push(richText.length ? { richText } : text || \"\");\n } else if (this.options.sharedStrings === \"emit\") {\n yield { index: index++, text: richText.length ? { richText } : text || \"\" };\n }\n richText = [];\n font = null;\n text = null;\n inRichText = false;\n break;\n }\n }\n }\n }\n }\n\n async _parseStyles(entry: Parameters<typeof iterateStream>[0]): Promise<void> {\n this._emitEntry({ type: \"styles\" });\n if (this.options.styles === \"cache\") {\n this.styles = new StylesXform();\n await this.styles.parseStream(iterateStream(entry));\n }\n }\n\n *_parseWorksheet(\n iterator: AsyncIterable<unknown>,\n sheetNo: string\n ): IterableIterator<WorksheetReadyEvent<TWorksheetReader>> {\n this._emitEntry({ type: \"worksheet\", id: sheetNo });\n const sheetNoNumber = parseInt(sheetNo, 10);\n const worksheetReader = this._createWorksheetReader({\n id: sheetNoNumber,\n iterator,\n options: this.options as InternalWorksheetOptions\n });\n\n // Preserve original sheet index from the zip path. `worksheetReader.id` may be remapped\n // later using workbook metadata.\n (worksheetReader as any).sheetNo = sheetNoNumber;\n\n const relId = this._workbookRelIdByTarget?.[worksheetRelTarget(sheetNo)];\n const matchingSheet = relId ? this._sheetByRelId?.[relId] : undefined;\n if (matchingSheet) {\n worksheetReader.id = matchingSheet.id;\n worksheetReader.name = matchingSheet.name;\n worksheetReader.state = matchingSheet.state;\n }\n if (this.options.worksheets === \"emit\") {\n yield { eventType: \"worksheet\", value: worksheetReader };\n }\n }\n\n protected async *_parseHyperlinks(\n iterator: AsyncIterable<unknown>,\n sheetNo: string\n ): AsyncIterableIterator<HyperlinksEvent<THyperlinkReader>> {\n this._emitEntry({ type: \"hyperlinks\", id: sheetNo });\n const hyperlinksReader = this._createHyperlinkReader({\n id: parseInt(sheetNo, 10),\n iterator,\n options: this.options as InternalWorksheetOptions\n });\n\n if (this.options.hyperlinks === \"cache\") {\n if (!this._hyperlinkReadersBySheetNo) {\n this._hyperlinkReadersBySheetNo = Object.create(null) as Record<string, THyperlinkReader>;\n }\n this._hyperlinkReadersBySheetNo[sheetNo] = hyperlinksReader;\n\n const readFn = (hyperlinksReader as any).read as undefined | (() => Promise<void>);\n if (typeof readFn === \"function\") {\n await readFn.call(hyperlinksReader);\n }\n return;\n }\n\n if (this.options.hyperlinks === \"emit\") {\n yield { eventType: \"hyperlinks\", value: hyperlinksReader };\n }\n }\n\n protected async *_parseEntries(\n stream: Readable\n ): AsyncIterableIterator<ParseEvent<TWorksheetReader, THyperlinkReader> | WaitingWorksheetEntry> {\n const zip = createParse({ forceStream: true });\n stream.on(\"error\", (err: Error) => zip.emit(\"error\", err));\n stream.pipe(zip);\n\n for await (const entry of iterateStream(zip)) {\n let sheetNo;\n const normalizedPath = normalizeZipPath(entry.path);\n\n switch (normalizedPath) {\n case OOXML_PATHS.rootRels:\n break;\n case OOXML_PATHS.xlWorkbookRels:\n await this._parseRels(entry);\n break;\n case OOXML_PATHS.xlWorkbook:\n await this._parseWorkbook(entry);\n break;\n case OOXML_PATHS.xlSharedStrings:\n for await (const item of this._parseSharedStrings(entry)) {\n yield { eventType: \"shared-strings\", value: item };\n }\n break;\n case OOXML_PATHS.xlStyles:\n await this._parseStyles(entry);\n break;\n default:\n sheetNo = getWorksheetNoFromWorksheetPath(normalizedPath)?.toString();\n if (sheetNo) {\n // Performance: only wait for sharedStrings when they are actually needed.\n const hasPrerequisites =\n !!this.workbookRels &&\n (this.options.sharedStrings !== \"cache\" || !!this.sharedStrings);\n if (hasPrerequisites) {\n yield* this._parseWorksheet(iterateStream(entry), sheetNo);\n continue;\n } else {\n yield { eventType: \"waiting-worksheet\", sheetNo, entry };\n continue;\n }\n }\n\n sheetNo = getWorksheetNoFromWorksheetRelsPath(normalizedPath)?.toString();\n if (sheetNo) {\n yield* this._parseHyperlinks(iterateStream(entry), sheetNo);\n continue;\n }\n break;\n }\n entry.autodrain();\n }\n }\n}\n\nexport const WorkbookReaderOptionsSchema = {\n worksheets: [\"emit\", \"ignore\"],\n sharedStrings: [\"cache\", \"emit\", \"ignore\"],\n hyperlinks: [\"cache\", \"emit\", \"ignore\"],\n styles: [\"cache\", \"ignore\"],\n entries: [\"emit\", \"ignore\"]\n} as const;\n\n// ============================================================================\n// Browser-compatible WorkbookReader (buffers waiting worksheets in memory)\n// ============================================================================\n\ninterface WaitingWorksheet {\n sheetNo: string;\n data: Uint8Array[];\n}\n\nclass WorkbookReader extends WorkbookReaderBase<\n CommonInput,\n WorksheetReader,\n HyperlinkReader,\n WaitingWorksheet\n> {\n constructor(input: CommonInput, options: WorkbookReaderOptions = {}) {\n super(input, options, WorksheetReader, HyperlinkReader);\n }\n\n async _storeWaitingWorksheet(sheetNo: string, entry: any): Promise<WaitingWorksheet> {\n const chunks: Uint8Array[] = [];\n const encoder = new TextEncoder();\n for await (const chunk of iterateStream(entry)) {\n if (chunk instanceof Uint8Array) {\n chunks.push(chunk);\n } else if (typeof chunk === \"string\") {\n chunks.push(encoder.encode(chunk));\n }\n }\n return { sheetNo, data: chunks };\n }\n\n async *_processWaitingWorksheets(\n waitingWorksheets: WaitingWorksheet[]\n ): AsyncIterableIterator<WorksheetReadyEvent<WorksheetReader>> {\n for (const ws of waitingWorksheets) {\n const iterator = (async function* () {\n for (const chunk of ws.data) {\n yield chunk;\n }\n })();\n yield* this._parseWorksheet(iterator, ws.sheetNo);\n }\n }\n}\n\nexport { WorkbookReader };\n","/**\n * Workbook - Cross-platform Excel Workbook\n *\n * Full functionality:\n * - xlsx: File/stream/buffer support (file operations Node.js only)\n * - csv: CSV read/write support (file operations Node.js only)\n * - streaming: createStreamWriter/createStreamReader for large files\n *\n * Note: Browser build uses rolldown aliases to swap in browser-specific\n * implementations for xlsx, csv, and stream modules.\n */\n\nimport { Worksheet, type WorksheetModel } from \"@excel/worksheet\";\nimport { DefinedNames, type DefinedNameModel } from \"@excel/defined-names\";\nimport { XLSX } from \"@excel/xlsx/xlsx\";\nimport { CSV } from \"@csv/csv\";\nimport { WorkbookWriter, type WorkbookWriterOptions } from \"@excel/stream/workbook-writer\";\nimport { WorkbookReader, type WorkbookReaderOptions } from \"@excel/stream/workbook-reader\";\nimport type { Readable } from \"@stream\";\nimport type { PivotTable } from \"@excel/pivot-table\";\nimport type {\n AddWorksheetOptions,\n CalculationProperties,\n Image,\n WorkbookProperties,\n WorkbookView,\n Buffer as ExcelBuffer\n} from \"@excel/types\";\n\n// =============================================================================\n// Internal Types\n// =============================================================================\n\n/** Internal media type - more flexible than public Media type */\nexport interface WorkbookMedia {\n type: string;\n extension: string;\n filename?: string;\n buffer?: ExcelBuffer | Uint8Array;\n base64?: string;\n name?: string;\n}\n\n/** Internal model type for serialization */\nexport interface WorkbookModel {\n creator?: string;\n lastModifiedBy?: string;\n lastPrinted?: Date;\n created: Date;\n modified: Date;\n properties: Partial<WorkbookProperties>;\n worksheets: WorksheetModel[];\n sheets?: WorksheetModel[];\n definedNames: DefinedNameModel[];\n views: WorkbookView[];\n company: string;\n manager: string;\n title: string;\n subject: string;\n keywords: string;\n category: string;\n description: string;\n language?: string;\n revision?: number;\n contentStatus?: string;\n themes?: unknown;\n media: WorkbookMedia[];\n pivotTables: PivotTable[];\n /** Loaded pivot tables from file - used during reconciliation */\n loadedPivotTables?: any[];\n calcProperties: Partial<CalculationProperties>;\n}\n\n// =============================================================================\n// Workbook Class\n// =============================================================================\n\nclass Workbook {\n // ===========================================================================\n // Static Properties\n // ===========================================================================\n\n /**\n * Streaming workbook writer class for large files.\n * @example\n * // Node.js: new Workbook.Writer({ filename: \"large.xlsx\" })\n * // Browser: new Workbook.Writer({ stream: writableStream })\n */\n static Writer = WorkbookWriter;\n\n /**\n * Streaming workbook reader class for large files.\n * @example\n * // Node.js: new Workbook.Reader(\"large.xlsx\")\n * // Browser: new Workbook.Reader(readableStream)\n */\n static Reader = WorkbookReader;\n\n // ===========================================================================\n // Instance Properties - Metadata\n // ===========================================================================\n\n declare public category: string;\n declare public company: string;\n declare public created: Date;\n declare public description: string;\n declare public keywords: string;\n declare public manager: string;\n declare public modified: Date;\n declare public subject: string;\n declare public title: string;\n declare public creator?: string;\n declare public lastModifiedBy?: string;\n declare public lastPrinted?: Date;\n declare public language?: string;\n declare public revision?: number;\n declare public contentStatus?: string;\n\n // ===========================================================================\n // Instance Properties - Data\n // ===========================================================================\n\n declare public properties: Partial<WorkbookProperties>;\n declare public calcProperties: Partial<CalculationProperties>;\n declare public views: WorkbookView[];\n declare public media: WorkbookMedia[];\n declare public pivotTables: PivotTable[];\n\n // ===========================================================================\n // Private Properties\n // ===========================================================================\n\n declare private _worksheets: Worksheet[];\n declare private _definedNames: DefinedNames;\n declare private _themes?: unknown;\n private _xlsx?: XLSX;\n private _csv?: CSV;\n\n // ===========================================================================\n // Constructor\n // ===========================================================================\n\n constructor() {\n this.category = \"\";\n this.company = \"\";\n this.created = new Date();\n this.description = \"\";\n this.keywords = \"\";\n this.manager = \"\";\n this.modified = this.created;\n this.properties = {};\n this.calcProperties = {};\n this._worksheets = [];\n this.subject = \"\";\n this.title = \"\";\n this.views = [];\n this.media = [];\n this.pivotTables = [];\n this._definedNames = new DefinedNames();\n }\n\n // ===========================================================================\n // Format Operations (xlsx, csv)\n // ===========================================================================\n\n /**\n * xlsx file format operations\n * Node.js: readFile, writeFile, read (stream), write (stream), load (buffer), writeBuffer\n * Browser: load (buffer), writeBuffer\n */\n get xlsx(): XLSX {\n if (!this._xlsx) {\n this._xlsx = new XLSX(this);\n }\n return this._xlsx;\n }\n\n /**\n * csv file format operations\n * Node.js: readFile, writeFile, read (stream), write (stream)\n * Browser: load (string/buffer), writeString, writeBuffer\n */\n get csv(): CSV {\n if (!this._csv) {\n this._csv = new CSV(this as any);\n }\n return this._csv;\n }\n\n // ===========================================================================\n // Static Factory Methods for Streaming\n // ===========================================================================\n\n /**\n * Create a streaming workbook writer for large files.\n * This is more memory-efficient than using Workbook for large datasets.\n *\n * @param options - Options for the workbook writer\n * - Node.js: can use { filename } or { stream }\n * - Browser: must use { stream }\n * @returns A new WorkbookWriter instance\n *\n * @example\n * ```ts\n * // Node.js with filename\n * const writer = Workbook.createStreamWriter({ filename: \"large-file.xlsx\" });\n *\n * // Browser or Node.js with stream\n * const writer = Workbook.createStreamWriter({ stream: writableStream });\n *\n * const sheet = writer.addWorksheet(\"Sheet1\");\n * for (let i = 0; i < 1000000; i++) {\n * sheet.addRow([i, `Row ${i}`]).commit();\n * }\n * await writer.commit();\n * ```\n */\n static createStreamWriter(options?: WorkbookWriterOptions): WorkbookWriter {\n return new WorkbookWriter(options);\n }\n\n /**\n * Create a streaming workbook reader for large files.\n * This is more memory-efficient than using Workbook.xlsx.readFile for large datasets.\n *\n * @param input - File path (Node.js only) or readable stream\n * @param options - Options for the workbook reader\n * @returns A new WorkbookReader instance\n *\n * @example\n * ```ts\n * // Node.js with file path\n * const reader = Workbook.createStreamReader(\"large-file.xlsx\");\n *\n * // Browser or Node.js with stream\n * const reader = Workbook.createStreamReader(readableStream);\n *\n * for await (const event of reader) {\n * if (event.eventType === \"worksheet\") {\n * const worksheet = event.value;\n * for await (const row of worksheet) {\n * console.log(row.values);\n * }\n * }\n * }\n * ```\n */\n static createStreamReader(\n input: string | Readable,\n options?: WorkbookReaderOptions\n ): WorkbookReader {\n return new WorkbookReader(input, options);\n }\n\n // ===========================================================================\n // Worksheet Management\n // ===========================================================================\n\n get nextId(): number {\n // Find the next unique spot to add worksheet\n for (let i = 1; i < this._worksheets.length; i++) {\n if (!this._worksheets[i]) {\n return i;\n }\n }\n return this._worksheets.length || 1;\n }\n\n /**\n * Add a new worksheet and return a reference to it\n */\n addWorksheet(name?: string, options?: AddWorksheetOptions): Worksheet {\n const id = this.nextId;\n\n const lastOrderNo = this._worksheets.reduce(\n (acc, ws) => ((ws && ws.orderNo) > acc ? ws.orderNo : acc),\n 0\n );\n const worksheetOptions = {\n ...options,\n id,\n name,\n orderNo: lastOrderNo + 1,\n workbook: this as any\n };\n\n const worksheet = new Worksheet(worksheetOptions);\n\n this._worksheets[id] = worksheet;\n return worksheet;\n }\n\n removeWorksheetEx(worksheet: Worksheet): void {\n delete this._worksheets[worksheet.id];\n }\n\n removeWorksheet(id: number | string): void {\n const worksheet = this.getWorksheet(id);\n if (worksheet) {\n worksheet.destroy();\n }\n }\n\n /**\n * Fetch sheet by name or id\n */\n getWorksheet(id?: number | string): Worksheet | undefined {\n if (id === undefined) {\n return this._worksheets.find(Boolean);\n }\n if (typeof id === \"number\") {\n return this._worksheets[id];\n }\n if (typeof id === \"string\") {\n return this._worksheets.find(worksheet => worksheet && worksheet.name === id);\n }\n return undefined;\n }\n\n /**\n * Return a clone of worksheets in order\n */\n get worksheets(): Worksheet[] {\n return this._worksheets\n .slice(1)\n .sort((a, b) => a.orderNo - b.orderNo)\n .filter(Boolean);\n }\n\n /**\n * Iterate over all sheets.\n *\n * Note: `workbook.worksheets.forEach` will still work but this is better.\n */\n eachSheet(callback: (sheet: Worksheet, id: number) => void): void {\n this.worksheets.forEach(sheet => {\n callback(sheet, sheet.id);\n });\n }\n\n // ===========================================================================\n // Defined Names\n // ===========================================================================\n\n get definedNames(): DefinedNames {\n return this._definedNames;\n }\n\n // ===========================================================================\n // Themes\n // ===========================================================================\n\n clearThemes(): void {\n // Note: themes are not an exposed feature, meddle at your peril!\n this._themes = undefined;\n }\n\n // ===========================================================================\n // Images\n // ===========================================================================\n\n /**\n * Add Image to Workbook and return the id\n */\n addImage(image: Image): number {\n const id = this.media.length;\n this.media.push({ ...image, type: \"image\" });\n return id;\n }\n\n getImage(id: number | string): WorkbookMedia | undefined {\n return this.media[Number(id)];\n }\n\n // ===========================================================================\n // Model (Serialization)\n // ===========================================================================\n\n get model(): WorkbookModel {\n return {\n creator: this.creator || \"Unknown\",\n lastModifiedBy: this.lastModifiedBy || \"Unknown\",\n lastPrinted: this.lastPrinted,\n created: this.created,\n modified: this.modified,\n properties: this.properties,\n worksheets: this.worksheets.map(worksheet => worksheet.model),\n sheets: this.worksheets.map(ws => ws.model).filter(Boolean),\n definedNames: this._definedNames.model,\n views: this.views,\n company: this.company,\n manager: this.manager,\n title: this.title,\n subject: this.subject,\n keywords: this.keywords,\n category: this.category,\n description: this.description,\n language: this.language,\n revision: this.revision,\n contentStatus: this.contentStatus,\n themes: this._themes,\n media: this.media,\n pivotTables: this.pivotTables,\n calcProperties: this.calcProperties\n };\n }\n\n set model(value: WorkbookModel) {\n this.creator = value.creator;\n this.lastModifiedBy = value.lastModifiedBy;\n this.lastPrinted = value.lastPrinted;\n this.created = value.created;\n this.modified = value.modified;\n this.company = value.company;\n this.manager = value.manager;\n this.title = value.title;\n this.subject = value.subject;\n this.keywords = value.keywords;\n this.category = value.category;\n this.description = value.description;\n this.language = value.language;\n this.revision = value.revision;\n this.contentStatus = value.contentStatus;\n\n this.properties = value.properties;\n this.calcProperties = value.calcProperties;\n this._worksheets = [];\n value.worksheets.forEach(worksheetModel => {\n const { id, name, state } = worksheetModel;\n const orderNo = value.sheets && value.sheets.findIndex(ws => ws.id === id);\n const worksheet = (this._worksheets[id] = new Worksheet({\n id,\n name,\n orderNo: orderNo !== -1 ? orderNo : undefined,\n state,\n workbook: this as any\n }));\n worksheet.model = worksheetModel;\n });\n\n this._definedNames.model = value.definedNames;\n this.views = value.views;\n this._themes = value.themes;\n this.media = value.media || [];\n\n // Handle pivot tables - either newly created or loaded from file\n // Loaded pivot tables come from loadedPivotTables after reconciliation\n this.pivotTables = value.pivotTables || value.loadedPivotTables || [];\n }\n}\n\nexport { Workbook };\n","/**\n * Type definitions for ExcelTS\n * This file exports all public types used by the library\n */\n\n// ============================================================================\n// Buffer type for cross-platform compatibility\n// Node.js Buffer extends Uint8Array, so Uint8Array is the common interface\n// ============================================================================\nexport type Buffer = Uint8Array;\n\n// ============================================================================\n// Paper Size Enum\n// ============================================================================\nexport enum PaperSize {\n Legal = 5,\n Executive = 7,\n A4 = 9,\n A5 = 11,\n B5 = 13,\n Envelope_10 = 20,\n Envelope_DL = 27,\n Envelope_C5 = 28,\n Envelope_B5 = 34,\n Envelope_Monarch = 37,\n Double_Japan_Postcard_Rotated = 82,\n K16_197x273_mm = 119\n}\n\n// ============================================================================\n// Color Types\n// ============================================================================\nexport interface Color {\n argb: string;\n theme: number;\n}\n\n// ============================================================================\n// Font Types\n// ============================================================================\nexport interface Font {\n name: string;\n size: number;\n family: number;\n scheme: \"minor\" | \"major\" | \"none\";\n charset: number;\n color: Partial<Color>;\n bold: boolean;\n italic: boolean;\n underline: boolean | \"none\" | \"single\" | \"double\" | \"singleAccounting\" | \"doubleAccounting\";\n vertAlign: \"superscript\" | \"subscript\";\n strike: boolean;\n outline: boolean;\n}\n\n// ============================================================================\n// Alignment Types\n// ============================================================================\nexport interface Alignment {\n horizontal: \"left\" | \"center\" | \"right\" | \"fill\" | \"justify\" | \"centerContinuous\" | \"distributed\";\n vertical: \"top\" | \"middle\" | \"bottom\" | \"distributed\" | \"justify\";\n wrapText: boolean;\n shrinkToFit: boolean;\n indent: number;\n readingOrder: \"rtl\" | \"ltr\";\n textRotation: number | \"vertical\";\n}\n\n// ============================================================================\n// Protection Types\n// ============================================================================\nexport interface Protection {\n locked: boolean;\n hidden: boolean;\n}\n\n// ============================================================================\n// Border Types\n// ============================================================================\nexport type BorderStyle =\n | \"thin\"\n | \"dotted\"\n | \"hair\"\n | \"medium\"\n | \"double\"\n | \"thick\"\n | \"dashed\"\n | \"dashDot\"\n | \"dashDotDot\"\n | \"slantDashDot\"\n | \"mediumDashed\"\n | \"mediumDashDotDot\"\n | \"mediumDashDot\";\n\nexport interface Border {\n style: BorderStyle;\n color: Partial<Color>;\n}\n\nexport interface BorderDiagonal extends Border {\n up: boolean;\n down: boolean;\n}\n\nexport interface Borders {\n top: Partial<Border>;\n left: Partial<Border>;\n bottom: Partial<Border>;\n right: Partial<Border>;\n diagonal: Partial<BorderDiagonal>;\n}\n\n// ============================================================================\n// Fill Types\n// ============================================================================\nexport type FillPatterns =\n | \"none\"\n | \"solid\"\n | \"darkVertical\"\n | \"darkHorizontal\"\n | \"darkGrid\"\n | \"darkTrellis\"\n | \"darkDown\"\n | \"darkUp\"\n | \"lightVertical\"\n | \"lightHorizontal\"\n | \"lightGrid\"\n | \"lightTrellis\"\n | \"lightDown\"\n | \"lightUp\"\n | \"darkGray\"\n | \"mediumGray\"\n | \"lightGray\"\n | \"gray125\"\n | \"gray0625\";\n\nexport interface FillPattern {\n type: \"pattern\";\n pattern: FillPatterns;\n fgColor?: Partial<Color>;\n bgColor?: Partial<Color>;\n}\n\nexport interface GradientStop {\n position: number;\n color: Partial<Color>;\n}\n\nexport interface FillGradientAngle {\n type: \"gradient\";\n gradient: \"angle\";\n degree: number;\n stops: GradientStop[];\n}\n\nexport interface FillGradientPath {\n type: \"gradient\";\n gradient: \"path\";\n center: { left: number; top: number };\n stops: GradientStop[];\n}\n\nexport type Fill = FillPattern | FillGradientAngle | FillGradientPath;\n\n// ============================================================================\n// Style Type\n// ============================================================================\nexport interface NumFmt {\n id: number;\n formatCode: string;\n}\n\n// Base style properties shared between input and output\ninterface StyleBase {\n font: Partial<Font>;\n alignment: Partial<Alignment>;\n protection: Partial<Protection>;\n border: Partial<Borders>;\n fill: Fill;\n}\n\n// Input style - used when setting styles (accepts string for numFmt)\nexport interface StyleInput extends StyleBase {\n numFmt: string;\n}\n\n// Output style - returned when reading styles (numFmt is an object with id)\nexport interface StyleOutput extends StyleBase {\n numFmt: NumFmt;\n}\n\n// Combined style type for backwards compatibility\nexport interface Style extends StyleBase {\n numFmt: string | NumFmt;\n}\n\n// ============================================================================\n// Margins Types\n// ============================================================================\nexport interface Margins {\n top: number;\n left: number;\n bottom: number;\n right: number;\n header: number;\n footer: number;\n}\n\n// ============================================================================\n// Page Setup Types\n// ============================================================================\nexport interface PageSetup {\n margins: Margins;\n orientation: \"portrait\" | \"landscape\";\n horizontalDpi: number;\n verticalDpi: number;\n fitToPage: boolean;\n fitToWidth: number;\n fitToHeight: number;\n scale: number;\n pageOrder: \"downThenOver\" | \"overThenDown\";\n blackAndWhite: boolean;\n draft: boolean;\n cellComments: \"atEnd\" | \"asDisplayed\" | \"None\";\n errors: \"dash\" | \"blank\" | \"NA\" | \"displayed\";\n paperSize: PaperSize;\n showRowColHeaders: boolean;\n showGridLines: boolean;\n firstPageNumber: number;\n horizontalCentered: boolean;\n verticalCentered: boolean;\n printArea: string;\n printTitlesRow: string;\n printTitlesColumn: string;\n}\n\n// ============================================================================\n// Header Footer Types\n// ============================================================================\nexport interface HeaderFooter {\n differentFirst: boolean;\n differentOddEven: boolean;\n oddHeader: string;\n oddFooter: string;\n evenHeader: string;\n evenFooter: string;\n firstHeader: string;\n firstFooter: string;\n}\n\n// ============================================================================\n// Worksheet View Types\n// ============================================================================\nexport interface WorksheetViewCommon {\n rightToLeft?: boolean;\n activeCell?: string;\n showRuler?: boolean;\n showRowColHeaders?: boolean;\n showGridLines?: boolean;\n zoomScale?: number;\n zoomScaleNormal?: number;\n}\n\nexport interface WorksheetViewNormal {\n state: \"normal\";\n style: \"pageBreakPreview\" | \"pageLayout\";\n}\n\nexport interface WorksheetViewFrozen {\n state: \"frozen\";\n style?: \"pageBreakPreview\";\n xSplit?: number;\n ySplit?: number;\n topLeftCell?: string;\n}\n\nexport interface WorksheetViewSplit {\n state: \"split\";\n style?: \"pageBreakPreview\" | \"pageLayout\";\n xSplit?: number;\n ySplit?: number;\n topLeftCell?: string;\n activePane?: \"topLeft\" | \"topRight\" | \"bottomLeft\" | \"bottomRight\";\n}\n\nexport type WorksheetView = WorksheetViewCommon &\n (WorksheetViewNormal | WorksheetViewFrozen | WorksheetViewSplit);\n\n// ============================================================================\n// Worksheet Properties Types\n// ============================================================================\nexport interface WorksheetProperties {\n tabColor: Partial<Color>;\n outlineLevelCol: number;\n outlineLevelRow: number;\n outlineProperties: {\n summaryBelow: boolean;\n summaryRight: boolean;\n };\n defaultRowHeight: number;\n defaultColWidth?: number;\n dyDescent?: number;\n showGridLines: boolean;\n}\n\nexport type WorksheetState = \"visible\" | \"hidden\" | \"veryHidden\";\n\nexport type AutoFilter =\n | string\n | {\n from: string | { row: number; column: number };\n to: string | { row: number; column: number };\n };\n\nexport interface WorksheetProtection {\n objects: boolean;\n scenarios: boolean;\n selectLockedCells: boolean;\n selectUnlockedCells: boolean;\n formatCells: boolean;\n formatColumns: boolean;\n formatRows: boolean;\n insertColumns: boolean;\n insertRows: boolean;\n insertHyperlinks: boolean;\n deleteColumns: boolean;\n deleteRows: boolean;\n sort: boolean;\n autoFilter: boolean;\n pivotTables: boolean;\n spinCount: number;\n}\n\n// ============================================================================\n// Workbook View Types\n// ============================================================================\nexport interface WorkbookView {\n x: number;\n y: number;\n width: number;\n height: number;\n firstSheet: number;\n activeTab: number;\n visibility: string;\n}\n\n// ============================================================================\n// Workbook Properties Types\n// ============================================================================\nexport interface WorkbookProperties {\n date1904: boolean;\n}\n\nexport interface CalculationProperties {\n fullCalcOnLoad: boolean;\n}\n\n// ============================================================================\n// Cell Value Types\n// ============================================================================\nexport interface CellErrorValue {\n error: \"#N/A\" | \"#REF!\" | \"#NAME?\" | \"#DIV/0!\" | \"#NULL!\" | \"#VALUE!\" | \"#NUM!\";\n}\n\nexport interface RichText {\n text: string;\n font?: Partial<Font>;\n}\n\nexport interface CellRichTextValue {\n richText: RichText[];\n}\n\nexport interface CellHyperlinkValue {\n text: string;\n hyperlink: string;\n tooltip?: string;\n}\n\nexport interface CellFormulaValue {\n formula: string;\n result?: number | string | boolean | Date | CellErrorValue;\n date1904?: boolean;\n}\n\n/** Array formula that spans multiple cells */\nexport interface CellArrayFormulaValue {\n formula: string;\n result?: number | string | boolean | Date | CellErrorValue;\n /** Must be \"array\" for array formulas */\n shareType: \"array\";\n /** The range this array formula applies to, e.g. \"A1:B2\" */\n ref: string;\n}\n\nexport interface CellSharedFormulaValue {\n sharedFormula: string;\n readonly formula?: string;\n result?: number | string | boolean | Date | CellErrorValue;\n date1904?: boolean;\n}\n\nexport type CellValue =\n | null\n | number\n | string\n | boolean\n | Date\n | undefined\n | CellErrorValue\n | CellRichTextValue\n | CellHyperlinkValue\n | CellFormulaValue\n | CellArrayFormulaValue\n | CellSharedFormulaValue;\n\n// ============================================================================\n// Comment Types\n// ============================================================================\nexport interface CommentMargins {\n insetmode: \"auto\" | \"custom\";\n inset: number[];\n}\n\nexport interface CommentProtection {\n locked: \"True\" | \"False\";\n lockText: \"True\" | \"False\";\n}\n\nexport type CommentEditAs = \"twoCells\" | \"oneCells\" | \"absolute\";\n\nexport interface Comment {\n texts?: RichText[];\n margins?: Partial<CommentMargins>;\n protection?: Partial<CommentProtection>;\n editAs?: CommentEditAs;\n}\n\n// ============================================================================\n// Data Validation Types\n// ============================================================================\nexport type DataValidationOperator =\n | \"between\"\n | \"notBetween\"\n | \"equal\"\n | \"notEqual\"\n | \"greaterThan\"\n | \"lessThan\"\n | \"greaterThanOrEqual\"\n | \"lessThanOrEqual\";\n\n/** Base properties shared by all data validation types */\ninterface DataValidationBase {\n allowBlank?: boolean;\n error?: string;\n errorTitle?: string;\n errorStyle?: string;\n prompt?: string;\n promptTitle?: string;\n showErrorMessage?: boolean;\n showInputMessage?: boolean;\n}\n\n/** Data validation that requires formulae and operator */\nexport interface DataValidationWithFormulae extends DataValidationBase {\n type: \"list\" | \"whole\" | \"decimal\" | \"date\" | \"textLength\" | \"custom\";\n formulae: any[];\n operator?: DataValidationOperator;\n}\n\n/** Data validation type 'any' - no formulae needed */\nexport interface DataValidationAny extends DataValidationBase {\n type: \"any\";\n}\n\nexport type DataValidation = DataValidationWithFormulae | DataValidationAny;\n\n// ============================================================================\n// Image Types\n// ============================================================================\nexport interface Image {\n extension: \"jpeg\" | \"png\" | \"gif\";\n base64?: string;\n filename?: string;\n buffer?: Buffer;\n}\n\nexport interface ImagePosition {\n tl: { col: number; row: number };\n ext: { width: number; height: number };\n}\n\n/** Anchor position for image placement */\nexport interface ImageAnchor {\n col: number;\n row: number;\n nativeCol?: number;\n nativeRow?: number;\n nativeColOff?: number;\n nativeRowOff?: number;\n}\n\n/** Range input for addImage - can be a string like \"A1:B2\" or an object */\nexport type AddImageRange =\n | string\n | {\n /** Top-left anchor position */\n tl: ImageAnchor | string;\n /** Bottom-right anchor position (optional if ext is provided) */\n br?: ImageAnchor | string;\n /** Image dimensions (alternative to br) */\n ext?: { width: number; height: number };\n /** How the image behaves when cells are resized */\n editAs?: \"oneCell\" | \"twoCell\" | \"absolute\";\n /** Hyperlink for the image */\n hyperlinks?: { hyperlink?: string; tooltip?: string };\n };\n\nexport interface ImageHyperlinkValue {\n hyperlink: string;\n tooltip?: string;\n}\n\n// ============================================================================\n// Location and Address Types\n// ============================================================================\nexport type Location = {\n top: number;\n left: number;\n bottom: number;\n right: number;\n};\n\nexport type Address = {\n sheetName?: string;\n address: string;\n col: number;\n row: number;\n $col$row?: string;\n};\n\n// ============================================================================\n// Row and Column Types\n// ============================================================================\nexport type RowValues = CellValue[] | { [key: string]: CellValue } | undefined | null;\n\n// ============================================================================\n// Conditional Formatting Types\n// ============================================================================\nexport type CellIsOperators = \"equal\" | \"greaterThan\" | \"lessThan\" | \"between\";\n\nexport type ContainsTextOperators =\n | \"containsText\"\n | \"containsBlanks\"\n | \"notContainsBlanks\"\n | \"containsErrors\"\n | \"notContainsErrors\";\n\nexport type TimePeriodTypes =\n | \"lastWeek\"\n | \"thisWeek\"\n | \"nextWeek\"\n | \"yesterday\"\n | \"today\"\n | \"tomorrow\"\n | \"last7Days\"\n | \"lastMonth\"\n | \"thisMonth\"\n | \"nextMonth\";\n\nexport type IconSetTypes =\n | \"5Arrows\"\n | \"5ArrowsGray\"\n | \"5Boxes\"\n | \"5Quarters\"\n | \"5Rating\"\n | \"4Arrows\"\n | \"4ArrowsGray\"\n | \"4Rating\"\n | \"4RedToBlack\"\n | \"4TrafficLights\"\n | \"NoIcons\"\n | \"3Arrows\"\n | \"3ArrowsGray\"\n | \"3Flags\"\n | \"3Signs\"\n | \"3Stars\"\n | \"3Symbols\"\n | \"3Symbols2\"\n | \"3TrafficLights1\"\n | \"3TrafficLights2\"\n | \"3Triangles\";\n\nexport type CfvoTypes =\n | \"percentile\"\n | \"percent\"\n | \"num\"\n | \"min\"\n | \"max\"\n | \"formula\"\n | \"autoMin\"\n | \"autoMax\";\n\nexport interface Cvfo {\n type: CfvoTypes;\n value?: number | string;\n}\n\nexport interface ConditionalFormattingBaseRule {\n priority?: number;\n style?: Partial<Style>;\n}\n\nexport interface ExpressionRuleType extends ConditionalFormattingBaseRule {\n type: \"expression\";\n formulae?: any[];\n}\n\nexport interface CellIsRuleType extends ConditionalFormattingBaseRule {\n type: \"cellIs\";\n formulae?: any[];\n operator?: CellIsOperators;\n}\n\nexport interface Top10RuleType extends ConditionalFormattingBaseRule {\n type: \"top10\";\n rank: number;\n percent: boolean;\n bottom?: boolean;\n}\n\nexport interface AboveAverageRuleType extends ConditionalFormattingBaseRule {\n type: \"aboveAverage\";\n aboveAverage?: boolean;\n}\n\nexport interface ColorScaleRuleType extends ConditionalFormattingBaseRule {\n type: \"colorScale\";\n cfvo?: Cvfo[];\n color?: Partial<Color>[];\n}\n\nexport interface IconSetRuleType extends ConditionalFormattingBaseRule {\n type: \"iconSet\";\n showValue?: boolean;\n reverse?: boolean;\n custom?: boolean;\n iconSet?: IconSetTypes;\n cfvo?: Cvfo[];\n}\n\nexport interface ContainsTextRuleType extends ConditionalFormattingBaseRule {\n type: \"containsText\";\n operator?: ContainsTextOperators;\n text?: string;\n}\n\nexport interface TimePeriodRuleType extends ConditionalFormattingBaseRule {\n type: \"timePeriod\";\n timePeriod?: TimePeriodTypes;\n}\n\nexport interface DataBarRuleType extends ConditionalFormattingBaseRule {\n type: \"dataBar\";\n gradient?: boolean;\n minLength?: number;\n maxLength?: number;\n showValue?: boolean;\n border?: boolean;\n negativeBarColorSameAsPositive?: boolean;\n negativeBarBorderColorSameAsPositive?: boolean;\n axisPosition?: \"auto\" | \"middle\" | \"none\";\n direction?: \"context\" | \"leftToRight\" | \"rightToLeft\";\n cfvo?: Cvfo[];\n color?: Partial<Color>;\n}\n\nexport type ConditionalFormattingRule =\n | ExpressionRuleType\n | CellIsRuleType\n | Top10RuleType\n | AboveAverageRuleType\n | ColorScaleRuleType\n | IconSetRuleType\n | ContainsTextRuleType\n | TimePeriodRuleType\n | DataBarRuleType;\n\nexport interface ConditionalFormattingOptions {\n ref: string;\n rules: ConditionalFormattingRule[];\n}\n\nexport interface ConditionalFormattingOptions {\n ref: string;\n rules: ConditionalFormattingRule[];\n}\n\n// ============================================================================\n// Table Types\n// ============================================================================\nexport interface TableStyleProperties {\n theme?: string;\n showFirstColumn?: boolean;\n showLastColumn?: boolean;\n showRowStripes?: boolean;\n showColumnStripes?: boolean;\n}\n\nexport interface TableColumnProperties {\n name: string;\n filterButton?: boolean;\n totalsRowLabel?: string;\n totalsRowFunction?:\n | \"none\"\n | \"average\"\n | \"countNums\"\n | \"count\"\n | \"max\"\n | \"min\"\n | \"stdDev\"\n | \"var\"\n | \"sum\"\n | \"custom\";\n totalsRowFormula?: string;\n totalsRowResult?: CellFormulaValue[\"result\"];\n style?: Partial<Style>;\n}\n\nexport interface TableProperties {\n name: string;\n displayName?: string;\n ref: string;\n headerRow?: boolean;\n totalsRow?: boolean;\n style?: TableStyleProperties;\n columns: TableColumnProperties[];\n rows: any[][];\n}\n\nexport type TableColumn = Required<TableColumnProperties>;\n\n// ============================================================================\n// Media Types\n// ============================================================================\nexport interface Media {\n type: string;\n name: string;\n extension: string;\n buffer: Buffer;\n}\n\n// ============================================================================\n// Worksheet Options\n// ============================================================================\nexport interface AddWorksheetOptions {\n properties?: Partial<WorksheetProperties>;\n pageSetup?: Partial<PageSetup>;\n headerFooter?: Partial<HeaderFooter>;\n views?: Array<Partial<WorksheetView>>;\n state?: WorksheetState;\n /** Specifies whether to use shared strings. Overrides workbook setting. */\n useSharedStrings?: boolean;\n /** Apply an auto filter to the worksheet */\n autoFilter?: AutoFilter;\n}\n\n// ============================================================================\n// Defined Names Types\n// ============================================================================\nexport interface DefinedNamesRanges {\n name: string;\n ranges: string[];\n}\n\nexport type DefinedNamesModel = DefinedNamesRanges[];\n\n// ============================================================================\n// Row Break Types\n// ============================================================================\nexport interface RowBreak {\n id: number;\n max: number;\n min?: number;\n man: number;\n}\n\n// ============================================================================\n// Column Break Types\n// ============================================================================\nexport interface ColBreak {\n id: number;\n max: number;\n min?: number;\n man: number;\n}\n","// oxlint-disable no-control-regex\n/**\n * Excel Cell Format Parser\n * A simplified implementation for formatting cell values according to Excel numFmt patterns\n * Supports: General, percentages, decimals, thousands separators, dates, currencies,\n * scientific notation, fractions, elapsed time, and more\n */\n\nimport { excelToDate } from \"@utils/utils\";\n\n// =============================================================================\n// Built-in Format Table (Excel numFmtId to format string mapping)\n// =============================================================================\n\nconst TABLE_FMT: Record<number, string> = {\n 0: \"General\",\n 1: \"0\",\n 2: \"0.00\",\n 3: \"#,##0\",\n 4: \"#,##0.00\",\n 9: \"0%\",\n 10: \"0.00%\",\n 11: \"0.00E+00\",\n 12: \"# ?/?\",\n 13: \"# ??/??\",\n 14: \"m/d/yy\",\n 15: \"d-mmm-yy\",\n 16: \"d-mmm\",\n 17: \"mmm-yy\",\n 18: \"h:mm AM/PM\",\n 19: \"h:mm:ss AM/PM\",\n 20: \"h:mm\",\n 21: \"h:mm:ss\",\n 22: \"m/d/yy h:mm\",\n 37: \"#,##0 ;(#,##0)\",\n 38: \"#,##0 ;[Red](#,##0)\",\n 39: \"#,##0.00;(#,##0.00)\",\n 40: \"#,##0.00;[Red](#,##0.00)\",\n 41: '_(* #,##0_);_(* (#,##0);_(* \"-\"_);_(@_)',\n 42: '_($* #,##0_);_($* (#,##0);_($* \"-\"_);_(@_)',\n 43: '_(* #,##0.00_);_(* (#,##0.00);_(* \"-\"??_);_(@_)',\n 44: '_($* #,##0.00_);_($* (#,##0.00);_($* \"-\"??_);_(@_)',\n 45: \"mm:ss\",\n 46: \"[h]:mm:ss\",\n 47: \"mmss.0\",\n 48: \"##0.0E+0\",\n 49: \"@\"\n};\n\n/**\n * Default mapping for numFmtId that should map to other formats\n * Based on Excel's behavior for certain format IDs\n */\nconst DEFAULT_MAP: Record<number, number> = {\n // 5 -> 37 ... 8 -> 40\n 5: 37,\n 6: 38,\n 7: 39,\n 8: 40,\n // 23-26 -> 0\n 23: 0,\n 24: 0,\n 25: 0,\n 26: 0,\n // 27-31 -> 14\n 27: 14,\n 28: 14,\n 29: 14,\n 30: 14,\n 31: 14,\n // 50-58 -> 14\n 50: 14,\n 51: 14,\n 52: 14,\n 53: 14,\n 54: 14,\n 55: 14,\n 56: 14,\n 57: 14,\n 58: 14,\n // 59-62 -> 1-4\n 59: 1,\n 60: 2,\n 61: 3,\n 62: 4,\n // 67-68 -> 9-10\n 67: 9,\n 68: 10,\n // 72-75 -> 14-17\n 72: 14,\n 73: 15,\n 74: 16,\n 75: 17,\n // 76-78 -> 20-22\n 76: 20,\n 77: 21,\n 78: 22,\n // 79-81 -> 45-47\n 79: 45,\n 80: 46,\n 81: 47\n};\n\n/**\n * Get format string from numFmtId\n * Handles default mappings for certain format IDs\n */\nexport function getFormat(numFmtId: number): string {\n // Direct lookup first\n if (TABLE_FMT[numFmtId]) {\n return TABLE_FMT[numFmtId];\n }\n // Check default map\n if (DEFAULT_MAP[numFmtId] !== undefined) {\n return TABLE_FMT[DEFAULT_MAP[numFmtId]] || \"General\";\n }\n return \"General\";\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Pad number with leading zeros\n */\nfunction pad0(num: number, len: number): string {\n let s = Math.round(num).toString();\n while (s.length < len) {\n s = \"0\" + s;\n }\n return s;\n}\n\n/**\n * Add thousand separators to a number string\n */\nfunction commaify(s: string): string {\n const w = 3;\n if (s.length <= w) {\n return s;\n }\n const j = s.length % w;\n let o = s.substring(0, j);\n for (let i = j; i < s.length; i += w) {\n o += (o.length > 0 ? \",\" : \"\") + s.substring(i, i + w);\n }\n return o;\n}\n\n/**\n * Round a number to specified decimal places\n */\nfunction roundTo(val: number, decimals: number): number {\n const factor = Math.pow(10, decimals);\n return Math.round(val * factor) / factor;\n}\n\n/**\n * Process _ (underscore) placeholder - adds space with width of next character\n * Process * (asterisk) placeholder - repeats next character to fill width (simplified to single char)\n */\nfunction processPlaceholders(fmt: string): string {\n // Replace _X with a space (skip next character, add space)\n let result = fmt.replace(/_./g, \" \");\n // Replace *X with empty string (fill character, simplified)\n result = result.replace(/\\*./g, \"\");\n return result;\n}\n\n// =============================================================================\n// Format Detection\n// =============================================================================\n\n/**\n * Check if format is \"General\"\n */\nfunction isGeneral(fmt: string): boolean {\n return /^General$/i.test(fmt.trim());\n}\n\n/**\n * Check if format is a date format\n */\nfunction isDateFormat(fmt: string): boolean {\n // Remove color codes and conditions\n const cleaned = fmt.replace(/\\[[^\\]]*\\]/g, \"\");\n // Check for date/time tokens (but not if it's just a number format with brackets)\n return /[ymdhs]/i.test(cleaned) && !/^[#0.,E%$\\s()\\-+]+$/i.test(cleaned);\n}\n\n// =============================================================================\n// Date Formatting\n// =============================================================================\n\nconst MONTHS_SHORT = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\"\n];\nconst MONTHS_LONG = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\"\n];\n// Single letter month abbreviation (J, F, M, A, M, J, J, A, S, O, N, D)\nconst MONTHS_LETTER = [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"];\nconst DAYS_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nconst DAYS_LONG = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"];\n\n/**\n * Format a date value using Excel date format\n * @param serial Excel serial number (days since 1900-01-01)\n * @param fmt Format string\n */\nfunction formatDate(serial: number, fmt: string): string {\n // Extract time components directly from serial number (timezone-agnostic)\n const totalSeconds = Math.round(serial * 86400);\n const timeOfDay = totalSeconds % 86400;\n const hours = Math.floor(timeOfDay / 3600);\n const minutes = Math.floor((timeOfDay % 3600) / 60);\n const seconds = timeOfDay % 60;\n\n // For date components, use excelToDate but only for date parts\n const date = excelToDate(serial, false);\n const year = date.getUTCFullYear();\n const month = date.getUTCMonth(); // 0-indexed\n const day = date.getUTCDate();\n const dayOfWeek = date.getUTCDay();\n\n // Calculate fractional seconds from serial\n const fractionalSeconds = serial * 86400 - Math.floor(serial * 86400);\n\n // Check for AM/PM\n const hasAmPm = /AM\\/PM|A\\/P/i.test(fmt);\n const isPm = hours >= 12;\n // Standard 12-hour format: 0 and 12 both display as 12\n const hours12 = hours % 12 || 12;\n\n // Remove color codes like [Red], [Green], etc. but keep elapsed time brackets\n let result = fmt.replace(/\\[(Red|Green|Blue|Yellow|Magenta|Cyan|White|Black|Color\\d+)\\]/gi, \"\");\n\n // Process _ and * placeholders\n result = processPlaceholders(result);\n\n // Handle fractional seconds (ss.0, ss.00, ss.000)\n const fracSecMatch = result.match(/ss\\.(0+)/i);\n let fracSecStr = \"\";\n if (fracSecMatch) {\n const decPlaces = fracSecMatch[1].length;\n const fracPart = Math.round(fractionalSeconds * Math.pow(10, decPlaces));\n fracSecStr = fracPart.toString().padStart(decPlaces, \"0\");\n result = result.replace(/ss\\.0+/gi, \"\\x00SF\\x00\");\n }\n\n // Process tokens - order matters! Longer patterns first.\n // Use placeholder tokens to avoid re-matching\n // Important: Use unique markers that don't contain the original pattern letters\n\n // Year\n result = result.replace(/yyyy/gi, \"\\x00Y4\\x00\");\n result = result.replace(/yy/gi, \"\\x00Y2\\x00\");\n\n // Month names (before numeric month) - order matters: longer patterns first\n result = result.replace(/mmmmm/gi, \"\\x00MN5\\x00\"); // Single letter month\n result = result.replace(/mmmm/gi, \"\\x00MN4\\x00\");\n result = result.replace(/mmm/gi, \"\\x00MN3\\x00\");\n\n // Day names (must be before dd and d)\n result = result.replace(/dddd/gi, \"\\x00DN4\\x00\");\n result = result.replace(/ddd/gi, \"\\x00DN3\\x00\");\n\n // Day numbers\n result = result.replace(/dd/gi, \"\\x00D2\\x00\");\n result = result.replace(/\\bd\\b/gi, \"\\x00D1\\x00\");\n\n // Hours\n result = result.replace(/hh/gi, \"\\x00H2\\x00\");\n result = result.replace(/\\bh\\b/gi, \"\\x00H1\\x00\");\n\n // Seconds (before mm to avoid confusion)\n result = result.replace(/ss/gi, \"\\x00S2\\x00\");\n result = result.replace(/\\bs\\b/gi, \"\\x00S1\\x00\");\n\n // Minutes/Month mm - context dependent\n // If near h or s, it's minutes; otherwise month\n // For simplicity, check if we already have hour tokens nearby\n const hasTimeContext = /\\x00H[12]\\x00.*mm|mm.*\\x00S[12]\\x00/i.test(result);\n if (hasTimeContext) {\n result = result.replace(/mm/gi, \"\\x00MI2\\x00\");\n } else {\n result = result.replace(/mm/gi, \"\\x00M2\\x00\");\n }\n result = result.replace(/\\bm\\b/gi, \"\\x00M1\\x00\");\n\n // AM/PM\n result = result.replace(/AM\\/PM/gi, \"\\x00AMPM\\x00\");\n result = result.replace(/A\\/P/gi, \"\\x00AP\\x00\");\n\n // Now replace placeholders with actual values\n const hourVal = hasAmPm ? hours12 : hours;\n\n result = result\n .replace(/\\x00Y4\\x00/g, year.toString())\n .replace(/\\x00Y2\\x00/g, (year % 100).toString().padStart(2, \"0\"))\n .replace(/\\x00MN5\\x00/g, MONTHS_LETTER[month])\n .replace(/\\x00MN4\\x00/g, MONTHS_LONG[month])\n .replace(/\\x00MN3\\x00/g, MONTHS_SHORT[month])\n .replace(/\\x00M2\\x00/g, (month + 1).toString().padStart(2, \"0\"))\n .replace(/\\x00M1\\x00/g, (month + 1).toString())\n .replace(/\\x00DN4\\x00/g, DAYS_LONG[dayOfWeek])\n .replace(/\\x00DN3\\x00/g, DAYS_SHORT[dayOfWeek])\n .replace(/\\x00D2\\x00/g, day.toString().padStart(2, \"0\"))\n .replace(/\\x00D1\\x00/g, day.toString())\n .replace(/\\x00H2\\x00/g, hourVal.toString().padStart(2, \"0\"))\n .replace(/\\x00H1\\x00/g, hourVal.toString())\n .replace(/\\x00MI2\\x00/g, minutes.toString().padStart(2, \"0\"))\n .replace(/\\x00S2\\x00/g, seconds.toString().padStart(2, \"0\"))\n .replace(/\\x00S1\\x00/g, seconds.toString())\n .replace(/\\x00SF\\x00/g, seconds.toString().padStart(2, \"0\") + \".\" + fracSecStr)\n .replace(/\\x00AMPM\\x00/g, isPm ? \"PM\" : \"AM\")\n .replace(/\\x00AP\\x00/g, isPm ? \"P\" : \"A\");\n\n // Clean up escape characters\n result = result.replace(/\\\\/g, \"\");\n\n return result;\n}\n\n// =============================================================================\n// Number Formatting\n// =============================================================================\n\n/**\n * Format a number using \"General\" format\n */\nfunction formatGeneral(val: number | string | boolean): string {\n if (typeof val === \"boolean\") {\n return val ? \"TRUE\" : \"FALSE\";\n }\n if (typeof val === \"string\") {\n return val;\n }\n // Number formatting - up to 11 significant digits\n if (Number.isInteger(val)) {\n return val.toString();\n }\n // For decimals, show up to 11 significant figures\n const str = val.toPrecision(11);\n // Remove trailing zeros after decimal point\n return str.replace(/\\.?0+$/, \"\").replace(/\\.?0+e/, \"e\");\n}\n\n/**\n * Format a percentage value\n * @param val The decimal value (e.g., 0.25 for 25%)\n * @param fmt The format string containing %\n */\nfunction formatPercentage(val: number, fmt: string): string {\n // Count % signs\n const percentCount = (fmt.match(/%/g) || []).length;\n // Multiply value by 100 for each %\n const scaledVal = val * Math.pow(100, percentCount);\n\n // Remove % from format to process the number part\n const numFmt = fmt.replace(/%/g, \"\");\n\n // Format the number part\n const numStr = formatNumberPattern(scaledVal, numFmt || \"0\");\n\n // Add back the % signs\n return numStr + \"%\".repeat(percentCount);\n}\n\n/**\n * Format a number in scientific notation\n * @param val The number to format\n * @param fmt The format string (e.g., \"0.00E+00\")\n */\nfunction formatScientific(val: number, fmt: string): string {\n const sign = val < 0 ? \"-\" : \"\";\n const absVal = Math.abs(val);\n\n if (absVal === 0) {\n // Handle zero\n const decMatch = fmt.match(/\\.([0#]+)E/i);\n const decPlaces = decMatch ? decMatch[1].length : 2;\n return \"0.\" + \"0\".repeat(decPlaces) + \"E+00\";\n }\n\n // Find decimal places from format\n const decMatch = fmt.match(/\\.([0#]+)E/i);\n const decPlaces = decMatch ? decMatch[1].length : 2;\n\n // Check if format has explicit +\n const hasPlus = fmt.includes(\"E+\");\n\n // Calculate exponent\n const exp = Math.floor(Math.log10(absVal));\n const mantissa = absVal / Math.pow(10, exp);\n\n // Round mantissa to specified decimal places\n const roundedMantissa = roundTo(mantissa, decPlaces);\n\n // Format mantissa\n const mantissaStr = roundedMantissa.toFixed(decPlaces);\n\n // Format exponent\n const expSign = exp >= 0 ? (hasPlus ? \"+\" : \"\") : \"-\";\n const expStr = pad0(Math.abs(exp), 2);\n\n return sign + mantissaStr + \"E\" + expSign + expStr;\n}\n\n/**\n * Convert decimal to fraction using continued fraction algorithm\n */\nfunction toFraction(val: number, maxDenom: number): [number, number, number] {\n const sign = val < 0 ? -1 : 1;\n let absVal = Math.abs(val);\n const whole = Math.floor(absVal);\n absVal -= whole;\n\n if (absVal < 1e-10) {\n return [sign * whole, 0, 1];\n }\n\n let p0 = 0,\n p1 = 1;\n let q0 = 1,\n q1 = 0;\n let a = Math.floor(absVal);\n let p = a;\n let q = 1;\n\n while (q1 < maxDenom) {\n a = Math.floor(absVal);\n p = a * p1 + p0;\n q = a * q1 + q0;\n\n if (absVal - a < 1e-10) {\n break;\n }\n absVal = 1 / (absVal - a);\n\n p0 = p1;\n p1 = p;\n q0 = q1;\n q1 = q;\n }\n\n if (q > maxDenom) {\n q = q1;\n p = p1;\n }\n\n return [sign * whole, sign * p, q];\n}\n\n/**\n * Format a number as a fraction\n * @param val The number to format\n * @param fmt The format string (e.g., \"# ?/?\", \"# ??/??\")\n */\nfunction formatFraction(val: number, fmt: string): string {\n const sign = val < 0 ? \"-\" : \"\";\n const absVal = Math.abs(val);\n\n // Check for fixed denominator (e.g., \"# ?/8\")\n const fixedDenomMatch = fmt.match(/\\?+\\s*\\/\\s*(\\d+)/);\n if (fixedDenomMatch) {\n const denom = parseInt(fixedDenomMatch[1], 10);\n const whole = Math.floor(absVal);\n const frac = absVal - whole;\n const numer = Math.round(frac * denom);\n\n if (fmt.includes(\"#\") || fmt.includes(\"0\")) {\n // Mixed fraction\n if (numer === 0) {\n return sign + whole.toString();\n }\n return sign + (whole > 0 ? whole + \" \" : \"\") + numer + \"/\" + denom;\n }\n // Simple fraction\n return sign + (whole * denom + numer) + \"/\" + denom;\n }\n\n // Variable denominator - count ? to determine max digits\n const denomMatch = fmt.match(/\\/\\s*(\\?+)/);\n const maxDigits = denomMatch ? denomMatch[1].length : 2;\n const maxDenom = Math.pow(10, maxDigits) - 1;\n\n const [whole, numer, denom] = toFraction(absVal, maxDenom);\n\n // Format based on whether we want mixed or improper fraction\n if (fmt.includes(\"#\") && whole !== 0) {\n if (numer === 0) {\n return sign + Math.abs(whole).toString();\n }\n return sign + Math.abs(whole) + \" \" + Math.abs(numer) + \"/\" + denom;\n }\n\n if (numer === 0) {\n return whole === 0 ? \"0\" : sign + Math.abs(whole).toString();\n }\n\n // Improper fraction\n const totalNumer = Math.abs(whole) * denom + Math.abs(numer);\n return sign + totalNumer + \"/\" + denom;\n}\n\n/**\n * Format elapsed time (e.g., [h]:mm:ss for durations > 24 hours)\n */\nfunction formatElapsedTime(serial: number, fmt: string): string {\n // serial is in days, convert to components\n const totalSeconds = Math.round(serial * 86400);\n const totalMinutes = Math.floor(totalSeconds / 60);\n const totalHours = Math.floor(totalMinutes / 60);\n\n const seconds = totalSeconds % 60;\n const minutes = totalMinutes % 60;\n const hours = totalHours;\n\n let result = fmt;\n\n // Replace elapsed time tokens\n if (/\\[h+\\]/i.test(result)) {\n result = result.replace(/\\[h+\\]/gi, hours.toString());\n }\n if (/\\[m+\\]/i.test(result)) {\n result = result.replace(/\\[m+\\]/gi, totalMinutes.toString());\n }\n if (/\\[s+\\]/i.test(result)) {\n result = result.replace(/\\[s+\\]/gi, totalSeconds.toString());\n }\n\n // Replace regular time tokens\n result = result.replace(/mm/gi, minutes.toString().padStart(2, \"0\"));\n result = result.replace(/ss/gi, seconds.toString().padStart(2, \"0\"));\n\n return result;\n}\n\n/**\n * Format a number with the given pattern\n * Handles patterns like \"0\", \"00\", \"#,##0\", \"0-0\", \"000-0000\" etc.\n */\nfunction formatNumberPattern(val: number, fmt: string): string {\n const absVal = Math.abs(val);\n const sign = val < 0 ? \"-\" : \"\";\n\n // Handle trailing commas (divide by 1000 for each)\n let trailingCommas = 0;\n let workFmt = fmt;\n while (workFmt.endsWith(\",\")) {\n trailingCommas++;\n workFmt = workFmt.slice(0, -1);\n }\n const scaledVal = absVal / Math.pow(1000, trailingCommas);\n\n // Check for decimal point\n const decimalIdx = workFmt.indexOf(\".\");\n let intFmt = workFmt;\n let decFmt = \"\";\n\n if (decimalIdx !== -1) {\n intFmt = workFmt.substring(0, decimalIdx);\n decFmt = workFmt.substring(decimalIdx + 1);\n }\n\n // Count decimal places needed\n const decimalPlaces = decFmt.replace(/[^0#?]/g, \"\").length;\n\n // Round the value\n const roundedVal = roundTo(scaledVal, decimalPlaces);\n\n // Split into integer and decimal parts\n const [intPart, decPart = \"\"] = roundedVal.toString().split(\".\");\n\n // Check if format has literal characters mixed with digit placeholders (like \"0-0\", \"000-0000\")\n // This is used for phone numbers, SSN, etc.\n const hasLiteralInFormat = /[0#?][^0#?,.\\s][0#?]/.test(intFmt);\n\n let formattedInt: string;\n\n if (hasLiteralInFormat) {\n // Handle pattern with literals like \"0-0\", \"000-0000\", \"00-00-00\"\n // Count total digit placeholders\n const digitPlaceholders = intFmt.replace(/[^0#?]/g, \"\").length;\n\n // Pad the number to match the digit placeholder count\n let digits = intPart;\n if (digits.length < digitPlaceholders) {\n digits = \"0\".repeat(digitPlaceholders - digits.length) + digits;\n }\n\n // Build result by replacing placeholders with digits\n formattedInt = \"\";\n let digitIndex = digits.length - digitPlaceholders; // start position in digits string\n\n for (let i = 0; i < intFmt.length; i++) {\n const char = intFmt[i];\n if (char === \"0\" || char === \"#\" || char === \"?\") {\n if (digitIndex < digits.length) {\n formattedInt += digits[digitIndex];\n digitIndex++;\n }\n } else if (char !== \",\") {\n // Literal character (like -, /, space, etc.) - but not comma (thousand separator)\n formattedInt += char;\n }\n }\n } else {\n // Standard number formatting\n formattedInt = intPart;\n\n // Add thousand separators if format has them\n if (intFmt.includes(\",\")) {\n formattedInt = commaify(intPart);\n }\n\n // Pad integer with leading zeros if needed\n const minIntDigits = (intFmt.match(/0/g) || []).length;\n if (formattedInt.length < minIntDigits) {\n formattedInt = \"0\".repeat(minIntDigits - formattedInt.length) + formattedInt;\n }\n }\n\n // Format decimal part\n let formattedDec = \"\";\n if (decimalPlaces > 0) {\n formattedDec = \".\" + (decPart + \"0\".repeat(decimalPlaces)).substring(0, decimalPlaces);\n }\n\n return sign + formattedInt + formattedDec;\n}\n\n// =============================================================================\n// Main Format Function\n// =============================================================================\n\n/**\n * Remove quoted literal text markers and return the literal characters\n * Also handles backslash escape sequences\n */\nfunction processQuotedText(fmt: string): string {\n let result = \"\";\n let i = 0;\n while (i < fmt.length) {\n if (fmt[i] === '\"') {\n // Find closing quote\n i++;\n while (i < fmt.length && fmt[i] !== '\"') {\n result += fmt[i];\n i++;\n }\n i++; // skip closing quote\n } else if (fmt[i] === \"\\\\\" && i + 1 < fmt.length) {\n // Backslash escapes the next character\n i++;\n result += fmt[i];\n i++;\n } else {\n result += fmt[i];\n i++;\n }\n }\n return result;\n}\n\n/**\n * Check if a condition matches (e.g., [>100], [<=50])\n */\nfunction checkCondition(val: number, condition: string): boolean {\n const match = condition.match(/\\[(=|>|<|>=|<=|<>)(-?\\d+(?:\\.\\d*)?)\\]/);\n if (!match) {\n return false;\n }\n\n const op = match[1];\n const threshold = parseFloat(match[2]);\n\n switch (op) {\n case \"=\":\n return val === threshold;\n case \">\":\n return val > threshold;\n case \"<\":\n return val < threshold;\n case \">=\":\n return val >= threshold;\n case \"<=\":\n return val <= threshold;\n case \"<>\":\n return val !== threshold;\n default:\n return false;\n }\n}\n\n/**\n * Parse format string and handle positive/negative/zero/text sections\n * Excel format: positive;negative;zero;text\n * Also handles conditional formats like [>100]\n */\nfunction chooseFormat(fmt: string, val: number | string | boolean): string {\n if (typeof val === \"string\") {\n // For text, use the 4th section if available, or just return as-is\n const sections = splitFormat(fmt);\n if (sections.length >= 4 && sections[3]) {\n // Process quoted text and replace @ with the value\n const textFmt = processQuotedText(sections[3]);\n return textFmt.replace(/@/g, val);\n }\n return val;\n }\n\n if (typeof val === \"boolean\") {\n return val ? \"TRUE\" : \"FALSE\";\n }\n\n const sections = splitFormat(fmt);\n\n // Check for conditional format in sections\n const condRegex = /\\[(=|>|<|>=|<=|<>)-?\\d+(?:\\.\\d*)?\\]/;\n const hasCondition =\n (sections[0] && condRegex.test(sections[0])) || (sections[1] && condRegex.test(sections[1]));\n\n if (hasCondition && sections.length >= 2) {\n // Conditional format: check each section's condition\n for (let i = 0; i < Math.min(sections.length, 2); i++) {\n const condMatch = sections[i].match(/\\[(=|>|<|>=|<=|<>)-?\\d+(?:\\.\\d*)?\\]/);\n if (condMatch && checkCondition(val as number, condMatch[0])) {\n return sections[i];\n }\n }\n // No condition matched, use last section\n return sections[sections.length > 2 ? 2 : 1];\n }\n\n if (sections.length === 1) {\n return sections[0];\n }\n\n if (sections.length === 2) {\n // positive/zero; negative\n return val >= 0 ? sections[0] : sections[1];\n }\n\n // 3+ sections: positive; negative; zero\n if (val > 0) {\n return sections[0];\n }\n if (val < 0) {\n return sections[1];\n }\n return sections[2] || sections[0];\n}\n\n/**\n * Check if format section is for negative values (2nd section in multi-section format)\n */\nfunction isNegativeSection(fmt: string, selectedFmt: string): boolean {\n const sections = splitFormat(fmt);\n return sections.length >= 2 && sections[1] === selectedFmt;\n}\n\n/**\n * Split format string by semicolons, respecting quoted strings and brackets\n */\nfunction splitFormat(fmt: string): string[] {\n const sections: string[] = [];\n let current = \"\";\n let inQuote = false;\n let inBracket = false;\n\n for (let i = 0; i < fmt.length; i++) {\n const char = fmt[i];\n\n if (char === '\"' && !inBracket) {\n inQuote = !inQuote;\n current += char;\n } else if (char === \"[\" && !inQuote) {\n inBracket = true;\n current += char;\n } else if (char === \"]\" && !inQuote) {\n inBracket = false;\n current += char;\n } else if (char === \";\" && !inQuote && !inBracket) {\n sections.push(current);\n current = \"\";\n } else {\n current += char;\n }\n }\n\n sections.push(current);\n return sections;\n}\n\n/**\n * Main format function - formats a value according to Excel numFmt\n * @param fmt The Excel number format string (e.g., \"0.00%\", \"#,##0\", \"yyyy-mm-dd\")\n * @param val The value to format\n */\nexport function format(fmt: string, val: number | string | boolean): string {\n // Handle null/undefined\n if (val == null) {\n return \"\";\n }\n\n // Handle General format\n if (isGeneral(fmt)) {\n return formatGeneral(val);\n }\n\n // Handle string values\n if (typeof val === \"string\") {\n return chooseFormat(fmt, val) as string;\n }\n\n // Handle boolean values\n if (typeof val === \"boolean\") {\n return val ? \"TRUE\" : \"FALSE\";\n }\n\n // Now val is a number\n let numVal = val as number;\n\n // Choose the right format section based on value\n const selectedFmt = chooseFormat(fmt, numVal) as string;\n\n // If negative section is selected, use absolute value (format handles display)\n if (numVal < 0 && isNegativeSection(fmt, selectedFmt)) {\n numVal = Math.abs(numVal);\n }\n\n // Remove color codes like [Red], [Green], [Blue], etc.\n let cleanFmt = selectedFmt.replace(\n /\\[(Red|Green|Blue|Yellow|Magenta|Cyan|White|Black|Color\\d+)\\]/gi,\n \"\"\n );\n\n // Remove condition codes like [>100], [<=50], etc.\n cleanFmt = cleanFmt.replace(/\\[(>|<|>=|<=|=|<>)-?\\d+(\\.\\d+)?\\]/g, \"\");\n\n // Remove locale codes like [$-804], [$€-407], etc.\n cleanFmt = cleanFmt.replace(/\\[\\$[^\\]]*\\]/g, \"\");\n\n // Process _ and * placeholders\n cleanFmt = processPlaceholders(cleanFmt);\n\n // Process quoted text\n cleanFmt = processQuotedText(cleanFmt);\n\n // Check for elapsed time format [h]:mm:ss, [m]:ss, [s]\n if (/\\[[hms]+\\]/i.test(cleanFmt)) {\n return formatElapsedTime(numVal, cleanFmt);\n }\n\n // Check if this is a date format\n if (isDateFormat(cleanFmt)) {\n return formatDate(numVal, cleanFmt);\n }\n\n // Check for percentage\n if (cleanFmt.includes(\"%\")) {\n return formatPercentage(numVal, cleanFmt);\n }\n\n // Check for scientific notation\n if (/E[+-]?/i.test(cleanFmt)) {\n return formatScientific(numVal, cleanFmt);\n }\n\n // Check for fraction format\n if (/\\?+\\s*\\/\\s*[\\d?]+/.test(cleanFmt)) {\n return formatFraction(numVal, cleanFmt);\n }\n\n // Handle negative numbers in parentheses format\n if (cleanFmt.includes(\"(\") && cleanFmt.includes(\")\") && numVal < 0) {\n const innerFmt = cleanFmt.replace(/\\(|\\)/g, \"\");\n return \"(\" + formatNumberPattern(-numVal, innerFmt) + \")\";\n }\n\n // Handle text placeholder @\n if (cleanFmt === \"@\") {\n return numVal.toString();\n }\n\n // Handle currency symbol and literal text prefix/suffix\n let prefix = \"\";\n let suffix = \"\";\n\n // Extract currency/text prefix (includes $, ¥, €, etc. and quoted text)\n const prefixMatch = cleanFmt.match(/^([^#0?.,]+)/);\n if (prefixMatch) {\n prefix = prefixMatch[1];\n cleanFmt = cleanFmt.substring(prefixMatch[0].length);\n }\n\n // Extract suffix\n const suffixMatch = cleanFmt.match(/([^#0?.,]+)$/);\n if (suffixMatch && !suffixMatch[1].includes(\"%\")) {\n suffix = suffixMatch[1];\n cleanFmt = cleanFmt.substring(0, cleanFmt.length - suffixMatch[0].length);\n }\n\n // Format the number\n const formattedNum = formatNumberPattern(numVal, cleanFmt);\n\n return prefix + formattedNum + suffix;\n}\n\n// =============================================================================\n// Export\n// =============================================================================\n\nexport const cellFormat = {\n format,\n getFormat,\n isDateFormat,\n isGeneral\n};\n","/**\n * Utility functions for ExcelTS\n * Provides convenient helper functions for common spreadsheet operations\n */\n\nimport { Workbook } from \"@excel/workbook\";\nimport type { Worksheet } from \"@excel/worksheet\";\nimport type { Cell } from \"@excel/cell\";\nimport { colCache } from \"@excel/utils/col-cache\";\nimport type { CellValue } from \"@excel/types\";\nimport { format as cellFormat } from \"@excel/utils/cell-format\";\nimport { dateToExcel } from \"@utils/utils.base\";\n\n/**\n * Check if format is a pure time format (no date components like y, m for month, d)\n * Time formats only contain: h, m (minutes in time context), s, AM/PM\n * Excludes elapsed time formats like [h]:mm:ss which should keep full serial number\n */\nfunction isTimeOnlyFormat(fmt: string): boolean {\n // Remove quoted strings first\n const cleaned = fmt.replace(/\"[^\"]*\"/g, \"\");\n\n // Elapsed time formats [h], [m], [s] should NOT be treated as time-only\n // They need the full serial number to calculate total hours/minutes/seconds\n if (/\\[[hms]\\]/i.test(cleaned)) {\n return false;\n }\n\n // Remove color codes and conditions (but we already checked for [h], [m], [s])\n const withoutBrackets = cleaned.replace(/\\[[^\\]]*\\]/g, \"\");\n\n // Check if it has time components (h, s, or AM/PM)\n const hasTimeComponents = /[hs]/i.test(withoutBrackets) || /AM\\/PM|A\\/P/i.test(withoutBrackets);\n\n // Check if it has date components (y, d, or m not adjacent to h/s which would make it minutes)\n // In Excel: \"m\" after \"h\" or before \"s\" is minutes, otherwise it's month\n const hasDateComponents = /[yd]/i.test(withoutBrackets);\n\n // If it has time but no date components, it's a time-only format\n // Also check for standalone 'm' that's not minutes (not near h or s)\n if (hasDateComponents) {\n return false;\n }\n\n // Check for month 'm' - if 'm' exists but not in h:m or m:s context, it's a date format\n if (/m/i.test(withoutBrackets) && !hasTimeComponents) {\n return false;\n }\n\n return hasTimeComponents;\n}\n\n/**\n * Check if format is a date format (contains y, d, or month-m)\n * Used to determine if dateFormat override should be applied\n */\nfunction isDateFormat(fmt: string): boolean {\n // Remove quoted strings first\n const cleaned = fmt.replace(/\"[^\"]*\"/g, \"\");\n\n // Elapsed time formats [h], [m], [s] are NOT date formats\n if (/\\[[hms]\\]/i.test(cleaned)) {\n return false;\n }\n\n // Remove color codes and conditions\n const withoutBrackets = cleaned.replace(/\\[[^\\]]*\\]/g, \"\");\n\n // Check for year or day components\n if (/[yd]/i.test(withoutBrackets)) {\n return true;\n }\n\n // Check for month 'm' - only if it's NOT in time context (not near h or s)\n // In Excel: \"m\" after \"h\" or before \"s\" is minutes, otherwise it's month\n if (/m/i.test(withoutBrackets)) {\n const hasTimeComponents = /[hs]/i.test(withoutBrackets) || /AM\\/PM|A\\/P/i.test(withoutBrackets);\n // If no time components, 'm' is month\n if (!hasTimeComponents) {\n return true;\n }\n // If has time components, need to check if 'm' is month or minutes\n // Simplified: if format has both date-like and time-like patterns, consider it a date format\n // e.g., \"m/d/yy h:mm\" - has 'm' as month and 'mm' as minutes\n }\n\n return false;\n}\n\n/**\n * Format a value (Date, number, boolean, string) according to the given format\n * Handles timezone-independent conversion for Date objects\n * @param value - The value to format\n * @param fmt - The format string to use\n * @param dateFormat - Optional override format for date values (not applied to time or elapsed time formats)\n */\nfunction formatValue(\n value: Date | number | boolean | string,\n fmt: string,\n dateFormat?: string\n): string {\n // Date object - convert back to Excel serial number\n if (value instanceof Date) {\n let serial = dateToExcel(value);\n\n // For time-only formats, use only the fractional part (time portion)\n if (isTimeOnlyFormat(fmt)) {\n serial = serial % 1;\n if (serial < 0) {\n serial += 1;\n }\n return cellFormat(fmt, serial);\n }\n\n // Only apply dateFormat override to actual date formats\n // (not elapsed time formats like [h]:mm:ss)\n const actualFmt = dateFormat && isDateFormat(fmt) ? dateFormat : fmt;\n return cellFormat(actualFmt, serial);\n }\n\n // Number/Boolean/String - let cellFormat handle it\n return cellFormat(fmt, value);\n}\n\n/**\n * Get formatted display text for a cell value\n * Returns the value formatted according to the cell's numFmt\n * This matches Excel's display exactly (timezone-independent)\n * @param cell - The cell to get display text for\n * @param dateFormat - Optional override format for date values\n */\nfunction getCellDisplayText(cell: Cell, dateFormat?: string): string {\n const value = cell.value;\n const numFmt = cell.numFmt;\n // Extract format code string from numFmt (which can be string or NumFmt object)\n const fmt = typeof numFmt === \"string\" ? numFmt : (numFmt?.formatCode ?? \"General\");\n\n // Null/undefined\n if (value == null) {\n return \"\";\n }\n\n // Date/Number/Boolean/String - format directly\n if (\n value instanceof Date ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n typeof value === \"string\"\n ) {\n return formatValue(value, fmt, dateFormat);\n }\n\n // Formula type - use the result value\n if (typeof value === \"object\" && \"formula\" in value) {\n const result = value.result;\n\n if (result == null) {\n return \"\";\n }\n\n if (\n result instanceof Date ||\n typeof result === \"number\" ||\n typeof result === \"boolean\" ||\n typeof result === \"string\"\n ) {\n return formatValue(result, fmt, dateFormat);\n }\n }\n\n // Fallback to cell.text for other types (rich text, hyperlink, error, etc.)\n return cell.text;\n}\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Cell address object (0-indexed)\n */\nexport interface CellAddress {\n /** 0-indexed column number */\n c: number;\n /** 0-indexed row number */\n r: number;\n}\n\n/**\n * Range object with start and end addresses\n */\nexport interface Range {\n /** Start cell (top-left) */\n s: CellAddress;\n /** End cell (bottom-right) */\n e: CellAddress;\n}\n\n/**\n * Row data for JSON conversion\n */\nexport type JSONRow = Record<string, CellValue>;\n\n// =============================================================================\n// Cell Address Encoding/Decoding\n// =============================================================================\n\n/**\n * Decode column string to 0-indexed number\n * @example decodeCol(\"A\") => 0, decodeCol(\"Z\") => 25, decodeCol(\"AA\") => 26\n */\nexport function decodeCol(colstr: string): number {\n return colCache.l2n(colstr.toUpperCase()) - 1;\n}\n\n/**\n * Encode 0-indexed column number to string\n * @example encodeCol(0) => \"A\", encodeCol(25) => \"Z\", encodeCol(26) => \"AA\"\n */\nexport function encodeCol(col: number): string {\n return colCache.n2l(col + 1);\n}\n\n/**\n * Decode row string to 0-indexed number\n * @example decodeRow(\"1\") => 0, decodeRow(\"10\") => 9\n */\nexport function decodeRow(rowstr: string): number {\n return parseInt(rowstr, 10) - 1;\n}\n\n/**\n * Encode 0-indexed row number to string\n * @example encodeRow(0) => \"1\", encodeRow(9) => \"10\"\n */\nexport function encodeRow(row: number): string {\n return String(row + 1);\n}\n\n/**\n * Decode cell address string to CellAddress object\n * @example decodeCell(\"A1\") => {c: 0, r: 0}, decodeCell(\"B2\") => {c: 1, r: 1}\n */\nexport function decodeCell(cstr: string): CellAddress {\n const addr = colCache.decodeAddress(cstr.toUpperCase());\n return { c: addr.col - 1, r: addr.row - 1 };\n}\n\n/**\n * Encode CellAddress object to cell address string\n * @example encodeCell({c: 0, r: 0}) => \"A1\", encodeCell({c: 1, r: 1}) => \"B2\"\n */\nexport function encodeCell(cell: CellAddress): string {\n return colCache.encodeAddress(cell.r + 1, cell.c + 1);\n}\n\n/**\n * Decode range string to Range object\n * @example decodeRange(\"A1:B2\") => {s: {c: 0, r: 0}, e: {c: 1, r: 1}}\n */\nexport function decodeRange(range: string): Range {\n const idx = range.indexOf(\":\");\n if (idx === -1) {\n const cell = decodeCell(range);\n return { s: cell, e: { ...cell } };\n }\n return {\n s: decodeCell(range.slice(0, idx)),\n e: decodeCell(range.slice(idx + 1))\n };\n}\n\n/**\n * Encode Range object to range string\n */\nexport function encodeRange(range: Range): string;\nexport function encodeRange(start: CellAddress, end: CellAddress): string;\nexport function encodeRange(startOrRange: CellAddress | Range, end?: CellAddress): string {\n if (end === undefined) {\n const range = startOrRange as Range;\n return encodeRange(range.s, range.e);\n }\n const start = startOrRange as CellAddress;\n const startStr = encodeCell(start);\n const endStr = encodeCell(end);\n return startStr === endStr ? startStr : `${startStr}:${endStr}`;\n}\n\n// =============================================================================\n// Sheet/JSON Conversion\n// =============================================================================\n\n/** Origin can be cell address string, cell object, row number, or -1 to append */\nexport type Origin = string | CellAddress | number;\n\nexport interface JSON2SheetOpts {\n /** Use specified field order (default Object.keys) */\n header?: string[];\n /** Use specified date format in string output */\n dateFormat?: string;\n /** Store dates as type d (default is n) */\n cellDates?: boolean;\n /** If true, do not include header row in output */\n skipHeader?: boolean;\n /** If true, emit #NULL! error cells for null values */\n nullError?: boolean;\n}\n\nexport interface SheetAddJSONOpts extends JSON2SheetOpts {\n /** Use specified cell as starting point */\n origin?: Origin;\n}\n\n/**\n * Create a worksheet from an array of objects (xlsx compatible)\n * @example\n * const ws = jsonToSheet([{name: \"Alice\", age: 30}, {name: \"Bob\", age: 25}])\n */\nexport function jsonToSheet(data: JSONRow[], opts?: JSON2SheetOpts): Worksheet {\n const o = opts || {};\n // Create a temporary workbook to get a worksheet\n const tempWb = new Workbook();\n const worksheet = tempWb.addWorksheet(\"Sheet1\");\n\n if (data.length === 0) {\n return worksheet;\n }\n\n // Determine headers - use provided header or Object.keys from first object\n const allKeys = new Set<string>();\n data.forEach(row => Object.keys(row).forEach(k => allKeys.add(k)));\n const headers = o.header ? [...o.header] : [...allKeys];\n\n // Add any missing keys from data that weren't in header\n if (o.header) {\n allKeys.forEach(k => {\n if (!headers.includes(k)) {\n headers.push(k);\n }\n });\n }\n\n let rowNum = 1;\n\n // Write header row\n if (!o.skipHeader) {\n headers.forEach((h, colIdx) => {\n worksheet.getCell(rowNum, colIdx + 1).value = h;\n });\n rowNum++;\n }\n\n // Write data rows\n for (const row of data) {\n headers.forEach((key, colIdx) => {\n const val = row[key];\n if (val === null && o.nullError) {\n worksheet.getCell(rowNum, colIdx + 1).value = { error: \"#NULL!\" };\n } else if (val !== undefined && val !== null) {\n worksheet.getCell(rowNum, colIdx + 1).value = val;\n }\n });\n rowNum++;\n }\n\n return worksheet;\n}\n\n/**\n * Add data from an array of objects to an existing worksheet (xlsx compatible)\n */\nexport function sheetAddJson(\n worksheet: Worksheet,\n data: JSONRow[],\n opts?: SheetAddJSONOpts\n): Worksheet {\n const o = opts || {};\n\n if (data.length === 0) {\n return worksheet;\n }\n\n // Determine starting position\n let startRow = 1;\n let startCol = 1;\n\n if (o.origin !== undefined) {\n if (typeof o.origin === \"string\") {\n const addr = decodeCell(o.origin);\n startRow = addr.r + 1;\n startCol = addr.c + 1;\n } else if (typeof o.origin === \"number\") {\n if (o.origin === -1) {\n // Append to bottom\n startRow = worksheet.rowCount + 1;\n } else {\n startRow = o.origin + 1; // 0-indexed row\n }\n } else {\n startRow = o.origin.r + 1;\n startCol = o.origin.c + 1;\n }\n }\n\n // Determine headers\n const allKeys = new Set<string>();\n data.forEach(row => Object.keys(row).forEach(k => allKeys.add(k)));\n const headers = o.header ? [...o.header] : [...allKeys];\n\n if (o.header) {\n allKeys.forEach(k => {\n if (!headers.includes(k)) {\n headers.push(k);\n }\n });\n }\n\n let rowNum = startRow;\n\n // Write header row\n if (!o.skipHeader) {\n headers.forEach((h, colIdx) => {\n worksheet.getCell(rowNum, startCol + colIdx).value = h;\n });\n rowNum++;\n }\n\n // Write data rows\n for (const row of data) {\n headers.forEach((key, colIdx) => {\n const val = row[key];\n if (val === null && o.nullError) {\n worksheet.getCell(rowNum, startCol + colIdx).value = { error: \"#NULL!\" };\n } else if (val !== undefined && val !== null) {\n worksheet.getCell(rowNum, startCol + colIdx).value = val;\n }\n });\n rowNum++;\n }\n\n return worksheet;\n}\n\nexport interface Sheet2JSONOpts {\n /**\n * Control output format:\n * - 1: Generate an array of arrays\n * - \"A\": Row object keys are literal column labels (A, B, C, ...)\n * - string[]: Use specified strings as keys in row objects\n * - undefined: Read and disambiguate first row as keys\n */\n header?: 1 | \"A\" | string[];\n /**\n * Override Range:\n * - number: Use worksheet range but set starting row to the value\n * - string: Use specified range (A1-Style bounded range string)\n * - undefined: Use worksheet range\n */\n range?: number | string;\n /** Use raw values (true, default) or formatted text strings with trim (false) */\n raw?: boolean;\n /** Default value for empty cells */\n defval?: CellValue;\n /** Include blank lines in the output */\n blankrows?: boolean;\n /**\n * Override format for date values (not applied to time-only formats).\n * When provided, Date values will be formatted using this format string.\n * @example \"dd/mm/yyyy\" or \"yyyy-mm-dd\"\n */\n dateFormat?: string;\n}\n\n/**\n * Convert worksheet to JSON array (xlsx compatible)\n * @example\n * // Default: array of objects with first row as headers\n * const data = sheetToJson(worksheet)\n * // => [{name: \"Alice\", age: 30}, {name: \"Bob\", age: 25}]\n *\n * // Array of arrays\n * const aoa = sheetToJson(worksheet, { header: 1 })\n * // => [[\"name\", \"age\"], [\"Alice\", 30], [\"Bob\", 25]]\n *\n * // Column letters as keys\n * const cols = sheetToJson(worksheet, { header: \"A\" })\n * // => [{A: \"name\", B: \"age\"}, {A: \"Alice\", B: 30}]\n */\nexport function sheetToJson<T = JSONRow>(worksheet: Worksheet, opts?: Sheet2JSONOpts): T[] {\n const o = opts || {};\n\n // Determine range\n let startRow = 1;\n let endRow = worksheet.rowCount;\n let startCol = 1;\n let endCol = worksheet.columnCount;\n\n if (o.range !== undefined) {\n if (typeof o.range === \"number\") {\n startRow = o.range + 1; // 0-indexed to 1-indexed\n } else if (typeof o.range === \"string\") {\n const r = decodeRange(o.range);\n startRow = r.s.r + 1;\n endRow = r.e.r + 1;\n startCol = r.s.c + 1;\n endCol = r.e.c + 1;\n }\n }\n\n if (endRow < startRow || endCol < startCol) {\n return [];\n }\n\n // Handle header option\n const headerOpt = o.header;\n\n // header: 1 - return array of arrays\n if (headerOpt === 1) {\n const result: CellValue[][] = [];\n // Default for header:1 is to include blank rows\n const includeBlank = o.blankrows !== false;\n\n for (let row = startRow; row <= endRow; row++) {\n const rowData: CellValue[] = [];\n let isEmpty = true;\n\n for (let col = startCol; col <= endCol; col++) {\n const cell = worksheet.getCell(row, col);\n const val = o.raw === false ? getCellDisplayText(cell, o.dateFormat).trim() : cell.value;\n\n if (val != null && val !== \"\") {\n rowData[col - startCol] = val;\n isEmpty = false;\n } else if (o.defval !== undefined) {\n rowData[col - startCol] = o.defval;\n } else {\n rowData[col - startCol] = null;\n }\n }\n\n if (!isEmpty || includeBlank) {\n result.push(rowData);\n }\n }\n\n return result as T[];\n }\n\n // header: \"A\" - use column letters as keys\n if (headerOpt === \"A\") {\n const result: Record<string, CellValue>[] = [];\n // Default for header:\"A\" is to skip blank rows\n const includeBlank = o.blankrows === true;\n\n for (let row = startRow; row <= endRow; row++) {\n const rowData: Record<string, CellValue> = {};\n let isEmpty = true;\n\n for (let col = startCol; col <= endCol; col++) {\n const cell = worksheet.getCell(row, col);\n const val = o.raw === false ? getCellDisplayText(cell, o.dateFormat).trim() : cell.value;\n const key = encodeCol(col - 1); // 0-indexed for encodeCol\n\n if (val != null && val !== \"\") {\n rowData[key] = val;\n isEmpty = false;\n } else if (o.defval !== undefined) {\n rowData[key] = o.defval;\n }\n }\n\n if (!isEmpty || includeBlank) {\n result.push(rowData);\n }\n }\n\n return result as T[];\n }\n\n // header: string[] - use provided array as keys\n if (Array.isArray(headerOpt)) {\n const result: Record<string, CellValue>[] = [];\n const includeBlank = o.blankrows === true;\n\n for (let row = startRow; row <= endRow; row++) {\n const rowData: Record<string, CellValue> = {};\n let isEmpty = true;\n\n for (let col = startCol; col <= endCol; col++) {\n const colIdx = col - startCol;\n const key = headerOpt[colIdx] ?? `__EMPTY_${colIdx}`;\n const cell = worksheet.getCell(row, col);\n const val = o.raw === false ? getCellDisplayText(cell, o.dateFormat).trim() : cell.value;\n\n if (val != null && val !== \"\") {\n rowData[key] = val;\n isEmpty = false;\n } else if (o.defval !== undefined) {\n rowData[key] = o.defval;\n }\n }\n\n if (!isEmpty || includeBlank) {\n result.push(rowData);\n }\n }\n\n return result as T[];\n }\n\n // Default: first row as header, disambiguate duplicates\n const headers: string[] = [];\n const headerCounts: Record<string, number> = {};\n\n for (let col = startCol; col <= endCol; col++) {\n const cell = worksheet.getCell(startRow, col);\n const val = cell.value;\n let header = val != null ? String(val) : `__EMPTY_${col - startCol}`;\n\n // Disambiguate duplicate headers\n if (headerCounts[header] !== undefined) {\n headerCounts[header]++;\n header = `${header}_${headerCounts[header]}`;\n } else {\n headerCounts[header] = 0;\n }\n\n headers.push(header);\n }\n\n // Read data rows (skip header row)\n const result: Record<string, CellValue>[] = [];\n const dataStartRow = startRow + 1;\n // Default for objects is to skip blank rows\n const includeBlank = o.blankrows === true;\n\n for (let row = dataStartRow; row <= endRow; row++) {\n const rowData: Record<string, CellValue> = {};\n let isEmpty = true;\n\n for (let col = startCol; col <= endCol; col++) {\n const cell = worksheet.getCell(row, col);\n const val = o.raw === false ? getCellDisplayText(cell, o.dateFormat).trim() : cell.value;\n const key = headers[col - startCol];\n\n if (val != null && val !== \"\") {\n rowData[key] = val;\n isEmpty = false;\n } else if (o.defval !== undefined) {\n rowData[key] = o.defval;\n }\n }\n\n if (!isEmpty || includeBlank) {\n result.push(rowData);\n }\n }\n\n return result as T[];\n}\n\n// =============================================================================\n// Sheet to CSV\n// =============================================================================\n\nexport interface Sheet2CSVOpts {\n /** Field separator (default: \",\") */\n FS?: string;\n /** Record separator (default: \"\\n\") */\n RS?: string;\n /** Skip blank rows */\n blankrows?: boolean;\n /** Force quote all fields */\n forceQuotes?: boolean;\n}\n\n/**\n * Convert worksheet to CSV string\n */\nexport function sheetToCsv(worksheet: Worksheet, opts?: Sheet2CSVOpts): string {\n const o = opts || {};\n const FS = o.FS ?? \",\";\n const RS = o.RS ?? \"\\n\";\n const rows: string[] = [];\n\n worksheet.eachRow({ includeEmpty: o.blankrows !== false }, (row, rowNumber) => {\n const cells: string[] = [];\n let isEmpty = true;\n\n row.eachCell({ includeEmpty: true }, (cell, colNumber) => {\n let val = \"\";\n if (cell.value != null) {\n if (cell.value instanceof Date) {\n val = cell.value.toISOString();\n } else if (typeof cell.value === \"object\") {\n // Handle rich text, formula results, etc.\n if (\"result\" in cell.value) {\n val = String(cell.value.result ?? \"\");\n } else if (\"text\" in cell.value) {\n val = String(cell.value.text ?? \"\");\n } else if (\"richText\" in cell.value) {\n val = (cell.value.richText as Array<{ text: string }>).map(r => r.text).join(\"\");\n } else {\n val = String(cell.value);\n }\n } else {\n val = String(cell.value);\n }\n isEmpty = false;\n }\n\n // Quote if necessary\n const needsQuote =\n o.forceQuotes ||\n val.includes(FS) ||\n val.includes('\"') ||\n val.includes(\"\\n\") ||\n val.includes(\"\\r\");\n\n if (needsQuote) {\n val = `\"${val.replace(/\"/g, '\"\"')}\"`;\n }\n\n cells.push(val);\n });\n\n // Pad cells to match column count\n while (cells.length < worksheet.columnCount) {\n cells.push(\"\");\n }\n\n if (!isEmpty || o.blankrows !== false) {\n rows.push(cells.join(FS));\n }\n });\n\n return rows.join(RS);\n}\n\n// =============================================================================\n// Workbook Functions\n// =============================================================================\n\n/**\n * Create a new workbook\n */\nexport function bookNew(): Workbook {\n return new Workbook();\n}\n\n/**\n * Append worksheet to workbook (xlsx compatible)\n * @example\n * const wb = bookNew();\n * const ws = jsonToSheet([{a: 1, b: 2}]);\n * bookAppendSheet(wb, ws, \"Sheet1\");\n */\nexport function bookAppendSheet(workbook: Workbook, worksheet: Worksheet, name?: string): void {\n // Copy the worksheet data to a new sheet in the workbook\n const newWs = workbook.addWorksheet(name);\n\n // Copy all cells from source worksheet\n worksheet.eachRow({ includeEmpty: true }, (row, rowNumber) => {\n row.eachCell({ includeEmpty: true }, (cell, colNumber) => {\n const newCell = newWs.getCell(rowNumber, colNumber);\n newCell.value = cell.value;\n if (cell.style) {\n newCell.style = cell.style;\n }\n });\n });\n\n // Copy column properties\n worksheet.columns?.forEach((col, idx) => {\n if (col && newWs.columns[idx]) {\n if (col.width) {\n newWs.getColumn(idx + 1).width = col.width;\n }\n }\n });\n}\n\n// =============================================================================\n// Array of Arrays Conversion\n// =============================================================================\n\nexport interface AOA2SheetOpts {\n /** Use specified cell as starting point */\n origin?: Origin;\n /** Use specified date format in string output */\n dateFormat?: string;\n /** Store dates as type d (default is n) */\n cellDates?: boolean;\n}\n\n/**\n * Create a worksheet from an array of arrays (xlsx compatible)\n * @example\n * const ws = aoaToSheet([[\"Name\", \"Age\"], [\"Alice\", 30], [\"Bob\", 25]])\n */\nexport function aoaToSheet(data: CellValue[][], opts?: AOA2SheetOpts): Worksheet {\n const tempWb = new Workbook();\n const worksheet = tempWb.addWorksheet(\"Sheet1\");\n\n if (data.length === 0) {\n return worksheet;\n }\n\n // Determine starting position\n let startRow = 1;\n let startCol = 1;\n\n if (opts?.origin !== undefined) {\n if (typeof opts.origin === \"string\") {\n const addr = decodeCell(opts.origin);\n startRow = addr.r + 1;\n startCol = addr.c + 1;\n } else if (typeof opts.origin === \"number\") {\n startRow = opts.origin + 1; // 0-indexed row\n } else {\n startRow = opts.origin.r + 1;\n startCol = opts.origin.c + 1;\n }\n }\n\n data.forEach((row, rowIdx) => {\n if (!row) {\n return;\n }\n row.forEach((val, colIdx) => {\n if (val !== undefined && val !== null) {\n worksheet.getCell(startRow + rowIdx, startCol + colIdx).value = val;\n }\n });\n });\n\n return worksheet;\n}\n\n/**\n * Add data from an array of arrays to an existing worksheet (xlsx compatible)\n */\nexport function sheetAddAoa(\n worksheet: Worksheet,\n data: CellValue[][],\n opts?: AOA2SheetOpts\n): Worksheet {\n if (data.length === 0) {\n return worksheet;\n }\n\n // Determine starting position\n let startRow = 1;\n let startCol = 1;\n\n if (opts?.origin !== undefined) {\n if (typeof opts.origin === \"string\") {\n const addr = decodeCell(opts.origin);\n startRow = addr.r + 1;\n startCol = addr.c + 1;\n } else if (typeof opts.origin === \"number\") {\n if (opts.origin === -1) {\n // Append to bottom\n startRow = worksheet.rowCount + 1;\n } else {\n startRow = opts.origin + 1; // 0-indexed row\n }\n } else {\n startRow = opts.origin.r + 1;\n startCol = opts.origin.c + 1;\n }\n }\n\n data.forEach((row, rowIdx) => {\n if (!row) {\n return;\n }\n row.forEach((val, colIdx) => {\n if (val !== undefined && val !== null) {\n worksheet.getCell(startRow + rowIdx, startCol + colIdx).value = val;\n }\n });\n });\n\n return worksheet;\n}\n\n/**\n * Convert worksheet to array of arrays\n */\nexport function sheetToAoa(worksheet: Worksheet): CellValue[][] {\n const result: CellValue[][] = [];\n\n worksheet.eachRow({ includeEmpty: true }, (row, rowNumber) => {\n const rowData: CellValue[] = [];\n row.eachCell({ includeEmpty: true }, (cell, colNumber) => {\n rowData[colNumber - 1] = cell.value;\n });\n result[rowNumber - 1] = rowData;\n });\n\n return result;\n}\n"],"mappings":"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"}
|