@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-legacy.js
CHANGED
|
@@ -4781,6 +4781,8 @@
|
|
|
4781
4781
|
const WARNING_PREPENDED_DATA = "prepended data";
|
|
4782
4782
|
const WARNING_PREPENDED_CENTRAL_DIRECTORY = "prepended central directory";
|
|
4783
4783
|
const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
|
|
4784
|
+
const WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET = "mismatched central directory offset";
|
|
4785
|
+
const WARNING_MISSING_ZIP64_EXTRA_FIELD = "missing zip64 extra field";
|
|
4784
4786
|
const WARNING_DUPLICATE_FILENAME = "duplicate filename";
|
|
4785
4787
|
const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
|
|
4786
4788
|
const WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = "multiple end of central directory records";
|
|
@@ -4943,6 +4945,8 @@
|
|
|
4943
4945
|
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4944
4946
|
}
|
|
4945
4947
|
directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
|
|
4948
|
+
} else if (directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || diskNumber == MAX_16_BITS) {
|
|
4949
|
+
throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
|
|
4946
4950
|
}
|
|
4947
4951
|
}
|
|
4948
4952
|
let declaredDirectoryDataLength = directoryDataLength;
|
|
@@ -4965,25 +4969,44 @@
|
|
|
4965
4969
|
if (directoryArray.length < 4) {
|
|
4966
4970
|
throw new Error(ERR_BAD_FORMAT);
|
|
4967
4971
|
}
|
|
4968
|
-
|
|
4972
|
+
let expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
|
|
4969
4973
|
if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
|
|
4970
4974
|
const storedPointsAtDirectory = getUint32$1(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE ||
|
|
4971
4975
|
Boolean(directoryEncryptionInfo && directoryEncryptionInfo.compressedSize) ||
|
|
4972
4976
|
detectEncryptedCentralDirectory(directoryView);
|
|
4973
4977
|
let reconcile = !storedPointsAtDirectory;
|
|
4974
|
-
if (
|
|
4975
|
-
const
|
|
4976
|
-
|
|
4978
|
+
if (expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
|
|
4979
|
+
const expectedPointsAtDirectory = await pointsAtDirectory(reader, expectedDirectoryDataOffset);
|
|
4980
|
+
if (storedPointsAtDirectory) {
|
|
4981
|
+
reconcile = expectedPointsAtDirectory;
|
|
4982
|
+
} else if (!expectedPointsAtDirectory) {
|
|
4983
|
+
const signatureRecordOffset = await findDigitalSignatureRecordOffset(reader, centralDirectoryEndOffset);
|
|
4984
|
+
const signedDirectoryDataOffset = signatureRecordOffset - directoryDataLength;
|
|
4985
|
+
if (signatureRecordOffset !== UNDEFINED_VALUE && signedDirectoryDataOffset >= 0 &&
|
|
4986
|
+
await pointsAtDirectory(reader, signedDirectoryDataOffset)) {
|
|
4987
|
+
expectedDirectoryDataOffset = signedDirectoryDataOffset;
|
|
4988
|
+
}
|
|
4989
|
+
}
|
|
4977
4990
|
}
|
|
4978
4991
|
if (reconcile) {
|
|
4979
4992
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
4980
4993
|
directoryDataOffset = expectedDirectoryDataOffset;
|
|
4994
|
+
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
|
|
4995
|
+
directoryView = getDataView(directoryArray);
|
|
4981
4996
|
if (directoryDataOffset > originalDirectoryDataOffset) {
|
|
4982
4997
|
prependedDataLength += directoryDataOffset - originalDirectoryDataOffset;
|
|
4983
4998
|
prependedCentralDirectory = storedPointsAtDirectory;
|
|
4999
|
+
} else {
|
|
5000
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET);
|
|
5001
|
+
const offsetDelta = directoryDataOffset - originalDirectoryDataOffset;
|
|
5002
|
+
if (directoryArray.length >= CENTRAL_FILE_HEADER_LENGTH) {
|
|
5003
|
+
const localHeaderOffset = getUint32$1(directoryView, 42);
|
|
5004
|
+
if (!await startsWithSignature(reader, localHeaderOffset, LOCAL_FILE_HEADER_SIGNATURE) &&
|
|
5005
|
+
await startsWithSignature(reader, localHeaderOffset + offsetDelta, LOCAL_FILE_HEADER_SIGNATURE)) {
|
|
5006
|
+
prependedDataLength += offsetDelta;
|
|
5007
|
+
}
|
|
5008
|
+
}
|
|
4984
5009
|
}
|
|
4985
|
-
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
|
|
4986
|
-
directoryView = getDataView(directoryArray);
|
|
4987
5010
|
}
|
|
4988
5011
|
}
|
|
4989
5012
|
}
|
|
@@ -5094,7 +5117,16 @@
|
|
|
5094
5117
|
filename,
|
|
5095
5118
|
comment
|
|
5096
5119
|
});
|
|
5097
|
-
|
|
5120
|
+
let malformedExtraField;
|
|
5121
|
+
try {
|
|
5122
|
+
malformedExtraField = readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
|
|
5123
|
+
} catch (error) {
|
|
5124
|
+
if (checkAmbiguity || error.message != ERR_EXTRAFIELD_ZIP64_NOT_FOUND) {
|
|
5125
|
+
throw error;
|
|
5126
|
+
}
|
|
5127
|
+
fileEntry.zip64ExtraFieldMissing = true;
|
|
5128
|
+
addWarning(warnings, WARNING_MISSING_ZIP64_EXTRA_FIELD, fileEntry.filename);
|
|
5129
|
+
}
|
|
5098
5130
|
filename = fileEntry.filename;
|
|
5099
5131
|
if (normalizeFilename) {
|
|
5100
5132
|
const normalizedFilename = normalizeFilename(filename);
|
|
@@ -5136,11 +5168,12 @@
|
|
|
5136
5168
|
const sticky = Boolean(fileEntry.unixMode & FILE_ATTR_UNIX_STICKY_MASK);
|
|
5137
5169
|
const unixType = fileEntry.unixMode === UNDEFINED_VALUE ? unixExternalUpper : fileEntry.unixMode;
|
|
5138
5170
|
const symlink = (unixType & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_SYMLINK;
|
|
5139
|
-
const executable = !symlink && ((fileEntry.unixMode !== UNDEFINED_VALUE)
|
|
5140
|
-
? ((fileEntry.unixMode & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)
|
|
5141
|
-
: (unixCompatible && ((unixExternalUpper & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)));
|
|
5142
5171
|
const modeIsDir = fileEntry.unixMode !== UNDEFINED_VALUE && ((fileEntry.unixMode & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR);
|
|
5143
5172
|
const upperIsDir = ((unixExternalUpper & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR);
|
|
5173
|
+
const directory = modeIsDir || upperIsDir || (msDosCompatible && msdosAttributes.directory) || fileEntry.filename.endsWith(DIRECTORY_SIGNATURE);
|
|
5174
|
+
const executable = !symlink && !directory && ((fileEntry.unixMode !== UNDEFINED_VALUE)
|
|
5175
|
+
? ((fileEntry.unixMode & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)
|
|
5176
|
+
: (unixCompatible && ((unixExternalUpper & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)));
|
|
5144
5177
|
Object.assign(fileEntry, {
|
|
5145
5178
|
setuid,
|
|
5146
5179
|
setgid,
|
|
@@ -5148,7 +5181,7 @@
|
|
|
5148
5181
|
symlink,
|
|
5149
5182
|
unixExternalUpper,
|
|
5150
5183
|
executable,
|
|
5151
|
-
directory
|
|
5184
|
+
directory,
|
|
5152
5185
|
zipCrypto: fileEntry.encrypted && !fileEntry.extraFieldAES
|
|
5153
5186
|
});
|
|
5154
5187
|
const entry = new Entry(fileEntry);
|
|
@@ -5204,10 +5237,10 @@
|
|
|
5204
5237
|
const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
|
|
5205
5238
|
const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
|
|
5206
5239
|
startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
|
|
5207
|
-
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5240
|
+
if (checkAmbiguity && (prependedDataLength > 0 || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5208
5241
|
throwAmbiguousArchive(WARNING_PREPENDED_DATA);
|
|
5209
5242
|
}
|
|
5210
|
-
if (prependedDataLength || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
|
|
5243
|
+
if (prependedDataLength > 0 || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
|
|
5211
5244
|
addWarning(warnings, WARNING_PREPENDED_DATA);
|
|
5212
5245
|
}
|
|
5213
5246
|
if (prependedCentralDirectory) {
|
|
@@ -5367,6 +5400,9 @@
|
|
|
5367
5400
|
|
|
5368
5401
|
async getData(writer, fileEntry, readRanges, options = {}) {
|
|
5369
5402
|
const zipEntry = this;
|
|
5403
|
+
if (zipEntry.zip64ExtraFieldMissing) {
|
|
5404
|
+
throw new Error(ERR_EXTRAFIELD_ZIP64_NOT_FOUND);
|
|
5405
|
+
}
|
|
5370
5406
|
const config = getConfiguration();
|
|
5371
5407
|
const {
|
|
5372
5408
|
reader,
|
|
@@ -5604,6 +5640,30 @@
|
|
|
5604
5640
|
return wrappedFilesLength % (MAX_16_BITS + 1) ? 0 : wrappedFilesLength;
|
|
5605
5641
|
}
|
|
5606
5642
|
|
|
5643
|
+
function pointsAtDirectory(reader, offset) {
|
|
5644
|
+
return startsWithSignature(reader, offset, CENTRAL_FILE_HEADER_SIGNATURE);
|
|
5645
|
+
}
|
|
5646
|
+
|
|
5647
|
+
async function startsWithSignature(reader, offset, signature) {
|
|
5648
|
+
if (offset < 0 || offset + 4 > reader.size) {
|
|
5649
|
+
return false;
|
|
5650
|
+
}
|
|
5651
|
+
const signatureArray = await readUint8Array(reader, offset, 4);
|
|
5652
|
+
return getUint32$1(getDataView(signatureArray), 0) == signature;
|
|
5653
|
+
}
|
|
5654
|
+
|
|
5655
|
+
async function findDigitalSignatureRecordOffset(reader, endOffset) {
|
|
5656
|
+
const startOffset = Math.max(0, endOffset - (6 + MAX_16_BITS));
|
|
5657
|
+
const tailArray = await readUint8Array(reader, startOffset, endOffset - startOffset);
|
|
5658
|
+
const tailView = getDataView(tailArray);
|
|
5659
|
+
for (let indexByte = tailArray.length - 6; indexByte >= 0; indexByte--) {
|
|
5660
|
+
if (getUint32$1(tailView, indexByte) == DIGITAL_SIGNATURE_RECORD_SIGNATURE &&
|
|
5661
|
+
indexByte + 6 + getUint16$1(tailView, indexByte + 4) == tailArray.length) {
|
|
5662
|
+
return startOffset + indexByte;
|
|
5663
|
+
}
|
|
5664
|
+
}
|
|
5665
|
+
}
|
|
5666
|
+
|
|
5607
5667
|
function readDigitalSignature(signatureRecordArray) {
|
|
5608
5668
|
if (signatureRecordArray.length >= 6) {
|
|
5609
5669
|
const signatureRecordView = getDataView(signatureRecordArray);
|
|
@@ -5735,6 +5795,11 @@
|
|
|
5735
5795
|
readExtraFieldUnixDates(extraFieldUnixType1, directory);
|
|
5736
5796
|
directory.extraFieldUnixType1 = extraFieldUnixType1;
|
|
5737
5797
|
}
|
|
5798
|
+
const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
5799
|
+
if (extraFieldExtendedTimestamp) {
|
|
5800
|
+
readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
|
|
5801
|
+
directory.extraFieldExtendedTimestamp = extraFieldExtendedTimestamp;
|
|
5802
|
+
}
|
|
5738
5803
|
const extraFieldNTFS = extraField.get(EXTRAFIELD_TYPE_NTFS);
|
|
5739
5804
|
if (extraFieldNTFS) {
|
|
5740
5805
|
readExtraFieldNTFS(extraFieldNTFS, directory);
|
|
@@ -5751,11 +5816,6 @@
|
|
|
5751
5816
|
readExtraFieldUnix(extraFieldUnix, unixIdsRead ? {} : directory, false);
|
|
5752
5817
|
directory.extraFieldUnix = extraFieldUnix;
|
|
5753
5818
|
}
|
|
5754
|
-
const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
5755
|
-
if (extraFieldExtendedTimestamp) {
|
|
5756
|
-
readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
|
|
5757
|
-
directory.extraFieldExtendedTimestamp = extraFieldExtendedTimestamp;
|
|
5758
|
-
}
|
|
5759
5819
|
const extraFieldUSDZ = extraField.get(EXTRAFIELD_TYPE_USDZ);
|
|
5760
5820
|
if (extraFieldUSDZ) {
|
|
5761
5821
|
directory.extraFieldUSDZ = extraFieldUSDZ;
|
|
@@ -6394,11 +6454,13 @@
|
|
|
6394
6454
|
WARNING_COMPRESSED_PATCHED_DATA: WARNING_COMPRESSED_PATCHED_DATA,
|
|
6395
6455
|
WARNING_DUPLICATE_FILENAME: WARNING_DUPLICATE_FILENAME,
|
|
6396
6456
|
WARNING_MALFORMED_EXTRA_FIELD: WARNING_MALFORMED_EXTRA_FIELD,
|
|
6457
|
+
WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET: WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET,
|
|
6397
6458
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
|
|
6398
6459
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
|
|
6399
6460
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
|
|
6400
6461
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME: WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME,
|
|
6401
6462
|
WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
|
|
6463
|
+
WARNING_MISSING_ZIP64_EXTRA_FIELD: WARNING_MISSING_ZIP64_EXTRA_FIELD,
|
|
6402
6464
|
WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY: WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY,
|
|
6403
6465
|
WARNING_PREPENDED_CENTRAL_DIRECTORY: WARNING_PREPENDED_CENTRAL_DIRECTORY,
|
|
6404
6466
|
WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
|
|
@@ -6531,13 +6593,14 @@
|
|
|
6531
6593
|
return watchPromiseError(this, prependZipEntries(this, reader));
|
|
6532
6594
|
}
|
|
6533
6595
|
|
|
6534
|
-
appendZip(reader) {
|
|
6535
|
-
return watchPromiseError(this, this.appendZipEntries(reader));
|
|
6596
|
+
appendZip(reader, options = {}) {
|
|
6597
|
+
return watchPromiseError(this, this.appendZipEntries(reader, options));
|
|
6536
6598
|
}
|
|
6537
6599
|
|
|
6538
|
-
async appendZipEntries(reader) {
|
|
6600
|
+
async appendZipEntries(reader, options = {}) {
|
|
6539
6601
|
const zipWriter = this;
|
|
6540
6602
|
const { pendingAddFileCalls, filenames, fileEntries } = zipWriter;
|
|
6603
|
+
const filter = checkFunctionOption(options.filter);
|
|
6541
6604
|
while (pendingAddFileCalls.size) {
|
|
6542
6605
|
await Promise.allSettled(Array.from(pendingAddFileCalls));
|
|
6543
6606
|
}
|
|
@@ -6556,10 +6619,16 @@
|
|
|
6556
6619
|
const { ZipReader } = await Promise.resolve().then(function () { return zipReader; });
|
|
6557
6620
|
const zipReader$1 = new ZipReader(reader);
|
|
6558
6621
|
const entries = await zipReader$1.getEntries();
|
|
6622
|
+
const keptEntries = [];
|
|
6623
|
+
for (const entry of entries) {
|
|
6624
|
+
if (!filter || await filter(entry)) {
|
|
6625
|
+
keptEntries.push(entry);
|
|
6626
|
+
}
|
|
6627
|
+
}
|
|
6559
6628
|
await zipReader$1.close();
|
|
6560
6629
|
await initStream(zipWriter.writer);
|
|
6561
6630
|
const { directoryOffset } = zipReader$1;
|
|
6562
|
-
|
|
6631
|
+
keptEntries.forEach(({ filename }) => {
|
|
6563
6632
|
if (filenames.has(filename)) {
|
|
6564
6633
|
throw new Error(ERR_DUPLICATED_NAME);
|
|
6565
6634
|
}
|
|
@@ -6580,8 +6649,8 @@
|
|
|
6580
6649
|
zipWriter.offset += SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
|
|
6581
6650
|
}
|
|
6582
6651
|
}
|
|
6583
|
-
const entryPositions = await copyZipData(zipWriter, reader, entries, directoryOffset);
|
|
6584
|
-
|
|
6652
|
+
const entryPositions = await copyZipData(zipWriter, reader, entries, keptEntries, directoryOffset, Boolean(filter));
|
|
6653
|
+
keptEntries.forEach(entry => {
|
|
6585
6654
|
const {
|
|
6586
6655
|
version,
|
|
6587
6656
|
rawLastModDate,
|
|
@@ -8494,26 +8563,42 @@
|
|
|
8494
8563
|
return rawExtraField;
|
|
8495
8564
|
}
|
|
8496
8565
|
|
|
8497
|
-
async function copyZipData(zipWriter, reader, entries, directoryOffset) {
|
|
8566
|
+
async function copyZipData(zipWriter, reader, entries, keptEntries, directoryOffset, compact) {
|
|
8498
8567
|
const { writer } = zipWriter;
|
|
8499
8568
|
const entryPositions = new Map();
|
|
8500
|
-
if (writer.closeDisk) {
|
|
8569
|
+
if (writer.closeDisk || compact) {
|
|
8501
8570
|
const sortedEntries = Array.from(entries).sort((firstEntry, secondEntry) =>
|
|
8502
8571
|
getSourceOffset(reader, firstEntry) - getSourceOffset(reader, secondEntry));
|
|
8503
|
-
|
|
8504
|
-
|
|
8505
|
-
|
|
8506
|
-
|
|
8507
|
-
|
|
8508
|
-
|
|
8509
|
-
|
|
8510
|
-
|
|
8511
|
-
|
|
8512
|
-
|
|
8513
|
-
|
|
8514
|
-
|
|
8572
|
+
const regionEnds = getRegionEnds(reader, sortedEntries, directoryOffset);
|
|
8573
|
+
const keptEntrySet = new Set(keptEntries);
|
|
8574
|
+
let copiedOffset = 0;
|
|
8575
|
+
let lastPosition;
|
|
8576
|
+
for (let indexEntry = 0; indexEntry < sortedEntries.length; indexEntry++) {
|
|
8577
|
+
const entry = sortedEntries[indexEntry];
|
|
8578
|
+
if (keptEntrySet.has(entry)) {
|
|
8579
|
+
const sourceOffset = getSourceOffset(reader, entry);
|
|
8580
|
+
if (sourceOffset < copiedOffset) {
|
|
8581
|
+
entryPositions.set(entry, lastPosition);
|
|
8582
|
+
} else {
|
|
8583
|
+
if (!compact) {
|
|
8584
|
+
await copyData(zipWriter, reader, copiedOffset, sourceOffset - copiedOffset);
|
|
8585
|
+
}
|
|
8586
|
+
if (writer.closeDisk && exceedsAvailableSize(writer, await getLocalHeaderLength(reader, sourceOffset))) {
|
|
8587
|
+
await writer.closeDisk();
|
|
8588
|
+
}
|
|
8589
|
+
lastPosition = {
|
|
8590
|
+
offset: getSegmentOffset(zipWriter, writer),
|
|
8591
|
+
diskNumberStart: getDiskNumber(writer)
|
|
8592
|
+
};
|
|
8593
|
+
entryPositions.set(entry, lastPosition);
|
|
8594
|
+
await copyData(zipWriter, reader, sourceOffset, regionEnds[indexEntry] - sourceOffset);
|
|
8595
|
+
copiedOffset = regionEnds[indexEntry];
|
|
8596
|
+
}
|
|
8597
|
+
}
|
|
8598
|
+
}
|
|
8599
|
+
if (!compact) {
|
|
8600
|
+
await copyData(zipWriter, reader, copiedOffset, directoryOffset - copiedOffset);
|
|
8515
8601
|
}
|
|
8516
|
-
await copyData(zipWriter, reader, copiedLength, directoryOffset - copiedLength);
|
|
8517
8602
|
} else {
|
|
8518
8603
|
const baseOffset = zipWriter.offset;
|
|
8519
8604
|
await copyData(zipWriter, reader, 0, directoryOffset);
|
|
@@ -8525,6 +8610,20 @@
|
|
|
8525
8610
|
return entryPositions;
|
|
8526
8611
|
}
|
|
8527
8612
|
|
|
8613
|
+
function getRegionEnds(reader, sortedEntries, directoryOffset) {
|
|
8614
|
+
const regionEnds = new Array(sortedEntries.length);
|
|
8615
|
+
let regionEnd = directoryOffset;
|
|
8616
|
+
for (let indexEntry = sortedEntries.length - 1; indexEntry >= 0; indexEntry--) {
|
|
8617
|
+
const sourceOffset = getSourceOffset(reader, sortedEntries[indexEntry]);
|
|
8618
|
+
const nextEntry = sortedEntries[indexEntry + 1];
|
|
8619
|
+
if (nextEntry && getSourceOffset(reader, nextEntry) > sourceOffset) {
|
|
8620
|
+
regionEnd = getSourceOffset(reader, nextEntry);
|
|
8621
|
+
}
|
|
8622
|
+
regionEnds[indexEntry] = regionEnd;
|
|
8623
|
+
}
|
|
8624
|
+
return regionEnds;
|
|
8625
|
+
}
|
|
8626
|
+
|
|
8528
8627
|
async function copyData(zipWriter, reader, offset, size) {
|
|
8529
8628
|
if (size > 0) {
|
|
8530
8629
|
const { writer } = zipWriter;
|
|
@@ -8902,7 +9001,7 @@
|
|
|
8902
9001
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
8903
9002
|
*/
|
|
8904
9003
|
|
|
8905
|
-
const VERSION = "2.
|
|
9004
|
+
const VERSION = "2.20.0";
|
|
8906
9005
|
|
|
8907
9006
|
/*
|
|
8908
9007
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -9482,11 +9581,13 @@
|
|
|
9482
9581
|
exports.WARNING_COMPRESSION_UNAVAILABLE = WARNING_COMPRESSION_UNAVAILABLE;
|
|
9483
9582
|
exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
|
|
9484
9583
|
exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
|
|
9584
|
+
exports.WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET = WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET;
|
|
9485
9585
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
|
|
9486
9586
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
|
|
9487
9587
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
|
|
9488
9588
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME;
|
|
9489
9589
|
exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
|
|
9590
|
+
exports.WARNING_MISSING_ZIP64_EXTRA_FIELD = WARNING_MISSING_ZIP64_EXTRA_FIELD;
|
|
9490
9591
|
exports.WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY;
|
|
9491
9592
|
exports.WARNING_PREPENDED_CENTRAL_DIRECTORY = WARNING_PREPENDED_CENTRAL_DIRECTORY;
|
|
9492
9593
|
exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
|