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.
@@ -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": "1.0.1",
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.1.2"
25
+ "pols-utils": "^1.3.5"
25
26
  }
26
27
  }
package/src/index.ts CHANGED
@@ -1,87 +1,4 @@
1
- import { PUtils } from "pols-utils"
2
- import { Rules } from "./rules"
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 type EvaluateResponse<T> = {
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 { RulesEngine, Wrapper } from "./rulesEngine"
2
+ import { PRulesEngine, PRulesWrapper } from "./rulesEngine"
3
3
 
4
- export class Rules extends RulesEngine {
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: 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: 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: 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: Wrapper<PDate>) => {
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: 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: 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: 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: 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: 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.isAlphanumeric()
116
- this.add(this.maxLength.name, (wrapper: Wrapper) => {
117
- if ((wrapper.value as string).length > limit) return `'${wrapper.label}' debe contener '${limit} ${limit == 1 ? 'caracter' : 'caracteres'}' como máximo`
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.isAlphanumeric()
132
- this.add(this.minLength.name, (wrapper: Wrapper) => {
133
- if ((wrapper.value as string).length < limit) return `'${wrapper.label}' debe contener '${limit} ${limit == 1 ? 'caracter' : 'caracteres'}' como mínimo`
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
- length(limit: number) {
139
- this.isAlphanumeric()
140
- this.add(this.length.name, (wrapper: Wrapper) => {
141
- if ((wrapper.value as string).length != limit) return `'${wrapper.label}' debe contener sólo '${limit} ${limit == 1 ? 'caracter' : 'caracteres'}'`
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
- // isArray(checkingElements?: (i: number) => RulesEngine) {
155
- // this.add(this.isArray.name, (wrapper: Wrapper) => {
156
- // const message = `'${wrapper.label}' debe ser una lista de elementos`
157
- // if (typeof wrapper.value == 'string') {
158
- // try {
159
- // const value = JSON.parse(wrapper.value)
160
- // if (!(value instanceof Array)) return message
161
- // wrapper.value = value
162
- // } catch (err) {
163
- // return message
164
- // }
165
- // } else {
166
- // if (!(wrapper.value instanceof Array)) return message
167
- // }
168
- // if (checkingElements) {
169
- // const value = wrapper.value as unknown[]
170
- // const messageErrors: string[] = []
171
- // const result: unknown[] = []
172
- // for (const [i, t] of value.entries()) {
173
- // const p = wrapper.validator({
174
- // value: t
175
- // }, {
176
- // value: {
177
- // ...checkingElements(i),
178
- // to: undefined,
179
- // }
180
- // })
181
- // if (p.error == true) {
182
- // messageErrors.push(...p.messages)
183
- // } else {
184
- // result.push(p.result['value'])
185
- // }
186
- // }
187
- // if (messageErrors.length) {
188
- // return messageErrors
189
- // } else {
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: 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: 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
- // hasElements(checkingElements?: (i: number) => FieldStructure) {
241
- // this.isArray(checkingElements)
242
- // this.add(this.hasElements.name, (wrapper: Wrapper) => {
243
- // if (!(wrapper.value as unknown[]).length) return `'${wrapper.label}' debe ser una lista con al menos un elemento`
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
- .isNumber()
275
- .add(this.lte.name, (wrapper: Wrapper) => {
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
- .isDateTime()
283
- .add(this.beforeOrSameAsNow.name, (wrapper: Wrapper<PDate>) => {
284
- const now = new PDate
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, RulesEngine>, prefix?: string) {
290
- return this.add(this.isObject.name, (wrapper: Wrapper) => {
291
- const message = `'${wrapper.label}' debe ser un objeto`
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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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
  }