@zip.js/zip.js 2.18.2 → 2.19.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.
Files changed (44) hide show
  1. package/BENCHMARKS.md +122 -118
  2. package/deno.json +1 -1
  3. package/dist/zip-core-external.js +54 -81
  4. package/dist/zip-core-external.min.js +1 -1
  5. package/dist/zip-core.js +54 -81
  6. package/dist/zip-core.min.js +1 -1
  7. package/dist/zip-fs-core-external.js +54 -81
  8. package/dist/zip-fs-core-external.min.js +1 -1
  9. package/dist/zip-fs-core.js +54 -81
  10. package/dist/zip-fs-core.min.js +1 -1
  11. package/dist/zip-fs-external.js +54 -81
  12. package/dist/zip-fs-external.min.js +1 -1
  13. package/dist/zip-fs-native.js +56 -83
  14. package/dist/zip-fs-native.min.js +1 -1
  15. package/dist/zip-fs.js +55 -82
  16. package/dist/zip-fs.min.js +1 -1
  17. package/dist/zip-legacy.js +56 -83
  18. package/dist/zip-legacy.min.js +1 -1
  19. package/dist/zip-native.js +56 -83
  20. package/dist/zip-native.min.js +1 -1
  21. package/dist/zip-web-worker-native.js +1 -1
  22. package/dist/zip-web-worker.js +1 -1
  23. package/dist/zip.js +55 -82
  24. package/dist/zip.min.js +1 -1
  25. package/index-native.cjs +56 -83
  26. package/index-native.min.js +1 -1
  27. package/index.cjs +55 -82
  28. package/index.d.cts +27 -18
  29. package/index.d.ts +27 -18
  30. package/index.min.js +1 -1
  31. package/lib/core/codec-pool.js +1 -2
  32. package/lib/core/codec-worker-web.js +11 -39
  33. package/lib/core/codec-worker.js +1 -2
  34. package/lib/core/configuration.js +1 -1
  35. package/lib/core/options.js +0 -2
  36. package/lib/core/streams/codec-stream.js +1 -1
  37. package/lib/core/version.js +1 -1
  38. package/lib/core/web-worker-base.js +2 -3
  39. package/lib/core/web-worker-inline-native.js +1 -1
  40. package/lib/core/web-worker-inline-wasm.js +1 -1
  41. package/lib/core/zip-reader.js +21 -23
  42. package/lib/core/zip-writer.js +18 -14
  43. package/package.json +1 -1
  44. package/worker-message-property-names.js +1 -1
@@ -176,7 +176,6 @@ const OPTION_CHECK_CRC32 = "checkCrc32";
176
176
  const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
177
177
  const OPTION_USE_WEB_WORKERS = "useWebWorkers";
178
178
  const OPTION_USE_COMPRESSION_STREAM = "useCompressionStream";
179
- const OPTION_TRANSFER_STREAMS = "transferStreams";
180
179
  const OPTION_PREVENT_CLOSE = "preventClose";
181
180
  const OPTION_ENCRYPTION_STRENGTH = "encryptionStrength";
182
181
  const OPTION_EXTENDED_TIMESTAMP = "extendedTimestamp";
