@cj-tech-master/excelts 1.6.3 → 2.0.0-canary.20251228013952.4f2c3c6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +139 -24
- package/README_zh.md +140 -26
- package/dist/browser/excelts.esm.js +18468 -0
- package/dist/browser/excelts.esm.js.map +1 -0
- package/dist/browser/excelts.esm.min.js +125 -0
- package/dist/browser/excelts.iife.js +13107 -47146
- package/dist/browser/excelts.iife.js.map +1 -1
- package/dist/browser/excelts.iife.min.js +24 -106
- package/dist/cjs/csv/csv-core.js +701 -0
- package/dist/cjs/csv/csv-stream.js +646 -0
- package/dist/cjs/csv/csv.base.js +137 -0
- package/dist/cjs/csv/csv.browser.js +68 -0
- package/dist/cjs/csv/csv.js +218 -162
- package/dist/cjs/doc/anchor.js +2 -2
- package/dist/cjs/doc/cell.js +22 -22
- package/dist/cjs/doc/column.js +28 -7
- package/dist/cjs/doc/data-validations.js +3 -3
- package/dist/cjs/doc/defined-names.js +13 -13
- package/dist/cjs/doc/image.js +7 -7
- package/dist/cjs/doc/modelcontainer.js +2 -2
- package/dist/cjs/doc/note.js +2 -2
- package/dist/cjs/doc/pivot-table.js +5 -5
- package/dist/cjs/doc/range.js +11 -11
- package/dist/cjs/doc/row.js +16 -16
- package/dist/cjs/doc/table.js +5 -5
- package/dist/cjs/doc/workbook.base.js +211 -0
- package/dist/cjs/doc/workbook.browser.js +62 -0
- package/dist/cjs/doc/workbook.js +68 -179
- package/dist/cjs/doc/worksheet.js +45 -41
- package/dist/cjs/index.js +49 -32
- package/dist/cjs/stream/xlsx/hyperlink-reader.js +6 -6
- package/dist/cjs/stream/xlsx/sheet-comments-writer.js +12 -12
- package/dist/cjs/stream/xlsx/sheet-rels-writer.js +4 -4
- package/dist/cjs/stream/xlsx/workbook-reader.js +22 -22
- package/dist/cjs/stream/xlsx/workbook-writer.js +38 -38
- package/dist/cjs/stream/xlsx/worksheet-reader.js +17 -17
- package/dist/cjs/stream/xlsx/worksheet-writer.js +67 -60
- package/dist/cjs/utils/browser-buffer.js +75 -0
- package/dist/cjs/utils/cell-format.js +2 -2
- package/dist/cjs/utils/cell-matrix.js +5 -5
- package/dist/cjs/utils/datetime.js +499 -0
- package/dist/cjs/utils/encryptor.browser.js +240 -0
- package/dist/cjs/utils/parse-sax.js +1191 -13
- package/dist/cjs/utils/shared-formula.js +5 -5
- package/dist/cjs/utils/sheet-utils.js +13 -13
- package/dist/cjs/utils/stream-buf.browser.js +355 -0
- package/dist/cjs/utils/stream-buf.js +5 -5
- package/dist/cjs/utils/unzip/extract.js +11 -11
- package/dist/cjs/utils/unzip/index.js +21 -21
- package/dist/cjs/utils/unzip/parse-extra-field.js +3 -3
- package/dist/cjs/utils/unzip/parse.js +16 -16
- package/dist/cjs/utils/unzip/zip-parser.js +14 -3
- package/dist/cjs/utils/utils.base.js +161 -0
- package/dist/cjs/utils/utils.browser.js +89 -0
- package/dist/cjs/utils/utils.js +46 -154
- package/dist/cjs/utils/xml-stream.js +3 -3
- package/dist/cjs/utils/zip/compress.base.js +88 -0
- package/dist/cjs/utils/zip/compress.browser.js +127 -0
- package/dist/cjs/utils/zip/compress.js +18 -198
- package/dist/cjs/utils/zip/crc32.browser.js +88 -0
- package/dist/cjs/utils/zip/deflate-fallback.js +575 -0
- package/dist/cjs/utils/zip/index.js +17 -17
- package/dist/cjs/utils/zip/streaming-zip.js +264 -0
- package/dist/cjs/utils/zip/zip-builder.js +10 -10
- package/dist/cjs/utils/zip-stream.browser.js +135 -0
- package/dist/cjs/utils/zip-stream.js +4 -4
- package/dist/cjs/xlsx/xform/base-xform.js +4 -4
- package/dist/cjs/xlsx/xform/book/defined-name-xform.js +4 -4
- package/dist/cjs/xlsx/xform/book/sheet-xform.js +4 -4
- package/dist/cjs/xlsx/xform/book/workbook-calc-properties-xform.js +2 -2
- package/dist/cjs/xlsx/xform/book/workbook-pivot-cache-xform.js +2 -2
- package/dist/cjs/xlsx/xform/book/workbook-properties-xform.js +2 -2
- package/dist/cjs/xlsx/xform/book/workbook-view-xform.js +2 -2
- package/dist/cjs/xlsx/xform/book/workbook-xform.js +24 -24
- package/dist/cjs/xlsx/xform/comment/comment-xform.js +4 -4
- package/dist/cjs/xlsx/xform/comment/comments-xform.js +6 -6
- package/dist/cjs/xlsx/xform/comment/style/vml-position-xform.js +2 -2
- package/dist/cjs/xlsx/xform/comment/style/vml-protection-xform.js +2 -2
- package/dist/cjs/xlsx/xform/comment/vml-anchor-xform.js +2 -2
- package/dist/cjs/xlsx/xform/comment/vml-client-data-xform.js +10 -10
- package/dist/cjs/xlsx/xform/comment/vml-notes-xform.js +6 -6
- package/dist/cjs/xlsx/xform/comment/vml-shape-xform.js +6 -6
- package/dist/cjs/xlsx/xform/comment/vml-textbox-xform.js +2 -2
- package/dist/cjs/xlsx/xform/composite-xform.js +2 -2
- package/dist/cjs/xlsx/xform/core/app-heading-pairs-xform.js +2 -2
- package/dist/cjs/xlsx/xform/core/app-titles-of-parts-xform.js +2 -2
- package/dist/cjs/xlsx/xform/core/app-xform.js +11 -11
- package/dist/cjs/xlsx/xform/core/content-types-xform.js +4 -4
- package/dist/cjs/xlsx/xform/core/core-xform.js +23 -23
- package/dist/cjs/xlsx/xform/core/relationship-xform.js +2 -2
- package/dist/cjs/xlsx/xform/core/relationships-xform.js +6 -6
- package/dist/cjs/xlsx/xform/drawing/base-cell-anchor-xform.js +2 -2
- package/dist/cjs/xlsx/xform/drawing/blip-fill-xform.js +4 -4
- package/dist/cjs/xlsx/xform/drawing/blip-xform.js +2 -2
- package/dist/cjs/xlsx/xform/drawing/c-nv-pic-pr-xform.js +2 -2
- package/dist/cjs/xlsx/xform/drawing/c-nv-pr-xform.js +6 -6
- package/dist/cjs/xlsx/xform/drawing/cell-position-xform.js +7 -7
- package/dist/cjs/xlsx/xform/drawing/drawing-xform.js +10 -10
- package/dist/cjs/xlsx/xform/drawing/ext-lst-xform.js +2 -2
- package/dist/cjs/xlsx/xform/drawing/ext-xform.js +2 -2
- package/dist/cjs/xlsx/xform/drawing/hlink-click-xform.js +2 -2
- package/dist/cjs/xlsx/xform/drawing/nv-pic-pr-xform.js +6 -6
- package/dist/cjs/xlsx/xform/drawing/one-cell-anchor-xform.js +10 -10
- package/dist/cjs/xlsx/xform/drawing/pic-xform.js +9 -9
- package/dist/cjs/xlsx/xform/drawing/two-cell-anchor-xform.js +9 -9
- package/dist/cjs/xlsx/xform/list-xform.js +2 -2
- package/dist/cjs/xlsx/xform/pivot-table/cache-field-xform.js +5 -5
- package/dist/cjs/xlsx/xform/pivot-table/cache-field.js +3 -3
- package/dist/cjs/xlsx/xform/pivot-table/pivot-cache-definition-xform.js +10 -10
- package/dist/cjs/xlsx/xform/pivot-table/pivot-cache-records-xform.js +9 -9
- package/dist/cjs/xlsx/xform/pivot-table/pivot-table-xform.js +10 -11
- package/dist/cjs/xlsx/xform/sheet/auto-filter-xform.js +4 -4
- package/dist/cjs/xlsx/xform/sheet/cell-xform.js +65 -65
- package/dist/cjs/xlsx/xform/sheet/cf/cf-rule-xform.js +27 -27
- package/dist/cjs/xlsx/xform/sheet/cf/cfvo-xform.js +3 -3
- package/dist/cjs/xlsx/xform/sheet/cf/color-scale-xform.js +6 -6
- package/dist/cjs/xlsx/xform/sheet/cf/conditional-formatting-xform.js +6 -6
- package/dist/cjs/xlsx/xform/sheet/cf/conditional-formattings-xform.js +4 -4
- package/dist/cjs/xlsx/xform/sheet/cf/databar-xform.js +6 -6
- package/dist/cjs/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +5 -5
- package/dist/cjs/xlsx/xform/sheet/cf/formula-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/cf/icon-set-xform.js +11 -11
- package/dist/cjs/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +3 -3
- package/dist/cjs/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +11 -12
- package/dist/cjs/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +4 -4
- package/dist/cjs/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +8 -8
- package/dist/cjs/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +6 -6
- package/dist/cjs/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +26 -26
- package/dist/cjs/xlsx/xform/sheet/cf-ext/f-ext-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +14 -14
- package/dist/cjs/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/col-breaks-xform.js +38 -0
- package/dist/cjs/xlsx/xform/sheet/col-xform.js +6 -6
- package/dist/cjs/xlsx/xform/sheet/data-validations-xform.js +18 -18
- package/dist/cjs/xlsx/xform/sheet/dimension-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/drawing-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/ext-lst-xform.js +5 -5
- package/dist/cjs/xlsx/xform/sheet/header-footer-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/hyperlink-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/merge-cell-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/merges.js +8 -8
- package/dist/cjs/xlsx/xform/sheet/outline-properties-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/page-breaks-xform.js +15 -3
- package/dist/cjs/xlsx/xform/sheet/page-margins-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/page-setup-properties-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/page-setup-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/picture-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/print-options-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/row-breaks-xform.js +15 -17
- package/dist/cjs/xlsx/xform/sheet/row-xform.js +11 -11
- package/dist/cjs/xlsx/xform/sheet/sheet-format-properties-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/sheet-properties-xform.js +8 -8
- package/dist/cjs/xlsx/xform/sheet/sheet-protection-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/sheet-view-xform.js +4 -4
- package/dist/cjs/xlsx/xform/sheet/table-part-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/worksheet-xform.js +75 -70
- package/dist/cjs/xlsx/xform/simple/boolean-xform.js +2 -2
- package/dist/cjs/xlsx/xform/simple/date-xform.js +2 -2
- package/dist/cjs/xlsx/xform/simple/float-xform.js +2 -2
- package/dist/cjs/xlsx/xform/simple/integer-xform.js +2 -2
- package/dist/cjs/xlsx/xform/simple/string-xform.js +2 -2
- package/dist/cjs/xlsx/xform/static-xform.js +4 -4
- package/dist/cjs/xlsx/xform/strings/phonetic-text-xform.js +6 -6
- package/dist/cjs/xlsx/xform/strings/rich-text-xform.js +6 -6
- package/dist/cjs/xlsx/xform/strings/shared-string-xform.js +8 -8
- package/dist/cjs/xlsx/xform/strings/shared-strings-xform.js +6 -6
- package/dist/cjs/xlsx/xform/strings/text-xform.js +2 -2
- package/dist/cjs/xlsx/xform/style/alignment-xform.js +8 -8
- package/dist/cjs/xlsx/xform/style/border-xform.js +8 -8
- package/dist/cjs/xlsx/xform/style/color-xform.js +2 -2
- package/dist/cjs/xlsx/xform/style/dxf-xform.js +14 -14
- package/dist/cjs/xlsx/xform/style/fill-xform.js +9 -9
- package/dist/cjs/xlsx/xform/style/font-xform.js +22 -22
- package/dist/cjs/xlsx/xform/style/numfmt-xform.js +5 -5
- package/dist/cjs/xlsx/xform/style/protection-xform.js +2 -2
- package/dist/cjs/xlsx/xform/style/style-xform.js +6 -6
- package/dist/cjs/xlsx/xform/style/styles-xform.js +39 -39
- package/dist/cjs/xlsx/xform/style/underline-xform.js +2 -2
- package/dist/cjs/xlsx/xform/table/auto-filter-xform.js +4 -4
- package/dist/cjs/xlsx/xform/table/custom-filter-xform.js +2 -2
- package/dist/cjs/xlsx/xform/table/filter-column-xform.js +9 -9
- package/dist/cjs/xlsx/xform/table/filter-xform.js +2 -2
- package/dist/cjs/xlsx/xform/table/table-column-xform.js +2 -2
- package/dist/cjs/xlsx/xform/table/table-style-info-xform.js +2 -2
- package/dist/cjs/xlsx/xform/table/table-xform.js +12 -12
- package/dist/cjs/xlsx/xlsx.base.js +742 -0
- package/dist/cjs/xlsx/xlsx.browser.js +162 -0
- package/dist/cjs/xlsx/xlsx.js +118 -892
- package/dist/esm/csv/csv-core.js +694 -0
- package/dist/esm/csv/csv-stream.js +638 -0
- package/dist/esm/csv/csv.base.js +127 -0
- package/dist/esm/csv/csv.browser.js +65 -0
- package/dist/esm/csv/csv.js +181 -159
- package/dist/esm/doc/column.js +21 -0
- package/dist/esm/doc/workbook.base.js +207 -0
- package/dist/esm/doc/workbook.browser.js +59 -0
- package/dist/esm/doc/workbook.js +64 -175
- package/dist/esm/doc/worksheet.js +4 -0
- package/dist/esm/index.browser.js +33 -1
- package/dist/esm/index.js +23 -8
- package/dist/esm/local.js +0 -1
- package/dist/esm/stream/xlsx/workbook-writer.js +1 -1
- package/dist/esm/stream/xlsx/worksheet-writer.js +8 -1
- package/dist/esm/utils/browser-buffer.js +67 -0
- package/dist/esm/utils/datetime.js +493 -0
- package/dist/esm/utils/encryptor.browser.js +237 -0
- package/dist/esm/utils/parse-sax.js +1188 -12
- package/dist/esm/utils/stream-buf.browser.js +352 -0
- package/dist/esm/utils/unzip/zip-parser.js +11 -0
- package/dist/esm/utils/utils.base.js +142 -0
- package/dist/esm/utils/utils.browser.js +68 -0
- package/dist/esm/utils/utils.js +15 -123
- package/dist/esm/utils/zip/compress.base.js +83 -0
- package/dist/esm/utils/zip/compress.browser.js +121 -0
- package/dist/esm/utils/zip/compress.js +16 -164
- package/dist/esm/utils/zip/crc32.browser.js +82 -0
- package/dist/esm/utils/zip/deflate-fallback.js +570 -0
- package/dist/esm/utils/zip/streaming-zip.js +259 -0
- package/dist/esm/utils/zip-stream.browser.js +132 -0
- package/dist/esm/xlsx/xform/pivot-table/pivot-table-xform.js +2 -3
- package/dist/esm/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +2 -3
- package/dist/esm/xlsx/xform/sheet/col-breaks-xform.js +35 -0
- package/dist/esm/xlsx/xform/sheet/page-breaks-xform.js +13 -1
- package/dist/esm/xlsx/xform/sheet/row-breaks-xform.js +11 -13
- package/dist/esm/xlsx/xform/sheet/worksheet-xform.js +7 -2
- package/dist/esm/xlsx/xlsx.base.js +739 -0
- package/dist/esm/xlsx/xlsx.browser.js +159 -0
- package/dist/esm/xlsx/xlsx.js +114 -888
- package/dist/types/csv/csv-core.d.ts +207 -0
- package/dist/types/csv/csv-stream.d.ts +114 -0
- package/dist/types/csv/csv.base.d.ts +62 -0
- package/dist/types/csv/csv.browser.d.ts +33 -0
- package/dist/types/csv/csv.d.ts +97 -71
- package/dist/types/doc/anchor.d.ts +1 -1
- package/dist/types/doc/cell.d.ts +7 -7
- package/dist/types/doc/column.d.ts +9 -3
- package/dist/types/doc/defined-names.d.ts +4 -4
- package/dist/types/doc/image.d.ts +2 -2
- package/dist/types/doc/modelcontainer.d.ts +1 -1
- package/dist/types/doc/pivot-table.d.ts +1 -1
- package/dist/types/doc/range.d.ts +1 -1
- package/dist/types/doc/row.d.ts +3 -3
- package/dist/types/doc/table.d.ts +2 -2
- package/dist/types/doc/workbook.base.d.ts +111 -0
- package/dist/types/doc/workbook.browser.d.ts +38 -0
- package/dist/types/doc/workbook.d.ts +62 -92
- package/dist/types/doc/worksheet.d.ts +12 -10
- package/dist/types/index.browser.d.ts +19 -5
- package/dist/types/index.d.ts +24 -23
- package/dist/types/local.d.ts +0 -1
- package/dist/types/stream/xlsx/hyperlink-reader.d.ts +1 -1
- package/dist/types/stream/xlsx/workbook-reader.d.ts +4 -4
- package/dist/types/stream/xlsx/workbook-writer.d.ts +7 -7
- package/dist/types/stream/xlsx/worksheet-reader.d.ts +5 -5
- package/dist/types/stream/xlsx/worksheet-writer.d.ts +11 -9
- package/dist/types/types.d.ts +6 -0
- package/dist/types/utils/browser-buffer.d.ts +28 -0
- package/dist/types/utils/col-cache.d.ts +1 -1
- package/dist/types/utils/datetime.d.ts +56 -0
- package/dist/types/utils/encryptor.browser.d.ts +28 -0
- package/dist/types/utils/parse-sax.d.ts +108 -1
- package/dist/types/utils/sheet-utils.d.ts +3 -3
- package/dist/types/utils/stream-buf.browser.d.ts +41 -0
- package/dist/types/utils/unzip/extract.d.ts +6 -6
- package/dist/types/utils/unzip/index.d.ts +8 -8
- package/dist/types/utils/unzip/parse.d.ts +3 -3
- package/dist/types/utils/unzip/zip-parser.d.ts +5 -0
- package/dist/types/utils/utils.base.d.ts +29 -0
- package/dist/types/utils/utils.browser.d.ts +29 -0
- package/dist/types/utils/utils.d.ts +6 -25
- package/dist/types/utils/zip/compress.base.d.ts +45 -0
- package/dist/types/utils/zip/compress.browser.d.ts +63 -0
- package/dist/types/utils/zip/compress.d.ts +13 -45
- package/dist/types/utils/zip/crc32.browser.d.ts +52 -0
- package/dist/types/utils/zip/deflate-fallback.d.ts +39 -0
- package/dist/types/utils/zip/index.d.ts +5 -5
- package/dist/types/utils/zip/streaming-zip.d.ts +96 -0
- package/dist/types/utils/zip/zip-builder.d.ts +1 -1
- package/dist/types/utils/zip-stream.browser.d.ts +39 -0
- package/dist/types/xlsx/xform/base-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/book/defined-name-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/book/sheet-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/book/workbook-calc-properties-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/book/workbook-pivot-cache-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/book/workbook-properties-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/book/workbook-view-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/book/workbook-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/comment/comment-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/comment/comments-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/comment/style/vml-position-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/comment/style/vml-protection-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/comment/vml-anchor-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/comment/vml-client-data-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/comment/vml-notes-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/comment/vml-shape-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/comment/vml-textbox-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/composite-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/core/app-heading-pairs-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/core/app-titles-of-parts-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/core/app-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/core/content-types-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/core/core-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/core/relationship-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/core/relationships-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/drawing/base-cell-anchor-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/drawing/blip-fill-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/drawing/blip-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/drawing/c-nv-pic-pr-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/drawing/c-nv-pr-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/drawing/cell-position-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/drawing/drawing-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/drawing/ext-lst-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/drawing/ext-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/drawing/hlink-click-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/drawing/nv-pic-pr-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/drawing/one-cell-anchor-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/drawing/pic-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/drawing/two-cell-anchor-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/list-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/pivot-table/cache-field-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/pivot-table/pivot-cache-definition-xform.d.ts +3 -3
- package/dist/types/xlsx/xform/pivot-table/pivot-cache-records-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/pivot-table/pivot-table-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/auto-filter-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/cell-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/cf/cf-rule-xform.d.ts +6 -6
- package/dist/types/xlsx/xform/sheet/cf/cfvo-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/cf/color-scale-xform.d.ts +3 -3
- package/dist/types/xlsx/xform/sheet/cf/conditional-formatting-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/cf/conditional-formattings-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/sheet/cf/databar-xform.d.ts +3 -3
- package/dist/types/xlsx/xform/sheet/cf/ext-lst-ref-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/cf/formula-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/cf/icon-set-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.d.ts +3 -3
- package/dist/types/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.d.ts +3 -3
- package/dist/types/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/sheet/cf-ext/databar-ext-xform.d.ts +3 -3
- package/dist/types/xlsx/xform/sheet/cf-ext/f-ext-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.d.ts +3 -3
- package/dist/types/xlsx/xform/sheet/cf-ext/sqref-ext-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/col-breaks-xform.d.ts +16 -0
- package/dist/types/xlsx/xform/sheet/col-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/data-validations-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/dimension-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/drawing-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/ext-lst-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/header-footer-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/hyperlink-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/merge-cell-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/outline-properties-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/page-breaks-xform.d.ts +5 -1
- package/dist/types/xlsx/xform/sheet/page-margins-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/page-setup-properties-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/page-setup-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/picture-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/print-options-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/row-breaks-xform.d.ts +5 -1
- package/dist/types/xlsx/xform/sheet/row-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/sheet-format-properties-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/sheet-properties-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/sheet-protection-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/sheet-view-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/table-part-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/worksheet-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/simple/boolean-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/simple/date-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/simple/float-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/simple/integer-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/simple/string-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/static-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/strings/phonetic-text-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/strings/rich-text-xform.d.ts +3 -3
- package/dist/types/xlsx/xform/strings/shared-string-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/strings/shared-strings-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/strings/text-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/style/alignment-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/style/border-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/style/color-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/style/dxf-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/style/fill-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/style/font-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/style/numfmt-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/style/protection-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/style/style-xform.d.ts +3 -3
- package/dist/types/xlsx/xform/style/styles-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/style/underline-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/table/auto-filter-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/table/custom-filter-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/table/filter-column-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/table/filter-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/table/table-column-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/table/table-style-info-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/table/table-xform.d.ts +1 -1
- package/dist/types/xlsx/xlsx.base.d.ts +134 -0
- package/dist/types/xlsx/xlsx.browser.d.ts +31 -0
- package/dist/types/xlsx/xlsx.d.ts +20 -80
- package/package.json +16 -39
|
@@ -27,6 +27,7 @@ import { PictureXform } from "../../xlsx/xform/sheet/picture-xform.js";
|
|
|
27
27
|
import { ConditionalFormattingsXform } from "../../xlsx/xform/sheet/cf/conditional-formattings-xform.js";
|
|
28
28
|
import { HeaderFooterXform } from "../../xlsx/xform/sheet/header-footer-xform.js";
|
|
29
29
|
import { RowBreaksXform } from "../../xlsx/xform/sheet/row-breaks-xform.js";
|
|
30
|
+
import { ColBreaksXform } from "../../xlsx/xform/sheet/col-breaks-xform.js";
|
|
30
31
|
// since prepare and render are functional, we can use singletons
|
|
31
32
|
const xform = {
|
|
32
33
|
dataValidations: new DataValidationsXform(),
|
|
@@ -51,7 +52,8 @@ const xform = {
|
|
|
51
52
|
picture: new PictureXform(),
|
|
52
53
|
conditionalFormattings: new ConditionalFormattingsXform(),
|
|
53
54
|
headerFooter: new HeaderFooterXform(),
|
|
54
|
-
rowBreaks: new RowBreaksXform()
|
|
55
|
+
rowBreaks: new RowBreaksXform(),
|
|
56
|
+
colBreaks: new ColBreaksXform()
|
|
55
57
|
};
|
|
56
58
|
class WorksheetWriter {
|
|
57
59
|
constructor(options) {
|
|
@@ -89,6 +91,7 @@ class WorksheetWriter {
|
|
|
89
91
|
this.conditionalFormatting = [];
|
|
90
92
|
// keep a record of all row and column pageBreaks
|
|
91
93
|
this.rowBreaks = [];
|
|
94
|
+
this.colBreaks = [];
|
|
92
95
|
// for default row height, outline levels, etc
|
|
93
96
|
this.properties = Object.assign({}, {
|
|
94
97
|
defaultRowHeight: 15,
|
|
@@ -193,6 +196,7 @@ class WorksheetWriter {
|
|
|
193
196
|
this._writeBackground();
|
|
194
197
|
this._writeHeaderFooter();
|
|
195
198
|
this._writeRowBreaks();
|
|
199
|
+
this._writeColBreaks();
|
|
196
200
|
// Legacy Data tag for comments
|
|
197
201
|
this._writeLegacyData();
|
|
198
202
|
this._writeCloseWorksheet();
|
|
@@ -543,6 +547,9 @@ class WorksheetWriter {
|
|
|
543
547
|
_writeRowBreaks() {
|
|
544
548
|
this.stream.write(xform.rowBreaks.toXml(this.rowBreaks));
|
|
545
549
|
}
|
|
550
|
+
_writeColBreaks() {
|
|
551
|
+
this.stream.write(xform.colBreaks.toXml(this.colBreaks));
|
|
552
|
+
}
|
|
546
553
|
_writeDataValidations() {
|
|
547
554
|
this.stream.write(xform.dataValidations.toXml(this.dataValidations.model));
|
|
548
555
|
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-compatible Buffer utilities
|
|
3
|
+
* Provides base64 encoding/decoding and a Buffer-like wrapper for Uint8Array
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Convert Uint8Array to base64 string
|
|
7
|
+
*/
|
|
8
|
+
export function uint8ArrayToBase64(bytes) {
|
|
9
|
+
let binary = "";
|
|
10
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
11
|
+
binary += String.fromCharCode(bytes[i]);
|
|
12
|
+
}
|
|
13
|
+
return btoa(binary);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Convert base64 string to Uint8Array
|
|
17
|
+
*/
|
|
18
|
+
export function base64ToUint8Array(base64) {
|
|
19
|
+
const binaryString = atob(base64);
|
|
20
|
+
const bytes = new Uint8Array(binaryString.length);
|
|
21
|
+
for (let i = 0; i < binaryString.length; i++) {
|
|
22
|
+
bytes[i] = binaryString.charCodeAt(i);
|
|
23
|
+
}
|
|
24
|
+
return bytes;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Buffer-like wrapper for Uint8Array with toString("base64") support
|
|
28
|
+
* This provides Node.js Buffer-like API for browser environments
|
|
29
|
+
*/
|
|
30
|
+
export class BrowserBuffer extends Uint8Array {
|
|
31
|
+
toString(encoding) {
|
|
32
|
+
if (encoding === "base64") {
|
|
33
|
+
return uint8ArrayToBase64(this);
|
|
34
|
+
}
|
|
35
|
+
return new TextDecoder().decode(this);
|
|
36
|
+
}
|
|
37
|
+
static from(data) {
|
|
38
|
+
const buffer = new BrowserBuffer(data.length);
|
|
39
|
+
buffer.set(data);
|
|
40
|
+
return buffer;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Convert string to UTF-16LE Uint8Array (used for Excel password hashing)
|
|
45
|
+
*/
|
|
46
|
+
export function stringToUtf16Le(str) {
|
|
47
|
+
const bytes = new Uint8Array(str.length * 2);
|
|
48
|
+
for (let i = 0; i < str.length; i++) {
|
|
49
|
+
const code = str.charCodeAt(i);
|
|
50
|
+
bytes[i * 2] = code & 0xff;
|
|
51
|
+
bytes[i * 2 + 1] = (code >> 8) & 0xff;
|
|
52
|
+
}
|
|
53
|
+
return bytes;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Concatenate multiple Uint8Arrays into one
|
|
57
|
+
*/
|
|
58
|
+
export function concatUint8Arrays(...arrays) {
|
|
59
|
+
const totalLength = arrays.reduce((acc, arr) => acc + arr.length, 0);
|
|
60
|
+
const result = new Uint8Array(totalLength);
|
|
61
|
+
let offset = 0;
|
|
62
|
+
for (const arr of arrays) {
|
|
63
|
+
result.set(arr, offset);
|
|
64
|
+
offset += arr.length;
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-performance native date parsing and formatting utilities
|
|
3
|
+
*
|
|
4
|
+
* Zero external dependencies. Optimized for CSV batch processing.
|
|
5
|
+
* Uses character code operations and lookup tables for maximum speed.
|
|
6
|
+
*/
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// Constants - Pre-computed lookup tables for zero-allocation operations
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Padding lookup (0-59 covers hours, minutes, seconds, and months/days)
|
|
11
|
+
const PAD2 = Array.from({ length: 60 }, (_, i) => (i < 10 ? `0${i}` : `${i}`));
|
|
12
|
+
// Character codes for fast comparison
|
|
13
|
+
const C_0 = 48;
|
|
14
|
+
const C_DASH = 45;
|
|
15
|
+
const C_SLASH = 47;
|
|
16
|
+
const C_COLON = 58;
|
|
17
|
+
const C_T = 84;
|
|
18
|
+
const C_SPACE = 32;
|
|
19
|
+
const C_Z = 90;
|
|
20
|
+
const C_PLUS = 43;
|
|
21
|
+
const C_DOT = 46;
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// Low-level utilities (inlined for JIT optimization)
|
|
24
|
+
// ============================================================================
|
|
25
|
+
// Inline digit extraction - avoid function call overhead
|
|
26
|
+
// Using bitwise OR for integer coercion (faster than Math.floor)
|
|
27
|
+
const digit2 = (s, i) => ((s.charCodeAt(i) - C_0) * 10 + s.charCodeAt(i + 1) - C_0) | 0;
|
|
28
|
+
const digit4 = (s, i) => ((s.charCodeAt(i) - C_0) * 1000 +
|
|
29
|
+
(s.charCodeAt(i + 1) - C_0) * 100 +
|
|
30
|
+
(s.charCodeAt(i + 2) - C_0) * 10 +
|
|
31
|
+
s.charCodeAt(i + 3) -
|
|
32
|
+
C_0) |
|
|
33
|
+
0;
|
|
34
|
+
// Days in month lookup (index 0 unused, 1-12 for Jan-Dec)
|
|
35
|
+
// Using 31 for Feb; actual validation done by Date constructor
|
|
36
|
+
const DAYS_IN_MONTH = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
|
|
37
|
+
function validateDate(y, m, d) {
|
|
38
|
+
// Fast bounds check using lookup table
|
|
39
|
+
if (m < 1 || m > 12 || d < 1 || d > DAYS_IN_MONTH[m]) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
const date = new Date(y, m - 1, d);
|
|
43
|
+
// Check for overflow (e.g., Feb 30 -> Mar 2)
|
|
44
|
+
return date.getMonth() === m - 1 ? date : null;
|
|
45
|
+
}
|
|
46
|
+
function validateDateTime(y, m, d, h, min, s) {
|
|
47
|
+
if (m < 1 || m > 12 || d < 1 || d > DAYS_IN_MONTH[m]) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
if (h > 23 || min > 59 || s > 59) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
return new Date(y, m - 1, d, h, min, s);
|
|
54
|
+
}
|
|
55
|
+
// ============================================================================
|
|
56
|
+
// Specialized parsers (length-based dispatch for speed)
|
|
57
|
+
// ============================================================================
|
|
58
|
+
// YYYY-MM-DD (10 chars)
|
|
59
|
+
function parseISO(s) {
|
|
60
|
+
if (s.charCodeAt(4) !== C_DASH || s.charCodeAt(7) !== C_DASH) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
return validateDate(digit4(s, 0), digit2(s, 5), digit2(s, 8));
|
|
64
|
+
}
|
|
65
|
+
// YYYY-MM-DDTHH:mm:ss (19 chars)
|
|
66
|
+
function parseISOT(s) {
|
|
67
|
+
if (s.charCodeAt(4) !== C_DASH ||
|
|
68
|
+
s.charCodeAt(7) !== C_DASH ||
|
|
69
|
+
s.charCodeAt(10) !== C_T ||
|
|
70
|
+
s.charCodeAt(13) !== C_COLON ||
|
|
71
|
+
s.charCodeAt(16) !== C_COLON) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
return validateDateTime(digit4(s, 0), digit2(s, 5), digit2(s, 8), digit2(s, 11), digit2(s, 14), digit2(s, 17));
|
|
75
|
+
}
|
|
76
|
+
// YYYY-MM-DD HH:mm:ss (19 chars, space separator)
|
|
77
|
+
function parseISOSpace(s) {
|
|
78
|
+
if (s.charCodeAt(4) !== C_DASH ||
|
|
79
|
+
s.charCodeAt(7) !== C_DASH ||
|
|
80
|
+
s.charCodeAt(10) !== C_SPACE ||
|
|
81
|
+
s.charCodeAt(13) !== C_COLON ||
|
|
82
|
+
s.charCodeAt(16) !== C_COLON) {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
return validateDateTime(digit4(s, 0), digit2(s, 5), digit2(s, 8), digit2(s, 11), digit2(s, 14), digit2(s, 17));
|
|
86
|
+
}
|
|
87
|
+
// YYYY-MM-DDTHH:mm:ssZ (20 chars)
|
|
88
|
+
function parseISOZ(s) {
|
|
89
|
+
if (s.charCodeAt(19) !== C_Z) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
const d = new Date(s);
|
|
93
|
+
return isNaN(d.getTime()) ? null : d;
|
|
94
|
+
}
|
|
95
|
+
// YYYY-MM-DDTHH:mm:ss.SSSZ (24 chars)
|
|
96
|
+
function parseISOMsZ(s) {
|
|
97
|
+
if (s.charCodeAt(19) !== C_DOT || s.charCodeAt(23) !== C_Z) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
const d = new Date(s);
|
|
101
|
+
return isNaN(d.getTime()) ? null : d;
|
|
102
|
+
}
|
|
103
|
+
// YYYY-MM-DDTHH:mm:ss+HH:mm (25 chars)
|
|
104
|
+
function parseISOOffset(s) {
|
|
105
|
+
const c = s.charCodeAt(19);
|
|
106
|
+
if (c !== C_PLUS && c !== C_DASH) {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
const d = new Date(s);
|
|
110
|
+
return isNaN(d.getTime()) ? null : d;
|
|
111
|
+
}
|
|
112
|
+
// YYYY-MM-DDTHH:mm:ss.SSS+HH:mm (29 chars)
|
|
113
|
+
function parseISOMsOffset(s) {
|
|
114
|
+
if (s.charCodeAt(19) !== C_DOT) {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
const c = s.charCodeAt(23);
|
|
118
|
+
if (c !== C_PLUS && c !== C_DASH) {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
const d = new Date(s);
|
|
122
|
+
return isNaN(d.getTime()) ? null : d;
|
|
123
|
+
}
|
|
124
|
+
// MM-DD-YYYY or MM/DD/YYYY (10 chars)
|
|
125
|
+
function parseUS(s) {
|
|
126
|
+
const sep = s.charCodeAt(2);
|
|
127
|
+
if ((sep !== C_DASH && sep !== C_SLASH) || s.charCodeAt(5) !== sep) {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
return validateDate(digit4(s, 6), digit2(s, 0), digit2(s, 3));
|
|
131
|
+
}
|
|
132
|
+
// DD-MM-YYYY or DD/MM/YYYY (10 chars)
|
|
133
|
+
function parseEU(s) {
|
|
134
|
+
const sep = s.charCodeAt(2);
|
|
135
|
+
if ((sep !== C_DASH && sep !== C_SLASH) || s.charCodeAt(5) !== sep) {
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
return validateDate(digit4(s, 6), digit2(s, 3), digit2(s, 0));
|
|
139
|
+
}
|
|
140
|
+
// MM-DD-YYYY HH:mm:ss or MM/DD/YYYY HH:mm:ss (19 chars)
|
|
141
|
+
function parseUSTime(s) {
|
|
142
|
+
const sep = s.charCodeAt(2);
|
|
143
|
+
if ((sep !== C_DASH && sep !== C_SLASH) || s.charCodeAt(5) !== sep) {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
if (s.charCodeAt(10) !== C_SPACE ||
|
|
147
|
+
s.charCodeAt(13) !== C_COLON ||
|
|
148
|
+
s.charCodeAt(16) !== C_COLON) {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
return validateDateTime(digit4(s, 6), digit2(s, 0), digit2(s, 3), digit2(s, 11), digit2(s, 14), digit2(s, 17));
|
|
152
|
+
}
|
|
153
|
+
// DD-MM-YYYY HH:mm:ss or DD/MM/YYYY HH:mm:ss (19 chars)
|
|
154
|
+
function parseEUTime(s) {
|
|
155
|
+
const sep = s.charCodeAt(2);
|
|
156
|
+
if ((sep !== C_DASH && sep !== C_SLASH) || s.charCodeAt(5) !== sep) {
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
if (s.charCodeAt(10) !== C_SPACE ||
|
|
160
|
+
s.charCodeAt(13) !== C_COLON ||
|
|
161
|
+
s.charCodeAt(16) !== C_COLON) {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
return validateDateTime(digit4(s, 6), digit2(s, 3), digit2(s, 0), digit2(s, 11), digit2(s, 14), digit2(s, 17));
|
|
165
|
+
}
|
|
166
|
+
const PARSERS = {
|
|
167
|
+
"YYYY-MM-DD": parseISO,
|
|
168
|
+
"YYYY-MM-DD[T]HH:mm:ss": parseISOT,
|
|
169
|
+
"YYYY-MM-DD HH:mm:ss": parseISOSpace,
|
|
170
|
+
"YYYY-MM-DD[T]HH:mm:ssZ": s => s.length === 20 ? parseISOZ(s) : s.length === 25 ? parseISOOffset(s) : null,
|
|
171
|
+
"YYYY-MM-DD[T]HH:mm:ss.SSSZ": s => s.length === 24 ? parseISOMsZ(s) : s.length === 29 ? parseISOMsOffset(s) : null,
|
|
172
|
+
"MM-DD-YYYY": parseUS,
|
|
173
|
+
"MM-DD-YYYY HH:mm:ss": parseUSTime,
|
|
174
|
+
"MM/DD/YYYY HH:mm:ss": parseUSTime,
|
|
175
|
+
"DD-MM-YYYY": parseEU,
|
|
176
|
+
"DD-MM-YYYY HH:mm:ss": parseEUTime,
|
|
177
|
+
"DD/MM/YYYY HH:mm:ss": parseEUTime
|
|
178
|
+
};
|
|
179
|
+
// Length-based auto-detection (ISO formats only, US/EU excluded due to ambiguity)
|
|
180
|
+
const AUTO_DETECT = [
|
|
181
|
+
[10, [parseISO]],
|
|
182
|
+
[19, [parseISOT, parseISOSpace]],
|
|
183
|
+
[20, [parseISOZ]],
|
|
184
|
+
[24, [parseISOMsZ]],
|
|
185
|
+
[25, [parseISOOffset]],
|
|
186
|
+
[29, [parseISOMsOffset]]
|
|
187
|
+
];
|
|
188
|
+
// ============================================================================
|
|
189
|
+
// High-performance batch processors (class-based for state encapsulation)
|
|
190
|
+
// ============================================================================
|
|
191
|
+
/**
|
|
192
|
+
* Optimized date parser for batch processing
|
|
193
|
+
*
|
|
194
|
+
* @example
|
|
195
|
+
* const parser = DateParser.create(["YYYY-MM-DD"]);
|
|
196
|
+
* const dates = parser.parseAll(csvStrings);
|
|
197
|
+
*/
|
|
198
|
+
export class DateParser {
|
|
199
|
+
constructor(fns) {
|
|
200
|
+
/** Parse single value */
|
|
201
|
+
this.parse = (value) => {
|
|
202
|
+
if (!value) {
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
const s = value.trim();
|
|
206
|
+
if (!s) {
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
// Fast path for single parser
|
|
210
|
+
if (this.single) {
|
|
211
|
+
return this.fn0(s);
|
|
212
|
+
}
|
|
213
|
+
// Multi-parser path
|
|
214
|
+
for (let i = 0, len = this.fns.length; i < len; i++) {
|
|
215
|
+
const r = this.fns[i](s);
|
|
216
|
+
if (r) {
|
|
217
|
+
return r;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return null;
|
|
221
|
+
};
|
|
222
|
+
this.fns = fns;
|
|
223
|
+
this.single = fns.length === 1;
|
|
224
|
+
this.fn0 = fns[0];
|
|
225
|
+
}
|
|
226
|
+
/** Create parser for specific formats */
|
|
227
|
+
static create(formats) {
|
|
228
|
+
return new DateParser(formats.map(f => PARSERS[f]).filter(Boolean));
|
|
229
|
+
}
|
|
230
|
+
/** Create parser for auto-detecting ISO formats */
|
|
231
|
+
static iso() {
|
|
232
|
+
const fns = [];
|
|
233
|
+
for (const [, parsers] of AUTO_DETECT) {
|
|
234
|
+
fns.push(...parsers);
|
|
235
|
+
}
|
|
236
|
+
return new DateParser(fns);
|
|
237
|
+
}
|
|
238
|
+
/** Parse array of values */
|
|
239
|
+
parseAll(values) {
|
|
240
|
+
const len = values.length;
|
|
241
|
+
const out = new Array(len);
|
|
242
|
+
const parse = this.parse;
|
|
243
|
+
for (let i = 0; i < len; i++) {
|
|
244
|
+
out[i] = parse(values[i]);
|
|
245
|
+
}
|
|
246
|
+
return out;
|
|
247
|
+
}
|
|
248
|
+
/** Parse and filter valid dates */
|
|
249
|
+
parseValid(values) {
|
|
250
|
+
const out = [];
|
|
251
|
+
const parse = this.parse;
|
|
252
|
+
for (let i = 0, len = values.length; i < len; i++) {
|
|
253
|
+
const d = parse(values[i]);
|
|
254
|
+
if (d) {
|
|
255
|
+
out.push(d);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return out;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
function tzOffset(d) {
|
|
262
|
+
const off = -d.getTimezoneOffset();
|
|
263
|
+
const sign = off >= 0 ? "+" : "-";
|
|
264
|
+
const h = (Math.abs(off) / 60) | 0; // Bitwise OR faster than Math.floor
|
|
265
|
+
const m = Math.abs(off) % 60;
|
|
266
|
+
return `${sign}${PAD2[h]}:${PAD2[m]}`;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Optimized date formatter for batch processing
|
|
270
|
+
*
|
|
271
|
+
* @example
|
|
272
|
+
* const formatter = DateFormatter.create("YYYY-MM-DD", { utc: true });
|
|
273
|
+
* const strings = formatter.formatAll(dates);
|
|
274
|
+
*/
|
|
275
|
+
export class DateFormatter {
|
|
276
|
+
constructor(fn) {
|
|
277
|
+
/** Format single date */
|
|
278
|
+
this.format = (date) => this.fn(date);
|
|
279
|
+
this.fn = fn;
|
|
280
|
+
}
|
|
281
|
+
/** Create ISO formatter (fastest) */
|
|
282
|
+
static iso(utc = false) {
|
|
283
|
+
// Direct string building is faster than toISOString() + slice
|
|
284
|
+
return utc
|
|
285
|
+
? new DateFormatter(d => {
|
|
286
|
+
if (!(d instanceof Date)) {
|
|
287
|
+
return "";
|
|
288
|
+
}
|
|
289
|
+
const t = d.getTime();
|
|
290
|
+
if (t !== t) {
|
|
291
|
+
return "";
|
|
292
|
+
} // NaN check
|
|
293
|
+
const y = d.getUTCFullYear();
|
|
294
|
+
const M = d.getUTCMonth() + 1;
|
|
295
|
+
const D = d.getUTCDate();
|
|
296
|
+
const H = d.getUTCHours();
|
|
297
|
+
const m = d.getUTCMinutes();
|
|
298
|
+
const s = d.getUTCSeconds();
|
|
299
|
+
const ms = d.getUTCMilliseconds();
|
|
300
|
+
return `${y}-${PAD2[M]}-${PAD2[D]}T${PAD2[H]}:${PAD2[m]}:${PAD2[s]}.${ms < 10 ? "00" + ms : ms < 100 ? "0" + ms : ms}Z`;
|
|
301
|
+
})
|
|
302
|
+
: new DateFormatter(d => {
|
|
303
|
+
if (!(d instanceof Date)) {
|
|
304
|
+
return "";
|
|
305
|
+
}
|
|
306
|
+
const t = d.getTime();
|
|
307
|
+
if (t !== t) {
|
|
308
|
+
return "";
|
|
309
|
+
} // NaN check
|
|
310
|
+
const y = d.getFullYear();
|
|
311
|
+
const M = d.getMonth() + 1;
|
|
312
|
+
const D = d.getDate();
|
|
313
|
+
const H = d.getHours();
|
|
314
|
+
const m = d.getMinutes();
|
|
315
|
+
const s = d.getSeconds();
|
|
316
|
+
const ms = d.getMilliseconds();
|
|
317
|
+
return `${y}-${PAD2[M]}-${PAD2[D]}T${PAD2[H]}:${PAD2[m]}:${PAD2[s]}.${ms < 10 ? "00" + ms : ms < 100 ? "0" + ms : ms}${tzOffset(d)}`;
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
/** Create custom format formatter */
|
|
321
|
+
static create(format, options) {
|
|
322
|
+
const utc = options?.utc ?? false;
|
|
323
|
+
// Fast paths for common formats (no regex, direct string building)
|
|
324
|
+
if (format === "YYYY-MM-DD") {
|
|
325
|
+
return utc
|
|
326
|
+
? new DateFormatter(d => {
|
|
327
|
+
if (!(d instanceof Date)) {
|
|
328
|
+
return "";
|
|
329
|
+
}
|
|
330
|
+
const t = d.getTime();
|
|
331
|
+
if (t !== t) {
|
|
332
|
+
return "";
|
|
333
|
+
}
|
|
334
|
+
return `${d.getUTCFullYear()}-${PAD2[d.getUTCMonth() + 1]}-${PAD2[d.getUTCDate()]}`;
|
|
335
|
+
})
|
|
336
|
+
: new DateFormatter(d => {
|
|
337
|
+
if (!(d instanceof Date)) {
|
|
338
|
+
return "";
|
|
339
|
+
}
|
|
340
|
+
const t = d.getTime();
|
|
341
|
+
if (t !== t) {
|
|
342
|
+
return "";
|
|
343
|
+
}
|
|
344
|
+
return `${d.getFullYear()}-${PAD2[d.getMonth() + 1]}-${PAD2[d.getDate()]}`;
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
if (format === "YYYY-MM-DD HH:mm:ss") {
|
|
348
|
+
return utc
|
|
349
|
+
? new DateFormatter(d => {
|
|
350
|
+
if (!(d instanceof Date)) {
|
|
351
|
+
return "";
|
|
352
|
+
}
|
|
353
|
+
const t = d.getTime();
|
|
354
|
+
if (t !== t) {
|
|
355
|
+
return "";
|
|
356
|
+
}
|
|
357
|
+
return `${d.getUTCFullYear()}-${PAD2[d.getUTCMonth() + 1]}-${PAD2[d.getUTCDate()]} ${PAD2[d.getUTCHours()]}:${PAD2[d.getUTCMinutes()]}:${PAD2[d.getUTCSeconds()]}`;
|
|
358
|
+
})
|
|
359
|
+
: new DateFormatter(d => {
|
|
360
|
+
if (!(d instanceof Date)) {
|
|
361
|
+
return "";
|
|
362
|
+
}
|
|
363
|
+
const t = d.getTime();
|
|
364
|
+
if (t !== t) {
|
|
365
|
+
return "";
|
|
366
|
+
}
|
|
367
|
+
return `${d.getFullYear()}-${PAD2[d.getMonth() + 1]}-${PAD2[d.getDate()]} ${PAD2[d.getHours()]}:${PAD2[d.getMinutes()]}:${PAD2[d.getSeconds()]}`;
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
if (format === "MM-DD-YYYY" || format === "MM/DD/YYYY") {
|
|
371
|
+
const sep = format.charAt(2);
|
|
372
|
+
return utc
|
|
373
|
+
? new DateFormatter(d => {
|
|
374
|
+
if (!(d instanceof Date)) {
|
|
375
|
+
return "";
|
|
376
|
+
}
|
|
377
|
+
const t = d.getTime();
|
|
378
|
+
if (t !== t) {
|
|
379
|
+
return "";
|
|
380
|
+
}
|
|
381
|
+
return `${PAD2[d.getUTCMonth() + 1]}${sep}${PAD2[d.getUTCDate()]}${sep}${d.getUTCFullYear()}`;
|
|
382
|
+
})
|
|
383
|
+
: new DateFormatter(d => {
|
|
384
|
+
if (!(d instanceof Date)) {
|
|
385
|
+
return "";
|
|
386
|
+
}
|
|
387
|
+
const t = d.getTime();
|
|
388
|
+
if (t !== t) {
|
|
389
|
+
return "";
|
|
390
|
+
}
|
|
391
|
+
return `${PAD2[d.getMonth() + 1]}${sep}${PAD2[d.getDate()]}${sep}${d.getFullYear()}`;
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
if (format === "DD-MM-YYYY" || format === "DD/MM/YYYY") {
|
|
395
|
+
const sep = format.charAt(2);
|
|
396
|
+
return utc
|
|
397
|
+
? new DateFormatter(d => {
|
|
398
|
+
if (!(d instanceof Date)) {
|
|
399
|
+
return "";
|
|
400
|
+
}
|
|
401
|
+
const t = d.getTime();
|
|
402
|
+
if (t !== t) {
|
|
403
|
+
return "";
|
|
404
|
+
}
|
|
405
|
+
return `${PAD2[d.getUTCDate()]}${sep}${PAD2[d.getUTCMonth() + 1]}${sep}${d.getUTCFullYear()}`;
|
|
406
|
+
})
|
|
407
|
+
: new DateFormatter(d => {
|
|
408
|
+
if (!(d instanceof Date)) {
|
|
409
|
+
return "";
|
|
410
|
+
}
|
|
411
|
+
const t = d.getTime();
|
|
412
|
+
if (t !== t) {
|
|
413
|
+
return "";
|
|
414
|
+
}
|
|
415
|
+
return `${PAD2[d.getDate()]}${sep}${PAD2[d.getMonth() + 1]}${sep}${d.getFullYear()}`;
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
// Generic path with pre-compiled template
|
|
419
|
+
return DateFormatter.createGeneric(format, utc);
|
|
420
|
+
}
|
|
421
|
+
/** Generic formatter for arbitrary formats */
|
|
422
|
+
static createGeneric(format, utc) {
|
|
423
|
+
// Pre-process escaped sections
|
|
424
|
+
const esc = [];
|
|
425
|
+
const tpl = format.replace(/\[([^\]]*)\]/g, (_, c) => {
|
|
426
|
+
esc.push(c);
|
|
427
|
+
return `\x00${esc.length - 1}\x00`;
|
|
428
|
+
});
|
|
429
|
+
// Detect used tokens for conditional computation
|
|
430
|
+
const hasY = tpl.includes("YYYY");
|
|
431
|
+
const hasMs = tpl.includes("SSS");
|
|
432
|
+
const hasM = tpl.includes("MM");
|
|
433
|
+
const hasD = tpl.includes("DD");
|
|
434
|
+
const hasH = tpl.includes("HH");
|
|
435
|
+
const hasMin = tpl.includes("mm");
|
|
436
|
+
const hasS = tpl.includes("ss");
|
|
437
|
+
const hasZ = tpl.includes("Z");
|
|
438
|
+
return new DateFormatter(d => {
|
|
439
|
+
if (!(d instanceof Date)) {
|
|
440
|
+
return "";
|
|
441
|
+
}
|
|
442
|
+
const t = d.getTime();
|
|
443
|
+
if (t !== t) {
|
|
444
|
+
return "";
|
|
445
|
+
}
|
|
446
|
+
let out = tpl;
|
|
447
|
+
if (hasY) {
|
|
448
|
+
out = out.replace(/YYYY/g, String(utc ? d.getUTCFullYear() : d.getFullYear()));
|
|
449
|
+
}
|
|
450
|
+
if (hasMs) {
|
|
451
|
+
const ms = utc ? d.getUTCMilliseconds() : d.getMilliseconds();
|
|
452
|
+
out = out.replace(/SSS/g, ms < 10 ? `00${ms}` : ms < 100 ? `0${ms}` : String(ms));
|
|
453
|
+
}
|
|
454
|
+
if (hasM) {
|
|
455
|
+
out = out.replace(/MM/g, PAD2[utc ? d.getUTCMonth() + 1 : d.getMonth() + 1]);
|
|
456
|
+
}
|
|
457
|
+
if (hasD) {
|
|
458
|
+
out = out.replace(/DD/g, PAD2[utc ? d.getUTCDate() : d.getDate()]);
|
|
459
|
+
}
|
|
460
|
+
if (hasH) {
|
|
461
|
+
out = out.replace(/HH/g, PAD2[utc ? d.getUTCHours() : d.getHours()]);
|
|
462
|
+
}
|
|
463
|
+
if (hasMin) {
|
|
464
|
+
out = out.replace(/mm/g, PAD2[utc ? d.getUTCMinutes() : d.getMinutes()]);
|
|
465
|
+
}
|
|
466
|
+
if (hasS) {
|
|
467
|
+
out = out.replace(/ss/g, PAD2[utc ? d.getUTCSeconds() : d.getSeconds()]);
|
|
468
|
+
}
|
|
469
|
+
if (hasZ) {
|
|
470
|
+
out = out.replace(/Z/g, utc ? "Z" : tzOffset(d));
|
|
471
|
+
}
|
|
472
|
+
if (esc.length) {
|
|
473
|
+
// oxlint-disable-next-line no-control-regex
|
|
474
|
+
out = out.replace(/\x00(\d+)\x00/g, (_, i) => esc[+i]);
|
|
475
|
+
}
|
|
476
|
+
return out;
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
/** Format array of dates */
|
|
480
|
+
formatAll(dates) {
|
|
481
|
+
const len = dates.length;
|
|
482
|
+
const out = new Array(len);
|
|
483
|
+
const fn = this.fn;
|
|
484
|
+
for (let i = 0; i < len; i++) {
|
|
485
|
+
out[i] = fn(dates[i]);
|
|
486
|
+
}
|
|
487
|
+
return out;
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
/** Get supported format strings */
|
|
491
|
+
export function getSupportedFormats() {
|
|
492
|
+
return Object.keys(PARSERS);
|
|
493
|
+
}
|