@zip.js/zip.js 2.19.0 → 2.20.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/BENCHMARKS.md +154 -130
- package/deno.json +1 -1
- package/dist/zip-core-external.js +140 -41
- package/dist/zip-core-external.min.js +1 -1
- package/dist/zip-core.js +141 -40
- package/dist/zip-core.min.js +1 -1
- package/dist/zip-fs-core-external.js +140 -41
- package/dist/zip-fs-core-external.min.js +1 -1
- package/dist/zip-fs-core.js +141 -40
- package/dist/zip-fs-core.min.js +1 -1
- package/dist/zip-fs-external.js +140 -41
- package/dist/zip-fs-external.min.js +1 -1
- package/dist/zip-fs-native.js +141 -40
- package/dist/zip-fs-native.min.js +1 -1
- package/dist/zip-fs.js +141 -40
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-legacy.js +141 -40
- package/dist/zip-legacy.min.js +1 -1
- package/dist/zip-native.js +141 -40
- package/dist/zip-native.min.js +1 -1
- package/dist/zip.js +141 -40
- package/dist/zip.min.js +1 -1
- package/index-native.cjs +141 -40
- package/index-native.min.js +1 -1
- package/index.cjs +141 -40
- package/index.d.cts +70 -10
- package/index.d.ts +70 -10
- package/index.min.js +1 -1
- package/lib/core/version.js +1 -1
- package/lib/core/zip-reader.js +80 -18
- package/lib/core/zip-writer.js +57 -20
- package/lib/zip-core-reader.js +2 -0
- package/package.json +1 -1
|
@@ -4814,6 +4814,8 @@ const WARNING_APPENDED_DATA = "appended data";
|
|
|
4814
4814
|
const WARNING_PREPENDED_DATA = "prepended data";
|
|
4815
4815
|
const WARNING_PREPENDED_CENTRAL_DIRECTORY = "prepended central directory";
|
|
4816
4816
|
const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
|
|
4817
|
+
const WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET = "mismatched central directory offset";
|
|
4818
|
+
const WARNING_MISSING_ZIP64_EXTRA_FIELD = "missing zip64 extra field";
|
|
4817
4819
|
const WARNING_DUPLICATE_FILENAME = "duplicate filename";
|
|
4818
4820
|
const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
|
|
4819
4821
|
const WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = "multiple end of central directory records";
|
|
@@ -4976,6 +4978,8 @@ class ZipReader {
|
|
|
4976
4978
|
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4977
4979
|
}
|
|
4978
4980
|
directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
|
|
4981
|
+
} else if (directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || diskNumber == MAX_16_BITS) {
|
|
4982
|
+
throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
|
|
4979
4983
|
}
|
|
4980
4984
|
}
|
|
4981
4985
|
let declaredDirectoryDataLength = directoryDataLength;
|
|
@@ -4998,25 +5002,44 @@ class ZipReader {
|
|
|
4998
5002
|
if (directoryArray.length < 4) {
|
|
4999
5003
|
throw new Error(ERR_BAD_FORMAT);
|
|
5000
5004
|
}
|
|
5001
|
-
|
|
5005
|
+
let expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
|
|
5002
5006
|
if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
|
|
5003
5007
|
const storedPointsAtDirectory = getUint32$1(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE ||
|
|
5004
5008
|
Boolean(directoryEncryptionInfo && directoryEncryptionInfo.compressedSize) ||
|
|
5005
5009
|
detectEncryptedCentralDirectory(directoryView);
|
|
5006
5010
|
let reconcile = !storedPointsAtDirectory;
|
|
5007
|
-
if (
|
|
5008
|
-
const
|
|
5009
|
-
|
|
5011
|
+
if (expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
|
|
5012
|
+
const expectedPointsAtDirectory = await pointsAtDirectory(reader, expectedDirectoryDataOffset);
|
|
5013
|
+
if (storedPointsAtDirectory) {
|
|
5014
|
+
reconcile = expectedPointsAtDirectory;
|
|
5015
|
+
} else if (!expectedPointsAtDirectory) {
|
|
5016
|
+
const signatureRecordOffset = await findDigitalSignatureRecordOffset(reader, centralDirectoryEndOffset);
|
|
5017
|
+
const signedDirectoryDataOffset = signatureRecordOffset - directoryDataLength;
|
|
5018
|
+
if (signatureRecordOffset !== UNDEFINED_VALUE && signedDirectoryDataOffset >= 0 &&
|
|
5019
|
+
await pointsAtDirectory(reader, signedDirectoryDataOffset)) {
|
|
5020
|
+
expectedDirectoryDataOffset = signedDirectoryDataOffset;
|
|
5021
|
+
}
|
|
5022
|
+
}
|
|
5010
5023
|
}
|
|
5011
5024
|
if (reconcile) {
|
|
5012
5025
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
5013
5026
|
directoryDataOffset = expectedDirectoryDataOffset;
|
|
5027
|
+
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
|
|
5028
|
+
directoryView = getDataView(directoryArray);
|
|
5014
5029
|
if (directoryDataOffset > originalDirectoryDataOffset) {
|
|
5015
5030
|
prependedDataLength += directoryDataOffset - originalDirectoryDataOffset;
|
|
5016
5031
|
prependedCentralDirectory = storedPointsAtDirectory;
|
|
5032
|
+
} else {
|
|
5033
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET);
|
|
5034
|
+
const offsetDelta = directoryDataOffset - originalDirectoryDataOffset;
|
|
5035
|
+
if (directoryArray.length >= CENTRAL_FILE_HEADER_LENGTH) {
|
|
5036
|
+
const localHeaderOffset = getUint32$1(directoryView, 42);
|
|
5037
|
+
if (!await startsWithSignature(reader, localHeaderOffset, LOCAL_FILE_HEADER_SIGNATURE) &&
|
|
5038
|
+
await startsWithSignature(reader, localHeaderOffset + offsetDelta, LOCAL_FILE_HEADER_SIGNATURE)) {
|
|
5039
|
+
prependedDataLength += offsetDelta;
|
|
5040
|
+
}
|
|
5041
|
+
}
|
|
5017
5042
|
}
|
|
5018
|
-
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
|
|
5019
|
-
directoryView = getDataView(directoryArray);
|
|
5020
5043
|
}
|
|
5021
5044
|
}
|
|
5022
5045
|
}
|
|
@@ -5127,7 +5150,16 @@ class ZipReader {
|
|
|
5127
5150
|
filename,
|
|
5128
5151
|
comment
|
|
5129
5152
|
});
|
|
5130
|
-
|
|
5153
|
+
let malformedExtraField;
|
|
5154
|
+
try {
|
|
5155
|
+
malformedExtraField = readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
|
|
5156
|
+
} catch (error) {
|
|
5157
|
+
if (checkAmbiguity || error.message != ERR_EXTRAFIELD_ZIP64_NOT_FOUND) {
|
|
5158
|
+
throw error;
|
|
5159
|
+
}
|
|
5160
|
+
fileEntry.zip64ExtraFieldMissing = true;
|
|
5161
|
+
addWarning(warnings, WARNING_MISSING_ZIP64_EXTRA_FIELD, fileEntry.filename);
|
|
5162
|
+
}
|
|
5131
5163
|
filename = fileEntry.filename;
|
|
5132
5164
|
if (normalizeFilename) {
|
|
5133
5165
|
const normalizedFilename = normalizeFilename(filename);
|
|
@@ -5169,11 +5201,12 @@ class ZipReader {
|
|
|
5169
5201
|
const sticky = Boolean(fileEntry.unixMode & FILE_ATTR_UNIX_STICKY_MASK);
|
|
5170
5202
|
const unixType = fileEntry.unixMode === UNDEFINED_VALUE ? unixExternalUpper : fileEntry.unixMode;
|
|
5171
5203
|
const symlink = (unixType & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_SYMLINK;
|
|
5172
|
-
const executable = !symlink && ((fileEntry.unixMode !== UNDEFINED_VALUE)
|
|
5173
|
-
? ((fileEntry.unixMode & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)
|
|
5174
|
-
: (unixCompatible && ((unixExternalUpper & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)));
|
|
5175
5204
|
const modeIsDir = fileEntry.unixMode !== UNDEFINED_VALUE && ((fileEntry.unixMode & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR);
|
|
5176
5205
|
const upperIsDir = ((unixExternalUpper & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR);
|
|
5206
|
+
const directory = modeIsDir || upperIsDir || (msDosCompatible && msdosAttributes.directory) || fileEntry.filename.endsWith(DIRECTORY_SIGNATURE);
|
|
5207
|
+
const executable = !symlink && !directory && ((fileEntry.unixMode !== UNDEFINED_VALUE)
|
|
5208
|
+
? ((fileEntry.unixMode & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)
|
|
5209
|
+
: (unixCompatible && ((unixExternalUpper & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)));
|
|
5177
5210
|
Object.assign(fileEntry, {
|
|
5178
5211
|
setuid,
|
|
5179
5212
|
setgid,
|
|
@@ -5181,7 +5214,7 @@ class ZipReader {
|
|
|
5181
5214
|
symlink,
|
|
5182
5215
|
unixExternalUpper,
|
|
5183
5216
|
executable,
|
|
5184
|
-
directory
|
|
5217
|
+
directory,
|
|
5185
5218
|
zipCrypto: fileEntry.encrypted && !fileEntry.extraFieldAES
|
|
5186
5219
|
});
|
|
5187
5220
|
const entry = new Entry(fileEntry);
|
|
@@ -5237,10 +5270,10 @@ class ZipReader {
|
|
|
5237
5270
|
const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
|
|
5238
5271
|
const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
|
|
5239
5272
|
startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
|
|
5240
|
-
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5273
|
+
if (checkAmbiguity && (prependedDataLength > 0 || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5241
5274
|
throwAmbiguousArchive(WARNING_PREPENDED_DATA);
|
|
5242
5275
|
}
|
|
5243
|
-
if (prependedDataLength || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
|
|
5276
|
+
if (prependedDataLength > 0 || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
|
|
5244
5277
|
addWarning(warnings, WARNING_PREPENDED_DATA);
|
|
5245
5278
|
}
|
|
5246
5279
|
if (prependedCentralDirectory) {
|
|
@@ -5400,6 +5433,9 @@ class ZipEntry {
|
|
|
5400
5433
|
|
|
5401
5434
|
async getData(writer, fileEntry, readRanges, options = {}) {
|
|
5402
5435
|
const zipEntry = this;
|
|
5436
|
+
if (zipEntry.zip64ExtraFieldMissing) {
|
|
5437
|
+
throw new Error(ERR_EXTRAFIELD_ZIP64_NOT_FOUND);
|
|
5438
|
+
}
|
|
5403
5439
|
const config = getConfiguration();
|
|
5404
5440
|
const {
|
|
5405
5441
|
reader,
|
|
@@ -5637,6 +5673,30 @@ function getWrappedFilesLength(directoryView, directoryArray, offset) {
|
|
|
5637
5673
|
return wrappedFilesLength % (MAX_16_BITS + 1) ? 0 : wrappedFilesLength;
|
|
5638
5674
|
}
|
|
5639
5675
|
|
|
5676
|
+
function pointsAtDirectory(reader, offset) {
|
|
5677
|
+
return startsWithSignature(reader, offset, CENTRAL_FILE_HEADER_SIGNATURE);
|
|
5678
|
+
}
|
|
5679
|
+
|
|
5680
|
+
async function startsWithSignature(reader, offset, signature) {
|
|
5681
|
+
if (offset < 0 || offset + 4 > reader.size) {
|
|
5682
|
+
return false;
|
|
5683
|
+
}
|
|
5684
|
+
const signatureArray = await readUint8Array(reader, offset, 4);
|
|
5685
|
+
return getUint32$1(getDataView(signatureArray), 0) == signature;
|
|
5686
|
+
}
|
|
5687
|
+
|
|
5688
|
+
async function findDigitalSignatureRecordOffset(reader, endOffset) {
|
|
5689
|
+
const startOffset = Math.max(0, endOffset - (6 + MAX_16_BITS));
|
|
5690
|
+
const tailArray = await readUint8Array(reader, startOffset, endOffset - startOffset);
|
|
5691
|
+
const tailView = getDataView(tailArray);
|
|
5692
|
+
for (let indexByte = tailArray.length - 6; indexByte >= 0; indexByte--) {
|
|
5693
|
+
if (getUint32$1(tailView, indexByte) == DIGITAL_SIGNATURE_RECORD_SIGNATURE &&
|
|
5694
|
+
indexByte + 6 + getUint16$1(tailView, indexByte + 4) == tailArray.length) {
|
|
5695
|
+
return startOffset + indexByte;
|
|
5696
|
+
}
|
|
5697
|
+
}
|
|
5698
|
+
}
|
|
5699
|
+
|
|
5640
5700
|
function readDigitalSignature(signatureRecordArray) {
|
|
5641
5701
|
if (signatureRecordArray.length >= 6) {
|
|
5642
5702
|
const signatureRecordView = getDataView(signatureRecordArray);
|
|
@@ -5768,6 +5828,11 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
|
|
|
5768
5828
|
readExtraFieldUnixDates(extraFieldUnixType1, directory);
|
|
5769
5829
|
directory.extraFieldUnixType1 = extraFieldUnixType1;
|
|
5770
5830
|
}
|
|
5831
|
+
const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
5832
|
+
if (extraFieldExtendedTimestamp) {
|
|
5833
|
+
readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
|
|
5834
|
+
directory.extraFieldExtendedTimestamp = extraFieldExtendedTimestamp;
|
|
5835
|
+
}
|
|
5771
5836
|
const extraFieldNTFS = extraField.get(EXTRAFIELD_TYPE_NTFS);
|
|
5772
5837
|
if (extraFieldNTFS) {
|
|
5773
5838
|
readExtraFieldNTFS(extraFieldNTFS, directory);
|
|
@@ -5784,11 +5849,6 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
|
|
|
5784
5849
|
readExtraFieldUnix(extraFieldUnix, unixIdsRead ? {} : directory, false);
|
|
5785
5850
|
directory.extraFieldUnix = extraFieldUnix;
|
|
5786
5851
|
}
|
|
5787
|
-
const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
5788
|
-
if (extraFieldExtendedTimestamp) {
|
|
5789
|
-
readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
|
|
5790
|
-
directory.extraFieldExtendedTimestamp = extraFieldExtendedTimestamp;
|
|
5791
|
-
}
|
|
5792
5852
|
const extraFieldUSDZ = extraField.get(EXTRAFIELD_TYPE_USDZ);
|
|
5793
5853
|
if (extraFieldUSDZ) {
|
|
5794
5854
|
directory.extraFieldUSDZ = extraFieldUSDZ;
|
|
@@ -6427,11 +6487,13 @@ var zipReader = /*#__PURE__*/Object.freeze({
|
|
|
6427
6487
|
WARNING_COMPRESSED_PATCHED_DATA: WARNING_COMPRESSED_PATCHED_DATA,
|
|
6428
6488
|
WARNING_DUPLICATE_FILENAME: WARNING_DUPLICATE_FILENAME,
|
|
6429
6489
|
WARNING_MALFORMED_EXTRA_FIELD: WARNING_MALFORMED_EXTRA_FIELD,
|
|
6490
|
+
WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET: WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET,
|
|
6430
6491
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
|
|
6431
6492
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
|
|
6432
6493
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
|
|
6433
6494
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME: WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME,
|
|
6434
6495
|
WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
|
|
6496
|
+
WARNING_MISSING_ZIP64_EXTRA_FIELD: WARNING_MISSING_ZIP64_EXTRA_FIELD,
|
|
6435
6497
|
WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY: WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY,
|
|
6436
6498
|
WARNING_PREPENDED_CENTRAL_DIRECTORY: WARNING_PREPENDED_CENTRAL_DIRECTORY,
|
|
6437
6499
|
WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
|
|
@@ -6564,13 +6626,14 @@ class ZipWriter {
|
|
|
6564
6626
|
return watchPromiseError(this, prependZipEntries(this, reader));
|
|
6565
6627
|
}
|
|
6566
6628
|
|
|
6567
|
-
appendZip(reader) {
|
|
6568
|
-
return watchPromiseError(this, this.appendZipEntries(reader));
|
|
6629
|
+
appendZip(reader, options = {}) {
|
|
6630
|
+
return watchPromiseError(this, this.appendZipEntries(reader, options));
|
|
6569
6631
|
}
|
|
6570
6632
|
|
|
6571
|
-
async appendZipEntries(reader) {
|
|
6633
|
+
async appendZipEntries(reader, options = {}) {
|
|
6572
6634
|
const zipWriter = this;
|
|
6573
6635
|
const { pendingAddFileCalls, filenames, fileEntries } = zipWriter;
|
|
6636
|
+
const filter = checkFunctionOption(options.filter);
|
|
6574
6637
|
while (pendingAddFileCalls.size) {
|
|
6575
6638
|
await Promise.allSettled(Array.from(pendingAddFileCalls));
|
|
6576
6639
|
}
|
|
@@ -6589,10 +6652,16 @@ class ZipWriter {
|
|
|
6589
6652
|
const { ZipReader } = await Promise.resolve().then(function () { return zipReader; });
|
|
6590
6653
|
const zipReader$1 = new ZipReader(reader);
|
|
6591
6654
|
const entries = await zipReader$1.getEntries();
|
|
6655
|
+
const keptEntries = [];
|
|
6656
|
+
for (const entry of entries) {
|
|
6657
|
+
if (!filter || await filter(entry)) {
|
|
6658
|
+
keptEntries.push(entry);
|
|
6659
|
+
}
|
|
6660
|
+
}
|
|
6592
6661
|
await zipReader$1.close();
|
|
6593
6662
|
await initStream(zipWriter.writer);
|
|
6594
6663
|
const { directoryOffset } = zipReader$1;
|
|
6595
|
-
|
|
6664
|
+
keptEntries.forEach(({ filename }) => {
|
|
6596
6665
|
if (filenames.has(filename)) {
|
|
6597
6666
|
throw new Error(ERR_DUPLICATED_NAME);
|
|
6598
6667
|
}
|
|
@@ -6613,8 +6682,8 @@ class ZipWriter {
|
|
|
6613
6682
|
zipWriter.offset += SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
|
|
6614
6683
|
}
|
|
6615
6684
|
}
|
|
6616
|
-
const entryPositions = await copyZipData(zipWriter, reader, entries, directoryOffset);
|
|
6617
|
-
|
|
6685
|
+
const entryPositions = await copyZipData(zipWriter, reader, entries, keptEntries, directoryOffset, Boolean(filter));
|
|
6686
|
+
keptEntries.forEach(entry => {
|
|
6618
6687
|
const {
|
|
6619
6688
|
version,
|
|
6620
6689
|
rawLastModDate,
|
|
@@ -8527,26 +8596,42 @@ function removeExtraFieldZip64(rawExtraField) {
|
|
|
8527
8596
|
return rawExtraField;
|
|
8528
8597
|
}
|
|
8529
8598
|
|
|
8530
|
-
async function copyZipData(zipWriter, reader, entries, directoryOffset) {
|
|
8599
|
+
async function copyZipData(zipWriter, reader, entries, keptEntries, directoryOffset, compact) {
|
|
8531
8600
|
const { writer } = zipWriter;
|
|
8532
8601
|
const entryPositions = new Map();
|
|
8533
|
-
if (writer.closeDisk) {
|
|
8602
|
+
if (writer.closeDisk || compact) {
|
|
8534
8603
|
const sortedEntries = Array.from(entries).sort((firstEntry, secondEntry) =>
|
|
8535
8604
|
getSourceOffset(reader, firstEntry) - getSourceOffset(reader, secondEntry));
|
|
8536
|
-
|
|
8537
|
-
|
|
8538
|
-
|
|
8539
|
-
|
|
8540
|
-
|
|
8541
|
-
|
|
8542
|
-
|
|
8543
|
-
|
|
8544
|
-
|
|
8545
|
-
|
|
8546
|
-
|
|
8547
|
-
|
|
8605
|
+
const regionEnds = getRegionEnds(reader, sortedEntries, directoryOffset);
|
|
8606
|
+
const keptEntrySet = new Set(keptEntries);
|
|
8607
|
+
let copiedOffset = 0;
|
|
8608
|
+
let lastPosition;
|
|
8609
|
+
for (let indexEntry = 0; indexEntry < sortedEntries.length; indexEntry++) {
|
|
8610
|
+
const entry = sortedEntries[indexEntry];
|
|
8611
|
+
if (keptEntrySet.has(entry)) {
|
|
8612
|
+
const sourceOffset = getSourceOffset(reader, entry);
|
|
8613
|
+
if (sourceOffset < copiedOffset) {
|
|
8614
|
+
entryPositions.set(entry, lastPosition);
|
|
8615
|
+
} else {
|
|
8616
|
+
if (!compact) {
|
|
8617
|
+
await copyData(zipWriter, reader, copiedOffset, sourceOffset - copiedOffset);
|
|
8618
|
+
}
|
|
8619
|
+
if (writer.closeDisk && exceedsAvailableSize(writer, await getLocalHeaderLength(reader, sourceOffset))) {
|
|
8620
|
+
await writer.closeDisk();
|
|
8621
|
+
}
|
|
8622
|
+
lastPosition = {
|
|
8623
|
+
offset: getSegmentOffset(zipWriter, writer),
|
|
8624
|
+
diskNumberStart: getDiskNumber(writer)
|
|
8625
|
+
};
|
|
8626
|
+
entryPositions.set(entry, lastPosition);
|
|
8627
|
+
await copyData(zipWriter, reader, sourceOffset, regionEnds[indexEntry] - sourceOffset);
|
|
8628
|
+
copiedOffset = regionEnds[indexEntry];
|
|
8629
|
+
}
|
|
8630
|
+
}
|
|
8631
|
+
}
|
|
8632
|
+
if (!compact) {
|
|
8633
|
+
await copyData(zipWriter, reader, copiedOffset, directoryOffset - copiedOffset);
|
|
8548
8634
|
}
|
|
8549
|
-
await copyData(zipWriter, reader, copiedLength, directoryOffset - copiedLength);
|
|
8550
8635
|
} else {
|
|
8551
8636
|
const baseOffset = zipWriter.offset;
|
|
8552
8637
|
await copyData(zipWriter, reader, 0, directoryOffset);
|
|
@@ -8558,6 +8643,20 @@ async function copyZipData(zipWriter, reader, entries, directoryOffset) {
|
|
|
8558
8643
|
return entryPositions;
|
|
8559
8644
|
}
|
|
8560
8645
|
|
|
8646
|
+
function getRegionEnds(reader, sortedEntries, directoryOffset) {
|
|
8647
|
+
const regionEnds = new Array(sortedEntries.length);
|
|
8648
|
+
let regionEnd = directoryOffset;
|
|
8649
|
+
for (let indexEntry = sortedEntries.length - 1; indexEntry >= 0; indexEntry--) {
|
|
8650
|
+
const sourceOffset = getSourceOffset(reader, sortedEntries[indexEntry]);
|
|
8651
|
+
const nextEntry = sortedEntries[indexEntry + 1];
|
|
8652
|
+
if (nextEntry && getSourceOffset(reader, nextEntry) > sourceOffset) {
|
|
8653
|
+
regionEnd = getSourceOffset(reader, nextEntry);
|
|
8654
|
+
}
|
|
8655
|
+
regionEnds[indexEntry] = regionEnd;
|
|
8656
|
+
}
|
|
8657
|
+
return regionEnds;
|
|
8658
|
+
}
|
|
8659
|
+
|
|
8561
8660
|
async function copyData(zipWriter, reader, offset, size) {
|
|
8562
8661
|
if (size > 0) {
|
|
8563
8662
|
const { writer } = zipWriter;
|
|
@@ -8935,7 +9034,7 @@ function formatSupported(StreamClass, format) {
|
|
|
8935
9034
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
8936
9035
|
*/
|
|
8937
9036
|
|
|
8938
|
-
const VERSION = "2.
|
|
9037
|
+
const VERSION = "2.20.0";
|
|
8939
9038
|
|
|
8940
9039
|
/*
|
|
8941
9040
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -9940,4 +10039,4 @@ async function terminateWorkersAndModule() {
|
|
|
9940
10039
|
|
|
9941
10040
|
configureExternalAssets();
|
|
9942
10041
|
|
|
9943
|
-
export { BlobReader, BlobWriter, Data64URIReader, Data64URIWriter, ERR_ABORTED, ERR_AMBIGUOUS_ARCHIVE, ERR_BAD_FORMAT, ERR_CENTRAL_DIRECTORY_NOT_FOUND, ERR_CODEC_OUT_OF_MEMORY, ERR_DUPLICATED_NAME, ERR_ENCRYPTED, ERR_ENCRYPTED_CENTRAL_DIRECTORY, ERR_ENTRY_DATA_OUT_OF_BOUNDS, ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND, ERR_EOCDR_NOT_FOUND, ERR_EXTRAFIELD_ZIP64_NOT_FOUND, ERR_HTTP_RANGE, ERR_HTTP_RESOURCE_CHANGED, ERR_HTTP_STATUS, ERR_INVALID_AUTHENTICATION_CODE, ERR_INVALID_BASE_URI, ERR_INVALID_CODEC_DEFINITION, ERR_INVALID_CODEC_MODULE, ERR_INVALID_COMMENT, ERR_INVALID_COMMENT_TYPE, ERR_INVALID_COMPRESSED_DATA, ERR_INVALID_CRC32, ERR_INVALID_DATE, ERR_INVALID_ENCRYPTION_STRENGTH, ERR_INVALID_ENTRY, ERR_INVALID_ENTRY_COMMENT, ERR_INVALID_ENTRY_COMMENT_TYPE, ERR_INVALID_ENTRY_NAME, ERR_INVALID_EXTRAFIELD, ERR_INVALID_EXTRAFIELD_DATA, ERR_INVALID_EXTRAFIELD_DATA_TYPE, ERR_INVALID_EXTRAFIELD_TYPE, ERR_INVALID_FILENAME_VALIDATION, ERR_INVALID_FUNCTION_OPTION, ERR_INVALID_GID, ERR_INVALID_LEVEL, ERR_INVALID_MAX_APPENDED_DATA_SIZE, ERR_INVALID_MAX_WORKERS, ERR_INVALID_MSDOS_ATTRIBUTES, ERR_INVALID_MSDOS_DATA, ERR_INVALID_PASSWORD, ERR_INVALID_PASSWORD_TYPE, ERR_INVALID_PASS_THROUGH_VALUE, ERR_INVALID_READER, ERR_INVALID_SIGNAL, ERR_INVALID_SIGNATURE_DATA, ERR_INVALID_STRICTNESS, ERR_INVALID_UID, ERR_INVALID_UNCOMPRESSED_SIZE, ERR_INVALID_UNIX_EXTRA_FIELD_TYPE, ERR_INVALID_UNIX_ID_SIZE, ERR_INVALID_UNIX_MODE, ERR_INVALID_URI, ERR_INVALID_VERSION, ERR_ITERATOR_COMPLETED_TOO_SOON, ERR_LOCAL_FILE_HEADER_NOT_FOUND, ERR_OVERLAPPING_ENTRY, ERR_RESERVED_COMPRESSION_METHOD, ERR_SPLIT_ZIP_FILE, ERR_UNDEFINED_COMPRESSION_METHOD, ERR_UNDEFINED_CRC32, ERR_UNDEFINED_READER, ERR_UNDEFINED_UNCOMPRESSED_SIZE, ERR_UNDETERMINED_SIZE, ERR_UNSAFE_FILENAME, ERR_UNSUPPORTED_COMPRESSION, ERR_UNSUPPORTED_CONTEXT, ERR_UNSUPPORTED_CRYPTO_API, ERR_UNSUPPORTED_ENCRYPTION, ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH, ERR_UNSUPPORTED_ENCRYPTION_USDZ, ERR_UNSUPPORTED_FORMAT, ERR_UNSUPPORTED_SPLIT_USDZ, ERR_UNSUPPORTED_UINT64, ERR_WORKER_STARTUP_TIMEOUT, ERR_WRITER_NOT_INITIALIZED, ERR_WRITER_SIZE_NOT_WRITABLE, ERR_ZIP_CRYPTO_LAST_MOD_DATE, ERR_ZIP_NOT_EMPTY, HttpRangeReader, HttpReader, Reader, SplitDataReader, SplitDataWriter, TextReader, TextWriter, Uint8ArrayReader, Uint8ArrayWriter, VERSION, WARNING_APPENDED_DATA, WARNING_CLAMPED_LAST_MODIFICATION_DATE, WARNING_COMPRESSED_PATCHED_DATA, WARNING_COMPRESSION_UNAVAILABLE, WARNING_DUPLICATE_FILENAME, WARNING_MALFORMED_EXTRA_FIELD, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG, WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD, WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES, WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY, WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY, WARNING_PREPENDED_CENTRAL_DIRECTORY, WARNING_PREPENDED_DATA, WARNING_TRAILING_CENTRAL_DIRECTORY_DATA, WARNING_UNKNOWN_VERSION, WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA, WARNING_UNSORTED_CENTRAL_DIRECTORY, WARNING_WRAPPED_ENTRIES_COUNT, Writer, ZipReader, ZipReaderStream, ZipWriter, ZipWriterStream, configure, createBlobTempStream, createOPFSTempStream, createSyncAccessHandleTempStream, getMimeType, getRegisteredCodecs, getSupportedCompressionMethods, isZipFile, registerCodec, resetConfiguration, terminateWorkersAndModule as terminateWorkers, unregisterCodec };
|
|
10042
|
+
export { BlobReader, BlobWriter, Data64URIReader, Data64URIWriter, ERR_ABORTED, ERR_AMBIGUOUS_ARCHIVE, ERR_BAD_FORMAT, ERR_CENTRAL_DIRECTORY_NOT_FOUND, ERR_CODEC_OUT_OF_MEMORY, ERR_DUPLICATED_NAME, ERR_ENCRYPTED, ERR_ENCRYPTED_CENTRAL_DIRECTORY, ERR_ENTRY_DATA_OUT_OF_BOUNDS, ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND, ERR_EOCDR_NOT_FOUND, ERR_EXTRAFIELD_ZIP64_NOT_FOUND, ERR_HTTP_RANGE, ERR_HTTP_RESOURCE_CHANGED, ERR_HTTP_STATUS, ERR_INVALID_AUTHENTICATION_CODE, ERR_INVALID_BASE_URI, ERR_INVALID_CODEC_DEFINITION, ERR_INVALID_CODEC_MODULE, ERR_INVALID_COMMENT, ERR_INVALID_COMMENT_TYPE, ERR_INVALID_COMPRESSED_DATA, ERR_INVALID_CRC32, ERR_INVALID_DATE, ERR_INVALID_ENCRYPTION_STRENGTH, ERR_INVALID_ENTRY, ERR_INVALID_ENTRY_COMMENT, ERR_INVALID_ENTRY_COMMENT_TYPE, ERR_INVALID_ENTRY_NAME, ERR_INVALID_EXTRAFIELD, ERR_INVALID_EXTRAFIELD_DATA, ERR_INVALID_EXTRAFIELD_DATA_TYPE, ERR_INVALID_EXTRAFIELD_TYPE, ERR_INVALID_FILENAME_VALIDATION, ERR_INVALID_FUNCTION_OPTION, ERR_INVALID_GID, ERR_INVALID_LEVEL, ERR_INVALID_MAX_APPENDED_DATA_SIZE, ERR_INVALID_MAX_WORKERS, ERR_INVALID_MSDOS_ATTRIBUTES, ERR_INVALID_MSDOS_DATA, ERR_INVALID_PASSWORD, ERR_INVALID_PASSWORD_TYPE, ERR_INVALID_PASS_THROUGH_VALUE, ERR_INVALID_READER, ERR_INVALID_SIGNAL, ERR_INVALID_SIGNATURE_DATA, ERR_INVALID_STRICTNESS, ERR_INVALID_UID, ERR_INVALID_UNCOMPRESSED_SIZE, ERR_INVALID_UNIX_EXTRA_FIELD_TYPE, ERR_INVALID_UNIX_ID_SIZE, ERR_INVALID_UNIX_MODE, ERR_INVALID_URI, ERR_INVALID_VERSION, ERR_ITERATOR_COMPLETED_TOO_SOON, ERR_LOCAL_FILE_HEADER_NOT_FOUND, ERR_OVERLAPPING_ENTRY, ERR_RESERVED_COMPRESSION_METHOD, ERR_SPLIT_ZIP_FILE, ERR_UNDEFINED_COMPRESSION_METHOD, ERR_UNDEFINED_CRC32, ERR_UNDEFINED_READER, ERR_UNDEFINED_UNCOMPRESSED_SIZE, ERR_UNDETERMINED_SIZE, ERR_UNSAFE_FILENAME, ERR_UNSUPPORTED_COMPRESSION, ERR_UNSUPPORTED_CONTEXT, ERR_UNSUPPORTED_CRYPTO_API, ERR_UNSUPPORTED_ENCRYPTION, ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH, ERR_UNSUPPORTED_ENCRYPTION_USDZ, ERR_UNSUPPORTED_FORMAT, ERR_UNSUPPORTED_SPLIT_USDZ, ERR_UNSUPPORTED_UINT64, ERR_WORKER_STARTUP_TIMEOUT, ERR_WRITER_NOT_INITIALIZED, ERR_WRITER_SIZE_NOT_WRITABLE, ERR_ZIP_CRYPTO_LAST_MOD_DATE, ERR_ZIP_NOT_EMPTY, HttpRangeReader, HttpReader, Reader, SplitDataReader, SplitDataWriter, TextReader, TextWriter, Uint8ArrayReader, Uint8ArrayWriter, VERSION, WARNING_APPENDED_DATA, WARNING_CLAMPED_LAST_MODIFICATION_DATE, WARNING_COMPRESSED_PATCHED_DATA, WARNING_COMPRESSION_UNAVAILABLE, WARNING_DUPLICATE_FILENAME, WARNING_MALFORMED_EXTRA_FIELD, WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG, WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD, WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES, WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY, WARNING_MISSING_ZIP64_EXTRA_FIELD, WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY, WARNING_PREPENDED_CENTRAL_DIRECTORY, WARNING_PREPENDED_DATA, WARNING_TRAILING_CENTRAL_DIRECTORY_DATA, WARNING_UNKNOWN_VERSION, WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA, WARNING_UNSORTED_CENTRAL_DIRECTORY, WARNING_WRAPPED_ENTRIES_COUNT, Writer, ZipReader, ZipReaderStream, ZipWriter, ZipWriterStream, configure, createBlobTempStream, createOPFSTempStream, createSyncAccessHandleTempStream, getMimeType, getRegisteredCodecs, getSupportedCompressionMethods, isZipFile, registerCodec, resetConfiguration, terminateWorkersAndModule as terminateWorkers, unregisterCodec };
|