@zip.js/zip.js 2.9.0 → 2.10.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.
@@ -3506,21 +3506,14 @@ async function terminateWorkers() {
3506
3506
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3507
3507
  */
3508
3508
 
3509
- /* global TextDecoder */
3510
-
3511
3509
  const CP437 = "\0\u263A\u263B\u2665\u2666\u2663\u2660\u2022\u25D8\u25CB\u25D9\u2642\u2640\u266A\u266B\u263C\u25BA\u25C4\u2195\u203C\u00B6\u00A7\u25AC\u21A8\u2191\u2193\u2192\u2190\u221F\u2194\u25B2\u25BC !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\u2302\u00C7\u00FC\u00E9\u00E2\u00E4\u00E0\u00E5\u00E7\u00EA\u00EB\u00E8\u00EF\u00EE\u00EC\u00C4\u00C5\u00C9\u00E6\u00C6\u00F4\u00F6\u00F2\u00FB\u00F9\u00FF\u00D6\u00DC\u00A2\u00A3\u00A5\u20A7\u0192\u00E1\u00ED\u00F3\u00FA\u00F1\u00D1\u00AA\u00BA\u00BF\u2310\u00AC\u00BD\u00BC\u00A1\u00AB\u00BB\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255D\u255C\u255B\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u255E\u255F\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256B\u256A\u2518\u250C\u2588\u2584\u258C\u2590\u2580\u03B1\u00DF\u0393\u03C0\u03A3\u03C3\u00B5\u03C4\u03A6\u0398\u03A9\u03B4\u221E\u03C6\u03B5\u2229\u2261\u00B1\u2265\u2264\u2320\u2321\u00F7\u2248\u00B0\u2219\u00B7\u221A\u207F\u00B2\u25A0\u00A0".split("");
3512
- const VALID_CP437 = CP437.length == 256;
3513
3510
 
3514
3511
  function decodeCP437(stringValue) {
3515
- if (VALID_CP437) {
3516
- let result = "";
3517
- for (let indexCharacter = 0; indexCharacter < stringValue.length; indexCharacter++) {
3518
- result += CP437[stringValue[indexCharacter]];
3519
- }
3520
- return result;
3521
- } else {
3522
- return new TextDecoder().decode(stringValue);
3512
+ let result = "";
3513
+ for (let indexCharacter = 0; indexCharacter < stringValue.length; indexCharacter++) {
3514
+ result += CP437[stringValue[indexCharacter]];
3523
3515
  }
3516
+ return result;
3524
3517
  }
3525
3518
 
3526
3519
  /*
@@ -8655,7 +8648,7 @@ function formatSupported(StreamClass, format) {
8655
8648
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8656
8649
  */
8657
8650
 
8658
- const VERSION = "2.9.0";
8651
+ const VERSION = "2.10.0";
8659
8652
 
8660
8653
  /*
8661
8654
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -9519,7 +9512,14 @@ configureExternalAssets();
9519
9512
 
9520
9513
 
9521
9514
  const ERR_ENTRY_EXISTS = "Entry filename already exists";
9515
+ const ERR_DUPLICATE_IMPORTED_ENTRY = "Duplicate entry filename in the imported zip file";
9516
+ const ERR_INVALID_DUPLICATES = "Invalid duplicates option (must be \"throw\", \"keep-first\" or \"keep-last\")";
9517
+ const ERR_ANCESTOR_ENTRY = "Entry is a ancestor of target entry";
9522
9518
  const ERR_READABLE_CONSUMED = "Readable stream already consumed";
9519
+ const DUPLICATES_THROW = "throw";
9520
+ const DUPLICATES_KEEP_FIRST = "keep-first";
9521
+ const DUPLICATES_KEEP_LAST = "keep-last";
9522
+ const DUPLICATES_VALUES = new Set([DUPLICATES_THROW, DUPLICATES_KEEP_FIRST, DUPLICATES_KEEP_LAST]);
9523
9523
  const ERR_INVALID_PASS_THROUGH = "Invalid passThrough option (use readerOptions.passThrough or set uncompressedSize for each entry)";
9524
9524
  const ERR_INVALID_READER_OPTIONS = "Invalid readerOptions (must be an object)";
9525
9525
  const ERR_ZIP_CRYPTO_LAST_MOD_DATE = "The last modification date of an entry encrypted with ZipCrypto cannot be changed when passThrough is set";
@@ -9596,12 +9596,26 @@ class ZipEntry {
9596
9596
  }
9597
9597
 
9598
9598
  rename(name) {
9599
- const parent = this.parent;
9600
- if (parent && parent.getChildByName(name)) {
9601
- throw new Error(ERR_ENTRY_EXISTS);
9602
- } else {
9603
- this.name = name;
9599
+ const zipEntry = this;
9600
+ let parent = zipEntry.parent;
9601
+ if (parent) {
9602
+ const path = splitPath(name);
9603
+ if (path) {
9604
+ name = path.pop();
9605
+ parent = getPathParent(parent, path, zipEntry);
9606
+ }
9607
+ const existingChild = parent.getChildByName(name);
9608
+ if (existingChild && existingChild != zipEntry) {
9609
+ throw new Error(ERR_ENTRY_EXISTS);
9610
+ }
9611
+ if (parent != zipEntry.parent) {
9612
+ detach(zipEntry);
9613
+ zipEntry.parent = parent;
9614
+ parent.children.push(zipEntry);
9615
+ registerEntries(zipEntry.fs, zipEntry);
9616
+ }
9604
9617
  }
9618
+ zipEntry.name = name;
9605
9619
  }
9606
9620
 
9607
9621
  setOptions(options) {
@@ -9694,47 +9708,47 @@ class ZipFileEntry extends ZipEntry {
9694
9708
  }
9695
9709
 
9696
9710
  replaceBlob(blob) {
9697
- Object.assign(this, {
9711
+ replaceContent(this, {
9698
9712
  data: blob,
9699
9713
  Reader: BlobReader,
9700
9714
  Writer: BlobWriter,
9701
- reader: null
9715
+ uncompressedSize: blob.size
9702
9716
  });
9703
9717
  }
9704
9718
 
9705
9719
  replaceText(text) {
9706
- Object.assign(this, {
9720
+ replaceContent(this, {
9707
9721
  data: text,
9708
9722
  Reader: TextReader,
9709
9723
  Writer: TextWriter,
9710
- reader: null
9724
+ uncompressedSize: getTextSize(text)
9711
9725
  });
9712
9726
  }
9713
9727
 
9714
9728
  replaceData64URI(dataURI) {
9715
- Object.assign(this, {
9729
+ replaceContent(this, {
9716
9730
  data: dataURI,
9717
9731
  Reader: Data64URIReader,
9718
9732
  Writer: Data64URIWriter,
9719
- reader: null
9733
+ uncompressedSize: getData64URISize(dataURI)
9720
9734
  });
9721
9735
  }
9722
9736
 
9723
9737
  replaceUint8Array(array) {
9724
- Object.assign(this, {
9738
+ replaceContent(this, {
9725
9739
  data: array,
9726
9740
  Reader: Uint8ArrayReader,
9727
9741
  Writer: Uint8ArrayWriter,
9728
- reader: null
9742
+ uncompressedSize: array.length
9729
9743
  });
9730
9744
  }
9731
9745
 
9732
9746
  replaceReadable(readable) {
9733
- Object.assign(this, {
9747
+ replaceContent(this, {
9734
9748
  data: null,
9735
9749
  Reader: getReadableReader(readable),
9736
9750
  Writer: null,
9737
- reader: null
9751
+ uncompressedSize: UNDEFINED_VALUE
9738
9752
  });
9739
9753
  }
9740
9754
  }
@@ -9784,17 +9798,12 @@ class ZipDirectoryEntry extends ZipEntry {
9784
9798
  }
9785
9799
 
9786
9800
  addData64URI(name, dataURI, options = {}) {
9787
- let dataEnd = dataURI.length;
9788
- while (dataURI.charAt(dataEnd - 1) == "=") {
9789
- dataEnd--;
9790
- }
9791
- const dataStart = dataURI.indexOf(",") + 1;
9792
9801
  return addChild(this, name, {
9793
9802
  data: dataURI,
9794
9803
  Reader: Data64URIReader,
9795
9804
  Writer: Data64URIWriter,
9796
9805
  options,
9797
- uncompressedSize: Math.floor((dataEnd - dataStart) * 0.75)
9806
+ uncompressedSize: getData64URISize(dataURI)
9798
9807
  });
9799
9808
  }
9800
9809
 
@@ -9902,6 +9911,7 @@ class ZipDirectoryEntry extends ZipEntry {
9902
9911
  await initStream(reader);
9903
9912
  zipReader = new ZipReader(reader, options);
9904
9913
  }
9914
+ const duplicates = checkDuplicatesOption(options.duplicates);
9905
9915
  const importedEntries = [];
9906
9916
  const entries = await zipReader.getEntries(options);
9907
9917
  for (const entry of entries) {
@@ -9909,19 +9919,42 @@ class ZipDirectoryEntry extends ZipEntry {
9909
9919
  try {
9910
9920
  const path = entry.filename.split("/").filter(pathPart => pathPart != "" && pathPart != ".");
9911
9921
  const name = path.pop();
9912
- path.forEach(pathPart => {
9922
+ let skippedEntry = false;
9923
+ for (const pathPart of path) {
9913
9924
  const previousParent = parent;
9914
9925
  parent = parent.getChildByName(pathPart);
9915
9926
  if (parent) {
9916
9927
  if (!parent.directory) {
9917
- throw new Error(ERR_ENTRY_EXISTS);
9928
+ if (duplicates == DUPLICATES_KEEP_FIRST) {
9929
+ skippedEntry = true;
9930
+ break;
9931
+ } else if (duplicates == DUPLICATES_KEEP_LAST) {
9932
+ this.fs.remove(parent);
9933
+ parent = new ZipDirectoryEntry(this.fs, pathPart, { data: null }, previousParent);
9934
+ importedEntries.push(parent);
9935
+ } else {
9936
+ throw new Error(ERR_DUPLICATE_IMPORTED_ENTRY);
9937
+ }
9918
9938
  }
9919
9939
  } else {
9920
9940
  parent = new ZipDirectoryEntry(this.fs, pathPart, { data: null }, previousParent);
9921
9941
  importedEntries.push(parent);
9922
9942
  }
9923
- });
9943
+ }
9944
+ if (skippedEntry) {
9945
+ continue;
9946
+ }
9924
9947
  if (!entry.directory) {
9948
+ const existingChild = parent.getChildByName(name);
9949
+ if (existingChild) {
9950
+ if (duplicates == DUPLICATES_KEEP_FIRST) {
9951
+ continue;
9952
+ } else if (duplicates == DUPLICATES_KEEP_LAST) {
9953
+ this.fs.remove(existingChild);
9954
+ } else {
9955
+ throw new Error(ERR_DUPLICATE_IMPORTED_ENTRY);
9956
+ }
9957
+ }
9925
9958
  importedEntries.push(addChild(parent, name, {
9926
9959
  data: entry,
9927
9960
  Reader: getZipBlobReader(Object.assign({}, options)),
@@ -9932,11 +9965,17 @@ class ZipDirectoryEntry extends ZipEntry {
9932
9965
  let directoryEntry = parent;
9933
9966
  if (name) {
9934
9967
  directoryEntry = parent.getChildByName(name);
9935
- if (directoryEntry) {
9936
- if (!directoryEntry.directory) {
9937
- throw new Error(ERR_ENTRY_EXISTS);
9968
+ if (directoryEntry && !directoryEntry.directory) {
9969
+ if (duplicates == DUPLICATES_KEEP_FIRST) {
9970
+ continue;
9971
+ } else if (duplicates == DUPLICATES_KEEP_LAST) {
9972
+ this.fs.remove(directoryEntry);
9973
+ directoryEntry = UNDEFINED_VALUE;
9974
+ } else {
9975
+ throw new Error(ERR_DUPLICATE_IMPORTED_ENTRY);
9938
9976
  }
9939
- } else {
9977
+ }
9978
+ if (!directoryEntry) {
9940
9979
  directoryEntry = new ZipDirectoryEntry(this.fs, name, { data: null }, parent);
9941
9980
  importedEntries.push(directoryEntry);
9942
9981
  }
@@ -9946,6 +9985,7 @@ class ZipDirectoryEntry extends ZipEntry {
9946
9985
  }
9947
9986
  }
9948
9987
  } catch (error) {
9988
+ importedEntries.reverse().forEach(importedEntry => this.fs.remove(importedEntry));
9949
9989
  try {
9950
9990
  error.cause = {
9951
9991
  entry
@@ -10064,7 +10104,7 @@ class ZipFS {
10064
10104
  }
10065
10105
  }
10066
10106
  } else {
10067
- throw new Error("Entry is a ancestor of target entry");
10107
+ throw new Error(ERR_ANCESTOR_ENTRY);
10068
10108
  }
10069
10109
  } else {
10070
10110
  throw new Error("Target entry is not a directory");
@@ -10076,7 +10116,7 @@ class ZipFS {
10076
10116
  const path = fullname.split("/");
10077
10117
  let node = this.root;
10078
10118
  for (let index = 0; node && index < path.length; index++) {
10079
- node = node.getChildByName(path[index]);
10119
+ node = node.directory ? node.getChildByName(path[index]) : UNDEFINED_VALUE;
10080
10120
  }
10081
10121
  if (!node) {
10082
10122
  node = this.entries.find(entry => entry && (entry == this.root || entry.isDescendantOf(this.root)) &&
@@ -10138,33 +10178,27 @@ class ZipFS {
10138
10178
  }
10139
10179
 
10140
10180
  importBlob(blob, options) {
10141
- resetFS(this);
10142
- return this.root.importBlob(blob, options);
10181
+ return resetAndImport(this, root => root.importBlob(blob, options));
10143
10182
  }
10144
10183
 
10145
10184
  importData64URI(dataURI, options) {
10146
- resetFS(this);
10147
- return this.root.importData64URI(dataURI, options);
10185
+ return resetAndImport(this, root => root.importData64URI(dataURI, options));
10148
10186
  }
10149
10187
 
10150
10188
  importUint8Array(array, options) {
10151
- resetFS(this);
10152
- return this.root.importUint8Array(array, options);
10189
+ return resetAndImport(this, root => root.importUint8Array(array, options));
10153
10190
  }
10154
10191
 
10155
10192
  importHttpContent(url, options) {
10156
- resetFS(this);
10157
- return this.root.importHttpContent(url, options);
10193
+ return resetAndImport(this, root => root.importHttpContent(url, options));
10158
10194
  }
10159
10195
 
10160
10196
  importReadable(readable, options) {
10161
- resetFS(this);
10162
- return this.root.importReadable(readable, options);
10197
+ return resetAndImport(this, root => root.importReadable(readable, options));
10163
10198
  }
10164
10199
 
10165
10200
  importZip(reader, options) {
10166
- resetFS(this);
10167
- return this.root.importZip(reader, options);
10201
+ return resetAndImport(this, root => root.importZip(reader, options));
10168
10202
  }
10169
10203
 
10170
10204
  exportBlob(options) {
@@ -10484,6 +10518,25 @@ function checkReaderOptions(readerOptions) {
10484
10518
  return readerOptions;
10485
10519
  }
10486
10520
 
10521
+ function replaceContent(zipEntry, params) {
10522
+ const { uncompressedSize } = params;
10523
+ Object.assign(zipEntry, params, {
10524
+ reader: null,
10525
+ passThrough: UNDEFINED_VALUE,
10526
+ uncompressedSize: uncompressedSize === UNDEFINED_VALUE ? 0 : uncompressedSize,
10527
+ undeterminedSize: uncompressedSize === UNDEFINED_VALUE
10528
+ });
10529
+ }
10530
+
10531
+ function getData64URISize(dataURI) {
10532
+ let dataEnd = dataURI.length;
10533
+ while (dataURI.charAt(dataEnd - 1) == "=") {
10534
+ dataEnd--;
10535
+ }
10536
+ const dataStart = dataURI.indexOf(",") + 1;
10537
+ return Math.floor((dataEnd - dataStart) * 0.75);
10538
+ }
10539
+
10487
10540
  function isPassThrough(child, options) {
10488
10541
  const { readerOptions } = options;
10489
10542
  return Boolean(!child.directory && (child.passThrough || (readerOptions && readerOptions.passThrough)));
@@ -10773,6 +10826,15 @@ function resetFS(fs) {
10773
10826
  fs.root = new ZipDirectoryEntry(fs);
10774
10827
  }
10775
10828
 
10829
+ function resetAndImport(fs, importFunction) {
10830
+ const { entries, entryIdCounter, root } = fs;
10831
+ resetFS(fs);
10832
+ return importFunction(fs.root).catch(error => {
10833
+ Object.assign(fs, { entries, entryIdCounter, root });
10834
+ throw error;
10835
+ });
10836
+ }
10837
+
10776
10838
  function collectChildren(directory, recursive) {
10777
10839
  const children = [];
10778
10840
  const pendingDirectories = [directory];
@@ -10801,10 +10863,52 @@ function registerEntries(fs, entry) {
10801
10863
 
10802
10864
  function addChild(parent, name, params, directory) {
10803
10865
  if (parent.directory) {
10866
+ const path = splitPath(name);
10867
+ if (path) {
10868
+ name = path.pop();
10869
+ parent = getPathParent(parent, path);
10870
+ }
10804
10871
  return directory ? new ZipDirectoryEntry(parent.fs, name, params, parent) : new ZipFileEntry(parent.fs, name, params, parent);
10805
10872
  } else {
10806
10873
  throw new Error("Parent entry is not a directory");
10807
10874
  }
10808
10875
  }
10809
10876
 
10810
- 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_CRYPTO_LAST_MOD_DATE, ERR_ZIP_NOT_EMPTY, HttpRangeReader, HttpReader, Reader, SplitDataReader, SplitDataWriter, TextReader, TextWriter, Uint8ArrayReader, Uint8ArrayWriter, VERSION, WARNING_APPENDED_DATA, WARNING_COMPRESSED_PATCHED_DATA, WARNING_DUPLICATE_FILENAME, WARNING_MALFORMED_EXTRA_FIELD, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG, WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD, WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY, WARNING_PREPENDED_CENTRAL_DIRECTORY, WARNING_PREPENDED_DATA, WARNING_TRAILING_CENTRAL_DIRECTORY_DATA, WARNING_UNKNOWN_VERSION, WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA, WARNING_UNSORTED_CENTRAL_DIRECTORY, WARNING_WRAPPED_ENTRIES_COUNT, Writer, ZipDirectoryEntry, ZipEntry, ZipFS, ZipFileEntry, ZipReader, ZipReaderStream, ZipWriter, ZipWriterStream, configure, createBlobTempStream, createOPFSTempStream, createSyncAccessHandleTempStream, fs, getMimeType, getRegisteredCodecs, getSupportedCompressionMethods, isZipFile, registerCodec, resetConfiguration, terminateWorkersAndModule as terminateWorkers, unregisterCodec };
10877
+ function checkDuplicatesOption(duplicates) {
10878
+ if (duplicates === UNDEFINED_VALUE) {
10879
+ return DUPLICATES_THROW;
10880
+ } else if (DUPLICATES_VALUES.has(duplicates)) {
10881
+ return duplicates;
10882
+ } else {
10883
+ throw new Error(ERR_INVALID_DUPLICATES);
10884
+ }
10885
+ }
10886
+
10887
+ function splitPath(name) {
10888
+ if (name.includes("/")) {
10889
+ const path = name.split("/").filter(pathPart => pathPart != "" && pathPart != ".");
10890
+ if (path.length) {
10891
+ return path;
10892
+ }
10893
+ }
10894
+ }
10895
+
10896
+ function getPathParent(parent, path, movedEntry) {
10897
+ path.forEach(pathPart => {
10898
+ const previousParent = parent;
10899
+ parent = parent.getChildByName(pathPart);
10900
+ if (parent) {
10901
+ if (!parent.directory) {
10902
+ throw new Error(ERR_ENTRY_EXISTS);
10903
+ }
10904
+ if (movedEntry && (parent == movedEntry || parent.isDescendantOf(movedEntry))) {
10905
+ throw new Error(ERR_ANCESTOR_ENTRY);
10906
+ }
10907
+ } else {
10908
+ parent = new ZipDirectoryEntry(previousParent.fs, pathPart, { data: null }, previousParent);
10909
+ }
10910
+ });
10911
+ return parent;
10912
+ }
10913
+
10914
+ export { BlobReader, BlobWriter, Data64URIReader, Data64URIWriter, ERR_ABORTED, ERR_AMBIGUOUS_ARCHIVE, ERR_BAD_FORMAT, ERR_CENTRAL_DIRECTORY_NOT_FOUND, ERR_DUPLICATED_NAME, ERR_DUPLICATE_IMPORTED_ENTRY, 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_DUPLICATES, 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_CRYPTO_LAST_MOD_DATE, ERR_ZIP_NOT_EMPTY, HttpRangeReader, HttpReader, Reader, SplitDataReader, SplitDataWriter, TextReader, TextWriter, Uint8ArrayReader, Uint8ArrayWriter, VERSION, WARNING_APPENDED_DATA, WARNING_COMPRESSED_PATCHED_DATA, WARNING_DUPLICATE_FILENAME, WARNING_MALFORMED_EXTRA_FIELD, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG, WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD, WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY, WARNING_PREPENDED_CENTRAL_DIRECTORY, WARNING_PREPENDED_DATA, WARNING_TRAILING_CENTRAL_DIRECTORY_DATA, WARNING_UNKNOWN_VERSION, WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA, WARNING_UNSORTED_CENTRAL_DIRECTORY, WARNING_WRAPPED_ENTRIES_COUNT, Writer, ZipDirectoryEntry, ZipEntry, ZipFS, ZipFileEntry, ZipReader, ZipReaderStream, ZipWriter, ZipWriterStream, configure, createBlobTempStream, createOPFSTempStream, createSyncAccessHandleTempStream, fs, getMimeType, getRegisteredCodecs, getSupportedCompressionMethods, isZipFile, registerCodec, resetConfiguration, terminateWorkersAndModule as terminateWorkers, unregisterCodec };