Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
composition / src / get.ts
Size: Mime:
// import toStringy from 'lodash/toString'
import toStringy from './toStringy'
import { curry, flatten, get } from 'chain-able-boost'
import {
  isSafe,
  isArray,
  isObj,
  toNumber,
  isNumber,
} from 'exotic'

const toFloat = x => parseFloat(x, 10)

/**
 * @param {*} obj
 * @param {String | Array<String>} path
 * @param {Array} [fallback=[]]
 * @return {Array}
 */
const getArray = (obj, path, fallback = []) => {
  const value = get(obj, path, fallback)
  if (isArray(value) === false) {
    return fallback
  } else {
    return value
  }
}
/**
 * @param {*} obj
 * @param {String | Array<String>} path
 * @param {Array} [fallback={}]
 * @return {Object}
 */
const getObj = (obj, path, fallback = {}) => {
  const result = get(obj, path, fallback)
  // because for example on gql, the path is there, but it's null
  // and lodash.get works by checking if it .hasOwnProperty
  // not by checking value
  // @todo why is this not working!
  if (isObj(result) === false || result === null) {
    return fallback
  } else {
    return result
  }
}

const getDefault = fallback => (obj, path) => get(obj, path, fallback)
/**
 * @param {*} obj
 * @param {String | Array<String>} path
 * @param {Array} [fallback={}]
 * @return {Object}
 */
const getFloat = (obj, path) => toFloat(get(obj, path, 0))
const getNumber = (obj, path) => {
  const result = get(obj, path, 0)
  if (isNumber(result) === false) {
    return toNumber(result)
  } else {
    return result
  }
}

/**
 * @param {*} obj
 * @param {String | Array<String>} path
 * @param {String} [fallback='']
 * @return {String}
 */
const getString = getDefault('')
/**
 * @param {*} obj
 * @param {String | Array<String>} path
 * @param {Boolean} [fallback=true]
 * @return {Boolean}
 */
const getTrue = getDefault(true)
/**
 * @param {*} obj
 * @param {String | Array<String>} path
 * @param {Boolean} [fallback=false]
 * @return {Boolean}
 */
const getFalse = getDefault(false)
const curriedGet = curry(get)

// @todo types
const getArrayFor = array => path => getArray(array, path)
const getObjFor = obj => path => getObj(obj, path)
const getFloatFor = any => path => getFloat(any, path)
const getStringFor = any => path => toStringy(getString(any, path))
const getNumberFor = any => path => toNumber(getNumber(any, path))

// fromIshToBoolean
const convertStringToBoolean = string => {
  switch (string) {
    case 'true':
      return true
      break
    case 'false':
      return false
    default:
      return false
      break
  }
}
const getBooleanFor = any => path => convertStringToBoolean(getFalse(any, path))

/**
 * @see http://bit.ly/babel-arguments-spread-nested
 *
 * @param {Array | Object | *} obj
 *
 * @param {Array<String>} paths
 *
 * @param {*} [fallback=undefined]
 *
 * @return {*} fallback | *
 *
 * @example
 *    const response = {eh: 1, canada: 2, moose: 3}
 *    const oneOf = getOneOf(response)
 *
 *    oneOf(['eh', 'canada'])
 *    //=> 1
 *
 *    oneOf('canada')
 *    //=> 1
 *
 *    oneOf('moose', 'canada')
 *    //=> 1
 */
const getOneOf = obj => (...paths) => {
  // @todo exotic has a check for this
  if (isArray(paths[0])) {
    paths = flatten(paths)
  }

  for (let index = 0; index < paths.length; index++) {
    // current path
    const path = paths[index]
    // fallback
    const value = get(obj, path)
    if (isSafe(value)) {
      return value
    }
  }

  return ''
  // isSafe(fallback)
  //   ? fallback
  //   : ''
}

const getOneOfFor = (...paths) => obj => getOneOf(obj)(...paths)

const getTyped = response => {
  const array = getArrayFor(response)
  const obj = getObjFor(response)
  const float = getFloatFor(response)
  const number = getNumberFor(response)
  const boolean = getBooleanFor(response)
  const string = getStringFor(response)
  const _get = (path, fallback) => get(response, path, fallback)
  const oneOf = getOneOfFor(response)

  return {
    oneOf,
    array,
    obj,
    float,
    boolean,
    string,
    number,
    any: _get,
    get: _get,
  }
}

// @deprecated
// compatible export
const getStartDate = item =>
  new Date(toFloat(get(item, 'properties.state.starttime', 0)))

export {
  getStartDate,
  //
  getOneOf,
  getTyped,
  getArrayFor,
  getObjFor,
  getFloatFor,
  getBooleanFor,
  getStringFor,
  getOneOfFor,
  //
  getArray,
  getObj,
  getDefault,
  getString,
  getNumber,
  getFloat,
  getTrue,
  getFalse,
  curriedGet,
  curriedGet as get,
  toFloat,
}