@zip.js/zip.js 2.8.55 → 2.8.57

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.
@@ -226,6 +226,18 @@ function checkPasswordOption(password, rawPassword) {
226
226
  }
227
227
  }
228
228
 
229
+ function checkInteger(value, maxValue, errorMessage) {
230
+ if (!Number.isInteger(value) || value < 0 || value > maxValue) {
231
+ throw new Error(errorMessage);
232
+ }
233
+ }
234
+
235
+ function checkIntegerOption(value, maxValue, errorMessage) {
236
+ if (value !== UNDEFINED_VALUE) {
237
+ checkInteger(value, maxValue, errorMessage);
238
+ }
239
+ }
240
+
229
241
  function toNumber(value) {
230
242
  return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
231
243
  }
@@ -4746,6 +4758,7 @@ const ERR_UNSAFE_FILENAME = "Unsafe filename";
4746
4758
  const ERR_INVALID_STRICTNESS = "Invalid strictness (must be 'strict', 'balanced' or 'tolerant')";
4747
4759
  const ERR_INVALID_FILENAME_VALIDATION = "Invalid filenameValidation (must be 'strict', 'balanced' or 'tolerant')";
4748
4760
  const ERR_INVALID_MAX_APPENDED_DATA_SIZE = "Invalid maxAppendedDataSize (must be a number greater than or equal to 0)";
4761
+ const ERR_UNSUPPORTED_UINT64 = "64-bit value exceeds Number.MAX_SAFE_INTEGER";
4749
4762
  const DRIVE_LETTER_REGEXP = /^[a-zA-Z]:/;
4750
4763
  const CHARSET_UTF8 = "utf-8";
4751
4764
  const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
@@ -4768,6 +4781,7 @@ const ZIP64_EXTRACTION = {
4768
4781
  bytes: 8
4769
4782
  }
4770
4783
  };
4784
+ const MAX_SAFE_UINT64 = BigInt(Number.MAX_SAFE_INTEGER);
4771
4785
  const MAX_END_OF_CENTRAL_DIR_PROBES = 64;
4772
4786
  const MAX_DEFLATE_EXPANSION_RATIO = 1032;
4773
4787
  const CENTRAL_DIRECTORY_UNREACHABLE = 0;
