@loaders.gl/zip
Version:
Zip Archive Loader
81 lines • 2.83 kB
JavaScript
// loaders.gl
// SPDX-License-Identifier: MIT
// Copyright (c) vis.gl contributors
import JSZip from 'jszip';
// @ts-ignore TS2304: Cannot find name '__VERSION__'.
const VERSION = typeof "4.4.3" !== 'undefined' ? "4.4.3" : 'latest';
/**
* Zip exporter
*/
export const ZipWriter = {
name: 'Zip Archive',
id: 'zip',
module: 'zip',
version: VERSION,
extensions: ['zip'],
category: 'archive',
mimeTypes: ['application/zip'],
options: {
zip: {
onUpdate: () => { },
createFolders: false
},
jszip: {}
},
encode: encodeZipAsync
};
async function encodeZipAsync(fileMap, options = {}) {
const jsZip = new JSZip();
const directoryEntries = new Set();
const zipOptions = { ...ZipWriter.options.zip, ...options?.zip };
const jszipOptions = { ...ZipWriter.options?.jszip, ...options.jszip };
const jszipFileOptions = {
createFolders: false,
...jszipOptions
};
// add files to the zip
for (const subFileName in fileMap) {
const subFileData = fileMap[subFileName];
const isDirectoryEntry = subFileName.endsWith('/');
if (isDirectoryEntry || zipOptions.createFolders) {
addParentDirectoryEntries(jsZip, subFileName, options, directoryEntries);
}
// jszip supports both arraybuffer and string data (the main loaders.gl types)
// https://stuk.github.io/jszip/documentation/api_zipobject/async.html
if (isDirectoryEntry) {
jsZip.file(subFileName, null, { ...jszipFileOptions, dir: true });
}
else {
jsZip.file(subFileName, subFileData, jszipFileOptions);
}
}
const jszipGeneratorOptions = jszipOptions;
try {
return await jsZip.generateAsync({ ...jszipGeneratorOptions, type: 'arraybuffer' }, // generate an arraybuffer
zipOptions.onUpdate);
}
catch (error) {
options.core?.log?.error(`Unable to encode zip archive: ${error}`);
throw error;
}
}
function addParentDirectoryEntries(jsZip, subFileName, options, directoryEntries) {
const subPathParts = subFileName.split('/').filter((part) => part.length > 0);
const subPathPartCount = subFileName.endsWith('/')
? subPathParts.length
: subPathParts.length - 1;
let parentDirectoryPath = '';
for (let index = 0; index < subPathPartCount; index++) {
parentDirectoryPath = `${parentDirectoryPath}${subPathParts[index]}/`;
if (directoryEntries.has(parentDirectoryPath)) {
continue;
}
jsZip.file(parentDirectoryPath, null, {
createFolders: false,
...options?.jszip,
dir: true
});
directoryEntries.add(parentDirectoryPath);
}
}
//# sourceMappingURL=zip-writer.js.map