@cj-tech-master/excelts 1.6.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +648 -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 +639 -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 +85 -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
|
@@ -0,0 +1,639 @@
|
|
|
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_9 = 57;
|
|
15
|
+
const C_DASH = 45;
|
|
16
|
+
const C_SLASH = 47;
|
|
17
|
+
const C_COLON = 58;
|
|
18
|
+
const C_T = 84;
|
|
19
|
+
const C_SPACE = 32;
|
|
20
|
+
const C_Z = 90;
|
|
21
|
+
const C_PLUS = 43;
|
|
22
|
+
const C_DOT = 46;
|
|
23
|
+
// ============================================================================
|
|
24
|
+
// Low-level utilities (inlined for JIT optimization)
|
|
25
|
+
// ============================================================================
|
|
26
|
+
// Inline digit extraction - avoid function call overhead
|
|
27
|
+
// Using bitwise OR for integer coercion (faster than Math.floor)
|
|
28
|
+
const digit2 = (s, i) => ((s.charCodeAt(i) - C_0) * 10 + s.charCodeAt(i + 1) - C_0) | 0;
|
|
29
|
+
const digit4 = (s, i) => ((s.charCodeAt(i) - C_0) * 1000 +
|
|
30
|
+
(s.charCodeAt(i + 1) - C_0) * 100 +
|
|
31
|
+
(s.charCodeAt(i + 2) - C_0) * 10 +
|
|
32
|
+
s.charCodeAt(i + 3) -
|
|
33
|
+
C_0) |
|
|
34
|
+
0;
|
|
35
|
+
// Days in month lookup (index 0 unused, 1-12 for Jan-Dec)
|
|
36
|
+
// Using 31 for Feb; actual validation done by Date constructor
|
|
37
|
+
const DAYS_IN_MONTH = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
|
|
38
|
+
function validateDate(y, m, d) {
|
|
39
|
+
// Fast bounds check using lookup table
|
|
40
|
+
if (m < 1 || m > 12 || d < 1 || d > DAYS_IN_MONTH[m]) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
const date = new Date(y, m - 1, d);
|
|
44
|
+
// Check for overflow (e.g., Feb 30 -> Mar 2)
|
|
45
|
+
return date.getMonth() === m - 1 ? date : null;
|
|
46
|
+
}
|
|
47
|
+
function validateDateTime(y, m, d, h, min, s) {
|
|
48
|
+
if (m < 1 || m > 12 || d < 1 || d > DAYS_IN_MONTH[m]) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
if (h > 23 || min > 59 || s > 59) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
return new Date(y, m - 1, d, h, min, s);
|
|
55
|
+
}
|
|
56
|
+
// ============================================================================
|
|
57
|
+
// Specialized parsers (length-based dispatch for speed)
|
|
58
|
+
// ============================================================================
|
|
59
|
+
// YYYY-MM-DD (10 chars)
|
|
60
|
+
function parseISO(s) {
|
|
61
|
+
if (s.charCodeAt(4) !== C_DASH || s.charCodeAt(7) !== C_DASH) {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
return validateDate(digit4(s, 0), digit2(s, 5), digit2(s, 8));
|
|
65
|
+
}
|
|
66
|
+
// YYYY-MM-DDTHH:mm:ss (19 chars)
|
|
67
|
+
function parseISOT(s) {
|
|
68
|
+
if (s.charCodeAt(4) !== C_DASH ||
|
|
69
|
+
s.charCodeAt(7) !== C_DASH ||
|
|
70
|
+
s.charCodeAt(10) !== C_T ||
|
|
71
|
+
s.charCodeAt(13) !== C_COLON ||
|
|
72
|
+
s.charCodeAt(16) !== C_COLON) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
return validateDateTime(digit4(s, 0), digit2(s, 5), digit2(s, 8), digit2(s, 11), digit2(s, 14), digit2(s, 17));
|
|
76
|
+
}
|
|
77
|
+
// YYYY-MM-DD HH:mm:ss (19 chars, space separator)
|
|
78
|
+
function parseISOSpace(s) {
|
|
79
|
+
if (s.charCodeAt(4) !== C_DASH ||
|
|
80
|
+
s.charCodeAt(7) !== C_DASH ||
|
|
81
|
+
s.charCodeAt(10) !== C_SPACE ||
|
|
82
|
+
s.charCodeAt(13) !== C_COLON ||
|
|
83
|
+
s.charCodeAt(16) !== C_COLON) {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
return validateDateTime(digit4(s, 0), digit2(s, 5), digit2(s, 8), digit2(s, 11), digit2(s, 14), digit2(s, 17));
|
|
87
|
+
}
|
|
88
|
+
// YYYY-MM-DDTHH:mm:ssZ (20 chars)
|
|
89
|
+
function parseISOZ(s) {
|
|
90
|
+
if (s.charCodeAt(19) !== C_Z) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
const d = new Date(s);
|
|
94
|
+
return isNaN(d.getTime()) ? null : d;
|
|
95
|
+
}
|
|
96
|
+
// YYYY-MM-DDTHH:mm:ss.SSSZ (24 chars)
|
|
97
|
+
function parseISOMsZ(s) {
|
|
98
|
+
if (s.charCodeAt(19) !== C_DOT || s.charCodeAt(23) !== C_Z) {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
const d = new Date(s);
|
|
102
|
+
return isNaN(d.getTime()) ? null : d;
|
|
103
|
+
}
|
|
104
|
+
// YYYY-MM-DDTHH:mm:ss+HH:mm (25 chars)
|
|
105
|
+
function parseISOOffset(s) {
|
|
106
|
+
const c = s.charCodeAt(19);
|
|
107
|
+
if (c !== C_PLUS && c !== C_DASH) {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
const d = new Date(s);
|
|
111
|
+
return isNaN(d.getTime()) ? null : d;
|
|
112
|
+
}
|
|
113
|
+
// YYYY-MM-DDTHH:mm:ss.SSS+HH:mm (29 chars)
|
|
114
|
+
function parseISOMsOffset(s) {
|
|
115
|
+
if (s.charCodeAt(19) !== C_DOT) {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
const c = s.charCodeAt(23);
|
|
119
|
+
if (c !== C_PLUS && c !== C_DASH) {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
const d = new Date(s);
|
|
123
|
+
return isNaN(d.getTime()) ? null : d;
|
|
124
|
+
}
|
|
125
|
+
// MM-DD-YYYY or MM/DD/YYYY (10 chars)
|
|
126
|
+
function parseUS(s) {
|
|
127
|
+
const sep = s.charCodeAt(2);
|
|
128
|
+
if ((sep !== C_DASH && sep !== C_SLASH) || s.charCodeAt(5) !== sep) {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
return validateDate(digit4(s, 6), digit2(s, 0), digit2(s, 3));
|
|
132
|
+
}
|
|
133
|
+
// DD-MM-YYYY or DD/MM/YYYY (10 chars)
|
|
134
|
+
function parseEU(s) {
|
|
135
|
+
const sep = s.charCodeAt(2);
|
|
136
|
+
if ((sep !== C_DASH && sep !== C_SLASH) || s.charCodeAt(5) !== sep) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
return validateDate(digit4(s, 6), digit2(s, 3), digit2(s, 0));
|
|
140
|
+
}
|
|
141
|
+
// MM-DD-YYYY HH:mm:ss or MM/DD/YYYY HH:mm:ss (19 chars)
|
|
142
|
+
function parseUSTime(s) {
|
|
143
|
+
const sep = s.charCodeAt(2);
|
|
144
|
+
if ((sep !== C_DASH && sep !== C_SLASH) || s.charCodeAt(5) !== sep) {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
if (s.charCodeAt(10) !== C_SPACE ||
|
|
148
|
+
s.charCodeAt(13) !== C_COLON ||
|
|
149
|
+
s.charCodeAt(16) !== C_COLON) {
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
return validateDateTime(digit4(s, 6), digit2(s, 0), digit2(s, 3), digit2(s, 11), digit2(s, 14), digit2(s, 17));
|
|
153
|
+
}
|
|
154
|
+
// DD-MM-YYYY HH:mm:ss or DD/MM/YYYY HH:mm:ss (19 chars)
|
|
155
|
+
function parseEUTime(s) {
|
|
156
|
+
const sep = s.charCodeAt(2);
|
|
157
|
+
if ((sep !== C_DASH && sep !== C_SLASH) || s.charCodeAt(5) !== sep) {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
if (s.charCodeAt(10) !== C_SPACE ||
|
|
161
|
+
s.charCodeAt(13) !== C_COLON ||
|
|
162
|
+
s.charCodeAt(16) !== C_COLON) {
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
return validateDateTime(digit4(s, 6), digit2(s, 3), digit2(s, 0), digit2(s, 11), digit2(s, 14), digit2(s, 17));
|
|
166
|
+
}
|
|
167
|
+
const PARSERS = {
|
|
168
|
+
"YYYY-MM-DD": parseISO,
|
|
169
|
+
"YYYY-MM-DD[T]HH:mm:ss": parseISOT,
|
|
170
|
+
"YYYY-MM-DD HH:mm:ss": parseISOSpace,
|
|
171
|
+
"YYYY-MM-DD[T]HH:mm:ssZ": s => s.length === 20 ? parseISOZ(s) : s.length === 25 ? parseISOOffset(s) : null,
|
|
172
|
+
"YYYY-MM-DD[T]HH:mm:ss.SSSZ": s => s.length === 24 ? parseISOMsZ(s) : s.length === 29 ? parseISOMsOffset(s) : null,
|
|
173
|
+
"MM-DD-YYYY": parseUS,
|
|
174
|
+
"MM-DD-YYYY HH:mm:ss": parseUSTime,
|
|
175
|
+
"MM/DD/YYYY HH:mm:ss": parseUSTime,
|
|
176
|
+
"DD-MM-YYYY": parseEU,
|
|
177
|
+
"DD-MM-YYYY HH:mm:ss": parseEUTime,
|
|
178
|
+
"DD/MM/YYYY HH:mm:ss": parseEUTime
|
|
179
|
+
};
|
|
180
|
+
// Length-based auto-detection (ISO formats only, US/EU excluded due to ambiguity)
|
|
181
|
+
const AUTO_DETECT = [
|
|
182
|
+
[10, [parseISO]],
|
|
183
|
+
[19, [parseISOT, parseISOSpace]],
|
|
184
|
+
[20, [parseISOZ]],
|
|
185
|
+
[24, [parseISOMsZ]],
|
|
186
|
+
[25, [parseISOOffset]],
|
|
187
|
+
[29, [parseISOMsOffset]]
|
|
188
|
+
];
|
|
189
|
+
// ============================================================================
|
|
190
|
+
// Public API
|
|
191
|
+
// ============================================================================
|
|
192
|
+
/**
|
|
193
|
+
* Quick pre-filter to reject non-date strings
|
|
194
|
+
*/
|
|
195
|
+
export function mightBeDate(s) {
|
|
196
|
+
const len = s.length;
|
|
197
|
+
if (len < 10 || len > 30) {
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
const c0 = s.charCodeAt(0);
|
|
201
|
+
const c1 = s.charCodeAt(1);
|
|
202
|
+
// Must start with digits
|
|
203
|
+
if (c0 < C_0 || c0 > C_9 || c1 < C_0 || c1 > C_9) {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
const c2 = s.charCodeAt(2);
|
|
207
|
+
// Either YYYY format (4 digits) or MM/DD format (separator at pos 2)
|
|
208
|
+
return (c2 >= C_0 && c2 <= C_9) || c2 === C_DASH || c2 === C_SLASH;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Parse a date string
|
|
212
|
+
*
|
|
213
|
+
* @param value - String to parse
|
|
214
|
+
* @param formats - Specific formats to try (optional, auto-detects ISO if omitted)
|
|
215
|
+
* @returns Date object or null
|
|
216
|
+
*
|
|
217
|
+
* @example
|
|
218
|
+
* parseDate("2024-12-26") // auto-detect ISO
|
|
219
|
+
* parseDate("12-26-2024", ["MM-DD-YYYY"]) // explicit US format
|
|
220
|
+
*/
|
|
221
|
+
export function parseDate(value, formats) {
|
|
222
|
+
if (!value || typeof value !== "string") {
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
const s = value.trim();
|
|
226
|
+
if (!s) {
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
// Explicit formats
|
|
230
|
+
if (formats?.length) {
|
|
231
|
+
for (const fmt of formats) {
|
|
232
|
+
const result = PARSERS[fmt]?.(s);
|
|
233
|
+
if (result) {
|
|
234
|
+
return result;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return null;
|
|
238
|
+
}
|
|
239
|
+
// Auto-detect by length
|
|
240
|
+
const len = s.length;
|
|
241
|
+
for (const [l, parsers] of AUTO_DETECT) {
|
|
242
|
+
if (len === l) {
|
|
243
|
+
for (const p of parsers) {
|
|
244
|
+
const result = p(s);
|
|
245
|
+
if (result) {
|
|
246
|
+
return result;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return null;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Format a Date to string
|
|
255
|
+
*
|
|
256
|
+
* @param date - Date to format
|
|
257
|
+
* @param format - Format template (optional, defaults to ISO)
|
|
258
|
+
* @param utc - Use UTC time (default: false)
|
|
259
|
+
* @returns Formatted string or empty string if invalid
|
|
260
|
+
*
|
|
261
|
+
* @example
|
|
262
|
+
* formatDate(date) // "2024-12-26T10:30:00.000+08:00"
|
|
263
|
+
* formatDate(date, "YYYY-MM-DD", true) // "2024-12-26"
|
|
264
|
+
*/
|
|
265
|
+
export function formatDate(date, format, utc = false) {
|
|
266
|
+
if (!(date instanceof Date)) {
|
|
267
|
+
return "";
|
|
268
|
+
}
|
|
269
|
+
const t = date.getTime();
|
|
270
|
+
if (t !== t) {
|
|
271
|
+
return "";
|
|
272
|
+
} // NaN check (faster than isNaN)
|
|
273
|
+
// Default ISO format - direct string building (faster than toISOString)
|
|
274
|
+
if (!format) {
|
|
275
|
+
if (utc) {
|
|
276
|
+
const y = date.getUTCFullYear();
|
|
277
|
+
const M = date.getUTCMonth() + 1;
|
|
278
|
+
const D = date.getUTCDate();
|
|
279
|
+
const H = date.getUTCHours();
|
|
280
|
+
const m = date.getUTCMinutes();
|
|
281
|
+
const s = date.getUTCSeconds();
|
|
282
|
+
const ms = date.getUTCMilliseconds();
|
|
283
|
+
return `${y}-${PAD2[M]}-${PAD2[D]}T${PAD2[H]}:${PAD2[m]}:${PAD2[s]}.${ms < 10 ? "00" + ms : ms < 100 ? "0" + ms : ms}Z`;
|
|
284
|
+
}
|
|
285
|
+
const y = date.getFullYear();
|
|
286
|
+
const M = date.getMonth() + 1;
|
|
287
|
+
const D = date.getDate();
|
|
288
|
+
const H = date.getHours();
|
|
289
|
+
const m = date.getMinutes();
|
|
290
|
+
const s = date.getSeconds();
|
|
291
|
+
const ms = date.getMilliseconds();
|
|
292
|
+
return `${y}-${PAD2[M]}-${PAD2[D]}T${PAD2[H]}:${PAD2[m]}:${PAD2[s]}.${ms < 10 ? "00" + ms : ms < 100 ? "0" + ms : ms}${tzOffset(date)}`;
|
|
293
|
+
}
|
|
294
|
+
// Fast paths for common formats
|
|
295
|
+
if (format === "YYYY-MM-DD") {
|
|
296
|
+
return utc
|
|
297
|
+
? `${date.getUTCFullYear()}-${PAD2[date.getUTCMonth() + 1]}-${PAD2[date.getUTCDate()]}`
|
|
298
|
+
: `${date.getFullYear()}-${PAD2[date.getMonth() + 1]}-${PAD2[date.getDate()]}`;
|
|
299
|
+
}
|
|
300
|
+
return renderFormat(date, format, utc);
|
|
301
|
+
}
|
|
302
|
+
function tzOffset(d) {
|
|
303
|
+
const off = -d.getTimezoneOffset();
|
|
304
|
+
const sign = off >= 0 ? "+" : "-";
|
|
305
|
+
const h = (Math.abs(off) / 60) | 0; // Bitwise OR faster than Math.floor
|
|
306
|
+
const m = Math.abs(off) % 60;
|
|
307
|
+
return `${sign}${PAD2[h]}:${PAD2[m]}`;
|
|
308
|
+
}
|
|
309
|
+
function renderFormat(d, fmt, utc) {
|
|
310
|
+
// Handle escaped sections [...]
|
|
311
|
+
const esc = [];
|
|
312
|
+
let out = fmt.replace(/\[([^\]]*)\]/g, (_, c) => {
|
|
313
|
+
esc.push(c);
|
|
314
|
+
return `\x00${esc.length - 1}\x00`;
|
|
315
|
+
});
|
|
316
|
+
// Get components once
|
|
317
|
+
const y = utc ? d.getUTCFullYear() : d.getFullYear();
|
|
318
|
+
const M = utc ? d.getUTCMonth() + 1 : d.getMonth() + 1;
|
|
319
|
+
const D = utc ? d.getUTCDate() : d.getDate();
|
|
320
|
+
const H = utc ? d.getUTCHours() : d.getHours();
|
|
321
|
+
const m = utc ? d.getUTCMinutes() : d.getMinutes();
|
|
322
|
+
const s = utc ? d.getUTCSeconds() : d.getSeconds();
|
|
323
|
+
const ms = utc ? d.getUTCMilliseconds() : d.getMilliseconds();
|
|
324
|
+
// Replace tokens
|
|
325
|
+
out = out
|
|
326
|
+
.replace(/YYYY/g, String(y))
|
|
327
|
+
.replace(/SSS/g, ms < 10 ? `00${ms}` : ms < 100 ? `0${ms}` : String(ms))
|
|
328
|
+
.replace(/MM/g, PAD2[M])
|
|
329
|
+
.replace(/DD/g, PAD2[D])
|
|
330
|
+
.replace(/HH/g, PAD2[H])
|
|
331
|
+
.replace(/mm/g, PAD2[m])
|
|
332
|
+
.replace(/ss/g, PAD2[s])
|
|
333
|
+
.replace(/Z/g, utc ? "Z" : tzOffset(d));
|
|
334
|
+
// Restore escaped
|
|
335
|
+
if (esc.length) {
|
|
336
|
+
// oxlint-disable-next-line no-control-regex
|
|
337
|
+
out = out.replace(/\x00(\d+)\x00/g, (_, i) => esc[+i]);
|
|
338
|
+
}
|
|
339
|
+
return out;
|
|
340
|
+
}
|
|
341
|
+
// ============================================================================
|
|
342
|
+
// High-performance batch processors (class-based for state encapsulation)
|
|
343
|
+
// ============================================================================
|
|
344
|
+
/**
|
|
345
|
+
* Optimized date parser for batch processing
|
|
346
|
+
*
|
|
347
|
+
* @example
|
|
348
|
+
* const parser = DateParser.create(["YYYY-MM-DD"]);
|
|
349
|
+
* const dates = parser.parseAll(csvStrings);
|
|
350
|
+
*/
|
|
351
|
+
export class DateParser {
|
|
352
|
+
constructor(fns) {
|
|
353
|
+
/** Parse single value */
|
|
354
|
+
this.parse = (value) => {
|
|
355
|
+
if (!value) {
|
|
356
|
+
return null;
|
|
357
|
+
}
|
|
358
|
+
const s = value.trim();
|
|
359
|
+
if (!s) {
|
|
360
|
+
return null;
|
|
361
|
+
}
|
|
362
|
+
// Fast path for single parser
|
|
363
|
+
if (this.single) {
|
|
364
|
+
return this.fn0(s);
|
|
365
|
+
}
|
|
366
|
+
// Multi-parser path
|
|
367
|
+
for (let i = 0, len = this.fns.length; i < len; i++) {
|
|
368
|
+
const r = this.fns[i](s);
|
|
369
|
+
if (r) {
|
|
370
|
+
return r;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
return null;
|
|
374
|
+
};
|
|
375
|
+
this.fns = fns;
|
|
376
|
+
this.single = fns.length === 1;
|
|
377
|
+
this.fn0 = fns[0];
|
|
378
|
+
}
|
|
379
|
+
/** Create parser for specific formats */
|
|
380
|
+
static create(formats) {
|
|
381
|
+
return new DateParser(formats.map(f => PARSERS[f]).filter(Boolean));
|
|
382
|
+
}
|
|
383
|
+
/** Create parser for auto-detecting ISO formats */
|
|
384
|
+
static iso() {
|
|
385
|
+
const fns = [];
|
|
386
|
+
for (const [, parsers] of AUTO_DETECT) {
|
|
387
|
+
fns.push(...parsers);
|
|
388
|
+
}
|
|
389
|
+
return new DateParser(fns);
|
|
390
|
+
}
|
|
391
|
+
/** Parse array of values */
|
|
392
|
+
parseAll(values) {
|
|
393
|
+
const len = values.length;
|
|
394
|
+
const out = new Array(len);
|
|
395
|
+
const parse = this.parse;
|
|
396
|
+
for (let i = 0; i < len; i++) {
|
|
397
|
+
out[i] = parse(values[i]);
|
|
398
|
+
}
|
|
399
|
+
return out;
|
|
400
|
+
}
|
|
401
|
+
/** Parse and filter valid dates */
|
|
402
|
+
parseValid(values) {
|
|
403
|
+
const out = [];
|
|
404
|
+
const parse = this.parse;
|
|
405
|
+
for (let i = 0, len = values.length; i < len; i++) {
|
|
406
|
+
const d = parse(values[i]);
|
|
407
|
+
if (d) {
|
|
408
|
+
out.push(d);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
return out;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Optimized date formatter for batch processing
|
|
416
|
+
*
|
|
417
|
+
* @example
|
|
418
|
+
* const formatter = DateFormatter.create("YYYY-MM-DD", { utc: true });
|
|
419
|
+
* const strings = formatter.formatAll(dates);
|
|
420
|
+
*/
|
|
421
|
+
export class DateFormatter {
|
|
422
|
+
constructor(fn) {
|
|
423
|
+
/** Format single date */
|
|
424
|
+
this.format = (date) => this.fn(date);
|
|
425
|
+
this.fn = fn;
|
|
426
|
+
}
|
|
427
|
+
/** Create ISO formatter (fastest) */
|
|
428
|
+
static iso(utc = false) {
|
|
429
|
+
// Direct string building is faster than toISOString() + slice
|
|
430
|
+
return utc
|
|
431
|
+
? new DateFormatter(d => {
|
|
432
|
+
if (!(d instanceof Date)) {
|
|
433
|
+
return "";
|
|
434
|
+
}
|
|
435
|
+
const t = d.getTime();
|
|
436
|
+
if (t !== t) {
|
|
437
|
+
return "";
|
|
438
|
+
} // NaN check
|
|
439
|
+
const y = d.getUTCFullYear();
|
|
440
|
+
const M = d.getUTCMonth() + 1;
|
|
441
|
+
const D = d.getUTCDate();
|
|
442
|
+
const H = d.getUTCHours();
|
|
443
|
+
const m = d.getUTCMinutes();
|
|
444
|
+
const s = d.getUTCSeconds();
|
|
445
|
+
const ms = d.getUTCMilliseconds();
|
|
446
|
+
return `${y}-${PAD2[M]}-${PAD2[D]}T${PAD2[H]}:${PAD2[m]}:${PAD2[s]}.${ms < 10 ? "00" + ms : ms < 100 ? "0" + ms : ms}Z`;
|
|
447
|
+
})
|
|
448
|
+
: new DateFormatter(d => {
|
|
449
|
+
if (!(d instanceof Date)) {
|
|
450
|
+
return "";
|
|
451
|
+
}
|
|
452
|
+
const t = d.getTime();
|
|
453
|
+
if (t !== t) {
|
|
454
|
+
return "";
|
|
455
|
+
} // NaN check
|
|
456
|
+
const y = d.getFullYear();
|
|
457
|
+
const M = d.getMonth() + 1;
|
|
458
|
+
const D = d.getDate();
|
|
459
|
+
const H = d.getHours();
|
|
460
|
+
const m = d.getMinutes();
|
|
461
|
+
const s = d.getSeconds();
|
|
462
|
+
const ms = d.getMilliseconds();
|
|
463
|
+
return `${y}-${PAD2[M]}-${PAD2[D]}T${PAD2[H]}:${PAD2[m]}:${PAD2[s]}.${ms < 10 ? "00" + ms : ms < 100 ? "0" + ms : ms}${tzOffset(d)}`;
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
/** Create custom format formatter */
|
|
467
|
+
static create(format, options) {
|
|
468
|
+
const utc = options?.utc ?? false;
|
|
469
|
+
// Fast paths for common formats (no regex, direct string building)
|
|
470
|
+
if (format === "YYYY-MM-DD") {
|
|
471
|
+
return utc
|
|
472
|
+
? new DateFormatter(d => {
|
|
473
|
+
if (!(d instanceof Date)) {
|
|
474
|
+
return "";
|
|
475
|
+
}
|
|
476
|
+
const t = d.getTime();
|
|
477
|
+
if (t !== t) {
|
|
478
|
+
return "";
|
|
479
|
+
}
|
|
480
|
+
return `${d.getUTCFullYear()}-${PAD2[d.getUTCMonth() + 1]}-${PAD2[d.getUTCDate()]}`;
|
|
481
|
+
})
|
|
482
|
+
: new DateFormatter(d => {
|
|
483
|
+
if (!(d instanceof Date)) {
|
|
484
|
+
return "";
|
|
485
|
+
}
|
|
486
|
+
const t = d.getTime();
|
|
487
|
+
if (t !== t) {
|
|
488
|
+
return "";
|
|
489
|
+
}
|
|
490
|
+
return `${d.getFullYear()}-${PAD2[d.getMonth() + 1]}-${PAD2[d.getDate()]}`;
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
if (format === "YYYY-MM-DD HH:mm:ss") {
|
|
494
|
+
return utc
|
|
495
|
+
? new DateFormatter(d => {
|
|
496
|
+
if (!(d instanceof Date)) {
|
|
497
|
+
return "";
|
|
498
|
+
}
|
|
499
|
+
const t = d.getTime();
|
|
500
|
+
if (t !== t) {
|
|
501
|
+
return "";
|
|
502
|
+
}
|
|
503
|
+
return `${d.getUTCFullYear()}-${PAD2[d.getUTCMonth() + 1]}-${PAD2[d.getUTCDate()]} ${PAD2[d.getUTCHours()]}:${PAD2[d.getUTCMinutes()]}:${PAD2[d.getUTCSeconds()]}`;
|
|
504
|
+
})
|
|
505
|
+
: new DateFormatter(d => {
|
|
506
|
+
if (!(d instanceof Date)) {
|
|
507
|
+
return "";
|
|
508
|
+
}
|
|
509
|
+
const t = d.getTime();
|
|
510
|
+
if (t !== t) {
|
|
511
|
+
return "";
|
|
512
|
+
}
|
|
513
|
+
return `${d.getFullYear()}-${PAD2[d.getMonth() + 1]}-${PAD2[d.getDate()]} ${PAD2[d.getHours()]}:${PAD2[d.getMinutes()]}:${PAD2[d.getSeconds()]}`;
|
|
514
|
+
});
|
|
515
|
+
}
|
|
516
|
+
if (format === "MM-DD-YYYY" || format === "MM/DD/YYYY") {
|
|
517
|
+
const sep = format.charAt(2);
|
|
518
|
+
return utc
|
|
519
|
+
? new DateFormatter(d => {
|
|
520
|
+
if (!(d instanceof Date)) {
|
|
521
|
+
return "";
|
|
522
|
+
}
|
|
523
|
+
const t = d.getTime();
|
|
524
|
+
if (t !== t) {
|
|
525
|
+
return "";
|
|
526
|
+
}
|
|
527
|
+
return `${PAD2[d.getUTCMonth() + 1]}${sep}${PAD2[d.getUTCDate()]}${sep}${d.getUTCFullYear()}`;
|
|
528
|
+
})
|
|
529
|
+
: new DateFormatter(d => {
|
|
530
|
+
if (!(d instanceof Date)) {
|
|
531
|
+
return "";
|
|
532
|
+
}
|
|
533
|
+
const t = d.getTime();
|
|
534
|
+
if (t !== t) {
|
|
535
|
+
return "";
|
|
536
|
+
}
|
|
537
|
+
return `${PAD2[d.getMonth() + 1]}${sep}${PAD2[d.getDate()]}${sep}${d.getFullYear()}`;
|
|
538
|
+
});
|
|
539
|
+
}
|
|
540
|
+
if (format === "DD-MM-YYYY" || format === "DD/MM/YYYY") {
|
|
541
|
+
const sep = format.charAt(2);
|
|
542
|
+
return utc
|
|
543
|
+
? new DateFormatter(d => {
|
|
544
|
+
if (!(d instanceof Date)) {
|
|
545
|
+
return "";
|
|
546
|
+
}
|
|
547
|
+
const t = d.getTime();
|
|
548
|
+
if (t !== t) {
|
|
549
|
+
return "";
|
|
550
|
+
}
|
|
551
|
+
return `${PAD2[d.getUTCDate()]}${sep}${PAD2[d.getUTCMonth() + 1]}${sep}${d.getUTCFullYear()}`;
|
|
552
|
+
})
|
|
553
|
+
: new DateFormatter(d => {
|
|
554
|
+
if (!(d instanceof Date)) {
|
|
555
|
+
return "";
|
|
556
|
+
}
|
|
557
|
+
const t = d.getTime();
|
|
558
|
+
if (t !== t) {
|
|
559
|
+
return "";
|
|
560
|
+
}
|
|
561
|
+
return `${PAD2[d.getDate()]}${sep}${PAD2[d.getMonth() + 1]}${sep}${d.getFullYear()}`;
|
|
562
|
+
});
|
|
563
|
+
}
|
|
564
|
+
// Generic path with pre-compiled template
|
|
565
|
+
return DateFormatter.createGeneric(format, utc);
|
|
566
|
+
}
|
|
567
|
+
/** Generic formatter for arbitrary formats */
|
|
568
|
+
static createGeneric(format, utc) {
|
|
569
|
+
// Pre-process escaped sections
|
|
570
|
+
const esc = [];
|
|
571
|
+
const tpl = format.replace(/\[([^\]]*)\]/g, (_, c) => {
|
|
572
|
+
esc.push(c);
|
|
573
|
+
return `\x00${esc.length - 1}\x00`;
|
|
574
|
+
});
|
|
575
|
+
// Detect used tokens for conditional computation
|
|
576
|
+
const hasY = tpl.includes("YYYY");
|
|
577
|
+
const hasMs = tpl.includes("SSS");
|
|
578
|
+
const hasM = tpl.includes("MM");
|
|
579
|
+
const hasD = tpl.includes("DD");
|
|
580
|
+
const hasH = tpl.includes("HH");
|
|
581
|
+
const hasMin = tpl.includes("mm");
|
|
582
|
+
const hasS = tpl.includes("ss");
|
|
583
|
+
const hasZ = tpl.includes("Z");
|
|
584
|
+
return new DateFormatter(d => {
|
|
585
|
+
if (!(d instanceof Date)) {
|
|
586
|
+
return "";
|
|
587
|
+
}
|
|
588
|
+
const t = d.getTime();
|
|
589
|
+
if (t !== t) {
|
|
590
|
+
return "";
|
|
591
|
+
}
|
|
592
|
+
let out = tpl;
|
|
593
|
+
if (hasY) {
|
|
594
|
+
out = out.replace(/YYYY/g, String(utc ? d.getUTCFullYear() : d.getFullYear()));
|
|
595
|
+
}
|
|
596
|
+
if (hasMs) {
|
|
597
|
+
const ms = utc ? d.getUTCMilliseconds() : d.getMilliseconds();
|
|
598
|
+
out = out.replace(/SSS/g, ms < 10 ? `00${ms}` : ms < 100 ? `0${ms}` : String(ms));
|
|
599
|
+
}
|
|
600
|
+
if (hasM) {
|
|
601
|
+
out = out.replace(/MM/g, PAD2[utc ? d.getUTCMonth() + 1 : d.getMonth() + 1]);
|
|
602
|
+
}
|
|
603
|
+
if (hasD) {
|
|
604
|
+
out = out.replace(/DD/g, PAD2[utc ? d.getUTCDate() : d.getDate()]);
|
|
605
|
+
}
|
|
606
|
+
if (hasH) {
|
|
607
|
+
out = out.replace(/HH/g, PAD2[utc ? d.getUTCHours() : d.getHours()]);
|
|
608
|
+
}
|
|
609
|
+
if (hasMin) {
|
|
610
|
+
out = out.replace(/mm/g, PAD2[utc ? d.getUTCMinutes() : d.getMinutes()]);
|
|
611
|
+
}
|
|
612
|
+
if (hasS) {
|
|
613
|
+
out = out.replace(/ss/g, PAD2[utc ? d.getUTCSeconds() : d.getSeconds()]);
|
|
614
|
+
}
|
|
615
|
+
if (hasZ) {
|
|
616
|
+
out = out.replace(/Z/g, utc ? "Z" : tzOffset(d));
|
|
617
|
+
}
|
|
618
|
+
if (esc.length) {
|
|
619
|
+
// oxlint-disable-next-line no-control-regex
|
|
620
|
+
out = out.replace(/\x00(\d+)\x00/g, (_, i) => esc[+i]);
|
|
621
|
+
}
|
|
622
|
+
return out;
|
|
623
|
+
});
|
|
624
|
+
}
|
|
625
|
+
/** Format array of dates */
|
|
626
|
+
formatAll(dates) {
|
|
627
|
+
const len = dates.length;
|
|
628
|
+
const out = new Array(len);
|
|
629
|
+
const fn = this.fn;
|
|
630
|
+
for (let i = 0; i < len; i++) {
|
|
631
|
+
out[i] = fn(dates[i]);
|
|
632
|
+
}
|
|
633
|
+
return out;
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
/** Get supported format strings */
|
|
637
|
+
export function getSupportedFormats() {
|
|
638
|
+
return Object.keys(PARSERS);
|
|
639
|
+
}
|