@@ -294,7 +293,7 @@ function toNumber(value) {
294
293
  */
295
294
 
296
295
 
297
- const DEFAULT_CHUNK_SIZE$1 = 64 * 1024;
296
+ const DEFAULT_CHUNK_SIZE$1 = 256 * 1024;
298
297
  const MINIMUM_CHUNK_SIZE = 64;
299
298
  const MINIMUM_PROPERTY_VALUE = 1;
300
299
  const ERR_INVALID_MAX_WORKERS = "Invalid maxWorkers (must be an integer greater than 0)";
@@ -2423,7 +2422,7 @@ function mapInflateStreamError(readable, sourceErrors) {
2423
2422
  */
2424
2423
 
2425
2424
 
2426
- const DEFAULT_CHUNK_SIZE = 64 * 1024;
2425
+ const DEFAULT_CHUNK_SIZE = 256 * 1024;
2427
2426
  const MESSAGE_EVENT_TYPE = "message";
2428
2427
  const MESSAGE_START = "start";
2429
2428
  const MESSAGE_PULL = "pull";
@@ -2633,7 +2632,7 @@ function disableWebWorker(workerData) {
2633
2632
  class CodecWorker {
2634
2633
 
2635
2634
  constructor(workerData, { readable, writable }, workerOptions, onTaskFinished) {
2636
- const { options, config, streamOptions, useWebWorkers, transferStreams, workerURI } = workerOptions;
2635
+ const { options, config, streamOptions, useWebWorkers, workerURI } = workerOptions;
2637
2636
  let { createWorker } = workerOptions;
2638
2637
  const { signal } = streamOptions;
2639
2638
  if (createWorkerFailed) {
@@ -2650,7 +2649,6 @@ class CodecWorker {
2650
2649
  workerOptions,
2651
2650
  workerURI,
2652
2651
  createWorker,
2653
- transferStreams,
2654
2652
  terminate() {
2655
2653
  return new Promise(resolve => {
2656
2654
  const { worker, busy } = workerData;
@@ -2828,12 +2826,6 @@ const MESSAGE_ERROR_EVENT_TYPE = "messageerror";
2828
2826
  const ABORT_EVENT_TYPE = "abort";
2829
2827
 
2830
2828
  let webWorkerSource, webWorkerURI, webWorkerOptions;
2831
- let transferStreamsSupported = true;
2832
- try {
2833
- transferStreamsSupported = typeof structuredClone == FUNCTION_TYPE && structuredClone(new DOMException("", "AbortError")).code !== UNDEFINED_VALUE;
2834
- } catch {
2835
- // ignored
2836
- }
2837
2829
 
2838
2830
  setWebWorkerBackend(createWebWorkerInterface);
2839
2831
 
@@ -2920,14 +2912,11 @@ async function runWebWorker(workerData, config) {
2920
2912
  });
2921
2913
  const { readable, options } = workerData;
2922
2914
  const { writable, closed, abortPipe } = watchClosedStream(workerData.writable, workerData);
2923
- let streamsTransferred;
2924
2915
  try {
2925
- streamsTransferred = sendMessage({
2916
+ sendMessage({
2926
2917
  type: MESSAGE_START,
2927
2918
  options,
2928
- config,
2929
- readable,
2930
- writable
2919
+ config
2931
2920
  }, workerData);
2932
2921
  } catch (error) {
2933
2922
  abortPipe();
@@ -2939,12 +2928,10 @@ async function runWebWorker(workerData, config) {
2939
2928
  workerData.onTaskFinished();
2940
2929
  throw error;
2941
2930
  }
2942
- if (!streamsTransferred) {
2943
- Object.assign(workerData, {
2944
- reader: readable.getReader(),
2945
- writer: writable.getWriter()
2946
- });
2947
- }
2931
+ Object.assign(workerData, {
2932
+ reader: readable.getReader(),
2933
+ writer: writable.getWriter()
2934
+ });
2948
2935
  const { workerStartupTimeout } = config;
2949
2936
  if (!workerData.workerAlive && Number.isFinite(workerStartupTimeout) && workerStartupTimeout >= 0) {
2950
2937
  workerData.startupTimeout = setTimeout(() => onStartupTimeout(workerData), workerStartupTimeout);
@@ -2977,7 +2964,7 @@ async function runWebWorker(workerData, config) {
2977
2964
  }
2978
2965
 
2979
2966
  async function closeWritable() {
2980
- if (!streamsTransferred && !writable.locked) {
2967
+ if (!writable.locked) {
2981
2968
  try {
2982
2969
  await writable.getWriter().close();
2983
2970
  } catch {
@@ -3168,31 +3155,14 @@ function onWorkerError(event, workerData) {
3168
3155
  }
3169
3156
  }
3170
3157
 
3171
- function sendMessage(message, { worker, writer, transferStreams, workerAlive }) {
3158
+ function sendMessage(message, { worker, writer }) {
3172
3159
  try {
3173
- const { value, readable, writable } = message;
3174
- const transferables = [];
3160
+ const { value } = message;
3175
3161
  if (value) {
3176
3162
  message.value = toExactUint8Array(value);
3177
- transferables.push(message.value.buffer);
3178
- }
3179
- if (transferStreams && transferStreamsSupported && workerAlive) {
3180
- if (readable) {
3181
- transferables.push(readable);
3182
- }
3183
- if (writable) {
3184
- transferables.push(writable);
3185
- }
3186
- } else {
3187
- message.readable = message.writable = null;
3188
- }
3189
- if (transferables.length) {
3190
3163
  try {
3191
- worker.postMessage(message, transferables);
3192
- return true;
3164
+ worker.postMessage(message, [message.value.buffer]);
3193
3165
  } catch {
3194
- transferStreamsSupported = false;
3195
- message.readable = message.writable = null;
3196
3166
  worker.postMessage(message);
3197
3167
  }
3198
3168
  } else {
@@ -3341,7 +3311,7 @@ let indexWorker = 0;
3341
3311
 
3342
3312
  async function runWorker(stream, workerOptions) {
3343
3313
  const { options, config } = workerOptions;
3344
- const { transferStreams, useWebWorkers, useCompressionStream, compressed, checkCrc32, computeCrc32, encrypted, format, codecURI } = options;
3314
+ const { useWebWorkers, useCompressionStream, compressed, checkCrc32, computeCrc32, encrypted, format, codecURI } = options;
3345
3315
  const { workerURI, createWorker, maxWorkers } = config;
3346
3316
  if (format) {
3347
3317
  if (codecURI) {
@@ -3349,7 +3319,6 @@ async function runWorker(stream, workerOptions) {
3349
3319
  }
3350
3320
  await ensureCodecStreams(format, options.codecURI);
3351
3321
  }
3352
- workerOptions.transferStreams = !format && (transferStreams || (transferStreams === UNDEFINED_VALUE && config.transferStreams));
3353
3322
  const streamCopy = !compressed && !checkCrc32 && !computeCrc32 && !encrypted;
3354
3323
  const workerSupported = format === UNDEFINED_VALUE || Boolean(options.codecURI);
3355
3324
  workerOptions.useWebWorkers = !streamCopy && workerSupported && (useWebWorkers || (useWebWorkers === UNDEFINED_VALUE && config.useWebWorkers));
@@ -5131,17 +5100,6 @@ class ZipReader {
5131
5100
  if (filename === UNDEFINED_VALUE) {
5132
5101
  filename = decodeText(rawFilename, rawFilenameEncoding);
5133
5102
  }
5134
- if (normalizeFilename) {
5135
- const normalizedFilename = normalizeFilename(filename);
5136
- if (normalizedFilename !== UNDEFINED_VALUE) {
5137
- filename = normalizedFilename;
5138
- }
5139
- }
5140
- if (isUnsafeFilename(filename, filenameValidation)) {
5141
- const error = new Error(ERR_UNSAFE_FILENAME);
5142
- error.filename = filename;
5143
- throw error;
5144
- }
5145
5103
  let comment = decode(rawComment, rawCommentEncoding, TEXT_TYPE_COMMENT);
5146
5104
  if (comment === UNDEFINED_VALUE) {
5147
5105
  comment = decodeText(rawComment, rawCommentEncoding);
@@ -5169,7 +5127,20 @@ class ZipReader {
5169
5127
  filename,
5170
5128
  comment
5171
5129
  });
5172
- if (readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6)) {
5130
+ const malformedExtraField = readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
5131
+ filename = fileEntry.filename;
5132
+ if (normalizeFilename) {
5133
+ const normalizedFilename = normalizeFilename(filename);
5134
+ if (normalizedFilename !== UNDEFINED_VALUE) {
5135
+ filename = fileEntry.filename = normalizedFilename;
5136
+ }
5137
+ }
5138
+ if (isUnsafeFilename(filename, filenameValidation)) {
5139
+ const error = new Error(ERR_UNSAFE_FILENAME);
5140
+ error.filename = filename;
5141
+ throw error;
5142
+ }
5143
+ if (malformedExtraField) {
5173
5144
  addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD, filename);
5174
5145
  }
5175
5146
  fileEntry.offset += prependedDataLength;
@@ -5573,7 +5544,6 @@ class ZipEntry {
5573
5544
  encrypted,
5574
5545
  useWebWorkers: getOptionValue$1(zipEntry, options, OPTION_USE_WEB_WORKERS),
5575
5546
  useCompressionStream,
5576
- transferStreams: getOptionValue$1(zipEntry, options, OPTION_TRANSFER_STREAMS),
5577
5547
  deflate64,
5578
5548
  format: registeredCodec ? registeredCodec.format : UNDEFINED_VALUE,
5579
5549
  codecURI: registeredCodec ? registeredCodec.codecURI : UNDEFINED_VALUE,
@@ -5803,19 +5773,17 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
5803
5773
  readExtraFieldNTFS(extraFieldNTFS, directory);
5804
5774
  directory.extraFieldNTFS = extraFieldNTFS;
5805
5775
  }
5806
- const extraFieldUnix = extraField.get(EXTRAFIELD_TYPE_UNIX);
5776
+ const extraFieldInfoZip = extraField.get(EXTRAFIELD_TYPE_INFOZIP);
5807
5777
  let unixIdsRead;
5778
+ if (extraFieldInfoZip) {
5779
+ unixIdsRead = readExtraFieldUnix(extraFieldInfoZip, directory, true);
5780
+ directory.extraFieldInfoZip = extraFieldInfoZip;
5781
+ }
5782
+ const extraFieldUnix = extraField.get(EXTRAFIELD_TYPE_UNIX);
5808
5783
  if (extraFieldUnix) {
5809
- unixIdsRead = readExtraFieldUnix(extraFieldUnix, directory, false);
5784
+ readExtraFieldUnix(extraFieldUnix, unixIdsRead ? {} : directory, false);
5810
5785
  directory.extraFieldUnix = extraFieldUnix;
5811
5786
  }
5812
- if (!unixIdsRead) {
5813
- const extraFieldInfoZip = extraField.get(EXTRAFIELD_TYPE_INFOZIP);
5814
- if (extraFieldInfoZip) {
5815
- readExtraFieldUnix(extraFieldInfoZip, directory, true);
5816
- directory.extraFieldInfoZip = extraFieldInfoZip;
5817
- }
5818
- }
5819
5787
  const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
5820
5788
  if (extraFieldExtendedTimestamp) {
5821
5789
  readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
@@ -6702,6 +6670,7 @@ class ZipWriter {
6702
6670
  rawExtraFieldExtendedTimestamp: EMPTY_UINT8_ARRAY,
6703
6671
  rawExtraFieldNTFS: EMPTY_UINT8_ARRAY,
6704
6672
  rawExtraFieldUnix: EMPTY_UINT8_ARRAY,
6673
+ rawCentralExtraFieldUnix: EMPTY_UINT8_ARRAY,
6705
6674
  rawExtraField,
6706
6675
  rawCentralExtraField: EMPTY_UINT8_ARRAY,
6707
6676
  headerArray,
@@ -7270,7 +7239,6 @@ function resolveMetadata(zipWriter, name, options) {
7270
7239
  const ntfsTimestamp = getOptionValue(zipWriter, options, OPTION_NTFS_TIMESTAMP);
7271
7240
  const keepOrder = getOptionValue(zipWriter, options, OPTION_KEEP_ORDER, true);
7272
7241
  const useWebWorkers = getOptionValue(zipWriter, options, OPTION_USE_WEB_WORKERS);
7273
- const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS);
7274
7242
  const bufferedWrite = getOptionValue(zipWriter, options, OPTION_BUFFERED_WRITE);
7275
7243
  const createTempStream = getFunctionOptionValue(zipWriter, options, OPTION_CREATE_TEMP_STREAM);
7276
7244
  const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
@@ -7336,7 +7304,6 @@ function resolveMetadata(zipWriter, name, options) {
7336
7304
  ntfsTimestamp,
7337
7305
  keepOrder,
7338
7306
  useWebWorkers,
7339
- transferStreams,
7340
7307
  bufferedWrite,
7341
7308
  createTempStream,
7342
7309
  dataDescriptorSignature,
@@ -7395,7 +7362,7 @@ async function resolveSizes(zipWriter, reader, { resolvedOptions: metadata }, op
7395
7362
  if (reader) {
7396
7363
  reader = new GenericReader(reader);
7397
7364
  await initStream(reader);
7398
- if (!reader.readable && !reader.readUint8Array) {
7365
+ if (!reader.readUint8Array && !reader.readable) {
7399
7366
  throw new Error(ERR_INVALID_READER);
7400
7367
  }
7401
7368
  ({ size: contentSize } = reader);
@@ -7658,6 +7625,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
7658
7625
  extraFieldExtendedTimestampTime,
7659
7626
  rawExtraFieldNTFS,
7660
7627
  rawExtraFieldUnix,
7628
+ rawCentralExtraFieldUnix,
7661
7629
  rawExtraFieldAES,
7662
7630
  } = headerInfo;
7663
7631
  const { dataDescriptorArray } = dataDescriptorInfo;
@@ -7682,7 +7650,6 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
7682
7650
  rawExtraField,
7683
7651
  rawCentralExtraField,
7684
7652
  useWebWorkers,
7685
- transferStreams,
7686
7653
  onstart,
7687
7654
  onprogress,
7688
7655
  onend,
@@ -7724,6 +7691,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
7724
7691
  rawExtraFieldExtendedTimestamp,
7725
7692
  rawExtraFieldNTFS,
7726
7693
  rawExtraFieldUnix,
7694
+ rawCentralExtraFieldUnix,
7727
7695
  rawExtraFieldAES,
7728
7696
  rawExtraField,
7729
7697
  rawCentralExtraField,
@@ -7770,7 +7738,6 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
7770
7738
  encrypted: encrypted && !passThroughEncryption,
7771
7739
  useWebWorkers,
7772
7740
  useCompressionStream,
7773
- transferStreams,
7774
7741
  format,
7775
7742
  codecURI,
7776
7743
  compressionMethod
@@ -7948,6 +7915,7 @@ function getHeaderInfo(options) {
7948
7915
  rawExtraFieldNTFS = rawExtraFieldExtendedTimestamp = EMPTY_UINT8_ARRAY;
7949
7916
  }
7950
7917
  let rawExtraFieldUnix;
7918
+ let rawCentralExtraFieldUnix;
7951
7919
  try {
7952
7920
  const { uid, gid, unixExtraFieldType } = options;
7953
7921
  if (unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
@@ -7962,7 +7930,7 @@ function getHeaderInfo(options) {
7962
7930
  extraFieldUnix.writeBytes(uidBytes);
7963
7931
  extraFieldUnix.writeUint8(gidBytes.length);
7964
7932
  extraFieldUnix.writeBytes(gidBytes);
7965
- rawExtraFieldUnix = extraFieldUnix.array;
7933
+ rawExtraFieldUnix = rawCentralExtraFieldUnix = extraFieldUnix.array;
7966
7934
  } else if (unixExtraFieldType == UNIX_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
7967
7935
  const extraFieldUnix = createRecordWriter(8);
7968
7936
  extraFieldUnix.writeUint16(EXTRAFIELD_TYPE_UNIX);
@@ -7970,11 +7938,15 @@ function getHeaderInfo(options) {
7970
7938
  extraFieldUnix.writeUint16((uid === UNDEFINED_VALUE ? 0 : uid) & MAX_16_BITS);
7971
7939
  extraFieldUnix.writeUint16((gid === UNDEFINED_VALUE ? 0 : gid) & MAX_16_BITS);
7972
7940
  rawExtraFieldUnix = extraFieldUnix.array;
7941
+ const centralExtraFieldUnix = createRecordWriter(4);
7942
+ centralExtraFieldUnix.writeUint16(EXTRAFIELD_TYPE_UNIX);
7943
+ centralExtraFieldUnix.writeUint16(0);
7944
+ rawCentralExtraFieldUnix = centralExtraFieldUnix.array;
7973
7945
  } else {
7974
- rawExtraFieldUnix = EMPTY_UINT8_ARRAY;
7946
+ rawExtraFieldUnix = rawCentralExtraFieldUnix = EMPTY_UINT8_ARRAY;
7975
7947
  }
7976
7948
  } catch {
7977
- rawExtraFieldUnix = EMPTY_UINT8_ARRAY;
7949
+ rawExtraFieldUnix = rawCentralExtraFieldUnix = EMPTY_UINT8_ARRAY;
7978
7950
  }
7979
7951
  if (compressionMethod === UNDEFINED_VALUE) {
7980
7952
  compressionMethod = compressed ? COMPRESSION_METHOD_DEFLATE : COMPRESSION_METHOD_STORE;
@@ -8066,6 +8038,7 @@ function getHeaderInfo(options) {
8066
8038
  rawExtraFieldExtendedTimestamp,
8067
8039
  rawExtraFieldNTFS,
8068
8040
  rawExtraFieldUnix,
8041
+ rawCentralExtraFieldUnix,
8069
8042
  rawExtraFieldAES,
8070
8043
  extraFieldLength
8071
8044
  };
@@ -8241,7 +8214,7 @@ function createDirectoryRecords(files) {
8241
8214
  rawExtraFieldAES,
8242
8215
  rawComment,
8243
8216
  rawExtraFieldNTFS,
8244
- rawExtraFieldUnix,
8217
+ rawCentralExtraFieldUnix,
8245
8218
  rawExtraField,
8246
8219
  rawCentralExtraField,
8247
8220
  extraFieldExtendedTimestampFlag,
@@ -8303,7 +8276,7 @@ function createDirectoryRecords(files) {
8303
8276
  rawExtraFieldZip64,
8304
8277
  rawExtraFieldAES,
8305
8278
  rawExtraFieldNTFS,
8306
- rawExtraFieldUnix,
8279
+ rawCentralExtraFieldUnix,
8307
8280
  rawExtraFieldTimestamp,
8308
8281
  rawExtraField,
8309
8282
  rawCentralExtraField);
@@ -8332,7 +8305,7 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
8332
8305
  rawExtraFieldAES,
8333
8306
  rawExtraFieldExtendedTimestamp,
8334
8307
  rawExtraFieldNTFS,
8335
- rawExtraFieldUnix,
8308
+ rawCentralExtraFieldUnix,
8336
8309
  rawExtraField,
8337
8310
  rawCentralExtraField,
8338
8311
  rawComment,
@@ -8349,7 +8322,7 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
8349
8322
  uncompressedSize,
8350
8323
  compressedSize
8351
8324
  } = fileEntry;
8352
- const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField, rawCentralExtraField);
8325
+ const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawCentralExtraFieldUnix, rawExtraField, rawCentralExtraField);
8353
8326
  const directoryRecordLength = CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
8354
8327
  if (exceedsAvailableSize(writer, offset + directoryRecordLength - directoryDiskOffset)) {
8355
8328
  await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
@@ -8385,7 +8358,7 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
8385
8358
  directoryRecord.writeBytes(rawExtraFieldAES);
8386
8359
  directoryRecord.writeBytes(rawExtraFieldExtendedTimestamp);
8387
8360
  directoryRecord.writeBytes(rawExtraFieldNTFS);
8388
- directoryRecord.writeBytes(rawExtraFieldUnix);
8361
+ directoryRecord.writeBytes(rawCentralExtraFieldUnix);
8389
8362
  directoryRecord.writeBytes(rawExtraField);
8390
8363
  directoryRecord.writeBytes(rawCentralExtraField);
8391
8364
  directoryRecord.writeBytes(rawComment);
@@ -8962,7 +8935,7 @@ function formatSupported(StreamClass, format) {
8962
8935
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8963
8936
  */
8964
8937
 
8965
- const VERSION = "2.18.2";
8938
+ const VERSION = "2.19.0";
8966
8939
 
8967
8940
  /*
8968
8941
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.