@loaders.gl/zip 4.1.0-alpha.9 → 4.2.0-alpha.1

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 (33) hide show
  1. package/dist/dist.dev.js +575 -24
  2. package/dist/hash-file-utility.d.ts +15 -2
  3. package/dist/hash-file-utility.d.ts.map +1 -1
  4. package/dist/hash-file-utility.js +16 -8
  5. package/dist/hash-file-utility.js.map +1 -1
  6. package/dist/index.cjs +260 -9
  7. package/dist/index.d.ts +1 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +1 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/parse-zip/end-of-central-directory.d.ts +17 -1
  12. package/dist/parse-zip/end-of-central-directory.d.ts.map +1 -1
  13. package/dist/parse-zip/end-of-central-directory.js +121 -2
  14. package/dist/parse-zip/end-of-central-directory.js.map +1 -1
  15. package/dist/parse-zip/zip-composition.d.ts +38 -0
  16. package/dist/parse-zip/zip-composition.d.ts.map +1 -0
  17. package/dist/parse-zip/zip-composition.js +114 -0
  18. package/dist/parse-zip/zip-composition.js.map +1 -0
  19. package/dist/parse-zip/zip64-info-generation.js +2 -2
  20. package/dist/parse-zip/zip64-info-generation.js.map +1 -1
  21. package/dist/zip-loader.js +1 -1
  22. package/dist/zip-writer.js +1 -1
  23. package/package.json +7 -7
  24. package/src/hash-file-utility.ts +44 -9
  25. package/src/index.ts +1 -1
  26. package/src/parse-zip/end-of-central-directory.ts +241 -3
  27. package/src/parse-zip/zip-composition.ts +234 -0
  28. package/src/parse-zip/zip64-info-generation.ts +3 -3
  29. package/dist/parse-zip/zip-compozition.d.ts +0 -8
  30. package/dist/parse-zip/zip-compozition.d.ts.map +0 -1
  31. package/dist/parse-zip/zip-compozition.js +0 -43
  32. package/dist/parse-zip/zip-compozition.js.map +0 -1
  33. package/src/parse-zip/zip-compozition.ts +0 -113
