@cj-tech-master/excelts 4.2.1-canary.20260111102127.f808a37 → 4.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/THIRD_PARTY_NOTICES.md +31 -0
- package/dist/browser/index.browser.d.ts +0 -1
- package/dist/browser/index.browser.js +0 -12
- package/dist/browser/modules/archive/byte-queue.d.ts +18 -0
- package/dist/browser/modules/archive/byte-queue.js +125 -0
- package/dist/browser/modules/archive/{compression/compress.base.js → compress.base.js} +1 -1
- package/dist/browser/modules/archive/{compression/compress.browser.d.ts → compress.browser.d.ts} +8 -2
- package/dist/{esm/modules/archive/compression → browser/modules/archive}/compress.browser.js +11 -3
- package/dist/browser/modules/archive/{compression/compress.d.ts → compress.d.ts} +2 -2
- package/dist/{esm/modules/archive/compression → browser/modules/archive}/compress.js +1 -1
- package/dist/browser/modules/archive/{compression/crc32.browser.d.ts → crc32.browser.d.ts} +1 -1
- package/dist/browser/modules/archive/{compression/crc32.d.ts → crc32.d.ts} +1 -1
- package/dist/browser/modules/archive/{compression/crc32.js → crc32.js} +1 -1
- package/dist/browser/modules/archive/defaults.d.ts +0 -1
- package/dist/browser/modules/archive/defaults.js +3 -6
- package/dist/browser/modules/archive/{compression/deflate-fallback.js → deflate-fallback.js} +1 -1
- package/dist/browser/modules/archive/{unzip/extract.d.ts → extract.d.ts} +2 -2
- package/dist/browser/modules/archive/index.base.d.ts +4 -4
- package/dist/browser/modules/archive/index.base.js +6 -3
- package/dist/browser/modules/archive/index.browser.d.ts +4 -3
- package/dist/browser/modules/archive/index.browser.js +7 -3
- package/dist/browser/modules/archive/index.d.ts +4 -3
- package/dist/browser/modules/archive/index.js +5 -3
- package/dist/browser/modules/archive/{unzip/stream.base.d.ts → parse.base.d.ts} +2 -36
- package/dist/browser/modules/archive/parse.base.js +644 -0
- package/dist/browser/modules/archive/{unzip/stream.browser.d.ts → parse.browser.d.ts} +1 -1
- package/dist/{esm/modules/archive/unzip/stream.browser.js → browser/modules/archive/parse.browser.js} +110 -371
- package/dist/browser/modules/archive/{unzip/stream.d.ts → parse.d.ts} +2 -2
- package/dist/{esm/modules/archive/unzip/stream.js → browser/modules/archive/parse.js} +5 -6
- package/dist/browser/modules/archive/{compression/streaming-compress.browser.d.ts → streaming-compress.browser.d.ts} +2 -2
- package/dist/browser/modules/archive/{compression/streaming-compress.browser.js → streaming-compress.browser.js} +3 -3
- package/dist/browser/modules/archive/{compression/streaming-compress.d.ts → streaming-compress.d.ts} +2 -2
- package/dist/browser/modules/archive/{compression/streaming-compress.js → streaming-compress.js} +2 -2
- package/dist/browser/modules/archive/{zip/stream.d.ts → streaming-zip.d.ts} +5 -28
- package/dist/{esm/modules/archive/zip/stream.js → browser/modules/archive/streaming-zip.js} +48 -192
- package/dist/browser/modules/archive/utils/bytes.js +16 -16
- package/dist/browser/modules/archive/utils/parse-buffer.js +23 -21
- package/dist/browser/modules/archive/utils/timestamps.js +1 -62
- package/dist/browser/modules/archive/utils/zip-extra-fields.d.ts +1 -1
- package/dist/browser/modules/archive/utils/zip-extra-fields.js +14 -26
- package/dist/browser/modules/archive/utils/zip-extra.d.ts +18 -0
- package/dist/browser/modules/archive/utils/zip-extra.js +68 -0
- package/dist/browser/modules/archive/zip-builder.d.ts +117 -0
- package/dist/browser/modules/archive/zip-builder.js +292 -0
- package/dist/browser/modules/archive/zip-constants.d.ts +18 -0
- package/dist/browser/modules/archive/zip-constants.js +23 -0
- package/dist/{esm/modules/archive/zip → browser/modules/archive}/zip-entry-metadata.js +3 -3
- package/dist/{types/modules/archive/unzip → browser/modules/archive}/zip-parser.d.ts +1 -1
- package/dist/{esm/modules/archive/unzip → browser/modules/archive}/zip-parser.js +24 -38
- package/dist/browser/modules/archive/{zip-spec/zip-records.d.ts → zip-records.d.ts} +0 -20
- package/dist/browser/modules/archive/zip-records.js +84 -0
- package/dist/browser/modules/excel/stream/workbook-reader.browser.js +1 -1
- package/dist/browser/modules/excel/stream/workbook-writer.browser.d.ts +1 -1
- package/dist/browser/modules/excel/stream/workbook-writer.browser.js +1 -1
- package/dist/browser/modules/excel/xlsx/xlsx.browser.js +6 -3
- package/dist/browser/modules/excel/xlsx/xlsx.js +1 -1
- package/dist/browser/modules/stream/streams.browser.d.ts +30 -28
- package/dist/browser/modules/stream/streams.browser.js +710 -830
- package/dist/browser/modules/stream/streams.js +58 -140
- package/dist/cjs/modules/archive/byte-queue.js +129 -0
- package/dist/cjs/modules/archive/{compression/compress.base.js → compress.base.js} +1 -1
- package/dist/cjs/modules/archive/{compression/compress.browser.js → compress.browser.js} +11 -3
- package/dist/cjs/modules/archive/{compression/compress.js → compress.js} +1 -1
- package/dist/cjs/modules/archive/{compression/crc32.js → crc32.js} +1 -1
- package/dist/cjs/modules/archive/defaults.js +4 -7
- package/dist/cjs/modules/archive/{compression/deflate-fallback.js → deflate-fallback.js} +1 -1
- package/dist/cjs/modules/archive/index.base.js +19 -9
- package/dist/cjs/modules/archive/index.browser.js +10 -4
- package/dist/cjs/modules/archive/index.js +8 -4
- package/dist/cjs/modules/archive/parse.base.js +666 -0
- package/dist/cjs/modules/archive/{unzip/stream.browser.js → parse.browser.js} +111 -372
- package/dist/cjs/modules/archive/{unzip/stream.js → parse.js} +8 -9
- package/dist/cjs/modules/archive/{compression/streaming-compress.browser.js → streaming-compress.browser.js} +3 -3
- package/dist/cjs/modules/archive/{compression/streaming-compress.js → streaming-compress.js} +2 -2
- package/dist/cjs/modules/archive/{zip/stream.js → streaming-zip.js} +50 -194
- package/dist/cjs/modules/archive/utils/bytes.js +16 -16
- package/dist/cjs/modules/archive/utils/parse-buffer.js +23 -21
- package/dist/cjs/modules/archive/utils/timestamps.js +3 -64
- package/dist/cjs/modules/archive/utils/zip-extra-fields.js +14 -26
- package/dist/cjs/modules/archive/utils/zip-extra.js +74 -0
- package/dist/cjs/modules/archive/zip-builder.js +297 -0
- package/dist/cjs/modules/archive/zip-constants.js +26 -0
- package/dist/cjs/modules/archive/{zip/zip-entry-metadata.js → zip-entry-metadata.js} +5 -5
- package/dist/cjs/modules/archive/{unzip/zip-parser.js → zip-parser.js} +33 -47
- package/dist/cjs/modules/archive/zip-records.js +90 -0
- package/dist/cjs/modules/excel/stream/workbook-reader.browser.js +2 -2
- package/dist/cjs/modules/excel/stream/workbook-writer.browser.js +4 -4
- package/dist/cjs/modules/excel/xlsx/xlsx.browser.js +9 -6
- package/dist/cjs/modules/excel/xlsx/xlsx.js +2 -2
- package/dist/cjs/modules/stream/streams.browser.js +710 -830
- package/dist/cjs/modules/stream/streams.js +58 -140
- package/dist/esm/index.browser.js +0 -12
- package/dist/esm/modules/archive/byte-queue.js +125 -0
- package/dist/esm/modules/archive/{compression/compress.base.js → compress.base.js} +1 -1
- package/dist/{browser/modules/archive/compression → esm/modules/archive}/compress.browser.js +11 -3
- package/dist/{browser/modules/archive/compression → esm/modules/archive}/compress.js +1 -1
- package/dist/esm/modules/archive/{compression/crc32.js → crc32.js} +1 -1
- package/dist/esm/modules/archive/defaults.js +3 -6
- package/dist/esm/modules/archive/{compression/deflate-fallback.js → deflate-fallback.js} +1 -1
- package/dist/esm/modules/archive/index.base.js +6 -3
- package/dist/esm/modules/archive/index.browser.js +7 -3
- package/dist/esm/modules/archive/index.js +5 -3
- package/dist/esm/modules/archive/parse.base.js +644 -0
- package/dist/{browser/modules/archive/unzip/stream.browser.js → esm/modules/archive/parse.browser.js} +110 -371
- package/dist/{browser/modules/archive/unzip/stream.js → esm/modules/archive/parse.js} +5 -6
- package/dist/esm/modules/archive/{compression/streaming-compress.browser.js → streaming-compress.browser.js} +3 -3
- package/dist/esm/modules/archive/{compression/streaming-compress.js → streaming-compress.js} +2 -2
- package/dist/{browser/modules/archive/zip/stream.js → esm/modules/archive/streaming-zip.js} +48 -192
- package/dist/esm/modules/archive/utils/bytes.js +16 -16
- package/dist/esm/modules/archive/utils/parse-buffer.js +23 -21
- package/dist/esm/modules/archive/utils/timestamps.js +1 -62
- package/dist/esm/modules/archive/utils/zip-extra-fields.js +14 -26
- package/dist/esm/modules/archive/utils/zip-extra.js +68 -0
- package/dist/esm/modules/archive/zip-builder.js +292 -0
- package/dist/esm/modules/archive/zip-constants.js +23 -0
- package/dist/{browser/modules/archive/zip → esm/modules/archive}/zip-entry-metadata.js +3 -3
- package/dist/{browser/modules/archive/unzip → esm/modules/archive}/zip-parser.js +24 -38
- package/dist/esm/modules/archive/zip-records.js +84 -0
- package/dist/esm/modules/excel/stream/workbook-reader.browser.js +1 -1
- package/dist/esm/modules/excel/stream/workbook-writer.browser.js +1 -1
- package/dist/esm/modules/excel/xlsx/xlsx.browser.js +6 -3
- package/dist/esm/modules/excel/xlsx/xlsx.js +1 -1
- package/dist/esm/modules/stream/streams.browser.js +710 -830
- package/dist/esm/modules/stream/streams.js +58 -140
- package/dist/iife/THIRD_PARTY_NOTICES.md +31 -0
- package/dist/iife/excelts.iife.js +4425 -6215
- package/dist/iife/excelts.iife.js.map +1 -1
- package/dist/iife/excelts.iife.min.js +31 -103
- package/dist/types/index.browser.d.ts +0 -1
- package/dist/types/modules/archive/byte-queue.d.ts +18 -0
- package/dist/types/modules/archive/{compression/compress.browser.d.ts → compress.browser.d.ts} +8 -2
- package/dist/types/modules/archive/defaults.d.ts +0 -1
- package/dist/types/modules/archive/index.base.d.ts +4 -4
- package/dist/types/modules/archive/index.browser.d.ts +4 -3
- package/dist/types/modules/archive/index.d.ts +4 -3
- package/dist/types/modules/archive/{unzip/stream.base.d.ts → parse.base.d.ts} +4 -38
- package/dist/types/modules/archive/{unzip/stream.browser.d.ts → parse.browser.d.ts} +2 -2
- package/dist/types/modules/archive/{unzip/stream.d.ts → parse.d.ts} +3 -3
- package/dist/types/modules/archive/{compression/streaming-compress.browser.d.ts → streaming-compress.browser.d.ts} +1 -1
- package/dist/types/modules/archive/{zip/stream.d.ts → streaming-zip.d.ts} +6 -29
- package/dist/types/modules/archive/utils/zip-extra-fields.d.ts +1 -1
- package/dist/types/modules/archive/utils/zip-extra.d.ts +18 -0
- package/dist/types/modules/archive/zip-builder.d.ts +117 -0
- package/dist/types/modules/archive/zip-constants.d.ts +18 -0
- package/dist/types/modules/archive/{zip/zip-entry-metadata.d.ts → zip-entry-metadata.d.ts} +1 -1
- package/dist/{browser/modules/archive/unzip → types/modules/archive}/zip-parser.d.ts +1 -1
- package/dist/types/modules/archive/{zip-spec/zip-records.d.ts → zip-records.d.ts} +0 -20
- package/dist/types/modules/excel/stream/workbook-writer.browser.d.ts +1 -1
- package/dist/types/modules/stream/streams.browser.d.ts +30 -28
- package/package.json +1 -5
- package/dist/browser/modules/archive/internal/byte-queue.d.ts +0 -33
- package/dist/browser/modules/archive/internal/byte-queue.js +0 -407
- package/dist/browser/modules/archive/io/archive-sink.d.ts +0 -9
- package/dist/browser/modules/archive/io/archive-sink.js +0 -77
- package/dist/browser/modules/archive/io/archive-source.d.ts +0 -8
- package/dist/browser/modules/archive/io/archive-source.js +0 -107
- package/dist/browser/modules/archive/unzip/index.d.ts +0 -40
- package/dist/browser/modules/archive/unzip/index.js +0 -164
- package/dist/browser/modules/archive/unzip/stream.base.js +0 -1022
- package/dist/browser/modules/archive/utils/async-queue.d.ts +0 -7
- package/dist/browser/modules/archive/utils/async-queue.js +0 -103
- package/dist/browser/modules/archive/utils/compressibility.d.ts +0 -10
- package/dist/browser/modules/archive/utils/compressibility.js +0 -57
- package/dist/browser/modules/archive/utils/pattern-scanner.d.ts +0 -21
- package/dist/browser/modules/archive/utils/pattern-scanner.js +0 -27
- package/dist/browser/modules/archive/zip/index.d.ts +0 -42
- package/dist/browser/modules/archive/zip/index.js +0 -157
- package/dist/browser/modules/archive/zip/zip-bytes.d.ts +0 -73
- package/dist/browser/modules/archive/zip/zip-bytes.js +0 -239
- package/dist/browser/modules/archive/zip-spec/zip-records.js +0 -126
- package/dist/cjs/modules/archive/internal/byte-queue.js +0 -411
- package/dist/cjs/modules/archive/io/archive-sink.js +0 -82
- package/dist/cjs/modules/archive/io/archive-source.js +0 -114
- package/dist/cjs/modules/archive/unzip/index.js +0 -170
- package/dist/cjs/modules/archive/unzip/stream.base.js +0 -1044
- package/dist/cjs/modules/archive/utils/async-queue.js +0 -106
- package/dist/cjs/modules/archive/utils/compressibility.js +0 -60
- package/dist/cjs/modules/archive/utils/pattern-scanner.js +0 -31
- package/dist/cjs/modules/archive/zip/index.js +0 -162
- package/dist/cjs/modules/archive/zip/zip-bytes.js +0 -242
- package/dist/cjs/modules/archive/zip-spec/zip-records.js +0 -136
- package/dist/esm/modules/archive/internal/byte-queue.js +0 -407
- package/dist/esm/modules/archive/io/archive-sink.js +0 -77
- package/dist/esm/modules/archive/io/archive-source.js +0 -107
- package/dist/esm/modules/archive/unzip/index.js +0 -164
- package/dist/esm/modules/archive/unzip/stream.base.js +0 -1022
- package/dist/esm/modules/archive/utils/async-queue.js +0 -103
- package/dist/esm/modules/archive/utils/compressibility.js +0 -57
- package/dist/esm/modules/archive/utils/pattern-scanner.js +0 -27
- package/dist/esm/modules/archive/zip/index.js +0 -157
- package/dist/esm/modules/archive/zip/zip-bytes.js +0 -239
- package/dist/esm/modules/archive/zip-spec/zip-records.js +0 -126
- package/dist/types/modules/archive/internal/byte-queue.d.ts +0 -33
- package/dist/types/modules/archive/io/archive-sink.d.ts +0 -9
- package/dist/types/modules/archive/io/archive-source.d.ts +0 -8
- package/dist/types/modules/archive/unzip/index.d.ts +0 -40
- package/dist/types/modules/archive/utils/async-queue.d.ts +0 -7
- package/dist/types/modules/archive/utils/compressibility.d.ts +0 -10
- package/dist/types/modules/archive/utils/pattern-scanner.d.ts +0 -21
- package/dist/types/modules/archive/zip/index.d.ts +0 -42
- package/dist/types/modules/archive/zip/zip-bytes.d.ts +0 -73
- /package/dist/browser/modules/archive/{compression/compress.base.d.ts → compress.base.d.ts} +0 -0
- /package/dist/browser/modules/archive/{compression/crc32.base.d.ts → crc32.base.d.ts} +0 -0
- /package/dist/browser/modules/archive/{compression/crc32.base.js → crc32.base.js} +0 -0
- /package/dist/browser/modules/archive/{compression/crc32.browser.js → crc32.browser.js} +0 -0
- /package/dist/browser/modules/archive/{compression/deflate-fallback.d.ts → deflate-fallback.d.ts} +0 -0
- /package/dist/browser/modules/archive/{unzip/extract.js → extract.js} +0 -0
- /package/dist/browser/modules/archive/{compression/streaming-compress.base.d.ts → streaming-compress.base.d.ts} +0 -0
- /package/dist/browser/modules/archive/{compression/streaming-compress.base.js → streaming-compress.base.js} +0 -0
- /package/dist/browser/modules/archive/{zip-spec/zip-entry-info.d.ts → zip-entry-info.d.ts} +0 -0
- /package/dist/browser/modules/archive/{zip-spec/zip-entry-info.js → zip-entry-info.js} +0 -0
- /package/dist/browser/modules/archive/{zip/zip-entry-metadata.d.ts → zip-entry-metadata.d.ts} +0 -0
- /package/dist/cjs/modules/archive/{compression/crc32.base.js → crc32.base.js} +0 -0
- /package/dist/cjs/modules/archive/{compression/crc32.browser.js → crc32.browser.js} +0 -0
- /package/dist/cjs/modules/archive/{unzip/extract.js → extract.js} +0 -0
- /package/dist/cjs/modules/archive/{compression/streaming-compress.base.js → streaming-compress.base.js} +0 -0
- /package/dist/cjs/modules/archive/{zip-spec/zip-entry-info.js → zip-entry-info.js} +0 -0
- /package/dist/esm/modules/archive/{compression/crc32.base.js → crc32.base.js} +0 -0
- /package/dist/esm/modules/archive/{compression/crc32.browser.js → crc32.browser.js} +0 -0
- /package/dist/esm/modules/archive/{unzip/extract.js → extract.js} +0 -0
- /package/dist/esm/modules/archive/{compression/streaming-compress.base.js → streaming-compress.base.js} +0 -0
- /package/dist/esm/modules/archive/{zip-spec/zip-entry-info.js → zip-entry-info.js} +0 -0
- /package/dist/types/modules/archive/{compression/compress.base.d.ts → compress.base.d.ts} +0 -0
- /package/dist/types/modules/archive/{compression/compress.d.ts → compress.d.ts} +0 -0
- /package/dist/types/modules/archive/{compression/crc32.base.d.ts → crc32.base.d.ts} +0 -0
- /package/dist/types/modules/archive/{compression/crc32.browser.d.ts → crc32.browser.d.ts} +0 -0
- /package/dist/types/modules/archive/{compression/crc32.d.ts → crc32.d.ts} +0 -0
- /package/dist/types/modules/archive/{compression/deflate-fallback.d.ts → deflate-fallback.d.ts} +0 -0
- /package/dist/types/modules/archive/{unzip/extract.d.ts → extract.d.ts} +0 -0
- /package/dist/types/modules/archive/{compression/streaming-compress.base.d.ts → streaming-compress.base.d.ts} +0 -0
- /package/dist/types/modules/archive/{compression/streaming-compress.d.ts → streaming-compress.d.ts} +0 -0
- /package/dist/types/modules/archive/{zip-spec/zip-entry-info.d.ts → zip-entry-info.d.ts} +0 -0
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
export function createAsyncQueue() {
|
|
2
|
-
const values = [];
|
|
3
|
-
let valuesHead = 0;
|
|
4
|
-
const waiters = [];
|
|
5
|
-
let waitersHead = 0;
|
|
6
|
-
let done = false;
|
|
7
|
-
let error = null;
|
|
8
|
-
const maybeCompact = () => {
|
|
9
|
-
// Prevent unbounded growth of the underlying arrays.
|
|
10
|
-
if (valuesHead > 1024 && valuesHead * 2 > values.length) {
|
|
11
|
-
values.splice(0, valuesHead);
|
|
12
|
-
valuesHead = 0;
|
|
13
|
-
}
|
|
14
|
-
if (waitersHead > 1024 && waitersHead * 2 > waiters.length) {
|
|
15
|
-
waiters.splice(0, waitersHead);
|
|
16
|
-
waitersHead = 0;
|
|
17
|
-
}
|
|
18
|
-
};
|
|
19
|
-
const shiftWaiter = () => {
|
|
20
|
-
while (waitersHead < waiters.length) {
|
|
21
|
-
const w = waiters[waitersHead];
|
|
22
|
-
waiters[waitersHead] = undefined;
|
|
23
|
-
waitersHead++;
|
|
24
|
-
if (w) {
|
|
25
|
-
maybeCompact();
|
|
26
|
-
return w;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
maybeCompact();
|
|
30
|
-
return undefined;
|
|
31
|
-
};
|
|
32
|
-
const shiftValue = () => {
|
|
33
|
-
while (valuesHead < values.length) {
|
|
34
|
-
const v = values[valuesHead];
|
|
35
|
-
values[valuesHead] = undefined;
|
|
36
|
-
valuesHead++;
|
|
37
|
-
if (v !== undefined) {
|
|
38
|
-
maybeCompact();
|
|
39
|
-
return v;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
maybeCompact();
|
|
43
|
-
return undefined;
|
|
44
|
-
};
|
|
45
|
-
const push = (value) => {
|
|
46
|
-
if (done || error) {
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
const waiter = shiftWaiter();
|
|
50
|
-
if (waiter) {
|
|
51
|
-
waiter.resolve({ value, done: false });
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
values.push(value);
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
const fail = (err) => {
|
|
58
|
-
if (done || error) {
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
error = err;
|
|
62
|
-
while (true) {
|
|
63
|
-
const waiter = shiftWaiter();
|
|
64
|
-
if (!waiter) {
|
|
65
|
-
break;
|
|
66
|
-
}
|
|
67
|
-
waiter.reject(err);
|
|
68
|
-
}
|
|
69
|
-
};
|
|
70
|
-
const close = () => {
|
|
71
|
-
if (done || error) {
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
done = true;
|
|
75
|
-
while (true) {
|
|
76
|
-
const waiter = shiftWaiter();
|
|
77
|
-
if (!waiter) {
|
|
78
|
-
break;
|
|
79
|
-
}
|
|
80
|
-
waiter.resolve({ value: undefined, done: true });
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
const iterable = {
|
|
84
|
-
[Symbol.asyncIterator]() {
|
|
85
|
-
return {
|
|
86
|
-
next() {
|
|
87
|
-
if (error) {
|
|
88
|
-
return Promise.reject(error);
|
|
89
|
-
}
|
|
90
|
-
const value = shiftValue();
|
|
91
|
-
if (value !== undefined) {
|
|
92
|
-
return Promise.resolve({ value, done: false });
|
|
93
|
-
}
|
|
94
|
-
if (done) {
|
|
95
|
-
return Promise.resolve({ value: undefined, done: true });
|
|
96
|
-
}
|
|
97
|
-
return new Promise((resolve, reject) => waiters.push({ resolve, reject }));
|
|
98
|
-
}
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
};
|
|
102
|
-
return { push, fail, close, iterable };
|
|
103
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Heuristic: detect incompressible (high-entropy) data.
|
|
3
|
-
*
|
|
4
|
-
* This is a performance optimization: if data looks random, DEFLATE usually
|
|
5
|
-
* wastes CPU and may even produce slightly larger output.
|
|
6
|
-
*/
|
|
7
|
-
export declare function isProbablyIncompressible(data: Uint8Array, options?: {
|
|
8
|
-
sampleBytes?: number;
|
|
9
|
-
minDecisionBytes?: number;
|
|
10
|
-
}): boolean;
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
const DEFAULT_SAMPLE_BYTES = 64 * 1024;
|
|
2
|
-
const MIN_DECISION_BYTES = 16 * 1024;
|
|
3
|
-
function log2(x) {
|
|
4
|
-
return Math.log(x) / Math.LN2;
|
|
5
|
-
}
|
|
6
|
-
function shannonEntropy(bytes) {
|
|
7
|
-
const counts = new Uint32Array(256);
|
|
8
|
-
for (let i = 0; i < bytes.length; i++) {
|
|
9
|
-
counts[bytes[i]] += 1;
|
|
10
|
-
}
|
|
11
|
-
let entropy = 0;
|
|
12
|
-
const total = bytes.length;
|
|
13
|
-
for (let i = 0; i < 256; i++) {
|
|
14
|
-
const count = counts[i];
|
|
15
|
-
if (count === 0) {
|
|
16
|
-
continue;
|
|
17
|
-
}
|
|
18
|
-
const p = count / total;
|
|
19
|
-
entropy -= p * log2(p);
|
|
20
|
-
}
|
|
21
|
-
return entropy;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Heuristic: detect incompressible (high-entropy) data.
|
|
25
|
-
*
|
|
26
|
-
* This is a performance optimization: if data looks random, DEFLATE usually
|
|
27
|
-
* wastes CPU and may even produce slightly larger output.
|
|
28
|
-
*/
|
|
29
|
-
export function isProbablyIncompressible(data, options = {}) {
|
|
30
|
-
const sampleBytes = options.sampleBytes ?? DEFAULT_SAMPLE_BYTES;
|
|
31
|
-
const minDecisionBytes = options.minDecisionBytes ?? MIN_DECISION_BYTES;
|
|
32
|
-
const len = Math.min(data.length, sampleBytes);
|
|
33
|
-
if (len < minDecisionBytes) {
|
|
34
|
-
return false;
|
|
35
|
-
}
|
|
36
|
-
const sample = data.subarray(0, len);
|
|
37
|
-
// Fast-ish early filter: if there are too few unique bytes, it's probably compressible.
|
|
38
|
-
// (e.g. text, repeated patterns)
|
|
39
|
-
const seen = new Uint8Array(256);
|
|
40
|
-
let unique = 0;
|
|
41
|
-
for (let i = 0; i < sample.length; i++) {
|
|
42
|
-
const b = sample[i];
|
|
43
|
-
if (seen[b] === 0) {
|
|
44
|
-
seen[b] = 1;
|
|
45
|
-
unique += 1;
|
|
46
|
-
if (unique >= 200) {
|
|
47
|
-
break;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
if (unique < 200) {
|
|
52
|
-
return false;
|
|
53
|
-
}
|
|
54
|
-
// Shannon entropy in bits/byte; random tends to ~8.
|
|
55
|
-
// Threshold picked to be conservative.
|
|
56
|
-
return shannonEntropy(sample) >= 7.95;
|
|
57
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
export interface PatternSearchTarget {
|
|
2
|
-
indexOfPattern(pattern: Uint8Array, startIndex: number): number;
|
|
3
|
-
}
|
|
4
|
-
/**
|
|
5
|
-
* Stateful helper for incremental pattern scanning in growing buffers.
|
|
6
|
-
*
|
|
7
|
-
* The scanner tracks a `searchFrom` cursor and an `overlap` region so callers
|
|
8
|
-
* can avoid rescanning bytes that cannot start a match.
|
|
9
|
-
*/
|
|
10
|
-
export declare class PatternScanner {
|
|
11
|
-
readonly pattern: Uint8Array;
|
|
12
|
-
readonly overlap: number;
|
|
13
|
-
searchFrom: number;
|
|
14
|
-
constructor(pattern: Uint8Array);
|
|
15
|
-
/** Find the next match index starting at the current `searchFrom`. */
|
|
16
|
-
find(target: PatternSearchTarget): number;
|
|
17
|
-
/** Update `searchFrom` after consuming `consumed` bytes from the front. */
|
|
18
|
-
onConsume(consumed: number): void;
|
|
19
|
-
/** Update `searchFrom` after a no-match scan on a buffer of length `bufferLength`. */
|
|
20
|
-
onNoMatch(bufferLength: number): void;
|
|
21
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Stateful helper for incremental pattern scanning in growing buffers.
|
|
3
|
-
*
|
|
4
|
-
* The scanner tracks a `searchFrom` cursor and an `overlap` region so callers
|
|
5
|
-
* can avoid rescanning bytes that cannot start a match.
|
|
6
|
-
*/
|
|
7
|
-
export class PatternScanner {
|
|
8
|
-
constructor(pattern) {
|
|
9
|
-
this.searchFrom = 0;
|
|
10
|
-
this.pattern = pattern;
|
|
11
|
-
this.overlap = Math.max(0, pattern.length - 1);
|
|
12
|
-
}
|
|
13
|
-
/** Find the next match index starting at the current `searchFrom`. */
|
|
14
|
-
find(target) {
|
|
15
|
-
return target.indexOfPattern(this.pattern, this.searchFrom);
|
|
16
|
-
}
|
|
17
|
-
/** Update `searchFrom` after consuming `consumed` bytes from the front. */
|
|
18
|
-
onConsume(consumed) {
|
|
19
|
-
if (consumed > 0) {
|
|
20
|
-
this.searchFrom = Math.max(0, this.searchFrom - consumed);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
/** Update `searchFrom` after a no-match scan on a buffer of length `bufferLength`. */
|
|
24
|
-
onNoMatch(bufferLength) {
|
|
25
|
-
this.searchFrom = Math.max(this.searchFrom, Math.max(0, bufferLength - this.overlap));
|
|
26
|
-
}
|
|
27
|
-
}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import type { ZipTimestampMode } from "@archive/utils/timestamps";
|
|
2
|
-
import { type ArchiveSink } from "@archive/io/archive-sink";
|
|
3
|
-
import { type ArchiveSource } from "@archive/io/archive-source";
|
|
4
|
-
export interface ZipOptions {
|
|
5
|
-
level?: number;
|
|
6
|
-
timestamps?: ZipTimestampMode;
|
|
7
|
-
comment?: string;
|
|
8
|
-
/**
|
|
9
|
-
* Default modification time for entries that don't specify `modTime`.
|
|
10
|
-
*
|
|
11
|
-
* If you need stable output across runs, either pass this explicitly or use `reproducible: true`.
|
|
12
|
-
*/
|
|
13
|
-
modTime?: Date;
|
|
14
|
-
/**
|
|
15
|
-
* If true, bias defaults toward reproducible output:
|
|
16
|
-
* - default `modTime` becomes 1980-01-01 00:00:00 (local time)
|
|
17
|
-
* - default `timestamps` becomes "dos" (no UTC extra field)
|
|
18
|
-
*/
|
|
19
|
-
reproducible?: boolean;
|
|
20
|
-
/**
|
|
21
|
-
* If true (default), automatically STORE incompressible data.
|
|
22
|
-
* If false, always follow `level` (DEFLATE when level > 0).
|
|
23
|
-
*/
|
|
24
|
-
smartStore?: boolean;
|
|
25
|
-
}
|
|
26
|
-
export interface ZipEntryOptions {
|
|
27
|
-
level?: number;
|
|
28
|
-
modTime?: Date;
|
|
29
|
-
comment?: string;
|
|
30
|
-
}
|
|
31
|
-
export declare class ZipArchive {
|
|
32
|
-
private readonly _options;
|
|
33
|
-
private readonly _entries;
|
|
34
|
-
private _sealed;
|
|
35
|
-
constructor(options?: ZipOptions);
|
|
36
|
-
add(name: string, source: ArchiveSource, options?: ZipEntryOptions): this;
|
|
37
|
-
stream(): AsyncIterable<Uint8Array>;
|
|
38
|
-
bytes(): Promise<Uint8Array>;
|
|
39
|
-
bytesSync(): Uint8Array;
|
|
40
|
-
pipeTo(sink: ArchiveSink): Promise<void>;
|
|
41
|
-
}
|
|
42
|
-
export declare function zip(options?: ZipOptions): ZipArchive;
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
import { DEFAULT_ZIP_LEVEL, DEFAULT_ZIP_TIMESTAMPS } from "../defaults.js";
|
|
2
|
-
import { ZipDeflateFile, StreamingZip } from "./stream.js";
|
|
3
|
-
import { createZip, createZipSync } from "./zip-bytes.js";
|
|
4
|
-
import { collect, pipeIterableToSink } from "../io/archive-sink.js";
|
|
5
|
-
import { toAsyncIterable, toUint8Array, toUint8ArraySync } from "../io/archive-source.js";
|
|
6
|
-
import { createAsyncQueue } from "../utils/async-queue.js";
|
|
7
|
-
const REPRODUCIBLE_ZIP_MOD_TIME = new Date(1980, 0, 1, 0, 0, 0);
|
|
8
|
-
export class ZipArchive {
|
|
9
|
-
constructor(options = {}) {
|
|
10
|
-
this._entries = [];
|
|
11
|
-
this._sealed = false;
|
|
12
|
-
const reproducible = options.reproducible ?? false;
|
|
13
|
-
this._options = {
|
|
14
|
-
level: options.level ?? DEFAULT_ZIP_LEVEL,
|
|
15
|
-
timestamps: options.timestamps ?? (reproducible ? "dos" : DEFAULT_ZIP_TIMESTAMPS),
|
|
16
|
-
comment: options.comment,
|
|
17
|
-
modTime: options.modTime ?? (reproducible ? REPRODUCIBLE_ZIP_MOD_TIME : new Date()),
|
|
18
|
-
smartStore: options.smartStore ?? true
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
add(name, source, options) {
|
|
22
|
-
if (this._sealed) {
|
|
23
|
-
throw new Error("Cannot add entries after output has started");
|
|
24
|
-
}
|
|
25
|
-
if (!name) {
|
|
26
|
-
throw new Error("Entry name is required");
|
|
27
|
-
}
|
|
28
|
-
this._entries.push({ name, source, options });
|
|
29
|
-
return this;
|
|
30
|
-
}
|
|
31
|
-
stream() {
|
|
32
|
-
this._sealed = true;
|
|
33
|
-
const queue = createAsyncQueue();
|
|
34
|
-
const zip = new StreamingZip((err, data, final) => {
|
|
35
|
-
if (err) {
|
|
36
|
-
queue.fail(err);
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
if (data.length) {
|
|
40
|
-
queue.push(data);
|
|
41
|
-
}
|
|
42
|
-
if (final) {
|
|
43
|
-
queue.close();
|
|
44
|
-
}
|
|
45
|
-
}, { comment: this._options.comment });
|
|
46
|
-
(async () => {
|
|
47
|
-
try {
|
|
48
|
-
for (const entry of this._entries) {
|
|
49
|
-
const level = entry.options?.level ?? this._options.level;
|
|
50
|
-
const file = new ZipDeflateFile(entry.name, {
|
|
51
|
-
level,
|
|
52
|
-
modTime: entry.options?.modTime ?? this._options.modTime,
|
|
53
|
-
timestamps: this._options.timestamps,
|
|
54
|
-
comment: entry.options?.comment,
|
|
55
|
-
smartStore: this._options.smartStore
|
|
56
|
-
});
|
|
57
|
-
zip.add(file);
|
|
58
|
-
// Feed data
|
|
59
|
-
if (entry.source instanceof Uint8Array ||
|
|
60
|
-
entry.source instanceof ArrayBuffer ||
|
|
61
|
-
typeof entry.source === "string" ||
|
|
62
|
-
(typeof Blob !== "undefined" && entry.source instanceof Blob)) {
|
|
63
|
-
const bytes = await toUint8Array(entry.source);
|
|
64
|
-
await file.push(bytes, true);
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
for await (const chunk of toAsyncIterable(entry.source)) {
|
|
68
|
-
await file.push(chunk, false);
|
|
69
|
-
}
|
|
70
|
-
await file.push(new Uint8Array(0), true);
|
|
71
|
-
}
|
|
72
|
-
await file.complete();
|
|
73
|
-
}
|
|
74
|
-
zip.end();
|
|
75
|
-
}
|
|
76
|
-
catch (e) {
|
|
77
|
-
queue.fail(e instanceof Error ? e : new Error(String(e)));
|
|
78
|
-
}
|
|
79
|
-
})();
|
|
80
|
-
return queue.iterable;
|
|
81
|
-
}
|
|
82
|
-
async bytes() {
|
|
83
|
-
this._sealed = true;
|
|
84
|
-
const allSourcesInMemory = this._entries.every(e => e.source instanceof Uint8Array ||
|
|
85
|
-
e.source instanceof ArrayBuffer ||
|
|
86
|
-
typeof e.source === "string" ||
|
|
87
|
-
(typeof Blob !== "undefined" && e.source instanceof Blob));
|
|
88
|
-
const hasBlobSource = this._entries.some(e => typeof Blob !== "undefined" && e.source instanceof Blob);
|
|
89
|
-
// Fast-path: when all sources are already in memory and there are no
|
|
90
|
-
// per-entry compression overrides, use the single-buffer ZIP builder.
|
|
91
|
-
// This avoids the overhead of chunking + collecting from the streaming writer.
|
|
92
|
-
if (allSourcesInMemory) {
|
|
93
|
-
// Prefer the sync builder when possible (Node.js hot path): it avoids
|
|
94
|
-
// async/Promise overhead and uses zlib sync fast paths.
|
|
95
|
-
if (!hasBlobSource) {
|
|
96
|
-
const entries = this._entries.map(e => ({
|
|
97
|
-
name: e.name,
|
|
98
|
-
data: toUint8ArraySync(e.source),
|
|
99
|
-
level: e.options?.level,
|
|
100
|
-
modTime: e.options?.modTime,
|
|
101
|
-
comment: e.options?.comment
|
|
102
|
-
}));
|
|
103
|
-
return createZipSync(entries, {
|
|
104
|
-
level: this._options.level,
|
|
105
|
-
timestamps: this._options.timestamps,
|
|
106
|
-
modTime: this._options.modTime,
|
|
107
|
-
comment: this._options.comment,
|
|
108
|
-
smartStore: this._options.smartStore
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
const entries = await Promise.all(this._entries.map(async (e) => ({
|
|
112
|
-
name: e.name,
|
|
113
|
-
data: await toUint8Array(e.source),
|
|
114
|
-
level: e.options?.level,
|
|
115
|
-
modTime: e.options?.modTime,
|
|
116
|
-
comment: e.options?.comment
|
|
117
|
-
})));
|
|
118
|
-
return createZip(entries, {
|
|
119
|
-
level: this._options.level,
|
|
120
|
-
timestamps: this._options.timestamps,
|
|
121
|
-
modTime: this._options.modTime,
|
|
122
|
-
comment: this._options.comment,
|
|
123
|
-
smartStore: this._options.smartStore
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
return collect(this.stream());
|
|
127
|
-
}
|
|
128
|
-
bytesSync() {
|
|
129
|
-
this._sealed = true;
|
|
130
|
-
const entries = this._entries.map(e => {
|
|
131
|
-
if (!(e.source instanceof Uint8Array) &&
|
|
132
|
-
!(e.source instanceof ArrayBuffer) &&
|
|
133
|
-
typeof e.source !== "string") {
|
|
134
|
-
throw new Error("bytesSync() only supports Uint8Array/ArrayBuffer/string sources");
|
|
135
|
-
}
|
|
136
|
-
return {
|
|
137
|
-
name: e.name,
|
|
138
|
-
data: toUint8ArraySync(e.source),
|
|
139
|
-
modTime: e.options?.modTime,
|
|
140
|
-
comment: e.options?.comment
|
|
141
|
-
};
|
|
142
|
-
});
|
|
143
|
-
return createZipSync(entries, {
|
|
144
|
-
level: this._options.level,
|
|
145
|
-
timestamps: this._options.timestamps,
|
|
146
|
-
modTime: this._options.modTime,
|
|
147
|
-
comment: this._options.comment,
|
|
148
|
-
smartStore: this._options.smartStore
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
async pipeTo(sink) {
|
|
152
|
-
await pipeIterableToSink(this.stream(), sink);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
export function zip(options) {
|
|
156
|
-
return new ZipArchive(options);
|
|
157
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ZIP file format encoder (single-buffer output)
|
|
3
|
-
*
|
|
4
|
-
* Implements ZIP file structure according to PKWARE's APPNOTE.TXT specification
|
|
5
|
-
* https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT
|
|
6
|
-
*
|
|
7
|
-
* This module focuses on producing a complete ZIP as a single Uint8Array.
|
|
8
|
-
* For true streaming (push chunks while reading sources), use `zip()` / `ZipArchive.stream()`.
|
|
9
|
-
*/
|
|
10
|
-
import { type CompressOptions } from "@archive/compression/compress";
|
|
11
|
-
import { type ZipTimestampMode } from "@archive/utils/timestamps";
|
|
12
|
-
/**
|
|
13
|
-
* ZIP file entry
|
|
14
|
-
*/
|
|
15
|
-
export interface ZipEntry {
|
|
16
|
-
/** File name (can include directory path, use forward slashes) */
|
|
17
|
-
name: string;
|
|
18
|
-
/** File data (will be compressed unless level=0) */
|
|
19
|
-
data: Uint8Array;
|
|
20
|
-
/** Optional per-entry compression level override */
|
|
21
|
-
level?: number;
|
|
22
|
-
/** File modification time (optional, defaults to current time) */
|
|
23
|
-
modTime?: Date;
|
|
24
|
-
/** File comment (optional) */
|
|
25
|
-
comment?: string;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* ZIP encoder options
|
|
29
|
-
*/
|
|
30
|
-
export interface ZipOptions extends CompressOptions {
|
|
31
|
-
/** ZIP file comment (optional) */
|
|
32
|
-
comment?: string;
|
|
33
|
-
/**
|
|
34
|
-
* Default modification time for entries that don't specify `modTime`.
|
|
35
|
-
*
|
|
36
|
-
* If you need stable output across runs, either pass this explicitly or use `reproducible: true`.
|
|
37
|
-
*/
|
|
38
|
-
modTime?: Date;
|
|
39
|
-
/**
|
|
40
|
-
* If true, bias defaults toward reproducible output:
|
|
41
|
-
* - default `modTime` becomes 1980-01-01 00:00:00 (local time)
|
|
42
|
-
* - default `timestamps` becomes "dos" (no UTC extra field)
|
|
43
|
-
*/
|
|
44
|
-
reproducible?: boolean;
|
|
45
|
-
/**
|
|
46
|
-
* Max number of entries to compress concurrently in `createZip()`.
|
|
47
|
-
* This helps avoid zlib threadpool saturation / memory spikes with many files.
|
|
48
|
-
*
|
|
49
|
-
* Defaults to 4.
|
|
50
|
-
*/
|
|
51
|
-
concurrency?: number;
|
|
52
|
-
/**
|
|
53
|
-
* If true (default), automatically STORE incompressible data.
|
|
54
|
-
* If false, always follow `level` (DEFLATE when level > 0).
|
|
55
|
-
*/
|
|
56
|
-
smartStore?: boolean;
|
|
57
|
-
/**
|
|
58
|
-
* Timestamp writing strategy.
|
|
59
|
-
* - "dos": only write DOS date/time fields (smallest output)
|
|
60
|
-
* - "dos+utc": also write UTC mtime in 0x5455 extra field
|
|
61
|
-
*/
|
|
62
|
-
timestamps?: ZipTimestampMode;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Create a ZIP file from entries (async)
|
|
66
|
-
*/
|
|
67
|
-
export declare function createZip(entries: ZipEntry[], options?: ZipOptions): Promise<Uint8Array>;
|
|
68
|
-
/**
|
|
69
|
-
* Create a ZIP file from entries (sync)
|
|
70
|
-
*
|
|
71
|
-
* This is supported in both Node.js and browser builds.
|
|
72
|
-
*/
|
|
73
|
-
export declare function createZipSync(entries: ZipEntry[], options?: ZipOptions): Uint8Array;
|