fieldCheck.js 9.3 KB

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