@cj-tech-master/excelts 1.6.2 → 1.6.3-canary.20251224124621.73c5d94
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 +36 -4
- package/README_zh.md +37 -6
- package/dist/browser/excelts.esm.js +19115 -0
- package/dist/browser/excelts.esm.js.map +1 -0
- package/dist/browser/excelts.esm.min.js +127 -0
- package/dist/browser/excelts.iife.js +13576 -46968
- package/dist/browser/excelts.iife.js.map +1 -1
- package/dist/browser/excelts.iife.min.js +25 -105
- 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 +154 -0
- package/dist/cjs/csv/csv.browser.js +68 -0
- package/dist/cjs/csv/csv.js +226 -162
- package/dist/cjs/doc/anchor.js +2 -2
- package/dist/cjs/doc/cell.js +22 -22
- package/dist/cjs/doc/column.js +7 -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 +41 -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 +29 -26
- package/dist/cjs/stream/xlsx/workbook-writer.js +71 -57
- package/dist/cjs/stream/xlsx/worksheet-reader.js +27 -23
- package/dist/cjs/stream/xlsx/worksheet-writer.js +72 -66
- 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/encryptor.browser.js +240 -0
- package/dist/cjs/utils/parse-sax.js +2 -2
- 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 +3 -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 +85 -0
- package/dist/cjs/utils/zip/compress.browser.js +83 -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/index.js +17 -17
- 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-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 +2 -2
- 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 +4 -4
- 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 +68 -68
- 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 +205 -0
- package/dist/cjs/xlsx/xlsx.js +91 -833
- 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 +141 -0
- package/dist/esm/csv/csv.browser.js +65 -0
- package/dist/esm/csv/csv.js +189 -159
- 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/index.browser.js +33 -1
- package/dist/esm/index.js +23 -8
- package/dist/esm/local.js +0 -1
- package/dist/esm/stream/xlsx/hyperlink-reader.js +1 -1
- package/dist/esm/stream/xlsx/workbook-reader.js +7 -4
- package/dist/esm/stream/xlsx/workbook-writer.js +37 -23
- package/dist/esm/stream/xlsx/worksheet-reader.js +12 -8
- package/dist/esm/stream/xlsx/worksheet-writer.js +12 -6
- package/dist/esm/utils/browser-buffer.js +67 -0
- package/dist/esm/utils/encryptor.browser.js +237 -0
- package/dist/esm/utils/stream-buf.browser.js +352 -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 +80 -0
- package/dist/esm/utils/zip/compress.browser.js +76 -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-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/xlsx.base.js +739 -0
- package/dist/esm/xlsx/xlsx.browser.js +202 -0
- package/dist/esm/xlsx/xlsx.js +87 -829
- 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 +61 -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 +3 -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 +4 -4
- 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 +10 -10
- package/dist/types/index.browser.d.ts +19 -5
- package/dist/types/index.d.ts +24 -20
- package/dist/types/local.d.ts +0 -1
- package/dist/types/stream/xlsx/hyperlink-reader.d.ts +11 -11
- package/dist/types/stream/xlsx/workbook-reader.d.ts +125 -36
- package/dist/types/stream/xlsx/workbook-writer.d.ts +105 -22
- package/dist/types/stream/xlsx/worksheet-reader.d.ts +40 -22
- package/dist/types/stream/xlsx/worksheet-writer.d.ts +83 -49
- package/dist/types/types.d.ts +4 -16
- package/dist/types/utils/browser-buffer.d.ts +28 -0
- package/dist/types/utils/col-cache.d.ts +1 -1
- package/dist/types/utils/encryptor.browser.d.ts +28 -0
- 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/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 +42 -0
- package/dist/types/utils/zip/compress.browser.d.ts +54 -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/index.d.ts +5 -5
- 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-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 +1 -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 +1 -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 +13 -15
|
@@ -92,14 +92,14 @@ class WorkbookWriter {
|
|
|
92
92
|
let buffer;
|
|
93
93
|
if (base64) {
|
|
94
94
|
// Use Buffer.from for efficient base64 decoding
|
|
95
|
-
const base64Data = typeof data === "string" ? data :
|
|
95
|
+
const base64Data = typeof data === "string" ? data : new TextDecoder().decode(data);
|
|
96
96
|
buffer = Buffer.from(base64Data, "base64");
|
|
97
97
|
}
|
|
98
98
|
else if (typeof data === "string") {
|
|
99
99
|
buffer = Buffer.from(data, "utf8");
|
|
100
100
|
}
|
|
101
101
|
else {
|
|
102
|
-
buffer =
|
|
102
|
+
buffer = data;
|
|
103
103
|
}
|
|
104
104
|
zipFile.push(buffer, true); // true = final chunk
|
|
105
105
|
}
|
|
@@ -119,15 +119,15 @@ class WorkbookWriter {
|
|
|
119
119
|
// if there are any uncommitted worksheets, commit them now and wait
|
|
120
120
|
const promises = this._worksheets.map(commitWorksheet);
|
|
121
121
|
if (promises.length) {
|
|
122
|
-
return Promise.all(promises);
|
|
122
|
+
return Promise.all(promises).then(() => { });
|
|
123
123
|
}
|
|
124
124
|
return Promise.resolve();
|
|
125
125
|
}
|
|
126
126
|
async commit() {
|
|
127
|
-
// commit all worksheets, then add
|
|
127
|
+
// commit all worksheets, then add supplementary files
|
|
128
128
|
await this.promise;
|
|
129
|
-
await this.addMedia();
|
|
130
129
|
await this._commitWorksheets();
|
|
130
|
+
await this.addMedia();
|
|
131
131
|
await Promise.all([
|
|
132
132
|
this.addContentTypes(),
|
|
133
133
|
this.addApp(),
|
|
@@ -149,28 +149,39 @@ class WorkbookWriter {
|
|
|
149
149
|
}
|
|
150
150
|
return this._worksheets.length || 1;
|
|
151
151
|
}
|
|
152
|
+
/**
|
|
153
|
+
* Add Image to Workbook and return the id
|
|
154
|
+
*/
|
|
152
155
|
addImage(image) {
|
|
153
156
|
const id = this.media.length;
|
|
154
|
-
const medium =
|
|
157
|
+
const medium = {
|
|
158
|
+
...image,
|
|
155
159
|
type: "image",
|
|
156
160
|
name: `image${id}.${image.extension}`
|
|
157
|
-
}
|
|
161
|
+
};
|
|
158
162
|
this.media.push(medium);
|
|
159
163
|
return id;
|
|
160
164
|
}
|
|
165
|
+
/**
|
|
166
|
+
* Get image by id
|
|
167
|
+
*/
|
|
161
168
|
getImage(id) {
|
|
162
169
|
return this.media[id];
|
|
163
170
|
}
|
|
164
|
-
|
|
171
|
+
/**
|
|
172
|
+
* Add a new worksheet and return a reference to it
|
|
173
|
+
*/
|
|
174
|
+
addWorksheet(name, options) {
|
|
165
175
|
// it's possible to add a worksheet with different than default
|
|
166
176
|
// shared string handling
|
|
167
177
|
// in fact, it's even possible to switch it mid-sheet
|
|
168
|
-
const
|
|
169
|
-
|
|
178
|
+
const opts = options || {};
|
|
179
|
+
const useSharedStrings = opts.useSharedStrings !== undefined ? opts.useSharedStrings : this.useSharedStrings;
|
|
180
|
+
if (opts.tabColor) {
|
|
170
181
|
console.trace("tabColor option has moved to { properties: tabColor: {...} }");
|
|
171
|
-
|
|
172
|
-
tabColor:
|
|
173
|
-
},
|
|
182
|
+
opts.properties = Object.assign({
|
|
183
|
+
tabColor: opts.tabColor
|
|
184
|
+
}, opts.properties);
|
|
174
185
|
}
|
|
175
186
|
const id = this.nextId;
|
|
176
187
|
name = name || `sheet${id}`;
|
|
@@ -179,16 +190,19 @@ class WorkbookWriter {
|
|
|
179
190
|
name,
|
|
180
191
|
workbook: this,
|
|
181
192
|
useSharedStrings,
|
|
182
|
-
properties:
|
|
183
|
-
state:
|
|
184
|
-
pageSetup:
|
|
185
|
-
views:
|
|
186
|
-
autoFilter:
|
|
187
|
-
headerFooter:
|
|
193
|
+
properties: opts.properties,
|
|
194
|
+
state: opts.state,
|
|
195
|
+
pageSetup: opts.pageSetup,
|
|
196
|
+
views: opts.views,
|
|
197
|
+
autoFilter: opts.autoFilter,
|
|
198
|
+
headerFooter: opts.headerFooter
|
|
188
199
|
});
|
|
189
200
|
this._worksheets[id] = worksheet;
|
|
190
201
|
return worksheet;
|
|
191
202
|
}
|
|
203
|
+
/**
|
|
204
|
+
* Fetch sheet by name or id
|
|
205
|
+
*/
|
|
192
206
|
getWorksheet(id) {
|
|
193
207
|
if (id === undefined) {
|
|
194
208
|
return this._worksheets.find(() => true);
|
|
@@ -197,7 +211,7 @@ class WorkbookWriter {
|
|
|
197
211
|
return this._worksheets[id];
|
|
198
212
|
}
|
|
199
213
|
if (typeof id === "string") {
|
|
200
|
-
return this._worksheets.find(
|
|
214
|
+
return this._worksheets.find(worksheet => worksheet && worksheet.name === id);
|
|
201
215
|
}
|
|
202
216
|
return undefined;
|
|
203
217
|
}
|
|
@@ -250,7 +264,7 @@ class WorkbookWriter {
|
|
|
250
264
|
reject(err);
|
|
251
265
|
}
|
|
252
266
|
else {
|
|
253
|
-
resolve(data);
|
|
267
|
+
resolve(new Uint8Array(data));
|
|
254
268
|
}
|
|
255
269
|
});
|
|
256
270
|
});
|
|
@@ -259,13 +273,13 @@ class WorkbookWriter {
|
|
|
259
273
|
}
|
|
260
274
|
if (medium.buffer) {
|
|
261
275
|
this._addFile(medium.buffer, filename);
|
|
262
|
-
return
|
|
276
|
+
return;
|
|
263
277
|
}
|
|
264
278
|
if (medium.base64) {
|
|
265
279
|
const dataimg64 = medium.base64;
|
|
266
280
|
const content = dataimg64.substring(dataimg64.indexOf(",") + 1);
|
|
267
281
|
this._addFile(content, filename, true);
|
|
268
|
-
return
|
|
282
|
+
return;
|
|
269
283
|
}
|
|
270
284
|
}
|
|
271
285
|
throw new Error("Unsupported media");
|
|
@@ -25,7 +25,7 @@ class WorksheetReader extends EventEmitter {
|
|
|
25
25
|
destroy() {
|
|
26
26
|
throw new Error("Invalid Operation: destroy");
|
|
27
27
|
}
|
|
28
|
-
// return the current dimensions of the
|
|
28
|
+
// return the current dimensions of the reader
|
|
29
29
|
get dimensions() {
|
|
30
30
|
return this._dimensions;
|
|
31
31
|
}
|
|
@@ -44,7 +44,7 @@ class WorksheetReader extends EventEmitter {
|
|
|
44
44
|
if (col) {
|
|
45
45
|
return col;
|
|
46
46
|
}
|
|
47
|
-
//
|
|
47
|
+
// otherwise, assume letter
|
|
48
48
|
c = colCache.l2n(c);
|
|
49
49
|
}
|
|
50
50
|
if (!this._columns) {
|
|
@@ -85,9 +85,9 @@ class WorksheetReader extends EventEmitter {
|
|
|
85
85
|
}
|
|
86
86
|
async *[Symbol.asyncIterator]() {
|
|
87
87
|
for await (const events of this.parse()) {
|
|
88
|
-
for (const
|
|
89
|
-
if (eventType === "row") {
|
|
90
|
-
yield value;
|
|
88
|
+
for (const event of events) {
|
|
89
|
+
if (event.eventType === "row") {
|
|
90
|
+
yield event.value;
|
|
91
91
|
}
|
|
92
92
|
}
|
|
93
93
|
}
|
|
@@ -283,6 +283,7 @@ class WorksheetReader extends EventEmitter {
|
|
|
283
283
|
cell.value = sharedStrings[index];
|
|
284
284
|
}
|
|
285
285
|
else {
|
|
286
|
+
// Streaming format - unresolved shared string reference
|
|
286
287
|
cell.value = {
|
|
287
288
|
sharedString: index
|
|
288
289
|
};
|
|
@@ -299,19 +300,22 @@ class WorksheetReader extends EventEmitter {
|
|
|
299
300
|
case "b":
|
|
300
301
|
cell.value = parseInt(c.v.text, 10) !== 0;
|
|
301
302
|
break;
|
|
302
|
-
default:
|
|
303
|
-
|
|
304
|
-
|
|
303
|
+
default: {
|
|
304
|
+
const numFmtStr = typeof cell.numFmt === "string" ? cell.numFmt : cell.numFmt?.formatCode;
|
|
305
|
+
if (numFmtStr && isDateFmt(numFmtStr)) {
|
|
306
|
+
cell.value = excelToDate(parseFloat(c.v.text), properties?.model?.date1904);
|
|
305
307
|
}
|
|
306
308
|
else {
|
|
307
309
|
cell.value = parseFloat(c.v.text);
|
|
308
310
|
}
|
|
309
311
|
break;
|
|
312
|
+
}
|
|
310
313
|
}
|
|
311
314
|
}
|
|
312
315
|
if (hyperlinks) {
|
|
313
316
|
const hyperlink = hyperlinks[c.ref];
|
|
314
317
|
if (hyperlink) {
|
|
318
|
+
// Streaming-specific: assign text and hyperlink for further processing
|
|
315
319
|
cell.text = cell.value;
|
|
316
320
|
cell.value = undefined;
|
|
317
321
|
cell.hyperlink = hyperlink;
|
|
@@ -275,20 +275,26 @@ class WorksheetWriter {
|
|
|
275
275
|
}
|
|
276
276
|
// iterate over every uncommitted row in the worksheet, including maybe empty rows
|
|
277
277
|
eachRow(options, iteratee) {
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
278
|
+
let callback;
|
|
279
|
+
let opts;
|
|
280
|
+
if (typeof options === "function") {
|
|
281
|
+
callback = options;
|
|
282
|
+
opts = undefined;
|
|
281
283
|
}
|
|
282
|
-
|
|
284
|
+
else {
|
|
285
|
+
callback = iteratee;
|
|
286
|
+
opts = options;
|
|
287
|
+
}
|
|
288
|
+
if (opts && opts.includeEmpty) {
|
|
283
289
|
const n = this._nextRow;
|
|
284
290
|
for (let i = this._rowZero; i < n; i++) {
|
|
285
|
-
|
|
291
|
+
callback(this.getRow(i), i);
|
|
286
292
|
}
|
|
287
293
|
}
|
|
288
294
|
else {
|
|
289
295
|
this._rows.forEach(row => {
|
|
290
296
|
if (row.hasValues) {
|
|
291
|
-
|
|
297
|
+
callback(row, row.number);
|
|
292
298
|
}
|
|
293
299
|
});
|
|
294
300
|
}
|
|
@@ -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,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-compatible Encryptor with pure JS SHA implementations
|
|
3
|
+
* This provides synchronous hash functions for browser compatibility
|
|
4
|
+
*/
|
|
5
|
+
import { BrowserBuffer, base64ToUint8Array, uint8ArrayToBase64, stringToUtf16Le, concatUint8Arrays } from "./browser-buffer.js";
|
|
6
|
+
// Helper to convert number to little-endian Uint8Array
|
|
7
|
+
function uint32ToLe(num) {
|
|
8
|
+
const bytes = new Uint8Array(4);
|
|
9
|
+
bytes[0] = num & 0xff;
|
|
10
|
+
bytes[1] = (num >> 8) & 0xff;
|
|
11
|
+
bytes[2] = (num >> 16) & 0xff;
|
|
12
|
+
bytes[3] = (num >> 24) & 0xff;
|
|
13
|
+
return bytes;
|
|
14
|
+
}
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// Pure JavaScript SHA-512 implementation
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// SHA-512 constants (first 80 primes 2..409)
|
|
19
|
+
const K = new BigUint64Array([
|
|
20
|
+
0x428a2f98d728ae22n,
|
|
21
|
+
0x7137449123ef65cdn,
|
|
22
|
+
0xb5c0fbcfec4d3b2fn,
|
|
23
|
+
0xe9b5dba58189dbb4n,
|
|
24
|
+
0x3956c25bf348b538n,
|
|
25
|
+
0x59f111f1b605d019n,
|
|
26
|
+
0x923f82a4af194f9bn,
|
|
27
|
+
0xab1c5ed5da6d8118n,
|
|
28
|
+
0xd807aa98a3030242n,
|
|
29
|
+
0x12835b0145706fben,
|
|
30
|
+
0x243185be4ee4b28cn,
|
|
31
|
+
0x550c7dc3d5ffb4e2n,
|
|
32
|
+
0x72be5d74f27b896fn,
|
|
33
|
+
0x80deb1fe3b1696b1n,
|
|
34
|
+
0x9bdc06a725c71235n,
|
|
35
|
+
0xc19bf174cf692694n,
|
|
36
|
+
0xe49b69c19ef14ad2n,
|
|
37
|
+
0xefbe4786384f25e3n,
|
|
38
|
+
0x0fc19dc68b8cd5b5n,
|
|
39
|
+
0x240ca1cc77ac9c65n,
|
|
40
|
+
0x2de92c6f592b0275n,
|
|
41
|
+
0x4a7484aa6ea6e483n,
|
|
42
|
+
0x5cb0a9dcbd41fbd4n,
|
|
43
|
+
0x76f988da831153b5n,
|
|
44
|
+
0x983e5152ee66dfabn,
|
|
45
|
+
0xa831c66d2db43210n,
|
|
46
|
+
0xb00327c898fb213fn,
|
|
47
|
+
0xbf597fc7beef0ee4n,
|
|
48
|
+
0xc6e00bf33da88fc2n,
|
|
49
|
+
0xd5a79147930aa725n,
|
|
50
|
+
0x06ca6351e003826fn,
|
|
51
|
+
0x142929670a0e6e70n,
|
|
52
|
+
0x27b70a8546d22ffcn,
|
|
53
|
+
0x2e1b21385c26c926n,
|
|
54
|
+
0x4d2c6dfc5ac42aedn,
|
|
55
|
+
0x53380d139d95b3dfn,
|
|
56
|
+
0x650a73548baf63den,
|
|
57
|
+
0x766a0abb3c77b2a8n,
|
|
58
|
+
0x81c2c92e47edaee6n,
|
|
59
|
+
0x92722c851482353bn,
|
|
60
|
+
0xa2bfe8a14cf10364n,
|
|
61
|
+
0xa81a664bbc423001n,
|
|
62
|
+
0xc24b8b70d0f89791n,
|
|
63
|
+
0xc76c51a30654be30n,
|
|
64
|
+
0xd192e819d6ef5218n,
|
|
65
|
+
0xd69906245565a910n,
|
|
66
|
+
0xf40e35855771202an,
|
|
67
|
+
0x106aa07032bbd1b8n,
|
|
68
|
+
0x19a4c116b8d2d0c8n,
|
|
69
|
+
0x1e376c085141ab53n,
|
|
70
|
+
0x2748774cdf8eeb99n,
|
|
71
|
+
0x34b0bcb5e19b48a8n,
|
|
72
|
+
0x391c0cb3c5c95a63n,
|
|
73
|
+
0x4ed8aa4ae3418acbn,
|
|
74
|
+
0x5b9cca4f7763e373n,
|
|
75
|
+
0x682e6ff3d6b2b8a3n,
|
|
76
|
+
0x748f82ee5defb2fcn,
|
|
77
|
+
0x78a5636f43172f60n,
|
|
78
|
+
0x84c87814a1f0ab72n,
|
|
79
|
+
0x8cc702081a6439ecn,
|
|
80
|
+
0x90befffa23631e28n,
|
|
81
|
+
0xa4506cebde82bde9n,
|
|
82
|
+
0xbef9a3f7b2c67915n,
|
|
83
|
+
0xc67178f2e372532bn,
|
|
84
|
+
0xca273eceea26619cn,
|
|
85
|
+
0xd186b8c721c0c207n,
|
|
86
|
+
0xeada7dd6cde0eb1en,
|
|
87
|
+
0xf57d4f7fee6ed178n,
|
|
88
|
+
0x06f067aa72176fban,
|
|
89
|
+
0x0a637dc5a2c898a6n,
|
|
90
|
+
0x113f9804bef90daen,
|
|
91
|
+
0x1b710b35131c471bn,
|
|
92
|
+
0x28db77f523047d84n,
|
|
93
|
+
0x32caab7b40c72493n,
|
|
94
|
+
0x3c9ebe0a15c9bebcn,
|
|
95
|
+
0x431d67c49c100d4cn,
|
|
96
|
+
0x4cc5d4becb3e42b6n,
|
|
97
|
+
0x597f299cfc657e2an,
|
|
98
|
+
0x5fcb6fab3ad6faecn,
|
|
99
|
+
0x6c44198c4a475817n
|
|
100
|
+
]);
|
|
101
|
+
// Initial hash values for SHA-512
|
|
102
|
+
const H0 = new BigUint64Array([
|
|
103
|
+
0x6a09e667f3bcc908n,
|
|
104
|
+
0xbb67ae8584caa73bn,
|
|
105
|
+
0x3c6ef372fe94f82bn,
|
|
106
|
+
0xa54ff53a5f1d36f1n,
|
|
107
|
+
0x510e527fade682d1n,
|
|
108
|
+
0x9b05688c2b3e6c1fn,
|
|
109
|
+
0x1f83d9abfb41bd6bn,
|
|
110
|
+
0x5be0cd19137e2179n
|
|
111
|
+
]);
|
|
112
|
+
function rotr64(x, n) {
|
|
113
|
+
return ((x >> BigInt(n)) | (x << BigInt(64 - n))) & 0xffffffffffffffffn;
|
|
114
|
+
}
|
|
115
|
+
function sha512(message) {
|
|
116
|
+
// Pre-processing: adding padding bits
|
|
117
|
+
const msgLen = message.length;
|
|
118
|
+
const msgBitLen = BigInt(msgLen * 8);
|
|
119
|
+
// Calculate padding length (message + 1 + padding + 16 bytes for length) should be multiple of 128
|
|
120
|
+
const padLen = (128 - ((msgLen + 17) % 128)) % 128;
|
|
121
|
+
const paddedLen = msgLen + 1 + padLen + 16;
|
|
122
|
+
const padded = new Uint8Array(paddedLen);
|
|
123
|
+
padded.set(message);
|
|
124
|
+
padded[msgLen] = 0x80;
|
|
125
|
+
// Append original length in bits as 128-bit big-endian (we only use lower 64 bits)
|
|
126
|
+
const view = new DataView(padded.buffer);
|
|
127
|
+
// Upper 64 bits (always 0 for messages < 2^64 bits)
|
|
128
|
+
view.setBigUint64(paddedLen - 16, 0n, false);
|
|
129
|
+
// Lower 64 bits
|
|
130
|
+
view.setBigUint64(paddedLen - 8, msgBitLen, false);
|
|
131
|
+
// Initialize hash values
|
|
132
|
+
const H = new BigUint64Array(H0);
|
|
133
|
+
// Process message in 1024-bit (128-byte) chunks
|
|
134
|
+
const W = new BigUint64Array(80);
|
|
135
|
+
for (let chunkStart = 0; chunkStart < paddedLen; chunkStart += 128) {
|
|
136
|
+
const chunkView = new DataView(padded.buffer, chunkStart, 128);
|
|
137
|
+
// Copy chunk into first 16 words W[0..15]
|
|
138
|
+
for (let i = 0; i < 16; i++) {
|
|
139
|
+
W[i] = chunkView.getBigUint64(i * 8, false);
|
|
140
|
+
}
|
|
141
|
+
// Extend the first 16 words into the remaining 64 words W[16..79]
|
|
142
|
+
for (let i = 16; i < 80; i++) {
|
|
143
|
+
const s0 = rotr64(W[i - 15], 1) ^ rotr64(W[i - 15], 8) ^ (W[i - 15] >> 7n);
|
|
144
|
+
const s1 = rotr64(W[i - 2], 19) ^ rotr64(W[i - 2], 61) ^ (W[i - 2] >> 6n);
|
|
145
|
+
W[i] = (W[i - 16] + s0 + W[i - 7] + s1) & 0xffffffffffffffffn;
|
|
146
|
+
}
|
|
147
|
+
// Initialize working variables
|
|
148
|
+
let a = H[0], b = H[1], c = H[2], d = H[3];
|
|
149
|
+
let e = H[4], f = H[5], g = H[6], h = H[7];
|
|
150
|
+
// Main loop
|
|
151
|
+
for (let i = 0; i < 80; i++) {
|
|
152
|
+
const S1 = rotr64(e, 14) ^ rotr64(e, 18) ^ rotr64(e, 41);
|
|
153
|
+
const ch = (e & f) ^ (~e & g);
|
|
154
|
+
const temp1 = (h + S1 + ch + K[i] + W[i]) & 0xffffffffffffffffn;
|
|
155
|
+
const S0 = rotr64(a, 28) ^ rotr64(a, 34) ^ rotr64(a, 39);
|
|
156
|
+
const maj = (a & b) ^ (a & c) ^ (b & c);
|
|
157
|
+
const temp2 = (S0 + maj) & 0xffffffffffffffffn;
|
|
158
|
+
h = g;
|
|
159
|
+
g = f;
|
|
160
|
+
f = e;
|
|
161
|
+
e = (d + temp1) & 0xffffffffffffffffn;
|
|
162
|
+
d = c;
|
|
163
|
+
c = b;
|
|
164
|
+
b = a;
|
|
165
|
+
a = (temp1 + temp2) & 0xffffffffffffffffn;
|
|
166
|
+
}
|
|
167
|
+
// Add compressed chunk to current hash value
|
|
168
|
+
H[0] = (H[0] + a) & 0xffffffffffffffffn;
|
|
169
|
+
H[1] = (H[1] + b) & 0xffffffffffffffffn;
|
|
170
|
+
H[2] = (H[2] + c) & 0xffffffffffffffffn;
|
|
171
|
+
H[3] = (H[3] + d) & 0xffffffffffffffffn;
|
|
172
|
+
H[4] = (H[4] + e) & 0xffffffffffffffffn;
|
|
173
|
+
H[5] = (H[5] + f) & 0xffffffffffffffffn;
|
|
174
|
+
H[6] = (H[6] + g) & 0xffffffffffffffffn;
|
|
175
|
+
H[7] = (H[7] + h) & 0xffffffffffffffffn;
|
|
176
|
+
}
|
|
177
|
+
// Produce the final hash value (big-endian)
|
|
178
|
+
const result = new Uint8Array(64);
|
|
179
|
+
const resultView = new DataView(result.buffer);
|
|
180
|
+
for (let i = 0; i < 8; i++) {
|
|
181
|
+
resultView.setBigUint64(i * 8, H[i], false);
|
|
182
|
+
}
|
|
183
|
+
return result;
|
|
184
|
+
}
|
|
185
|
+
// ============================================================================
|
|
186
|
+
// Encryptor implementation
|
|
187
|
+
// ============================================================================
|
|
188
|
+
const Encryptor = {
|
|
189
|
+
/**
|
|
190
|
+
* Calculate a hash of the concatenated buffers with the given algorithm.
|
|
191
|
+
* @param algorithm - The hash algorithm.
|
|
192
|
+
* @returns The hash as Uint8Array
|
|
193
|
+
*/
|
|
194
|
+
hash(algorithm, ...buffers) {
|
|
195
|
+
const data = concatUint8Arrays(...buffers);
|
|
196
|
+
const algo = algorithm.toLowerCase().replace("-", "");
|
|
197
|
+
if (algo === "sha512") {
|
|
198
|
+
return sha512(data);
|
|
199
|
+
}
|
|
200
|
+
throw new Error(`Hash algorithm '${algorithm}' not supported in browser sync mode!`);
|
|
201
|
+
},
|
|
202
|
+
/**
|
|
203
|
+
* Convert a password into an encryption key
|
|
204
|
+
* @param password - The password
|
|
205
|
+
* @param hashAlgorithm - The hash algorithm
|
|
206
|
+
* @param saltValue - The salt value (base64 encoded)
|
|
207
|
+
* @param spinCount - The spin count
|
|
208
|
+
* @returns The encryption key (base64 encoded)
|
|
209
|
+
*/
|
|
210
|
+
convertPasswordToHash(password, hashAlgorithm, saltValue, spinCount) {
|
|
211
|
+
const algo = hashAlgorithm.toLowerCase().replace("-", "");
|
|
212
|
+
if (algo !== "sha512") {
|
|
213
|
+
throw new Error(`Hash algorithm '${hashAlgorithm}' not supported in browser!`);
|
|
214
|
+
}
|
|
215
|
+
// Password must be in unicode buffer (UTF-16LE)
|
|
216
|
+
const passwordBuffer = stringToUtf16Le(password);
|
|
217
|
+
// Generate the initial hash
|
|
218
|
+
const saltBuffer = base64ToUint8Array(saltValue);
|
|
219
|
+
let key = this.hash(hashAlgorithm, saltBuffer, passwordBuffer);
|
|
220
|
+
// Now regenerate until spin count
|
|
221
|
+
for (let i = 0; i < spinCount; i++) {
|
|
222
|
+
const iterator = uint32ToLe(i);
|
|
223
|
+
key = this.hash(hashAlgorithm, key, iterator);
|
|
224
|
+
}
|
|
225
|
+
return uint8ArrayToBase64(key);
|
|
226
|
+
},
|
|
227
|
+
/**
|
|
228
|
+
* Generates cryptographically strong pseudo-random data.
|
|
229
|
+
* @param size The size argument is a number indicating the number of bytes to generate.
|
|
230
|
+
*/
|
|
231
|
+
randomBytes(size) {
|
|
232
|
+
const bytes = new BrowserBuffer(size);
|
|
233
|
+
crypto.getRandomValues(bytes);
|
|
234
|
+
return bytes;
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
export { Encryptor };
|