fieldCheck.js 9.6 KB

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