UNPKG

@loaders.gl/zip

Version:

Zip Archive Loader

81 lines 2.83 kB
// 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