All files index.ts

100% Statements 11/11
88.88% Branches 8/9
100% Functions 4/4
100% Lines 9/9

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        11x 1x                             11x 11x 11x 1x 1x     10x 10x  
import fs from 'fs';
import path from 'path';
import fetch from 'node-fetch';
 
export const validUrl = (url: string) => /http(s)?:\/\/(\w+:?\w*@)?(\S+)(:\d+)?((?<=\.)\w+)+(\/([\w#!:.?+=&%@!\-/])*)?/gi.test(url);
export const extTypeMap = {
  '.png': 'image/png',
  '.apng': 'image/apng',
  '.gif': 'image/gif',
  '.jpg': 'image/jpeg',
  '.jpeg': 'image/jpeg',
  '.bm': 'image/bmp',
  '.bmp': 'image/bmp',
  '.webp': 'image/webp',
  '.ico': 'image/x-icon',
  '.svg': 'image/svg+xml'
}
 
export type ExtType =  keyof typeof extTypeMap;
export default function image2uri(file: string, options: { ext?: string } = {}): string | Promise<string> {
  const ext: ExtType = (options.ext || path.extname(file)) as ExtType;
  const contentType = extTypeMap[ext]
  if (validUrl(file)) {
    return fetch(file).then((response) => response.buffer()).then((buffer) => {
      return contentType ? `data:${contentType};base64,${buffer.toString('base64')}` : buffer.toString('base64');
    });
  }
  const image = fs.readFileSync(file);
  return contentType ? `data:${contentType};base64,${image.toString('base64')}` : image.toString('base64');
}