All files / src/env/react routes.js

93.1% Statements 27/29
80% Branches 8/10
100% Functions 7/7
91.3% Lines 21/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  1x 1x   8x 8x         1x 9x   9x 18x     18x       18x 23x 23x   23x         23x 2x       21x 1x 1x             20x                       8x     16x      
 
import React from 'react'
import { compose, filter, map, defaultTo } from 'lodash/fp'
 
const clone = ({ child, params }) => {
  return React.cloneElement(child, {
    params
  })
}
 
export const findRoute = route => {
  const search = route.pathname.split('/')
 
  return child => {
    const match = child.props.route.split('/')
 
    // Quick length fail (allow starred routes to proceed)
    Iif (match.length !== search.length && !match.includes('*')) {
      return false
    }
 
    return match.reduce((props, param, index) => {
      const { params, result } = props
      const routeParam = search[index]
 
      Iif (result === false) {
        return props
      }
 
      // Match on a starred route
      if (/\*/.test(param)) {
        return props
      }
 
      // Match on a route parameter
      if (/^:/.test(param)) {
        params[param.replace(/^:/, '')] = routeParam
        return {
          ...props,
          params
        }
      }
 
      // Match on url segment match
      return {
        ...props,
        result: param === routeParam
      }
    }, {
      result: true,
      params: {},
      child
    })
  }
}
 
export const matchRoute = route => children => compose(
  defaultTo(null),
  map(clone),
  filter(({ result }) => result),
  map(findRoute(route))
)(React.Children.toArray(children))