All files errors.ts

100% Statements 28/28
91.67% Branches 11/12
100% Functions 6/6
100% Lines 26/26

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 807x   7x 6x 6x 6x   7x                   7x 2x 1x   1x                       7x 2x 1x     1x                                       7x     19x 19x 15x 13x 10x 9x   1x     2x   4x 3x   1x      
import { isError } from './index';
 
export class UnknownError extends Error {
  readonly name = 'UnknownError';
  constructor(public data: unknown) {
    super(JSON.stringify(data));
  }
}
 
/**
 * Assertion statement
 * @throws Throws if data is instance of error
 * @export
 *  const request = () =>  P.canFail(()=> axios.get(url))
 *  const result = await request.then(P.assertError)
 * @category Utility
 */
export function assertError<T>(data: T | Error): T {
  if (isError(data)) {
    throw data;
  }
  return data as T;
}
 
/**
 * Ensures that err is Error instance
 * @signature
 *    P.ensureError(any)
 * @example
 *    const request = doRequest().catch(P.ensureError)
 *    if (P.isError(request)) return
 * @category Utility
 */
export function ensureError(err: unknown): Error {
  if (isError(err)) {
    return err;
  }
 
  return new UnknownError(err);
}
 
export type CanGetError<T> = Error | T;
/**
 * Similar to try catch statement. If function throws insisted callback this function will return `Error` instance
 * @example
 *    const err = P.canFail(()=> JSON.parse(data))
 *    if (P.isError(err)) {
 *        console.log(err)
 *    }
 *
 *
 *    const request = await canFail(() => axios.get(url))
 *    if (P.isError(request)) return
 * @category Utility
 */
export function canFail<T>(fn: () => Promise<T>): Promise<CanGetError<T>>;
export function canFail<T>(fn: () => T): CanGetError<T>;
// tslint:disable-next-line: promise-function-async
export function canFail<T>(
  fn: (() => T) | (() => Promise<T>)
): CanGetError<T> | Promise<CanGetError<T>> {
  try {
    const r = fn();
    if (r instanceof Promise) {
      return r.catch(err => {
        if (isError(err)) {
          return err;
        }
        return new UnknownError(err);
      });
    }
    return r;
  } catch (err) {
    if (isError(err)) {
      return err;
    }
    return new UnknownError(err);
  }
}