applyPropDoclets = prop => {
  prop.doclets.forEach(({ tag, value }) => {
    // the @type doclet to provide a prop type
    // Also allows enums (oneOf) if string literals are provided
    // ex: @type {("optionA"|"optionB")}
    if (tag === `type`) {
      value = cleanDocletValue(value)

      if (prop.type === undefined) {
        prop.type = {}
      }

      prop.type.name = value

      if (value[0] === `(`) {
        value = value
          .substring(1, value.length - 1)
          .split(`|`)
          .map(v => v.trim())
        const name = value.every(isLiteral) ? `enum` : `union`
        prop.type.name = name
        prop.type.value = value.map(value =>
          name === `enum` ? { value, computed: false } : { name: value }
        )
      }
      return
    }

    // Use @required to mark a prop as required
    // useful for custom propTypes where there isn't a `.isRequired` addon
    if (tag === `required` && value) {
      prop.required = true
      return
    }

    // Use @defaultValue to provide a prop's default value
    if ((tag === `default` || tag === `defaultValue`) && value != null) {
      prop.defaultValue = { value, computed: false }
      return
    }
  })

  // lookup for tsTypes or flowTypes
  if (prop.type === undefined) {
    prop.type = parseType(prop.tsType) || parseType(prop.flowType)
  }

  return prop
}
Reads the JSDoc "doclets" and applies certain ones to the prop type data
This allows us to "fix" parsing errors, or unparsable data with JSDoc
style comments

@param  {Object} props     Object Hash of the prop metadata
@param  {String} propName