@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-core.js
CHANGED
|
@@ -4779,6 +4779,8 @@
|
|
|
4779
4779
|
const WARNING_PREPENDED_DATA = "prepended data";
|
|
4780
4780
|
const WARNING_PREPENDED_CENTRAL_DIRECTORY = "prepended central directory";
|
|
4781
4781
|
const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
|
|
4782
|
+
const WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET = "mismatched central directory offset";
|
|
4783
|
+
const WARNING_MISSING_ZIP64_EXTRA_FIELD = "missing zip64 extra field";
|
|
4782
4784
|
const WARNING_DUPLICATE_FILENAME = "duplicate filename";
|
|
4783
4785
|
const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
|
|
4784
4786
|
const WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = "multiple end of central directory records";
|
|
@@ -4941,6 +4943,8 @@
|
|
|
4941
4943
|
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4942
4944
|
}
|
|
4943
4945
|
directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
|
|
4946
|
+
} else if (directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || diskNumber == MAX_16_BITS) {
|
|
4947
|
+
throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
|
|
4944
4948
|
}
|
|
4945
4949
|
}
|
|
4946
4950
|
let declaredDirectoryDataLength = directoryDataLength;
|
|
@@ -4963,25 +4967,44 @@
|
|
|
4963
4967
|
if (directoryArray.length < 4) {
|
|
4964
4968
|
throw new Error(ERR_BAD_FORMAT);
|
|
4965
4969
|
}
|
|
4966
|
-
|
|
4970
|
+
let expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
|
|
4967
4971
|
if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
|
|
4968
4972
|
const storedPointsAtDirectory = getUint32$1(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE ||
|
|
4969
4973
|
Boolean(directoryEncryptionInfo && directoryEncryptionInfo.compressedSize) ||
|
|
4970
4974
|
detectEncryptedCentralDirectory(directoryView);
|
|
4971
4975
|
let reconcile = !storedPointsAtDirectory;
|
|
4972
|
-
if (
|
|
4973
|
-
const
|
|
4974
|
-
|
|
4976
|
+
if (expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
|
|
4977
|
+
const expectedPointsAtDirectory = await pointsAtDirectory(reader, expectedDirectoryDataOffset);
|
|
4978
|
+
if (storedPointsAtDirectory) {
|
|
4979
|
+
reconcile = expectedPointsAtDirectory;
|
|
4980
|
+
} else if (!expectedPointsAtDirectory) {
|
|
4981
|
+
const signatureRecordOffset = await findDigitalSignatureRecordOffset(reader, centralDirectoryEndOffset);
|
|
4982
|
+
const signedDirectoryDataOffset = signatureRecordOffset - directoryDataLength;
|
|
4983
|
+
if (signatureRecordOffset !== UNDEFINED_VALUE && signedDirectoryDataOffset >= 0 &&
|
|
4984
|
+
await pointsAtDirectory(reader, signedDirectoryDataOffset)) {
|
|
4985
|
+
expectedDirectoryDataOffset = signedDirectoryDataOffset;
|
|
4986
|
+
}
|
|
4987
|
+
}
|
|
4975
4988
|
}
|
|
4976
4989
|
if (reconcile) {
|
|
4977
4990
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
4978
4991
|
directoryDataOffset = expectedDirectoryDataOffset;
|
|
4992
|
+
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
|
|
4993
|
+
directoryView = getDataView(directoryArray);
|
|
4979
4994
|
if (directoryDataOffset > originalDirectoryDataOffset) {
|
|
4980
4995
|
prependedDataLength += directoryDataOffset - originalDirectoryDataOffset;
|
|
4981
4996
|
prependedCentralDirectory = storedPointsAtDirectory;
|
|
4997
|
+
} else {
|
|
4998
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET);
|
|
4999
|
+
const offsetDelta = directoryDataOffset - originalDirectoryDataOffset;
|
|
5000
|
+
if (directoryArray.length >= CENTRAL_FILE_HEADER_LENGTH) {
|
|
5001
|
+
const localHeaderOffset = getUint32$1(directoryView, 42);
|
|
5002
|
+
if (!await startsWithSignature(reader, localHeaderOffset, LOCAL_FILE_HEADER_SIGNATURE) &&
|
|
5003
|
+
await startsWithSignature(reader, localHeaderOffset + offsetDelta, LOCAL_FILE_HEADER_SIGNATURE)) {
|
|
5004
|
+
prependedDataLength += offsetDelta;
|
|
5005
|
+
}
|
|
5006
|
+
}
|
|
4982
5007
|
}
|
|
4983
|
-
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
|
|
4984
|
-
directoryView = getDataView(directoryArray);
|
|
4985
5008
|
}
|
|
4986
5009
|
}
|
|
4987
5010
|
}
|
|
@@ -5092,7 +5115,16 @@
|
|
|
5092
5115
|
filename,
|
|
5093
5116
|
comment
|
|
5094
5117
|
});
|
|
5095
|
-
|
|
5118
|
+
let malformedExtraField;
|
|
5119
|
+
try {
|
|
5120
|
+
malformedExtraField = readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
|
|
5121
|
+
} catch (error) {
|
|
5122
|
+
if (checkAmbiguity || error.message != ERR_EXTRAFIELD_ZIP64_NOT_FOUND) {
|
|
5123
|
+
throw error;
|
|
5124
|
+
}
|
|
5125
|
+
fileEntry.zip64ExtraFieldMissing = true;
|
|
5126
|
+
addWarning(warnings, WARNING_MISSING_ZIP64_EXTRA_FIELD, fileEntry.filename);
|
|
5127
|
+
}
|
|
5096
5128
|
filename = fileEntry.filename;
|
|
5097
5129
|
if (normalizeFilename) {
|
|
5098
5130
|
const normalizedFilename = normalizeFilename(filename);
|
|
@@ -5134,11 +5166,12 @@
|
|
|
5134
5166
|
const sticky = Boolean(fileEntry.unixMode & FILE_ATTR_UNIX_STICKY_MASK);
|
|
5135
5167
|
const unixType = fileEntry.unixMode === UNDEFINED_VALUE ? unixExternalUpper : fileEntry.unixMode;
|
|
5136
5168
|
const symlink = (unixType & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_SYMLINK;
|
|
5137
|
-
const executable = !symlink && ((fileEntry.unixMode !== UNDEFINED_VALUE)
|
|
5138
|
-
? ((fileEntry.unixMode & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)
|
|
5139
|
-
: (unixCompatible && ((unixExternalUpper & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)));
|
|
5140
5169
|
const modeIsDir = fileEntry.unixMode !== UNDEFINED_VALUE && ((fileEntry.unixMode & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR);
|
|
5141
5170
|
const upperIsDir = ((unixExternalUpper & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR);
|
|
5171
|
+
const directory = modeIsDir || upperIsDir || (msDosCompatible && msdosAttributes.directory) || fileEntry.filename.endsWith(DIRECTORY_SIGNATURE);
|
|
5172
|
+
const executable = !symlink && !directory && ((fileEntry.unixMode !== UNDEFINED_VALUE)
|
|
5173
|
+
? ((fileEntry.unixMode & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)
|
|
5174
|
+
: (unixCompatible && ((unixExternalUpper & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)));
|
|
5142
5175
|
Object.assign(fileEntry, {
|
|
5143
5176
|
setuid,
|
|
5144
5177
|
setgid,
|
|
@@ -5146,7 +5179,7 @@
|
|
|
5146
5179
|
symlink,
|
|
5147
5180
|
unixExternalUpper,
|
|
5148
5181
|
executable,
|
|
5149
|
-
directory
|
|
5182
|
+
directory,
|
|
5150
5183
|
zipCrypto: fileEntry.encrypted && !fileEntry.extraFieldAES
|
|
5151
5184
|
});
|
|
5152
5185
|
const entry = new Entry(fileEntry);
|
|
@@ -5202,10 +5235,10 @@
|
|
|
5202
5235
|
const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
|
|
5203
5236
|
const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
|
|
5204
5237
|
startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
|
|
5205
|
-
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5238
|
+
if (checkAmbiguity && (prependedDataLength > 0 || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5206
5239
|
throwAmbiguousArchive(WARNING_PREPENDED_DATA);
|
|
5207
5240
|
}
|
|
5208
|
-
if (prependedDataLength || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
|
|
5241
|
+
if (prependedDataLength > 0 || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
|
|
5209
5242
|
addWarning(warnings, WARNING_PREPENDED_DATA);
|
|
5210
5243
|
}
|
|
5211
5244
|
if (prependedCentralDirectory) {
|
|
@@ -5365,6 +5398,9 @@
|
|
|
5365
5398
|
|
|
5366
5399
|
async getData(writer, fileEntry, readRanges, options = {}) {
|
|
5367
5400
|
const zipEntry = this;
|
|
5401
|
+
if (zipEntry.zip64ExtraFieldMissing) {
|
|
5402
|
+
throw new Error(ERR_EXTRAFIELD_ZIP64_NOT_FOUND);
|
|
5403
|
+
}
|
|
5368
5404
|
const config = getConfiguration();
|
|
5369
5405
|
const {
|
|
5370
5406
|
reader,
|
|
@@ -5602,6 +5638,30 @@
|
|
|
5602
5638
|
return wrappedFilesLength % (MAX_16_BITS + 1) ? 0 : wrappedFilesLength;
|
|
5603
5639
|
}
|
|
5604
5640
|
|
|
5641
|
+
function pointsAtDirectory(reader, offset) {
|
|
5642
|
+
return startsWithSignature(reader, offset, CENTRAL_FILE_HEADER_SIGNATURE);
|
|
5643
|
+
}
|
|
5644
|
+
|
|
5645
|
+
async function startsWithSignature(reader, offset, signature) {
|
|
5646
|
+
if (offset < 0 || offset + 4 > reader.size) {
|
|
5647
|
+
return false;
|
|
5648
|
+
}
|
|
5649
|
+
const signatureArray = await readUint8Array(reader, offset, 4);
|
|
5650
|
+
return getUint32$1(getDataView(signatureArray), 0) == signature;
|
|
5651
|
+
}
|
|
5652
|
+
|
|
5653
|
+
async function findDigitalSignatureRecordOffset(reader, endOffset) {
|
|
5654
|
+
const startOffset = Math.max(0, endOffset - (6 + MAX_16_BITS));
|
|
5655
|
+
const tailArray = await readUint8Array(reader, startOffset, endOffset - startOffset);
|
|
5656
|
+
const tailView = getDataView(tailArray);
|
|
5657
|
+
for (let indexByte = tailArray.length - 6; indexByte >= 0; indexByte--) {
|
|
5658
|
+
if (getUint32$1(tailView, indexByte) == DIGITAL_SIGNATURE_RECORD_SIGNATURE &&
|
|
5659
|
+
indexByte + 6 + getUint16$1(tailView, indexByte + 4) == tailArray.length) {
|
|
5660
|
+
return startOffset + indexByte;
|
|
5661
|
+
}
|
|
5662
|
+
}
|
|
5663
|
+
}
|
|
5664
|
+
|
|
5605
5665
|
function readDigitalSignature(signatureRecordArray) {
|
|
5606
5666
|
if (signatureRecordArray.length >= 6) {
|
|
5607
5667
|
const signatureRecordView = getDataView(signatureRecordArray);
|
|
@@ -5733,6 +5793,11 @@
|
|
|
5733
5793
|
readExtraFieldUnixDates(extraFieldUnixType1, directory);
|
|
5734
5794
|
directory.extraFieldUnixType1 = extraFieldUnixType1;
|
|
5735
5795
|
}
|
|
5796
|
+
const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
5797
|
+
if (extraFieldExtendedTimestamp) {
|
|
5798
|
+
readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
|
|
5799
|
+
directory.extraFieldExtendedTimestamp = extraFieldExtendedTimestamp;
|
|
5800
|
+
}
|
|
5736
5801
|
const extraFieldNTFS = extraField.get(EXTRAFIELD_TYPE_NTFS);
|
|
5737
5802
|
if (extraFieldNTFS) {
|
|
5738
5803
|
readExtraFieldNTFS(extraFieldNTFS, directory);
|
|
@@ -5749,11 +5814,6 @@
|
|
|
5749
5814
|
readExtraFieldUnix(extraFieldUnix, unixIdsRead ? {} : directory, false);
|
|
5750
5815
|
directory.extraFieldUnix = extraFieldUnix;
|
|
5751
5816
|
}
|
|
5752
|
-
const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
5753
|
-
if (extraFieldExtendedTimestamp) {
|
|
5754
|
-
readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
|
|
5755
|
-
directory.extraFieldExtendedTimestamp = extraFieldExtendedTimestamp;
|
|
5756
|
-
}
|
|
5757
5817
|
const extraFieldUSDZ = extraField.get(EXTRAFIELD_TYPE_USDZ);
|
|
5758
5818
|
if (extraFieldUSDZ) {
|
|
5759
5819
|
directory.extraFieldUSDZ = extraFieldUSDZ;
|
|
@@ -6392,11 +6452,13 @@
|
|
|
6392
6452
|
WARNING_COMPRESSED_PATCHED_DATA: WARNING_COMPRESSED_PATCHED_DATA,
|
|
6393
6453
|
WARNING_DUPLICATE_FILENAME: WARNING_DUPLICATE_FILENAME,
|
|
6394
6454
|
WARNING_MALFORMED_EXTRA_FIELD: WARNING_MALFORMED_EXTRA_FIELD,
|
|
6455
|
+
WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET: WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET,
|
|
6395
6456
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
|
|
6396
6457
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
|
|
6397
6458
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
|
|
6398
6459
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME: WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME,
|
|
6399
6460
|
WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
|
|
6461
|
+
WARNING_MISSING_ZIP64_EXTRA_FIELD: WARNING_MISSING_ZIP64_EXTRA_FIELD,
|
|
6400
6462
|
WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY: WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY,
|
|
6401
6463
|
WARNING_PREPENDED_CENTRAL_DIRECTORY: WARNING_PREPENDED_CENTRAL_DIRECTORY,
|
|
6402
6464
|
WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
|
|
@@ -6529,13 +6591,14 @@
|
|
|
6529
6591
|
return watchPromiseError(this, prependZipEntries(this, reader));
|
|
6530
6592
|
}
|
|
6531
6593
|
|
|
6532
|
-
appendZip(reader) {
|
|
6533
|
-
return watchPromiseError(this, this.appendZipEntries(reader));
|
|
6594
|
+
appendZip(reader, options = {}) {
|
|
6595
|
+
return watchPromiseError(this, this.appendZipEntries(reader, options));
|
|
6534
6596
|
}
|
|
6535
6597
|
|
|
6536
|
-
async appendZipEntries(reader) {
|
|
6598
|
+
async appendZipEntries(reader, options = {}) {
|
|
6537
6599
|
const zipWriter = this;
|
|
6538
6600
|
const { pendingAddFileCalls, filenames, fileEntries } = zipWriter;
|
|
6601
|
+
const filter = checkFunctionOption(options.filter);
|
|
6539
6602
|
while (pendingAddFileCalls.size) {
|
|
6540
6603
|
await Promise.allSettled(Array.from(pendingAddFileCalls));
|
|
6541
6604
|
}
|
|
@@ -6554,10 +6617,16 @@
|
|
|
6554
6617
|
const { ZipReader } = await Promise.resolve().then(function () { return zipReader; });
|
|
6555
6618
|
const zipReader$1 = new ZipReader(reader);
|
|
6556
6619
|
const entries = await zipReader$1.getEntries();
|
|
6620
|
+
const keptEntries = [];
|
|
6621
|
+
for (const entry of entries) {
|
|
6622
|
+
if (!filter || await filter(entry)) {
|
|
6623
|
+
keptEntries.push(entry);
|
|
6624
|
+
}
|
|
6625
|
+
}
|
|
6557
6626
|
await zipReader$1.close();
|
|
6558
6627
|
await initStream(zipWriter.writer);
|
|
6559
6628
|
const { directoryOffset } = zipReader$1;
|
|
6560
|
-
|
|
6629
|
+
keptEntries.forEach(({ filename }) => {
|
|
6561
6630
|
if (filenames.has(filename)) {
|
|
6562
6631
|
throw new Error(ERR_DUPLICATED_NAME);
|
|
6563
6632
|
}
|
|
@@ -6578,8 +6647,8 @@
|
|
|
6578
6647
|
zipWriter.offset += SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
|
|
6579
6648
|
}
|
|
6580
6649
|
}
|
|
6581
|
-
const entryPositions = await copyZipData(zipWriter, reader, entries, directoryOffset);
|
|
6582
|
-
|
|
6650
|
+
const entryPositions = await copyZipData(zipWriter, reader, entries, keptEntries, directoryOffset, Boolean(filter));
|
|
6651
|
+
keptEntries.forEach(entry => {
|
|
6583
6652
|
const {
|
|
6584
6653
|
version,
|
|
6585
6654
|
rawLastModDate,
|
|
@@ -8492,26 +8561,42 @@
|
|
|
8492
8561
|
return rawExtraField;
|
|
8493
8562
|
}
|
|
8494
8563
|
|
|
8495
|
-
async function copyZipData(zipWriter, reader, entries, directoryOffset) {
|
|
8564
|
+
async function copyZipData(zipWriter, reader, entries, keptEntries, directoryOffset, compact) {
|
|
8496
8565
|
const { writer } = zipWriter;
|
|
8497
8566
|
const entryPositions = new Map();
|
|
8498
|
-
if (writer.closeDisk) {
|
|
8567
|
+
if (writer.closeDisk || compact) {
|
|
8499
8568
|
const sortedEntries = Array.from(entries).sort((firstEntry, secondEntry) =>
|
|
8500
8569
|
getSourceOffset(reader, firstEntry) - getSourceOffset(reader, secondEntry));
|
|
8501
|
-
|
|
8502
|
-
|
|
8503
|
-
|
|
8504
|
-
|
|
8505
|
-
|
|
8506
|
-
|
|
8507
|
-
|
|
8508
|
-
|
|
8509
|
-
|
|
8510
|
-
|
|
8511
|
-
|
|
8512
|
-
|
|
8570
|
+
const regionEnds = getRegionEnds(reader, sortedEntries, directoryOffset);
|
|
8571
|
+
const keptEntrySet = new Set(keptEntries);
|
|
8572
|
+
let copiedOffset = 0;
|
|
8573
|
+
let lastPosition;
|
|
8574
|
+
for (let indexEntry = 0; indexEntry < sortedEntries.length; indexEntry++) {
|
|
8575
|
+
const entry = sortedEntries[indexEntry];
|
|
8576
|
+
if (keptEntrySet.has(entry)) {
|
|
8577
|
+
const sourceOffset = getSourceOffset(reader, entry);
|
|
8578
|
+
if (sourceOffset < copiedOffset) {
|
|
8579
|
+
entryPositions.set(entry, lastPosition);
|
|
8580
|
+
} else {
|
|
8581
|
+
if (!compact) {
|
|
8582
|
+
await copyData(zipWriter, reader, copiedOffset, sourceOffset - copiedOffset);
|
|
8583
|
+
}
|
|
8584
|
+
if (writer.closeDisk && exceedsAvailableSize(writer, await getLocalHeaderLength(reader, sourceOffset))) {
|
|
8585
|
+
await writer.closeDisk();
|
|
8586
|
+
}
|
|
8587
|
+
lastPosition = {
|
|
8588
|
+
offset: getSegmentOffset(zipWriter, writer),
|
|
8589
|
+
diskNumberStart: getDiskNumber(writer)
|
|
8590
|
+
};
|
|
8591
|
+
entryPositions.set(entry, lastPosition);
|
|
8592
|
+
await copyData(zipWriter, reader, sourceOffset, regionEnds[indexEntry] - sourceOffset);
|
|
8593
|
+
copiedOffset = regionEnds[indexEntry];
|
|
8594
|
+
}
|
|
8595
|
+
}
|
|
8596
|
+
}
|
|
8597
|
+
if (!compact) {
|
|
8598
|
+
await copyData(zipWriter, reader, copiedOffset, directoryOffset - copiedOffset);
|
|
8513
8599
|
}
|
|
8514
|
-
await copyData(zipWriter, reader, copiedLength, directoryOffset - copiedLength);
|
|
8515
8600
|
} else {
|
|
8516
8601
|
const baseOffset = zipWriter.offset;
|
|
8517
8602
|
await copyData(zipWriter, reader, 0, directoryOffset);
|
|
@@ -8523,6 +8608,20 @@
|
|
|
8523
8608
|
return entryPositions;
|
|
8524
8609
|
}
|
|
8525
8610
|
|
|
8611
|
+
function getRegionEnds(reader, sortedEntries, directoryOffset) {
|
|
8612
|
+
const regionEnds = new Array(sortedEntries.length);
|
|
8613
|
+
let regionEnd = directoryOffset;
|
|
8614
|
+
for (let indexEntry = sortedEntries.length - 1; indexEntry >= 0; indexEntry--) {
|
|
8615
|
+
const sourceOffset = getSourceOffset(reader, sortedEntries[indexEntry]);
|
|
8616
|
+
const nextEntry = sortedEntries[indexEntry + 1];
|
|
8617
|
+
if (nextEntry && getSourceOffset(reader, nextEntry) > sourceOffset) {
|
|
8618
|
+
regionEnd = getSourceOffset(reader, nextEntry);
|
|
8619
|
+
}
|
|
8620
|
+
regionEnds[indexEntry] = regionEnd;
|
|
8621
|
+
}
|
|
8622
|
+
return regionEnds;
|
|
8623
|
+
}
|
|
8624
|
+
|
|
8526
8625
|
async function copyData(zipWriter, reader, offset, size) {
|
|
8527
8626
|
if (size > 0) {
|
|
8528
8627
|
const { writer } = zipWriter;
|
|
@@ -8900,7 +8999,7 @@
|
|
|
8900
8999
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
8901
9000
|
*/
|
|
8902
9001
|
|
|
8903
|
-
const VERSION = "2.
|
|
9002
|
+
const VERSION = "2.20.0";
|
|
8904
9003
|
|
|
8905
9004
|
/*
|
|
8906
9005
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -9449,11 +9548,13 @@
|
|
|
9449
9548
|
exports.WARNING_COMPRESSION_UNAVAILABLE = WARNING_COMPRESSION_UNAVAILABLE;
|
|
9450
9549
|
exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
|
|
9451
9550
|
exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
|
|
9551
|
+
exports.WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET = WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET;
|
|
9452
9552
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
|
|
9453
9553
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
|
|
9454
9554
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
|
|
9455
9555
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME;
|
|
9456
9556
|
exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
|
|
9557
|
+
exports.WARNING_MISSING_ZIP64_EXTRA_FIELD = WARNING_MISSING_ZIP64_EXTRA_FIELD;
|
|
9457
9558
|
exports.WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY;
|
|
9458
9559
|
exports.WARNING_PREPENDED_CENTRAL_DIRECTORY = WARNING_PREPENDED_CENTRAL_DIRECTORY;
|
|
9459
9560
|
exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
|