UNPKG

@tanshenghu/web-utils

Version:

web公共方法

235 lines (200 loc) 8.11 kB
'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'];