@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.js
CHANGED
|
@@ -4809,6 +4809,8 @@
|
|
|
4809
4809
|
const WARNING_PREPENDED_DATA = "prepended data";
|
|
4810
4810
|
const WARNING_PREPENDED_CENTRAL_DIRECTORY = "prepended central directory";
|
|
4811
4811
|
const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
|
|
4812
|
+
const WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET = "mismatched central directory offset";
|
|
4813
|
+
const WARNING_MISSING_ZIP64_EXTRA_FIELD = "missing zip64 extra field";
|
|
4812
4814
|
const WARNING_DUPLICATE_FILENAME = "duplicate filename";
|
|
4813
4815
|
const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
|
|
4814
4816
|
const WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = "multiple end of central directory records";
|
|
@@ -4971,6 +4973,8 @@
|
|
|
4971
4973
|
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4972
4974
|
}
|
|
4973
4975
|
directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
|
|
4976
|
+
} else if (directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || diskNumber == MAX_16_BITS) {
|
|
4977
|
+
throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
|
|
4974
4978
|
}
|
|
4975
4979
|
}
|
|
4976
4980
|
let declaredDirectoryDataLength = directoryDataLength;
|
|
@@ -4993,25 +4997,44 @@
|
|
|
4993
4997
|
if (directoryArray.length < 4) {
|
|
4994
4998
|
throw new Error(ERR_BAD_FORMAT);
|
|
4995
4999
|
}
|
|
4996
|
-
|
|
5000
|
+
let expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
|
|
4997
5001
|
if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
|
|
4998
5002
|
const storedPointsAtDirectory = getUint32$1(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE ||
|
|
4999
5003
|
Boolean(directoryEncryptionInfo && directoryEncryptionInfo.compressedSize) ||
|
|
5000
5004
|
detectEncryptedCentralDirectory(directoryView);
|
|
5001
5005
|
let reconcile = !storedPointsAtDirectory;
|
|
5002
|
-
if (
|
|
5003
|
-
const
|
|
5004
|
-
|
|
5006
|
+
if (expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
|
|
5007
|
+
const expectedPointsAtDirectory = await pointsAtDirectory(reader, expectedDirectoryDataOffset);
|
|
5008
|
+
if (storedPointsAtDirectory) {
|
|
5009
|
+
reconcile = expectedPointsAtDirectory;
|
|
5010
|
+
} else if (!expectedPointsAtDirectory) {
|
|
5011
|
+
const signatureRecordOffset = await findDigitalSignatureRecordOffset(reader, centralDirectoryEndOffset);
|
|
5012
|
+
const signedDirectoryDataOffset = signatureRecordOffset - directoryDataLength;
|
|
5013
|
+
if (signatureRecordOffset !== UNDEFINED_VALUE && signedDirectoryDataOffset >= 0 &&
|
|
5014
|
+
await pointsAtDirectory(reader, signedDirectoryDataOffset)) {
|
|
5015
|
+
expectedDirectoryDataOffset = signedDirectoryDataOffset;
|
|
5016
|
+
}
|
|
5017
|
+
}
|
|
5005
5018
|
}
|
|
5006
5019
|
if (reconcile) {
|
|
5007
5020
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
5008
5021
|
directoryDataOffset = expectedDirectoryDataOffset;
|
|
5022
|
+
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
|
|
5023
|
+
directoryView = getDataView(directoryArray);
|
|
5009
5024
|
if (directoryDataOffset > originalDirectoryDataOffset) {
|
|
5010
5025
|
prependedDataLength += directoryDataOffset - originalDirectoryDataOffset;
|
|
5011
5026
|
prependedCentralDirectory = storedPointsAtDirectory;
|
|
5027
|
+
} else {
|
|
5028
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET);
|
|
5029
|
+
const offsetDelta = directoryDataOffset - originalDirectoryDataOffset;
|
|
5030
|
+
if (directoryArray.length >= CENTRAL_FILE_HEADER_LENGTH) {
|
|
5031
|
+
const localHeaderOffset = getUint32$1(directoryView, 42);
|
|
5032
|
+
if (!await startsWithSignature(reader, localHeaderOffset, LOCAL_FILE_HEADER_SIGNATURE) &&
|
|
5033
|
+
await startsWithSignature(reader, localHeaderOffset + offsetDelta, LOCAL_FILE_HEADER_SIGNATURE)) {
|
|
5034
|
+
prependedDataLength += offsetDelta;
|
|
5035
|
+
}
|
|
5036
|
+
}
|
|
5012
5037
|
}
|
|
5013
|
-
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
|
|
5014
|
-
directoryView = getDataView(directoryArray);
|
|
5015
5038
|
}
|
|
5016
5039
|
}
|
|
5017
5040
|
}
|
|
@@ -5122,7 +5145,16 @@
|
|
|
5122
5145
|
filename,
|
|
5123
5146
|
comment
|
|
5124
5147
|
});
|
|
5125
|
-
|
|
5148
|
+
let malformedExtraField;
|
|
5149
|
+
try {
|
|
5150
|
+
malformedExtraField = readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
|
|
5151
|
+
} catch (error) {
|
|
5152
|
+
if (checkAmbiguity || error.message != ERR_EXTRAFIELD_ZIP64_NOT_FOUND) {
|
|
5153
|
+
throw error;
|
|
5154
|
+
}
|
|
5155
|
+
fileEntry.zip64ExtraFieldMissing = true;
|
|
5156
|
+
addWarning(warnings, WARNING_MISSING_ZIP64_EXTRA_FIELD, fileEntry.filename);
|
|
5157
|
+
}
|
|
5126
5158
|
filename = fileEntry.filename;
|
|
5127
5159
|
if (normalizeFilename) {
|
|
5128
5160
|
const normalizedFilename = normalizeFilename(filename);
|
|
@@ -5164,11 +5196,12 @@
|
|
|
5164
5196
|
const sticky = Boolean(fileEntry.unixMode & FILE_ATTR_UNIX_STICKY_MASK);
|
|
5165
5197
|
const unixType = fileEntry.unixMode === UNDEFINED_VALUE ? unixExternalUpper : fileEntry.unixMode;
|
|
5166
5198
|
const symlink = (unixType & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_SYMLINK;
|
|
5167
|
-
const executable = !symlink && ((fileEntry.unixMode !== UNDEFINED_VALUE)
|
|
5168
|
-
? ((fileEntry.unixMode & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)
|
|
5169
|
-
: (unixCompatible && ((unixExternalUpper & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)));
|
|
5170
5199
|
const modeIsDir = fileEntry.unixMode !== UNDEFINED_VALUE && ((fileEntry.unixMode & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR);
|
|
5171
5200
|
const upperIsDir = ((unixExternalUpper & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR);
|
|
5201
|
+
const directory = modeIsDir || upperIsDir || (msDosCompatible && msdosAttributes.directory) || fileEntry.filename.endsWith(DIRECTORY_SIGNATURE);
|
|
5202
|
+
const executable = !symlink && !directory && ((fileEntry.unixMode !== UNDEFINED_VALUE)
|
|
5203
|
+
? ((fileEntry.unixMode & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)
|
|
5204
|
+
: (unixCompatible && ((unixExternalUpper & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)));
|
|
5172
5205
|
Object.assign(fileEntry, {
|
|
5173
5206
|
setuid,
|
|
5174
5207
|
setgid,
|
|
@@ -5176,7 +5209,7 @@
|
|
|
5176
5209
|
symlink,
|
|
5177
5210
|
unixExternalUpper,
|
|
5178
5211
|
executable,
|
|
5179
|
-
directory
|
|
5212
|
+
directory,
|
|
5180
5213
|
zipCrypto: fileEntry.encrypted && !fileEntry.extraFieldAES
|
|
5181
5214
|
});
|
|
5182
5215
|
const entry = new Entry(fileEntry);
|
|
@@ -5232,10 +5265,10 @@
|
|
|
5232
5265
|
const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
|
|
5233
5266
|
const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
|
|
5234
5267
|
startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
|
|
5235
|
-
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5268
|
+
if (checkAmbiguity && (prependedDataLength > 0 || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5236
5269
|
throwAmbiguousArchive(WARNING_PREPENDED_DATA);
|
|
5237
5270
|
}
|
|
5238
|
-
if (prependedDataLength || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
|
|
5271
|
+
if (prependedDataLength > 0 || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
|
|
5239
5272
|
addWarning(warnings, WARNING_PREPENDED_DATA);
|
|
5240
5273
|
}
|
|
5241
5274
|
if (prependedCentralDirectory) {
|
|
@@ -5395,6 +5428,9 @@
|
|
|
5395
5428
|
|
|
5396
5429
|
async getData(writer, fileEntry, readRanges, options = {}) {
|
|
5397
5430
|
const zipEntry = this;
|
|
5431
|
+
if (zipEntry.zip64ExtraFieldMissing) {
|
|
5432
|
+
throw new Error(ERR_EXTRAFIELD_ZIP64_NOT_FOUND);
|
|
5433
|
+
}
|
|
5398
5434
|
const config = getConfiguration();
|
|
5399
5435
|
const {
|
|
5400
5436
|
reader,
|
|
@@ -5632,6 +5668,30 @@
|
|
|
5632
5668
|
return wrappedFilesLength % (MAX_16_BITS + 1) ? 0 : wrappedFilesLength;
|
|
5633
5669
|
}
|
|
5634
5670
|
|
|
5671
|
+
function pointsAtDirectory(reader, offset) {
|
|
5672
|
+
return startsWithSignature(reader, offset, CENTRAL_FILE_HEADER_SIGNATURE);
|
|
5673
|
+
}
|
|
5674
|
+
|
|
5675
|
+
async function startsWithSignature(reader, offset, signature) {
|
|
5676
|
+
if (offset < 0 || offset + 4 > reader.size) {
|
|
5677
|
+
return false;
|
|
5678
|
+
}
|
|
5679
|
+
const signatureArray = await readUint8Array(reader, offset, 4);
|
|
5680
|
+
return getUint32$1(getDataView(signatureArray), 0) == signature;
|
|
5681
|
+
}
|
|
5682
|
+
|
|
5683
|
+
async function findDigitalSignatureRecordOffset(reader, endOffset) {
|
|
5684
|
+
const startOffset = Math.max(0, endOffset - (6 + MAX_16_BITS));
|
|
5685
|
+
const tailArray = await readUint8Array(reader, startOffset, endOffset - startOffset);
|
|
5686
|
+
const tailView = getDataView(tailArray);
|
|
5687
|
+
for (let indexByte = tailArray.length - 6; indexByte >= 0; indexByte--) {
|
|
5688
|
+
if (getUint32$1(tailView, indexByte) == DIGITAL_SIGNATURE_RECORD_SIGNATURE &&
|
|
5689
|
+
indexByte + 6 + getUint16$1(tailView, indexByte + 4) == tailArray.length) {
|
|
5690
|
+
return startOffset + indexByte;
|
|
5691
|
+
}
|
|
5692
|
+
}
|
|
5693
|
+
}
|
|
5694
|
+
|
|
5635
5695
|
function readDigitalSignature(signatureRecordArray) {
|
|
5636
5696
|
if (signatureRecordArray.length >= 6) {
|
|
5637
5697
|
const signatureRecordView = getDataView(signatureRecordArray);
|
|
@@ -5763,6 +5823,11 @@
|
|
|
5763
5823
|
readExtraFieldUnixDates(extraFieldUnixType1, directory);
|
|
5764
5824
|
directory.extraFieldUnixType1 = extraFieldUnixType1;
|
|
5765
5825
|
}
|
|
5826
|
+
const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
5827
|
+
if (extraFieldExtendedTimestamp) {
|
|
5828
|
+
readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
|
|
5829
|
+
directory.extraFieldExtendedTimestamp = extraFieldExtendedTimestamp;
|
|
5830
|
+
}
|
|
5766
5831
|
const extraFieldNTFS = extraField.get(EXTRAFIELD_TYPE_NTFS);
|
|
5767
5832
|
if (extraFieldNTFS) {
|
|
5768
5833
|
readExtraFieldNTFS(extraFieldNTFS, directory);
|
|
@@ -5779,11 +5844,6 @@
|
|
|
5779
5844
|
readExtraFieldUnix(extraFieldUnix, unixIdsRead ? {} : directory, false);
|
|
5780
5845
|
directory.extraFieldUnix = extraFieldUnix;
|
|
5781
5846
|
}
|
|
5782
|
-
const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
5783
|
-
if (extraFieldExtendedTimestamp) {
|
|
5784
|
-
readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
|
|
5785
|
-
directory.extraFieldExtendedTimestamp = extraFieldExtendedTimestamp;
|
|
5786
|
-
}
|
|
5787
5847
|
const extraFieldUSDZ = extraField.get(EXTRAFIELD_TYPE_USDZ);
|
|
5788
5848
|
if (extraFieldUSDZ) {
|
|
5789
5849
|
directory.extraFieldUSDZ = extraFieldUSDZ;
|
|
@@ -6422,11 +6482,13 @@
|
|
|
6422
6482
|
WARNING_COMPRESSED_PATCHED_DATA: WARNING_COMPRESSED_PATCHED_DATA,
|
|
6423
6483
|
WARNING_DUPLICATE_FILENAME: WARNING_DUPLICATE_FILENAME,
|
|
6424
6484
|
WARNING_MALFORMED_EXTRA_FIELD: WARNING_MALFORMED_EXTRA_FIELD,
|
|
6485
|
+
WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET: WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET,
|
|
6425
6486
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
|
|
6426
6487
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
|
|
6427
6488
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
|
|
6428
6489
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME: WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME,
|
|
6429
6490
|
WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
|
|
6491
|
+
WARNING_MISSING_ZIP64_EXTRA_FIELD: WARNING_MISSING_ZIP64_EXTRA_FIELD,
|
|
6430
6492
|
WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY: WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY,
|
|
6431
6493
|
WARNING_PREPENDED_CENTRAL_DIRECTORY: WARNING_PREPENDED_CENTRAL_DIRECTORY,
|
|
6432
6494
|
WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
|
|
@@ -6559,13 +6621,14 @@
|
|
|
6559
6621
|
return watchPromiseError(this, prependZipEntries(this, reader));
|
|
6560
6622
|
}
|
|
6561
6623
|
|
|
6562
|
-
appendZip(reader) {
|
|
6563
|
-
return watchPromiseError(this, this.appendZipEntries(reader));
|
|
6624
|
+
appendZip(reader, options = {}) {
|
|
6625
|
+
return watchPromiseError(this, this.appendZipEntries(reader, options));
|
|
6564
6626
|
}
|
|
6565
6627
|
|
|
6566
|
-
async appendZipEntries(reader) {
|
|
6628
|
+
async appendZipEntries(reader, options = {}) {
|
|
6567
6629
|
const zipWriter = this;
|
|
6568
6630
|
const { pendingAddFileCalls, filenames, fileEntries } = zipWriter;
|
|
6631
|
+
const filter = checkFunctionOption(options.filter);
|
|
6569
6632
|
while (pendingAddFileCalls.size) {
|
|
6570
6633
|
await Promise.allSettled(Array.from(pendingAddFileCalls));
|
|
6571
6634
|
}
|
|
@@ -6584,10 +6647,16 @@
|
|
|
6584
6647
|
const { ZipReader } = await Promise.resolve().then(function () { return zipReader; });
|
|
6585
6648
|
const zipReader$1 = new ZipReader(reader);
|
|
6586
6649
|
const entries = await zipReader$1.getEntries();
|
|
6650
|
+
const keptEntries = [];
|
|
6651
|
+
for (const entry of entries) {
|
|
6652
|
+
if (!filter || await filter(entry)) {
|
|
6653
|
+
keptEntries.push(entry);
|
|
6654
|
+
}
|
|
6655
|
+
}
|
|
6587
6656
|
await zipReader$1.close();
|
|
6588
6657
|
await initStream(zipWriter.writer);
|
|
6589
6658
|
const { directoryOffset } = zipReader$1;
|
|
6590
|
-
|
|
6659
|
+
keptEntries.forEach(({ filename }) => {
|
|
6591
6660
|
if (filenames.has(filename)) {
|
|
6592
6661
|
throw new Error(ERR_DUPLICATED_NAME);
|
|
6593
6662
|
}
|
|
@@ -6608,8 +6677,8 @@
|
|
|
6608
6677
|
zipWriter.offset += SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
|
|
6609
6678
|
}
|
|
6610
6679
|
}
|
|
6611
|
-
const entryPositions = await copyZipData(zipWriter, reader, entries, directoryOffset);
|
|
6612
|
-
|
|
6680
|
+
const entryPositions = await copyZipData(zipWriter, reader, entries, keptEntries, directoryOffset, Boolean(filter));
|
|
6681
|
+
keptEntries.forEach(entry => {
|
|
6613
6682
|
const {
|
|
6614
6683
|
version,
|
|
6615
6684
|
rawLastModDate,
|
|
@@ -8620,26 +8689,42 @@
|
|
|
8620
8689
|
return rawExtraField;
|
|
8621
8690
|
}
|
|
8622
8691
|
|
|
8623
|
-
async function copyZipData(zipWriter, reader, entries, directoryOffset) {
|
|
8692
|
+
async function copyZipData(zipWriter, reader, entries, keptEntries, directoryOffset, compact) {
|
|
8624
8693
|
const { writer } = zipWriter;
|
|
8625
8694
|
const entryPositions = new Map();
|
|
8626
|
-
if (writer.closeDisk) {
|
|
8695
|
+
if (writer.closeDisk || compact) {
|
|
8627
8696
|
const sortedEntries = Array.from(entries).sort((firstEntry, secondEntry) =>
|
|
8628
8697
|
getSourceOffset(reader, firstEntry) - getSourceOffset(reader, secondEntry));
|
|
8629
|
-
|
|
8630
|
-
|
|
8631
|
-
|
|
8632
|
-
|
|
8633
|
-
|
|
8634
|
-
|
|
8635
|
-
|
|
8636
|
-
|
|
8637
|
-
|
|
8638
|
-
|
|
8639
|
-
|
|
8640
|
-
|
|
8698
|
+
const regionEnds = getRegionEnds(reader, sortedEntries, directoryOffset);
|
|
8699
|
+
const keptEntrySet = new Set(keptEntries);
|
|
8700
|
+
let copiedOffset = 0;
|
|
8701
|
+
let lastPosition;
|
|
8702
|
+
for (let indexEntry = 0; indexEntry < sortedEntries.length; indexEntry++) {
|
|
8703
|
+
const entry = sortedEntries[indexEntry];
|
|
8704
|
+
if (keptEntrySet.has(entry)) {
|
|
8705
|
+
const sourceOffset = getSourceOffset(reader, entry);
|
|
8706
|
+
if (sourceOffset < copiedOffset) {
|
|
8707
|
+
entryPositions.set(entry, lastPosition);
|
|
8708
|
+
} else {
|
|
8709
|
+
if (!compact) {
|
|
8710
|
+
await copyData(zipWriter, reader, copiedOffset, sourceOffset - copiedOffset);
|
|
8711
|
+
}
|
|
8712
|
+
if (writer.closeDisk && exceedsAvailableSize(writer, await getLocalHeaderLength(reader, sourceOffset))) {
|
|
8713
|
+
await writer.closeDisk();
|
|
8714
|
+
}
|
|
8715
|
+
lastPosition = {
|
|
8716
|
+
offset: getSegmentOffset(zipWriter, writer),
|
|
8717
|
+
diskNumberStart: getDiskNumber(writer)
|
|
8718
|
+
};
|
|
8719
|
+
entryPositions.set(entry, lastPosition);
|
|
8720
|
+
await copyData(zipWriter, reader, sourceOffset, regionEnds[indexEntry] - sourceOffset);
|
|
8721
|
+
copiedOffset = regionEnds[indexEntry];
|
|
8722
|
+
}
|
|
8723
|
+
}
|
|
8724
|
+
}
|
|
8725
|
+
if (!compact) {
|
|
8726
|
+
await copyData(zipWriter, reader, copiedOffset, directoryOffset - copiedOffset);
|
|
8641
8727
|
}
|
|
8642
|
-
await copyData(zipWriter, reader, copiedLength, directoryOffset - copiedLength);
|
|
8643
8728
|
} else {
|
|
8644
8729
|
const baseOffset = zipWriter.offset;
|
|
8645
8730
|
await copyData(zipWriter, reader, 0, directoryOffset);
|
|
@@ -8651,6 +8736,20 @@
|
|
|
8651
8736
|
return entryPositions;
|
|
8652
8737
|
}
|
|
8653
8738
|
|
|
8739
|
+
function getRegionEnds(reader, sortedEntries, directoryOffset) {
|
|
8740
|
+
const regionEnds = new Array(sortedEntries.length);
|
|
8741
|
+
let regionEnd = directoryOffset;
|
|
8742
|
+
for (let indexEntry = sortedEntries.length - 1; indexEntry >= 0; indexEntry--) {
|
|
8743
|
+
const sourceOffset = getSourceOffset(reader, sortedEntries[indexEntry]);
|
|
8744
|
+
const nextEntry = sortedEntries[indexEntry + 1];
|
|
8745
|
+
if (nextEntry && getSourceOffset(reader, nextEntry) > sourceOffset) {
|
|
8746
|
+
regionEnd = getSourceOffset(reader, nextEntry);
|
|
8747
|
+
}
|
|
8748
|
+
regionEnds[indexEntry] = regionEnd;
|
|
8749
|
+
}
|
|
8750
|
+
return regionEnds;
|
|
8751
|
+
}
|
|
8752
|
+
|
|
8654
8753
|
async function copyData(zipWriter, reader, offset, size) {
|
|
8655
8754
|
if (size > 0) {
|
|
8656
8755
|
const { writer } = zipWriter;
|
|
@@ -9028,7 +9127,7 @@
|
|
|
9028
9127
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
9029
9128
|
*/
|
|
9030
9129
|
|
|
9031
|
-
const VERSION = "2.
|
|
9130
|
+
const VERSION = "2.20.0";
|
|
9032
9131
|
|
|
9033
9132
|
/*
|
|
9034
9133
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -11768,11 +11867,13 @@
|
|
|
11768
11867
|
exports.WARNING_COMPRESSION_UNAVAILABLE = WARNING_COMPRESSION_UNAVAILABLE;
|
|
11769
11868
|
exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
|
|
11770
11869
|
exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
|
|
11870
|
+
exports.WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET = WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET;
|
|
11771
11871
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
|
|
11772
11872
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
|
|
11773
11873
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
|
|
11774
11874
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME;
|
|
11775
11875
|
exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
|
|
11876
|
+
exports.WARNING_MISSING_ZIP64_EXTRA_FIELD = WARNING_MISSING_ZIP64_EXTRA_FIELD;
|
|
11776
11877
|
exports.WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY;
|
|
11777
11878
|
exports.WARNING_PREPENDED_CENTRAL_DIRECTORY = WARNING_PREPENDED_CENTRAL_DIRECTORY;
|
|
11778
11879
|
exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
|