fieldCheck.js 9.4 KB

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