@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/index-native.cjs
CHANGED
|
@@ -4795,6 +4795,8 @@ const WARNING_APPENDED_DATA = "appended data";
|
|
|
4795
4795
|
const WARNING_PREPENDED_DATA = "prepended data";
|
|
4796
4796
|
const WARNING_PREPENDED_CENTRAL_DIRECTORY = "prepended central directory";
|
|
4797
4797
|
const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
|
|
4798
|
+
const WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET = "mismatched central directory offset";
|
|
4799
|
+
const WARNING_MISSING_ZIP64_EXTRA_FIELD = "missing zip64 extra field";
|
|
4798
4800
|
const WARNING_DUPLICATE_FILENAME = "duplicate filename";
|
|
4799
4801
|
const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
|
|
4800
4802
|
const WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = "multiple end of central directory records";
|
|
@@ -4957,6 +4959,8 @@ class ZipReader {
|
|
|
4957
4959
|
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4958
4960
|
}
|
|
4959
4961
|
directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
|
|
4962
|
+
} else if (directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || diskNumber == MAX_16_BITS) {
|
|
4963
|
+
throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
|
|
4960
4964
|
}
|
|
4961
4965
|
}
|
|
4962
4966
|
let declaredDirectoryDataLength = directoryDataLength;
|
|
@@ -4979,25 +4983,44 @@ class ZipReader {
|
|
|
4979
4983
|
if (directoryArray.length < 4) {
|
|
4980
4984
|
throw new Error(ERR_BAD_FORMAT);
|
|
4981
4985
|
}
|
|
4982
|
-
|
|
4986
|
+
let expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
|
|
4983
4987
|
if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
|
|
4984
4988
|
const storedPointsAtDirectory = getUint32$1(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE ||
|
|
4985
4989
|
Boolean(directoryEncryptionInfo && directoryEncryptionInfo.compressedSize) ||
|
|
4986
4990
|
detectEncryptedCentralDirectory(directoryView);
|
|
4987
4991
|
let reconcile = !storedPointsAtDirectory;
|
|
4988
|
-
if (
|
|
4989
|
-
const
|
|
4990
|
-
|
|
4992
|
+
if (expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
|
|
4993
|
+
const expectedPointsAtDirectory = await pointsAtDirectory(reader, expectedDirectoryDataOffset);
|
|
4994
|
+
if (storedPointsAtDirectory) {
|
|
4995
|
+
reconcile = expectedPointsAtDirectory;
|
|
4996
|
+
} else if (!expectedPointsAtDirectory) {
|
|
4997
|
+
const signatureRecordOffset = await findDigitalSignatureRecordOffset(reader, centralDirectoryEndOffset);
|
|
4998
|
+
const signedDirectoryDataOffset = signatureRecordOffset - directoryDataLength;
|
|
4999
|
+
if (signatureRecordOffset !== UNDEFINED_VALUE && signedDirectoryDataOffset >= 0 &&
|
|
5000
|
+
await pointsAtDirectory(reader, signedDirectoryDataOffset)) {
|
|
5001
|
+
expectedDirectoryDataOffset = signedDirectoryDataOffset;
|
|
5002
|
+
}
|
|
5003
|
+
}
|
|
4991
5004
|
}
|
|
4992
5005
|
if (reconcile) {
|
|
4993
5006
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
4994
5007
|
directoryDataOffset = expectedDirectoryDataOffset;
|
|
5008
|
+
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
|
|
5009
|
+
directoryView = getDataView(directoryArray);
|
|
4995
5010
|
if (directoryDataOffset > originalDirectoryDataOffset) {
|
|
4996
5011
|
prependedDataLength += directoryDataOffset - originalDirectoryDataOffset;
|
|
4997
5012
|
prependedCentralDirectory = storedPointsAtDirectory;
|
|
5013
|
+
} else {
|
|
5014
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET);
|
|
5015
|
+
const offsetDelta = directoryDataOffset - originalDirectoryDataOffset;
|
|
5016
|
+
if (directoryArray.length >= CENTRAL_FILE_HEADER_LENGTH) {
|
|
5017
|
+
const localHeaderOffset = getUint32$1(directoryView, 42);
|
|
5018
|
+
if (!await startsWithSignature(reader, localHeaderOffset, LOCAL_FILE_HEADER_SIGNATURE) &&
|
|
5019
|
+
await startsWithSignature(reader, localHeaderOffset + offsetDelta, LOCAL_FILE_HEADER_SIGNATURE)) {
|
|
5020
|
+
prependedDataLength += offsetDelta;
|
|
5021
|
+
}
|
|
5022
|
+
}
|
|
4998
5023
|
}
|
|
4999
|
-
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
|
|
5000
|
-
directoryView = getDataView(directoryArray);
|
|
5001
5024
|
}
|
|
5002
5025
|
}
|
|
5003
5026
|
}
|
|
@@ -5108,7 +5131,16 @@ class ZipReader {
|
|
|
5108
5131
|
filename,
|
|
5109
5132
|
comment
|
|
5110
5133
|
});
|
|
5111
|
-
|
|
5134
|
+
let malformedExtraField;
|
|
5135
|
+
try {
|
|
5136
|
+
malformedExtraField = readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
|
|
5137
|
+
} catch (error) {
|
|
5138
|
+
if (checkAmbiguity || error.message != ERR_EXTRAFIELD_ZIP64_NOT_FOUND) {
|
|
5139
|
+
throw error;
|
|
5140
|
+
}
|
|
5141
|
+
fileEntry.zip64ExtraFieldMissing = true;
|
|
5142
|
+
addWarning(warnings, WARNING_MISSING_ZIP64_EXTRA_FIELD, fileEntry.filename);
|
|
5143
|
+
}
|
|
5112
5144
|
filename = fileEntry.filename;
|
|
5113
5145
|
if (normalizeFilename) {
|
|
5114
5146
|
const normalizedFilename = normalizeFilename(filename);
|
|
@@ -5150,11 +5182,12 @@ class ZipReader {
|
|
|
5150
5182
|
const sticky = Boolean(fileEntry.unixMode & FILE_ATTR_UNIX_STICKY_MASK);
|
|
5151
5183
|
const unixType = fileEntry.unixMode === UNDEFINED_VALUE ? unixExternalUpper : fileEntry.unixMode;
|
|
5152
5184
|
const symlink = (unixType & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_SYMLINK;
|
|
5153
|
-
const executable = !symlink && ((fileEntry.unixMode !== UNDEFINED_VALUE)
|
|
5154
|
-
? ((fileEntry.unixMode & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)
|
|
5155
|
-
: (unixCompatible && ((unixExternalUpper & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)));
|
|
5156
5185
|
const modeIsDir = fileEntry.unixMode !== UNDEFINED_VALUE && ((fileEntry.unixMode & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR);
|
|
5157
5186
|
const upperIsDir = ((unixExternalUpper & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR);
|
|
5187
|
+
const directory = modeIsDir || upperIsDir || (msDosCompatible && msdosAttributes.directory) || fileEntry.filename.endsWith(DIRECTORY_SIGNATURE);
|
|
5188
|
+
const executable = !symlink && !directory && ((fileEntry.unixMode !== UNDEFINED_VALUE)
|
|
5189
|
+
? ((fileEntry.unixMode & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)
|
|
5190
|
+
: (unixCompatible && ((unixExternalUpper & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)));
|
|
5158
5191
|
Object.assign(fileEntry, {
|
|
5159
5192
|
setuid,
|
|
5160
5193
|
setgid,
|
|
@@ -5162,7 +5195,7 @@ class ZipReader {
|
|
|
5162
5195
|
symlink,
|
|
5163
5196
|
unixExternalUpper,
|
|
5164
5197
|
executable,
|
|
5165
|
-
directory
|
|
5198
|
+
directory,
|
|
5166
5199
|
zipCrypto: fileEntry.encrypted && !fileEntry.extraFieldAES
|
|
5167
5200
|
});
|
|
5168
5201
|
const entry = new Entry(fileEntry);
|
|
@@ -5218,10 +5251,10 @@ class ZipReader {
|
|
|
5218
5251
|
const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
|
|
5219
5252
|
const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
|
|
5220
5253
|
startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
|
|
5221
|
-
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5254
|
+
if (checkAmbiguity && (prependedDataLength > 0 || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5222
5255
|
throwAmbiguousArchive(WARNING_PREPENDED_DATA);
|
|
5223
5256
|
}
|
|
5224
|
-
if (prependedDataLength || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
|
|
5257
|
+
if (prependedDataLength > 0 || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
|
|
5225
5258
|
addWarning(warnings, WARNING_PREPENDED_DATA);
|
|
5226
5259
|
}
|
|
5227
5260
|
if (prependedCentralDirectory) {
|
|
@@ -5381,6 +5414,9 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5381
5414
|
|
|
5382
5415
|
async getData(writer, fileEntry, readRanges, options = {}) {
|
|
5383
5416
|
const zipEntry = this;
|
|
5417
|
+
if (zipEntry.zip64ExtraFieldMissing) {
|
|
5418
|
+
throw new Error(ERR_EXTRAFIELD_ZIP64_NOT_FOUND);
|
|
5419
|
+
}
|
|
5384
5420
|
const config = getConfiguration();
|
|
5385
5421
|
const {
|
|
5386
5422
|
reader,
|
|
@@ -5618,6 +5654,30 @@ function getWrappedFilesLength(directoryView, directoryArray, offset) {
|
|
|
5618
5654
|
return wrappedFilesLength % (MAX_16_BITS + 1) ? 0 : wrappedFilesLength;
|
|
5619
5655
|
}
|
|
5620
5656
|
|
|
5657
|
+
function pointsAtDirectory(reader, offset) {
|
|
5658
|
+
return startsWithSignature(reader, offset, CENTRAL_FILE_HEADER_SIGNATURE);
|
|
5659
|
+
}
|
|
5660
|
+
|
|
5661
|
+
async function startsWithSignature(reader, offset, signature) {
|
|
5662
|
+
if (offset < 0 || offset + 4 > reader.size) {
|
|
5663
|
+
return false;
|
|
5664
|
+
}
|
|
5665
|
+
const signatureArray = await readUint8Array(reader, offset, 4);
|
|
5666
|
+
return getUint32$1(getDataView(signatureArray), 0) == signature;
|
|
5667
|
+
}
|
|
5668
|
+
|
|
5669
|
+
async function findDigitalSignatureRecordOffset(reader, endOffset) {
|
|
5670
|
+
const startOffset = Math.max(0, endOffset - (6 + MAX_16_BITS));
|
|
5671
|
+
const tailArray = await readUint8Array(reader, startOffset, endOffset - startOffset);
|
|
5672
|
+
const tailView = getDataView(tailArray);
|
|
5673
|
+
for (let indexByte = tailArray.length - 6; indexByte >= 0; indexByte--) {
|
|
5674
|
+
if (getUint32$1(tailView, indexByte) == DIGITAL_SIGNATURE_RECORD_SIGNATURE &&
|
|
5675
|
+
indexByte + 6 + getUint16$1(tailView, indexByte + 4) == tailArray.length) {
|
|
5676
|
+
return startOffset + indexByte;
|
|
5677
|
+
}
|
|
5678
|
+
}
|
|
5679
|
+
}
|
|
5680
|
+
|
|
5621
5681
|
function readDigitalSignature(signatureRecordArray) {
|
|
5622
5682
|
if (signatureRecordArray.length >= 6) {
|
|
5623
5683
|
const signatureRecordView = getDataView(signatureRecordArray);
|
|
@@ -5749,6 +5809,11 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
|
|
|
5749
5809
|
readExtraFieldUnixDates(extraFieldUnixType1, directory);
|
|
5750
5810
|
directory.extraFieldUnixType1 = extraFieldUnixType1;
|
|
5751
5811
|
}
|
|
5812
|
+
const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
5813
|
+
if (extraFieldExtendedTimestamp) {
|
|
5814
|
+
readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
|
|
5815
|
+
directory.extraFieldExtendedTimestamp = extraFieldExtendedTimestamp;
|
|
5816
|
+
}
|
|
5752
5817
|
const extraFieldNTFS = extraField.get(EXTRAFIELD_TYPE_NTFS);
|
|
5753
5818
|
if (extraFieldNTFS) {
|
|
5754
5819
|
readExtraFieldNTFS(extraFieldNTFS, directory);
|
|
@@ -5765,11 +5830,6 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
|
|
|
5765
5830
|
readExtraFieldUnix(extraFieldUnix, unixIdsRead ? {} : directory, false);
|
|
5766
5831
|
directory.extraFieldUnix = extraFieldUnix;
|
|
5767
5832
|
}
|
|
5768
|
-
const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
5769
|
-
if (extraFieldExtendedTimestamp) {
|
|
5770
|
-
readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
|
|
5771
|
-
directory.extraFieldExtendedTimestamp = extraFieldExtendedTimestamp;
|
|
5772
|
-
}
|
|
5773
5833
|
const extraFieldUSDZ = extraField.get(EXTRAFIELD_TYPE_USDZ);
|
|
5774
5834
|
if (extraFieldUSDZ) {
|
|
5775
5835
|
directory.extraFieldUSDZ = extraFieldUSDZ;
|
|
@@ -6408,11 +6468,13 @@ var zipReader = /*#__PURE__*/Object.freeze({
|
|
|
6408
6468
|
WARNING_COMPRESSED_PATCHED_DATA: WARNING_COMPRESSED_PATCHED_DATA,
|
|
6409
6469
|
WARNING_DUPLICATE_FILENAME: WARNING_DUPLICATE_FILENAME,
|
|
6410
6470
|
WARNING_MALFORMED_EXTRA_FIELD: WARNING_MALFORMED_EXTRA_FIELD,
|
|
6471
|
+
WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET: WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET,
|
|
6411
6472
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
|
|
6412
6473
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
|
|
6413
6474
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
|
|
6414
6475
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME: WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME,
|
|
6415
6476
|
WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
|
|
6477
|
+
WARNING_MISSING_ZIP64_EXTRA_FIELD: WARNING_MISSING_ZIP64_EXTRA_FIELD,
|
|
6416
6478
|
WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY: WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY,
|
|
6417
6479
|
WARNING_PREPENDED_CENTRAL_DIRECTORY: WARNING_PREPENDED_CENTRAL_DIRECTORY,
|
|
6418
6480
|
WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
|
|
@@ -6545,13 +6607,14 @@ class ZipWriter {
|
|
|
6545
6607
|
return watchPromiseError(this, prependZipEntries(this, reader));
|
|
6546
6608
|
}
|
|
6547
6609
|
|
|
6548
|
-
appendZip(reader) {
|
|
6549
|
-
return watchPromiseError(this, this.appendZipEntries(reader));
|
|
6610
|
+
appendZip(reader, options = {}) {
|
|
6611
|
+
return watchPromiseError(this, this.appendZipEntries(reader, options));
|
|
6550
6612
|
}
|
|
6551
6613
|
|
|
6552
|
-
async appendZipEntries(reader) {
|
|
6614
|
+
async appendZipEntries(reader, options = {}) {
|
|
6553
6615
|
const zipWriter = this;
|
|
6554
6616
|
const { pendingAddFileCalls, filenames, fileEntries } = zipWriter;
|
|
6617
|
+
const filter = checkFunctionOption(options.filter);
|
|
6555
6618
|
while (pendingAddFileCalls.size) {
|
|
6556
6619
|
await Promise.allSettled(Array.from(pendingAddFileCalls));
|
|
6557
6620
|
}
|
|
@@ -6570,10 +6633,16 @@ class ZipWriter {
|
|
|
6570
6633
|
const { ZipReader } = await Promise.resolve().then(function () { return zipReader; });
|
|
6571
6634
|
const zipReader$1 = new ZipReader(reader);
|
|
6572
6635
|
const entries = await zipReader$1.getEntries();
|
|
6636
|
+
const keptEntries = [];
|
|
6637
|
+
for (const entry of entries) {
|
|
6638
|
+
if (!filter || await filter(entry)) {
|
|
6639
|
+
keptEntries.push(entry);
|
|
6640
|
+
}
|
|
6641
|
+
}
|
|
6573
6642
|
await zipReader$1.close();
|
|
6574
6643
|
await initStream(zipWriter.writer);
|
|
6575
6644
|
const { directoryOffset } = zipReader$1;
|
|
6576
|
-
|
|
6645
|
+
keptEntries.forEach(({ filename }) => {
|
|
6577
6646
|
if (filenames.has(filename)) {
|
|
6578
6647
|
throw new Error(ERR_DUPLICATED_NAME);
|
|
6579
6648
|
}
|
|
@@ -6594,8 +6663,8 @@ class ZipWriter {
|
|
|
6594
6663
|
zipWriter.offset += SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
|
|
6595
6664
|
}
|
|
6596
6665
|
}
|
|
6597
|
-
const entryPositions = await copyZipData(zipWriter, reader, entries, directoryOffset);
|
|
6598
|
-
|
|
6666
|
+
const entryPositions = await copyZipData(zipWriter, reader, entries, keptEntries, directoryOffset, Boolean(filter));
|
|
6667
|
+
keptEntries.forEach(entry => {
|
|
6599
6668
|
const {
|
|
6600
6669
|
version,
|
|
6601
6670
|
rawLastModDate,
|
|
@@ -8606,26 +8675,42 @@ function removeExtraFieldZip64(rawExtraField) {
|
|
|
8606
8675
|
return rawExtraField;
|
|
8607
8676
|
}
|
|
8608
8677
|
|
|
8609
|
-
async function copyZipData(zipWriter, reader, entries, directoryOffset) {
|
|
8678
|
+
async function copyZipData(zipWriter, reader, entries, keptEntries, directoryOffset, compact) {
|
|
8610
8679
|
const { writer } = zipWriter;
|
|
8611
8680
|
const entryPositions = new Map();
|
|
8612
|
-
if (writer.closeDisk) {
|
|
8681
|
+
if (writer.closeDisk || compact) {
|
|
8613
8682
|
const sortedEntries = Array.from(entries).sort((firstEntry, secondEntry) =>
|
|
8614
8683
|
getSourceOffset(reader, firstEntry) - getSourceOffset(reader, secondEntry));
|
|
8615
|
-
|
|
8616
|
-
|
|
8617
|
-
|
|
8618
|
-
|
|
8619
|
-
|
|
8620
|
-
|
|
8621
|
-
|
|
8622
|
-
|
|
8623
|
-
|
|
8624
|
-
|
|
8625
|
-
|
|
8626
|
-
|
|
8684
|
+
const regionEnds = getRegionEnds(reader, sortedEntries, directoryOffset);
|
|
8685
|
+
const keptEntrySet = new Set(keptEntries);
|
|
8686
|
+
let copiedOffset = 0;
|
|
8687
|
+
let lastPosition;
|
|
8688
|
+
for (let indexEntry = 0; indexEntry < sortedEntries.length; indexEntry++) {
|
|
8689
|
+
const entry = sortedEntries[indexEntry];
|
|
8690
|
+
if (keptEntrySet.has(entry)) {
|
|
8691
|
+
const sourceOffset = getSourceOffset(reader, entry);
|
|
8692
|
+
if (sourceOffset < copiedOffset) {
|
|
8693
|
+
entryPositions.set(entry, lastPosition);
|
|
8694
|
+
} else {
|
|
8695
|
+
if (!compact) {
|
|
8696
|
+
await copyData(zipWriter, reader, copiedOffset, sourceOffset - copiedOffset);
|
|
8697
|
+
}
|
|
8698
|
+
if (writer.closeDisk && exceedsAvailableSize(writer, await getLocalHeaderLength(reader, sourceOffset))) {
|
|
8699
|
+
await writer.closeDisk();
|
|
8700
|
+
}
|
|
8701
|
+
lastPosition = {
|
|
8702
|
+
offset: getSegmentOffset(zipWriter, writer),
|
|
8703
|
+
diskNumberStart: getDiskNumber(writer)
|
|
8704
|
+
};
|
|
8705
|
+
entryPositions.set(entry, lastPosition);
|
|
8706
|
+
await copyData(zipWriter, reader, sourceOffset, regionEnds[indexEntry] - sourceOffset);
|
|
8707
|
+
copiedOffset = regionEnds[indexEntry];
|
|
8708
|
+
}
|
|
8709
|
+
}
|
|
8710
|
+
}
|
|
8711
|
+
if (!compact) {
|
|
8712
|
+
await copyData(zipWriter, reader, copiedOffset, directoryOffset - copiedOffset);
|
|
8627
8713
|
}
|
|
8628
|
-
await copyData(zipWriter, reader, copiedLength, directoryOffset - copiedLength);
|
|
8629
8714
|
} else {
|
|
8630
8715
|
const baseOffset = zipWriter.offset;
|
|
8631
8716
|
await copyData(zipWriter, reader, 0, directoryOffset);
|
|
@@ -8637,6 +8722,20 @@ async function copyZipData(zipWriter, reader, entries, directoryOffset) {
|
|
|
8637
8722
|
return entryPositions;
|
|
8638
8723
|
}
|
|
8639
8724
|
|
|
8725
|
+
function getRegionEnds(reader, sortedEntries, directoryOffset) {
|
|
8726
|
+
const regionEnds = new Array(sortedEntries.length);
|
|
8727
|
+
let regionEnd = directoryOffset;
|
|
8728
|
+
for (let indexEntry = sortedEntries.length - 1; indexEntry >= 0; indexEntry--) {
|
|
8729
|
+
const sourceOffset = getSourceOffset(reader, sortedEntries[indexEntry]);
|
|
8730
|
+
const nextEntry = sortedEntries[indexEntry + 1];
|
|
8731
|
+
if (nextEntry && getSourceOffset(reader, nextEntry) > sourceOffset) {
|
|
8732
|
+
regionEnd = getSourceOffset(reader, nextEntry);
|
|
8733
|
+
}
|
|
8734
|
+
regionEnds[indexEntry] = regionEnd;
|
|
8735
|
+
}
|
|
8736
|
+
return regionEnds;
|
|
8737
|
+
}
|
|
8738
|
+
|
|
8640
8739
|
async function copyData(zipWriter, reader, offset, size) {
|
|
8641
8740
|
if (size > 0) {
|
|
8642
8741
|
const { writer } = zipWriter;
|
|
@@ -9014,7 +9113,7 @@ function formatSupported(StreamClass, format) {
|
|
|
9014
9113
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
9015
9114
|
*/
|
|
9016
9115
|
|
|
9017
|
-
const VERSION = "2.
|
|
9116
|
+
const VERSION = "2.20.0";
|
|
9018
9117
|
|
|
9019
9118
|
/*
|
|
9020
9119
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -11208,11 +11307,13 @@ exports.WARNING_COMPRESSED_PATCHED_DATA = WARNING_COMPRESSED_PATCHED_DATA;
|
|
|
11208
11307
|
exports.WARNING_COMPRESSION_UNAVAILABLE = WARNING_COMPRESSION_UNAVAILABLE;
|
|
11209
11308
|
exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
|
|
11210
11309
|
exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
|
|
11310
|
+
exports.WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET = WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET;
|
|
11211
11311
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
|
|
11212
11312
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
|
|
11213
11313
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
|
|
11214
11314
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME;
|
|
11215
11315
|
exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
|
|
11316
|
+
exports.WARNING_MISSING_ZIP64_EXTRA_FIELD = WARNING_MISSING_ZIP64_EXTRA_FIELD;
|
|
11216
11317
|
exports.WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY;
|
|
11217
11318
|
exports.WARNING_PREPENDED_CENTRAL_DIRECTORY = WARNING_PREPENDED_CENTRAL_DIRECTORY;
|
|
11218
11319
|
exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
|