fieldCheck.js 9.7 KB

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