ph-utils 0.2.13 → 0.2.17

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,7 +2,7 @@
2
2
  * 数据验证器
3
3
  */
4
4
  interface RuleItem {
5
- rule: RegExp | ((v: any) => boolean);
5
+ rule: RegExp | ((v: any) => boolean) | 'required';
6
6
  message: string;
7
7
  sameKey?: string;
8
8
  }
@@ -12,6 +12,7 @@ export declare type RuleType = string | RegExp | ((v: any) => boolean) | (RegExp
12
12
  });
13
13
  export interface SchemaType {
14
14
  key: string;
15
+ required?: boolean;
15
16
  type?: string | ((v: any) => void);
16
17
  rules: RuleType[];
17
18
  }
@@ -22,9 +23,6 @@ declare class Validator {
22
23
  rules: {
23
24
  [index: string]: RuleItem[];
24
25
  };
25
- types: {
26
- [index: string]: string | ((v: any) => void);
27
- };
28
26
  /**
29
27
  * 构造数据验证转换器
30
28
  * @param schemas 配置验证转换规则
@@ -35,14 +33,13 @@ declare class Validator {
35
33
  * @param data 待验证的数据
36
34
  * @returns
37
35
  */
38
- validate<T>(data: any): Promise<unknown>;
36
+ validate(data: any): Promise<boolean>;
39
37
  /**
40
38
  * 只验证指定 key 的数据格式
41
39
  * @param key 指定待验证的 key
42
40
  * @param value 待验证的数据
43
41
  */
44
- validateKey(key: string, value: any): Promise<unknown>;
45
- private _conversionType;
42
+ validateKey(key: string, value: any): Promise<boolean>;
46
43
  private _validateRule;
47
44
  private _parseStringRule;
48
45
  }
package/lib/validator.js CHANGED
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
+ /* eslint-disable @typescript-eslint/ban-ts-comment */
2
3
  /**
3
4
  * 数据验证器
4
5
  */
@@ -9,8 +10,6 @@ const defaultMsgs = {
9
10
  required: '%s为必填字段',
10
11
  };
11
12
  const defaultMsg = '请输入正确的数据';
12
- // 允许的内置 type
13
- const validTypes = new Set(['string', 'boolean', 'number', 'float', 'int']);
14
13
  // 一些常用的验证正则
15
14
  const ruleRegexs = {
16
15
  /** 验证跟其余数据相等的正则,一般用于验证再次输入密码 */
@@ -34,23 +33,6 @@ const ruleFns = {
34
33
  return regex.test(String(val));
35
34
  },
36
35
  };
