import type { ZipWriterAddDataOptions } from '@zip.js/zip.js'; import { Uint8ArrayWriter, ZipWriter } from '@zip.js/zip.js'; import type { ExtendedSourceItem } from '../ExtendedSourceItem.js'; import type { FileCollection } from '../FileCollection.js'; import { sourceToZipPath } from '../transformation/source_zip.js'; import { shouldAvoidCompression } from '../utilities/should_avoid_compression.ts'; /** * This method will zip a file collection and return the zip as an ArrayBuffer * @param collection - The file collection to zip * @param finalPaths - toZip will fill this map with the final paths of the sources * @returns Zip as an Uint8Array */ export async function toZip( collection: FileCollection, finalPaths?: Map, ): Promise> { const zipWriter = new ZipWriter>( new Uint8ArrayWriter(), ); for (const source of collection.sources) { const path = sourceToZipPath(source); finalPaths?.set(source, path); const addOptions: ZipWriterAddDataOptions | undefined = shouldAvoidCompression(source) ? { compressionMethod: 0 } : undefined; // eslint-disable-next-line no-await-in-loop await zipWriter.add(path, source.stream(), addOptions); } return await zipWriter.close(); }