base-validator
Advanced tools
Comparing version 0.0.1 to 0.0.2
@@ -25,3 +25,3 @@ // 定义在全局,避免每次校验都花时间初始化正则。 | ||
digits: function (actual) { | ||
return actual === parseInt(actual) || DIGITS.test(actual) | ||
return (typeof actual === 'number' && actual % 1 === 0) || DIGITS.test(actual) | ||
}, | ||
@@ -136,11 +136,9 @@ | ||
date: function (actual) { | ||
}, | ||
dateISO: function (actual) { | ||
}, | ||
/** | ||
* 值相等。对于复合类型(数组和对象),进行递归对比。对于基本类型,进行全等对比(即对比类型和值)。 | ||
* @param {any} actual 实际值 | ||
* @param {any} expected 期望值 | ||
*/ | ||
equalTo: function (actual, expected) { | ||
// 对于数组,按序对比每一项 | ||
if (Array.isArray(actual) && Array.isArray(expected)) { | ||
@@ -153,2 +151,3 @@ if (actual.length === expected.length) { | ||
} | ||
// 对于对象,对比所有字段。对象的键一样,且值也一样。忽略对象原型链上的属性。 | ||
} else if (typeof actual === 'object' && typeof expected === 'object' && actual && expected) { | ||
@@ -158,9 +157,13 @@ let keyListA = Object.keys(actual) | ||
if (keyListA.length === keyListB.length) { | ||
let iterator = function (item, i) { | ||
let valA = actual[item] | ||
let valB = expected[keyListB[i]] | ||
return this.equalTo(valA, valB) | ||
let iterator = function (item) { | ||
return expected.hasOwnProperty(item) && this.equalTo(actual[item], expected[item]) | ||
} | ||
return keyListA.every(iterator.bind(this)) | ||
} | ||
} else if (typeof actual === 'string' && typeof expected === 'string') { | ||
// 对于字符串,进行对比时,忽略前后包含的空白字符。 | ||
return actual.trim() === expected.trim() | ||
} else if (this.number(actual) && this.number(expected)) { | ||
// 对于期望值和实际值都是数字类型,进行隐式转换后,再对比 | ||
return actual == expected | ||
} else { | ||
@@ -171,2 +174,3 @@ return actual === expected | ||
// 包含期望值。对于数组,对比的是单项;对于字符串,对比的是字串。 | ||
contains: function (actual, expected) { | ||
@@ -176,3 +180,7 @@ return (Array.isArray(actual) || typeof actual === 'string') && actual.contains(expected) | ||
// 在期望值中存在。对于数组,对比的是单项;对于字符串,对比的是字串。 | ||
in: function (actual, expected) { | ||
if (!(Array.isArray(expected) || typeof expected === 'string')) { | ||
throw new TypeError('in() expected 应为数组或字符串') | ||
} | ||
return expected.contains(actual) | ||
@@ -187,2 +195,5 @@ } | ||
STRATEGY.eq = STRATEGY.equalTo | ||
STRATEGY.length = STRATEGY.lengthBetween | ||
STRATEGY.gte = STRATEGY.min | ||
STRATEGY.lte = STRATEGY.max | ||
@@ -224,3 +235,3 @@ /** | ||
// 如果校验的数据对象不存在 property 指定的属性,则跳过。 | ||
if (!(prop in data)) return | ||
if (!data.hasOwnProperty(prop)) return | ||
@@ -246,2 +257,7 @@ return !assert(actual, expected) | ||
Validator.all = function (data, rule) { | ||
let allErrors = true | ||
return Validator(data, rule, allErrors) | ||
} | ||
module.exports = Validator |
{ | ||
"name": "base-validator", | ||
"version": "0.0.1", | ||
"version": "0.0.2", | ||
"description": "基础的表单验证器", | ||
"main": "index.js", | ||
"scripts": {}, | ||
"scripts": { | ||
"test": "mocha" | ||
}, | ||
"repository": { | ||
@@ -24,3 +26,6 @@ "type": "git", | ||
}, | ||
"homepage": "https://github.com/pengng/base-validator#readme" | ||
"homepage": "https://github.com/pengng/base-validator#readme", | ||
"devDependencies": { | ||
"mocha": "^5.2.0" | ||
} | ||
} |
111
README.md
@@ -6,12 +6,2 @@ # base-validator | ||
在确保校验准确度的前提下,尽可能放宽规则。例: | ||
- 符合数字格式的字符串或`Number`类型均可以通过 **number** 校验。 | ||
- 允许数据前后包含空白字符,用户可能不会注意到输入了空白字符。 | ||
- **0** 和 **false** 出现在表单内,常作为 `<input type="number" />` 和 `<input type="checkbox" />` 的结果值。应当作有效值,可以通过 **required** 校验。 | ||
- 包含一个或多个空白字符的字符串,不包含任何可见字符,可能是用户无意中输入,但发现不到,这应当被 **required** 校验阻止。 | ||
### Usage | ||
@@ -25,4 +15,4 @@ | ||
const Validator = require('base-validator') | ||
const assert = [ | ||
// 定义校验规则 | ||
const rule = [ | ||
{ | ||
@@ -32,40 +22,11 @@ prop: 'phone', | ||
assert: 'required' | ||
}, | ||
{ | ||
prop: 'phone', | ||
msg: '手机号码长度应为11位', | ||
assert: 'betweenLength', | ||
expected: [11, 11] | ||
}, | ||
{ | ||
prop: 'phone', | ||
msg: '手机号码不正确', | ||
assert: 'tel' | ||
}, | ||
{ | ||
prop: 'code', | ||
msg: '验证码不能为空', | ||
assert: 'required' | ||
}, | ||
{ | ||
prop: 'code', | ||
msg: '验证码应为6位', | ||
assert: 'betweenLength', | ||
expected: [6, 6] | ||
}, | ||
{ | ||
prop: 'code', | ||
msg: '验证码不正确', | ||
assert: 'regular', | ||
expected: '/^\\d{6}$/' | ||
} | ||
] | ||
// 待校验的数据 | ||
const form = { | ||
phone: ' ', | ||
code: '23342' | ||
phone: ' ' // 该值只包含空格和制表符,无法通过 required 校验 | ||
} | ||
const msg = Validator(assert, form) | ||
console(msg) | ||
const msg = Validator(form, rule) | ||
console(msg) // 手机号码不能为空 | ||
``` | ||
@@ -75,2 +36,21 @@ | ||
### Validator(data, rule) | ||
校验数据是否符合期望值。返回第一项不通过的项目的错误提示语 \<string\>。全部通过时返回 **undefined** | ||
- `data` \<object\> 待校验的数据对象 | ||
- `rule` \<Array[object]\> 校验的规则,对象数组。 | ||
- `property` \<string\> 校验的字段名。**Alias:prop、key** | ||
- `message` \<string\> 校验不通过时的提示语。**Alias:msg** | ||
- `assert` \<string\> 校验的策略,支持的列表参考 [**Assert**](#Assert) 表。 | ||
- `expected` \<any\> 期望值。**部分校验策略需要带期望值**。 | ||
### Validator.all(data, rule) | ||
同 [**Validator(data, rule)**](#validatordata-rule) ,但返回全部不通过的项目。 | ||
### Assert | ||
@@ -80,19 +60,30 @@ | ||
| ------------- | ------------------------------------------------------------ | | ||
| tel | 手机号码 | | ||
| email | 电子邮箱 | | ||
| idcard | 居民身份证 | | ||
| url | url | | ||
| min | 最小值 | | ||
| max | 最大值 | | ||
| minlength | 最小长度值 | | ||
| maxlength | 最大长度值 | | ||
| number | 允许 Number 类型或符合数字格式的字符串(前后可包含一个或多个空白字符,可以是小数和负数) | | ||
| digits | 整数 | | ||
| between | 在最小值和最大值之间 | | ||
| betweenLength | 在最小长度值和最大长度值之间 | | ||
| equalTo | 值相等 | | ||
| contains | 包含给定值 | | ||
| in | 在给定值内存在 | | ||
| tel | 手机号码。别名:**mobile**、**phone** | | ||
| email | 电子邮箱。别名:**mail** | | ||
| idcard | 居民身份证。 | | ||
| url | url。别名:**URL** | | ||
| min | 最小值。仅允许数字类型和数字格式字符串,不允许布尔值。别名:**gte** | | ||
| max | 最大值。仅允许数字类型和数字格式字符串,不允许布尔值。别名:**lte** | | ||
| minlength | 最小长度值。对于数组,元素的个数应大于等于期望值;对于字符串,则是字符的个数。期望值描述的是长度,应为整数类型 | | ||
| maxlength | 最大长度值。对于数组,元素的个数应小于等于期望值;对于字符串,则是字符的个数。期望值描述的是长度,应为整数类型 | | ||
| number | 数字类型。允许 Number 类型或符合数字格式的字符串(前后可包含一个或多个空白字符,可以是小数和负数) | | ||
| digits | 整数类型。允许整数或整数格式的字符串(前后可包含一个或多个空白字符,可以是负数) | | ||
| between | 实际值应该在期望的上限和下限之间,包含上限和下限。期望值可以是单个元素的数组或数字类型,则上限值和下限值相等。上限值和下限值不区分顺序,小的值为下限,大的值为上限。 | | ||
| lengthBetween | 实际值的长度应该在期望的上限和下限之间,包含上限和下限。期望值可以是单个元素的数组或数字类型,则上限值和下限值相等。上限值和下限值不区分顺序,小的值为下限,大的值为上限。别名:**length** | | ||
| equalTo | 值相等。对于复合类型(数组和对象),进行递归对比。对于基本类型,进行全等对比(即对比类型和值)。别名:**eq** | | ||
| contains | 包含期望值。对于数组,对比的是单项;对于字符串,对比的是字串。 | | ||
| in | 在期望值中存在。对于数组,对比的是单项;对于字符串,对比的是字串。 | | ||
| regular | 正则校验。期望值是 **RegExp** 类型或 **string** 类型(正则字面量格式) | | ||
| required | 必填。**0** 和 **false** 属于有效值,仅包含一个或多个空白字符的字符串属于无效值 | | ||
### Tips | ||
在确保校验准确度的前提下,尽可能放宽规则。例: | ||
- 符合数字格式的字符串或`Number`类型均可以通过 **number** 校验。 | ||
- 允许数据前后包含空白字符,用户可能不会注意到输入了空白字符。 | ||
- **0** 和 **false** 出现在表单内,常作为 `<input type="number" />` 和 `<input type="checkbox" />` 的结果值。应当作有效值,可以通过 **required** 校验。 | ||
- 包含一个或多个空白字符的字符串,不包含任何可见字符,可能是用户无意中输入,但发现不到,这应当被 **required** 校验阻止。 |
15480
1
4
223
84