redux-devshare
Version:
[![NPM version][npm-image]][npm-url] [![NPM downloads][npm-downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Dependency Status][daviddm-image]][daviddm-url] [![Code Climate][climate-image]][climate-url] [![Code Coverage][coverage-i
78 lines (69 loc) • 2.51 kB
JavaScript
import { flatMap, isArray, isObject, isString, remove } from 'lodash'
import { getPopulates } from './populate'
import { getQueryIdFromPath } from './query'
/**
* @description Convert path string to object with queryParams, path, and populates
* @param {String} path - Path that can contain query parameters and populates
* @return {Object} watchEvents - Array of watch events
*/
export const pathStrToObj = (path) => {
let pathObj = { path, type: 'value', isQuery: false }
const queryId = getQueryIdFromPath(path)
// If Query id exists split params from path
if (queryId) {
const pathArray = path.split('#')
pathObj = Object.assign(
{},
pathObj,
{
queryId,
isQuery: true,
path: pathArray[0],
queryParams: pathArray[1].split('&')
}
)
if (getPopulates(pathArray[1].split('&'))) {
pathObj.populates = getPopulates(pathArray[1].split('&'))
pathObj.queryParams = remove(pathArray[1].split('&'), (p) => p.indexOf('populate') === -1)
}
}
// if queryId does not exist, return original pathObj
return pathObj
}
/**
* @description Convert watch path definition array to watch events
* @param {Array} paths - Array of path strings, objects, and arrays to watch
* @return {Array} watchEvents - Array of watch events
*/
export const getEventsFromInput = paths =>
flatMap(paths, (path) => {
if (isString(path)) {
return [ pathStrToObj(path) ]
}
if (isArray(path)) {
// TODO: Handle input other than array with string
// TODO: Handle populates within array
return [
{ type: 'first_child', path: path[0] },
{ type: 'child_added', path: path[0] },
{ type: 'child_removed', path: path[0] },
{ type: 'child_moved', path: path[0] },
{ type: 'child_changed', path: path[0] }
]
}
if (isObject(path)) {
if (!path.path) {
throw new Error('Path is a required parameter within definition object')
}
let strPath = path.path
if (path.queryParams) {
// append query params to path for queryId added in pathStrToObj
strPath = `${strPath}#${path.queryParams.join('&')}`
}
// Add all parameters that are missing (ones that exist will remain)
path = Object.assign({}, pathStrToObj(strPath), path)
return [ path ]
}
throw new Error(`Invalid Path Definition: ${path}. Only strings, objects, and arrays accepted.`)
})
export default { getEventsFromInput }