@@ -4863,7 +4877,7 @@ class ZipReader {
4863
4877
  zip64EndOfDirectoryVersion2 = getBigUint64(endOfDirectoryView, 4) > ZIP64_END_OF_CENTRAL_DIR_LENGTH - 12;
4864
4878
  if (zip64EndOfDirectoryVersion2) {
4865
4879
  const extensibleDataLength = Math.min(
4866
- Number(getBigUint64(endOfDirectoryView, 4)) - (ZIP64_END_OF_CENTRAL_DIR_LENGTH - 12),
4880
+ getBigUint64(endOfDirectoryView, 4) - (ZIP64_END_OF_CENTRAL_DIR_LENGTH - 12),
4867
4881
  reader.size - directoryDataOffset - ZIP64_END_OF_CENTRAL_DIR_LENGTH);
4868
4882
  if (extensibleDataLength > 0) {
4869
4883
  zip64EndOfDirectoryLength += extensibleDataLength;
@@ -5096,8 +5110,15 @@ class ZipReader {
5096
5110
  yield entry;
5097
5111
  }
5098
5112
  let offsetAfterSignature = offset;
5099
- const digitalSignature = readDigitalSignature(directoryArray.subarray(offset)) ||
5113
+ let digitalSignature = readDigitalSignature(directoryArray.subarray(offset)) ||
5100
5114
  (decryptedDirectory ? readDigitalSignature(dataAfterEncryptedDirectory) : UNDEFINED_VALUE);
5115
+ if (!digitalSignature && !decryptedDirectory) {
5116
+ const signatureRecordOffset = directoryDataOffset + offset;
5117
+ const signatureRecordLength = Math.min(centralDirectoryEndOffset - signatureRecordOffset, 6 + MAX_16_BITS);
5118
+ if (signatureRecordLength >= 6) {
5119
+ digitalSignature = readDigitalSignature(await readUint8Array(reader, signatureRecordOffset, signatureRecordLength));
5120
+ }
5121
+ }
5101
5122
  if (digitalSignature) {
5102
5123
  zipReader.digitalSignature = digitalSignature;
5103
5124
  offsetAfterSignature = offset + 6 + digitalSignature.length;
@@ -5437,8 +5458,8 @@ function getDirectoryEncryptionInfo(rawExtensibleData) {
5437
5458
  const hashDataLength = getUint16$1(extensibleDataView, 26);
5438
5459
  Object.assign(directoryEncryptionInfo, {
5439
5460
  compressionMethod: getUint16$1(extensibleDataView, 0),
5440
- compressedSize: Number(getBigUint64(extensibleDataView, 2)),
5441
- uncompressedSize: Number(getBigUint64(extensibleDataView, 10)),
5461
+ compressedSize: getBigUint64(extensibleDataView, 2),
5462
+ uncompressedSize: getBigUint64(extensibleDataView, 10),
5442
5463
  encryptionAlgorithm: getUint16$1(extensibleDataView, 18),
5443
5464
  bitLength: getUint16$1(extensibleDataView, 20),
5444
5465
  flags: getUint16$1(extensibleDataView, 22),
@@ -6073,7 +6094,11 @@ function getUint32$1(view, offset) {
6073
6094
  }
6074
6095
 
6075
6096
  function getBigUint64(view, offset) {
6076
- return Number(view.getBigUint64(offset, true));
6097
+ const value = view.getBigUint64(offset, true);
6098
+ if (value > MAX_SAFE_UINT64) {
6099
+ throw new Error(ERR_UNSUPPORTED_UINT64);
6100
+ }
6101
+ return Number(value);
6077
6102
  }
6078
6103
 
6079
6104
  var zipReader = /*#__PURE__*/Object.freeze({
@@ -6102,6 +6127,7 @@ var zipReader = /*#__PURE__*/Object.freeze({
6102
6127
  ERR_UNSAFE_FILENAME: ERR_UNSAFE_FILENAME,
6103
6128
  ERR_UNSUPPORTED_COMPRESSION: ERR_UNSUPPORTED_COMPRESSION$1,
6104
6129
  ERR_UNSUPPORTED_ENCRYPTION: ERR_UNSUPPORTED_ENCRYPTION,
6130
+ ERR_UNSUPPORTED_UINT64: ERR_UNSUPPORTED_UINT64,
6105
6131
  ERR_WORKER_STARTUP_TIMEOUT: ERR_WORKER_STARTUP_TIMEOUT,
6106
6132
  ZipReader: ZipReader,
6107
6133
  ZipReaderStream: ZipReaderStream
@@ -6174,6 +6200,8 @@ const ERR_INVALID_SIGNATURE_DATA = "Signature data exceeds 64KB";
6174
6200
 
6175
6201
  const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
6176
6202
  const EXTRAFIELD_OFFSET_AES_VENDOR_VERSION = 4;
6203
+ const EXTRAFIELD_OFFSET_AES_COMPRESSION_METHOD = 9;
6204
+ const EXTRAFIELD_USDZ_MAX_LENGTH = 67;
6177
6205
  const VENDOR_VERSION_AE_1 = 1;
6178
6206
  const INFOZIP_EXTRA_FIELD_TYPE$1 = "infozip";
6179
6207
  const UNIX_EXTRA_FIELD_TYPE = "unix";
@@ -6220,16 +6248,14 @@ class ZipWriter {
6220
6248
  await zipReader$1.close();
6221
6249
  await initStream(this.writer);
6222
6250
  const { directoryOffset } = zipReader$1;
6223
- let splitZipSignatureLength = 0;
6224
6251
  if (this.addSplitZipSignature) {
6225
6252
  delete this.addSplitZipSignature;
6226
6253
  if (!await startsWithSplitZipSignature(reader)) {
6227
6254
  await writeData(this.writer, getSplitZipSignatureArray());
6228
- splitZipSignatureLength = SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
6229
- this.offset += splitZipSignatureLength;
6255
+ this.offset += SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
6230
6256
  }
6231
6257
  }
6232
- const entryPositions = await copyZipData(this, reader, entries, directoryOffset, splitZipSignatureLength);
6258
+ const entryPositions = await copyZipData(this, reader, entries, directoryOffset);
6233
6259
  this.filenames = new Set(entries.map(entry => entry.filename));
6234
6260
  this.fileEntries = new Map(entries.map(entry => {
6235
6261
  const {
@@ -6242,7 +6268,7 @@ class ZipWriter {
6242
6268
  encrypted,
6243
6269
  uncompressedSize,
6244
6270
  compressedSize,
6245
- zip64
6271
+ extraFieldZip64
6246
6272
  } = entry;
6247
6273
  let {
6248
6274
  compressionMethod,
@@ -6259,13 +6285,13 @@ class ZipWriter {
6259
6285
  rawExtraFieldExtendedTimestamp = rawExtraFieldExtendedTimestamp || EMPTY_UINT8_ARRAY;
6260
6286
  rawExtraFieldNTFS = rawExtraFieldNTFS || EMPTY_UINT8_ARRAY;
6261
6287
  rawExtraFieldUnix = rawExtraFieldUnix || EMPTY_UINT8_ARRAY;
6262
- rawExtraField = rawExtraField || EMPTY_UINT8_ARRAY;
6288
+ rawExtraField = removeExtraFieldZip64(rawExtraField || EMPTY_UINT8_ARRAY);
6263
6289
  if (entry.extraFieldAES) {
6264
6290
  compressionMethod = COMPRESSION_METHOD_AES;
6265
6291
  }
6266
6292
  const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
6267
- const zip64UncompressedSize = zip64 && uncompressedSize >= MAX_32_BITS;
6268
- const zip64CompressedSize = zip64 && compressedSize >= MAX_32_BITS;
6293
+ const zip64UncompressedSize = Boolean(extraFieldZip64) && extraFieldZip64.uncompressedSize !== UNDEFINED_VALUE;
6294
+ const zip64CompressedSize = Boolean(extraFieldZip64) && extraFieldZip64.compressedSize !== UNDEFINED_VALUE;
6269
6295
  const bitFlagValue = (getBitFlag(level, languageEncodingFlag, dataDescriptor, encrypted, compressionMethod) & ~BITFLAG_LEVEL) | (level << 1);
6270
6296
  const {
6271
6297
  headerArray,
@@ -6471,7 +6497,8 @@ async function addFile(zipWriter, name, reader, options) {
6471
6497
  signature: options[PROPERTY_NAME_SIGNATURE],
6472
6498
  crc32: options.crc32 === UNDEFINED_VALUE ? options[PROPERTY_NAME_SIGNATURE] : options.crc32,
6473
6499
  offset: zipWriter.offset - diskOffset,
6474
- diskNumberStart: diskNumber
6500
+ diskNumberStart: diskNumber,
6501
+ [OPTION_USDZ]: zipWriter.options[OPTION_USDZ]
6475
6502
  });
6476
6503
  const headerInfo = getHeaderInfo(options);
6477
6504
  const dataDescriptorInfo = getDataDescriptorInfo(options);
@@ -6503,15 +6530,9 @@ function resolveAttributes(zipWriter, name, options) {
6503
6530
  let setuid = getOptionValue(zipWriter, options, PROPERTY_NAME_SETUID);
6504
6531
  let setgid = getOptionValue(zipWriter, options, PROPERTY_NAME_SETGID);
6505
6532
  let sticky = getOptionValue(zipWriter, options, PROPERTY_NAME_STICKY);
6506
- if (uid !== UNDEFINED_VALUE && (!Number.isInteger(uid) || uid < 0 || uid > MAX_32_BITS)) {
6507
- throw new Error(ERR_INVALID_UID);
6508
- }
6509
- if (gid !== UNDEFINED_VALUE && (!Number.isInteger(gid) || gid < 0 || gid > MAX_32_BITS)) {
6510
- throw new Error(ERR_INVALID_GID);
6511
- }
6512
- if (unixMode !== UNDEFINED_VALUE && (!Number.isInteger(unixMode) || unixMode < 0 || unixMode > MAX_16_BITS)) {
6513
- throw new Error(ERR_INVALID_UNIX_MODE);
6514
- }
6533
+ checkIntegerOption(uid, MAX_32_BITS, ERR_INVALID_UID);
6534
+ checkIntegerOption(gid, MAX_32_BITS, ERR_INVALID_GID);
6535
+ checkIntegerOption(unixMode, MAX_16_BITS, ERR_INVALID_UNIX_MODE);
6515
6536
  if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE$1 && unixExtraFieldType !== UNIX_EXTRA_FIELD_TYPE) {
6516
6537
  throw new Error(ERR_INVALID_UNIX_EXTRA_FIELD_TYPE);
6517
6538
  }
@@ -6533,9 +6554,7 @@ function resolveAttributes(zipWriter, name, options) {
6533
6554
  msDosCompatible = true;
6534
6555
  versionMadeBy = (versionMadeBy & MAX_8_BITS);
6535
6556
  }
6536
- if (msdosAttributesRaw !== UNDEFINED_VALUE && (!Number.isInteger(msdosAttributesRaw) || msdosAttributesRaw < 0 || msdosAttributesRaw > MAX_8_BITS)) {
6537
- throw new Error(ERR_INVALID_MSDOS_ATTRIBUTES);
6538
- }
6557
+ checkIntegerOption(msdosAttributesRaw, MAX_8_BITS, ERR_INVALID_MSDOS_ATTRIBUTES);
6539
6558
  if (msdosAttributes && (typeof msdosAttributes !== OBJECT_TYPE || Array.isArray(msdosAttributes))) {
6540
6559
  throw new Error(ERR_INVALID_MSDOS_DATA);
6541
6560
  }
@@ -6675,9 +6694,7 @@ function resolveMetadata(zipWriter, name, options) {
6675
6694
  throw new Error(ERR_UNSUPPORTED_COMPRESSION);
6676
6695
  }
6677
6696
  let level = getNumberOptionValue(zipWriter, options, OPTION_LEVEL);
6678
- if (level !== UNDEFINED_VALUE && (!Number.isInteger(level) || level < 0 || level > MAX_LEVEL)) {
6679
- throw new Error(ERR_INVALID_LEVEL);
6680
- }
6697
+ checkIntegerOption(level, MAX_LEVEL, ERR_INVALID_LEVEL);
6681
6698
  if (zipWriter.options[OPTION_USDZ]) {
6682
6699
  if (password !== UNDEFINED_VALUE || rawPassword !== UNDEFINED_VALUE) {
6683
6700
  throw new Error(ERR_UNSUPPORTED_ENCRYPTION_USDZ);
@@ -6755,9 +6772,7 @@ function serializeExtraField(extraField) {
6755
6772
  let extraFieldSize = 0;
6756
6773
  let offset = 0;
6757
6774
  extraField.forEach((data, type) => {
6758
- if (!Number.isInteger(type) || type < 0 || type > MAX_16_BITS) {
6759
- throw new Error(ERR_INVALID_EXTRAFIELD_TYPE);
6760
- }
6775
+ checkInteger(type, MAX_16_BITS, ERR_INVALID_EXTRAFIELD_TYPE);
6761
6776
  if (!(data instanceof Uint8Array)) {
6762
6777
  throw new Error(ERR_INVALID_EXTRAFIELD_DATA_TYPE);
6763
6778
  }
@@ -6832,6 +6847,10 @@ function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options
6832
6847
  maximumCompressedSize = contentSize === UNDEFINED_VALUE ? getMaximumCompressedSize(uncompressedSize) + encryptionOverhead : contentSize;
6833
6848
  }
6834
6849
  }
6850
+ const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !passThrough)) && !isCompressed(compressionMethod, level);
6851
+ if (emptyEntry && !zipCrypto && getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR) === UNDEFINED_VALUE) {
6852
+ dataDescriptor = false;
6853
+ }
6835
6854
  const zip64UncompressedSize = zip64Enabled || uncompressedSize >= MAX_32_BITS;
6836
6855
  const zip64CompressedSize = zip64Enabled || maximumCompressedSize >= MAX_32_BITS;
6837
6856
  if (zip64UncompressedSize || zip64CompressedSize) {
@@ -6846,6 +6865,7 @@ function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options
6846
6865
  maximumCompressedSize,
6847
6866
  resolvedOptions: {
6848
6867
  dataDescriptor,
6868
+ emptyEntry,
6849
6869
  zip64,
6850
6870
  zip64UncompressedSize,
6851
6871
  zip64CompressedSize,
@@ -6872,7 +6892,9 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
6872
6892
  const usdz = writerOptions[OPTION_USDZ];
6873
6893
  const files = new Map();
6874
6894
  let layoutDependsOnWriteOrder = Boolean(usdz);
6875
- let offset = 0;
6895
+ const initialOffset = writerOptions[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : writerOptions[OPTION_OFFSET];
6896
+ let offset = initialOffset;
6897
+ let minimumEntrySize = INFINITY_VALUE;
6876
6898
  for (const entry of entries) {
6877
6899
  let { name } = entry;
6878
6900
  const { size } = entry;
@@ -6896,7 +6918,7 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
6896
6918
  if (hasContent && !metadata.passThrough && isCompressed(sizes.compressionMethod, sizes.level)) {
6897
6919
  throw new Error(ERR_UNDETERMINED_SIZE);
6898
6920
  }
6899
- const entryOptions = Object.assign({}, options, attributesInfo.resolvedOptions, metadata, sizes);
6921
+ const entryOptions = Object.assign({}, options, attributesInfo.resolvedOptions, metadata, sizes, { [OPTION_USDZ]: usdz });
6900
6922
  const headerInfo = getHeaderInfo(entryOptions);
6901
6923
  const dataDescriptorInfo = getDataDescriptorInfo(entryOptions);
6902
6924
  const entryInfo = {
@@ -6907,15 +6929,17 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
6907
6929
  appendExtraFieldUSDZ(entryInfo, offset);
6908
6930
  }
6909
6931
  const compressedSize = hasContent ? maximumCompressedSize : 0;
6910
- if (offset >= MAX_32_BITS) {
6911
- layoutDependsOnWriteOrder = true;
6912
- }
6913
6932
  files.set(name, Object.assign({}, entryOptions, headerInfo, {
6914
6933
  offset,
6915
6934
  diskNumberStart: 0,
6916
6935
  compressedSize
6917
6936
  }));
6918
- offset += entryInfo.metadataSize + compressedSize;
6937
+ const entrySize = entryInfo.metadataSize + compressedSize;
6938
+ minimumEntrySize = Math.min(minimumEntrySize, entrySize);
6939
+ offset += entrySize;
6940
+ }
6941
+ if (files.size && offset - minimumEntrySize >= MAX_32_BITS) {
6942
+ layoutDependsOnWriteOrder = true;
6919
6943
  }
6920
6944
  if (layoutDependsOnWriteOrder && !writeOrderGuaranteed) {
6921
6945
  throw new Error(ERR_UNDETERMINED_SIZE);
@@ -6929,7 +6953,7 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
6929
6953
  zip64 = true;
6930
6954
  }
6931
6955
  }
6932
- return offset + directoryDataLength + commentLength + (zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH);
6956
+ return offset - initialOffset + directoryDataLength + commentLength + (zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH);
6933
6957
  }
6934
6958
 
6935
6959
  async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
@@ -6940,6 +6964,7 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
6940
6964
  const {
6941
6965
  keepOrder,
6942
6966
  dataDescriptor,
6967
+ emptyEntry,
6943
6968
  signal
6944
6969
  } = options;
6945
6970
  const {
@@ -6964,7 +6989,7 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
6964
6989
  lockPreviousFileEntry = previousFileEntry && previousFileEntry.lockFileEntry;
6965
6990
  requestLockCurrentFileEntry();
6966
6991
  }
6967
- if (options.bufferedWrite || !keepOrder || zipWriter.writerLocked || zipWriter.bufferedWrites || !dataDescriptor) {
6992
+ if (options.bufferedWrite || !keepOrder || zipWriter.writerLocked || zipWriter.bufferedWrites || (!dataDescriptor && !emptyEntry)) {
6968
6993
  bufferedWrite = true;
6969
6994
  zipWriter.bufferedWrites++;
6970
6995
  if (options.createTempStream) {
@@ -7386,8 +7411,8 @@ function getHeaderInfo(options) {
7386
7411
  try {
7387
7412
  const { uid, gid, unixExtraFieldType } = options;
7388
7413
  if (unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE$1 && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
7389
- const uidBytes = packUnixId(uid);
7390
- const gidBytes = packUnixId(gid);
7414
+ const uidBytes = packUnixId(uid === UNDEFINED_VALUE ? 0 : uid);
7415
+ const gidBytes = packUnixId(gid === UNDEFINED_VALUE ? 0 : gid);
7391
7416
  const payloadLength = 3 + uidBytes.length + gidBytes.length;
7392
7417
  const extraFieldUnix = createRecordWriter(4 + payloadLength);
7393
7418
  extraFieldUnix.writeUint16(EXTRAFIELD_TYPE_INFOZIP);
@@ -7426,12 +7451,13 @@ function getHeaderInfo(options) {
7426
7451
  if (passThrough && crc32 !== UNDEFINED_VALUE) {
7427
7452
  rawExtraFieldAES[EXTRAFIELD_OFFSET_AES_VENDOR_VERSION] = VENDOR_VERSION_AE_1;
7428
7453
  }
7429
- rawExtraFieldAES[9] = compressionMethod;
7454
+ setUint16(getDataView(rawExtraFieldAES), EXTRAFIELD_OFFSET_AES_COMPRESSION_METHOD, compressionMethod);
7430
7455
  compressionMethod = COMPRESSION_METHOD_AES;
7431
7456
  }
7432
7457
  const localExtraFieldZip64Length = writeLocalExtraFieldZip64 ? getLength(rawLocalExtraFieldZip64) : 0;
7433
7458
  const extraFieldLength = localExtraFieldZip64Length + getLength(rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField, rawLocalExtraField);
7434
- if (extraFieldLength > MAX_16_BITS) {
7459
+ const maximumUsdzExtraFieldLength = options[OPTION_USDZ] ? EXTRAFIELD_USDZ_MAX_LENGTH : 0;
7460
+ if (extraFieldLength + maximumUsdzExtraFieldLength > MAX_16_BITS) {
7435
7461
  throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
7436
7462
  }
7437
7463
  const dosLastModDate = new Date(Math.ceil(Math.floor(lastModDate.getTime() / 1000) / 2) * 2000);
@@ -7517,18 +7543,14 @@ function appendExtraFieldUSDZ(entryInfo, zipWriterOffset) {
7517
7543
  }
7518
7544
 
7519
7545
  function packUnixId(id) {
7520
- if (id === UNDEFINED_VALUE) {
7521
- return EMPTY_UINT8_ARRAY;
7522
- } else {
7523
- const dataArray = new Uint8Array(4);
7524
- const dataView = getDataView(dataArray);
7525
- dataView.setUint32(0, id, true);
7526
- let length = 4;
7527
- while (length > 1 && dataArray[length - 1] === 0) {
7528
- length--;
7529
- }
7530
- return dataArray.subarray(0, length);
7546
+ const dataArray = new Uint8Array(4);
7547
+ const dataView = getDataView(dataArray);
7548
+ dataView.setUint32(0, id, true);
7549
+ let length = 4;
7550
+ while (length > 1 && dataArray[length - 1] === 0) {
7551
+ length--;
7531
7552
  }
7553
+ return dataArray.subarray(0, length);
7532
7554
  }
7533
7555
 
7534
7556
  function normalizeMsdosAttributes(msdosAttributesRaw, msdosAttributes) {
@@ -7832,7 +7854,11 @@ async function writeDigitalSignatureRecord(zipWriter, directoryArray, options) {
7832
7854
  signatureRecord.writeUint32(DIGITAL_SIGNATURE_RECORD_SIGNATURE);
7833
7855
  signatureRecord.writeUint16(signatureDataLength);
7834
7856
  signatureRecord.writeBytes(signatureData);
7835
- await writeData(zipWriter.writer, signatureRecord.array);
7857
+ const { writer } = zipWriter;
7858
+ if (exceedsAvailableSize(writer, getLength(signatureRecord.array))) {
7859
+ await writer.closeDisk();
7860
+ }
7861
+ await writeData(writer, signatureRecord.array);
7836
7862
  return 6 + signatureDataLength;
7837
7863
  }
7838
7864
  return 0;
@@ -7943,7 +7969,22 @@ async function startsWithSplitZipSignature(reader) {
7943
7969
  return getUint32(getDataView(signatureArray), 0) == SPLIT_ZIP_FILE_SIGNATURE;
7944
7970
  }
7945
7971
 
7946
- async function copyZipData(zipWriter, reader, entries, directoryOffset, splitZipSignatureLength) {
7972
+ function removeExtraFieldZip64(rawExtraField) {
7973
+ const rawExtraFieldView = getDataView(rawExtraField);
7974
+ let offsetExtraField = 0;
7975
+ while (offsetExtraField + 4 <= getLength(rawExtraField)) {
7976
+ const size = 4 + getUint16(rawExtraFieldView, offsetExtraField + 2);
7977
+ if (getUint16(rawExtraFieldView, offsetExtraField) == EXTRAFIELD_TYPE_ZIP64) {
7978
+ return removeExtraFieldZip64(concat(
7979
+ rawExtraField.subarray(0, offsetExtraField),
7980
+ rawExtraField.subarray(Math.min(offsetExtraField + size, getLength(rawExtraField)))));
7981
+ }
7982
+ offsetExtraField += size;
7983
+ }
7984
+ return rawExtraField;
7985
+ }
7986
+
7987
+ async function copyZipData(zipWriter, reader, entries, directoryOffset) {
7947
7988
  const { writer } = zipWriter;
7948
7989
  const entryPositions = new Map();
7949
7990
  if (writer.closeDisk) {
@@ -7964,9 +8005,10 @@ async function copyZipData(zipWriter, reader, entries, directoryOffset, splitZip
7964
8005
  }
7965
8006
  await copyData(zipWriter, reader, copiedLength, directoryOffset - copiedLength);
7966
8007
  } else {
8008
+ const baseOffset = zipWriter.offset;
7967
8009
  await copyData(zipWriter, reader, 0, directoryOffset);
7968
8010
  entries.forEach(entry => entryPositions.set(entry, {
7969
- offset: splitZipSignatureLength + getSourceOffset(reader, entry),
8011
+ offset: baseOffset + getSourceOffset(reader, entry),
7970
8012
  diskNumberStart: 0
7971
8013
  }));
7972
8014
  }
@@ -9846,7 +9888,7 @@ function keepsContentType(writer, data) {
9846
9888
  } else if (writer.constructor == BlobWriter) {
9847
9889
  return data.type == contentType;
9848
9890
  } else if (writer.constructor == Data64URIWriter) {
9849
- return data.startsWith(writer.data);
9891
+ return data.startsWith("data:" + (contentType || "") + ";base64,");
9850
9892
  } else {
9851
9893
  return true;
9852
9894
  }
@@ -10350,4 +10392,4 @@ function addChild(parent, name, params, directory) {
10350
10392
  }
10351
10393
  }
10352
10394
 
10353
- export { BlobReader, BlobWriter, Data64URIReader, Data64URIWriter, ERR_ABORTED, ERR_AMBIGUOUS_ARCHIVE, ERR_BAD_FORMAT, ERR_CENTRAL_DIRECTORY_NOT_FOUND, ERR_DUPLICATED_NAME, ERR_ENCRYPTED, ERR_ENCRYPTED_CENTRAL_DIRECTORY, ERR_ENTRY_DATA_OUT_OF_BOUNDS, ERR_ENTRY_EXISTS, ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND, ERR_EOCDR_NOT_FOUND, ERR_EXTRAFIELD_ZIP64_NOT_FOUND, ERR_HTTP_RANGE, ERR_HTTP_RESOURCE_CHANGED, ERR_INVALID_AUTHENTICATION_CODE, ERR_INVALID_CODEC_DEFINITION, ERR_INVALID_CODEC_MODULE, ERR_INVALID_COMMENT, ERR_INVALID_COMMENT_TYPE, ERR_INVALID_COMPRESSED_DATA, ERR_INVALID_CRC32, ERR_INVALID_DATE, ERR_INVALID_ENCRYPTION_STRENGTH, ERR_INVALID_ENTRY_COMMENT, ERR_INVALID_ENTRY_COMMENT_TYPE, ERR_INVALID_ENTRY_NAME, ERR_INVALID_EXTRAFIELD, ERR_INVALID_EXTRAFIELD_DATA, ERR_INVALID_EXTRAFIELD_DATA_TYPE, ERR_INVALID_EXTRAFIELD_TYPE, ERR_INVALID_FILENAME_VALIDATION, ERR_INVALID_FUNCTION_OPTION, ERR_INVALID_GID, ERR_INVALID_LEVEL, ERR_INVALID_MAX_APPENDED_DATA_SIZE, ERR_INVALID_MAX_WORKERS, ERR_INVALID_MSDOS_ATTRIBUTES, ERR_INVALID_MSDOS_DATA, ERR_INVALID_PASSWORD, ERR_INVALID_PASSWORD_TYPE, ERR_INVALID_PASS_THROUGH, ERR_INVALID_READER_OPTIONS, ERR_INVALID_SIGNAL, ERR_INVALID_SIGNATURE, ERR_INVALID_SIGNATURE_DATA, ERR_INVALID_STRICTNESS, ERR_INVALID_UID, ERR_INVALID_UNCOMPRESSED_SIZE, ERR_INVALID_UNIX_EXTRA_FIELD_TYPE, ERR_INVALID_UNIX_ID_SIZE, ERR_INVALID_UNIX_MODE, ERR_INVALID_VERSION, ERR_ITERATOR_COMPLETED_TOO_SOON, ERR_LOCAL_FILE_HEADER_NOT_FOUND, ERR_OVERLAPPING_ENTRY, ERR_READABLE_CONSUMED, ERR_RESERVED_COMPRESSION_METHOD, ERR_SPLIT_ZIP_FILE, ERR_UNDEFINED_COMPRESSION_METHOD, ERR_UNDEFINED_READER, ERR_UNDEFINED_UNCOMPRESSED_SIZE, ERR_UNDETERMINED_SIZE, ERR_UNSAFE_FILENAME, ERR_UNSUPPORTED_COMPRESSION$1 as ERR_UNSUPPORTED_COMPRESSION, ERR_UNSUPPORTED_CONTEXT, ERR_UNSUPPORTED_CRYPTO_API, ERR_UNSUPPORTED_ENCRYPTION, ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH, ERR_UNSUPPORTED_ENCRYPTION_USDZ, ERR_UNSUPPORTED_FORMAT, ERR_WORKER_STARTUP_TIMEOUT, ERR_WRITER_NOT_INITIALIZED, ERR_ZIP_NOT_EMPTY, HttpRangeReader, HttpReader, Reader, SplitDataReader, SplitDataWriter, TextReader, TextWriter, Uint8ArrayReader, Uint8ArrayWriter, Writer, ZipDirectoryEntry, ZipEntry, ZipFS, ZipFileEntry, ZipReader, ZipReaderStream, ZipWriter, ZipWriterStream, configure, createBlobTempStream, createOPFSTempStream, createSyncAccessHandleTempStream, fs, getMimeType, registerCodec, resetConfiguration, terminateWorkersAndModule as terminateWorkers, unregisterCodec };
10395
+ export { BlobReader, BlobWriter, Data64URIReader, Data64URIWriter, ERR_ABORTED, ERR_AMBIGUOUS_ARCHIVE, ERR_BAD_FORMAT, ERR_CENTRAL_DIRECTORY_NOT_FOUND, ERR_DUPLICATED_NAME, ERR_ENCRYPTED, ERR_ENCRYPTED_CENTRAL_DIRECTORY, ERR_ENTRY_DATA_OUT_OF_BOUNDS, ERR_ENTRY_EXISTS, ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND, ERR_EOCDR_NOT_FOUND, ERR_EXTRAFIELD_ZIP64_NOT_FOUND, ERR_HTTP_RANGE, ERR_HTTP_RESOURCE_CHANGED, ERR_INVALID_AUTHENTICATION_CODE, ERR_INVALID_CODEC_DEFINITION, ERR_INVALID_CODEC_MODULE, ERR_INVALID_COMMENT, ERR_INVALID_COMMENT_TYPE, ERR_INVALID_COMPRESSED_DATA, ERR_INVALID_CRC32, ERR_INVALID_DATE, ERR_INVALID_ENCRYPTION_STRENGTH, ERR_INVALID_ENTRY_COMMENT, ERR_INVALID_ENTRY_COMMENT_TYPE, ERR_INVALID_ENTRY_NAME, ERR_INVALID_EXTRAFIELD, ERR_INVALID_EXTRAFIELD_DATA, ERR_INVALID_EXTRAFIELD_DATA_TYPE, ERR_INVALID_EXTRAFIELD_TYPE, ERR_INVALID_FILENAME_VALIDATION, ERR_INVALID_FUNCTION_OPTION, ERR_INVALID_GID, ERR_INVALID_LEVEL, ERR_INVALID_MAX_APPENDED_DATA_SIZE, ERR_INVALID_MAX_WORKERS, ERR_INVALID_MSDOS_ATTRIBUTES, ERR_INVALID_MSDOS_DATA, ERR_INVALID_PASSWORD, ERR_INVALID_PASSWORD_TYPE, ERR_INVALID_PASS_THROUGH, ERR_INVALID_READER_OPTIONS, ERR_INVALID_SIGNAL, ERR_INVALID_SIGNATURE, ERR_INVALID_SIGNATURE_DATA, ERR_INVALID_STRICTNESS, ERR_INVALID_UID, ERR_INVALID_UNCOMPRESSED_SIZE, ERR_INVALID_UNIX_EXTRA_FIELD_TYPE, ERR_INVALID_UNIX_ID_SIZE, ERR_INVALID_UNIX_MODE, ERR_INVALID_VERSION, ERR_ITERATOR_COMPLETED_TOO_SOON, ERR_LOCAL_FILE_HEADER_NOT_FOUND, ERR_OVERLAPPING_ENTRY, ERR_READABLE_CONSUMED, ERR_RESERVED_COMPRESSION_METHOD, ERR_SPLIT_ZIP_FILE, ERR_UNDEFINED_COMPRESSION_METHOD, ERR_UNDEFINED_READER, ERR_UNDEFINED_UNCOMPRESSED_SIZE, ERR_UNDETERMINED_SIZE, ERR_UNSAFE_FILENAME, ERR_UNSUPPORTED_COMPRESSION$1 as ERR_UNSUPPORTED_COMPRESSION, ERR_UNSUPPORTED_CONTEXT, ERR_UNSUPPORTED_CRYPTO_API, ERR_UNSUPPORTED_ENCRYPTION, ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH, ERR_UNSUPPORTED_ENCRYPTION_USDZ, ERR_UNSUPPORTED_FORMAT, ERR_UNSUPPORTED_UINT64, ERR_WORKER_STARTUP_TIMEOUT, ERR_WRITER_NOT_INITIALIZED, ERR_ZIP_NOT_EMPTY, HttpRangeReader, HttpReader, Reader, SplitDataReader, SplitDataWriter, TextReader, TextWriter, Uint8ArrayReader, Uint8ArrayWriter, Writer, ZipDirectoryEntry, ZipEntry, ZipFS, ZipFileEntry, ZipReader, ZipReaderStream, ZipWriter, ZipWriterStream, configure, createBlobTempStream, createOPFSTempStream, createSyncAccessHandleTempStream, fs, getMimeType, registerCodec, resetConfiguration, terminateWorkersAndModule as terminateWorkers, unregisterCodec };