@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-core.js
CHANGED
|
@@ -4799,6 +4799,8 @@
|
|
|
4799
4799
|
const WARNING_PREPENDED_DATA = "prepended data";
|
|
4800
4800
|
const WARNING_PREPENDED_CENTRAL_DIRECTORY = "prepended central directory";
|
|
4801
4801
|
const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
|
|
4802
|
+
const WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET = "mismatched central directory offset";
|
|
4803
|
+
const WARNING_MISSING_ZIP64_EXTRA_FIELD = "missing zip64 extra field";
|
|
4802
4804
|
const WARNING_DUPLICATE_FILENAME = "duplicate filename";
|
|
4803
4805
|
const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
|
|
4804
4806
|
const WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = "multiple end of central directory records";
|
|
@@ -4961,6 +4963,8 @@
|
|
|
4961
4963
|
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4962
4964
|
}
|
|
4963
4965
|
directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
|
|
4966
|
+
} else if (directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || diskNumber == MAX_16_BITS) {
|
|
4967
|
+
throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
|
|
4964
4968
|
}
|
|
4965
4969
|
}
|
|
4966
4970
|
let declaredDirectoryDataLength = directoryDataLength;
|
|
@@ -4983,25 +4987,44 @@
|
|
|
4983
4987
|
if (directoryArray.length < 4) {
|
|
4984
4988
|
throw new Error(ERR_BAD_FORMAT);
|
|
4985
4989
|
}
|
|
4986
|
-
|
|
4990
|
+
let expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
|
|
4987
4991
|
if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
|
|
4988
4992
|
const storedPointsAtDirectory = getUint32$1(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE ||
|
|
4989
4993
|
Boolean(directoryEncryptionInfo && directoryEncryptionInfo.compressedSize) ||
|
|
4990
4994
|
detectEncryptedCentralDirectory(directoryView);
|
|
4991
4995
|
let reconcile = !storedPointsAtDirectory;
|
|
4992
|
-
if (
|
|
4993
|
-
const
|
|
4994
|
-
|
|
4996
|
+
if (expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
|
|
4997
|
+
const expectedPointsAtDirectory = await pointsAtDirectory(reader, expectedDirectoryDataOffset);
|
|
4998
|
+
if (storedPointsAtDirectory) {
|
|
4999
|
+
reconcile = expectedPointsAtDirectory;
|
|
5000
|
+
} else if (!expectedPointsAtDirectory) {
|
|
5001
|
+
const signatureRecordOffset = await findDigitalSignatureRecordOffset(reader, centralDirectoryEndOffset);
|
|
5002
|
+
const signedDirectoryDataOffset = signatureRecordOffset - directoryDataLength;
|
|
5003
|
+
if (signatureRecordOffset !== UNDEFINED_VALUE && signedDirectoryDataOffset >= 0 &&
|
|
5004
|
+
await pointsAtDirectory(reader, signedDirectoryDataOffset)) {
|
|
5005
|
+
expectedDirectoryDataOffset = signedDirectoryDataOffset;
|
|
5006
|
+
}
|
|
5007
|
+
}
|
|
4995
5008
|
}
|
|
4996
5009
|
if (reconcile) {
|
|
4997
5010
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
4998
5011
|
directoryDataOffset = expectedDirectoryDataOffset;
|
|
5012
|
+
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
|
|
5013
|
+
directoryView = getDataView(directoryArray);
|
|
4999
5014
|
if (directoryDataOffset > originalDirectoryDataOffset) {
|
|
5000
5015
|
prependedDataLength += directoryDataOffset - originalDirectoryDataOffset;
|
|
5001
5016
|
prependedCentralDirectory = storedPointsAtDirectory;
|
|
5017
|
+
} else {
|
|
5018
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET);
|
|
5019
|
+
const offsetDelta = directoryDataOffset - originalDirectoryDataOffset;
|
|
5020
|
+
if (directoryArray.length >= CENTRAL_FILE_HEADER_LENGTH) {
|
|
5021
|
+
const localHeaderOffset = getUint32$1(directoryView, 42);
|
|
5022
|
+
if (!await startsWithSignature(reader, localHeaderOffset, LOCAL_FILE_HEADER_SIGNATURE) &&
|
|
5023
|
+
await startsWithSignature(reader, localHeaderOffset + offsetDelta, LOCAL_FILE_HEADER_SIGNATURE)) {
|
|
5024
|
+
prependedDataLength += offsetDelta;
|
|
5025
|
+
}
|
|
5026
|
+
}
|
|
5002
5027
|
}
|
|
5003
|
-
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
|
|
5004
|
-
directoryView = getDataView(directoryArray);
|
|
5005
5028
|
}
|
|
5006
5029
|
}
|
|
5007
5030
|
}
|
|
@@ -5112,7 +5135,16 @@
|
|
|
5112
5135
|
filename,
|
|
5113
5136
|
comment
|
|
5114
5137
|
});
|
|
5115
|
-
|
|
5138
|
+
let malformedExtraField;
|
|
5139
|
+
try {
|
|
5140
|
+
malformedExtraField = readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
|
|
5141
|
+
} catch (error) {
|
|
5142
|
+
if (checkAmbiguity || error.message != ERR_EXTRAFIELD_ZIP64_NOT_FOUND) {
|
|
5143
|
+
throw error;
|
|
5144
|
+
}
|
|
5145
|
+
fileEntry.zip64ExtraFieldMissing = true;
|
|
5146
|
+
addWarning(warnings, WARNING_MISSING_ZIP64_EXTRA_FIELD, fileEntry.filename);
|
|
5147
|
+
}
|
|
5116
5148
|
filename = fileEntry.filename;
|
|
5117
5149
|
if (normalizeFilename) {
|
|
5118
5150
|
const normalizedFilename = normalizeFilename(filename);
|
|
@@ -5154,11 +5186,12 @@
|
|
|
5154
5186
|
const sticky = Boolean(fileEntry.unixMode & FILE_ATTR_UNIX_STICKY_MASK);
|
|
5155
5187
|
const unixType = fileEntry.unixMode === UNDEFINED_VALUE ? unixExternalUpper : fileEntry.unixMode;
|
|
5156
5188
|
const symlink = (unixType & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_SYMLINK;
|
|
5157
|
-
const executable = !symlink && ((fileEntry.unixMode !== UNDEFINED_VALUE)
|
|
5158
|
-
? ((fileEntry.unixMode & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)
|
|
5159
|
-
: (unixCompatible && ((unixExternalUpper & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)));
|
|
5160
5189
|
const modeIsDir = fileEntry.unixMode !== UNDEFINED_VALUE && ((fileEntry.unixMode & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR);
|
|
5161
5190
|
const upperIsDir = ((unixExternalUpper & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR);
|
|
5191
|
+
const directory = modeIsDir || upperIsDir || (msDosCompatible && msdosAttributes.directory) || fileEntry.filename.endsWith(DIRECTORY_SIGNATURE);
|
|
5192
|
+
const executable = !symlink && !directory && ((fileEntry.unixMode !== UNDEFINED_VALUE)
|
|
5193
|
+
? ((fileEntry.unixMode & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)
|
|
5194
|
+
: (unixCompatible && ((unixExternalUpper & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)));
|
|
5162
5195
|
Object.assign(fileEntry, {
|
|
5163
5196
|
setuid,
|
|
5164
5197
|
setgid,
|
|
@@ -5166,7 +5199,7 @@
|
|
|
5166
5199
|
symlink,
|
|
5167
5200
|
unixExternalUpper,
|
|
5168
5201
|
executable,
|
|
5169
|
-
directory
|
|
5202
|
+
directory,
|
|
5170
5203
|
zipCrypto: fileEntry.encrypted && !fileEntry.extraFieldAES
|
|
5171
5204
|
});
|
|
5172
5205
|
const entry = new Entry(fileEntry);
|
|
@@ -5222,10 +5255,10 @@
|
|
|
5222
5255
|
const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
|
|
5223
5256
|
const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
|
|
5224
5257
|
startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
|
|
5225
|
-
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5258
|
+
if (checkAmbiguity && (prependedDataLength > 0 || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5226
5259
|
throwAmbiguousArchive(WARNING_PREPENDED_DATA);
|
|
5227
5260
|
}
|
|
5228
|
-
if (prependedDataLength || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
|
|
5261
|
+
if (prependedDataLength > 0 || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
|
|
5229
5262
|
addWarning(warnings, WARNING_PREPENDED_DATA);
|
|
5230
5263
|
}
|
|
5231
5264
|
if (prependedCentralDirectory) {
|
|
@@ -5385,6 +5418,9 @@
|
|
|
5385
5418
|
|
|
5386
5419
|
async getData(writer, fileEntry, readRanges, options = {}) {
|
|
5387
5420
|
const zipEntry = this;
|
|
5421
|
+
if (zipEntry.zip64ExtraFieldMissing) {
|
|
5422
|
+
throw new Error(ERR_EXTRAFIELD_ZIP64_NOT_FOUND);
|
|
5423
|
+
}
|
|
5388
5424
|
const config = getConfiguration();
|
|
5389
5425
|
const {
|
|
5390
5426
|
reader,
|
|
@@ -5622,6 +5658,30 @@
|
|
|
5622
5658
|
return wrappedFilesLength % (MAX_16_BITS + 1) ? 0 : wrappedFilesLength;
|
|
5623
5659
|
}
|
|
5624
5660
|
|
|
5661
|
+
function pointsAtDirectory(reader, offset) {
|
|
5662
|
+
return startsWithSignature(reader, offset, CENTRAL_FILE_HEADER_SIGNATURE);
|
|
5663
|
+
}
|
|
5664
|
+
|
|
5665
|
+
async function startsWithSignature(reader, offset, signature) {
|
|
5666
|
+
if (offset < 0 || offset + 4 > reader.size) {
|
|
5667
|
+
return false;
|
|
5668
|
+
}
|
|
5669
|
+
const signatureArray = await readUint8Array(reader, offset, 4);
|
|
5670
|
+
return getUint32$1(getDataView(signatureArray), 0) == signature;
|
|
5671
|
+
}
|
|
5672
|
+
|
|
5673
|
+
async function findDigitalSignatureRecordOffset(reader, endOffset) {
|
|
5674
|
+
const startOffset = Math.max(0, endOffset - (6 + MAX_16_BITS));
|
|
5675
|
+
const tailArray = await readUint8Array(reader, startOffset, endOffset - startOffset);
|
|
5676
|
+
const tailView = getDataView(tailArray);
|
|
5677
|
+
for (let indexByte = tailArray.length - 6; indexByte >= 0; indexByte--) {
|
|
5678
|
+
if (getUint32$1(tailView, indexByte) == DIGITAL_SIGNATURE_RECORD_SIGNATURE &&
|
|
5679
|
+
indexByte + 6 + getUint16$1(tailView, indexByte + 4) == tailArray.length) {
|
|
5680
|
+
return startOffset + indexByte;
|
|
5681
|
+
}
|
|
5682
|
+
}
|
|
5683
|
+
}
|
|
5684
|
+
|
|
5625
5685
|
function readDigitalSignature(signatureRecordArray) {
|
|
5626
5686
|
if (signatureRecordArray.length >= 6) {
|
|
5627
5687
|
const signatureRecordView = getDataView(signatureRecordArray);
|
|
@@ -5753,6 +5813,11 @@
|
|
|
5753
5813
|
readExtraFieldUnixDates(extraFieldUnixType1, directory);
|
|
5754
5814
|
directory.extraFieldUnixType1 = extraFieldUnixType1;
|
|
5755
5815
|
}
|
|
5816
|
+
const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
5817
|
+
if (extraFieldExtendedTimestamp) {
|
|
5818
|
+
readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
|
|
5819
|
+
directory.extraFieldExtendedTimestamp = extraFieldExtendedTimestamp;
|
|
5820
|
+
}
|
|
5756
5821
|
const extraFieldNTFS = extraField.get(EXTRAFIELD_TYPE_NTFS);
|
|
5757
5822
|
if (extraFieldNTFS) {
|
|
5758
5823
|
readExtraFieldNTFS(extraFieldNTFS, directory);
|
|
@@ -5769,11 +5834,6 @@
|
|
|
5769
5834
|
readExtraFieldUnix(extraFieldUnix, unixIdsRead ? {} : directory, false);
|
|
5770
5835
|
directory.extraFieldUnix = extraFieldUnix;
|
|
5771
5836
|
}
|
|
5772
|
-
const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
5773
|
-
if (extraFieldExtendedTimestamp) {
|
|
5774
|
-
readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
|
|
5775
|
-
directory.extraFieldExtendedTimestamp = extraFieldExtendedTimestamp;
|
|
5776
|
-
}
|
|
5777
5837
|
const extraFieldUSDZ = extraField.get(EXTRAFIELD_TYPE_USDZ);
|
|
5778
5838
|
if (extraFieldUSDZ) {
|
|
5779
5839
|
directory.extraFieldUSDZ = extraFieldUSDZ;
|
|
@@ -6412,11 +6472,13 @@
|
|
|
6412
6472
|
WARNING_COMPRESSED_PATCHED_DATA: WARNING_COMPRESSED_PATCHED_DATA,
|
|
6413
6473
|
WARNING_DUPLICATE_FILENAME: WARNING_DUPLICATE_FILENAME,
|
|
6414
6474
|
WARNING_MALFORMED_EXTRA_FIELD: WARNING_MALFORMED_EXTRA_FIELD,
|
|
6475
|
+
WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET: WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET,
|
|
6415
6476
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
|
|
6416
6477
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
|
|
6417
6478
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
|
|
6418
6479
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME: WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME,
|
|
6419
6480
|
WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
|
|
6481
|
+
WARNING_MISSING_ZIP64_EXTRA_FIELD: WARNING_MISSING_ZIP64_EXTRA_FIELD,
|
|
6420
6482
|
WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY: WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY,
|
|
6421
6483
|
WARNING_PREPENDED_CENTRAL_DIRECTORY: WARNING_PREPENDED_CENTRAL_DIRECTORY,
|
|
6422
6484
|
WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
|
|
@@ -6549,13 +6611,14 @@
|
|
|
6549
6611
|
return watchPromiseError(this, prependZipEntries(this, reader));
|
|
6550
6612
|
}
|
|
6551
6613
|
|
|
6552
|
-
appendZip(reader) {
|
|
6553
|
-
return watchPromiseError(this, this.appendZipEntries(reader));
|
|
6614
|
+
appendZip(reader, options = {}) {
|
|
6615
|
+
return watchPromiseError(this, this.appendZipEntries(reader, options));
|
|
6554
6616
|
}
|
|
6555
6617
|
|
|
6556
|
-
async appendZipEntries(reader) {
|
|
6618
|
+
async appendZipEntries(reader, options = {}) {
|
|
6557
6619
|
const zipWriter = this;
|
|
6558
6620
|
const { pendingAddFileCalls, filenames, fileEntries } = zipWriter;
|
|
6621
|
+
const filter = checkFunctionOption(options.filter);
|
|
6559
6622
|
while (pendingAddFileCalls.size) {
|
|
6560
6623
|
await Promise.allSettled(Array.from(pendingAddFileCalls));
|
|
6561
6624
|
}
|
|
@@ -6574,10 +6637,16 @@
|
|
|
6574
6637
|
const { ZipReader } = await Promise.resolve().then(function () { return zipReader; });
|
|
6575
6638
|
const zipReader$1 = new ZipReader(reader);
|
|
6576
6639
|
const entries = await zipReader$1.getEntries();
|
|
6640
|
+
const keptEntries = [];
|
|
6641
|
+
for (const entry of entries) {
|
|
6642
|
+
if (!filter || await filter(entry)) {
|
|
6643
|
+
keptEntries.push(entry);
|
|
6644
|
+
}
|
|
6645
|
+
}
|
|
6577
6646
|
await zipReader$1.close();
|
|
6578
6647
|
await initStream(zipWriter.writer);
|
|
6579
6648
|
const { directoryOffset } = zipReader$1;
|
|
6580
|
-
|
|
6649
|
+
keptEntries.forEach(({ filename }) => {
|
|
6581
6650
|
if (filenames.has(filename)) {
|
|
6582
6651
|
throw new Error(ERR_DUPLICATED_NAME);
|
|
6583
6652
|
}
|
|
@@ -6598,8 +6667,8 @@
|
|
|
6598
6667
|
zipWriter.offset += SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
|
|
6599
6668
|
}
|
|
6600
6669
|
}
|
|
6601
|
-
const entryPositions = await copyZipData(zipWriter, reader, entries, directoryOffset);
|
|
6602
|
-
|
|
6670
|
+
const entryPositions = await copyZipData(zipWriter, reader, entries, keptEntries, directoryOffset, Boolean(filter));
|
|
6671
|
+
keptEntries.forEach(entry => {
|
|
6603
6672
|
const {
|
|
6604
6673
|
version,
|
|
6605
6674
|
rawLastModDate,
|
|
@@ -8610,26 +8679,42 @@
|
|
|
8610
8679
|
return rawExtraField;
|
|
8611
8680
|
}
|
|
8612
8681
|
|
|
8613
|
-
async function copyZipData(zipWriter, reader, entries, directoryOffset) {
|
|
8682
|
+
async function copyZipData(zipWriter, reader, entries, keptEntries, directoryOffset, compact) {
|
|
8614
8683
|
const { writer } = zipWriter;
|
|
8615
8684
|
const entryPositions = new Map();
|
|
8616
|
-
if (writer.closeDisk) {
|
|
8685
|
+
if (writer.closeDisk || compact) {
|
|
8617
8686
|
const sortedEntries = Array.from(entries).sort((firstEntry, secondEntry) =>
|
|
8618
8687
|
getSourceOffset(reader, firstEntry) - getSourceOffset(reader, secondEntry));
|
|
8619
|
-
|
|
8620
|
-
|
|
8621
|
-
|
|
8622
|
-
|
|
8623
|
-
|
|
8624
|
-
|
|
8625
|
-
|
|
8626
|
-
|
|
8627
|
-
|
|
8628
|
-
|
|
8629
|
-
|
|
8630
|
-
|
|
8688
|
+
const regionEnds = getRegionEnds(reader, sortedEntries, directoryOffset);
|
|
8689
|
+
const keptEntrySet = new Set(keptEntries);
|
|
8690
|
+
let copiedOffset = 0;
|
|
8691
|
+
let lastPosition;
|
|
8692
|
+
for (let indexEntry = 0; indexEntry < sortedEntries.length; indexEntry++) {
|
|
8693
|
+
const entry = sortedEntries[indexEntry];
|
|
8694
|
+
if (keptEntrySet.has(entry)) {
|
|
8695
|
+
const sourceOffset = getSourceOffset(reader, entry);
|
|
8696
|
+
if (sourceOffset < copiedOffset) {
|
|
8697
|
+
entryPositions.set(entry, lastPosition);
|
|
8698
|
+
} else {
|
|
8699
|
+
if (!compact) {
|
|
8700
|
+
await copyData(zipWriter, reader, copiedOffset, sourceOffset - copiedOffset);
|
|
8701
|
+
}
|
|
8702
|
+
if (writer.closeDisk && exceedsAvailableSize(writer, await getLocalHeaderLength(reader, sourceOffset))) {
|
|
8703
|
+
await writer.closeDisk();
|
|
8704
|
+
}
|
|
8705
|
+
lastPosition = {
|
|
8706
|
+
offset: getSegmentOffset(zipWriter, writer),
|
|
8707
|
+
diskNumberStart: getDiskNumber(writer)
|
|
8708
|
+
};
|
|
8709
|
+
entryPositions.set(entry, lastPosition);
|
|
8710
|
+
await copyData(zipWriter, reader, sourceOffset, regionEnds[indexEntry] - sourceOffset);
|
|
8711
|
+
copiedOffset = regionEnds[indexEntry];
|
|
8712
|
+
}
|
|
8713
|
+
}
|
|
8714
|
+
}
|
|
8715
|
+
if (!compact) {
|
|
8716
|
+
await copyData(zipWriter, reader, copiedOffset, directoryOffset - copiedOffset);
|
|
8631
8717
|
}
|
|
8632
|
-
await copyData(zipWriter, reader, copiedLength, directoryOffset - copiedLength);
|
|
8633
8718
|
} else {
|
|
8634
8719
|
const baseOffset = zipWriter.offset;
|
|
8635
8720
|
await copyData(zipWriter, reader, 0, directoryOffset);
|
|
@@ -8641,6 +8726,20 @@
|
|
|
8641
8726
|
return entryPositions;
|
|
8642
8727
|
}
|
|
8643
8728
|
|
|
8729
|
+
function getRegionEnds(reader, sortedEntries, directoryOffset) {
|
|
8730
|
+
const regionEnds = new Array(sortedEntries.length);
|
|
8731
|
+
let regionEnd = directoryOffset;
|
|
8732
|
+
for (let indexEntry = sortedEntries.length - 1; indexEntry >= 0; indexEntry--) {
|
|
8733
|
+
const sourceOffset = getSourceOffset(reader, sortedEntries[indexEntry]);
|
|
8734
|
+
const nextEntry = sortedEntries[indexEntry + 1];
|
|
8735
|
+
if (nextEntry && getSourceOffset(reader, nextEntry) > sourceOffset) {
|
|
8736
|
+
regionEnd = getSourceOffset(reader, nextEntry);
|
|
8737
|
+
}
|
|
8738
|
+
regionEnds[indexEntry] = regionEnd;
|
|
8739
|
+
}
|
|
8740
|
+
return regionEnds;
|
|
8741
|
+
}
|
|
8742
|
+
|
|
8644
8743
|
async function copyData(zipWriter, reader, offset, size) {
|
|
8645
8744
|
if (size > 0) {
|
|
8646
8745
|
const { writer } = zipWriter;
|
|
@@ -9018,7 +9117,7 @@
|
|
|
9018
9117
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
9019
9118
|
*/
|
|
9020
9119
|
|
|
9021
|
-
const VERSION = "2.
|
|
9120
|
+
const VERSION = "2.20.0";
|
|
9022
9121
|
|
|
9023
9122
|
/*
|
|
9024
9123
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -11079,11 +11178,13 @@
|
|
|
11079
11178
|
exports.WARNING_COMPRESSION_UNAVAILABLE = WARNING_COMPRESSION_UNAVAILABLE;
|
|
11080
11179
|
exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
|
|
11081
11180
|
exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
|
|
11181
|
+
exports.WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET = WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET;
|
|
11082
11182
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
|
|
11083
11183
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
|
|
11084
11184
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
|
|
11085
11185
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME;
|
|
11086
11186
|
exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
|
|
11187
|
+
exports.WARNING_MISSING_ZIP64_EXTRA_FIELD = WARNING_MISSING_ZIP64_EXTRA_FIELD;
|
|
11087
11188
|
exports.WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY;
|
|
11088
11189
|
exports.WARNING_PREPENDED_CENTRAL_DIRECTORY = WARNING_PREPENDED_CENTRAL_DIRECTORY;
|
|
11089
11190
|
exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
|