@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
package/dist/zip-fs-native.js
CHANGED
|
@@ -4801,6 +4801,8 @@
|
|
|
4801
4801
|
const WARNING_PREPENDED_DATA = "prepended data";
|
|
4802
4802
|
const WARNING_PREPENDED_CENTRAL_DIRECTORY = "prepended central directory";
|
|
4803
4803
|
const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
|
|
4804
|
+
const WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET = "mismatched central directory offset";
|
|
4805
|
+
const WARNING_MISSING_ZIP64_EXTRA_FIELD = "missing zip64 extra field";
|
|
4804
4806
|
const WARNING_DUPLICATE_FILENAME = "duplicate filename";
|
|
4805
4807
|
const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
|
|
4806
4808
|
const WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = "multiple end of central directory records";
|
|
@@ -4963,6 +4965,8 @@
|
|
|
4963
4965
|
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4964
4966
|
}
|
|
4965
4967
|
directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
|
|
4968
|
+
} else if (directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || diskNumber == MAX_16_BITS) {
|
|
4969
|
+
throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
|
|
4966
4970
|
}
|
|
4967
4971
|
}
|
|
4968
4972
|
let declaredDirectoryDataLength = directoryDataLength;
|
|
@@ -4985,25 +4989,44 @@
|
|
|
4985
4989
|
if (directoryArray.length < 4) {
|
|
4986
4990
|
throw new Error(ERR_BAD_FORMAT);
|
|
4987
4991
|
}
|
|
4988
|
-
|
|
4992
|
+
let expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
|
|
4989
4993
|
if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
|
|
4990
4994
|
const storedPointsAtDirectory = getUint32$1(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE ||
|
|
4991
4995
|
Boolean(directoryEncryptionInfo && directoryEncryptionInfo.compressedSize) ||
|
|
4992
4996
|
detectEncryptedCentralDirectory(directoryView);
|
|
4993
4997
|
let reconcile = !storedPointsAtDirectory;
|
|
4994
|
-
if (
|
|
4995
|
-
const
|
|
4996
|
-
|
|
4998
|
+
if (expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
|
|
4999
|
+
const expectedPointsAtDirectory = await pointsAtDirectory(reader, expectedDirectoryDataOffset);
|
|
5000
|
+
if (storedPointsAtDirectory) {
|
|
5001
|
+
reconcile = expectedPointsAtDirectory;
|
|
5002
|
+
} else if (!expectedPointsAtDirectory) {
|
|
5003
|
+
const signatureRecordOffset = await findDigitalSignatureRecordOffset(reader, centralDirectoryEndOffset);
|
|
5004
|
+
const signedDirectoryDataOffset = signatureRecordOffset - directoryDataLength;
|
|
5005
|
+
if (signatureRecordOffset !== UNDEFINED_VALUE && signedDirectoryDataOffset >= 0 &&
|
|
5006
|
+
await pointsAtDirectory(reader, signedDirectoryDataOffset)) {
|
|
5007
|
+
expectedDirectoryDataOffset = signedDirectoryDataOffset;
|
|
5008
|
+
}
|
|
5009
|
+
}
|
|
4997
5010
|
}
|
|
4998
5011
|
if (reconcile) {
|
|
4999
5012
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
5000
5013
|
directoryDataOffset = expectedDirectoryDataOffset;
|
|
5014
|
+
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
|
|
5015
|
+
directoryView = getDataView(directoryArray);
|
|
5001
5016
|
if (directoryDataOffset > originalDirectoryDataOffset) {
|
|
5002
5017
|
prependedDataLength += directoryDataOffset - originalDirectoryDataOffset;
|
|
5003
5018
|
prependedCentralDirectory = storedPointsAtDirectory;
|
|
5019
|
+
} else {
|
|
5020
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET);
|
|
5021
|
+
const offsetDelta = directoryDataOffset - originalDirectoryDataOffset;
|
|
5022
|
+
if (directoryArray.length >= CENTRAL_FILE_HEADER_LENGTH) {
|
|
5023
|
+
const localHeaderOffset = getUint32$1(directoryView, 42);
|
|
5024
|
+
if (!await startsWithSignature(reader, localHeaderOffset, LOCAL_FILE_HEADER_SIGNATURE) &&
|
|
5025
|
+
await startsWithSignature(reader, localHeaderOffset + offsetDelta, LOCAL_FILE_HEADER_SIGNATURE)) {
|
|
5026
|
+
prependedDataLength += offsetDelta;
|
|
5027
|
+
}
|
|
5028
|
+
}
|
|
5004
5029
|
}
|
|
5005
|
-
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
|
|
5006
|
-
directoryView = getDataView(directoryArray);
|
|
5007
5030
|
}
|
|
5008
5031
|
}
|
|
5009
5032
|
}
|
|
@@ -5114,7 +5137,16 @@
|
|
|
5114
5137
|
filename,
|
|
5115
5138
|
comment
|
|
5116
5139
|
});
|
|
5117
|
-
|
|
5140
|
+
let malformedExtraField;
|
|
5141
|
+
try {
|
|
5142
|
+
malformedExtraField = readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
|
|
5143
|
+
} catch (error) {
|
|
5144
|
+
if (checkAmbiguity || error.message != ERR_EXTRAFIELD_ZIP64_NOT_FOUND) {
|
|
5145
|
+
throw error;
|
|
5146
|
+
}
|
|
5147
|
+
fileEntry.zip64ExtraFieldMissing = true;
|
|
5148
|
+
addWarning(warnings, WARNING_MISSING_ZIP64_EXTRA_FIELD, fileEntry.filename);
|
|
5149
|
+
}
|
|
5118
5150
|
filename = fileEntry.filename;
|
|
5119
5151
|
if (normalizeFilename) {
|
|
5120
5152
|
const normalizedFilename = normalizeFilename(filename);
|
|
@@ -5156,11 +5188,12 @@
|
|
|
5156
5188
|
const sticky = Boolean(fileEntry.unixMode & FILE_ATTR_UNIX_STICKY_MASK);
|
|
5157
5189
|
const unixType = fileEntry.unixMode === UNDEFINED_VALUE ? unixExternalUpper : fileEntry.unixMode;
|
|
5158
5190
|
const symlink = (unixType & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_SYMLINK;
|
|
5159
|
-
const executable = !symlink && ((fileEntry.unixMode !== UNDEFINED_VALUE)
|
|
5160
|
-
? ((fileEntry.unixMode & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)
|
|
5161
|
-
: (unixCompatible && ((unixExternalUpper & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)));
|
|
5162
5191
|
const modeIsDir = fileEntry.unixMode !== UNDEFINED_VALUE && ((fileEntry.unixMode & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR);
|
|
5163
5192
|
const upperIsDir = ((unixExternalUpper & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR);
|
|
5193
|
+
const directory = modeIsDir || upperIsDir || (msDosCompatible && msdosAttributes.directory) || fileEntry.filename.endsWith(DIRECTORY_SIGNATURE);
|
|
5194
|
+
const executable = !symlink && !directory && ((fileEntry.unixMode !== UNDEFINED_VALUE)
|
|
5195
|
+
? ((fileEntry.unixMode & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)
|
|
5196
|
+
: (unixCompatible && ((unixExternalUpper & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)));
|
|
5164
5197
|
Object.assign(fileEntry, {
|
|
5165
5198
|
setuid,
|
|
5166
5199
|
setgid,
|
|
@@ -5168,7 +5201,7 @@
|
|
|
5168
5201
|
symlink,
|
|
5169
5202
|
unixExternalUpper,
|
|
5170
5203
|
executable,
|
|
5171
|
-
directory
|
|
5204
|
+
directory,
|
|
5172
5205
|
zipCrypto: fileEntry.encrypted && !fileEntry.extraFieldAES
|
|
5173
5206
|
});
|
|
5174
5207
|
const entry = new Entry(fileEntry);
|
|
@@ -5224,10 +5257,10 @@
|
|
|
5224
5257
|
const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
|
|
5225
5258
|
const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
|
|
5226
5259
|
startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
|
|
5227
|
-
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5260
|
+
if (checkAmbiguity && (prependedDataLength > 0 || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5228
5261
|
throwAmbiguousArchive(WARNING_PREPENDED_DATA);
|
|
5229
5262
|
}
|
|
5230
|
-
if (prependedDataLength || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
|
|
5263
|
+
if (prependedDataLength > 0 || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
|
|
5231
5264
|
addWarning(warnings, WARNING_PREPENDED_DATA);
|
|
5232
5265
|
}
|
|
5233
5266
|
if (prependedCentralDirectory) {
|
|
@@ -5387,6 +5420,9 @@
|
|
|
5387
5420
|
|
|
5388
5421
|
async getData(writer, fileEntry, readRanges, options = {}) {
|
|
5389
5422
|
const zipEntry = this;
|
|
5423
|
+
if (zipEntry.zip64ExtraFieldMissing) {
|
|
5424
|
+
throw new Error(ERR_EXTRAFIELD_ZIP64_NOT_FOUND);
|
|
5425
|
+
}
|
|
5390
5426
|
const config = getConfiguration();
|
|
5391
5427
|
const {
|
|
5392
5428
|
reader,
|
|
@@ -5624,6 +5660,30 @@
|
|
|
5624
5660
|
return wrappedFilesLength % (MAX_16_BITS + 1) ? 0 : wrappedFilesLength;
|
|
5625
5661
|
}
|
|
5626
5662
|
|
|
5663
|
+
function pointsAtDirectory(reader, offset) {
|
|
5664
|
+
return startsWithSignature(reader, offset, CENTRAL_FILE_HEADER_SIGNATURE);
|
|
5665
|
+
}
|
|
5666
|
+
|
|
5667
|
+
async function startsWithSignature(reader, offset, signature) {
|
|
5668
|
+
if (offset < 0 || offset + 4 > reader.size) {
|
|
5669
|
+
return false;
|
|
5670
|
+
}
|
|
5671
|
+
const signatureArray = await readUint8Array(reader, offset, 4);
|
|
5672
|
+
return getUint32$1(getDataView(signatureArray), 0) == signature;
|
|
5673
|
+
}
|
|
5674
|
+
|
|
5675
|
+
async function findDigitalSignatureRecordOffset(reader, endOffset) {
|
|
5676
|
+
const startOffset = Math.max(0, endOffset - (6 + MAX_16_BITS));
|
|
5677
|
+
const tailArray = await readUint8Array(reader, startOffset, endOffset - startOffset);
|
|
5678
|
+
const tailView = getDataView(tailArray);
|
|
5679
|
+
for (let indexByte = tailArray.length - 6; indexByte >= 0; indexByte--) {
|
|
5680
|
+
if (getUint32$1(tailView, indexByte) == DIGITAL_SIGNATURE_RECORD_SIGNATURE &&
|
|
5681
|
+
indexByte + 6 + getUint16$1(tailView, indexByte + 4) == tailArray.length) {
|
|
5682
|
+
return startOffset + indexByte;
|
|
5683
|
+
}
|
|
5684
|
+
}
|
|
5685
|
+
}
|
|
5686
|
+
|
|
5627
5687
|
function readDigitalSignature(signatureRecordArray) {
|
|
5628
5688
|
if (signatureRecordArray.length >= 6) {
|
|
5629
5689
|
const signatureRecordView = getDataView(signatureRecordArray);
|
|
@@ -5755,6 +5815,11 @@
|
|
|
5755
5815
|
readExtraFieldUnixDates(extraFieldUnixType1, directory);
|
|
5756
5816
|
directory.extraFieldUnixType1 = extraFieldUnixType1;
|
|
5757
5817
|
}
|
|
5818
|
+
const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
5819
|
+
if (extraFieldExtendedTimestamp) {
|
|
5820
|
+
readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
|
|
5821
|
+
directory.extraFieldExtendedTimestamp = extraFieldExtendedTimestamp;
|
|
5822
|
+
}
|
|
5758
5823
|
const extraFieldNTFS = extraField.get(EXTRAFIELD_TYPE_NTFS);
|
|
5759
5824
|
if (extraFieldNTFS) {
|
|
5760
5825
|
readExtraFieldNTFS(extraFieldNTFS, directory);
|
|
@@ -5771,11 +5836,6 @@
|
|
|
5771
5836
|
readExtraFieldUnix(extraFieldUnix, unixIdsRead ? {} : directory, false);
|
|
5772
5837
|
directory.extraFieldUnix = extraFieldUnix;
|
|
5773
5838
|
}
|
|
5774
|
-
const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
5775
|
-
if (extraFieldExtendedTimestamp) {
|
|
5776
|
-
readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
|
|
5777
|
-
directory.extraFieldExtendedTimestamp = extraFieldExtendedTimestamp;
|
|
5778
|
-
}
|
|
5779
5839
|
const extraFieldUSDZ = extraField.get(EXTRAFIELD_TYPE_USDZ);
|
|
5780
5840
|
if (extraFieldUSDZ) {
|
|
5781
5841
|
directory.extraFieldUSDZ = extraFieldUSDZ;
|
|
@@ -6414,11 +6474,13 @@
|
|
|
6414
6474
|
WARNING_COMPRESSED_PATCHED_DATA: WARNING_COMPRESSED_PATCHED_DATA,
|
|
6415
6475
|
WARNING_DUPLICATE_FILENAME: WARNING_DUPLICATE_FILENAME,
|
|
6416
6476
|
WARNING_MALFORMED_EXTRA_FIELD: WARNING_MALFORMED_EXTRA_FIELD,
|
|
6477
|
+
WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET: WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET,
|
|
6417
6478
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
|
|
6418
6479
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
|
|
6419
6480
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
|
|
6420
6481
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME: WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME,
|
|
6421
6482
|
WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
|
|
6483
|
+
WARNING_MISSING_ZIP64_EXTRA_FIELD: WARNING_MISSING_ZIP64_EXTRA_FIELD,
|
|
6422
6484
|
WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY: WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY,
|
|
6423
6485
|
WARNING_PREPENDED_CENTRAL_DIRECTORY: WARNING_PREPENDED_CENTRAL_DIRECTORY,
|
|
6424
6486
|
WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
|
|
@@ -6551,13 +6613,14 @@
|
|
|
6551
6613
|
return watchPromiseError(this, prependZipEntries(this, reader));
|
|
6552
6614
|
}
|
|
6553
6615
|
|
|
6554
|
-
appendZip(reader) {
|
|
6555
|
-
return watchPromiseError(this, this.appendZipEntries(reader));
|
|
6616
|
+
appendZip(reader, options = {}) {
|
|
6617
|
+
return watchPromiseError(this, this.appendZipEntries(reader, options));
|
|
6556
6618
|
}
|
|
6557
6619
|
|
|
6558
|
-
async appendZipEntries(reader) {
|
|
6620
|
+
async appendZipEntries(reader, options = {}) {
|
|
6559
6621
|
const zipWriter = this;
|
|
6560
6622
|
const { pendingAddFileCalls, filenames, fileEntries } = zipWriter;
|
|
6623
|
+
const filter = checkFunctionOption(options.filter);
|
|
6561
6624
|
while (pendingAddFileCalls.size) {
|
|
6562
6625
|
await Promise.allSettled(Array.from(pendingAddFileCalls));
|
|
6563
6626
|
}
|
|
@@ -6576,10 +6639,16 @@
|
|
|
6576
6639
|
const { ZipReader } = await Promise.resolve().then(function () { return zipReader; });
|
|
6577
6640
|
const zipReader$1 = new ZipReader(reader);
|
|
6578
6641
|
const entries = await zipReader$1.getEntries();
|
|
6642
|
+
const keptEntries = [];
|
|
6643
|
+
for (const entry of entries) {
|
|
6644
|
+
if (!filter || await filter(entry)) {
|
|
6645
|
+
keptEntries.push(entry);
|
|
6646
|
+
}
|
|
6647
|
+
}
|
|
6579
6648
|
await zipReader$1.close();
|
|
6580
6649
|
await initStream(zipWriter.writer);
|
|
6581
6650
|
const { directoryOffset } = zipReader$1;
|
|
6582
|
-
|
|
6651
|
+
keptEntries.forEach(({ filename }) => {
|
|
6583
6652
|
if (filenames.has(filename)) {
|
|
6584
6653
|
throw new Error(ERR_DUPLICATED_NAME);
|
|
6585
6654
|
}
|
|
@@ -6600,8 +6669,8 @@
|
|
|
6600
6669
|
zipWriter.offset += SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
|
|
6601
6670
|
}
|
|
6602
6671
|
}
|
|
6603
|
-
const entryPositions = await copyZipData(zipWriter, reader, entries, directoryOffset);
|
|
6604
|
-
|
|
6672
|
+
const entryPositions = await copyZipData(zipWriter, reader, entries, keptEntries, directoryOffset, Boolean(filter));
|
|
6673
|
+
keptEntries.forEach(entry => {
|
|
6605
6674
|
const {
|
|
6606
6675
|
version,
|
|
6607
6676
|
rawLastModDate,
|
|
@@ -8612,26 +8681,42 @@
|
|
|
8612
8681
|
return rawExtraField;
|
|
8613
8682
|
}
|
|
8614
8683
|
|
|
8615
|
-
async function copyZipData(zipWriter, reader, entries, directoryOffset) {
|
|
8684
|
+
async function copyZipData(zipWriter, reader, entries, keptEntries, directoryOffset, compact) {
|
|
8616
8685
|
const { writer } = zipWriter;
|
|
8617
8686
|
const entryPositions = new Map();
|
|
8618
|
-
if (writer.closeDisk) {
|
|
8687
|
+
if (writer.closeDisk || compact) {
|
|
8619
8688
|
const sortedEntries = Array.from(entries).sort((firstEntry, secondEntry) =>
|
|
8620
8689
|
getSourceOffset(reader, firstEntry) - getSourceOffset(reader, secondEntry));
|
|
8621
|
-
|
|
8622
|
-
|
|
8623
|
-
|
|
8624
|
-
|
|
8625
|
-
|
|
8626
|
-
|
|
8627
|
-
|
|
8628
|
-
|
|
8629
|
-
|
|
8630
|
-
|
|
8631
|
-
|
|
8632
|
-
|
|
8690
|
+
const regionEnds = getRegionEnds(reader, sortedEntries, directoryOffset);
|
|
8691
|
+
const keptEntrySet = new Set(keptEntries);
|
|
8692
|
+
let copiedOffset = 0;
|
|
8693
|
+
let lastPosition;
|
|
8694
|
+
for (let indexEntry = 0; indexEntry < sortedEntries.length; indexEntry++) {
|
|
8695
|
+
const entry = sortedEntries[indexEntry];
|
|
8696
|
+
if (keptEntrySet.has(entry)) {
|
|
8697
|
+
const sourceOffset = getSourceOffset(reader, entry);
|
|
8698
|
+
if (sourceOffset < copiedOffset) {
|
|
8699
|
+
entryPositions.set(entry, lastPosition);
|
|
8700
|
+
} else {
|
|
8701
|
+
if (!compact) {
|
|
8702
|
+
await copyData(zipWriter, reader, copiedOffset, sourceOffset - copiedOffset);
|
|
8703
|
+
}
|
|
8704
|
+
if (writer.closeDisk && exceedsAvailableSize(writer, await getLocalHeaderLength(reader, sourceOffset))) {
|
|
8705
|
+
await writer.closeDisk();
|
|
8706
|
+
}
|
|
8707
|
+
lastPosition = {
|
|
8708
|
+
offset: getSegmentOffset(zipWriter, writer),
|
|
8709
|
+
diskNumberStart: getDiskNumber(writer)
|
|
8710
|
+
};
|
|
8711
|
+
entryPositions.set(entry, lastPosition);
|
|
8712
|
+
await copyData(zipWriter, reader, sourceOffset, regionEnds[indexEntry] - sourceOffset);
|
|
8713
|
+
copiedOffset = regionEnds[indexEntry];
|
|
8714
|
+
}
|
|
8715
|
+
}
|
|
8716
|
+
}
|
|
8717
|
+
if (!compact) {
|
|
8718
|
+
await copyData(zipWriter, reader, copiedOffset, directoryOffset - copiedOffset);
|
|
8633
8719
|
}
|
|
8634
|
-
await copyData(zipWriter, reader, copiedLength, directoryOffset - copiedLength);
|
|
8635
8720
|
} else {
|
|
8636
8721
|
const baseOffset = zipWriter.offset;
|
|
8637
8722
|
await copyData(zipWriter, reader, 0, directoryOffset);
|
|
@@ -8643,6 +8728,20 @@
|
|
|
8643
8728
|
return entryPositions;
|
|
8644
8729
|
}
|
|
8645
8730
|
|
|
8731
|
+
function getRegionEnds(reader, sortedEntries, directoryOffset) {
|
|
8732
|
+
const regionEnds = new Array(sortedEntries.length);
|
|
8733
|
+
let regionEnd = directoryOffset;
|
|
8734
|
+
for (let indexEntry = sortedEntries.length - 1; indexEntry >= 0; indexEntry--) {
|
|
8735
|
+
const sourceOffset = getSourceOffset(reader, sortedEntries[indexEntry]);
|
|
8736
|
+
const nextEntry = sortedEntries[indexEntry + 1];
|
|
8737
|
+
if (nextEntry && getSourceOffset(reader, nextEntry) > sourceOffset) {
|
|
8738
|
+
regionEnd = getSourceOffset(reader, nextEntry);
|
|
8739
|
+
}
|
|
8740
|
+
regionEnds[indexEntry] = regionEnd;
|
|
8741
|
+
}
|
|
8742
|
+
return regionEnds;
|
|
8743
|
+
}
|
|
8744
|
+
|
|
8646
8745
|
async function copyData(zipWriter, reader, offset, size) {
|
|
8647
8746
|
if (size > 0) {
|
|
8648
8747
|
const { writer } = zipWriter;
|
|
@@ -9020,7 +9119,7 @@
|
|
|
9020
9119
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
9021
9120
|
*/
|
|
9022
9121
|
|
|
9023
|
-
const VERSION = "2.
|
|
9122
|
+
const VERSION = "2.20.0";
|
|
9024
9123
|
|
|
9025
9124
|
/*
|
|
9026
9125
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -11214,11 +11313,13 @@
|
|
|
11214
11313
|
exports.WARNING_COMPRESSION_UNAVAILABLE = WARNING_COMPRESSION_UNAVAILABLE;
|
|
11215
11314
|
exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
|
|
11216
11315
|
exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
|
|
11316
|
+
exports.WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET = WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET;
|
|
11217
11317
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
|
|
11218
11318
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
|
|
11219
11319
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
|
|
11220
11320
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME;
|
|
11221
11321
|
exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
|
|
11322
|
+
exports.WARNING_MISSING_ZIP64_EXTRA_FIELD = WARNING_MISSING_ZIP64_EXTRA_FIELD;
|
|
11222
11323
|
exports.WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY;
|
|
11223
11324
|
exports.WARNING_PREPENDED_CENTRAL_DIRECTORY = WARNING_PREPENDED_CENTRAL_DIRECTORY;
|
|
11224
11325
|
exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
|