package/dist/dist.dev.js CHANGED
@@ -6958,6 +6958,7 @@ var __exports__ = (() => {
6958
6958
  ZipWriter: () => ZipWriter,
6959
6959
  addOneFile: () => addOneFile,
6960
6960
  composeHashFile: () => composeHashFile,
6961
+ createZip: () => createZip,
6961
6962
  generateCDHeader: () => generateCDHeader,
6962
6963
  generateLocalHeader: () => generateLocalHeader,
6963
6964
  localHeaderSignature: () => signature3,
@@ -6972,7 +6973,7 @@ var __exports__ = (() => {
6972
6973
 
6973
6974
  // src/zip-loader.ts
6974
6975
  var import_jszip = __toESM(require_jszip_min(), 1);
6975
- var VERSION = true ? "4.1.0-alpha.9" : "latest";
6976
+ var VERSION = true ? "4.2.0-alpha.1" : "latest";
6976
6977
  var ZipLoader = {
6977
6978
  id: "zip",
6978
6979
  module: "zip",
@@ -7017,7 +7018,7 @@ var __exports__ = (() => {
7017
7018
 
7018
7019
  // src/zip-writer.ts
7019
7020
  var import_jszip2 = __toESM(require_jszip_min(), 1);
7020
- var VERSION2 = true ? "4.1.0-alpha.9" : "latest";
7021
+ var VERSION2 = true ? "4.2.0-alpha.1" : "latest";
7021
7022
  var ZipWriter = {
7022
7023
  name: "Zip Archive",
7023
7024
  id: "zip",
@@ -7256,8 +7257,8 @@ var __exports__ = (() => {
7256
7257
  };
7257
7258
  this.tape = new tar_default(this.options.recordsPerBlock);
7258
7259
  }
7259
- addFile(filename, buffer) {
7260
- this.tape.append(filename, new Uint8Array(buffer));
7260
+ addFile(filename2, buffer) {
7261
+ this.tape.append(filename2, new Uint8Array(buffer));
7261
7262
  this.count++;
7262
7263
  }
7263
7264
  async build() {
@@ -7296,6 +7297,9 @@ var __exports__ = (() => {
7296
7297
  return true;
7297
7298
  }
7298
7299
  function concatenateArrayBuffers(...sources) {
7300
+ return concatenateArrayBuffersFromArray(sources);
7301
+ }
7302
+ function concatenateArrayBuffersFromArray(sources) {
7299
7303
  const sourceArrays = sources.map((source2) => source2 instanceof ArrayBuffer ? new Uint8Array(source2) : source2);
7300
7304
  const byteLength = sourceArrays.reduce((length, typedArray) => length + typedArray.byteLength, 0);
7301
7305
  const result = new Uint8Array(byteLength);
@@ -7316,6 +7320,22 @@ var __exports__ = (() => {
7316
7320
  return concatenateArrayBuffers(...arrayBuffers);
7317
7321
  }
7318
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
+
7319
7339
  // ../loader-utils/src/lib/node/buffer.browser.ts
7320
7340
  function toArrayBuffer(buffer) {
7321
7341
  return buffer;
@@ -7351,7 +7371,150 @@ var __exports__ = (() => {
7351
7371
 
7352
7372
  // ../loader-utils/src/lib/node/promisify.ts
7353
7373
  function promisify1(fn) {
7354
- 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;
7355
7518
  }
7356
7519
 
7357
7520
  // ../loader-utils/src/lib/files/node-file-facade.ts
@@ -7388,6 +7551,40 @@ var __exports__ = (() => {
7388
7551
  }
7389
7552
  };
7390
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
+
7391
7588
  // ../loader-utils/src/lib/file-provider/file-provider.ts
7392
7589
  var isFileProvider = (fileProvider) => {
7393
7590
  return fileProvider?.getUint8 && fileProvider?.slice && fileProvider?.length;
@@ -7492,10 +7689,10 @@ var __exports__ = (() => {
7492
7689
  }
7493
7690
  var NUMBER_SETTERS = {
7494
7691
  2: (header, offset, value) => {
7495
- header.setUint16(offset, Number(value), true);
7692
+ header.setUint16(offset, Number(value > 65535 ? 65535 : value), true);
7496
7693
  },
7497
7694
  4: (header, offset, value) => {
7498
- header.setUint32(offset, Number(value), true);
7695
+ header.setUint32(offset, Number(value > 4294967295 ? 4294967295 : value), true);
7499
7696
  },
7500
7697
  8: (header, offset, value) => {
7501
7698
  header.setBigUint64(offset, BigInt(value), true);
@@ -7526,11 +7723,13 @@ var __exports__ = (() => {
7526
7723
  var CD_RECORDS_NUMBER_ON_DISC_OFFSET = 10n;
7527
7724
  var CD_CD_BYTE_SIZE_OFFSET = 12n;
7528
7725
  var CD_START_OFFSET_OFFSET = 16n;
7726
+ var CD_COMMENT_OFFSET = 22n;
7529
7727
  var ZIP64_EOCD_START_OFFSET_OFFSET = 8n;
7530
7728
  var ZIP64_CD_RECORDS_NUMBER_OFFSET = 24n;
7531
7729
  var ZIP64_CD_RECORDS_NUMBER_ON_DISC_OFFSET = 32n;
7532
7730
  var ZIP64_CD_CD_BYTE_SIZE_OFFSET = 40n;
7533
7731
  var ZIP64_CD_START_OFFSET_OFFSET = 48n;
7732
+ var ZIP64_COMMENT_OFFSET = 56n;
7534
7733
  var parseEoCDRecord = async (file) => {
7535
7734
  const zipEoCDOffset = await searchFromTheEnd(file, eoCDSignature);
7536
7735
  let cdRecordsNumber = BigInt(await file.getUint16(zipEoCDOffset + CD_RECORDS_NUMBER_OFFSET));
@@ -7559,7 +7758,7 @@ var __exports__ = (() => {
7559
7758
  }
7560
7759
  };
7561
7760
  };
7562
- async function updateEoCD(eocdBody, oldEoCDOffsets, newCDStartOffset, eocdStartOffset, newCDRecordsNumber) {
7761
+ function updateEoCD(eocdBody, oldEoCDOffsets, newCDStartOffset, eocdStartOffset, newCDRecordsNumber) {
7563
7762
  const eocd = new DataView(eocdBody);
7564
7763
  const classicEoCDOffset = oldEoCDOffsets.zip64EoCDOffset ? oldEoCDOffsets.zipEoCDOffset - oldEoCDOffsets.zip64EoCDOffset : 0n;
7565
7764
  if (Number(newCDRecordsNumber) <= 65535) {
@@ -7582,6 +7781,120 @@ var __exports__ = (() => {
7582
7781
  }
7583
7782
  return new Uint8Array(eocd.buffer);
7584
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
+ }];
7585
7898
 
7586
7899
  // src/parse-zip/cd-file-header.ts
7587
7900
  var CD_COMPRESSED_SIZE_OFFSET = 20n;
@@ -8474,13 +8787,175 @@ var __exports__ = (() => {
8474
8787
  this.options = options;
8475
8788
  }
8476
8789
  async hash(input, encoding) {
8477
- 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));
8478
8791
  const hex = await md5Promise;
8479
8792
  return encodeHex(hex, encoding);
8480
8793
  }
8481
8794
  };
8482
8795
 
8483
- // src/parse-zip/zip-compozition.ts
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
8484
8959
  async function cutTheTailOff(provider) {
8485
8960
  const oldEoCDinfo = await parseEoCDRecord(provider);
8486
8961
  const oldCDStartOffset = oldEoCDinfo.cdStartOffset;
@@ -8516,7 +8991,72 @@ var __exports__ = (() => {
8516
8991
  const newCDStartOffset = provider.length;
8517
8992
  await provider.append(new Uint8Array(newCDBody));
8518
8993
  const eocdOffset = provider.length;
8519
- await provider.append(await updateEoCD(eocdBody, oldEoCDinfo.offsets, newCDStartOffset, eocdOffset, oldEoCDinfo.cdRecordsNumber + 1n));
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
+ await addFile(additionaldata, resFile, cdArray);
9007
+ }
9008
+ const cdOffset = (await resFile.stat()).bigsize;
9009
+ const cd = concatenateArrayBuffers(...cdArray);
9010
+ await resFile.append(new Uint8Array(cd));
9011
+ const eoCDStart = (await resFile.stat()).bigsize;
9012
+ await resFile.append(new Uint8Array(generateEoCD({
9013
+ recordsNumber: cdArray.length,
9014
+ cdSize: cd.byteLength,
9015
+ cdOffset,
9016
+ eoCDStart
9017
+ })));
9018
+ }
9019
+ async function addFile(file, resFile, cdArray, fileList) {
9020
+ const size = (await resFile.stat()).bigsize;
9021
+ fileList?.push({
9022
+ fileName: file.path,
9023
+ localHeaderOffset: size
9024
+ });
9025
+ const [localPart, cdHeaderPart] = await generateFileHeaders(file.path, file.file, size);
9026
+ await resFile.append(localPart);
9027
+ cdArray.push(cdHeaderPart);
9028
+ }
9029
+ function getFileIterator(inputPath) {
9030
+ async function* iterable() {
9031
+ const fileList = await getAllFiles(inputPath);
9032
+ for (const filePath of fileList) {
9033
+ const file = await (await fetchFile(path_exports.join(inputPath, filePath))).arrayBuffer();
9034
+ yield {
9035
+ path: filePath,
9036
+ file
9037
+ };
9038
+ }
9039
+ }
9040
+ return iterable();
9041
+ }
9042
+ async function getAllFiles(basePath, subfolder = "", fsPassed) {
9043
+ const fs = fsPassed ? fsPassed : new NodeFileSystemFacade({});
9044
+ const files = await fs.readdir(pathJoin(basePath, subfolder));
9045
+ const arrayOfFiles = [];
9046
+ for (const file of files) {
9047
+ const fullPath = pathJoin(basePath, subfolder, file);
9048
+ if ((await fs.stat(fullPath)).isDirectory) {
9049
+ const files2 = await getAllFiles(basePath, pathJoin(subfolder, file));
9050
+ arrayOfFiles.push(...files2);
9051
+ } else {
9052
+ arrayOfFiles.push(pathJoin(subfolder, file));
9053
+ }
9054
+ }
9055
+ return arrayOfFiles;
9056
+ }
9057
+ function pathJoin(...paths) {
9058
+ const resPaths = paths.filter((val) => val.length);
9059
+ return path_exports.join(...resPaths);
8520
9060
  }
8521
9061
 
8522
9062
  // src/hash-file-utility.ts
@@ -8535,21 +9075,32 @@ var __exports__ = (() => {
8535
9075
  }
8536
9076
  async function makeHashTableFromZipHeaders(fileProvider) {
8537
9077
  const zipCDIterator = makeZipCDHeaderIterator(fileProvider);
9078
+ return getHashTable(zipCDIterator);
9079
+ }
9080
+ async function getHashTable(zipCDIterator) {
8538
9081
  const md5Hash = new MD5Hash();
8539
9082
  const textEncoder = new TextEncoder();
8540
9083
  const hashTable = {};
8541
9084
  for await (const cdHeader of zipCDIterator) {
8542
- const filename = cdHeader.fileName.split("\\").join("/").toLocaleLowerCase();
8543
- const arrayBuffer = textEncoder.encode(filename).buffer;
9085
+ const filename2 = cdHeader.fileName.split("\\").join("/").toLocaleLowerCase();
9086
+ const arrayBuffer = textEncoder.encode(filename2).buffer;
8544
9087
  const md5 = await md5Hash.hash(arrayBuffer, "hex");
8545
9088
  hashTable[md5] = cdHeader.localHeaderOffset;
8546
9089
  }
8547
9090
  return hashTable;
8548
9091
  }
8549
- async function composeHashFile(fileProvider) {
8550
- const hashArray = await makeHashTableFromZipHeaders(fileProvider);
8551
- const bufferArray = Object.entries(hashArray).map(([key, value]) => concatenateArrayBuffers(hexStringToBuffer(key), bigintToBuffer(value))).sort(compareHashes);
8552
- return concatenateArrayBuffers(...bufferArray);
9092
+ async function composeHashFile(zipCDIterator) {
9093
+ const md5Hash = new MD5Hash();
9094
+ const textEncoder = new TextEncoder();
9095
+ const hashArray = [];
9096
+ for await (const cdHeader of zipCDIterator) {
9097
+ const filename2 = cdHeader.fileName.split("\\").join("/").toLocaleLowerCase();
9098
+ const arrayBuffer = textEncoder.encode(filename2).buffer;
9099
+ const md5 = await md5Hash.hash(arrayBuffer, "hex");
9100
+ hashArray.push(concatenateArrayBuffers(hexStringToBuffer(md5), bigintToBuffer(cdHeader.localHeaderOffset)));
9101
+ }
9102
+ const bufferArray = hashArray.sort(compareHashes);
9103
+ return concatenateArrayBuffersFromArray(bufferArray);
8553
9104
  }
8554
9105
  function compareHashes(arrA, arrB) {
8555
9106
  const a = new BigUint64Array(arrA);
@@ -8752,18 +9303,18 @@ var __exports__ = (() => {
8752
9303
  }
8753
9304
  return fileNames;
8754
9305
  }
8755
- async stat(filename) {
8756
- const cdFileHeader = await this.getCDFileHeader(filename);
9306
+ async stat(filename2) {
9307
+ const cdFileHeader = await this.getCDFileHeader(filename2);
8757
9308
  return {
8758
9309
  ...cdFileHeader,
8759
9310
  size: Number(cdFileHeader.uncompressedSize)
8760
9311
  };
8761
9312
  }
8762
- async fetch(filename) {
9313
+ async fetch(filename2) {
8763
9314
  if (!this.fileProvider) {
8764
9315
  throw new Error("No data detected in the zip archive");
8765
9316
  }
8766
- const cdFileHeader = await this.getCDFileHeader(filename);
9317
+ const cdFileHeader = await this.getCDFileHeader(filename2);
8767
9318
  const localFileHeader = await parseZipLocalFileHeader(cdFileHeader.localHeaderOffset, this.fileProvider);
8768
9319
  if (!localFileHeader) {
8769
9320
  throw new Error("Local file header has not been found in the zip archive`");
@@ -8776,18 +9327,18 @@ var __exports__ = (() => {
8776
9327
  const uncompressedFile = await compressionHandler(compressedFile);
8777
9328
  const response = new Response(uncompressedFile);
8778
9329
  Object.defineProperty(response, "url", {
8779
- value: `${this.fileName || ""}/${filename}`
9330
+ value: `${this.fileName || ""}/${filename2}`
8780
9331
  });
8781
9332
  return response;
8782
9333
  }
8783
- async getCDFileHeader(filename) {
9334
+ async getCDFileHeader(filename2) {
8784
9335
  if (!this.fileProvider) {
8785
9336
  throw new Error("No data detected in the zip archive");
8786
9337
  }
8787
9338
  const zipCDIterator = makeZipCDHeaderIterator(this.fileProvider);
8788
9339
  let result = null;
8789
9340
  for await (const cdHeader of zipCDIterator) {
8790
- if (cdHeader.fileName === filename) {
9341
+ if (cdHeader.fileName === filename2) {
8791
9342
  result = cdHeader;
8792
9343
  break;
8793
9344
  }