all files / src/ validators.js

100% Statements 43/43
93.94% Branches 31/33
100% Functions 5/5
100% Lines 38/38
1 branch Ignored     
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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89                                           100×     31×   31× 31× 31×     36× 36×   36× 17×     19×       19× 19× 19×       133× 133× 71× 71× 71× 71× 1569× 1569× 74×   1569× 145×     71× 35× 19× 19×   16×               36×            
import messages from './messages'
 
var DEFAULT_OPTIONS = {
  allowBlank: false,
  urlProtocols: ['http', 'https'],
  dateFormat: 'yyyy-mm-dd', // ISO
  dateYmd: 'ymd',
  accept: ['1', 'true'],
  caseSensitive: true // confirmation, inclusion, exclusion
}
 
var Validators = {
  formatMessage,
  formatSize,
  defaultOptions: DEFAULT_OPTIONS,
  messages,
  pluralRules: {
    0: 'zero',
    1: 'one'
  }
}
 
export default Validators
 
function formatSize (size, unit) {
  return size + ' ' + unit
}
 
function formatMessage (msg) {
  if (msg.props) {
    msg = msg.props
  }
  let text = msg.defaultMessage || msg.id || ''
  let rules = Validators.pluralRules
  return !msg.values
    ? text
    : parseMsg(text, function (part) {
      let parts = part.split(',')
      let count = msg.values[parts[0]]
      // {value} OR {count, number}
      if (parts.length <= 2) {
        return count == null ? '' : '' + count
      }
      // plural
      let plural = parts
        .slice(2)
        .join(',')
        .trim()
      let info = {}
      let result = parseMsg(plural, null, rules[+count] || 'other', info)
      return info.found ? result : parseMsg(plural, null, 'other', {})
    })
}
 
function parseMsg (msg, func, pattern, info) {
  let start = msg.indexOf('{')
  if (start < 0) return pattern ? '' : msg
  let index = start
  let count = 1
  let len = msg.length
  while (count > 0 && index < len) {
    ++index
    if (msg.charAt(index) === '{') {
      ++count
    }
    if (msg.charAt(index) === '}') {
      --count
    }
  }
  if (pattern) {
    if (pattern === msg.slice(0, start).trim()) {
      info.found = true
      return msg.slice(start + 1, index).trim()
    }
    return parseMsg(msg.slice(index + 1), null, pattern, info)
  }
 
  // func gets all '{.*}' parts
  // e.g:
  // - {count}
  // - {count, plural, one {1 thing} other {many things}}
  // - ...
  return (
    msg.slice(0, start) +
    parseMsg(func(msg.slice(start + 1, index).trim()), func) +
    parseMsg(msg.slice(index + 1), func)
  )
}