All files parse.ts

100% Statements 24/24
100% Branches 22/22
100% Functions 3/3
100% Lines 23/23

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 967x                             7x       6x 6x 5x                                         7x 6x 1x   5x 3x 3x             2x 1x   1x                                   7x 9x 3x     6x 3x 3x             3x 2x   1x    
import { isNumber, isString } from './index';
 
/**
 * Parses date and if success returns Date object otherwise returns undefined
 * @description
 * If for example we want parse data new Date("asd") this will be invalid date and javascript will not return exception. So for every date parsing we need to do additional validity checks
 * @param data - Anything
 * @example
 * P.toFloat("1.378998") // = 1.378998
 * P.toFloat("test") // undefined
 * P.toFloat("test", 0) // 0
 * @category Number
 */
export function toDate(data: string | number | Date): Date | undefined;
export function toDate(data: string | number | Date, defaultValue: Date): Date;
export function toDate(
  data: string | number | Date,
  defaultValue?: Date
): Date | undefined {
  const parsed = new Date(data);
  if (isNaN(parsed.getTime())) return defaultValue;
  return parsed;
}
 
/**
 * Parses string to `floating` number
 * @description
 * This function litle bit different than parseFloat. First of all it can return undefined if float parsing is unsuccessful.
 * Regular parseFloat return `NaN` this is really misleading
 * @param data - Anything
 * @example
 * P.toFloat("1.378998") // = 1.378998
 * P.toFloat("test") // undefined
 * P.toFloat("test", 0) // 0
 * @category Number
 */
export function toFloat(data: unknown): number | undefined;
export function toFloat<T extends number>(
  data: unknown,
  defaultValue: T
): number;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export function toFloat(data: unknown, defaultValue?: number): any {
  if (isNumber(data)) {
    return data;
  }
  if (isString(data)) {
    const parsedString = parseFloat(data);
    return !isNaN(parsedString)
      ? parsedString
      : isNumber(defaultValue)
      ? defaultValue
      : undefined;
  }
 
  if (isNumber(defaultValue)) {
    return defaultValue;
  }
  return;
}
 
/**
 * Parses string to `int` number
 * @description
 * This function litle bit different than parseInt. First of all it can return undefined if int parsing is unsuccessful.
 * Regular parseInt cant return `NaN` and this is really misleading
 * @param data - Anything
 * @example
 * P.toInt("1.378998") // = 1
 * P.toInt("test") // undefined
 * P.toInt("test", 0) // 0
 * @category Number
 */
export function toInt(data: unknown): number | undefined;
export function toInt<T extends number>(data: unknown, defaultValue: T): number;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export function toInt(data: unknown, defaultValue?: number): any {
  if (isNumber(data)) {
    return parseInt(`${data}`, 10);
  }
 
  if (isString(data)) {
    const parsedString = parseInt(data, 10);
    return !isNaN(parsedString)
      ? parsedString
      : isNumber(defaultValue)
      ? defaultValue
      : undefined;
  }
 
  if (isNumber(defaultValue)) {
    return toInt(defaultValue);
  }
  return;
}