All files / src/functions fileReader.ts

100% Statements 24/24
71.42% Branches 5/7
100% Functions 8/8
100% Lines 24/24

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64            3x 3x 3x                   5x 2x 2x 3x 3x 3x 3x 3x 3x 5x 5x 5x   3x 2x                       5x 5x 5x                   2x 2x 2x 2x        
export type OnFileCallback = (file: File, path: string) => Promise<void>;
 
export async function traverseDirectoryTreeWrapper(
  fileList: DataTransferItemList,
  onFileCallback: OnFileCallback,
) {
  for (const dtItem of fileList) {
    Eif (dtItem) {
      await traverseDirectoryTree(dtItem.webkitGetAsEntry(), onFileCallback);
    }
  }
}
 
async function traverseDirectoryTree(
  item: FileSystemEntry | null,
  onFileCallback: OnFileCallback,
  path: string = '',
) {
  if (item?.isFile) {
    const fileItem = item as FileSystemFileEntry;
    await getFileEntriesFromReader(fileItem, onFileCallback, path);
  E} else if (item?.isDirectory) {
    const directoryItem = item as FileSystemDirectoryEntry;
    const directoryReader = directoryItem.createReader();
    let entries: Array<FileSystemEntry> = [];
    let lastAdditions = 0;
    do {
      const entrySet = await getDirectoryEntriesFromReader(directoryReader);
      lastAdditions = entrySet.length;
      entries = entries.concat(entrySet);
    } while (lastAdditions > 0);
    for (const element of entries) {
      await traverseDirectoryTree(
        element,
        onFileCallback,
        path + directoryItem.name + '/',
      );
    }
  }
}
 
async function getDirectoryEntriesFromReader(
  directoryReader: FileSystemDirectoryReader,
): Promise<Array<FileSystemEntry>> {
  return await new Promise((resolve, reject) => {
    directoryReader.readEntries((entries: Array<FileSystemEntry>) => {
      resolve(entries);
    }, reject);
  });
}
 
async function getFileEntriesFromReader(
  item: FileSystemFileEntry,
  onFileCallback: OnFileCallback,
  path: string,
) {
  return await new Promise<void>((resolve, _reject) => {
    item.file(async (file: File) => {
      await onFileCallback(file, path);
      resolve();
    });
  });
}