/** * utils around working with DOM file lists * * @module */ export const fromArray = (files: File[]): FileList => { const dt = new DataTransfer(); for (const file of files) { dt.items.add(file); } return dt.files; }; export const reduce = ( fileList: FileList, reduceFn: (current: T, file: File, index: number) => T, seed: T, ): T => Array.from(fileList).reduce(reduceFn, seed); export const map = ( fileList: FileList, mapFn: (file: File, index: number) => File, ): FileList => reduce( fileList, (dt, file, i) => { dt.items.add(mapFn(file, i)); return dt; }, new DataTransfer(), ).files; export const remove = (fileList: FileList, index: number): FileList => reduce( fileList, (dt, file, i) => { if (i === index) { return dt; } dt.items.add(file); return dt; }, new DataTransfer(), ).files; export const update = ( fileList: FileList, index: number, updateFn: (file: File) => File, ): FileList => map(fileList, (file, i) => (i !== index ? file : updateFn(file))); export const rename = ( fileList: FileList, index: number, newName: string, ): FileList => update(fileList, index, (file) => new File([file.slice()], newName)); export const concat = (a: FileList, b: FileList): FileList => { const dt = new DataTransfer(); for (const aFile of a) { dt.items.add(aFile); } for (const bFile of b) { dt.items.add(bFile); } return dt.files; }; export const at = (fileList: FileList, index: number): File | undefined => Array.from(fileList).at(index);