@loaders.gl/zip 4.1.0-alpha.9 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dist.dev.js +575 -24
- 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 +16 -8
- package/dist/hash-file-utility.js.map +1 -1
- package/dist/index.cjs +260 -9
- 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 +114 -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-loader.js.map +1 -1
- package/dist/zip-writer.js +1 -1
- package/dist/zip-writer.js.map +1 -1
- package/package.json +7 -7
- package/src/hash-file-utility.ts +44 -9
- package/src/index.ts +1 -1
- package/src/parse-zip/end-of-central-directory.ts +241 -3
- package/src/parse-zip/zip-composition.ts +234 -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
|
|
6976
|
+
var VERSION = true ? "4.1.0" : "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
|
|
7021
|
+
var VERSION2 = true ? "4.1.0" : "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() {
|
|
@@ -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((
|
|
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
|
-
|
|
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((
|
|
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/
|
|
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(
|
|
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
|
|
8543
|
-
const arrayBuffer = textEncoder.encode(
|
|
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(
|
|
8550
|
-
const
|
|
8551
|
-
const
|
|
8552
|
-
|
|
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(
|
|
8756
|
-
const cdFileHeader = await this.getCDFileHeader(
|
|
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(
|
|
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(
|
|
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 || ""}/${
|
|
9330
|
+
value: `${this.fileName || ""}/${filename2}`
|
|
8780
9331
|
});
|
|
8781
9332
|
return response;
|
|
8782
9333
|
}
|
|
8783
|
-
async getCDFileHeader(
|
|
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 ===
|
|
9341
|
+
if (cdHeader.fileName === filename2) {
|
|
8791
9342
|
result = cdHeader;
|
|
8792
9343
|
break;
|
|
8793
9344
|
}
|