lib/subrule.js
function typeOf (rule) {
  var ruleType = typeof rule
  
  return ruleType === 'function'
    ? ruleType
    : ruleType !== 'object'
      ? (rule.length === 0
          ? 'noop'
          : (rule === 0
              ? 'zero'
              : ruleType
            )
        )
      : Buffer.isBuffer(rule)
        ? 'buffer'
        : !isArray(rule)
          ? ((has(rule, 'start') && has(rule, 'end')
              ? 'range'
              : has(rule, 'start')
                ? 'rangestart'
                : has(rule, 'end')
                  ? 'rangeend'
                  : has(rule, 'firstOf')
                    ? (( (isArray(rule.firstOf) && sameTypeArray(rule.firstOf) )
                        || typeof rule.firstOf === 'string'
                        )
                      && rule.firstOf.length > 1
                      )
                        ? 'firstof'
                        : 'invalid firstof'
                    : 'invalid'
              )
              + '_object'
            )
          : !sameTypeArray(rule)
            ? 'multi types array'
            : ((Buffer.isBuffer( rule[0] )
                ? 'buffer'
                : typeof rule[0]
                )
                + '_array'
              )
}
function typeOf (rule) {
  var ruleType = typeof rule
  
  return ruleType === 'function'
    ? ruleType
    : ruleType !== 'object'
      ? (rule.length === 0
          ? 'noop'
          : (rule === 0
              ? 'zero'
              : ruleType
            )
        )
      : Buffer.isBuffer(rule)
        ? 'buffer'
        : !isArray(rule)
          ? ((has(rule, 'start') && has(rule, 'end')
              ? 'range'
              : has(rule, 'start')
                ? 'rangestart'
                : has(rule, 'end')
                  ? 'rangeend'
                  : has(rule, 'firstOf')
                    ? (( (isArray(rule.firstOf) && sameTypeArray(rule.firstOf) )
                        || typeof rule.firstOf === 'string'
                        )
                      && rule.firstOf.length > 1
                      )
                        ? 'firstof'
                        : 'invalid firstof'
                    : 'invalid'
              )
              + '_object'
            )
          : !sameTypeArray(rule)
            ? 'multi types array'
            : ((Buffer.isBuffer( rule[0] )
                ? 'buffer'
                : typeof rule[0]
                )
                + '_array'
              )
}
function typeOf ( rule ) { var ruleType = typeof rule return ruleType === 'function' ? ruleType : ruleType !== 'object' ? ( rule . length === 0 ? 'noop' : ( rule === 0 ? 'zero' : ruleType ) ) : Buffer . isBuffer ( rule ) ? 'buffer' : ! isArray ( rule ) ? ( ( has ( rule , 'start' ) && has ( rule , 'end' ) ? 'range' : has ( rule , 'start' ) ? 'rangestart' : has ( rule , 'end' ) ? 'rangeend' : has ( rule , 'firstOf' ) ? ( ( ( isArray ( rule . firstOf ) && sameTypeArray ( rule . firstOf ) ) || typeof rule . firstOf === 'string' ) && rule . firstOf . length > 1 ) ? 'firstof' : 'invalid firstof' : 'invalid' ) + '_object' ) : ! sameTypeArray ( rule ) ? 'multi types array' : ( ( Buffer . isBuffer ( rule [ 0 ] ) ? 'buffer' : typeof rule [ 0 ] ) + '_array' ) }
Return the type of an item
@param {...} item to check
@return {String} type
Return the type of an item