@loaders.gl/zip 4.1.0-alpha.10 → 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 (33) hide show
  1. package/dist/dist.dev.js +572 -23
  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 +14 -6
  5. package/dist/hash-file-utility.js.map +1 -1
  6. package/dist/index.cjs +260 -8
  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 +115 -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 +5 -5
  24. package/src/hash-file-utility.ts +38 -7
  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 +235 -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.10" : "latest";
6976
+ var VERSION = true ? "4.1.0-alpha.11" : "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.10" : "latest";
7021
+ var VERSION2 = true ? "4.1.0-alpha.11" : "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() {
@@ -7319,6 +7320,22 @@ var __exports__ = (() => {
7319
7320
  return concatenateArrayBuffers(...arrayBuffers);
7320
7321
  }
7321
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
+
7322
7339
  // ../loader-utils/src/lib/node/buffer.browser.ts
7323
7340
  function toArrayBuffer(buffer) {
7324
7341
  return buffer;
@@ -7354,7 +7371,150 @@ var __exports__ = (() => {
7354
7371
 
7355
7372
  // ../loader-utils/src/lib/node/promisify.ts
7356
7373
  function promisify1(fn) {
7357
- 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;
7358
7518
  }
7359
7519
 
7360
7520
  // ../loader-utils/src/lib/files/node-file-facade.ts
@@ -7391,6 +7551,40 @@ var __exports__ = (() => {
7391
7551
  }
7392
7552
  };
7393
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
+
7394
7588
  // ../loader-utils/src/lib/file-provider/file-provider.ts
7395
7589
  var isFileProvider = (fileProvider) => {
7396
7590
  return fileProvider?.getUint8 && fileProvider?.slice && fileProvider?.length;
@@ -7495,10 +7689,10 @@ var __exports__ = (() => {
7495
7689
  }
7496
7690
  var NUMBER_SETTERS = {
7497
7691
  2: (header, offset, value) => {
7498
- header.setUint16(offset, Number(value), true);
7692
+ header.setUint16(offset, Number(value > 65535 ? 65535 : value), true);
7499
7693
  },
7500
7694
  4: (header, offset, value) => {
7501
- header.setUint32(offset, Number(value), true);
7695
+ header.setUint32(offset, Number(value > 4294967295 ? 4294967295 : value), true);
7502
7696
  },
7503
7697
  8: (header, offset, value) => {
7504
7698
  header.setBigUint64(offset, BigInt(value), true);
@@ -7529,11 +7723,13 @@ var __exports__ = (() => {
7529
7723
  var CD_RECORDS_NUMBER_ON_DISC_OFFSET = 10n;
7530
7724
  var CD_CD_BYTE_SIZE_OFFSET = 12n;
7531
7725
  var CD_START_OFFSET_OFFSET = 16n;
7726
+ var CD_COMMENT_OFFSET = 22n;
7532
7727
  var ZIP64_EOCD_START_OFFSET_OFFSET = 8n;
7533
7728
  var ZIP64_CD_RECORDS_NUMBER_OFFSET = 24n;
7534
7729
  var ZIP64_CD_RECORDS_NUMBER_ON_DISC_OFFSET = 32n;
7535
7730
  var ZIP64_CD_CD_BYTE_SIZE_OFFSET = 40n;
7536
7731
  var ZIP64_CD_START_OFFSET_OFFSET = 48n;
7732
+ var ZIP64_COMMENT_OFFSET = 56n;
7537
7733
  var parseEoCDRecord = async (file) => {
7538
7734
  const zipEoCDOffset = await searchFromTheEnd(file, eoCDSignature);
7539
7735
  let cdRecordsNumber = BigInt(await file.getUint16(zipEoCDOffset + CD_RECORDS_NUMBER_OFFSET));
@@ -7562,7 +7758,7 @@ var __exports__ = (() => {
7562
7758
  }
7563
7759
  };
7564
7760
  };
7565
- async function updateEoCD(eocdBody, oldEoCDOffsets, newCDStartOffset, eocdStartOffset, newCDRecordsNumber) {
7761
+ function updateEoCD(eocdBody, oldEoCDOffsets, newCDStartOffset, eocdStartOffset, newCDRecordsNumber) {
7566
7762
  const eocd = new DataView(eocdBody);
7567
7763
  const classicEoCDOffset = oldEoCDOffsets.zip64EoCDOffset ? oldEoCDOffsets.zipEoCDOffset - oldEoCDOffsets.zip64EoCDOffset : 0n;
7568
7764
  if (Number(newCDRecordsNumber) <= 65535) {
@@ -7585,6 +7781,120 @@ var __exports__ = (() => {
7585
7781
  }
7586
7782
  return new Uint8Array(eocd.buffer);
7587
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
+ }];
7588
7898
 
7589
7899
  // src/parse-zip/cd-file-header.ts
7590
7900
  var CD_COMPRESSED_SIZE_OFFSET = 20n;
@@ -8477,13 +8787,175 @@ var __exports__ = (() => {
8477
8787
  this.options = options;
8478
8788
  }
8479
8789
  async hash(input, encoding) {
8480
- 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));
8481
8791
  const hex = await md5Promise;
8482
8792
  return encodeHex(hex, encoding);
8483
8793
  }
8484
8794
  };
8485
8795
 
8486
- // 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
8487
8959
  async function cutTheTailOff(provider) {
8488
8960
  const oldEoCDinfo = await parseEoCDRecord(provider);
8489
8961
  const oldCDStartOffset = oldEoCDinfo.cdStartOffset;
@@ -8519,7 +8991,73 @@ var __exports__ = (() => {
8519
8991
  const newCDStartOffset = provider.length;
8520
8992
  await provider.append(new Uint8Array(newCDBody));
8521
8993
  const eocdOffset = provider.length;
8522
- 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
+ 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);
8523
9061
  }
8524
9062
 
8525
9063
  // src/hash-file-utility.ts
@@ -8538,20 +9076,31 @@ var __exports__ = (() => {
8538
9076
  }
8539
9077
  async function makeHashTableFromZipHeaders(fileProvider) {
8540
9078
  const zipCDIterator = makeZipCDHeaderIterator(fileProvider);
9079
+ return getHashTable(zipCDIterator);
9080
+ }
9081
+ async function getHashTable(zipCDIterator) {
8541
9082
  const md5Hash = new MD5Hash();
8542
9083
  const textEncoder = new TextEncoder();
8543
9084
  const hashTable = {};
8544
9085
  for await (const cdHeader of zipCDIterator) {
8545
- const filename = cdHeader.fileName.split("\\").join("/").toLocaleLowerCase();
8546
- const arrayBuffer = textEncoder.encode(filename).buffer;
9086
+ const filename2 = cdHeader.fileName.split("\\").join("/").toLocaleLowerCase();
9087
+ const arrayBuffer = textEncoder.encode(filename2).buffer;
8547
9088
  const md5 = await md5Hash.hash(arrayBuffer, "hex");
8548
9089
  hashTable[md5] = cdHeader.localHeaderOffset;
8549
9090
  }
8550
9091
  return hashTable;
8551
9092
  }
8552
- async function composeHashFile(fileProvider) {
8553
- const hashArray = await makeHashTableFromZipHeaders(fileProvider);
8554
- const bufferArray = Object.entries(hashArray).map(([key, value]) => concatenateArrayBuffers(hexStringToBuffer(key), bigintToBuffer(value))).sort(compareHashes);
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);
8555
9104
  return concatenateArrayBuffersFromArray(bufferArray);
8556
9105
  }
8557
9106
  function compareHashes(arrA, arrB) {
@@ -8755,18 +9304,18 @@ var __exports__ = (() => {
8755
9304
  }
8756
9305
  return fileNames;
8757
9306
  }
8758
- async stat(filename) {
8759
- const cdFileHeader = await this.getCDFileHeader(filename);
9307
+ async stat(filename2) {
9308
+ const cdFileHeader = await this.getCDFileHeader(filename2);
8760
9309
  return {
8761
9310
  ...cdFileHeader,
8762
9311
  size: Number(cdFileHeader.uncompressedSize)
8763
9312
  };
8764
9313
  }
8765
- async fetch(filename) {
9314
+ async fetch(filename2) {
8766
9315
  if (!this.fileProvider) {
8767
9316
  throw new Error("No data detected in the zip archive");
8768
9317
  }
8769
- const cdFileHeader = await this.getCDFileHeader(filename);
9318
+ const cdFileHeader = await this.getCDFileHeader(filename2);
8770
9319
  const localFileHeader = await parseZipLocalFileHeader(cdFileHeader.localHeaderOffset, this.fileProvider);
8771
9320
  if (!localFileHeader) {
8772
9321
  throw new Error("Local file header has not been found in the zip archive`");
@@ -8779,18 +9328,18 @@ var __exports__ = (() => {
8779
9328
  const uncompressedFile = await compressionHandler(compressedFile);
8780
9329
  const response = new Response(uncompressedFile);
8781
9330
  Object.defineProperty(response, "url", {
8782
- value: `${this.fileName || ""}/${filename}`
9331
+ value: `${this.fileName || ""}/${filename2}`
8783
9332
  });
8784
9333
  return response;
8785
9334
  }
8786
- async getCDFileHeader(filename) {
9335
+ async getCDFileHeader(filename2) {
8787
9336
  if (!this.fileProvider) {
8788
9337
  throw new Error("No data detected in the zip archive");
8789
9338
  }
8790
9339
  const zipCDIterator = makeZipCDHeaderIterator(this.fileProvider);
8791
9340
  let result = null;
8792
9341
  for await (const cdHeader of zipCDIterator) {
8793
- if (cdHeader.fileName === filename) {
9342
+ if (cdHeader.fileName === filename2) {
8794
9343
  result = cdHeader;
8795
9344
  break;
8796
9345
  }