Repository URL to install this package:
|
Version:
3.0.5 ▾
|
// 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,
}