@loaders.gl/zip 4.1.0-alpha.1 → 4.1.0-alpha.11

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 (68) hide show
  1. package/dist/dist.dev.js +875 -64
  2. package/dist/filesystems/zip-filesystem.d.ts.map +1 -1
  3. package/dist/filesystems/zip-filesystem.js.map +1 -1
  4. package/dist/hash-file-utility.d.ts +19 -0
  5. package/dist/hash-file-utility.d.ts.map +1 -1
  6. package/dist/hash-file-utility.js +30 -0
  7. package/dist/hash-file-utility.js.map +1 -1
  8. package/dist/index.cjs +542 -56
  9. package/dist/index.d.ts +3 -2
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +3 -2
  12. package/dist/index.js.map +1 -1
  13. package/dist/lib/tar/header.d.ts.map +1 -1
  14. package/dist/lib/tar/header.js.map +1 -1
  15. package/dist/lib/tar/tar.d.ts.map +1 -1
  16. package/dist/lib/tar/tar.js.map +1 -1
  17. package/dist/lib/tar/types.d.ts.map +1 -1
  18. package/dist/lib/tar/types.js.map +1 -1
  19. package/dist/lib/tar/utils.d.ts.map +1 -1
  20. package/dist/lib/tar/utils.js.map +1 -1
  21. package/dist/parse-zip/cd-file-header.d.ts +1 -1
  22. package/dist/parse-zip/cd-file-header.d.ts.map +1 -1
  23. package/dist/parse-zip/cd-file-header.js +4 -4
  24. package/dist/parse-zip/cd-file-header.js.map +1 -1
  25. package/dist/parse-zip/end-of-central-directory.d.ts +35 -0
  26. package/dist/parse-zip/end-of-central-directory.d.ts.map +1 -1
  27. package/dist/parse-zip/end-of-central-directory.js +161 -9
  28. package/dist/parse-zip/end-of-central-directory.js.map +1 -1
  29. package/dist/parse-zip/local-file-header.d.ts +16 -0
  30. package/dist/parse-zip/local-file-header.d.ts.map +1 -1
  31. package/dist/parse-zip/local-file-header.js +73 -1
  32. package/dist/parse-zip/local-file-header.js.map +1 -1
  33. package/dist/parse-zip/search-from-the-end.d.ts.map +1 -1
  34. package/dist/parse-zip/search-from-the-end.js.map +1 -1
  35. package/dist/parse-zip/zip-composition.d.ts +38 -0
  36. package/dist/parse-zip/zip-composition.d.ts.map +1 -0
  37. package/dist/parse-zip/zip-composition.js +115 -0
  38. package/dist/parse-zip/zip-composition.js.map +1 -0
  39. package/dist/parse-zip/zip64-info-generation.d.ts +5 -8
  40. package/dist/parse-zip/zip64-info-generation.d.ts.map +1 -1
  41. package/dist/parse-zip/zip64-info-generation.js +6 -3
  42. package/dist/parse-zip/zip64-info-generation.js.map +1 -1
  43. package/dist/tar-builder.d.ts.map +1 -1
  44. package/dist/tar-builder.js.map +1 -1
  45. package/dist/zip-loader.d.ts.map +1 -1
  46. package/dist/zip-loader.js +1 -1
  47. package/dist/zip-loader.js.map +1 -1
  48. package/dist/zip-writer.d.ts +2 -2
  49. package/dist/zip-writer.d.ts.map +1 -1
  50. package/dist/zip-writer.js +22 -7
  51. package/dist/zip-writer.js.map +1 -1
  52. package/package.json +7 -7
  53. package/src/filesystems/zip-filesystem.ts +2 -1
  54. package/src/hash-file-utility.ts +84 -3
  55. package/src/index.ts +6 -3
  56. package/src/lib/tar/header.ts +2 -1
  57. package/src/lib/tar/tar.ts +2 -1
  58. package/src/lib/tar/types.ts +2 -1
  59. package/src/lib/tar/utils.ts +2 -1
  60. package/src/parse-zip/cd-file-header.ts +8 -6
  61. package/src/parse-zip/end-of-central-directory.ts +338 -10
  62. package/src/parse-zip/local-file-header.ts +128 -2
  63. package/src/parse-zip/search-from-the-end.ts +2 -1
  64. package/src/parse-zip/zip-composition.ts +235 -0
  65. package/src/parse-zip/zip64-info-generation.ts +21 -5
  66. package/src/tar-builder.ts +2 -1
  67. package/src/zip-loader.ts +2 -1
  68. package/src/zip-writer.ts +24 -10
