ph-utils 0.2.13 → 0.2.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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",