37
- const typeFns = {
38
- string(v) {
39
- return String(v);
40
- },
41
- boolean(v) {
42
- return Boolean(v);
43
- },
44
- number(v) {
45
- return Number(v);
46
- },
47
- int(v) {
48
- return parseInt(v, 10);
49
- },
50
- floag(v) {
51
- return parseFloat(v);
52
- },
53
- };
54
36
  class ValidateError extends Error {
55
37
  name;
56
38
  key;
@@ -65,22 +47,13 @@ class ValidateError extends Error {
65
47
  */
66
48
  class Validator {
67
49
  rules;
68
- types;
69
50
  /**
70
51
  * 构造数据验证转换器
71
52
  * @param schemas 配置验证转换规则
72
53
  */
73
54
  constructor(schemas) {
74
55
  let parsedRules = {};
75
- let types = {};
76
56
  for (let schema of schemas) {
77
- // 解析 types 用于进行数据类型转换
78
- if (typeof schema.type === 'function') {
79
- types[schema.key] = schema.type;
80
- }
81
- else {
82
- types[schema.key] = validTypes.has(schema.type || '') ? schema.type : 'string';
83
- }
84
57
  // 解析规则
85
58
  let rules = [];
86
59
  let rule = schema.rules;
@@ -90,17 +63,21 @@ class Validator {
90
63
  else if (rule instanceof Array) {
91
64
  for (let ruleItem of rule) {
92
65
  if (typeof ruleItem === 'string') {
93
- rules = rules.concat(this._parseStringRule(ruleItem));
66
+ rules.push(...this._parseStringRule(ruleItem));
94
67
  }
95
- else if (ruleItem instanceof RegExp || typeof ruleItem === 'function') {
68
+ else if (ruleItem instanceof RegExp ||
69
+ typeof ruleItem === 'function') {
96
70
  rules.push({ rule: ruleItem, message: defaultMsg });
97
71
  }
98
72
  else {
99
73
  if (typeof ruleItem.rule === 'string') {
100
- rules = rules.concat(this._parseStringRule(ruleItem.rule, ruleItem.message));
74
+ rules.push(...this._parseStringRule(ruleItem.rule, ruleItem.message));
101
75
  }
102
76
  else {
103
- rules.push({ rule: ruleItem.rule, message: ruleItem.message || defaultMsg });
77
+ rules.push({
78
+ rule: ruleItem.rule,
79
+ message: ruleItem.message || defaultMsg,
80
+ });
104
81
  }
105
82
  }
106
83
  }
@@ -108,9 +85,12 @@ class Validator {
108
85
  else {
109
86
  rules.push({ rule, message: defaultMsg });
110
87
  }
88
+ if (schema.required === true &&
89
+ rules.findIndex((r) => r.rule === 'required') === -1) {
90
+ rules.push(this._parseStringRule('required'));
91
+ }
111
92
  parsedRules[schema.key] = rules;
112
93
  }
113
- this.types = types;
114
94
  this.rules = parsedRules;
115
95
  }
116
96
  /**
@@ -122,14 +102,10 @@ class Validator {
122
102
  return new Promise((resolve, reject) => {
123
103
  let errMsg = '';
124
104
  let errKey = '';
125
- let resData = {};
126
105
  for (let key in this.rules) {
127
106
  if ({}.hasOwnProperty.call(this.rules, key)) {
128
107
  errMsg = this._validateRule(this.rules[key], data[key], data);
129
- if (errMsg === '') {
130
- resData[key] = this._conversionType(this.types[key], data[key]);
131
- }
132
- else {
108
+ if (errMsg !== '') {
133
109
  errKey = key;
134
110
  errMsg = errMsg.replace('%s', key);
135
111
  break;
@@ -137,7 +113,7 @@ class Validator {
137
113
  }
138
114
  }
139
115
  if (errMsg === '') {
140
- resolve(resData);
116
+ resolve(true);
141
117
  }
142
118
  else {
143
119
  reject(new ValidateError(errKey, errMsg));
@@ -153,41 +129,46 @@ class Validator {
153
129
  return new Promise((resolve, reject) => {
154
130
  let keyRules = this.rules[key];
155
131
  let errMsg = this._validateRule(keyRules, value, null);
156
- if (errMsg === '') {
157
- resolve(this._conversionType(this.types[key], value));
158
- }
159
- else {
132
+ if (errMsg !== '') {
160
133
  errMsg = errMsg.replace('%s', key);
161
134
  reject(new ValidateError(key, errMsg));
162
135
  }
136
+ else {
137
+ resolve(true);
138
+ }
163
139
  });
164
140
  }
165
- _conversionType(type, v) {
166
- if (typeof type === 'function') {
167
- return type(v);
168
- }
169
- else {
170
- return typeFns[type](v);
171
- }
172
- }
173
141
  _validateRule(rules, value, data) {
174
142
  let errMsg = '';
175
143
  for (let rule of rules) {
176
- if (typeof rule.rule === 'function') {
177
- if (!rule.rule(value)) {
144
+ // 如果数据为空,则判断是否是必填
145
+ if (value == null || !ruleFns.pattern(ruleRegexs.required, value)) {
146
+ if (rule.rule === 'required') {
178
147
  errMsg = rule.message;
179
148
  }
180
149
  }
181
- else if (rule.sameKey != null) {
182
- if (data != null) {
183
- if (!ruleFns.same(value, data[rule.sameKey])) {
150
+ else {
151
+ if (typeof rule.rule === 'function') {
152
+ if (!rule.rule(value)) {
184
153
  errMsg = rule.message;
185
154
  }
186
155
  }
187
- }
188
- else {
189
- if (!ruleFns.pattern(rule.rule, value)) {
190
- errMsg = rule.message;
156
+ else if (rule.sameKey != null) {
157
+ if (data != null) {
158
+ if (!ruleFns.same(value, data[rule.sameKey])) {
159
+ errMsg = rule.message;
160
+ }
161
+ }
162
+ }
163
+ else if (rule.rule === 'required') {
164
+ if (!ruleFns.pattern(ruleRegexs.required, String(value))) {
165
+ errMsg = rule.message;
166
+ }
167
+ }
168
+ else {
169
+ if (!ruleFns.pattern(rule.rule, String(value))) {
170
+ errMsg = rule.message;
171
+ }
191
172
  }
192
173
  }
193
174
  if (errMsg !== '') {
@@ -211,7 +192,11 @@ class Validator {
211
192
  message = defaultMsgs['same'];
212
193
  }
213
194
  }
214
- else if (ruleRegexs.hasOwnProperty(r)) {
195
+ else if (rule === 'required') {
196
+ rrule = 'required';
197
+ message = ruleErrMsg || defaultMsgs.required;
198
+ }
199
+ else if (Object.prototype.hasOwnProperty.call(ruleRegexs, r)) {
215
200
  rrule = ruleRegexs[r];
216
201
  message = defaultMsgs[r] || defaultMsg;
217
202
  }
@@ -2,7 +2,7 @@
2
2
  * 数据验证器
3
3
  */
4
4
  interface RuleItem {
5
- rule: RegExp | ((v: any) => boolean);
5
+ rule: RegExp | ((v: any) => boolean) | 'required';
6
6
  message: string;
7
7
  sameKey?: string;
8
8
  }
@@ -12,6 +12,7 @@ export declare type RuleType = string | RegExp | ((v: any) => boolean) | (RegExp
12
12
  });
13
13
  export interface SchemaType {
14
14
  key: string;
15
+ required?: boolean;
15
16
  type?: string | ((v: any) => void);
16
17
  rules: RuleType[];
17
18
  }
@@ -22,9 +23,6 @@ declare class Validator {
22
23
  rules: {
23
24
  [index: string]: RuleItem[];
24
25
  };
25
- types: {
26
- [index: string]: string | ((v: any) => void);
27
- };
28
26
  /**
29
27
  * 构造数据验证转换器
30
28
  * @param schemas 配置验证转换规则
@@ -35,14 +33,13 @@ declare class Validator {
35
33
  * @param data 待验证的数据
36
34
  * @returns
37
35
  */
38
- validate<T>(data: any): Promise<unknown>;
36
+ validate(data: any): Promise<boolean>;
39
37
  /**
40
38
  * 只验证指定 key 的数据格式
41
39
  * @param key 指定待验证的 key
42
40
  * @param value 待验证的数据
43
41
  */
44
- validateKey(key: string, value: any): Promise<unknown>;
45
- private _conversionType;
42
+ validateKey(key: string, value: any): Promise<boolean>;
46
43
  private _validateRule;
47
44
  private _parseStringRule;
48
45
  }
@@ -1,3 +1,4 @@
1
+ /* eslint-disable @typescript-eslint/ban-ts-comment */
1
2
  /**
2
3
  * 数据验证器
3
4
  */
@@ -8,8 +9,6 @@ const defaultMsgs = {
8
9
  required: '%s为必填字段',
9
10
  };
10
11
  const defaultMsg = '请输入正确的数据';
11
- // 允许的内置 type
12
- const validTypes = new Set(['string', 'boolean', 'number', 'float', 'int']);
13
12
  // 一些常用的验证正则
14
13
  const ruleRegexs = {
15
14
  /** 验证跟其余数据相等的正则,一般用于验证再次输入密码 */
@@ -33,23 +32,6 @@ const ruleFns = {
33
32
  return regex.test(String(val));
34
33
  },
35
34
  };
36
- const typeFns = {
37
- string(v) {
38
- return String(v);
39
- },
40
- boolean(v) {
41
- return Boolean(v);
42
- },
43
- number(v) {
44
- return Number(v);
45
- },
46
- int(v) {
47
- return parseInt(v, 10);
48
- },
49
- floag(v) {
50
- return parseFloat(v);
51
- },
52
- };
53
35
  class ValidateError extends Error {
54
36
  constructor(key, msg) {
55
37
  super(msg);
@@ -67,15 +49,7 @@ class Validator {
67
49
  */
68
50
  constructor(schemas) {
69
51
  let parsedRules = {};
70
- let types = {};
71
52
  for (let schema of schemas) {
72
- // 解析 types 用于进行数据类型转换
73
- if (typeof schema.type === 'function') {
74
- types[schema.key] = schema.type;
75
- }
76
- else {
77
- types[schema.key] = validTypes.has(schema.type || '') ? schema.type : 'string';
78
- }
79
53
  // 解析规则
80
54
  let rules = [];
81
55
  let rule = schema.rules;
@@ -85,17 +59,21 @@ class Validator {
85
59
  else if (rule instanceof Array) {
86
60
  for (let ruleItem of rule) {
87
61
  if (typeof ruleItem === 'string') {
88
- rules = rules.concat(this._parseStringRule(ruleItem));
62
+ rules.push(...this._parseStringRule(ruleItem));
89
63
  }
90
- else if (ruleItem instanceof RegExp || typeof ruleItem === 'function') {
64
+ else if (ruleItem instanceof RegExp ||
65
+ typeof ruleItem === 'function') {
91
66
  rules.push({ rule: ruleItem, message: defaultMsg });
92
67
  }
93
68
  else {
94
69
  if (typeof ruleItem.rule === 'string') {
95
- rules = rules.concat(this._parseStringRule(ruleItem.rule, ruleItem.message));
70
+ rules.push(...this._parseStringRule(ruleItem.rule, ruleItem.message));
96
71
  }
97
72
  else {
98
- rules.push({ rule: ruleItem.rule, message: ruleItem.message || defaultMsg });
73
+ rules.push({
74
+ rule: ruleItem.rule,
75
+ message: ruleItem.message || defaultMsg,
76
+ });
99
77
  }
100
78
  }
101
79
  }
@@ -103,9 +81,12 @@ class Validator {
103
81
  else {
104
82
  rules.push({ rule, message: defaultMsg });
105
83
  }
84
+ if (schema.required === true &&
85
+ rules.findIndex((r) => r.rule === 'required') === -1) {
86
+ rules.push(this._parseStringRule('required'));
87
+ }
106
88
  parsedRules[schema.key] = rules;
107
89
  }
108
- this.types = types;
109
90
  this.rules = parsedRules;
110
91
  }
111
92
  /**
@@ -117,14 +98,10 @@ class Validator {
117
98
  return new Promise((resolve, reject) => {
118
99
  let errMsg = '';
119
100
  let errKey = '';
120
- let resData = {};
121
101
  for (let key in this.rules) {
122
102
  if ({}.hasOwnProperty.call(this.rules, key)) {
123
103
  errMsg = this._validateRule(this.rules[key], data[key], data);
124
- if (errMsg === '') {
125
- resData[key] = this._conversionType(this.types[key], data[key]);
126
- }
127
- else {
104
+ if (errMsg !== '') {
128
105
  errKey = key;
129
106
  errMsg = errMsg.replace('%s', key);
130
107
  break;
@@ -132,7 +109,7 @@ class Validator {
132
109
  }
133
110
  }
134
111
  if (errMsg === '') {
135
- resolve(resData);
112
+ resolve(true);
136
113
  }
137
114
  else {
138
115
  reject(new ValidateError(errKey, errMsg));
@@ -148,41 +125,46 @@ class Validator {
148
125
  return new Promise((resolve, reject) => {
149
126
  let keyRules = this.rules[key];
150
127
  let errMsg = this._validateRule(keyRules, value, null);
151
- if (errMsg === '') {
152
- resolve(this._conversionType(this.types[key], value));
153
- }
154
- else {
128
+ if (errMsg !== '') {
155
129
  errMsg = errMsg.replace('%s', key);
156
130
  reject(new ValidateError(key, errMsg));
157
131
  }
132
+ else {
133
+ resolve(true);
134
+ }
158
135
  });
159
136
  }
160
- _conversionType(type, v) {
161
- if (typeof type === 'function') {
162
- return type(v);
163
- }
164
- else {
165
- return typeFns[type](v);
166
- }
167
- }
168
137
  _validateRule(rules, value, data) {
169
138
  let errMsg = '';
170
139
  for (let rule of rules) {
171
- if (typeof rule.rule === 'function') {
172
- if (!rule.rule(value)) {
140
+ // 如果数据为空,则判断是否是必填
141
+ if (value == null || !ruleFns.pattern(ruleRegexs.required, value)) {
142
+ if (rule.rule === 'required') {
173
143
  errMsg = rule.message;
174
144
  }
175
145
  }
176
- else if (rule.sameKey != null) {
177
- if (data != null) {
178
- if (!ruleFns.same(value, data[rule.sameKey])) {
146
+ else {
147
+ if (typeof rule.rule === 'function') {
148
+ if (!rule.rule(value)) {
179
149
  errMsg = rule.message;
180
150
  }
181
151
  }
182
- }
183
- else {
184
- if (!ruleFns.pattern(rule.rule, value)) {
185
- errMsg = rule.message;
152
+ else if (rule.sameKey != null) {
153
+ if (data != null) {
154
+ if (!ruleFns.same(value, data[rule.sameKey])) {
155
+ errMsg = rule.message;
156
+ }
157
+ }
158
+ }
159
+ else if (rule.rule === 'required') {
160
+ if (!ruleFns.pattern(ruleRegexs.required, String(value))) {
161
+ errMsg = rule.message;
162
+ }
163
+ }
164
+ else {
165
+ if (!ruleFns.pattern(rule.rule, String(value))) {
166
+ errMsg = rule.message;
167
+ }
186
168
  }
187
169
  }
188
170
  if (errMsg !== '') {
@@ -206,7 +188,11 @@ class Validator {
206
188
  message = defaultMsgs['same'];
207
189
  }
208
190
  }
209
- else if (ruleRegexs.hasOwnProperty(r)) {
191
+ else if (rule === 'required') {
192
+ rrule = 'required';
193
+ message = ruleErrMsg || defaultMsgs.required;
194
+ }
195
+ else if (Object.prototype.hasOwnProperty.call(ruleRegexs, r)) {
210
196
  rrule = ruleRegexs[r];
211
197
  message = defaultMsgs[r] || defaultMsg;
212
198
  }
@@ -216,5 +202,5 @@ class Validator {
216
202
  return rules;
217
203
  }
218
204
  }
219
- // @ts-ignore
205
+ // @ts-ignore: Unreachable code error
220
206
  export default Validator;
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "module": "lib/index_m.js",
6
6
  "types": "lib/index.d.ts",
7
7
  "browser": "lib/index_m.js",
8
- "version": "0.2.13",
8
+ "version": "0.2.17",
9
9
  "repository": {
10
10
  "type": "git",
11
11
  "url": "git+https//gitee.com/towardly/ph.git",