UNPKG

zgg-ui

Version:

2.0.1 正式版本 基于 Vue 3、UniApp 和 TypeScript 开发的多端适配移动端 UI 组件库,旨在提供丰富的组件集合,帮助开发者快速构建多端响应式的移动应用界面

106 lines (101 loc) 3.02 kB
// @ts-nocheck import type { ExecuteRule, Value } from '../interface' import { format } from '../util' import required from './required' import getUrlRegex from './url' /* eslint max-len:0 */ const pattern = { // http://emailregex.com/ email: /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+\.)+[a-zA-Z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]{2,}))$/, // url: new RegExp( // '^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$', // 'i', // ), hex: /^#?([a-f0-9]{6}|[a-f0-9]{3})$/i, } const types = { integer(value: Value) { return types.number(value) && parseInt(value, 10) === value }, float(value: Value) { return types.number(value) && !types.integer(value) }, array(value: Value) { return Array.isArray(value) }, regexp(value: Value) { if (value instanceof RegExp) { return true } try { return !!new RegExp(value) } catch (e) { return false } }, date(value: Value) { return ( typeof value.getTime === 'function' && typeof value.getMonth === 'function' && typeof value.getYear === 'function' && !isNaN(value.getTime()) ) }, number(value: Value) { if (isNaN(value)) { return false } return typeof value === 'number' }, object(value: Value) { return typeof value === 'object' && !types.array(value) }, method(value: Value) { return typeof value === 'function' }, email(value: Value) { return ( typeof value === 'string' && value.length <= 320 && !!value.match(pattern.email) ) }, url(value: Value) { return ( typeof value === 'string' && value.length <= 2048 && !!value.match(getUrlRegex()) ) }, hex(value: Value) { return typeof value === 'string' && !!value.match(pattern.hex) }, } const type: ExecuteRule = (rule, value, source, errors, options) => { if (rule.required && value === undefined) { required(rule, value, source, errors, options) return } const custom = [ 'integer', 'float', 'array', 'regexp', 'object', 'method', 'email', 'number', 'date', 'url', 'hex', ] const ruleType = rule.type if (custom.indexOf(ruleType) > -1) { if (!types[ruleType](value)) { errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type)) } // straight typeof check } else if (ruleType && typeof value !== rule.type) { errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type)) } } export default type