@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.js
CHANGED
|
@@ -4789,6 +4789,8 @@
|
|
|
4789
4789
|
const WARNING_PREPENDED_DATA = "prepended data";
|
|
4790
4790
|
const WARNING_PREPENDED_CENTRAL_DIRECTORY = "prepended central directory";
|
|
4791
4791
|
const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
|
|
4792
|
+
const WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET = "mismatched central directory offset";
|
|
4793
|
+
const WARNING_MISSING_ZIP64_EXTRA_FIELD = "missing zip64 extra field";
|
|
4792
4794
|
const WARNING_DUPLICATE_FILENAME = "duplicate filename";
|
|
4793
4795
|
const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
|
|
4794
4796
|
const WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = "multiple end of central directory records";
|
|
@@ -4951,6 +4953,8 @@
|
|
|
4951
4953
|
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4952
4954
|
}
|
|
4953
4955
|
directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
|
|
4956
|
+
} else if (directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || diskNumber == MAX_16_BITS) {
|
|
4957
|
+
throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
|
|
4954
4958
|
}
|
|
4955
4959
|
}
|
|
4956
4960
|
let declaredDirectoryDataLength = directoryDataLength;
|
|
@@ -4973,25 +4977,44 @@
|
|
|
4973
4977
|
if (directoryArray.length < 4) {
|
|
4974
4978
|
throw new Error(ERR_BAD_FORMAT);
|
|
4975
4979
|
}
|
|
4976
|
-
|
|
4980
|
+
let expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
|
|
4977
4981
|
if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
|
|
4978
4982
|
const storedPointsAtDirectory = getUint32$1(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE ||
|
|
4979
4983
|
Boolean(directoryEncryptionInfo && directoryEncryptionInfo.compressedSize) ||
|
|
4980
4984
|
detectEncryptedCentralDirectory(directoryView);
|
|
4981
4985
|
let reconcile = !storedPointsAtDirectory;
|
|
4982
|
-
if (
|
|
4983
|
-
const
|
|
4984
|
-
|
|
4986
|
+
if (expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
|
|
4987
|
+
const expectedPointsAtDirectory = await pointsAtDirectory(reader, expectedDirectoryDataOffset);
|
|
4988
|
+
if (storedPointsAtDirectory) {
|
|
4989
|
+
reconcile = expectedPointsAtDirectory;
|
|
4990
|
+
} else if (!expectedPointsAtDirectory) {
|
|
4991
|
+
const signatureRecordOffset = await findDigitalSignatureRecordOffset(reader, centralDirectoryEndOffset);
|
|
4992
|
+
const signedDirectoryDataOffset = signatureRecordOffset - directoryDataLength;
|
|
4993
|
+
if (signatureRecordOffset !== UNDEFINED_VALUE && signedDirectoryDataOffset >= 0 &&
|
|
4994
|
+
await pointsAtDirectory(reader, signedDirectoryDataOffset)) {
|
|
4995
|
+
expectedDirectoryDataOffset = signedDirectoryDataOffset;
|
|
4996
|
+
}
|
|
4997
|
+
}
|
|
4985
4998
|
}
|
|
4986
4999
|
if (reconcile) {
|
|
4987
5000
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
4988
5001
|
directoryDataOffset = expectedDirectoryDataOffset;
|
|
5002
|
+
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
|
|
5003
|
+
directoryView = getDataView(directoryArray);
|
|
4989
5004
|
if (directoryDataOffset > originalDirectoryDataOffset) {
|
|
4990
5005
|
prependedDataLength += directoryDataOffset - originalDirectoryDataOffset;
|
|
4991
5006
|
prependedCentralDirectory = storedPointsAtDirectory;
|
|
5007
|
+
} else {
|
|
5008
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET);
|
|
5009
|
+
const offsetDelta = directoryDataOffset - originalDirectoryDataOffset;
|
|
5010
|
+
if (directoryArray.length >= CENTRAL_FILE_HEADER_LENGTH) {
|
|
5011
|
+
const localHeaderOffset = getUint32$1(directoryView, 42);
|
|
5012
|
+
if (!await startsWithSignature(reader, localHeaderOffset, LOCAL_FILE_HEADER_SIGNATURE) &&
|
|
5013
|
+
await startsWithSignature(reader, localHeaderOffset + offsetDelta, LOCAL_FILE_HEADER_SIGNATURE)) {
|
|
5014
|
+
prependedDataLength += offsetDelta;
|
|
5015
|
+
}
|
|
5016
|
+
}
|
|
4992
5017
|
}
|
|
4993
|
-
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
|
|
4994
|
-
directoryView = getDataView(directoryArray);
|
|
4995
5018
|
}
|
|
4996
5019
|
}
|
|
4997
5020
|
}
|
|
@@ -5102,7 +5125,16 @@
|
|
|
5102
5125
|
filename,
|
|
5103
5126
|
comment
|
|
5104
5127
|
});
|
|
5105
|
-
|
|
5128
|
+
let malformedExtraField;
|
|
5129
|
+
try {
|
|
5130
|
+
malformedExtraField = readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
|
|
5131
|
+
} catch (error) {
|
|
5132
|
+
if (checkAmbiguity || error.message != ERR_EXTRAFIELD_ZIP64_NOT_FOUND) {
|
|
5133
|
+
throw error;
|
|
5134
|
+
}
|
|
5135
|
+
fileEntry.zip64ExtraFieldMissing = true;
|
|
5136
|
+
addWarning(warnings, WARNING_MISSING_ZIP64_EXTRA_FIELD, fileEntry.filename);
|
|
5137
|
+
}
|
|
5106
5138
|
filename = fileEntry.filename;
|
|
5107
5139
|
if (normalizeFilename) {
|
|
5108
5140
|
const normalizedFilename = normalizeFilename(filename);
|
|
@@ -5144,11 +5176,12 @@
|
|
|
5144
5176
|
const sticky = Boolean(fileEntry.unixMode & FILE_ATTR_UNIX_STICKY_MASK);
|
|
5145
5177
|
const unixType = fileEntry.unixMode === UNDEFINED_VALUE ? unixExternalUpper : fileEntry.unixMode;
|
|
5146
5178
|
const symlink = (unixType & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_SYMLINK;
|
|
5147
|
-
const executable = !symlink && ((fileEntry.unixMode !== UNDEFINED_VALUE)
|
|
5148
|
-
? ((fileEntry.unixMode & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)
|
|
5149
|
-
: (unixCompatible && ((unixExternalUpper & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)));
|
|
5150
5179
|
const modeIsDir = fileEntry.unixMode !== UNDEFINED_VALUE && ((fileEntry.unixMode & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR);
|
|
5151
5180
|
const upperIsDir = ((unixExternalUpper & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR);
|
|
5181
|
+
const directory = modeIsDir || upperIsDir || (msDosCompatible && msdosAttributes.directory) || fileEntry.filename.endsWith(DIRECTORY_SIGNATURE);
|
|
5182
|
+
const executable = !symlink && !directory && ((fileEntry.unixMode !== UNDEFINED_VALUE)
|
|
5183
|
+
? ((fileEntry.unixMode & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)
|
|
5184
|
+
: (unixCompatible && ((unixExternalUpper & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)));
|
|
5152
5185
|
Object.assign(fileEntry, {
|
|
5153
5186
|
setuid,
|
|
5154
5187
|
setgid,
|
|
@@ -5156,7 +5189,7 @@
|
|
|
5156
5189
|
symlink,
|
|
5157
5190
|
unixExternalUpper,
|
|
5158
5191
|
executable,
|
|
5159
|
-
directory
|
|
5192
|
+
directory,
|
|
5160
5193
|
zipCrypto: fileEntry.encrypted && !fileEntry.extraFieldAES
|
|
5161
5194
|
});
|
|
5162
5195
|
const entry = new Entry(fileEntry);
|
|
@@ -5212,10 +5245,10 @@
|
|
|
5212
5245
|
const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
|
|
5213
5246
|
const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
|
|
5214
5247
|
startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
|
|
5215
|
-
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5248
|
+
if (checkAmbiguity && (prependedDataLength > 0 || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5216
5249
|
throwAmbiguousArchive(WARNING_PREPENDED_DATA);
|
|
5217
5250
|
}
|
|
5218
|
-
if (prependedDataLength || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
|
|
5251
|
+
if (prependedDataLength > 0 || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
|
|
5219
5252
|
addWarning(warnings, WARNING_PREPENDED_DATA);
|
|
5220
5253
|
}
|
|
5221
5254
|
if (prependedCentralDirectory) {
|
|
@@ -5375,6 +5408,9 @@
|
|
|
5375
5408
|
|
|
5376
5409
|
async getData(writer, fileEntry, readRanges, options = {}) {
|
|
5377
5410
|
const zipEntry = this;
|
|
5411
|
+
if (zipEntry.zip64ExtraFieldMissing) {
|
|
5412
|
+
throw new Error(ERR_EXTRAFIELD_ZIP64_NOT_FOUND);
|
|
5413
|
+
}
|
|
5378
5414
|
const config = getConfiguration();
|
|
5379
5415
|
const {
|
|
5380
5416
|
reader,
|
|
@@ -5612,6 +5648,30 @@
|
|
|
5612
5648
|
return wrappedFilesLength % (MAX_16_BITS + 1) ? 0 : wrappedFilesLength;
|
|
5613
5649
|
}
|
|
5614
5650
|
|
|
5651
|
+
function pointsAtDirectory(reader, offset) {
|
|
5652
|
+
return startsWithSignature(reader, offset, CENTRAL_FILE_HEADER_SIGNATURE);
|
|
5653
|
+
}
|
|
5654
|
+
|
|
5655
|
+
async function startsWithSignature(reader, offset, signature) {
|
|
5656
|
+
if (offset < 0 || offset + 4 > reader.size) {
|
|
5657
|
+
return false;
|
|
5658
|
+
}
|
|
5659
|
+
const signatureArray = await readUint8Array(reader, offset, 4);
|
|
5660
|
+
return getUint32$1(getDataView(signatureArray), 0) == signature;
|
|
5661
|
+
}
|
|
5662
|
+
|
|
5663
|
+
async function findDigitalSignatureRecordOffset(reader, endOffset) {
|
|
5664
|
+
const startOffset = Math.max(0, endOffset - (6 + MAX_16_BITS));
|
|
5665
|
+
const tailArray = await readUint8Array(reader, startOffset, endOffset - startOffset);
|
|
5666
|
+
const tailView = getDataView(tailArray);
|
|
5667
|
+
for (let indexByte = tailArray.length - 6; indexByte >= 0; indexByte--) {
|
|
5668
|
+
if (getUint32$1(tailView, indexByte) == DIGITAL_SIGNATURE_RECORD_SIGNATURE &&
|
|
5669
|
+
indexByte + 6 + getUint16$1(tailView, indexByte + 4) == tailArray.length) {
|
|
5670
|
+
return startOffset + indexByte;
|
|
5671
|
+
}
|
|
5672
|
+
}
|
|
5673
|
+
}
|
|
5674
|
+
|
|
5615
5675
|
function readDigitalSignature(signatureRecordArray) {
|
|
5616
5676
|
if (signatureRecordArray.length >= 6) {
|
|
5617
5677
|
const signatureRecordView = getDataView(signatureRecordArray);
|
|
@@ -5743,6 +5803,11 @@
|
|
|
5743
5803
|
readExtraFieldUnixDates(extraFieldUnixType1, directory);
|
|
5744
5804
|
directory.extraFieldUnixType1 = extraFieldUnixType1;
|
|
5745
5805
|
}
|
|
5806
|
+
const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
5807
|
+
if (extraFieldExtendedTimestamp) {
|
|
5808
|
+
readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
|
|
5809
|
+
directory.extraFieldExtendedTimestamp = extraFieldExtendedTimestamp;
|
|
5810
|
+
}
|
|
5746
5811
|
const extraFieldNTFS = extraField.get(EXTRAFIELD_TYPE_NTFS);
|
|
5747
5812
|
if (extraFieldNTFS) {
|
|
5748
5813
|
readExtraFieldNTFS(extraFieldNTFS, directory);
|
|
@@ -5759,11 +5824,6 @@
|
|
|
5759
5824
|
readExtraFieldUnix(extraFieldUnix, unixIdsRead ? {} : directory, false);
|
|
5760
5825
|
directory.extraFieldUnix = extraFieldUnix;
|
|
5761
5826
|
}
|
|
5762
|
-
const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
5763
|
-
if (extraFieldExtendedTimestamp) {
|
|
5764
|
-
readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
|
|
5765
|
-
directory.extraFieldExtendedTimestamp = extraFieldExtendedTimestamp;
|
|
5766
|
-
}
|
|
5767
5827
|
const extraFieldUSDZ = extraField.get(EXTRAFIELD_TYPE_USDZ);
|
|
5768
5828
|
if (extraFieldUSDZ) {
|
|
5769
5829
|
directory.extraFieldUSDZ = extraFieldUSDZ;
|
|
@@ -6402,11 +6462,13 @@
|
|
|
6402
6462
|
WARNING_COMPRESSED_PATCHED_DATA: WARNING_COMPRESSED_PATCHED_DATA,
|
|
6403
6463
|
WARNING_DUPLICATE_FILENAME: WARNING_DUPLICATE_FILENAME,
|
|
6404
6464
|
WARNING_MALFORMED_EXTRA_FIELD: WARNING_MALFORMED_EXTRA_FIELD,
|
|
6465
|
+
WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET: WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET,
|
|
6405
6466
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
|
|
6406
6467
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
|
|
6407
6468
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
|
|
6408
6469
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME: WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME,
|
|
6409
6470
|
WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
|
|
6471
|
+
WARNING_MISSING_ZIP64_EXTRA_FIELD: WARNING_MISSING_ZIP64_EXTRA_FIELD,
|
|
6410
6472
|
WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY: WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY,
|
|
6411
6473
|
WARNING_PREPENDED_CENTRAL_DIRECTORY: WARNING_PREPENDED_CENTRAL_DIRECTORY,
|
|
6412
6474
|
WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
|
|
@@ -6539,13 +6601,14 @@
|
|
|
6539
6601
|
return watchPromiseError(this, prependZipEntries(this, reader));
|
|
6540
6602
|
}
|
|
6541
6603
|
|
|
6542
|
-
appendZip(reader) {
|
|
6543
|
-
return watchPromiseError(this, this.appendZipEntries(reader));
|
|
6604
|
+
appendZip(reader, options = {}) {
|
|
6605
|
+
return watchPromiseError(this, this.appendZipEntries(reader, options));
|
|
6544
6606
|
}
|
|
6545
6607
|
|
|
6546
|
-
async appendZipEntries(reader) {
|
|
6608
|
+
async appendZipEntries(reader, options = {}) {
|
|
6547
6609
|
const zipWriter = this;
|
|
6548
6610
|
const { pendingAddFileCalls, filenames, fileEntries } = zipWriter;
|
|
6611
|
+
const filter = checkFunctionOption(options.filter);
|
|
6549
6612
|
while (pendingAddFileCalls.size) {
|
|
6550
6613
|
await Promise.allSettled(Array.from(pendingAddFileCalls));
|
|
6551
6614
|
}
|
|
@@ -6564,10 +6627,16 @@
|
|
|
6564
6627
|
const { ZipReader } = await Promise.resolve().then(function () { return zipReader; });
|
|
6565
6628
|
const zipReader$1 = new ZipReader(reader);
|
|
6566
6629
|
const entries = await zipReader$1.getEntries();
|
|
6630
|
+
const keptEntries = [];
|
|
6631
|
+
for (const entry of entries) {
|
|
6632
|
+
if (!filter || await filter(entry)) {
|
|
6633
|
+
keptEntries.push(entry);
|
|
6634
|
+
}
|
|
6635
|
+
}
|
|
6567
6636
|
await zipReader$1.close();
|
|
6568
6637
|
await initStream(zipWriter.writer);
|
|
6569
6638
|
const { directoryOffset } = zipReader$1;
|
|
6570
|
-
|
|
6639
|
+
keptEntries.forEach(({ filename }) => {
|
|
6571
6640
|
if (filenames.has(filename)) {
|
|
6572
6641
|
throw new Error(ERR_DUPLICATED_NAME);
|
|
6573
6642
|
}
|
|
@@ -6588,8 +6657,8 @@
|
|
|
6588
6657
|
zipWriter.offset += SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
|
|
6589
6658
|
}
|
|
6590
6659
|
}
|
|
6591
|
-
const entryPositions = await copyZipData(zipWriter, reader, entries, directoryOffset);
|
|
6592
|
-
|
|
6660
|
+
const entryPositions = await copyZipData(zipWriter, reader, entries, keptEntries, directoryOffset, Boolean(filter));
|
|
6661
|
+
keptEntries.forEach(entry => {
|
|
6593
6662
|
const {
|
|
6594
6663
|
version,
|
|
6595
6664
|
rawLastModDate,
|
|
@@ -8502,26 +8571,42 @@
|
|
|
8502
8571
|
return rawExtraField;
|
|
8503
8572
|
}
|
|
8504
8573
|
|
|
8505
|
-
async function copyZipData(zipWriter, reader, entries, directoryOffset) {
|
|
8574
|
+
async function copyZipData(zipWriter, reader, entries, keptEntries, directoryOffset, compact) {
|
|
8506
8575
|
const { writer } = zipWriter;
|
|
8507
8576
|
const entryPositions = new Map();
|
|
8508
|
-
if (writer.closeDisk) {
|
|
8577
|
+
if (writer.closeDisk || compact) {
|
|
8509
8578
|
const sortedEntries = Array.from(entries).sort((firstEntry, secondEntry) =>
|
|
8510
8579
|
getSourceOffset(reader, firstEntry) - getSourceOffset(reader, secondEntry));
|
|
8511
|
-
|
|
8512
|
-
|
|
8513
|
-
|
|
8514
|
-
|
|
8515
|
-
|
|
8516
|
-
|
|
8517
|
-
|
|
8518
|
-
|
|
8519
|
-
|
|
8520
|
-
|
|
8521
|
-
|
|
8522
|
-
|
|
8580
|
+
const regionEnds = getRegionEnds(reader, sortedEntries, directoryOffset);
|
|
8581
|
+
const keptEntrySet = new Set(keptEntries);
|
|
8582
|
+
let copiedOffset = 0;
|
|
8583
|
+
let lastPosition;
|
|
8584
|
+
for (let indexEntry = 0; indexEntry < sortedEntries.length; indexEntry++) {
|
|
8585
|
+
const entry = sortedEntries[indexEntry];
|
|
8586
|
+
if (keptEntrySet.has(entry)) {
|
|
8587
|
+
const sourceOffset = getSourceOffset(reader, entry);
|
|
8588
|
+
if (sourceOffset < copiedOffset) {
|
|
8589
|
+
entryPositions.set(entry, lastPosition);
|
|
8590
|
+
} else {
|
|
8591
|
+
if (!compact) {
|
|
8592
|
+
await copyData(zipWriter, reader, copiedOffset, sourceOffset - copiedOffset);
|
|
8593
|
+
}
|
|
8594
|
+
if (writer.closeDisk && exceedsAvailableSize(writer, await getLocalHeaderLength(reader, sourceOffset))) {
|
|
8595
|
+
await writer.closeDisk();
|
|
8596
|
+
}
|
|
8597
|
+
lastPosition = {
|
|
8598
|
+
offset: getSegmentOffset(zipWriter, writer),
|
|
8599
|
+
diskNumberStart: getDiskNumber(writer)
|
|
8600
|
+
};
|
|
8601
|
+
entryPositions.set(entry, lastPosition);
|
|
8602
|
+
await copyData(zipWriter, reader, sourceOffset, regionEnds[indexEntry] - sourceOffset);
|
|
8603
|
+
copiedOffset = regionEnds[indexEntry];
|
|
8604
|
+
}
|
|
8605
|
+
}
|
|
8606
|
+
}
|
|
8607
|
+
if (!compact) {
|
|
8608
|
+
await copyData(zipWriter, reader, copiedOffset, directoryOffset - copiedOffset);
|
|
8523
8609
|
}
|
|
8524
|
-
await copyData(zipWriter, reader, copiedLength, directoryOffset - copiedLength);
|
|
8525
8610
|
} else {
|
|
8526
8611
|
const baseOffset = zipWriter.offset;
|
|
8527
8612
|
await copyData(zipWriter, reader, 0, directoryOffset);
|
|
@@ -8533,6 +8618,20 @@
|
|
|
8533
8618
|
return entryPositions;
|
|
8534
8619
|
}
|
|
8535
8620
|
|
|
8621
|
+
function getRegionEnds(reader, sortedEntries, directoryOffset) {
|
|
8622
|
+
const regionEnds = new Array(sortedEntries.length);
|
|
8623
|
+
let regionEnd = directoryOffset;
|
|
8624
|
+
for (let indexEntry = sortedEntries.length - 1; indexEntry >= 0; indexEntry--) {
|
|
8625
|
+
const sourceOffset = getSourceOffset(reader, sortedEntries[indexEntry]);
|
|
8626
|
+
const nextEntry = sortedEntries[indexEntry + 1];
|
|
8627
|
+
if (nextEntry && getSourceOffset(reader, nextEntry) > sourceOffset) {
|
|
8628
|
+
regionEnd = getSourceOffset(reader, nextEntry);
|
|
8629
|
+
}
|
|
8630
|
+
regionEnds[indexEntry] = regionEnd;
|
|
8631
|
+
}
|
|
8632
|
+
return regionEnds;
|
|
8633
|
+
}
|
|
8634
|
+
|
|
8536
8635
|
async function copyData(zipWriter, reader, offset, size) {
|
|
8537
8636
|
if (size > 0) {
|
|
8538
8637
|
const { writer } = zipWriter;
|
|
@@ -8910,7 +9009,7 @@
|
|
|
8910
9009
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
8911
9010
|
*/
|
|
8912
9011
|
|
|
8913
|
-
const VERSION = "2.
|
|
9012
|
+
const VERSION = "2.20.0";
|
|
8914
9013
|
|
|
8915
9014
|
/*
|
|
8916
9015
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -10074,11 +10173,13 @@
|
|
|
10074
10173
|
exports.WARNING_COMPRESSION_UNAVAILABLE = WARNING_COMPRESSION_UNAVAILABLE;
|
|
10075
10174
|
exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
|
|
10076
10175
|
exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
|
|
10176
|
+
exports.WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET = WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET;
|
|
10077
10177
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
|
|
10078
10178
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
|
|
10079
10179
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
|
|
10080
10180
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME;
|
|
10081
10181
|
exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
|
|
10182
|
+
exports.WARNING_MISSING_ZIP64_EXTRA_FIELD = WARNING_MISSING_ZIP64_EXTRA_FIELD;
|
|
10082
10183
|
exports.WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY;
|
|
10083
10184
|
exports.WARNING_PREPENDED_CENTRAL_DIRECTORY = WARNING_PREPENDED_CENTRAL_DIRECTORY;
|
|
10084
10185
|
exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
|