@tanshenghu/web-utils
Version:
web公共方法
235 lines (200 loc) • 8.11 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; /**
* @Author: 谭生虎 TanShenghu tanshenghu@163.com
* @Update: 2020-03-20
* @Description: 参数数据类型验证 主要运用于移动端与NodeJs项目中 后期优化点: 递归深入到每一个节点进行相应的数据类型验证
*/
var _common = require('../common');
var _common2 = _interopRequireDefault(_common);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// 全局自定义规则
var ruleUtils = {};
// 临时自定规则 用完即毁 临时规则优先于全局规则
var temporaryRuleUtils = {};
/**
* 数据类型验证方法
* @constructor
* @param {object} parameter - 传过来的待验证数据
* @param {object} rules - 验证规则
* @param {function} options.errorTip - 提示方法
*/
function paramType(parameter, rules, Tip) {
function getRuleKeys(rule) {
return Object.keys(rule);
}
var verifTools = _extends({
value: null,
// 必填项
required: function required(value, callback) {
this.value = value;
return _common2.default.isType(callback, 'function') ? callback(value, parameter, verifTools) : !!value && ('' + value).trim() && value !== 0;
},
// 非Null或undefined
exist: function exist(value) {
this.value = value;
return value !== null && typeof value !== 'undefined';
},
// 非 undefined
notVoid: function notVoid(value) {
this.value = value;
return typeof value !== 'undefined';
},
// 自定义项
custom: function custom(value, callback) {
return callback(value, verifTools);
},
// 字符长度
length: function length(value, _ref) {
var _ref$min = _ref.min,
min = _ref$min === undefined ? 0 : _ref$min,
max = _ref.max;
return !this.notVoid(value) || typeof value === 'string' && value.length >= min && (!max || value.length <= max);
},
// 值在某个集合范围内
keyof: function keyof(value, sets) {
this.value = value;
return !this.notVoid(value) || sets.includes(value);
},
// 正整型
numberInt: function numberInt(value) {
this.value = value;
return !this.notVoid(value) || typeof value === 'number' && /^\d*$/.test('' + value);
},
// 字符类型
string: function string(value) {
this.value = value;
return !this.notVoid(value) || value.constructor === String;
},
// 数字类型
number: function number(value) {
this.value = value;
return !this.notVoid(value) || value.constructor === Number;
},
// 对象类型
object: function object(value) {
this.value = value;
return !this.notVoid(value) || value.constructor === Object;
},
// 函数类型
function: function _function(value) {
this.value = value;
return !this.notVoid(value) || value.constructor === Function;
},
// 数组类型
array: function array(value) {
this.value = value;
return !this.notVoid(value) || value.constructor === Array;
},
// 日期类型
date: function date(value) {
this.value = value;
return !this.notVoid(value) || value.constructor === Date;
},
// 布尔类型
boolean: function boolean(value) {
this.value = value;
return !this.notVoid(value) || value.constructor === Boolean;
}
}, ruleUtils, temporaryRuleUtils);
var currentLoopRule = {};
var fields = getRuleKeys(rules);
var checkResult = fields.every(function (item) {
var currentFieldsRules = [].concat(Object.keys(rules[item].rule));
var result = currentFieldsRules.every(function (rItem) {
// 首字母小写
rItem = ('' + rItem).replace(/./, function (a) {
return a.toLowerCase();
});
if (verifTools[rItem]) {
currentLoopRule.name = rItem;
currentLoopRule.message = rules[item].message[rItem] || item + ',' + rItem + ' \u9A8C\u8BC1\u5931\u8D25';
var applys = void 0;
if (rItem === 'custom' || rItem === 'required' || rItem === 'length' || rItem === 'keyof') {
applys = rules[item].rule[rItem];
}
return verifTools[rItem](parameter[item], applys);
}
return true;
});
return result;
});
if (typeof Tip === 'function' && !checkResult) {
Tip(currentLoopRule.message, currentLoopRule);
}
// 临时验证规则 生命周期结束
temporaryRuleUtils = {};
return checkResult;
}
/**
* 辅助工具方法
*/
paramType.chain = function () {
var result = {};
var node = result;
var nodeSelector = 'result';
var toLower = function toLower(v) {
return ('' + v).toLowerCase();
};
return {
add: function add(fieldName) {
result[fieldName] = result[fieldName] || {};
node = result[fieldName];
node.rule = {};
nodeSelector += '.' + fieldName;
return this;
},
rule: function rule(ruleName, _rule, message) {
// 数据类型 简写规则支持
if (!_common2.default.isType(_rule, 'function')) {
var itemRule = _common2.default.seek().equal(toLower(ruleName) === 'string', String).equal(toLower(ruleName) === 'number', Number).equal(toLower(ruleName) === 'object', Object).equal(toLower(ruleName) === 'function', Function).equal(toLower(ruleName) === 'array', Array).equal(toLower(ruleName) === 'date', Date).equal(toLower(ruleName) === 'boolean', Boolean).get();
if (itemRule) {
message = _rule;
_rule = itemRule;
}
}
// 兼容简写方式 一些内置的规则一般可以用简写方式 如 required, numberInt等
if (typeof _rule === 'string' && typeof message === 'undefined') {
message = _rule;
_rule = undefined;
}
node.rule = node.rule || {};
node.message = node.message || {};
node.rule[ruleName] = _rule;
if (message) {
node.message[ruleName] = message;
}
return this;
},
useless: function useless() {
return this;
},
end: function end() {
node = result;
nodeSelector = nodeSelector.replace(/.[\w\-]+$/, '');
return this;
},
injectRules: function injectRules(iRuleUtils) {
if (_common2.default.isType(iRuleUtils, 'object')) {
temporaryRuleUtils = iRuleUtils;
}
return this;
},
toConfig: function toConfig() {
return result;
}
};
};
/**
* 注入一些全局常用的验证规则
* @param {object} rules - 全局可用的验证规则集合
*/
paramType.injectRules = function (rules) {
if (_common2.default.isType(rules, 'object')) {
_common2.default.extend(ruleUtils, rules);
}
};
exports.default = paramType;
module.exports = exports['default'];