@regle/rules 0.4.4 → 0.4.6-beta.1
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/regle-rules.cjs +876 -0
- package/dist/regle-rules.mjs +839 -0
- package/index.cjs +7 -0
- package/index.js +7 -0
- package/package.json +29 -11
- /package/dist/{index.d.cts → regle-rules.d.cts} +0 -0
- /package/dist/{index.d.ts → regle-rules.d.ts} +0 -0
- /package/dist/{index.cjs → regle-rules.min.cjs} +0 -0
- /package/dist/{index.js → regle-rules.min.mjs} +0 -0
|
@@ -0,0 +1,876 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var core = require('@regle/core');
|
|
4
|
+
var vue = require('vue');
|
|
5
|
+
|
|
6
|
+
// src/helpers/withMessage.ts
|
|
7
|
+
function withMessage(rule, newMessage) {
|
|
8
|
+
let _type;
|
|
9
|
+
let validator;
|
|
10
|
+
let _active;
|
|
11
|
+
let _params;
|
|
12
|
+
if (typeof rule === "function" && !("_validator" in rule)) {
|
|
13
|
+
_type = core.InternalRuleType.Inline;
|
|
14
|
+
validator = rule;
|
|
15
|
+
} else {
|
|
16
|
+
({ _type, validator, _active, _params } = rule);
|
|
17
|
+
}
|
|
18
|
+
const newRule = core.createRule({
|
|
19
|
+
type: _type,
|
|
20
|
+
validator,
|
|
21
|
+
active: _active,
|
|
22
|
+
message: newMessage
|
|
23
|
+
});
|
|
24
|
+
const newParams = [..._params ?? []];
|
|
25
|
+
newRule._params = newParams;
|
|
26
|
+
newRule._message_patched = true;
|
|
27
|
+
if (typeof newRule === "function") {
|
|
28
|
+
const executedRule = newRule(...newParams);
|
|
29
|
+
executedRule._message_patched = true;
|
|
30
|
+
return executedRule;
|
|
31
|
+
} else {
|
|
32
|
+
return newRule;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function withTooltip(rule, newTooltip) {
|
|
36
|
+
let _type;
|
|
37
|
+
let validator;
|
|
38
|
+
let _active;
|
|
39
|
+
let _params;
|
|
40
|
+
let _message;
|
|
41
|
+
if (typeof rule === "function" && !("_validator" in rule)) {
|
|
42
|
+
_type = core.InternalRuleType.Inline;
|
|
43
|
+
validator = rule;
|
|
44
|
+
} else {
|
|
45
|
+
({ _type, validator, _active, _params, _message } = rule);
|
|
46
|
+
}
|
|
47
|
+
const newRule = core.createRule({
|
|
48
|
+
type: _type,
|
|
49
|
+
validator,
|
|
50
|
+
active: _active,
|
|
51
|
+
message: _message,
|
|
52
|
+
tooltip: newTooltip
|
|
53
|
+
});
|
|
54
|
+
const newParams = [..._params ?? []];
|
|
55
|
+
newRule._params = newParams;
|
|
56
|
+
newRule._tooltip_patched = true;
|
|
57
|
+
if (typeof newRule === "function") {
|
|
58
|
+
const executedRule = newRule(...newParams);
|
|
59
|
+
newRule._tooltip_patched = true;
|
|
60
|
+
return executedRule;
|
|
61
|
+
} else {
|
|
62
|
+
return newRule;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function withAsync(rule, depsArray) {
|
|
66
|
+
const validator = async (value, ...params) => {
|
|
67
|
+
return rule(value, ...params);
|
|
68
|
+
};
|
|
69
|
+
const newRule = core.createRule({
|
|
70
|
+
type: core.InternalRuleType.Async,
|
|
71
|
+
validator,
|
|
72
|
+
message: ""
|
|
73
|
+
});
|
|
74
|
+
newRule._params = newRule._params?.concat(depsArray);
|
|
75
|
+
return newRule(...depsArray ?? []);
|
|
76
|
+
}
|
|
77
|
+
function withParams(rule, depsArray) {
|
|
78
|
+
const validator = (value, ...params) => {
|
|
79
|
+
return rule(value, ...params);
|
|
80
|
+
};
|
|
81
|
+
const newRule = core.createRule({
|
|
82
|
+
type: core.InternalRuleType.Inline,
|
|
83
|
+
validator,
|
|
84
|
+
message: ""
|
|
85
|
+
});
|
|
86
|
+
newRule._params = newRule._params?.concat(depsArray);
|
|
87
|
+
return newRule(...depsArray);
|
|
88
|
+
}
|
|
89
|
+
function applyIf(_condition, rule) {
|
|
90
|
+
let _type;
|
|
91
|
+
let validator;
|
|
92
|
+
let _params = [];
|
|
93
|
+
let _message = "";
|
|
94
|
+
if (typeof rule === "function") {
|
|
95
|
+
_type = core.InternalRuleType.Inline;
|
|
96
|
+
validator = rule;
|
|
97
|
+
_params = [_condition];
|
|
98
|
+
} else {
|
|
99
|
+
({ _type, validator, _message } = rule);
|
|
100
|
+
_params = rule._params?.concat([_condition]);
|
|
101
|
+
}
|
|
102
|
+
function newValidator(value, ...args) {
|
|
103
|
+
const [condition] = core.unwrapRuleParameters([_condition]);
|
|
104
|
+
if (condition) {
|
|
105
|
+
return validator(value, ...args);
|
|
106
|
+
}
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
function newActive(metadata) {
|
|
110
|
+
const [condition] = core.unwrapRuleParameters([_condition]);
|
|
111
|
+
return condition;
|
|
112
|
+
}
|
|
113
|
+
const newRule = core.createRule({
|
|
114
|
+
type: _type,
|
|
115
|
+
validator: newValidator,
|
|
116
|
+
active: newActive,
|
|
117
|
+
message: _message
|
|
118
|
+
});
|
|
119
|
+
const newParams = [..._params ?? []];
|
|
120
|
+
newRule._params = newParams;
|
|
121
|
+
if (typeof newRule === "function") {
|
|
122
|
+
const executedRule = newRule(...newParams);
|
|
123
|
+
executedRule._message_patched = true;
|
|
124
|
+
return executedRule;
|
|
125
|
+
} else {
|
|
126
|
+
return newRule;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// ../shared/utils/isEmpty.ts
|
|
131
|
+
function isEmpty(value) {
|
|
132
|
+
if (value === void 0 || value === null) {
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
if (value instanceof Date) {
|
|
136
|
+
return isNaN(value.getTime());
|
|
137
|
+
}
|
|
138
|
+
if (Array.isArray(value)) {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
if (typeof value === "object" && value != null) {
|
|
142
|
+
return Object.keys(value).length === 0;
|
|
143
|
+
}
|
|
144
|
+
return !String(value).length;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// src/helpers/ruleHelpers/isFilled.ts
|
|
148
|
+
function isFilled(value) {
|
|
149
|
+
return !isEmpty(typeof value === "string" ? value.trim() : value);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// src/helpers/ruleHelpers/isNumber.ts
|
|
153
|
+
function isNumber(value) {
|
|
154
|
+
if (value == null) return false;
|
|
155
|
+
else if (typeof value !== "number") {
|
|
156
|
+
return false;
|
|
157
|
+
} else if (isNaN(value)) {
|
|
158
|
+
return false;
|
|
159
|
+
} else {
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// src/helpers/ruleHelpers/regex.ts
|
|
165
|
+
function regex(_value, ...expr) {
|
|
166
|
+
if (isEmpty(_value)) {
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
const value = typeof _value === "number" ? _value.toString() : _value;
|
|
170
|
+
return expr.every((reg) => {
|
|
171
|
+
reg.lastIndex = 0;
|
|
172
|
+
return reg.test(value);
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
function size(value) {
|
|
176
|
+
const _value = vue.unref(value);
|
|
177
|
+
if (Array.isArray(_value)) return _value.length;
|
|
178
|
+
if (typeof _value === "object") {
|
|
179
|
+
return Object.keys(_value).length;
|
|
180
|
+
}
|
|
181
|
+
if (typeof _value === "number") {
|
|
182
|
+
if (isNaN(_value)) {
|
|
183
|
+
return 0;
|
|
184
|
+
}
|
|
185
|
+
return _value;
|
|
186
|
+
}
|
|
187
|
+
return String(_value).length;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// src/helpers/ruleHelpers/isDate.ts
|
|
191
|
+
function isDate(value) {
|
|
192
|
+
if (isEmpty(value)) {
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
try {
|
|
196
|
+
let possibleDate = null;
|
|
197
|
+
if (value instanceof Date) {
|
|
198
|
+
possibleDate = value;
|
|
199
|
+
} else if (typeof value === "number" && !isNaN(value)) {
|
|
200
|
+
possibleDate = new Date(value);
|
|
201
|
+
} else if (typeof value === "string") {
|
|
202
|
+
const date = new Date(value);
|
|
203
|
+
if (date.toString() === "Invalid Date") {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
possibleDate = date;
|
|
207
|
+
}
|
|
208
|
+
return !!possibleDate;
|
|
209
|
+
} catch (e) {
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// src/helpers/ruleHelpers/toDate.ts
|
|
215
|
+
function toDate(argument) {
|
|
216
|
+
const argStr = Object.prototype.toString.call(argument);
|
|
217
|
+
if (argument == null) {
|
|
218
|
+
return /* @__PURE__ */ new Date(NaN);
|
|
219
|
+
} else if (argument instanceof Date || typeof argument === "object" && argStr === "[object Date]") {
|
|
220
|
+
return new Date(argument.getTime());
|
|
221
|
+
} else if (typeof argument === "number" || argStr === "[object Number]") {
|
|
222
|
+
return new Date(argument);
|
|
223
|
+
} else if (typeof argument === "string" || argStr === "[object String]") {
|
|
224
|
+
return new Date(argument);
|
|
225
|
+
} else {
|
|
226
|
+
return /* @__PURE__ */ new Date(NaN);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// src/helpers/ruleHelpers/toNumber.ts
|
|
231
|
+
function toNumber(argument) {
|
|
232
|
+
if (typeof argument === "number") {
|
|
233
|
+
return argument;
|
|
234
|
+
} else if (argument != null) {
|
|
235
|
+
if (typeof argument === "string") {
|
|
236
|
+
const isPadded = argument.trim() !== argument;
|
|
237
|
+
if (isPadded) {
|
|
238
|
+
return NaN;
|
|
239
|
+
}
|
|
240
|
+
return +argument;
|
|
241
|
+
}
|
|
242
|
+
return NaN;
|
|
243
|
+
}
|
|
244
|
+
return NaN;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// src/helpers/ruleHelpers/index.ts
|
|
248
|
+
var ruleHelpers = {
|
|
249
|
+
isEmpty,
|
|
250
|
+
isFilled,
|
|
251
|
+
size,
|
|
252
|
+
regex,
|
|
253
|
+
isNumber,
|
|
254
|
+
isDate,
|
|
255
|
+
toDate,
|
|
256
|
+
toNumber
|
|
257
|
+
};
|
|
258
|
+
function and(...rules) {
|
|
259
|
+
const isAnyRuleAsync = rules.some((rule) => {
|
|
260
|
+
if (typeof rule === "function") {
|
|
261
|
+
return rule.constructor.name === "AsyncFunction";
|
|
262
|
+
} else {
|
|
263
|
+
return rule._async;
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
const _params = rules.map((rule) => {
|
|
267
|
+
if (typeof rule === "function") {
|
|
268
|
+
return null;
|
|
269
|
+
} else {
|
|
270
|
+
const $params = rule._params;
|
|
271
|
+
if (!$params?.length) {
|
|
272
|
+
return [null];
|
|
273
|
+
} else {
|
|
274
|
+
return $params;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}).flat().filter((param) => !!param);
|
|
278
|
+
function computeRules(rules2, value, ...params) {
|
|
279
|
+
const $rules = [];
|
|
280
|
+
let paramIndex = 0;
|
|
281
|
+
for (let rule of rules2) {
|
|
282
|
+
if (typeof rule === "function") {
|
|
283
|
+
$rules.push(rule(value));
|
|
284
|
+
paramIndex++;
|
|
285
|
+
} else {
|
|
286
|
+
const paramsLength = rule._params?.length ?? 0;
|
|
287
|
+
$rules.push(rule.validator(value, ...params.slice(paramIndex, paramsLength)));
|
|
288
|
+
if (paramsLength) {
|
|
289
|
+
paramIndex += paramsLength;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return $rules;
|
|
294
|
+
}
|
|
295
|
+
function computeMetadata(results) {
|
|
296
|
+
const isAnyResultMetaData = results?.some((s) => typeof s !== "boolean");
|
|
297
|
+
if (isAnyResultMetaData) {
|
|
298
|
+
return {
|
|
299
|
+
$valid: results.every((result) => {
|
|
300
|
+
if (typeof result === "boolean") {
|
|
301
|
+
return !!result;
|
|
302
|
+
}
|
|
303
|
+
return result.$valid;
|
|
304
|
+
}),
|
|
305
|
+
...results.reduce((acc, result) => {
|
|
306
|
+
if (typeof result === "boolean") {
|
|
307
|
+
return acc;
|
|
308
|
+
}
|
|
309
|
+
const { $valid, ...rest } = result;
|
|
310
|
+
return { ...acc, ...rest };
|
|
311
|
+
}, {})
|
|
312
|
+
};
|
|
313
|
+
} else {
|
|
314
|
+
return results.every((result) => !!result);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
let validator;
|
|
318
|
+
if (!!rules.length) {
|
|
319
|
+
validator = isAnyRuleAsync ? async (value, ...params) => {
|
|
320
|
+
const results = await Promise.all(computeRules(rules, value, ...params));
|
|
321
|
+
return computeMetadata(results);
|
|
322
|
+
} : (value, ...params) => {
|
|
323
|
+
const $rules = computeRules(rules, value, ...params);
|
|
324
|
+
return computeMetadata($rules);
|
|
325
|
+
};
|
|
326
|
+
} else {
|
|
327
|
+
validator = (value) => {
|
|
328
|
+
return false;
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
const newRule = core.createRule({
|
|
332
|
+
type: "and",
|
|
333
|
+
validator,
|
|
334
|
+
message: "The value does not match all of the provided validators"
|
|
335
|
+
});
|
|
336
|
+
newRule._params = _params;
|
|
337
|
+
return newRule;
|
|
338
|
+
}
|
|
339
|
+
function or(...rules) {
|
|
340
|
+
const isAnyRuleAsync = rules.some((rule) => {
|
|
341
|
+
if (typeof rule === "function") {
|
|
342
|
+
return rule.constructor.name === "AsyncFunction";
|
|
343
|
+
} else {
|
|
344
|
+
return rule._async;
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
const params = rules.map((rule) => {
|
|
348
|
+
if (typeof rule === "function") {
|
|
349
|
+
return null;
|
|
350
|
+
} else {
|
|
351
|
+
return rule._params;
|
|
352
|
+
}
|
|
353
|
+
}).flat().filter((param) => !!param);
|
|
354
|
+
function computeRules(rules2, value, ...params2) {
|
|
355
|
+
const $rules = [];
|
|
356
|
+
let paramIndex = 0;
|
|
357
|
+
for (let rule of rules2) {
|
|
358
|
+
if (typeof rule === "function") {
|
|
359
|
+
$rules.push(rule(value));
|
|
360
|
+
paramIndex++;
|
|
361
|
+
} else {
|
|
362
|
+
const paramsLength = rule._params?.length ?? 0;
|
|
363
|
+
$rules.push(rule.validator(value, ...params2.slice(paramIndex, paramsLength)));
|
|
364
|
+
if (paramsLength) {
|
|
365
|
+
paramIndex += paramsLength;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
return $rules;
|
|
370
|
+
}
|
|
371
|
+
function computeMetadata(results) {
|
|
372
|
+
const isAnyResultMetaData = results.some((s) => typeof s !== "boolean");
|
|
373
|
+
if (isAnyResultMetaData) {
|
|
374
|
+
return {
|
|
375
|
+
$valid: results.some((result) => {
|
|
376
|
+
if (typeof result === "boolean") {
|
|
377
|
+
return !!result;
|
|
378
|
+
}
|
|
379
|
+
return result.$valid;
|
|
380
|
+
}),
|
|
381
|
+
...results.reduce((acc, result) => {
|
|
382
|
+
if (typeof result === "boolean") {
|
|
383
|
+
return acc;
|
|
384
|
+
}
|
|
385
|
+
const { $valid, ...rest } = result;
|
|
386
|
+
return { ...acc, ...rest };
|
|
387
|
+
}, {})
|
|
388
|
+
};
|
|
389
|
+
} else {
|
|
390
|
+
return results.some((result) => !!result);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
const validator = isAnyRuleAsync ? async (value, ...params2) => {
|
|
394
|
+
const results = await Promise.all(computeRules(rules, value, ...params2));
|
|
395
|
+
return computeMetadata(results);
|
|
396
|
+
} : (value, ...params2) => {
|
|
397
|
+
const $rules = computeRules(rules, value, ...params2);
|
|
398
|
+
return computeMetadata($rules);
|
|
399
|
+
};
|
|
400
|
+
const newRule = core.createRule({
|
|
401
|
+
type: "or",
|
|
402
|
+
validator,
|
|
403
|
+
message: "The value does not match any of the provided validators"
|
|
404
|
+
});
|
|
405
|
+
newRule._params = params;
|
|
406
|
+
return newRule;
|
|
407
|
+
}
|
|
408
|
+
function not(rule, message) {
|
|
409
|
+
let _type;
|
|
410
|
+
let validator;
|
|
411
|
+
let newValidator;
|
|
412
|
+
let _params;
|
|
413
|
+
let _async;
|
|
414
|
+
if (typeof rule === "function") {
|
|
415
|
+
validator = rule;
|
|
416
|
+
_async = rule.constructor.name === "AsyncFunction";
|
|
417
|
+
} else {
|
|
418
|
+
({ _type, validator, _params } = rule);
|
|
419
|
+
_async = rule._async;
|
|
420
|
+
}
|
|
421
|
+
if (_async) {
|
|
422
|
+
newValidator = async (value, ...params) => {
|
|
423
|
+
if (ruleHelpers.isFilled(value)) {
|
|
424
|
+
const result = await validator(value, ...params);
|
|
425
|
+
return !result;
|
|
426
|
+
}
|
|
427
|
+
return true;
|
|
428
|
+
};
|
|
429
|
+
} else {
|
|
430
|
+
newValidator = (value, ...params) => {
|
|
431
|
+
if (ruleHelpers.isFilled(value)) {
|
|
432
|
+
return !validator(value, ...params);
|
|
433
|
+
}
|
|
434
|
+
return true;
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
const newRule = core.createRule({
|
|
438
|
+
type: "not",
|
|
439
|
+
validator: newValidator,
|
|
440
|
+
message: message ?? "Error"
|
|
441
|
+
});
|
|
442
|
+
newRule._params = _params;
|
|
443
|
+
return newRule;
|
|
444
|
+
}
|
|
445
|
+
var required = core.createRule({
|
|
446
|
+
type: "required",
|
|
447
|
+
validator: (value) => {
|
|
448
|
+
return ruleHelpers.isFilled(value);
|
|
449
|
+
},
|
|
450
|
+
message: "This field is required"
|
|
451
|
+
});
|
|
452
|
+
var maxLength = core.createRule({
|
|
453
|
+
type: "maxLength",
|
|
454
|
+
validator: (value, count) => {
|
|
455
|
+
if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(count)) {
|
|
456
|
+
if (ruleHelpers.isNumber(count)) {
|
|
457
|
+
return ruleHelpers.size(value) <= count;
|
|
458
|
+
}
|
|
459
|
+
console.warn(`[maxLength] Value or parameter isn't a number, got value: ${value}, parameter: ${count}`);
|
|
460
|
+
return false;
|
|
461
|
+
}
|
|
462
|
+
return true;
|
|
463
|
+
},
|
|
464
|
+
message: ({ $value, $params: [count] }) => {
|
|
465
|
+
if (Array.isArray($value)) {
|
|
466
|
+
return `This list should have maximum ${count} items`;
|
|
467
|
+
}
|
|
468
|
+
return `The maximum length allowed is ${count}`;
|
|
469
|
+
}
|
|
470
|
+
});
|
|
471
|
+
var requiredIf = core.createRule({
|
|
472
|
+
type: "required",
|
|
473
|
+
validator(value, condition) {
|
|
474
|
+
if (condition) {
|
|
475
|
+
return ruleHelpers.isFilled(value);
|
|
476
|
+
}
|
|
477
|
+
return true;
|
|
478
|
+
},
|
|
479
|
+
message: "This field is required",
|
|
480
|
+
active({ $params: [condition] }) {
|
|
481
|
+
return condition;
|
|
482
|
+
}
|
|
483
|
+
});
|
|
484
|
+
var alphaRegex = /^[a-zA-Z]*$/;
|
|
485
|
+
var alpha = core.createRule({
|
|
486
|
+
type: "alpha",
|
|
487
|
+
validator(value) {
|
|
488
|
+
if (ruleHelpers.isEmpty(value)) {
|
|
489
|
+
return true;
|
|
490
|
+
}
|
|
491
|
+
return ruleHelpers.regex(value, alphaRegex);
|
|
492
|
+
},
|
|
493
|
+
message: "The value is not alphabetical"
|
|
494
|
+
});
|
|
495
|
+
var alphaNumRegex = /^[a-zA-Z0-9]*$/;
|
|
496
|
+
var alphaNum = core.createRule({
|
|
497
|
+
type: "alpha",
|
|
498
|
+
validator(value) {
|
|
499
|
+
if (ruleHelpers.isEmpty(value)) {
|
|
500
|
+
return true;
|
|
501
|
+
}
|
|
502
|
+
return ruleHelpers.regex(value, alphaNumRegex);
|
|
503
|
+
},
|
|
504
|
+
message: "The value must be alpha-numeric"
|
|
505
|
+
});
|
|
506
|
+
var between = core.createRule({
|
|
507
|
+
type: "between",
|
|
508
|
+
validator: (value, min, max) => {
|
|
509
|
+
if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(min) && ruleHelpers.isFilled(max)) {
|
|
510
|
+
const tValue = ruleHelpers.toNumber(value);
|
|
511
|
+
const tMin = ruleHelpers.toNumber(min);
|
|
512
|
+
const tMax = ruleHelpers.toNumber(max);
|
|
513
|
+
if (ruleHelpers.isNumber(tValue) && ruleHelpers.isNumber(tMin) && ruleHelpers.isNumber(tMax)) {
|
|
514
|
+
return tValue >= tMin && tValue <= tMax;
|
|
515
|
+
}
|
|
516
|
+
console.warn(`[between] Value or parameters aren't numbers, got value: ${value}, min: ${min}, max: ${max}`);
|
|
517
|
+
return false;
|
|
518
|
+
}
|
|
519
|
+
return true;
|
|
520
|
+
},
|
|
521
|
+
message: ({ $params: [min, max] }) => {
|
|
522
|
+
return `The value must be between ${min} and ${max}`;
|
|
523
|
+
}
|
|
524
|
+
});
|
|
525
|
+
var decimalRegex = /^[-]?\d*(\.\d+)?$/;
|
|
526
|
+
var decimal = core.createRule({
|
|
527
|
+
type: "decimal",
|
|
528
|
+
validator(value) {
|
|
529
|
+
if (ruleHelpers.isEmpty(value)) {
|
|
530
|
+
return true;
|
|
531
|
+
}
|
|
532
|
+
return ruleHelpers.regex(value, decimalRegex);
|
|
533
|
+
},
|
|
534
|
+
message: "Value must be decimal"
|
|
535
|
+
});
|
|
536
|
+
var emailRegex = /^(?:[A-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[A-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9]{2,}(?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/i;
|
|
537
|
+
var email = core.createRule({
|
|
538
|
+
type: "email",
|
|
539
|
+
validator(value) {
|
|
540
|
+
if (ruleHelpers.isEmpty(value)) {
|
|
541
|
+
return true;
|
|
542
|
+
}
|
|
543
|
+
return ruleHelpers.regex(value, emailRegex);
|
|
544
|
+
},
|
|
545
|
+
message: "Value must be an valid email address"
|
|
546
|
+
});
|
|
547
|
+
var integerRegex = /(^[0-9]*$)|(^-[0-9]+$)/;
|
|
548
|
+
var integer = core.createRule({
|
|
549
|
+
type: "integer",
|
|
550
|
+
validator(value) {
|
|
551
|
+
if (ruleHelpers.isEmpty(value)) {
|
|
552
|
+
return true;
|
|
553
|
+
}
|
|
554
|
+
return ruleHelpers.regex(value, integerRegex);
|
|
555
|
+
},
|
|
556
|
+
message: "Value must be an integer"
|
|
557
|
+
});
|
|
558
|
+
var maxValue = core.createRule({
|
|
559
|
+
type: "maxValue",
|
|
560
|
+
validator: (value, count) => {
|
|
561
|
+
if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(count)) {
|
|
562
|
+
if (ruleHelpers.isNumber(count) && !isNaN(toNumber(value))) {
|
|
563
|
+
return toNumber(value) <= count;
|
|
564
|
+
}
|
|
565
|
+
console.warn(`[maxValue] Value or parameter isn't a number, got value: ${value}, parameter: ${count}`);
|
|
566
|
+
return true;
|
|
567
|
+
}
|
|
568
|
+
return true;
|
|
569
|
+
},
|
|
570
|
+
message: ({ $params: [count] }) => {
|
|
571
|
+
return `The maximum value allowed is ${count}`;
|
|
572
|
+
}
|
|
573
|
+
});
|
|
574
|
+
var minLength = core.createRule({
|
|
575
|
+
type: "minLength",
|
|
576
|
+
validator: (value, count) => {
|
|
577
|
+
if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(count)) {
|
|
578
|
+
if (ruleHelpers.isNumber(count)) {
|
|
579
|
+
return ruleHelpers.size(value) >= count;
|
|
580
|
+
}
|
|
581
|
+
console.warn(`[minLength] Parameter isn't a number, got parameter: ${count}`);
|
|
582
|
+
return false;
|
|
583
|
+
}
|
|
584
|
+
return true;
|
|
585
|
+
},
|
|
586
|
+
message: ({ $value, $params: [count] }) => {
|
|
587
|
+
if (Array.isArray($value)) {
|
|
588
|
+
return `This list should have at least ${count} items`;
|
|
589
|
+
}
|
|
590
|
+
return `This field should be at least ${count} characters long`;
|
|
591
|
+
}
|
|
592
|
+
});
|
|
593
|
+
var minValue = core.createRule({
|
|
594
|
+
type: "minValue",
|
|
595
|
+
validator: (value, count) => {
|
|
596
|
+
if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(count)) {
|
|
597
|
+
if (ruleHelpers.isNumber(count) && !isNaN(toNumber(value))) {
|
|
598
|
+
return toNumber(value) >= count;
|
|
599
|
+
}
|
|
600
|
+
console.warn(`[minValue] Value or parameter isn't a number, got value: ${value}, parameter: ${count}`);
|
|
601
|
+
return true;
|
|
602
|
+
}
|
|
603
|
+
return true;
|
|
604
|
+
},
|
|
605
|
+
message: ({ $params: [count] }) => {
|
|
606
|
+
return `The minimum value allowed is ${count}`;
|
|
607
|
+
}
|
|
608
|
+
});
|
|
609
|
+
var exactLength = core.createRule({
|
|
610
|
+
type: "exactLength",
|
|
611
|
+
validator: (value, count) => {
|
|
612
|
+
if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(count)) {
|
|
613
|
+
if (ruleHelpers.isNumber(count)) {
|
|
614
|
+
return ruleHelpers.size(value) === count;
|
|
615
|
+
}
|
|
616
|
+
console.warn(`[minLength] Parameter isn't a number, got parameter: ${count}`);
|
|
617
|
+
return false;
|
|
618
|
+
}
|
|
619
|
+
return true;
|
|
620
|
+
},
|
|
621
|
+
message: ({ $params: [count] }) => {
|
|
622
|
+
return `This field should be exactly ${count} characters long`;
|
|
623
|
+
}
|
|
624
|
+
});
|
|
625
|
+
var numericRegex = /^\d*(\.\d+)?$/;
|
|
626
|
+
var numeric = core.createRule({
|
|
627
|
+
type: "numeric",
|
|
628
|
+
validator(value) {
|
|
629
|
+
if (ruleHelpers.isEmpty(value)) {
|
|
630
|
+
return true;
|
|
631
|
+
}
|
|
632
|
+
return ruleHelpers.regex(value, numericRegex);
|
|
633
|
+
},
|
|
634
|
+
message: "This field must be numeric"
|
|
635
|
+
});
|
|
636
|
+
var requiredUnless = core.createRule({
|
|
637
|
+
type: "required",
|
|
638
|
+
validator(value, condition) {
|
|
639
|
+
if (!condition) {
|
|
640
|
+
return ruleHelpers.isFilled(value);
|
|
641
|
+
}
|
|
642
|
+
return true;
|
|
643
|
+
},
|
|
644
|
+
message: "This field is required",
|
|
645
|
+
active({ $params: [condition] }) {
|
|
646
|
+
return !condition;
|
|
647
|
+
}
|
|
648
|
+
});
|
|
649
|
+
var sameAs = core.createRule({
|
|
650
|
+
type: "sameAs",
|
|
651
|
+
validator(value, target, otherName = "other") {
|
|
652
|
+
if (ruleHelpers.isEmpty(value)) {
|
|
653
|
+
return true;
|
|
654
|
+
}
|
|
655
|
+
return value === target;
|
|
656
|
+
},
|
|
657
|
+
message({ $params: [_, otherName] }) {
|
|
658
|
+
return `Value must be equal to the ${otherName} value`;
|
|
659
|
+
}
|
|
660
|
+
});
|
|
661
|
+
var urlRegex = /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[/?#]\S*)?$/i;
|
|
662
|
+
var url = core.createRule({
|
|
663
|
+
type: "url",
|
|
664
|
+
validator(value) {
|
|
665
|
+
if (ruleHelpers.isEmpty(value)) {
|
|
666
|
+
return true;
|
|
667
|
+
}
|
|
668
|
+
return ruleHelpers.regex(value, urlRegex);
|
|
669
|
+
},
|
|
670
|
+
message: "The value is not a valid URL address"
|
|
671
|
+
});
|
|
672
|
+
|
|
673
|
+
// src/utils/getLocale.util.ts
|
|
674
|
+
function getUserLocale() {
|
|
675
|
+
if (navigator.languages != void 0) return navigator.languages[0];
|
|
676
|
+
return navigator.language;
|
|
677
|
+
}
|
|
678
|
+
function formatLocaleDate(date) {
|
|
679
|
+
if (date) {
|
|
680
|
+
return new Intl.DateTimeFormat(getUserLocale(), { dateStyle: "short" }).format(new Date(date));
|
|
681
|
+
}
|
|
682
|
+
return "?";
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
// src/rules/dateAfter.ts
|
|
686
|
+
var dateAfter = core.createRule({
|
|
687
|
+
type: "dateAfter",
|
|
688
|
+
validator: (value, after) => {
|
|
689
|
+
if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(after)) {
|
|
690
|
+
if (ruleHelpers.isDate(value) && ruleHelpers.isDate(after)) {
|
|
691
|
+
const result = ruleHelpers.toDate(value).getTime() > ruleHelpers.toDate(after).getTime();
|
|
692
|
+
if (result) {
|
|
693
|
+
return true;
|
|
694
|
+
}
|
|
695
|
+
return { $valid: false, error: "date-not-after" };
|
|
696
|
+
}
|
|
697
|
+
return { $valid: false, error: "value-or-paramater-not-a-date" };
|
|
698
|
+
}
|
|
699
|
+
return true;
|
|
700
|
+
},
|
|
701
|
+
message: ({ $params: [after], error }) => {
|
|
702
|
+
if (error === "value-or-paramater-not-a-date") {
|
|
703
|
+
return "The inputs must be Dates";
|
|
704
|
+
}
|
|
705
|
+
return `The date must be after ${formatLocaleDate(after)}`;
|
|
706
|
+
}
|
|
707
|
+
});
|
|
708
|
+
var dateBefore = core.createRule({
|
|
709
|
+
type: "dateBefore",
|
|
710
|
+
validator: (value, before) => {
|
|
711
|
+
if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(before)) {
|
|
712
|
+
if (ruleHelpers.isDate(value) && ruleHelpers.isDate(before)) {
|
|
713
|
+
const result = ruleHelpers.toDate(value).getTime() < ruleHelpers.toDate(before).getTime();
|
|
714
|
+
if (result) {
|
|
715
|
+
return true;
|
|
716
|
+
}
|
|
717
|
+
return { $valid: false, error: "date-not-before" };
|
|
718
|
+
}
|
|
719
|
+
return { $valid: false, error: "value-or-paramater-not-a-date" };
|
|
720
|
+
}
|
|
721
|
+
return true;
|
|
722
|
+
},
|
|
723
|
+
message: ({ $params: [before], error }) => {
|
|
724
|
+
if (error === "value-or-paramater-not-a-date") {
|
|
725
|
+
return "The fields must be Dates";
|
|
726
|
+
}
|
|
727
|
+
return `The date must be before ${formatLocaleDate(before)}`;
|
|
728
|
+
}
|
|
729
|
+
});
|
|
730
|
+
var dateBetween = core.createRule({
|
|
731
|
+
type: "dateBetween",
|
|
732
|
+
validator: (value, before, after) => {
|
|
733
|
+
if (ruleHelpers.isDate(value) && ruleHelpers.isDate(before) && ruleHelpers.isDate(after)) {
|
|
734
|
+
return ruleHelpers.toDate(value).getTime() > ruleHelpers.toDate(before).getTime() && ruleHelpers.toDate(value).getTime() < ruleHelpers.toDate(after).getTime();
|
|
735
|
+
}
|
|
736
|
+
return true;
|
|
737
|
+
},
|
|
738
|
+
message: ({ $params: [before, after] }) => {
|
|
739
|
+
return `The date must be between ${formatLocaleDate(before)} and ${formatLocaleDate(after)}`;
|
|
740
|
+
}
|
|
741
|
+
});
|
|
742
|
+
function nibbleValid(nibble) {
|
|
743
|
+
if (nibble.length > 3 || nibble.length === 0) {
|
|
744
|
+
return false;
|
|
745
|
+
}
|
|
746
|
+
if (nibble[0] === "0" && nibble !== "0") {
|
|
747
|
+
return false;
|
|
748
|
+
}
|
|
749
|
+
if (!nibble.match(/^\d+$/)) {
|
|
750
|
+
return false;
|
|
751
|
+
}
|
|
752
|
+
const numeric2 = +nibble | 0;
|
|
753
|
+
return numeric2 >= 0 && numeric2 <= 255;
|
|
754
|
+
}
|
|
755
|
+
var ipAddress = core.createRule({
|
|
756
|
+
type: "ipAddress",
|
|
757
|
+
validator(value) {
|
|
758
|
+
if (ruleHelpers.isEmpty(value)) {
|
|
759
|
+
return true;
|
|
760
|
+
}
|
|
761
|
+
if (typeof value !== "string") {
|
|
762
|
+
return false;
|
|
763
|
+
}
|
|
764
|
+
const nibbles = value.split(".");
|
|
765
|
+
return nibbles.length === 4 && nibbles.every(nibbleValid);
|
|
766
|
+
},
|
|
767
|
+
message: "The value is not a valid IP address"
|
|
768
|
+
});
|
|
769
|
+
var macAddress = core.createRule({
|
|
770
|
+
type: "macAddress",
|
|
771
|
+
validator(value, separator = ":") {
|
|
772
|
+
if (ruleHelpers.isEmpty(value)) {
|
|
773
|
+
return true;
|
|
774
|
+
}
|
|
775
|
+
if (typeof value !== "string") {
|
|
776
|
+
return false;
|
|
777
|
+
}
|
|
778
|
+
const parts = typeof separator === "string" && separator !== "" ? value.split(separator) : value.length === 12 || value.length === 16 ? value.match(/.{2}/g) : null;
|
|
779
|
+
return parts !== null && (parts.length === 6 || parts.length === 8) && parts.every(hexValid);
|
|
780
|
+
},
|
|
781
|
+
message: "The value is not a valid MAC Address"
|
|
782
|
+
});
|
|
783
|
+
var hexValid = (hex) => hex.toLowerCase().match(/^[0-9a-f]{2}$/);
|
|
784
|
+
var checked = core.createRule({
|
|
785
|
+
type: "checked",
|
|
786
|
+
validator: (value) => {
|
|
787
|
+
if (ruleHelpers.isFilled(value)) {
|
|
788
|
+
return value === true;
|
|
789
|
+
}
|
|
790
|
+
return true;
|
|
791
|
+
},
|
|
792
|
+
message: "This field must be checked"
|
|
793
|
+
});
|
|
794
|
+
var contains = core.createRule({
|
|
795
|
+
type: "contains",
|
|
796
|
+
validator(value, part) {
|
|
797
|
+
if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(part)) {
|
|
798
|
+
return value.includes(part);
|
|
799
|
+
}
|
|
800
|
+
return true;
|
|
801
|
+
},
|
|
802
|
+
message({ $params: [part] }) {
|
|
803
|
+
return `Field must contain ${part}`;
|
|
804
|
+
}
|
|
805
|
+
});
|
|
806
|
+
var startsWith = core.createRule({
|
|
807
|
+
type: "startsWith",
|
|
808
|
+
validator(value, part) {
|
|
809
|
+
if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(part)) {
|
|
810
|
+
return value.startsWith(part);
|
|
811
|
+
}
|
|
812
|
+
return true;
|
|
813
|
+
},
|
|
814
|
+
message({ $params: [part] }) {
|
|
815
|
+
return `Field must end with ${part}`;
|
|
816
|
+
}
|
|
817
|
+
});
|
|
818
|
+
var endsWith = core.createRule({
|
|
819
|
+
type: "endsWith",
|
|
820
|
+
validator(value, part) {
|
|
821
|
+
if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(part)) {
|
|
822
|
+
return value.endsWith(part);
|
|
823
|
+
}
|
|
824
|
+
return true;
|
|
825
|
+
},
|
|
826
|
+
message({ $params: [part] }) {
|
|
827
|
+
return `Field must end with ${part}`;
|
|
828
|
+
}
|
|
829
|
+
});
|
|
830
|
+
var regex2 = core.createRule({
|
|
831
|
+
type: "regex",
|
|
832
|
+
validator(value, ...regexp) {
|
|
833
|
+
if (ruleHelpers.isFilled(value)) {
|
|
834
|
+
return ruleHelpers.regex(value, ...regexp);
|
|
835
|
+
}
|
|
836
|
+
return true;
|
|
837
|
+
},
|
|
838
|
+
message: "This field does not match the required pattern"
|
|
839
|
+
});
|
|
840
|
+
|
|
841
|
+
exports.alpha = alpha;
|
|
842
|
+
exports.alphaNum = alphaNum;
|
|
843
|
+
exports.and = and;
|
|
844
|
+
exports.applyIf = applyIf;
|
|
845
|
+
exports.between = between;
|
|
846
|
+
exports.checked = checked;
|
|
847
|
+
exports.contains = contains;
|
|
848
|
+
exports.dateAfter = dateAfter;
|
|
849
|
+
exports.dateBefore = dateBefore;
|
|
850
|
+
exports.dateBetween = dateBetween;
|
|
851
|
+
exports.decimal = decimal;
|
|
852
|
+
exports.email = email;
|
|
853
|
+
exports.endsWith = endsWith;
|
|
854
|
+
exports.exactLength = exactLength;
|
|
855
|
+
exports.integer = integer;
|
|
856
|
+
exports.ipAddress = ipAddress;
|
|
857
|
+
exports.macAddress = macAddress;
|
|
858
|
+
exports.maxLength = maxLength;
|
|
859
|
+
exports.maxValue = maxValue;
|
|
860
|
+
exports.minLength = minLength;
|
|
861
|
+
exports.minValue = minValue;
|
|
862
|
+
exports.not = not;
|
|
863
|
+
exports.numeric = numeric;
|
|
864
|
+
exports.or = or;
|
|
865
|
+
exports.regex = regex2;
|
|
866
|
+
exports.required = required;
|
|
867
|
+
exports.requiredIf = requiredIf;
|
|
868
|
+
exports.requiredUnless = requiredUnless;
|
|
869
|
+
exports.ruleHelpers = ruleHelpers;
|
|
870
|
+
exports.sameAs = sameAs;
|
|
871
|
+
exports.startsWith = startsWith;
|
|
872
|
+
exports.url = url;
|
|
873
|
+
exports.withAsync = withAsync;
|
|
874
|
+
exports.withMessage = withMessage;
|
|
875
|
+
exports.withParams = withParams;
|
|
876
|
+
exports.withTooltip = withTooltip;
|