@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.
- package/dist/dist.dev.js +572 -23
- package/dist/hash-file-utility.d.ts +15 -2
- package/dist/hash-file-utility.d.ts.map +1 -1
- package/dist/hash-file-utility.js +14 -6
- package/dist/hash-file-utility.js.map +1 -1
- package/dist/index.cjs +260 -8
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/parse-zip/end-of-central-directory.d.ts +17 -1
- package/dist/parse-zip/end-of-central-directory.d.ts.map +1 -1
- package/dist/parse-zip/end-of-central-directory.js +121 -2
- package/dist/parse-zip/end-of-central-directory.js.map +1 -1
- package/dist/parse-zip/zip-composition.d.ts +38 -0
- package/dist/parse-zip/zip-composition.d.ts.map +1 -0
- package/dist/parse-zip/zip-composition.js +115 -0
- package/dist/parse-zip/zip-composition.js.map +1 -0
- package/dist/parse-zip/zip64-info-generation.js +2 -2
- package/dist/parse-zip/zip64-info-generation.js.map +1 -1
- package/dist/zip-loader.js +1 -1
- package/dist/zip-writer.js +1 -1
- package/package.json +5 -5
- package/src/hash-file-utility.ts +38 -7
- package/src/index.ts +1 -1
- package/src/parse-zip/end-of-central-directory.ts +241 -3
- package/src/parse-zip/zip-composition.ts +235 -0
- package/src/parse-zip/zip64-info-generation.ts +3 -3
- package/dist/parse-zip/zip-compozition.d.ts +0 -8
- package/dist/parse-zip/zip-compozition.d.ts.map +0 -1
- package/dist/parse-zip/zip-compozition.js +0 -43
- package/dist/parse-zip/zip-compozition.js.map +0 -1
- 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.
|
|
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.
|
|
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(
|
|
7260
|
-
this.tape.append(
|
|
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((
|
|
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
|
-
|
|
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((
|
|
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/
|
|
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(
|
|
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
|
|
8546
|
-
const arrayBuffer = textEncoder.encode(
|
|
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(
|
|
8553
|
-
const
|
|
8554
|
-
const
|
|
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(
|
|
8759
|
-
const cdFileHeader = await this.getCDFileHeader(
|
|
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(
|
|
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(
|
|
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 || ""}/${
|
|
9331
|
+
value: `${this.fileName || ""}/${filename2}`
|
|
8783
9332
|
});
|
|
8784
9333
|
return response;
|
|
8785
9334
|
}
|
|
8786
|
-
async getCDFileHeader(
|
|
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 ===
|
|
9342
|
+
if (cdHeader.fileName === filename2) {
|
|
8794
9343
|
result = cdHeader;
|
|
8795
9344
|
break;
|
|
8796
9345
|
}
|