pols-validator 1.0.1 → 2.0.0
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.
- package/dist/index.d.ts +3 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -73
- package/dist/rules.d.ts +7 -4
- package/dist/rules.d.ts.map +1 -1
- package/dist/rules.js +130 -135
- package/dist/rulesEngine.d.ts +21 -10
- package/dist/rulesEngine.d.ts.map +1 -1
- package/dist/rulesEngine.js +69 -13
- package/dist/validate.d.ts +12 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +56 -0
- package/package.json +4 -3
- package/src/index.ts +3 -86
- package/src/rules.ts +143 -158
- package/src/rulesEngine.ts +87 -16
- package/test/validaciones.ts +7 -5
package/dist/validate.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validate = void 0;
|
|
4
|
+
const pols_utils_1 = require("pols-utils");
|
|
5
|
+
const validate = (target, rules) => {
|
|
6
|
+
const errorMessages = [];
|
|
7
|
+
if (typeof target == 'string')
|
|
8
|
+
target = target.trim();
|
|
9
|
+
const isEmpty = target == null || (typeof target == 'string' && !target);
|
|
10
|
+
const label = rules.label ?? 'Este valor';
|
|
11
|
+
if (rules.required && isEmpty) {
|
|
12
|
+
return {
|
|
13
|
+
error: true,
|
|
14
|
+
success: false,
|
|
15
|
+
messages: [`'${label}' es requerido`]
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
if (isEmpty) {
|
|
19
|
+
return {
|
|
20
|
+
error: false,
|
|
21
|
+
success: true,
|
|
22
|
+
result: rules.default
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
const wrapper = {
|
|
26
|
+
value: pols_utils_1.PUtils.clone(target),
|
|
27
|
+
label
|
|
28
|
+
};
|
|
29
|
+
for (const validationFunction of rules.collection) {
|
|
30
|
+
const result = validationFunction(wrapper);
|
|
31
|
+
if (!result)
|
|
32
|
+
continue;
|
|
33
|
+
if (typeof result == 'string') {
|
|
34
|
+
errorMessages.push(result);
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
errorMessages.push(...result);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (errorMessages.length) {
|
|
42
|
+
return {
|
|
43
|
+
error: true,
|
|
44
|
+
success: false,
|
|
45
|
+
messages: errorMessages
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
return {
|
|
50
|
+
error: false,
|
|
51
|
+
success: true,
|
|
52
|
+
result: wrapper.value
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
exports.validate = validate;
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pols-validator",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"module": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"scripts": {
|
|
8
8
|
"build": "npx tsc",
|
|
9
|
-
"test": "npx ts-node-dev -r tsconfig-paths/register --project tsconfig.json"
|
|
9
|
+
"test": "npx ts-node-dev -r tsconfig-paths/register --project tsconfig.json",
|
|
10
|
+
"export": "npm run build && npm publish"
|
|
10
11
|
},
|
|
11
12
|
"author": "Jean Paul Sánchez mendoza",
|
|
12
13
|
"license": "ISC",
|
|
@@ -21,6 +22,6 @@
|
|
|
21
22
|
"typescript-eslint": "^8.11.0"
|
|
22
23
|
},
|
|
23
24
|
"dependencies": {
|
|
24
|
-
"pols-utils": "^1.
|
|
25
|
+
"pols-utils": "^1.3.5"
|
|
25
26
|
}
|
|
26
27
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,87 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { RulesEngine, RulesParams, Wrapper } from "./rulesEngine"
|
|
4
|
-
export { RulesEngine } from './rulesEngine'
|
|
1
|
+
import { PRules } from "./rules"
|
|
2
|
+
import { PRulesParams } from "./rulesEngine"
|
|
5
3
|
|
|
6
|
-
export
|
|
7
|
-
error: false
|
|
8
|
-
success: true
|
|
9
|
-
result: T
|
|
10
|
-
} | {
|
|
11
|
-
error: true
|
|
12
|
-
success: false
|
|
13
|
-
messages: string[]
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export const validate = <T>(target: unknown, rules: RulesEngine): EvaluateResponse<T> => {
|
|
17
|
-
const errorMessages: string[] = []
|
|
18
|
-
|
|
19
|
-
if (typeof target == 'string') target = target.trim()
|
|
20
|
-
|
|
21
|
-
const isEmpty = target == null || (typeof target == 'string' && !target)
|
|
22
|
-
const label = rules.label ?? 'Este valor'
|
|
23
|
-
|
|
24
|
-
if (rules.required && isEmpty) {
|
|
25
|
-
return {
|
|
26
|
-
error: true,
|
|
27
|
-
success: false,
|
|
28
|
-
messages: [`'${label}' es requerido`]
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
if (isEmpty) {
|
|
33
|
-
return {
|
|
34
|
-
error: false,
|
|
35
|
-
success: true,
|
|
36
|
-
result: rules.default as T
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const wrapper: Wrapper<T> = {
|
|
41
|
-
value: PUtils.clone(target) as T,
|
|
42
|
-
label
|
|
43
|
-
}
|
|
44
|
-
for (const validationFunction of Object.values(rules.collection)) {
|
|
45
|
-
const result = validationFunction(wrapper)
|
|
46
|
-
if (!result) continue
|
|
47
|
-
if (typeof result == 'string') {
|
|
48
|
-
errorMessages.push(result)
|
|
49
|
-
break
|
|
50
|
-
} else {
|
|
51
|
-
if (wrapper.value == null || typeof wrapper.value != 'object') throw new Error(`El valor no es un objeto para ser validado contra un esquema: ${wrapper.value}`)
|
|
52
|
-
|
|
53
|
-
const newResult: Record<string, unknown> = {}
|
|
54
|
-
for (const key in result.schema) {
|
|
55
|
-
const rulesInside = result.schema[key]
|
|
56
|
-
const labelIndise = rulesInside.label ?? key
|
|
57
|
-
rulesInside.label = `${result.prefix ? `${result.prefix} ` : ''}${labelIndise}`
|
|
58
|
-
|
|
59
|
-
newResult[key] = wrapper.value[key]
|
|
60
|
-
|
|
61
|
-
const result2 = validate(newResult[key], rulesInside)
|
|
62
|
-
if (result2.error == true) {
|
|
63
|
-
errorMessages.push(...result2.messages)
|
|
64
|
-
} else {
|
|
65
|
-
newResult[key] = result2.result
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
wrapper.value = newResult as T
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
if (errorMessages.length) {
|
|
73
|
-
return {
|
|
74
|
-
error: true,
|
|
75
|
-
success: false,
|
|
76
|
-
messages: errorMessages
|
|
77
|
-
}
|
|
78
|
-
} else {
|
|
79
|
-
return {
|
|
80
|
-
error: false,
|
|
81
|
-
success: true,
|
|
82
|
-
result: wrapper.value
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
export const rules = (params?: RulesParams) => new Rules(params)
|
|
4
|
+
export const rules = (params?: PRulesParams) => new PRules(params)
|
package/src/rules.ts
CHANGED
|
@@ -1,9 +1,49 @@
|
|
|
1
1
|
import { PDate, PUtils } from "pols-utils"
|
|
2
|
-
import {
|
|
2
|
+
import { PRulesEngine, PRulesWrapper } from "./rulesEngine"
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
const isObject = (context: PRules, wrapper: PRulesWrapper, schema?: Record<string, PRules>) => {
|
|
5
|
+
const message = `'${wrapper.label}' debe ser un objeto`
|
|
6
|
+
|
|
7
|
+
if (typeof wrapper.value == 'string') {
|
|
8
|
+
try {
|
|
9
|
+
wrapper.value = JSON.parse(wrapper.value)
|
|
10
|
+
} catch {
|
|
11
|
+
return message
|
|
12
|
+
}
|
|
13
|
+
if (PUtils.getType(wrapper.value) != 'Object') return message
|
|
14
|
+
} else {
|
|
15
|
+
if (PUtils.getType(wrapper.value) != 'Object') {
|
|
16
|
+
return message
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/* Realiza la validación de cada propiedad */
|
|
21
|
+
const newWrapperValue: Record<string, unknown> = {}
|
|
22
|
+
const errorMessages: string[] = []
|
|
23
|
+
for (const key in schema) {
|
|
24
|
+
const rulesInside = schema[key]
|
|
25
|
+
const labelIndise = rulesInside.label ?? key
|
|
26
|
+
rulesInside.label = `${context.label ? `${context.label}${context.separator}` : ''}${labelIndise}`
|
|
27
|
+
|
|
28
|
+
newWrapperValue[key] = wrapper.value[key]
|
|
29
|
+
|
|
30
|
+
const result2 = rulesInside.validate(newWrapperValue[key])
|
|
31
|
+
if (result2.error == true) {
|
|
32
|
+
errorMessages.push(...result2.messages)
|
|
33
|
+
} else {
|
|
34
|
+
newWrapperValue[key] = result2.result
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (errorMessages.length) {
|
|
38
|
+
return errorMessages
|
|
39
|
+
} else {
|
|
40
|
+
wrapper.value = newWrapperValue
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export class PRules extends PRulesEngine {
|
|
5
45
|
isAlphanumeric() {
|
|
6
|
-
this.add(this.isAlphanumeric.name, (wrapper:
|
|
46
|
+
this.add(this.isAlphanumeric.name, (wrapper: PRulesWrapper) => {
|
|
7
47
|
if (typeof wrapper.value == 'number') {
|
|
8
48
|
wrapper.value = wrapper.value.toString()
|
|
9
49
|
} else if (typeof wrapper.value != 'string') {
|
|
@@ -15,14 +55,14 @@ export class Rules extends RulesEngine {
|
|
|
15
55
|
|
|
16
56
|
isEmailAddress() {
|
|
17
57
|
this.isAlphanumeric()
|
|
18
|
-
this.add(this.isEmailAddress.name, (wrapper:
|
|
58
|
+
this.add(this.isEmailAddress.name, (wrapper: PRulesWrapper) => {
|
|
19
59
|
if (!(wrapper.value as string).match(/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/)) return `'${wrapper.label}' debe ser una dirección de correo`
|
|
20
60
|
})
|
|
21
61
|
return this
|
|
22
62
|
}
|
|
23
63
|
|
|
24
64
|
isDateTime() {
|
|
25
|
-
this.add(this.isDateTime.name, (wrapper:
|
|
65
|
+
this.add(this.isDateTime.name, (wrapper: PRulesWrapper) => {
|
|
26
66
|
const message = `'${wrapper.label}' tiene un formato de fecha y hora no válido`
|
|
27
67
|
if (typeof wrapper.value == 'string' || typeof wrapper.value == 'number' || wrapper.value instanceof Date || wrapper.value instanceof PDate) {
|
|
28
68
|
const newDate = new PDate(wrapper.value)
|
|
@@ -36,13 +76,13 @@ export class Rules extends RulesEngine {
|
|
|
36
76
|
}
|
|
37
77
|
|
|
38
78
|
isDate() {
|
|
39
|
-
return this.isDateTime().add(this.isDate.name, (wrapper:
|
|
79
|
+
return this.isDateTime().add(this.isDate.name, (wrapper: PRulesWrapper<PDate>) => {
|
|
40
80
|
wrapper.value.clearTime()
|
|
41
81
|
})
|
|
42
82
|
}
|
|
43
83
|
|
|
44
84
|
isTime() {
|
|
45
|
-
this.add(this.isTime.name, (wrapper:
|
|
85
|
+
this.add(this.isTime.name, (wrapper: PRulesWrapper) => {
|
|
46
86
|
const message = `'${wrapper.label}' contiene un formato de hora no válido`
|
|
47
87
|
const value = wrapper.value.toString()
|
|
48
88
|
const parts = value.replace(/[.,]/g, ':').replace('m', '').match(/^([0-2]?[0-9])(:?)([0-5]?[0-9]?)(:?)([0-5]?[0-9]?)([ap]?)\.?m?\.?$/)
|
|
@@ -71,14 +111,14 @@ export class Rules extends RulesEngine {
|
|
|
71
111
|
|
|
72
112
|
match(pattern: RegExp) {
|
|
73
113
|
this.isAlphanumeric()
|
|
74
|
-
this.add(this.match.name, (wrapper:
|
|
114
|
+
this.add(this.match.name, (wrapper: PRulesWrapper) => {
|
|
75
115
|
if (!(wrapper.value as string).match(pattern)) return `'${wrapper.label}' no cumple con el formato de texto deseado`
|
|
76
116
|
})
|
|
77
117
|
return this
|
|
78
118
|
}
|
|
79
119
|
|
|
80
120
|
isNumber() {
|
|
81
|
-
this.add(this.isNumber.name, (wrapper:
|
|
121
|
+
this.add(this.isNumber.name, (wrapper: PRulesWrapper) => {
|
|
82
122
|
const message = `'${wrapper.label}' debe ser un número`
|
|
83
123
|
const value = Number(wrapper.value)
|
|
84
124
|
if (isNaN(value) || value == Infinity) return message
|
|
@@ -89,7 +129,7 @@ export class Rules extends RulesEngine {
|
|
|
89
129
|
|
|
90
130
|
isInteger() {
|
|
91
131
|
this.isNumber()
|
|
92
|
-
this.add(this.isInteger.name, (wrapper:
|
|
132
|
+
this.add(this.isInteger.name, (wrapper: PRulesWrapper) => {
|
|
93
133
|
if (wrapper.value != Math.floor(wrapper.value as number)) return `'${wrapper.label}' debe ser un número entero`
|
|
94
134
|
})
|
|
95
135
|
return this
|
|
@@ -105,120 +145,93 @@ export class Rules extends RulesEngine {
|
|
|
105
145
|
|
|
106
146
|
onlyNumbers() {
|
|
107
147
|
this.isAlphanumeric()
|
|
108
|
-
this.add(this.onlyNumbers.name, (wrapper:
|
|
148
|
+
this.add(this.onlyNumbers.name, (wrapper: PRulesWrapper) => {
|
|
109
149
|
if (!(wrapper.value as string).match(/^[0-9]+$/)) return `'${wrapper.label}' debe contener sólo números`
|
|
110
150
|
})
|
|
111
151
|
return this
|
|
112
152
|
}
|
|
113
153
|
|
|
114
154
|
maxLength(limit: number) {
|
|
115
|
-
this.
|
|
116
|
-
|
|
117
|
-
|
|
155
|
+
return this.add(this.maxLength.name, (wrapper: PRulesWrapper) => {
|
|
156
|
+
if (wrapper.value instanceof Array) {
|
|
157
|
+
return wrapper.value.length > limit ? `'${wrapper.label}' debe contener '${limit} ${limit == 1 ? 'elementos' : 'elementos'}' como máximo` : null
|
|
158
|
+
} else if (typeof wrapper.value == 'string') {
|
|
159
|
+
return wrapper.value.length > limit ? `'${wrapper.label}' debe contener '${limit} ${limit == 1 ? 'caracter' : 'caracteres'}' como máximo` : null
|
|
160
|
+
} else {
|
|
161
|
+
return `'${wrapper.label}' no es de un tipo válido`
|
|
162
|
+
}
|
|
118
163
|
})
|
|
119
|
-
return this
|
|
120
164
|
}
|
|
121
165
|
|
|
122
|
-
// maxCount(limit: number) {
|
|
123
|
-
// this.isArray()
|
|
124
|
-
// this.add(this.maxLength.name, (wrapper: Wrapper<unknown[]>) => {
|
|
125
|
-
// if (wrapper.value.length > limit) return `'${wrapper.label}' debe contener '${limit} ${limit == 1 ? 'elemento' : 'elementos'}' como máximo`
|
|
126
|
-
// })
|
|
127
|
-
// return this
|
|
128
|
-
// }
|
|
129
|
-
|
|
130
166
|
minLength(limit: number) {
|
|
131
|
-
this.
|
|
132
|
-
|
|
133
|
-
|
|
167
|
+
return this.add(this.minLength.name, (wrapper: PRulesWrapper) => {
|
|
168
|
+
if (wrapper.value instanceof Array) {
|
|
169
|
+
return wrapper.value.length < limit ? `'${wrapper.label}' debe contener '${limit} ${limit == 1 ? 'elementos' : 'elementos'}' como mínimo` : null
|
|
170
|
+
} else if (typeof wrapper.value == 'string') {
|
|
171
|
+
return wrapper.value.length < limit ? `'${wrapper.label}' debe contener '${limit} ${limit == 1 ? 'caracter' : 'caracteres'}' como mínimo` : null
|
|
172
|
+
} else {
|
|
173
|
+
return `'${wrapper.label}' no es de un tipo válido`
|
|
174
|
+
}
|
|
134
175
|
})
|
|
135
|
-
return this
|
|
136
176
|
}
|
|
137
177
|
|
|
138
|
-
|
|
139
|
-
this.
|
|
140
|
-
|
|
141
|
-
|
|
178
|
+
hasFixedLength(limit: number) {
|
|
179
|
+
return this.add(this.hasFixedLength.name, (wrapper: PRulesWrapper) => {
|
|
180
|
+
if (wrapper.value instanceof Array) {
|
|
181
|
+
return wrapper.value.length < limit ? `'${wrapper.label}' debe contener sólo '${limit} ${limit == 1 ? 'elementos' : 'elementos'}'` : null
|
|
182
|
+
} else if (typeof wrapper.value == 'string') {
|
|
183
|
+
return wrapper.value.length < limit ? `'${wrapper.label}' debe contener sólo '${limit} ${limit == 1 ? 'caracter' : 'caracteres'}'` : null
|
|
184
|
+
} else {
|
|
185
|
+
return `'${wrapper.label}' no es de un tipo válido`
|
|
186
|
+
}
|
|
142
187
|
})
|
|
143
|
-
return this
|
|
144
188
|
}
|
|
145
189
|
|
|
146
190
|
left(limit: number) {
|
|
147
|
-
this.isAlphanumeric()
|
|
148
|
-
this.add(this.length.name, (wrapper: Wrapper) => {
|
|
191
|
+
return this.isAlphanumeric().add(this.left.name, (wrapper: PRulesWrapper) => {
|
|
149
192
|
(wrapper.value as string) = (wrapper.value as string).substring(0, limit)
|
|
150
193
|
})
|
|
151
|
-
return this
|
|
152
194
|
}
|
|
153
195
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
// wrapper.value = result
|
|
191
|
-
// }
|
|
192
|
-
// }
|
|
193
|
-
// })
|
|
194
|
-
// return this
|
|
195
|
-
// }
|
|
196
|
-
|
|
197
|
-
// isArrayOfObjects(checkingElements?: (i: number) => FieldsStructure, prefixString?: (i: number) => string) {
|
|
198
|
-
// this.isArray()
|
|
199
|
-
// this.add(this.isArrayOfObjects.name, (wrapper: Wrapper<unknown[]>) => {
|
|
200
|
-
// const message = `'${wrapper.label}' debe ser una lista de objetos`
|
|
201
|
-
// const messages: string[] = []
|
|
202
|
-
// for (const [i, v] of wrapper.value.entries()) {
|
|
203
|
-
// const result = isObject(v)
|
|
204
|
-
// if (result.error == true) return message
|
|
205
|
-
// wrapper.value[i] = result.result
|
|
206
|
-
// if (checkingElements) {
|
|
207
|
-
// const v = wrapper.validator(wrapper.value[i], checkingElements(i), prefixString?.(i))
|
|
208
|
-
// if (v.error == true) {
|
|
209
|
-
// messages.push(...v.messages)
|
|
210
|
-
// } else {
|
|
211
|
-
// wrapper.value[i] = v.result
|
|
212
|
-
// }
|
|
213
|
-
// }
|
|
214
|
-
// }
|
|
215
|
-
// if (messages.length) return messages
|
|
216
|
-
// })
|
|
217
|
-
// return this
|
|
218
|
-
// }
|
|
196
|
+
isArray() {
|
|
197
|
+
return this.add(this.isArray.name, (wrapper: PRulesWrapper) => {
|
|
198
|
+
const message = `'${wrapper.label}' debe ser una lista de elementos`
|
|
199
|
+
if (typeof wrapper.value == 'string') {
|
|
200
|
+
try {
|
|
201
|
+
const value = JSON.parse(wrapper.value)
|
|
202
|
+
if (!(value instanceof Array)) return message
|
|
203
|
+
wrapper.value = value
|
|
204
|
+
} catch (err) {
|
|
205
|
+
return message
|
|
206
|
+
}
|
|
207
|
+
} else {
|
|
208
|
+
if (!(wrapper.value instanceof Array)) return message
|
|
209
|
+
}
|
|
210
|
+
})
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
isArrayOfObjects(schema?: (index: number) => Record<string, PRules>, prefix?: (index: number) => string) {
|
|
214
|
+
return this.isArray().add(this.isArrayOfObjects.name, (wrapper: PRulesWrapper<unknown[]>) => {
|
|
215
|
+
const messages: string[] = []
|
|
216
|
+
for (const [i, value] of wrapper.value.entries()) {
|
|
217
|
+
const v = isObject(this, {
|
|
218
|
+
label: prefix?.(i) ?? `Item ${i}`,
|
|
219
|
+
value
|
|
220
|
+
}, schema?.(i))
|
|
221
|
+
if (v) {
|
|
222
|
+
if (v instanceof Array) {
|
|
223
|
+
messages.push(...v)
|
|
224
|
+
} else {
|
|
225
|
+
messages.push(v)
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
if (messages.length) return messages
|
|
230
|
+
})
|
|
231
|
+
}
|
|
219
232
|
|
|
220
233
|
isIn(...elements: unknown[]) {
|
|
221
|
-
this.add(this.isIn.name, (wrapper:
|
|
234
|
+
this.add(this.isIn.name, (wrapper: PRulesWrapper) => {
|
|
222
235
|
if (wrapper.value instanceof Array) {
|
|
223
236
|
for (const v of wrapper.value) {
|
|
224
237
|
if (!elements.includes(v)) return `'${wrapper.label}' no contiene valores válidos`
|
|
@@ -231,84 +244,57 @@ export class Rules extends RulesEngine {
|
|
|
231
244
|
}
|
|
232
245
|
|
|
233
246
|
isNotIn(...elements: unknown[]) {
|
|
234
|
-
this.add(this.isNotIn.name, (wrapper:
|
|
247
|
+
this.add(this.isNotIn.name, (wrapper: PRulesWrapper) => {
|
|
235
248
|
if (elements.includes(wrapper.value)) return `'${wrapper.label}' no tiene un valor válido`
|
|
236
249
|
})
|
|
237
250
|
return this
|
|
238
251
|
}
|
|
239
252
|
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
// return this
|
|
246
|
-
// }
|
|
253
|
+
hasElements() {
|
|
254
|
+
return this.isArray().add(this.hasElements.name, (wrapper: PRulesWrapper<unknown[]>) => {
|
|
255
|
+
if (!wrapper.value.length) return `'${wrapper.label}' debe contenedor al menos un elemento`
|
|
256
|
+
})
|
|
257
|
+
}
|
|
247
258
|
|
|
248
259
|
gt(limit: number) {
|
|
249
|
-
this.isNumber()
|
|
250
|
-
this.add(this.gt.name, (wrapper: Wrapper) => {
|
|
260
|
+
return this.isNumber().add(this.gt.name, (wrapper: PRulesWrapper) => {
|
|
251
261
|
if (wrapper.value as number <= limit) return `'${wrapper.label}' debe ser mayor a '${limit}'`
|
|
252
262
|
})
|
|
253
|
-
return this
|
|
254
263
|
}
|
|
255
264
|
|
|
256
265
|
gte(limit: number) {
|
|
257
|
-
this.isNumber()
|
|
258
|
-
this.add(this.gte.name, (wrapper: Wrapper) => {
|
|
266
|
+
return this.isNumber().add(this.gte.name, (wrapper: PRulesWrapper) => {
|
|
259
267
|
if (wrapper.value as number < limit) return `'${wrapper.label}' debe ser mayor o igual a '${limit}'`
|
|
260
268
|
})
|
|
261
|
-
return this
|
|
262
269
|
}
|
|
263
270
|
|
|
264
271
|
lt(limit: number) {
|
|
265
|
-
this.isNumber()
|
|
266
|
-
this.add(this.lt.name, (wrapper: Wrapper) => {
|
|
272
|
+
return this.isNumber().add(this.lt.name, (wrapper: PRulesWrapper) => {
|
|
267
273
|
if (wrapper.value as number >= limit) return `'${wrapper.label}' debe ser menor a '${limit}'`
|
|
268
274
|
})
|
|
269
|
-
return this
|
|
270
275
|
}
|
|
271
276
|
|
|
272
277
|
lte(limit: number) {
|
|
273
|
-
return this
|
|
274
|
-
.
|
|
275
|
-
|
|
276
|
-
if (wrapper.value as number > limit) return `'${wrapper.label}' debe ser menor o igual a '${limit}'`
|
|
277
|
-
})
|
|
278
|
+
return this.isNumber().add(this.lte.name, (wrapper: PRulesWrapper) => {
|
|
279
|
+
if (wrapper.value as number > limit) return `'${wrapper.label}' debe ser menor o igual a '${limit}'`
|
|
280
|
+
})
|
|
278
281
|
}
|
|
279
282
|
|
|
280
283
|
beforeOrSameAsNow() {
|
|
281
|
-
return this
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
if (wrapper.value.time > now.time) return `'${wrapper.label}' debe ser anterior o igual a 'ahora'`
|
|
286
|
-
})
|
|
284
|
+
return this.isDateTime().add(this.beforeOrSameAsNow.name, (wrapper: PRulesWrapper<PDate>) => {
|
|
285
|
+
const now = new PDate
|
|
286
|
+
if (wrapper.value.time > now.time) return `'${wrapper.label}' debe ser anterior o igual a 'ahora'`
|
|
287
|
+
})
|
|
287
288
|
}
|
|
288
289
|
|
|
289
|
-
isObject(schema?: Record<string,
|
|
290
|
-
return this.add(this.isObject.name, (wrapper:
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
if (typeof wrapper.value == 'string') {
|
|
294
|
-
try {
|
|
295
|
-
wrapper.value = JSON.parse(wrapper.value)
|
|
296
|
-
} catch {
|
|
297
|
-
return message
|
|
298
|
-
}
|
|
299
|
-
if (PUtils.getType(wrapper.value) != 'Object') return message
|
|
300
|
-
} else {
|
|
301
|
-
if (PUtils.getType(wrapper.value) != 'Object') {
|
|
302
|
-
return message
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
return { schema, prefix }
|
|
290
|
+
isObject(schema?: Record<string, PRules>) {
|
|
291
|
+
return this.add(this.isObject.name, (wrapper: PRulesWrapper) => {
|
|
292
|
+
return isObject(this, wrapper, schema)
|
|
307
293
|
})
|
|
308
294
|
}
|
|
309
295
|
|
|
310
296
|
isBoolean() {
|
|
311
|
-
this.add(this.isBoolean.name, (wrapper:
|
|
297
|
+
return this.add(this.isBoolean.name, (wrapper: PRulesWrapper) => {
|
|
312
298
|
const message = `'${wrapper.label}' debe ser de tipo booleano`
|
|
313
299
|
if (typeof wrapper.value == 'string') {
|
|
314
300
|
const value = wrapper.value.trim().toUpperCase()
|
|
@@ -352,12 +338,11 @@ export class Rules extends RulesEngine {
|
|
|
352
338
|
return typeof wrapper.value == 'boolean' ? null : message
|
|
353
339
|
}
|
|
354
340
|
})
|
|
355
|
-
return this
|
|
356
341
|
}
|
|
357
342
|
|
|
358
343
|
upper() {
|
|
359
344
|
this.isAlphanumeric()
|
|
360
|
-
this.add(this.upper.name, (wrapper:
|
|
345
|
+
this.add(this.upper.name, (wrapper: PRulesWrapper) => {
|
|
361
346
|
wrapper.value = (wrapper.value as string).toUpperCase()
|
|
362
347
|
})
|
|
363
348
|
return this
|
|
@@ -365,7 +350,7 @@ export class Rules extends RulesEngine {
|
|
|
365
350
|
|
|
366
351
|
lower() {
|
|
367
352
|
this.isAlphanumeric()
|
|
368
|
-
this.add(this.lower.name, (wrapper:
|
|
353
|
+
this.add(this.lower.name, (wrapper: PRulesWrapper) => {
|
|
369
354
|
wrapper.value = (wrapper.value as string).toLowerCase()
|
|
370
355
|
})
|
|
371
356
|
return this
|
|
@@ -373,7 +358,7 @@ export class Rules extends RulesEngine {
|
|
|
373
358
|
|
|
374
359
|
decodeURI() {
|
|
375
360
|
this.isAlphanumeric()
|
|
376
|
-
this.add(this.decodeURI.name, (wrapper:
|
|
361
|
+
this.add(this.decodeURI.name, (wrapper: PRulesWrapper) => {
|
|
377
362
|
wrapper.value = decodeURI(wrapper.value as string)
|
|
378
363
|
})
|
|
379
364
|
return this
|
|
@@ -381,7 +366,7 @@ export class Rules extends RulesEngine {
|
|
|
381
366
|
|
|
382
367
|
round(decimals: number) {
|
|
383
368
|
this.isNumber()
|
|
384
|
-
this.add(this.round.name, (wrapper:
|
|
369
|
+
this.add(this.round.name, (wrapper: PRulesWrapper) => {
|
|
385
370
|
wrapper.value = PUtils.Number.round(wrapper.value as number, decimals)
|
|
386
371
|
})
|
|
387
372
|
return this
|
|
@@ -390,7 +375,7 @@ export class Rules extends RulesEngine {
|
|
|
390
375
|
/* Reemplaza todos los dobles (o más) espacios juntos por uno simple */
|
|
391
376
|
cleanDoubleSpaces() {
|
|
392
377
|
this.isAlphanumeric()
|
|
393
|
-
this.add(this.cleanDoubleSpaces.name, (wrapper:
|
|
378
|
+
this.add(this.cleanDoubleSpaces.name, (wrapper: PRulesWrapper) => {
|
|
394
379
|
wrapper.value = (wrapper.value as string).replace(/\s{2,}/g, ' ')
|
|
395
380
|
})
|
|
396
381
|
return this
|
|
@@ -398,7 +383,7 @@ export class Rules extends RulesEngine {
|
|
|
398
383
|
|
|
399
384
|
noSpaces() {
|
|
400
385
|
this.isAlphanumeric()
|
|
401
|
-
this.add(this.noSpaces.name, (wrapper:
|
|
386
|
+
this.add(this.noSpaces.name, (wrapper: PRulesWrapper) => {
|
|
402
387
|
if ((wrapper.value as string).match(/\s/)) return `'${wrapper.label}' no debe contener 'espacios'`
|
|
403
388
|
})
|
|
404
389
|
return this
|
|
@@ -406,21 +391,21 @@ export class Rules extends RulesEngine {
|
|
|
406
391
|
|
|
407
392
|
|
|
408
393
|
replace(search: string | RegExp, replace: string | ((substring: string, ...args: any[]) => string)) {
|
|
409
|
-
return this.isAlphanumeric().add(this.replace.name, (wrapper:
|
|
394
|
+
return this.isAlphanumeric().add(this.replace.name, (wrapper: PRulesWrapper) => {
|
|
410
395
|
wrapper.value = (wrapper.value as string).replace(search, replace as any)
|
|
411
396
|
})
|
|
412
397
|
}
|
|
413
398
|
|
|
414
399
|
capitalize() {
|
|
415
400
|
this.isAlphanumeric()
|
|
416
|
-
this.add(this.capitalize.name, (wrapper:
|
|
401
|
+
this.add(this.capitalize.name, (wrapper: PRulesWrapper) => {
|
|
417
402
|
wrapper.value = PUtils.String.capitalize(wrapper.value as string)
|
|
418
403
|
})
|
|
419
404
|
return this
|
|
420
405
|
}
|
|
421
406
|
|
|
422
407
|
split(separator: string | RegExp) {
|
|
423
|
-
return this.isAlphanumeric().add(this.split.name, (wrapper:
|
|
408
|
+
return this.isAlphanumeric().add(this.split.name, (wrapper: PRulesWrapper) => {
|
|
424
409
|
wrapper.value = (wrapper.value as any).split(separator)
|
|
425
410
|
})
|
|
426
411
|
}
|