All files / utils readFile.ts

87.88% Statements 29/33
100% Branches 0/0
82.35% Functions 14/17
87.88% Lines 29/33

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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105                                                                                              5x 2x 2x 2x 2x   2x     2x       5x 1x 1x 1x             5x 2x 2x 2x 2x   2x     2x       5x 1x 1x       5x 1x 1x 1x 1x   1x     1x       5x    
/**
 * 各种内容类型的读取器。
 *
 * @public
 */
export interface ReadFileReader {
  /**
   * 读取并返回文本内容。
   */
  text(): Promise<string>
 
  /**
   * 读取并返回 JSON 内容。
   */
  json<T>(): Promise<T>
 
  /**
   * 读取并返回 dataURL 内容。
   */
  dataUrl(): Promise<string>
 
  /**
   * 读取并返回 base64 内容。
   */
  base64(): Promise<string>
 
  /**
   * 读取并返回 ArrayBuffer 内容。
   */
  arrayBuffer(): Promise<ArrayBuffer>
}
 
/**
 * 读取给定文件的内容。
 *
 * @public
 * @param file 要读取的文件
 * @returns 返回各种内容类型的读取器
 * @example
 * ```typescript
 * const file = new File(['{"x":1}'], 'x.json')
 * const reader = readFile(file)
 * console.log(await reader.text()) // => '{"x":1}'
 * console.log(await reader.json()) // => {x: 1}
 * ```
 */
export function readFile(file: File): ReadFileReader {
  const text: ReadFileReader['text'] = () => {
    return new Promise((resolve, reject) => {
      const fileReader = new FileReader()
      fileReader.onload = () => {
        resolve(fileReader.result as string)
      }
      fileReader.onerror = () => {
        reject(fileReader.error)
      }
      fileReader.readAsText(file)
    })
  }
 
  const json: ReadFileReader['json'] = () => {
    return text().then(data => {
      try {
        return JSON.parse(data)
      } catch (err) {
        return Promise.reject(err)
      }
    })
  }
 
  const dataUrl: ReadFileReader['dataUrl'] = () => {
    return new Promise((resolve, reject) => {
      const fileReader = new FileReader()
      fileReader.onload = () => {
        resolve(fileReader.result as string)
      }
      fileReader.onerror = () => {
        reject(fileReader.error)
      }
      fileReader.readAsDataURL(file)
    })
  }
 
  const base64: ReadFileReader['base64'] = () => {
    return dataUrl().then(url => {
      return url.split(';base64,')[1]
    })
  }
 
  const arrayBuffer: ReadFileReader['arrayBuffer'] = () => {
    return new Promise((resolve, reject) => {
      const fileReader = new FileReader()
      fileReader.onload = () => {
        resolve(fileReader.result as ArrayBuffer)
      }
      fileReader.onerror = () => {
        reject(fileReader.error)
      }
      fileReader.readAsArrayBuffer(file)
    })
  }
 
  return { text, json, dataUrl, base64, arrayBuffer }
}