check-data
Advanced tools
Comparing version 2.0.1 to 3.0.0
21
index.js
@@ -9,6 +9,6 @@ "use strict" | ||
constructor(data, options) { | ||
this.data = data | ||
constructor(origin, options) { | ||
this.origin = origin | ||
this.options = options | ||
return this.recursion(data, options, '') | ||
return this.recursion(origin, options, '') | ||
} | ||
@@ -31,5 +31,5 @@ | ||
* 递归验证器 | ||
* @param {*} data 验证数据 | ||
* @param {*} options 验证表达式选项 | ||
* @param {*} key 数据索引 | ||
* @param {*} data 待验证数据 | ||
* @param {*} options 验证表达式 | ||
* @param {String,Number} key 数据索引 | ||
*/ | ||
@@ -41,3 +41,3 @@ recursion(data, options, key) { | ||
// 选项为验证器表达式(type作为内部保留关键字,应避免使用同名的type属性,否则会产生命名冲突) | ||
// 选项为验证表达式 | ||
if (options.type) { | ||
@@ -82,3 +82,3 @@ | ||
if (fun) { | ||
let { error, data: subData } = fun({ data, option: options[name], input: this.data }) | ||
let { error, data: subData } = fun({ data, option: options[name], origin: this.origin }) | ||
if (error) { | ||
@@ -249,3 +249,3 @@ return { | ||
// 数据构函数 | ||
// 数据扩展函数,基于已验证的数据构建新的数据结构 | ||
for (let name in handler) { | ||
@@ -255,4 +255,5 @@ let item = handler[name] | ||
if (typeof item === 'function') { | ||
output.data[name] = item.call(output.data, output.data) | ||
item = item.call(output.data, output.data) | ||
} | ||
output.data[name] = item | ||
} | ||
@@ -259,0 +260,0 @@ |
@@ -8,4 +8,4 @@ "use strict" | ||
// 参数自定义转换方法 | ||
handle({ data, option: fun, input }) { | ||
return { data: fun.call(input, data) } | ||
set({ data, option: fun, origin }) { | ||
return { data: fun.call(origin, data) } | ||
}, | ||
@@ -17,10 +17,10 @@ // 直接赋值(会覆盖原来的值) | ||
// 与 | ||
and({ data, option, input }) { | ||
and({ data, option, origin }) { | ||
// 如果option为函数,应先执行函数,将函数转为数组 | ||
if (option instanceof Function) { | ||
option = option.call(input, data) | ||
option = option.call(origin, data) | ||
} | ||
if (option instanceof Array) { | ||
for (let name of option) { | ||
if (input[name] === undefined || input[name] === '') { | ||
if (origin[name] === undefined || origin[name] === '') { | ||
return { error: `必须与${name}参数同时存在` } | ||
@@ -33,6 +33,6 @@ } | ||
// 或 | ||
or({ data, option, input }) { | ||
or({ data, option, origin }) { | ||
// 如果option为函数,应先执行函数,将函数转为数组 | ||
if (option instanceof Function) { | ||
option = option.call(input, data) | ||
option = option.call(origin, data) | ||
} | ||
@@ -42,3 +42,3 @@ if (option instanceof Array) { | ||
for (let name of option) { | ||
if (input[name] !== undefined && input[name] !== '') { | ||
if (origin[name] !== undefined && origin[name] !== '') { | ||
status = false | ||
@@ -55,3 +55,3 @@ } | ||
// 数据类型方法 | ||
// 数据类型验证方法 | ||
let methods = { | ||
@@ -131,20 +131,10 @@ [String]: { | ||
} | ||
}, | ||
// 转换类型 | ||
to({ data, option: type }) { | ||
if (type === Boolean) { | ||
if (data) { | ||
return { data: true } | ||
} else { | ||
return { data: false } | ||
} | ||
} | ||
}, | ||
} | ||
}, | ||
[Object]: { | ||
type({ data }) { | ||
if (typeof data !== 'object') { | ||
if (typeof data === 'object') { | ||
return { data } | ||
} else { | ||
return { error: '必须为对象' } | ||
} else { | ||
return { data } | ||
} | ||
@@ -155,6 +145,6 @@ }, | ||
type({ data }) { | ||
if (!Array.isArray(data)) { | ||
if (Array.isArray(data)) { | ||
return { data } | ||
} else { | ||
return { error: '必须为数组' } | ||
} else { | ||
return { data } | ||
} | ||
@@ -179,6 +169,6 @@ }, | ||
type({ data }) { | ||
if (!validator.toDate(data + '')) { | ||
if (validator.toDate(data + '')) { | ||
return { data } | ||
} else { | ||
return { error: '必须为日期类型' } | ||
} else { | ||
return { data } | ||
} | ||
@@ -189,6 +179,15 @@ }, | ||
type({ data }) { | ||
if (typeof data !== 'boolean') { | ||
if (typeof data === 'boolean') { | ||
return { data } | ||
} else { | ||
return { error: '必须为布尔值' } | ||
} | ||
}, | ||
}, | ||
[Function]: { | ||
type({ data }) { | ||
if (typeof data === 'function') { | ||
return { data } | ||
} else { | ||
return { data } | ||
return { error: '必须为函数' } | ||
} | ||
@@ -195,0 +194,0 @@ }, |
{ | ||
"name": "check-data", | ||
"version": "2.0.1", | ||
"version": "3.0.0", | ||
"description": "JS对象验证器", | ||
"main": "index.js", | ||
"scripts": { | ||
"dev": "nodemon test/schema" | ||
"dev": "nodemon test/object" | ||
}, | ||
@@ -12,3 +12,3 @@ "author": "https://github.com/xiangle/verify.git", | ||
"dependencies": { | ||
"filter-null": "^1.2.0", | ||
"filter-null": "^2.0.0", | ||
"validator": "^8.0.0" | ||
@@ -37,2 +37,2 @@ }, | ||
"homepage": "https://github.com/xiangle/verify#readme" | ||
} | ||
} |
### Install | ||
$ npm install check-data --save | ||
npm install check-data --save | ||
@@ -13,14 +13,18 @@ ### 使用方法 | ||
### 输入 | ||
### 输入参数 | ||
* `data` *Objcte, Array, String, Number, Date, Boolean* - 输入待验证数据 | ||
* `options` *Objcte, Array, Function* - 数据验证表达式,类型参考type选项 | ||
* `options` *Objcte, Array, Function* - 数据验证表达式,类型参考type选项。 | ||
* `handler` *Objcte* - 自定义数据构建对象,根据输入数据生成新的数据结构(可选) | ||
* `extend` *Objcte* - 自定义数据构建对象,根据输入数据生成新的数据结构(可选) | ||
* `handler.$` *Function* - 数据构建方法,函数名称与输出data对象中的key相对应。通过this或第一个函数参数可快速获取验证结果。(函数返回对象中同样支持多层嵌套函数表达式,可适应更多的应用场景。) | ||
* `extend.$name` *Function* - 数据扩展函数,基于已验证的数据构建新的数据结构,输出结果将以函数名作为key保存到data中。函数中this和第一个入参指向data(已存在的同名属性值会被函数返回值覆盖) | ||
### 输出 | ||
* `extend.$name` * - 数据扩展,除函数外的其它任意数据类型,在已验证的数据结构上添加新的属性或覆盖已存在的同名属性 | ||
### 返回值 | ||
> 输出数据是基于约定的对象结构,error和data不会同时存在,验证成功返回data,验证失败返回error和msg | ||
* `error` *String* - 验证失败时返回的错误信息,包含错误的具体位置信息,仅供开发者调试使用 | ||
@@ -35,9 +39,11 @@ | ||
> 验证表达式中判断一个对象节点是否为验证选项的唯一依据是看对象中是否包含type属性,否则会被视为对象结构。type作为验证表达式的保留关键字,应尽量避免在入参中包含type属性,否则可能导致验证器出现混乱。 | ||
#### 通用选项 | ||
* `type` *String, Number, Object, Array, Date, Boolean, "MongoId", "MobilePhone", 'Email'* - 数据类型,扩展类型用字符串表示 | ||
* `type` * - 数据类型 | ||
* `name` *String* - 自定义参数名称,用于错误返回值中替换默认参数名 | ||
* `default` * - 空值时的默认赋值 | ||
* `default` * - 默认赋值 | ||
* `set` *Function* - 赋值函数,用于对输入值处理后再输出赋值,函数中this指向原始数据data,当值为空时不执行(原method方法) | ||
@@ -54,5 +60,8 @@ * `value` * - 直接通过表达式赋值,类似于default选项,区别是不管值是否为空都将使用该值覆盖(优先级低于default,目前没有发现同时使用的应用场景) | ||
* `handle` *Function* - 参数自定义转换方法,非空值时执行(原method方法更名为handle)。 | ||
* `name` *String* - 参数名称,为参数名定义一个更易于理解的别名,在返回错误描述文本中会优先使用该别名替换属性名 | ||
### 专用选项 | ||
> 针对不同的数据类型,会有不同的可选参数,参数如下 | ||
#### String | ||
@@ -76,4 +85,2 @@ | ||
* `to` * - 类型转换,仅支持Boolean值 | ||
#### Array | ||
@@ -89,3 +96,3 @@ | ||
#### Date、Boolean | ||
#### Date、Boolean、Function | ||
@@ -95,3 +102,3 @@ > 仅支持类型验证 | ||
### 其它类型 | ||
### 其它数据类型 | ||
@@ -117,12 +124,38 @@ #### 'MongoId' | ||
Validator.use(name, options) | ||
``` | ||
# 示例 | ||
* `name` *String* - 类型名称(必填) | ||
* `options` *Object* - 类型选项(必填) | ||
* `options.type` *Function* - 数据类型验证函数(必填) | ||
* `options.$name` *Function* - 其它验证函数(可选) | ||
##### 参考示例 | ||
```js | ||
Validator.use('Int', { | ||
type({ data }) { | ||
if (Number.isInteger(data)) { | ||
return { data } | ||
} else { | ||
return { error: '必须为Int类型' } | ||
} | ||
}, | ||
type({ data }) { | ||
if (Number.isInteger(data)) { | ||
return { data } | ||
} else { | ||
return { error: '必须为Int类型' } | ||
} | ||
}, | ||
max({ data, option: max }) { | ||
if (data > max) { | ||
return { error: `不能大于${max}` } | ||
} else { | ||
return { data } | ||
} | ||
}, | ||
in({ data, option: arr }) { | ||
let result = arr.indexOf(data) | ||
if (result === -1) { | ||
return { error: `值必须为${arr}中的一个` } | ||
} else { | ||
return { data } | ||
} | ||
} | ||
}) | ||
@@ -140,2 +173,7 @@ ``` | ||
* `name` *String* - schema名称 | ||
* `options` * - 验证表达式 | ||
### 参考示例 | ||
@@ -403,1 +441,10 @@ | ||
``` | ||
### 更新内容 | ||
* 新增Function类型验证 | ||
* 将handle函数名改为set | ||
* 升级filter-null,取消递归执行嵌套函数 |
@@ -112,3 +112,3 @@ "use strict" | ||
"type": String, | ||
method(value) { | ||
set(value) { | ||
return { "$gt": value } | ||
@@ -129,3 +129,3 @@ } | ||
"type": 'Email', | ||
method(value) { | ||
set(value) { | ||
return [value, , null, , undefined, 666] | ||
@@ -132,0 +132,0 @@ } |
@@ -10,2 +10,3 @@ "use strict" | ||
b: ["kkk", "xxx"], | ||
c: "是" | ||
}, | ||
@@ -21,2 +22,8 @@ { | ||
} | ||
}, | ||
c: { | ||
type: String, | ||
handle(data) { | ||
return data | ||
} | ||
} | ||
@@ -23,0 +30,0 @@ } |
@@ -5,24 +5,43 @@ "use strict" | ||
let obj = { | ||
a: { | ||
a1: 1, | ||
a2: "12", | ||
}, | ||
b: 2, | ||
s: 99, | ||
c(a, b) { | ||
return a + b | ||
}, | ||
} | ||
let { error, data } = Validator( | ||
let { error, data } = Validator(obj, | ||
{ | ||
a: { | ||
a1: 1, | ||
a2: "12", | ||
// a: { | ||
// a1: { | ||
// type: Number, | ||
// allowNull: false | ||
// }, | ||
// a2: { | ||
// type: Number, | ||
// allowNull: false | ||
// } | ||
// }, | ||
b: { | ||
type: Number, | ||
set(data) { | ||
return data * 2 | ||
} | ||
}, | ||
b: 2, | ||
c: 888, | ||
s: { | ||
type: Number, | ||
name: "拉拉", | ||
}, | ||
c: Function, | ||
}, | ||
{ | ||
a: { | ||
a1: { | ||
type: Number, | ||
allowNull: false | ||
}, | ||
a2: { | ||
type: Number, | ||
allowNull: false | ||
} | ||
test() { | ||
return 888 | ||
}, | ||
b: Number, | ||
ss: 999 | ||
} | ||
@@ -29,0 +48,0 @@ ) |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
31638
795
441
+ Addedfilter-null@2.0.0(transitive)
- Removedfilter-null@1.2.0(transitive)
Updatedfilter-null@^2.0.0