package/dist/dist.dev.js CHANGED
@@ -6956,7 +6956,11 @@ var __exports__ = (() => {
6956
6956
  ZipFileSystem: () => ZipFileSystem,
6957
6957
  ZipLoader: () => ZipLoader,
6958
6958
  ZipWriter: () => ZipWriter,
6959
+ addOneFile: () => addOneFile,
6960
+ composeHashFile: () => composeHashFile,
6961
+ createZip: () => createZip,
6959
6962
  generateCDHeader: () => generateCDHeader,
6963
+ generateLocalHeader: () => generateLocalHeader,
6960
6964
  localHeaderSignature: () => signature3,
6961
6965
  makeHashTableFromZipHeaders: () => makeHashTableFromZipHeaders,
6962
6966
  makeZipCDHeaderIterator: () => makeZipCDHeaderIterator,
@@ -6969,7 +6973,7 @@ var __exports__ = (() => {
6969
6973
 
6970
6974
  // src/zip-loader.ts
6971
6975
  var import_jszip = __toESM(require_jszip_min(), 1);
6972
- var VERSION = typeof __VERSION__ !== "undefined" ? __VERSION__ : "latest";
6976
+ var VERSION = true ? "4.1.0-alpha.11" : "latest";
6973
6977
  var ZipLoader = {
6974
6978
  id: "zip",
6975
6979
  module: "zip",
@@ -7014,11 +7018,22 @@ var __exports__ = (() => {
7014
7018
 
7015
7019
  // src/zip-writer.ts
7016
7020
  var import_jszip2 = __toESM(require_jszip_min(), 1);
7021
+ var VERSION2 = true ? "4.1.0-alpha.11" : "latest";
7017
7022
  var ZipWriter = {
7018
7023
  name: "Zip Archive",
7024
+ id: "zip",
7025
+ module: "zip",
7026
+ version: VERSION2,
7019
7027
  extensions: ["zip"],
7020
7028
  category: "archive",
7021
7029
  mimeTypes: ["application/zip"],
7030
+ options: {
7031
+ zip: {
7032
+ onUpdate: () => {
7033
+ }
7034
+ },
7035
+ jszip: {}
7036
+ },
7022
7037
  encode: encodeZipAsync
7023
7038
  };
7024
7039
  async function encodeZipAsync(fileMap, options = {}) {
@@ -7027,18 +7042,21 @@ var __exports__ = (() => {
7027
7042
  const subFileData = fileMap[subFileName];
7028
7043
  jsZip.file(subFileName, subFileData, options?.jszip || {});
7029
7044
  }
7045
+ const zipOptions = {
7046
+ ...ZipWriter.options.zip,
7047
+ ...options?.zip
7048
+ };
7030
7049
  const jszipOptions = {
7031
- ...options?.jszip,
7032
- type: "arraybuffer"
7050
+ ...ZipWriter.options?.jszip,
7051
+ ...options.jszip
7033
7052
  };
7034
- const {
7035
- onUpdate = () => {
7036
- }
7037
- } = options;
7038
7053
  try {
7039
- return await jsZip.generateAsync(jszipOptions, onUpdate);
7054
+ return await jsZip.generateAsync({
7055
+ ...jszipOptions,
7056
+ type: "arraybuffer"
7057
+ }, zipOptions.onUpdate);
7040
7058
  } catch (error) {
7041
- options.log.error(`Unable to write zip archive: ${error}`);
7059
+ options.log.error(`Unable to encode zip archive: ${error}`);
7042
7060
  throw error;
7043
7061
  }
7044
7062
  }
@@ -7239,8 +7257,8 @@ var __exports__ = (() => {
7239
7257
  };
7240
7258
  this.tape = new tar_default(this.options.recordsPerBlock);
7241
7259
  }
7242
- addFile(filename, buffer) {
7243
- this.tape.append(filename, new Uint8Array(buffer));
7260
+ addFile(filename2, buffer) {
7261
+ this.tape.append(filename2, new Uint8Array(buffer));
7244
7262
  this.count++;
7245
7263
  }
7246
7264
  async build() {
@@ -7279,6 +7297,9 @@ var __exports__ = (() => {
7279
7297
  return true;
7280
7298
  }
7281
7299
  function concatenateArrayBuffers(...sources) {
7300
+ return concatenateArrayBuffersFromArray(sources);
7301
+ }
7302
+ function concatenateArrayBuffersFromArray(sources) {
7282
7303
  const sourceArrays = sources.map((source2) => source2 instanceof ArrayBuffer ? new Uint8Array(source2) : source2);
7283
7304
  const byteLength = sourceArrays.reduce((length, typedArray) => length + typedArray.byteLength, 0);
7284
7305
  const result = new Uint8Array(byteLength);
@@ -7299,6 +7320,22 @@ var __exports__ = (() => {
7299
7320
  return concatenateArrayBuffers(...arrayBuffers);
7300
7321
  }
7301
7322
 
7323
+ // ../loader-utils/src/lib/path-utils/file-aliases.ts
7324
+ var pathPrefix = "";
7325
+ var fileAliases = {};
7326
+ function resolvePath(filename2) {
7327
+ for (const alias in fileAliases) {
7328
+ if (filename2.startsWith(alias)) {
7329
+ const replacement = fileAliases[alias];
7330
+ filename2 = filename2.replace(alias, replacement);
7331
+ }
7332
+ }
7333
+ if (!filename2.startsWith("http://") && !filename2.startsWith("https://")) {
7334
+ filename2 = `${pathPrefix}${filename2}`;
7335
+ }
7336
+ return filename2;
7337
+ }
7338
+
7302
7339
  // ../loader-utils/src/lib/node/buffer.browser.ts
7303
7340
  function toArrayBuffer(buffer) {
7304
7341
  return buffer;
@@ -7334,7 +7371,150 @@ var __exports__ = (() => {
7334
7371
 
7335
7372
  // ../loader-utils/src/lib/node/promisify.ts
7336
7373
  function promisify1(fn) {
7337
- return (args) => new Promise((resolve, reject) => fn(args, (error, callbackArgs) => error ? reject(error) : resolve(callbackArgs)));
7374
+ return (args) => new Promise((resolve2, reject) => fn(args, (error, callbackArgs) => error ? reject(error) : resolve2(callbackArgs)));
7375
+ }
7376
+
7377
+ // ../loader-utils/src/lib/path-utils/path.ts
7378
+ var path_exports = {};
7379
+ __export(path_exports, {
7380
+ dirname: () => dirname,
7381
+ filename: () => filename,
7382
+ join: () => join,
7383
+ resolve: () => resolve
7384
+ });
7385
+
7386
+ // ../loader-utils/src/lib/path-utils/get-cwd.ts
7387
+ function getCWD() {
7388
+ if (typeof process !== "undefined" && typeof process.cwd !== "undefined") {
7389
+ return process.cwd();
7390
+ }
7391
+ const pathname = window.location?.pathname;
7392
+ return pathname?.slice(0, pathname.lastIndexOf("/") + 1) || "";
7393
+ }
7394
+
7395
+ // ../loader-utils/src/lib/path-utils/path.ts
7396
+ function filename(url) {
7397
+ const slashIndex = url ? url.lastIndexOf("/") : -1;
7398
+ return slashIndex >= 0 ? url.substr(slashIndex + 1) : "";
7399
+ }
7400
+ function dirname(url) {
7401
+ const slashIndex = url ? url.lastIndexOf("/") : -1;
7402
+ return slashIndex >= 0 ? url.substr(0, slashIndex) : "";
7403
+ }
7404
+ function join(...parts) {
7405
+ const separator = "/";
7406
+ parts = parts.map((part, index) => {
7407
+ if (index) {
7408
+ part = part.replace(new RegExp(`^${separator}`), "");
7409
+ }
7410
+ if (index !== parts.length - 1) {
7411
+ part = part.replace(new RegExp(`${separator}$`), "");
7412
+ }
7413
+ return part;
7414
+ });
7415
+ return parts.join(separator);
7416
+ }
7417
+ function resolve(...components) {
7418
+ const paths = [];
7419
+ for (let _i = 0; _i < components.length; _i++) {
7420
+ paths[_i] = components[_i];
7421
+ }
7422
+ let resolvedPath = "";
7423
+ let resolvedAbsolute = false;
7424
+ let cwd;
7425
+ for (let i = paths.length - 1; i >= -1 && !resolvedAbsolute; i--) {
7426
+ let path;
7427
+ if (i >= 0) {
7428
+ path = paths[i];
7429
+ } else {
7430
+ if (cwd === void 0) {
7431
+ cwd = getCWD();
7432
+ }
7433
+ path = cwd;
7434
+ }
7435
+ if (path.length === 0) {
7436
+ continue;
7437
+ }
7438
+ resolvedPath = `${path}/${resolvedPath}`;
7439
+ resolvedAbsolute = path.charCodeAt(0) === SLASH;
7440
+ }
7441
+ resolvedPath = normalizeStringPosix(resolvedPath, !resolvedAbsolute);
7442
+ if (resolvedAbsolute) {
7443
+ return `/${resolvedPath}`;
7444
+ } else if (resolvedPath.length > 0) {
7445
+ return resolvedPath;
7446
+ }
7447
+ return ".";
7448
+ }
7449
+ var SLASH = 47;
7450
+ var DOT = 46;
7451
+ function normalizeStringPosix(path, allowAboveRoot) {
7452
+ let res = "";
7453
+ let lastSlash = -1;
7454
+ let dots = 0;
7455
+ let code;
7456
+ let isAboveRoot = false;
7457
+ for (let i = 0; i <= path.length; ++i) {
7458
+ if (i < path.length) {
7459
+ code = path.charCodeAt(i);
7460
+ } else if (code === SLASH) {
7461
+ break;
7462
+ } else {
7463
+ code = SLASH;
7464
+ }
7465
+ if (code === SLASH) {
7466
+ if (lastSlash === i - 1 || dots === 1) {
7467
+ } else if (lastSlash !== i - 1 && dots === 2) {
7468
+ if (res.length < 2 || !isAboveRoot || res.charCodeAt(res.length - 1) !== DOT || res.charCodeAt(res.length - 2) !== DOT) {
7469
+ if (res.length > 2) {
7470
+ const start = res.length - 1;
7471
+ let j = start;
7472
+ for (; j >= 0; --j) {
7473
+ if (res.charCodeAt(j) === SLASH) {
7474
+ break;
7475
+ }
7476
+ }
7477
+ if (j !== start) {
7478
+ res = j === -1 ? "" : res.slice(0, j);
7479
+ lastSlash = i;
7480
+ dots = 0;
7481
+ isAboveRoot = false;
7482
+ continue;
7483
+ }
7484
+ } else if (res.length === 2 || res.length === 1) {
7485
+ res = "";
7486
+ lastSlash = i;
7487
+ dots = 0;
7488
+ isAboveRoot = false;
7489
+ continue;
7490
+ }
7491
+ }
7492
+ if (allowAboveRoot) {
7493
+ if (res.length > 0) {
7494
+ res += "/..";
7495
+ } else {
7496
+ res = "..";
7497
+ }
7498
+ isAboveRoot = true;
7499
+ }
7500
+ } else {
7501
+ const slice = path.slice(lastSlash + 1, i);
7502
+ if (res.length > 0) {
7503
+ res += `/${slice}`;
7504
+ } else {
7505
+ res = slice;
7506
+ }
7507
+ isAboveRoot = false;
7508
+ }
7509
+ lastSlash = i;
7510
+ dots = 0;
7511
+ } else if (code === DOT && dots !== -1) {
7512
+ ++dots;
7513
+ } else {
7514
+ dots = -1;
7515
+ }
7516
+ }
7517
+ return res;
7338
7518
  }
7339
7519
 
7340
7520
  // ../loader-utils/src/lib/files/node-file-facade.ts
@@ -7361,10 +7541,50 @@ var __exports__ = (() => {
7361
7541
  async stat() {
7362
7542
  throw NOT_IMPLEMENTED;
7363
7543
  }
7544
+ async truncate(length) {
7545
+ throw NOT_IMPLEMENTED;
7546
+ }
7547
+ async append(data) {
7548
+ throw NOT_IMPLEMENTED;
7549
+ }
7364
7550
  async close() {
7365
7551
  }
7366
7552
  };
7367
7553
 
7554
+ // ../loader-utils/src/lib/filesystems/node-filesystem-facade.ts
7555
+ var NOT_IMPLEMENTED2 = new Error("Not implemented");
7556
+ var NodeFileSystemFacade = class {
7557
+ constructor(options) {
7558
+ if (globalThis.loaders?.NodeFileSystem) {
7559
+ return new globalThis.loaders.NodeFileSystem(options);
7560
+ }
7561
+ if (isBrowser) {
7562
+ throw new Error("Can't instantiate NodeFileSystem in browser.");
7563
+ }
7564
+ throw new Error("Can't instantiate NodeFileSystem. Make sure to import @loaders.gl/polyfills first.");
7565
+ }
7566
+ readable = true;
7567
+ writable = true;
7568
+ async openReadableFile(path, flags) {
7569
+ throw NOT_IMPLEMENTED2;
7570
+ }
7571
+ async openWritableFile(path, flags, mode) {
7572
+ throw NOT_IMPLEMENTED2;
7573
+ }
7574
+ async readdir(dirname2 = ".", options) {
7575
+ throw NOT_IMPLEMENTED2;
7576
+ }
7577
+ async stat(path, options) {
7578
+ throw NOT_IMPLEMENTED2;
7579
+ }
7580
+ async unlink(path) {
7581
+ throw NOT_IMPLEMENTED2;
7582
+ }
7583
+ async fetch(path, options) {
7584
+ throw NOT_IMPLEMENTED2;
7585
+ }
7586
+ };
7587
+
7368
7588
  // ../loader-utils/src/lib/file-provider/file-provider.ts
7369
7589
  var isFileProvider = (fileProvider) => {
7370
7590
  return fileProvider?.getUint8 && fileProvider?.slice && fileProvider?.length;
@@ -7372,9 +7592,14 @@ var __exports__ = (() => {
7372
7592
 
7373
7593
  // ../loader-utils/src/lib/file-provider/file-handle-file.ts
7374
7594
  var FileHandleFile = class {
7375
- constructor(path) {
7376
- this.file = new NodeFileFacade(path, "r");
7377
- this.size = this.file.bigsize;
7595
+ constructor(path, append = false) {
7596
+ this.file = new NodeFileFacade(path, append ? "a+" : "r");
7597
+ }
7598
+ async truncate(length) {
7599
+ await this.file.truncate(length);
7600
+ }
7601
+ async append(buffer) {
7602
+ await this.file.append(buffer);
7378
7603
  }
7379
7604
  async destroy() {
7380
7605
  await this.file.close();
@@ -7420,7 +7645,7 @@ var __exports__ = (() => {
7420
7645
  return await this.file.read(startOffset, length);
7421
7646
  }
7422
7647
  get length() {
7423
- return this.size;
7648
+ return this.file.bigsize;
7424
7649
  }
7425
7650
  };
7426
7651
 
@@ -7441,39 +7666,6 @@ var __exports__ = (() => {
7441
7666
  return targetOffset;
7442
7667
  };
7443
7668
 
7444
- // src/parse-zip/end-of-central-directory.ts
7445
- var eoCDSignature = new Uint8Array([80, 75, 5, 6]);
7446
- var zip64EoCDLocatorSignature = new Uint8Array([80, 75, 6, 7]);
7447
- var zip64EoCDSignature = new Uint8Array([80, 75, 6, 6]);
7448
- var CD_RECORDS_NUMBER_OFFSET = 8n;
7449
- var CD_START_OFFSET_OFFSET = 16n;
7450
- var ZIP64_EOCD_START_OFFSET_OFFSET = 8n;
7451
- var ZIP64_CD_RECORDS_NUMBER_OFFSET = 24n;
7452
- var ZIP64_CD_START_OFFSET_OFFSET = 48n;
7453
- var parseEoCDRecord = async (file) => {
7454
- const zipEoCDOffset = await searchFromTheEnd(file, eoCDSignature);
7455
- let cdRecordsNumber = BigInt(await file.getUint16(zipEoCDOffset + CD_RECORDS_NUMBER_OFFSET));
7456
- let cdStartOffset = BigInt(await file.getUint32(zipEoCDOffset + CD_START_OFFSET_OFFSET));
7457
- if (cdStartOffset === BigInt(4294967295) || cdRecordsNumber === BigInt(4294967295)) {
7458
- const zip64EoCDLocatorOffset = zipEoCDOffset - 20n;
7459
- const magicBytes = await file.slice(zip64EoCDLocatorOffset, zip64EoCDLocatorOffset + 4n);
7460
- if (!compareArrayBuffers(magicBytes, zip64EoCDLocatorSignature)) {
7461
- throw new Error("zip64 EoCD locator not found");
7462
- }
7463
- const zip64EoCDOffset = await file.getBigUint64(zip64EoCDLocatorOffset + ZIP64_EOCD_START_OFFSET_OFFSET);
7464
- const endOfCDMagicBytes = await file.slice(zip64EoCDOffset, zip64EoCDOffset + 4n);
7465
- if (!compareArrayBuffers(endOfCDMagicBytes, zip64EoCDSignature.buffer)) {
7466
- throw new Error("zip64 EoCD not found");
7467
- }
7468
- cdRecordsNumber = await file.getBigUint64(zip64EoCDOffset + ZIP64_CD_RECORDS_NUMBER_OFFSET);
7469
- cdStartOffset = await file.getBigUint64(zip64EoCDOffset + ZIP64_CD_START_OFFSET_OFFSET);
7470
- }
7471
- return {
7472
- cdRecordsNumber,
7473
- cdStartOffset
7474
- };
7475
- };
7476
-
7477
7669
  // src/parse-zip/zip64-info-generation.ts
7478
7670
  var signature = new Uint8Array([1, 0]);
7479
7671
  function createZip64Info(options) {
@@ -7492,12 +7684,15 @@ var __exports__ = (() => {
7492
7684
  }
7493
7685
  return concatenateArrayBuffers(...arraysToConcat);
7494
7686
  }
7687
+ function setFieldToNumber(header, fieldSize, fieldOffset, value) {
7688
+ NUMBER_SETTERS[fieldSize](header, Number(fieldOffset), value);
7689
+ }
7495
7690
  var NUMBER_SETTERS = {
7496
7691
  2: (header, offset, value) => {
7497
- header.setUint16(offset, value, true);
7692
+ header.setUint16(offset, Number(value > 65535 ? 65535 : value), true);
7498
7693
  },
7499
7694
  4: (header, offset, value) => {
7500
- header.setUint32(offset, value, true);
7695
+ header.setUint32(offset, Number(value > 4294967295 ? 4294967295 : value), true);
7501
7696
  },
7502
7697
  8: (header, offset, value) => {
7503
7698
  header.setBigUint64(offset, BigInt(value), true);
@@ -7520,6 +7715,187 @@ var __exports__ = (() => {
7520
7715
  name: "offset"
7521
7716
  }];
7522
7717
 
7718
+ // src/parse-zip/end-of-central-directory.ts
7719
+ var eoCDSignature = new Uint8Array([80, 75, 5, 6]);
7720
+ var zip64EoCDLocatorSignature = new Uint8Array([80, 75, 6, 7]);
7721
+ var zip64EoCDSignature = new Uint8Array([80, 75, 6, 6]);
7722
+ var CD_RECORDS_NUMBER_OFFSET = 8n;
7723
+ var CD_RECORDS_NUMBER_ON_DISC_OFFSET = 10n;
7724
+ var CD_CD_BYTE_SIZE_OFFSET = 12n;
7725
+ var CD_START_OFFSET_OFFSET = 16n;
7726
+ var CD_COMMENT_OFFSET = 22n;
7727
+ var ZIP64_EOCD_START_OFFSET_OFFSET = 8n;
7728
+ var ZIP64_CD_RECORDS_NUMBER_OFFSET = 24n;
7729
+ var ZIP64_CD_RECORDS_NUMBER_ON_DISC_OFFSET = 32n;
7730
+ var ZIP64_CD_CD_BYTE_SIZE_OFFSET = 40n;
7731
+ var ZIP64_CD_START_OFFSET_OFFSET = 48n;
7732
+ var ZIP64_COMMENT_OFFSET = 56n;
7733
+ var parseEoCDRecord = async (file) => {
7734
+ const zipEoCDOffset = await searchFromTheEnd(file, eoCDSignature);
7735
+ let cdRecordsNumber = BigInt(await file.getUint16(zipEoCDOffset + CD_RECORDS_NUMBER_OFFSET));
7736
+ let cdStartOffset = BigInt(await file.getUint32(zipEoCDOffset + CD_START_OFFSET_OFFSET));
7737
+ let zip64EoCDLocatorOffset = zipEoCDOffset - 20n;
7738
+ let zip64EoCDOffset = 0n;
7739
+ const magicBytes = await file.slice(zip64EoCDLocatorOffset, zip64EoCDLocatorOffset + 4n);
7740
+ if (compareArrayBuffers(magicBytes, zip64EoCDLocatorSignature)) {
7741
+ zip64EoCDOffset = await file.getBigUint64(zip64EoCDLocatorOffset + ZIP64_EOCD_START_OFFSET_OFFSET);
7742
+ const endOfCDMagicBytes = await file.slice(zip64EoCDOffset, zip64EoCDOffset + 4n);
7743
+ if (!compareArrayBuffers(endOfCDMagicBytes, zip64EoCDSignature.buffer)) {
7744
+ throw new Error("zip64 EoCD not found");
7745
+ }
7746
+ cdRecordsNumber = await file.getBigUint64(zip64EoCDOffset + ZIP64_CD_RECORDS_NUMBER_OFFSET);
7747
+ cdStartOffset = await file.getBigUint64(zip64EoCDOffset + ZIP64_CD_START_OFFSET_OFFSET);
7748
+ } else {
7749
+ zip64EoCDLocatorOffset = 0n;
7750
+ }
7751
+ return {
7752
+ cdRecordsNumber,
7753
+ cdStartOffset,
7754
+ offsets: {
7755
+ zip64EoCDOffset,
7756
+ zip64EoCDLocatorOffset,
7757
+ zipEoCDOffset
7758
+ }
7759
+ };
7760
+ };
7761
+ function updateEoCD(eocdBody, oldEoCDOffsets, newCDStartOffset, eocdStartOffset, newCDRecordsNumber) {
7762
+ const eocd = new DataView(eocdBody);
7763
+ const classicEoCDOffset = oldEoCDOffsets.zip64EoCDOffset ? oldEoCDOffsets.zipEoCDOffset - oldEoCDOffsets.zip64EoCDOffset : 0n;
7764
+ if (Number(newCDRecordsNumber) <= 65535) {
7765
+ setFieldToNumber(eocd, 2, classicEoCDOffset + CD_RECORDS_NUMBER_OFFSET, newCDRecordsNumber);
7766
+ setFieldToNumber(eocd, 2, classicEoCDOffset + CD_RECORDS_NUMBER_ON_DISC_OFFSET, newCDRecordsNumber);
7767
+ }
7768
+ if (eocdStartOffset - newCDStartOffset <= 4294967295) {
7769
+ setFieldToNumber(eocd, 4, classicEoCDOffset + CD_CD_BYTE_SIZE_OFFSET, eocdStartOffset - newCDStartOffset);
7770
+ }
7771
+ if (newCDStartOffset < 4294967295) {
7772
+ setFieldToNumber(eocd, 4, classicEoCDOffset + CD_START_OFFSET_OFFSET, newCDStartOffset);
7773
+ }
7774
+ if (oldEoCDOffsets.zip64EoCDLocatorOffset && oldEoCDOffsets.zip64EoCDOffset) {
7775
+ const locatorOffset = oldEoCDOffsets.zip64EoCDLocatorOffset - oldEoCDOffsets.zip64EoCDOffset;
7776
+ setFieldToNumber(eocd, 8, locatorOffset + ZIP64_EOCD_START_OFFSET_OFFSET, eocdStartOffset);
7777
+ setFieldToNumber(eocd, 8, ZIP64_CD_START_OFFSET_OFFSET, newCDStartOffset);
7778
+ setFieldToNumber(eocd, 8, ZIP64_CD_RECORDS_NUMBER_OFFSET, newCDRecordsNumber);
7779
+ setFieldToNumber(eocd, 8, ZIP64_CD_RECORDS_NUMBER_ON_DISC_OFFSET, newCDRecordsNumber);
7780
+ setFieldToNumber(eocd, 8, ZIP64_CD_CD_BYTE_SIZE_OFFSET, eocdStartOffset - newCDStartOffset);
7781
+ }
7782
+ return new Uint8Array(eocd.buffer);
7783
+ }
7784
+ function generateEoCD(options) {
7785
+ const header = new DataView(new ArrayBuffer(Number(CD_COMMENT_OFFSET)));
7786
+ for (const field of EOCD_FIELDS) {
7787
+ setFieldToNumber(header, field.size, field.offset, options[field.name ?? ""] ?? field.default ?? 0);
7788
+ }
7789
+ const locator = generateZip64InfoLocator(options);
7790
+ const zip64Record = generateZip64Info(options);
7791
+ return concatenateArrayBuffers(zip64Record, locator, header.buffer);
7792
+ }
7793
+ var EOCD_FIELDS = [{
7794
+ offset: 0,
7795
+ size: 4,
7796
+ default: new DataView(eoCDSignature.buffer).getUint32(0, true)
7797
+ }, {
7798
+ offset: 4,
7799
+ size: 2,
7800
+ default: 0
7801
+ }, {
7802
+ offset: 6,
7803
+ size: 2,
7804
+ default: 0
7805
+ }, {
7806
+ offset: 8,
7807
+ size: 2,
7808
+ name: "recordsNumber"
7809
+ }, {
7810
+ offset: 10,
7811
+ size: 2,
7812
+ name: "recordsNumber"
7813
+ }, {
7814
+ offset: 12,
7815
+ size: 4,
7816
+ name: "cdSize"
7817
+ }, {
7818
+ offset: 16,
7819
+ size: 4,
7820
+ name: "cdOffset"
7821
+ }, {
7822
+ offset: 20,
7823
+ size: 2,
7824
+ default: 0
7825
+ }];
7826
+ function generateZip64Info(options) {
7827
+ const record = new DataView(new ArrayBuffer(Number(ZIP64_COMMENT_OFFSET)));
7828
+ for (const field of ZIP64_EOCD_FIELDS) {
7829
+ setFieldToNumber(record, field.size, field.offset, options[field.name ?? ""] ?? field.default ?? 0);
7830
+ }
7831
+ return record.buffer;
7832
+ }
7833
+ function generateZip64InfoLocator(options) {
7834
+ const locator = new DataView(new ArrayBuffer(Number(20)));
7835
+ for (const field of ZIP64_EOCD_LOCATOR_FIELDS) {
7836
+ setFieldToNumber(locator, field.size, field.offset, options[field.name ?? ""] ?? field.default ?? 0);
7837
+ }
7838
+ return locator.buffer;
7839
+ }
7840
+ var ZIP64_EOCD_LOCATOR_FIELDS = [{
7841
+ offset: 0,
7842
+ size: 4,
7843
+ default: new DataView(zip64EoCDLocatorSignature.buffer).getUint32(0, true)
7844
+ }, {
7845
+ offset: 4,
7846
+ size: 4,
7847
+ default: 0
7848
+ }, {
7849
+ offset: 8,
7850
+ size: 8,
7851
+ name: "eoCDStart"
7852
+ }, {
7853
+ offset: 16,
7854
+ size: 4,
7855
+ default: 1
7856
+ }];
7857
+ var ZIP64_EOCD_FIELDS = [{
7858
+ offset: 0,
7859
+ size: 4,
7860
+ default: new DataView(zip64EoCDSignature.buffer).getUint32(0, true)
7861
+ }, {
7862
+ offset: 4,
7863
+ size: 8,
7864
+ default: 44
7865
+ }, {
7866
+ offset: 12,
7867
+ size: 2,
7868
+ default: 45
7869
+ }, {
7870
+ offset: 14,
7871
+ size: 2,
7872
+ default: 45
7873
+ }, {
7874
+ offset: 16,
7875
+ size: 4,
7876
+ default: 0
7877
+ }, {
7878
+ offset: 20,
7879
+ size: 4,
7880
+ default: 0
7881
+ }, {
7882
+ offset: 24,
7883
+ size: 8,
7884
+ name: "recordsNumber"
7885
+ }, {
7886
+ offset: 32,
7887
+ size: 8,
7888
+ name: "recordsNumber"
7889
+ }, {
7890
+ offset: 40,
7891
+ size: 8,
7892
+ name: "cdSize"
7893
+ }, {
7894
+ offset: 48,
7895
+ size: 8,
7896
+ name: "cdOffset"
7897
+ }];
7898
+
7523
7899
  // src/parse-zip/cd-file-header.ts
7524
7900
  var CD_COMPRESSED_SIZE_OFFSET = 20n;
7525
7901
  var CD_UNCOMPRESSED_SIZE_OFFSET = 24n;
@@ -7627,7 +8003,7 @@ var __exports__ = (() => {
7627
8003
  const optionsToZip64 = {};
7628
8004
  if (optionsToUse.offset >= 4294967295) {
7629
8005
  optionsToZip64.offset = optionsToUse.offset;
7630
- optionsToUse.offset = 4294967295;
8006
+ optionsToUse.offset = BigInt(4294967295);
7631
8007
  }
7632
8008
  if (optionsToUse.length >= 4294967295) {
7633
8009
  optionsToZip64.size = optionsToUse.length;
@@ -7637,9 +8013,9 @@ var __exports__ = (() => {
7637
8013
  zip64header = createZip64Info(optionsToZip64);
7638
8014
  optionsToUse.extraLength = zip64header.byteLength;
7639
8015
  }
7640
- const header = new DataView(new ArrayBuffer(46));
8016
+ const header = new DataView(new ArrayBuffer(Number(CD_FILE_NAME_OFFSET)));
7641
8017
  for (const field of ZIP_HEADER_FIELDS) {
7642
- NUMBER_SETTERS[field.size](header, field.offset, optionsToUse[field.name ?? ""] ?? field.default ?? 0);
8018
+ setFieldToNumber(header, field.size, field.offset, optionsToUse[field.name ?? ""] ?? field.default ?? 0);
7643
8019
  }
7644
8020
  const encodedName = new TextEncoder().encode(optionsToUse.fileName);
7645
8021
  const resHeader = concatenateArrayBuffers(header.buffer, encodedName, zip64header);
@@ -7758,6 +8134,76 @@ var __exports__ = (() => {
7758
8134
  compressionMethod
7759
8135
  };
7760
8136
  };
8137
+ function generateLocalHeader(options) {
8138
+ const optionsToUse = {
8139
+ ...options,
8140
+ extraLength: 0,
8141
+ fnlength: options.fileName.length
8142
+ };
8143
+ let zip64header = new ArrayBuffer(0);
8144
+ const optionsToZip64 = {};
8145
+ if (optionsToUse.length >= 4294967295) {
8146
+ optionsToZip64.size = optionsToUse.length;
8147
+ optionsToUse.length = 4294967295;
8148
+ }
8149
+ if (Object.keys(optionsToZip64).length) {
8150
+ zip64header = createZip64Info(optionsToZip64);
8151
+ optionsToUse.extraLength = zip64header.byteLength;
8152
+ }
8153
+ const header = new DataView(new ArrayBuffer(Number(FILE_NAME_OFFSET)));
8154
+ for (const field of ZIP_HEADER_FIELDS2) {
8155
+ setFieldToNumber(header, field.size, field.offset, optionsToUse[field.name ?? ""] ?? field.default ?? 0);
8156
+ }
8157
+ const encodedName = new TextEncoder().encode(optionsToUse.fileName);
8158
+ const resHeader = concatenateArrayBuffers(header.buffer, encodedName, zip64header);
8159
+ return resHeader;
8160
+ }
8161
+ var ZIP_HEADER_FIELDS2 = [{
8162
+ offset: 0,
8163
+ size: 4,
8164
+ default: new DataView(signature3.buffer).getUint32(0, true)
8165
+ }, {
8166
+ offset: 4,
8167
+ size: 2,
8168
+ default: 45
8169
+ }, {
8170
+ offset: 6,
8171
+ size: 2,
8172
+ default: 0
8173
+ }, {
8174
+ offset: 8,
8175
+ size: 2,
8176
+ default: 0
8177
+ }, {
8178
+ offset: 10,
8179
+ size: 2,
8180
+ default: 0
8181
+ }, {
8182
+ offset: 12,
8183
+ size: 2,
8184
+ default: 0
8185
+ }, {
8186
+ offset: 14,
8187
+ size: 4,
8188
+ name: "crc32"
8189
+ }, {
8190
+ offset: 18,
8191
+ size: 4,
8192
+ name: "length"
8193
+ }, {
8194
+ offset: 22,
8195
+ size: 4,
8196
+ name: "length"
8197
+ }, {
8198
+ offset: 26,
8199
+ size: 2,
8200
+ name: "fnlength"
8201
+ }, {
8202
+ offset: 28,
8203
+ size: 2,
8204
+ default: 0,
8205
+ name: "extraLength"
8206
+ }];
7761
8207
 
7762
8208
  // ../crypto/src/lib/hash.ts
7763
8209
  var Hash = class {
@@ -7784,6 +8230,29 @@ var __exports__ = (() => {
7784
8230
  }
7785
8231
  };
7786
8232
 
8233
+ // ../crypto/src/lib/algorithms/crc32.ts
8234
+ var CRC32 = class {
8235
+ constructor() {
8236
+ this.crc = ~0;
8237
+ }
8238
+ update(arrayBuffer) {
8239
+ const CRC32_TABLE = getCRC32Table();
8240
+ const byteArray = new Uint8Array(arrayBuffer);
8241
+ for (let i = 0; i < byteArray.byteLength; i++) {
8242
+ this.crc = this.crc >>> 8 ^ CRC32_TABLE[(this.crc ^ byteArray[i]) & 255];
8243
+ }
8244
+ return this;
8245
+ }
8246
+ finalize() {
8247
+ this.crc = (this.crc ^ -1) >>> 0;
8248
+ return this.crc;
8249
+ }
8250
+ };
8251
+ var CRC32TAB = Uint32Array.of(0, 1996959894, 3993919788, 2567524794, 124634137, 1886057615, 3915621685, 2657392035, 249268274, 2044508324, 3772115230, 2547177864, 162941995, 2125561021, 3887607047, 2428444049, 498536548, 1789927666, 4089016648, 2227061214, 450548861, 1843258603, 4107580753, 2211677639, 325883990, 1684777152, 4251122042, 2321926636, 335633487, 1661365465, 4195302755, 2366115317, 997073096, 1281953886, 3579855332, 2724688242, 1006888145, 1258607687, 3524101629, 2768942443, 901097722, 1119000684, 3686517206, 2898065728, 853044451, 1172266101, 3705015759, 2882616665, 651767980, 1373503546, 3369554304, 3218104598, 565507253, 1454621731, 3485111705, 3099436303, 671266974, 1594198024, 3322730930, 2970347812, 795835527, 1483230225, 3244367275, 3060149565, 1994146192, 31158534, 2563907772, 4023717930, 1907459465, 112637215, 2680153253, 3904427059, 2013776290, 251722036, 2517215374, 3775830040, 2137656763, 141376813, 2439277719, 3865271297, 1802195444, 476864866, 2238001368, 4066508878, 1812370925, 453092731, 2181625025, 4111451223, 1706088902, 314042704, 2344532202, 4240017532, 1658658271, 366619977, 2362670323, 4224994405, 1303535960, 984961486, 2747007092, 3569037538, 1256170817, 1037604311, 2765210733, 3554079995, 1131014506, 879679996, 2909243462, 3663771856, 1141124467, 855842277, 2852801631, 3708648649, 1342533948, 654459306, 3188396048, 3373015174, 1466479909, 544179635, 3110523913, 3462522015, 1591671054, 702138776, 2966460450, 3352799412, 1504918807, 783551873, 3082640443, 3233442989, 3988292384, 2596254646, 62317068, 1957810842, 3939845945, 2647816111, 81470997, 1943803523, 3814918930, 2489596804, 225274430, 2053790376, 3826175755, 2466906013, 167816743, 2097651377, 4027552580, 2265490386, 503444072, 1762050814, 4150417245, 2154129355, 426522225, 1852507879, 4275313526, 2312317920, 282753626, 1742555852, 4189708143, 2394877945, 397917763, 1622183637, 3604390888, 2714866558, 953729732, 1340076626, 3518719985, 2797360999, 1068828381, 1219638859, 3624741850, 2936675148, 906185462, 1090812512, 3747672003, 2825379669, 829329135, 1181335161, 3412177804, 3160834842, 628085408, 1382605366, 3423369109, 3138078467, 570562233, 1426400815, 3317316542, 2998733608, 733239954, 1555261956, 3268935591, 3050360625, 752459403, 1541320221, 2607071920, 3965973030, 1969922972, 40735498, 2617837225, 3943577151, 1913087877, 83908371, 2512341634, 3803740692, 2075208622, 213261112, 2463272603, 3855990285, 2094854071, 198958881, 2262029012, 4057260610, 1759359992, 534414190, 2176718541, 4139329115, 1873836001, 414664567, 2282248934, 4279200368, 1711684554, 285281116, 2405801727, 4167216745, 1634467795, 376229701, 2685067896, 3608007406, 1308918612, 956543938, 2808555105, 3495958263, 1231636301, 1047427035, 2932959818, 3654703836, 1088359270, 936918e3, 2847714899, 3736837829, 1202900863, 817233897, 3183342108, 3401237130, 1404277552, 615818150, 3134207493, 3453421203, 1423857449, 601450431, 3009837614, 3294710456, 1567103746, 711928724, 3020668471, 3272380065, 1510334235, 755167117);
8252
+ function getCRC32Table() {
8253
+ return CRC32TAB;
8254
+ }
8255
+
7787
8256
  // ../crypto/src/lib/utils/base64-utils.ts
7788
8257
  function asciiToBase64(string) {
7789
8258
  string = `${string}`;
@@ -7835,6 +8304,16 @@ var __exports__ = (() => {
7835
8304
  }
7836
8305
 
7837
8306
  // ../crypto/src/lib/utils/digest-utils.ts
8307
+ function encodeNumber(number, encoding) {
8308
+ switch (encoding) {
8309
+ case "hex":
8310
+ return convertNumberToHex(number);
8311
+ case "base64":
8312
+ return convertHexToBase64(convertNumberToHex(number));
8313
+ default:
8314
+ throw new Error(encoding);
8315
+ }
8316
+ }
7838
8317
  function encodeHex(hex, encoding) {
7839
8318
  switch (encoding) {
7840
8319
  case "hex":
@@ -7853,6 +8332,43 @@ var __exports__ = (() => {
7853
8332
  const string = matches2.map((a) => String.fromCharCode(parseInt(a, 16))).join("");
7854
8333
  return asciiToBase64(string) || "";
7855
8334
  }
8335
+ function convertNumberToHex(cipher) {
8336
+ const hexString = cipher.toString(16);
8337
+ return hexString === "0" ? `0${hexString}` : hexString;
8338
+ }
8339
+
8340
+ // ../crypto/src/lib/crc32-hash.ts
8341
+ var CRC32Hash = class extends Hash {
8342
+ name = "crc32";
8343
+ constructor(options = {}) {
8344
+ super();
8345
+ this.options = {
8346
+ crypto: {},
8347
+ ...options
8348
+ };
8349
+ this.hashBatches = this.hashBatches.bind(this);
8350
+ }
8351
+ async hash(input, encoding) {
8352
+ return this.hashSync(input, encoding);
8353
+ }
8354
+ hashSync(input, encoding) {
8355
+ const hash = new CRC32();
8356
+ hash.update(input);
8357
+ const digest = hash.finalize();
8358
+ return encodeNumber(digest, encoding);
8359
+ }
8360
+ async *hashBatches(asyncIterator, encoding = "base64") {
8361
+ const hash = new CRC32();
8362
+ for await (const chunk of asyncIterator) {
8363
+ hash.update(chunk);
8364
+ yield chunk;
8365
+ }
8366
+ const digest = hash.finalize();
8367
+ this.options.crypto?.onEnd?.({
8368
+ hash: encodeNumber(digest, encoding)
8369
+ });
8370
+ }
8371
+ };
7856
8372
 
7857
8373
  // ../crypto/src/lib/algorithms/md5-wasm.ts
7858
8374
  var atb = typeof atob === "function" ? atob : typeof Buffer === "function" ? nodeATOB : identity;
@@ -8271,12 +8787,279 @@ var __exports__ = (() => {
8271
8787
  this.options = options;
8272
8788
  }
8273
8789
  async hash(input, encoding) {
8274
- const md5Promise = new Promise((resolve, reject) => md5WASM(input).then(resolve).catch(reject));
8790
+ const md5Promise = new Promise((resolve2, reject) => md5WASM(input).then(resolve2).catch(reject));
8275
8791
  const hex = await md5Promise;
8276
8792
  return encodeHex(hex, encoding);
8277
8793
  }
8278
8794
  };
8279
8795
 
8796
+ // ../core/src/javascript-utils/is-type.ts
8797
+ var isResponse = (x) => typeof Response !== "undefined" && x instanceof Response || x && x.arrayBuffer && x.text && x.json;
8798
+ var isBlob = (x) => typeof Blob !== "undefined" && x instanceof Blob;
8799
+
8800
+ // ../core/src/lib/utils/mime-type-utils.ts
8801
+ var DATA_URL_PATTERN = /^data:([-\w.]+\/[-\w.+]+)(;|,)/;
8802
+ var MIME_TYPE_PATTERN = /^([-\w.]+\/[-\w.+]+)/;
8803
+ function parseMIMEType(mimeString) {
8804
+ const matches2 = MIME_TYPE_PATTERN.exec(mimeString);
8805
+ if (matches2) {
8806
+ return matches2[1];
8807
+ }
8808
+ return mimeString;
8809
+ }
8810
+ function parseMIMETypeFromURL(url) {
8811
+ const matches2 = DATA_URL_PATTERN.exec(url);
8812
+ if (matches2) {
8813
+ return matches2[1];
8814
+ }
8815
+ return "";
8816
+ }
8817
+
8818
+ // ../core/src/lib/utils/url-utils.ts
8819
+ var QUERY_STRING_PATTERN = /\?.*/;
8820
+ function stripQueryString(url) {
8821
+ return url.replace(QUERY_STRING_PATTERN, "");
8822
+ }
8823
+
8824
+ // ../core/src/lib/utils/resource-utils.ts
8825
+ function getResourceUrl(resource) {
8826
+ if (isResponse(resource)) {
8827
+ const response = resource;
8828
+ return response.url;
8829
+ }
8830
+ if (isBlob(resource)) {
8831
+ const blob = resource;
8832
+ return blob.name || "";
8833
+ }
8834
+ if (typeof resource === "string") {
8835
+ return resource;
8836
+ }
8837
+ return "";
8838
+ }
8839
+ function getResourceMIMEType(resource) {
8840
+ if (isResponse(resource)) {
8841
+ const response = resource;
8842
+ const contentTypeHeader = response.headers.get("content-type") || "";
8843
+ const noQueryUrl = stripQueryString(response.url);
8844
+ return parseMIMEType(contentTypeHeader) || parseMIMETypeFromURL(noQueryUrl);
8845
+ }
8846
+ if (isBlob(resource)) {
8847
+ const blob = resource;
8848
+ return blob.type || "";
8849
+ }
8850
+ if (typeof resource === "string") {
8851
+ return parseMIMETypeFromURL(resource);
8852
+ }
8853
+ return "";
8854
+ }
8855
+ function getResourceContentLength(resource) {
8856
+ if (isResponse(resource)) {
8857
+ const response = resource;
8858
+ return response.headers["content-length"] || -1;
8859
+ }
8860
+ if (isBlob(resource)) {
8861
+ const blob = resource;
8862
+ return blob.size;
8863
+ }
8864
+ if (typeof resource === "string") {
8865
+ return resource.length;
8866
+ }
8867
+ if (resource instanceof ArrayBuffer) {
8868
+ return resource.byteLength;
8869
+ }
8870
+ if (ArrayBuffer.isView(resource)) {
8871
+ return resource.byteLength;
8872
+ }
8873
+ return -1;
8874
+ }
8875
+
8876
+ // ../core/src/lib/utils/response-utils.ts
8877
+ async function makeResponse(resource) {
8878
+ if (isResponse(resource)) {
8879
+ return resource;
8880
+ }
8881
+ const headers = {};
8882
+ const contentLength = getResourceContentLength(resource);
8883
+ if (contentLength >= 0) {
8884
+ headers["content-length"] = String(contentLength);
8885
+ }
8886
+ const url = getResourceUrl(resource);
8887
+ const type = getResourceMIMEType(resource);
8888
+ if (type) {
8889
+ headers["content-type"] = type;
8890
+ }
8891
+ const initialDataUrl = await getInitialDataUrl(resource);
8892
+ if (initialDataUrl) {
8893
+ headers["x-first-bytes"] = initialDataUrl;
8894
+ }
8895
+ if (typeof resource === "string") {
8896
+ resource = new TextEncoder().encode(resource);
8897
+ }
8898
+ const response = new Response(resource, {
8899
+ headers
8900
+ });
8901
+ Object.defineProperty(response, "url", {
8902
+ value: url
8903
+ });
8904
+ return response;
8905
+ }
8906
+ async function getInitialDataUrl(resource) {
8907
+ const INITIAL_DATA_LENGTH = 5;
8908
+ if (typeof resource === "string") {
8909
+ return `data:,${resource.slice(0, INITIAL_DATA_LENGTH)}`;
8910
+ }
8911
+ if (resource instanceof Blob) {
8912
+ const blobSlice = resource.slice(0, 5);
8913
+ return await new Promise((resolve2) => {
8914
+ const reader = new FileReader();
8915
+ reader.onload = (event) => resolve2(event?.target?.result);
8916
+ reader.readAsDataURL(blobSlice);
8917
+ });
8918
+ }
8919
+ if (resource instanceof ArrayBuffer) {
8920
+ const slice = resource.slice(0, INITIAL_DATA_LENGTH);
8921
+ const base64 = arrayBufferToBase64(slice);
8922
+ return `data:base64,${base64}`;
8923
+ }
8924
+ return null;
8925
+ }
8926
+ function arrayBufferToBase64(buffer) {
8927
+ let binary = "";
8928
+ const bytes = new Uint8Array(buffer);
8929
+ for (let i = 0; i < bytes.byteLength; i++) {
8930
+ binary += String.fromCharCode(bytes[i]);
8931
+ }
8932
+ return btoa(binary);
8933
+ }
8934
+
8935
+ // ../core/src/lib/fetch/fetch-file.ts
8936
+ function isNodePath(url) {
8937
+ return !isRequestURL(url) && !isDataURL(url);
8938
+ }
8939
+ function isRequestURL(url) {
8940
+ return url.startsWith("http:") || url.startsWith("https:");
8941
+ }
8942
+ function isDataURL(url) {
8943
+ return url.startsWith("data:");
8944
+ }
8945
+ async function fetchFile(urlOrData, fetchOptions) {
8946
+ if (typeof urlOrData === "string") {
8947
+ const url = resolvePath(urlOrData);
8948
+ if (isNodePath(url)) {
8949
+ if (globalThis.loaders?.fetchNode) {
8950
+ return globalThis.loaders?.fetchNode(url, fetchOptions);
8951
+ }
8952
+ }
8953
+ return await fetch(url, fetchOptions);
8954
+ }
8955
+ return await makeResponse(urlOrData);
8956
+ }
8957
+
8958
+ // src/parse-zip/zip-composition.ts
8959
+ async function cutTheTailOff(provider) {
8960
+ const oldEoCDinfo = await parseEoCDRecord(provider);
8961
+ const oldCDStartOffset = oldEoCDinfo.cdStartOffset;
8962
+ const oldCDLength = Number(oldEoCDinfo.offsets.zip64EoCDOffset ? oldEoCDinfo.offsets.zip64EoCDOffset - oldCDStartOffset : oldEoCDinfo.offsets.zipEoCDOffset - oldCDStartOffset);
8963
+ const zipEnding = await provider.slice(oldCDStartOffset, provider.length);
8964
+ await provider.truncate(Number(oldCDStartOffset));
8965
+ const oldCDBody = zipEnding.slice(0, oldCDLength);
8966
+ const eocdBody = zipEnding.slice(oldCDLength, zipEnding.byteLength);
8967
+ return [oldCDBody, eocdBody, oldEoCDinfo];
8968
+ }
8969
+ async function generateFileHeaders(fileName, fileToAdd, localFileHeaderOffset) {
8970
+ const newFileCRC322 = parseInt(await new CRC32Hash().hash(fileToAdd, "hex"), 16);
8971
+ const newFileLocalHeader = generateLocalHeader({
8972
+ crc32: newFileCRC322,
8973
+ fileName,
8974
+ length: fileToAdd.byteLength
8975
+ });
8976
+ const newFileCDHeader = generateCDHeader({
8977
+ crc32: newFileCRC322,
8978
+ fileName,
8979
+ offset: localFileHeaderOffset,
8980
+ length: fileToAdd.byteLength
8981
+ });
8982
+ return [new Uint8Array(concatenateArrayBuffers(newFileLocalHeader, fileToAdd)), new Uint8Array(newFileCDHeader)];
8983
+ }
8984
+ async function addOneFile(zipUrl, fileToAdd, fileName) {
8985
+ const provider = new FileHandleFile(zipUrl, true);
8986
+ const [oldCDBody, eocdBody, oldEoCDinfo] = await cutTheTailOff(provider);
8987
+ const newFileOffset = provider.length;
8988
+ const [localPart, cdHeaderPart] = await generateFileHeaders(fileName, fileToAdd, newFileOffset);
8989
+ await provider.append(localPart);
8990
+ const newCDBody = concatenateArrayBuffers(oldCDBody, cdHeaderPart);
8991
+ const newCDStartOffset = provider.length;
8992
+ await provider.append(new Uint8Array(newCDBody));
8993
+ const eocdOffset = provider.length;
8994
+ await provider.append(updateEoCD(eocdBody, oldEoCDinfo.offsets, newCDStartOffset, eocdOffset, oldEoCDinfo.cdRecordsNumber + 1n));
8995
+ }
8996
+ async function createZip(inputPath, outputPath, createAdditionalData) {
8997
+ const fileIterator = getFileIterator(inputPath);
8998
+ const resFile = new NodeFileFacade(outputPath, "w");
8999
+ const fileList = [];
9000
+ const cdArray = [];
9001
+ for await (const file of fileIterator) {
9002
+ await addFile(file, resFile, cdArray, fileList);
9003
+ }
9004
+ if (createAdditionalData) {
9005
+ const additionaldata = await createAdditionalData(fileList);
9006
+ console.log(additionaldata);
9007
+ await addFile(additionaldata, resFile, cdArray);
9008
+ }
9009
+ const cdOffset = (await resFile.stat()).bigsize;
9010
+ const cd = concatenateArrayBuffers(...cdArray);
9011
+ await resFile.append(new Uint8Array(cd));
9012
+ const eoCDStart = (await resFile.stat()).bigsize;
9013
+ await resFile.append(new Uint8Array(generateEoCD({
9014
+ recordsNumber: cdArray.length,
9015
+ cdSize: cd.byteLength,
9016
+ cdOffset,
9017
+ eoCDStart
9018
+ })));
9019
+ }
9020
+ async function addFile(file, resFile, cdArray, fileList) {
9021
+ const size = (await resFile.stat()).bigsize;
9022
+ fileList?.push({
9023
+ fileName: file.path,
9024
+ localHeaderOffset: size
9025
+ });
9026
+ const [localPart, cdHeaderPart] = await generateFileHeaders(file.path, file.file, size);
9027
+ await resFile.append(localPart);
9028
+ cdArray.push(cdHeaderPart);
9029
+ }
9030
+ function getFileIterator(inputPath) {
9031
+ async function* iterable() {
9032
+ const fileList = await getAllFiles(inputPath);
9033
+ for (const filePath of fileList) {
9034
+ const file = await (await fetchFile(path_exports.join(inputPath, filePath))).arrayBuffer();
9035
+ yield {
9036
+ path: filePath,
9037
+ file
9038
+ };
9039
+ }
9040
+ }
9041
+ return iterable();
9042
+ }
9043
+ async function getAllFiles(basePath, subfolder = "", fsPassed) {
9044
+ const fs = fsPassed ? fsPassed : new NodeFileSystemFacade({});
9045
+ const files = await fs.readdir(pathJoin(basePath, subfolder));
9046
+ const arrayOfFiles = [];
9047
+ for (const file of files) {
9048
+ const fullPath = pathJoin(basePath, subfolder, file);
9049
+ if ((await fs.stat(fullPath)).isDirectory) {
9050
+ const files2 = await getAllFiles(basePath, pathJoin(subfolder, file));
9051
+ arrayOfFiles.push(...files2);
9052
+ } else {
9053
+ arrayOfFiles.push(pathJoin(subfolder, file));
9054
+ }
9055
+ }
9056
+ return arrayOfFiles;
9057
+ }
9058
+ function pathJoin(...paths) {
9059
+ const resPaths = paths.filter((val) => val.length);
9060
+ return path_exports.join(...resPaths);
9061
+ }
9062
+
8280
9063
  // src/hash-file-utility.ts
8281
9064
  function parseHashTable(arrayBuffer) {
8282
9065
  const dataView = new DataView(arrayBuffer);
@@ -8293,17 +9076,45 @@ var __exports__ = (() => {
8293
9076
  }
8294
9077
  async function makeHashTableFromZipHeaders(fileProvider) {
8295
9078
  const zipCDIterator = makeZipCDHeaderIterator(fileProvider);
9079
+ return getHashTable(zipCDIterator);
9080
+ }
9081
+ async function getHashTable(zipCDIterator) {
8296
9082
  const md5Hash = new MD5Hash();
8297
9083
  const textEncoder = new TextEncoder();
8298
9084
  const hashTable = {};
8299
9085
  for await (const cdHeader of zipCDIterator) {
8300
- const filename = cdHeader.fileName.split("\\").join("/").toLocaleLowerCase();
8301
- const arrayBuffer = textEncoder.encode(filename).buffer;
9086
+ const filename2 = cdHeader.fileName.split("\\").join("/").toLocaleLowerCase();
9087
+ const arrayBuffer = textEncoder.encode(filename2).buffer;
8302
9088
  const md5 = await md5Hash.hash(arrayBuffer, "hex");
8303
9089
  hashTable[md5] = cdHeader.localHeaderOffset;
8304
9090
  }
8305
9091
  return hashTable;
8306
9092
  }
9093
+ async function composeHashFile(zipCDIterator) {
9094
+ const md5Hash = new MD5Hash();
9095
+ const textEncoder = new TextEncoder();
9096
+ const hashArray = [];
9097
+ for await (const cdHeader of zipCDIterator) {
9098
+ const filename2 = cdHeader.fileName.split("\\").join("/").toLocaleLowerCase();
9099
+ const arrayBuffer = textEncoder.encode(filename2).buffer;
9100
+ const md5 = await md5Hash.hash(arrayBuffer, "hex");
9101
+ hashArray.push(concatenateArrayBuffers(hexStringToBuffer(md5), bigintToBuffer(cdHeader.localHeaderOffset)));
9102
+ }
9103
+ const bufferArray = hashArray.sort(compareHashes);
9104
+ return concatenateArrayBuffersFromArray(bufferArray);
9105
+ }
9106
+ function compareHashes(arrA, arrB) {
9107
+ const a = new BigUint64Array(arrA);
9108
+ const b = new BigUint64Array(arrB);
9109
+ return Number(a[0] === b[0] ? a[1] - b[1] : a[0] - b[0]);
9110
+ }
9111
+ function hexStringToBuffer(str) {
9112
+ const byteArray = str.match(/../g)?.map((h) => parseInt(h, 16));
9113
+ return new Uint8Array(byteArray ?? new Array(16)).buffer;
9114
+ }
9115
+ function bigintToBuffer(n) {
9116
+ return new BigUint64Array([n]).buffer;
9117
+ }
8307
9118
 
8308
9119
  // ../compression/src/lib/compression.ts
8309
9120
  var Compression = class {
@@ -8493,18 +9304,18 @@ var __exports__ = (() => {
8493
9304
  }
8494
9305
  return fileNames;
8495
9306
  }
8496
- async stat(filename) {
8497
- const cdFileHeader = await this.getCDFileHeader(filename);
9307
+ async stat(filename2) {
9308
+ const cdFileHeader = await this.getCDFileHeader(filename2);
8498
9309
  return {
8499
9310
  ...cdFileHeader,
8500
9311
  size: Number(cdFileHeader.uncompressedSize)
8501
9312
  };
8502
9313
  }
8503
- async fetch(filename) {
9314
+ async fetch(filename2) {
8504
9315
  if (!this.fileProvider) {
8505
9316
  throw new Error("No data detected in the zip archive");
8506
9317
  }
8507
- const cdFileHeader = await this.getCDFileHeader(filename);
9318
+ const cdFileHeader = await this.getCDFileHeader(filename2);
8508
9319
  const localFileHeader = await parseZipLocalFileHeader(cdFileHeader.localHeaderOffset, this.fileProvider);
8509
9320
  if (!localFileHeader) {
8510
9321
  throw new Error("Local file header has not been found in the zip archive`");
@@ -8517,18 +9328,18 @@ var __exports__ = (() => {
8517
9328
  const uncompressedFile = await compressionHandler(compressedFile);
8518
9329
  const response = new Response(uncompressedFile);
8519
9330
  Object.defineProperty(response, "url", {
8520
- value: `${this.fileName || ""}/${filename}`
9331
+ value: `${this.fileName || ""}/${filename2}`
8521
9332
  });
8522
9333
  return response;
8523
9334
  }
8524
- async getCDFileHeader(filename) {
9335
+ async getCDFileHeader(filename2) {
8525
9336
  if (!this.fileProvider) {
8526
9337
  throw new Error("No data detected in the zip archive");
8527
9338
  }
8528
9339
  const zipCDIterator = makeZipCDHeaderIterator(this.fileProvider);
8529
9340
  let result = null;
8530
9341
  for await (const cdHeader of zipCDIterator) {
8531
- if (cdHeader.fileName === filename) {
9342
+ if (cdHeader.fileName === filename2) {
8532
9343
  result = cdHeader;
8533
9344
  break;
8534
9345
  }