fieldCheck.js 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. "use strict";
  2. var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
  3. if (kind === "m") throw new TypeError("Private method is not writable");
  4. if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
  5. if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
  6. return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
  7. };
  8. var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
  9. if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
  10. if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
  11. return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
  12. };
  13. var _FieldCheck_ruleItems;
  14. Object.defineProperty(exports, "__esModule", { value: true });
  15. const fieldCheck_1 = require("./types/fieldCheck");
  16. /**
  17. * @class FieldCheck
  18. * @description 表单字段验证类
  19. * @property {Array<ruleItem>} ruleItems 验证规则
  20. * @property {function} addRuleItem 添加一条验证规则
  21. * @property {function} verify 检查表单是否符合规则
  22. * @example
  23. * let fieldCheck = new FieldCheck();
  24. * fieldCheck.addRuleItem('rule1',['name'],[
  25. * {
  26. * type: 'string',
  27. * minLength: 2,
  28. * maxLength: 10,
  29. * message: '姓名必须为2-10个字符'
  30. * }
  31. * ]);
  32. * fieldCheck.addRuleItem('rule2',['age'],[
  33. * {
  34. * type: 'number',
  35. * min: 18,
  36. * max: 100,
  37. * message: '年龄必须为18-100岁'
  38. * }]);
  39. * let errMsg = fieldCheck.verify({
  40. * name: 'kindring',
  41. * age: 18});
  42. * console.log(errMsg);
  43. * // null
  44. * let errMsg = fieldCheck.verify({
  45. * name: 'kindring',
  46. * age: 17});
  47. * console.log(errMsg);
  48. * // 年龄必须为18-100岁
  49. */
  50. class FieldCheck {
  51. /**
  52. *
  53. * @param {Array< ruleItem >} [ruleItems] 验证规则数组
  54. */
  55. constructor(ruleItems) {
  56. // 通过
  57. this.code_pass = fieldCheck_1.checkCode.code_pass;
  58. // 未通过
  59. this.code_notPass = fieldCheck_1.checkCode.code_notPass;
  60. // 无法匹配到验证规则
  61. this.code_notMatch = fieldCheck_1.checkCode.code_notMatch;
  62. /**
  63. * @type {Array< ruleItem >}
  64. */
  65. _FieldCheck_ruleItems.set(this, []);
  66. this._toString = Object.prototype.toString;
  67. __classPrivateFieldSet(this, _FieldCheck_ruleItems, [], "f");
  68. if (ruleItems && Array.isArray(ruleItems)) {
  69. // 使用 addRuleItem 添加规则
  70. for (const ruleItem of ruleItems) {
  71. this.addRuleItem(ruleItem.name || "", ruleItem.checkFields, ruleItem.rules);
  72. }
  73. }
  74. }
  75. /**
  76. * 判断值是否定义
  77. * @param v
  78. * @returns {boolean}
  79. * @private
  80. */
  81. _isDef(v) {
  82. return v !== undefined && v !== null;
  83. }
  84. /**
  85. * 判断是否为空
  86. * @param v 要检验的值
  87. */
  88. _isEmpty(v) {
  89. return v === undefined || v === '';
  90. }
  91. /**
  92. * 判断是否为正则
  93. * @param v 要检验的值
  94. */
  95. _isRegExp(v) {
  96. return this._toString.call(v) === '[object RegExp]';
  97. }
  98. /**
  99. * 构建验证规则
  100. * @param {Array<string | RegExp>} checkFields 需要验证的字段
  101. * @param {Array<validatorFunction | checkRule>} ruleArr 验证规则
  102. * @returns {ruleItem} 验证规则对象
  103. */
  104. buildRuleItem(name, checkFields, ruleArr) {
  105. // 检测checkFields是否为数组
  106. // 检测ruleArr是否为数组
  107. if (!Array.isArray(checkFields) || !Array.isArray(ruleArr)) {
  108. throw new Error('checkFields or ruleArr is not Array');
  109. }
  110. // 检测checkFields中的每一项是否为字符串或者正则
  111. for (let field of checkFields) {
  112. if (typeof field !== 'string' && !this._isRegExp(field)) {
  113. throw new Error('checkFields item is not string or RegExp');
  114. }
  115. }
  116. // 检测ruleArr中的每一项是否为函数或者对象
  117. for (let rule of ruleArr) {
  118. if (typeof rule !== 'function' && typeof rule !== 'object') {
  119. throw new Error('ruleArr item is not function or object');
  120. }
  121. }
  122. let ruleItem = {
  123. name: name || "",
  124. checkFields: checkFields,
  125. rules: ruleArr
  126. };
  127. // this.ruleItems = this.ruleItems.push(ruleItem);
  128. return ruleItem;
  129. }
  130. /**
  131. * 添加一条验证规则
  132. * @param ruleName 验证规则名,用于区分
  133. * @param checkFields 用于匹配字段的字符或者正则数组
  134. * @param ruleArr 验证规则
  135. * @returns 返回当前对象
  136. */
  137. addRuleItem(ruleName, checkFields, ruleArr) {
  138. let ruleItem = this.buildRuleItem(ruleName, checkFields, ruleArr);
  139. __classPrivateFieldGet(this, _FieldCheck_ruleItems, "f").push(ruleItem);
  140. return this;
  141. }
  142. /**
  143. * 获取验证规则
  144. * @param field 字段名
  145. * @returns 验证规则
  146. */
  147. getRuleItem(field) {
  148. return __classPrivateFieldGet(this, _FieldCheck_ruleItems, "f").find(item => {
  149. // 判断是否为正则
  150. for (const _matchKey of item.checkFields) {
  151. // 判断是否为正则
  152. if (this._isRegExp(_matchKey)) {
  153. // 确定为正则
  154. let reg = _matchKey;
  155. // console.log(`使用正则进行匹配,${_matchKey.test(key)}`);
  156. if (reg.test(field)) {
  157. // console.log(`通过正则匹配规则成功,${_matchKey.test(key)}`);
  158. return true;
  159. }
  160. }
  161. else {
  162. // console.log(`比较是否全等,${_matchKey} === ${key} ?${_matchKey === key}`);
  163. if (_matchKey === field) {
  164. // console.log(`通过字符${_matchKey}匹配成功`);
  165. return true;
  166. }
  167. }
  168. }
  169. return false;
  170. });
  171. }
  172. /**
  173. * 检查字段是否符合规则
  174. * @param field 字段名
  175. * @param value 字段值
  176. * @returns {Array<checkCode | ?errMessage>} 错误码或错误信息
  177. */
  178. checkField(field, value) {
  179. let ruleItem = this.getRuleItem(field);
  180. if (!ruleItem || !ruleItem.rules) {
  181. return [this.code_notMatch];
  182. }
  183. // 判断值是否为undefined
  184. if (value === undefined) {
  185. return [this.code_notPass, '字段值为undefined'];
  186. }
  187. // 开始匹配规则
  188. for (let _rule of ruleItem.rules) {
  189. // 判断是否有自定义验证函数
  190. if (typeof _rule === 'function') {
  191. let _msg = _rule(value);
  192. // console.log(_msg)
  193. if (_msg) {
  194. return [this.code_notPass, _msg];
  195. }
  196. }
  197. let rule = _rule;
  198. // 判断类型
  199. if (rule.type && typeof value !== rule.type) {
  200. return [this.code_notPass, rule.message];
  201. }
  202. // 判断是否为必填项
  203. if (rule.require && this._isEmpty(value)) {
  204. return [this.code_notPass, rule.message];
  205. }
  206. // 判断最小值
  207. if (rule.min && value < rule.min) {
  208. return [this.code_notPass, rule.message];
  209. }
  210. // 判断最大值
  211. if (rule.max && value > rule.max) {
  212. return [this.code_notPass, rule.message];
  213. }
  214. // 判断值是否达到指定长度
  215. if (rule.length && value.length && value.length !== rule.length) {
  216. return [this.code_notPass, rule.message];
  217. }
  218. // 判断最小长度
  219. if (rule.minLength && value.length && value.length < rule.minLength) {
  220. return [this.code_notPass, rule.message];
  221. }
  222. // 判断最大长度
  223. if (rule.maxLength && value.length && value.length > rule.maxLength) {
  224. return [this.code_notPass, rule.message];
  225. }
  226. // 判断是否符合正则
  227. if (rule.regex && !rule.regex.test(value)) {
  228. return [this.code_notPass, rule.message];
  229. }
  230. }
  231. return [this.code_pass];
  232. }
  233. /**
  234. * 检查表单是否符合规则
  235. * @param formObject 需要检验的表单项 字段:值
  236. * @param [isMustMatch] 是否强制要求匹配规则
  237. * @returns errMessage 错误码或错误信息
  238. */
  239. verify(formObject, isMustMatch = false) {
  240. for (const _oKey in formObject) {
  241. let value = formObject[_oKey];
  242. let r = this.checkField(_oKey, value);
  243. if (r[0] === this.code_notPass) {
  244. return r[1];
  245. }
  246. else if (isMustMatch && r[0] === this.code_notMatch) {
  247. return `字段没有对应匹配项`;
  248. }
  249. }
  250. }
  251. }
  252. _FieldCheck_ruleItems = new WeakMap();
  253. exports.default = FieldCheck;
  254. //# sourceMappingURL=fieldCheck.js.map