@arikajs/validation 0.0.2
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/LICENSE +21 -0
- package/README.md +271 -0
- package/dist/ErrorBag.d.ts +28 -0
- package/dist/ErrorBag.d.ts.map +1 -0
- package/dist/ErrorBag.js +49 -0
- package/dist/ErrorBag.js.map +1 -0
- package/dist/Rule.d.ts +11 -0
- package/dist/Rule.d.ts.map +1 -0
- package/dist/Rule.js +3 -0
- package/dist/Rule.js.map +1 -0
- package/dist/Rules/Email.d.ts +6 -0
- package/dist/Rules/Email.d.ts.map +1 -0
- package/dist/Rules/Email.js +18 -0
- package/dist/Rules/Email.js.map +1 -0
- package/dist/Rules/Max.d.ts +8 -0
- package/dist/Rules/Max.d.ts.map +1 -0
- package/dist/Rules/Max.js +24 -0
- package/dist/Rules/Max.js.map +1 -0
- package/dist/Rules/Min.d.ts +8 -0
- package/dist/Rules/Min.d.ts.map +1 -0
- package/dist/Rules/Min.js +24 -0
- package/dist/Rules/Min.js.map +1 -0
- package/dist/Rules/Number.d.ts +6 -0
- package/dist/Rules/Number.d.ts.map +1 -0
- package/dist/Rules/Number.js +15 -0
- package/dist/Rules/Number.js.map +1 -0
- package/dist/Rules/Required.d.ts +6 -0
- package/dist/Rules/Required.d.ts.map +1 -0
- package/dist/Rules/Required.js +22 -0
- package/dist/Rules/Required.js.map +1 -0
- package/dist/Rules/RequiredIf.d.ts +11 -0
- package/dist/Rules/RequiredIf.d.ts.map +1 -0
- package/dist/Rules/RequiredIf.js +25 -0
- package/dist/Rules/RequiredIf.js.map +1 -0
- package/dist/Rules/String.d.ts +6 -0
- package/dist/Rules/String.d.ts.map +1 -0
- package/dist/Rules/String.js +15 -0
- package/dist/Rules/String.js.map +1 -0
- package/dist/ValidationError.d.ts +5 -0
- package/dist/ValidationError.d.ts.map +1 -0
- package/dist/ValidationError.js +12 -0
- package/dist/ValidationError.js.map +1 -0
- package/dist/Validator.d.ts +31 -0
- package/dist/Validator.d.ts.map +1 -0
- package/dist/Validator.js +193 -0
- package/dist/Validator.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/src/ErrorBag.d.ts +28 -0
- package/dist/src/ErrorBag.d.ts.map +1 -0
- package/dist/src/ErrorBag.js +49 -0
- package/dist/src/ErrorBag.js.map +1 -0
- package/dist/src/Rule.d.ts +11 -0
- package/dist/src/Rule.d.ts.map +1 -0
- package/dist/src/Rule.js +3 -0
- package/dist/src/Rule.js.map +1 -0
- package/dist/src/Rules/Email.d.ts +6 -0
- package/dist/src/Rules/Email.d.ts.map +1 -0
- package/dist/src/Rules/Email.js +18 -0
- package/dist/src/Rules/Email.js.map +1 -0
- package/dist/src/Rules/Max.d.ts +8 -0
- package/dist/src/Rules/Max.d.ts.map +1 -0
- package/dist/src/Rules/Max.js +24 -0
- package/dist/src/Rules/Max.js.map +1 -0
- package/dist/src/Rules/Min.d.ts +8 -0
- package/dist/src/Rules/Min.d.ts.map +1 -0
- package/dist/src/Rules/Min.js +24 -0
- package/dist/src/Rules/Min.js.map +1 -0
- package/dist/src/Rules/Number.d.ts +6 -0
- package/dist/src/Rules/Number.d.ts.map +1 -0
- package/dist/src/Rules/Number.js +15 -0
- package/dist/src/Rules/Number.js.map +1 -0
- package/dist/src/Rules/Required.d.ts +6 -0
- package/dist/src/Rules/Required.d.ts.map +1 -0
- package/dist/src/Rules/Required.js +22 -0
- package/dist/src/Rules/Required.js.map +1 -0
- package/dist/src/Rules/RequiredIf.d.ts +11 -0
- package/dist/src/Rules/RequiredIf.d.ts.map +1 -0
- package/dist/src/Rules/RequiredIf.js +25 -0
- package/dist/src/Rules/RequiredIf.js.map +1 -0
- package/dist/src/Rules/String.d.ts +6 -0
- package/dist/src/Rules/String.d.ts.map +1 -0
- package/dist/src/Rules/String.js +15 -0
- package/dist/src/Rules/String.js.map +1 -0
- package/dist/src/ValidationError.d.ts +5 -0
- package/dist/src/ValidationError.d.ts.map +1 -0
- package/dist/src/ValidationError.js +12 -0
- package/dist/src/ValidationError.js.map +1 -0
- package/dist/src/Validator.d.ts +31 -0
- package/dist/src/Validator.d.ts.map +1 -0
- package/dist/src/Validator.js +193 -0
- package/dist/src/Validator.js.map +1 -0
- package/dist/src/index.d.ts +11 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +27 -0
- package/dist/src/index.js.map +1 -0
- package/dist/tests/AdvancedValidation.test.d.ts +2 -0
- package/dist/tests/AdvancedValidation.test.d.ts.map +1 -0
- package/dist/tests/AdvancedValidation.test.js +97 -0
- package/dist/tests/AdvancedValidation.test.js.map +1 -0
- package/dist/tests/Validator.test.d.ts +2 -0
- package/dist/tests/Validator.test.d.ts.map +1 -0
- package/dist/tests/Validator.test.js +133 -0
- package/dist/tests/Validator.test.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RequiredIf = void 0;
|
|
4
|
+
class RequiredIf {
|
|
5
|
+
constructor(otherField, otherValue, data) {
|
|
6
|
+
this.otherField = otherField;
|
|
7
|
+
this.otherValue = otherValue;
|
|
8
|
+
this.data = data;
|
|
9
|
+
}
|
|
10
|
+
async validate(value) {
|
|
11
|
+
const otherValue = this.getDataValue(this.otherField);
|
|
12
|
+
if (String(otherValue) === String(this.otherValue)) {
|
|
13
|
+
return value !== null && value !== undefined && value !== '';
|
|
14
|
+
}
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
message() {
|
|
18
|
+
return `The :attribute field is required when ${this.otherField} is ${this.otherValue}.`;
|
|
19
|
+
}
|
|
20
|
+
getDataValue(key) {
|
|
21
|
+
return key.split('.').reduce((o, i) => (o ? o[i] : undefined), this.data);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.RequiredIf = RequiredIf;
|
|
25
|
+
//# sourceMappingURL=RequiredIf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequiredIf.js","sourceRoot":"","sources":["../../../src/Rules/RequiredIf.ts"],"names":[],"mappings":";;;AAGA,MAAa,UAAU;IAKnB,YAAY,UAAkB,EAAE,UAAe,EAAE,IAAS;QACtD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAU;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEtD,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACjD,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAAC;QACjE,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO;QACH,OAAO,yCAAyC,IAAI,CAAC,UAAU,OAAO,IAAI,CAAC,UAAU,GAAG,CAAC;IAC7F,CAAC;IAEO,YAAY,CAAC,GAAW;QAC5B,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9E,CAAC;CACJ;AA5BD,gCA4BC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"String.d.ts","sourceRoot":"","sources":["../../../src/Rules/String.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,qBAAa,QAAS,YAAW,IAAI;IACjC,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO;IAK7B,OAAO,IAAI,MAAM;CAGpB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IsString = void 0;
|
|
4
|
+
class IsString {
|
|
5
|
+
validate(value) {
|
|
6
|
+
if (value === null || value === undefined)
|
|
7
|
+
return true;
|
|
8
|
+
return typeof value === 'string';
|
|
9
|
+
}
|
|
10
|
+
message() {
|
|
11
|
+
return 'The :attribute must be a string.';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.IsString = IsString;
|
|
15
|
+
//# sourceMappingURL=String.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"String.js","sourceRoot":"","sources":["../../../src/Rules/String.ts"],"names":[],"mappings":";;;AAEA,MAAa,QAAQ;IACjB,QAAQ,CAAC,KAAU;QACf,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACvD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;IACrC,CAAC;IAED,OAAO;QACH,OAAO,kCAAkC,CAAC;IAC9C,CAAC;CACJ;AATD,4BASC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ValidationError.d.ts","sourceRoot":"","sources":["../../src/ValidationError.ts"],"names":[],"mappings":"AAAA,qBAAa,eAAgB,SAAQ,KAAK;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;gBAAhC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;CAItD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ValidationError = void 0;
|
|
4
|
+
class ValidationError extends Error {
|
|
5
|
+
constructor(errors) {
|
|
6
|
+
super('The given data was invalid.');
|
|
7
|
+
this.errors = errors;
|
|
8
|
+
this.name = 'ValidationError';
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
exports.ValidationError = ValidationError;
|
|
12
|
+
//# sourceMappingURL=ValidationError.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ValidationError.js","sourceRoot":"","sources":["../../src/ValidationError.ts"],"names":[],"mappings":";;;AAAA,MAAa,eAAgB,SAAQ,KAAK;IACtC,YAAmB,MAAgC;QAC/C,KAAK,CAAC,6BAA6B,CAAC,CAAC;QADtB,WAAM,GAAN,MAAM,CAA0B;QAE/C,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAClC,CAAC;CACJ;AALD,0CAKC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Rule } from './Rule';
|
|
2
|
+
export declare class Validator {
|
|
3
|
+
private data;
|
|
4
|
+
private initialRules;
|
|
5
|
+
private errorBag;
|
|
6
|
+
private messages;
|
|
7
|
+
private customRules;
|
|
8
|
+
private validatedData;
|
|
9
|
+
constructor(data: Record<string, any>, rules?: Record<string, string | Rule | (string | Rule)[]>, messages?: Record<string, string>);
|
|
10
|
+
/**
|
|
11
|
+
* Determine if the data passes the validation rules.
|
|
12
|
+
*/
|
|
13
|
+
validate(): Promise<boolean>;
|
|
14
|
+
private isRequirementRule;
|
|
15
|
+
fails(): Promise<boolean>;
|
|
16
|
+
errors(): Record<string, string[]>;
|
|
17
|
+
validated(): Record<string, any>;
|
|
18
|
+
/**
|
|
19
|
+
* Register a custom validation rule.
|
|
20
|
+
*/
|
|
21
|
+
extend(name: string, rule: Rule): void;
|
|
22
|
+
private parseRules;
|
|
23
|
+
private createRuleFromString;
|
|
24
|
+
private getValue;
|
|
25
|
+
private setValidatedValue;
|
|
26
|
+
private isEmpty;
|
|
27
|
+
private formatMessage;
|
|
28
|
+
private expandRules;
|
|
29
|
+
private expandWildcards;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=Validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Validator.d.ts","sourceRoot":"","sources":["../../src/Validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAU9B,qBAAa,SAAS;IAClB,OAAO,CAAC,IAAI,CAAsB;IAClC,OAAO,CAAC,YAAY,CAAoD;IACxE,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,aAAa,CAA2B;gBAG5C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAM,EAC7D,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM;IAczC;;OAEG;IACU,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC;IAoDzC,OAAO,CAAC,iBAAiB;IAIZ,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAIlC,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAIvC;;OAEG;IACI,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI;IAI7C,OAAO,CAAC,UAAU;IAmBlB,OAAO,CAAC,oBAAoB;IA8B5B,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,eAAe;CAwB1B"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Validator = void 0;
|
|
4
|
+
const ErrorBag_1 = require("./ErrorBag");
|
|
5
|
+
const Required_1 = require("./Rules/Required");
|
|
6
|
+
const Email_1 = require("./Rules/Email");
|
|
7
|
+
const Min_1 = require("./Rules/Min");
|
|
8
|
+
const Max_1 = require("./Rules/Max");
|
|
9
|
+
const String_1 = require("./Rules/String");
|
|
10
|
+
const Number_1 = require("./Rules/Number");
|
|
11
|
+
const RequiredIf_1 = require("./Rules/RequiredIf");
|
|
12
|
+
class Validator {
|
|
13
|
+
constructor(data, rules = {}, messages = {}) {
|
|
14
|
+
this.messages = {};
|
|
15
|
+
this.customRules = new Map();
|
|
16
|
+
this.validatedData = {};
|
|
17
|
+
this.data = data;
|
|
18
|
+
this.initialRules = rules;
|
|
19
|
+
this.messages = messages;
|
|
20
|
+
this.errorBag = new ErrorBag_1.ErrorBag();
|
|
21
|
+
// Register default rules
|
|
22
|
+
this.customRules.set('required', new Required_1.Required());
|
|
23
|
+
this.customRules.set('email', new Email_1.Email());
|
|
24
|
+
this.customRules.set('string', new String_1.IsString());
|
|
25
|
+
this.customRules.set('number', new Number_1.IsNumber());
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Determine if the data passes the validation rules.
|
|
29
|
+
*/
|
|
30
|
+
async validate() {
|
|
31
|
+
this.errorBag = new ErrorBag_1.ErrorBag();
|
|
32
|
+
this.validatedData = {};
|
|
33
|
+
const expandedRules = this.expandRules(this.initialRules);
|
|
34
|
+
for (const [attribute, rules] of Object.entries(expandedRules)) {
|
|
35
|
+
const ruleSet = this.parseRules(rules);
|
|
36
|
+
const value = this.getValue(attribute);
|
|
37
|
+
const isNullable = ruleSet.some(r => r.name === 'nullable');
|
|
38
|
+
const shouldBail = ruleSet.some(r => r.name === 'bail');
|
|
39
|
+
// Handle nullable
|
|
40
|
+
if (isNullable && (value === null || value === undefined)) {
|
|
41
|
+
this.setValidatedValue(attribute, value);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
let failed = false;
|
|
45
|
+
for (const rule of ruleSet) {
|
|
46
|
+
// Skip pseudo-rules
|
|
47
|
+
if (rule.name === 'nullable' || rule.name === 'bail') {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
// If value is null/undefined/empty and rule is NOT 'required' (or similar), skip validation
|
|
51
|
+
if (this.isEmpty(value) && !this.isRequirementRule(rule)) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const passes = await rule.validate(value, attribute);
|
|
55
|
+
if (!passes) {
|
|
56
|
+
const message = this.formatMessage(rule.message(), attribute);
|
|
57
|
+
this.errorBag.add(attribute, message);
|
|
58
|
+
failed = true;
|
|
59
|
+
if (shouldBail) {
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (!failed) {
|
|
65
|
+
this.setValidatedValue(attribute, value);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return this.errorBag.isEmpty();
|
|
69
|
+
}
|
|
70
|
+
isRequirementRule(rule) {
|
|
71
|
+
return rule instanceof Required_1.Required || rule instanceof RequiredIf_1.RequiredIf;
|
|
72
|
+
}
|
|
73
|
+
async fails() {
|
|
74
|
+
return !(await this.validate());
|
|
75
|
+
}
|
|
76
|
+
errors() {
|
|
77
|
+
return this.errorBag.all();
|
|
78
|
+
}
|
|
79
|
+
validated() {
|
|
80
|
+
return this.validatedData;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Register a custom validation rule.
|
|
84
|
+
*/
|
|
85
|
+
extend(name, rule) {
|
|
86
|
+
this.customRules.set(name, rule);
|
|
87
|
+
}
|
|
88
|
+
parseRules(rules) {
|
|
89
|
+
let parsed;
|
|
90
|
+
if (typeof rules === 'string') {
|
|
91
|
+
parsed = rules.split('|');
|
|
92
|
+
}
|
|
93
|
+
else if (Array.isArray(rules)) {
|
|
94
|
+
parsed = rules;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
parsed = [rules];
|
|
98
|
+
}
|
|
99
|
+
return parsed.flatMap(r => {
|
|
100
|
+
if (typeof r === 'string') {
|
|
101
|
+
return r.split('|').map(sub => this.createRuleFromString(sub));
|
|
102
|
+
}
|
|
103
|
+
return r;
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
createRuleFromString(ruleString) {
|
|
107
|
+
const [fullRule, ...rest] = ruleString.split(':');
|
|
108
|
+
const name = fullRule.trim();
|
|
109
|
+
const params = rest.length > 0 ? rest.join(':') : '';
|
|
110
|
+
const parameters = params ? params.split(',') : [];
|
|
111
|
+
switch (name) {
|
|
112
|
+
case 'min':
|
|
113
|
+
return new Min_1.Min(Number(parameters[0]));
|
|
114
|
+
case 'max':
|
|
115
|
+
return new Max_1.Max(Number(parameters[0]));
|
|
116
|
+
case 'required_if':
|
|
117
|
+
return new RequiredIf_1.RequiredIf(parameters[0], parameters[1], this.data);
|
|
118
|
+
case 'nullable':
|
|
119
|
+
case 'bail':
|
|
120
|
+
// Return a dummy rule that we'll handle in the main loop
|
|
121
|
+
return {
|
|
122
|
+
name,
|
|
123
|
+
validate: async () => true,
|
|
124
|
+
message: () => ''
|
|
125
|
+
};
|
|
126
|
+
default:
|
|
127
|
+
const rule = this.customRules.get(name);
|
|
128
|
+
if (!rule) {
|
|
129
|
+
throw new Error(`Validation rule '${name}' not found.`);
|
|
130
|
+
}
|
|
131
|
+
return rule;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
getValue(key) {
|
|
135
|
+
return key.split('.').reduce((o, i) => (o ? o[i] : undefined), this.data);
|
|
136
|
+
}
|
|
137
|
+
setValidatedValue(path, value) {
|
|
138
|
+
const keys = path.split('.');
|
|
139
|
+
let current = this.validatedData;
|
|
140
|
+
for (let i = 0; i < keys.length; i++) {
|
|
141
|
+
const key = keys[i];
|
|
142
|
+
if (i === keys.length - 1) {
|
|
143
|
+
current[key] = value;
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
current[key] = current[key] || {};
|
|
147
|
+
current = current[key];
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
isEmpty(value) {
|
|
152
|
+
return value === null || value === undefined || value === '';
|
|
153
|
+
}
|
|
154
|
+
formatMessage(message, attribute) {
|
|
155
|
+
return message.replace(':attribute', attribute);
|
|
156
|
+
}
|
|
157
|
+
expandRules(rules) {
|
|
158
|
+
const expanded = {};
|
|
159
|
+
for (const [key, rule] of Object.entries(rules)) {
|
|
160
|
+
if (key.includes('*')) {
|
|
161
|
+
this.expandWildcards(key, rule, this.data, expanded);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
expanded[key] = rule;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return expanded;
|
|
168
|
+
}
|
|
169
|
+
expandWildcards(path, rule, data, expanded) {
|
|
170
|
+
const parts = path.split('.');
|
|
171
|
+
const starIndex = parts.indexOf('*');
|
|
172
|
+
if (starIndex === -1) {
|
|
173
|
+
expanded[path] = rule;
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
const before = parts.slice(0, starIndex).join('.');
|
|
177
|
+
const after = parts.slice(starIndex + 1).join('.');
|
|
178
|
+
const collection = this.getValue(before);
|
|
179
|
+
if (Array.isArray(collection)) {
|
|
180
|
+
for (let i = 0; i < collection.length; i++) {
|
|
181
|
+
const subPath = after ? `${before}.${i}.${after}` : `${before}.${i}`;
|
|
182
|
+
if (subPath.includes('*')) {
|
|
183
|
+
this.expandWildcards(subPath, rule, data, expanded);
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
expanded[subPath] = rule;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
exports.Validator = Validator;
|
|
193
|
+
//# sourceMappingURL=Validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Validator.js","sourceRoot":"","sources":["../../src/Validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from './Rule';
|
|
2
|
+
export * from './Validator';
|
|
3
|
+
export * from './ErrorBag';
|
|
4
|
+
export * from './ValidationError';
|
|
5
|
+
export * from './Rules/Required';
|
|
6
|
+
export * from './Rules/Email';
|
|
7
|
+
export * from './Rules/Min';
|
|
8
|
+
export * from './Rules/Max';
|
|
9
|
+
export * from './Rules/String';
|
|
10
|
+
export * from './Rules/Number';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./Rule"), exports);
|
|
18
|
+
__exportStar(require("./Validator"), exports);
|
|
19
|
+
__exportStar(require("./ErrorBag"), exports);
|
|
20
|
+
__exportStar(require("./ValidationError"), exports);
|
|
21
|
+
__exportStar(require("./Rules/Required"), exports);
|
|
22
|
+
__exportStar(require("./Rules/Email"), exports);
|
|
23
|
+
__exportStar(require("./Rules/Min"), exports);
|
|
24
|
+
__exportStar(require("./Rules/Max"), exports);
|
|
25
|
+
__exportStar(require("./Rules/String"), exports);
|
|
26
|
+
__exportStar(require("./Rules/Number"), exports);
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,8CAA4B;AAC5B,6CAA2B;AAC3B,oDAAkC;AAClC,mDAAiC;AACjC,gDAA8B;AAC9B,8CAA4B;AAC5B,8CAA4B;AAC5B,iDAA+B;AAC/B,iDAA+B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdvancedValidation.test.d.ts","sourceRoot":"","sources":["../../tests/AdvancedValidation.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_test_1 = require("node:test");
|
|
7
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
8
|
+
const src_1 = require("../src");
|
|
9
|
+
(0, node_test_1.describe)('Advanced Validation Features', () => {
|
|
10
|
+
(0, node_test_1.it)('handles nullable rule', async () => {
|
|
11
|
+
const data = { email: null };
|
|
12
|
+
const rules = { email: 'nullable|email' };
|
|
13
|
+
const validator = new src_1.Validator(data, rules);
|
|
14
|
+
const passed = await validator.validate();
|
|
15
|
+
node_assert_1.default.strictEqual(passed, true);
|
|
16
|
+
node_assert_1.default.deepStrictEqual(validator.validated(), { email: null });
|
|
17
|
+
});
|
|
18
|
+
(0, node_test_1.it)('handles bail rule', async () => {
|
|
19
|
+
const data = { email: 'invalid-email' };
|
|
20
|
+
const rules = { email: 'bail|email|min:10' };
|
|
21
|
+
const validator = new src_1.Validator(data, rules);
|
|
22
|
+
await validator.validate();
|
|
23
|
+
const errors = validator.errors();
|
|
24
|
+
// Should only have one error because of bail
|
|
25
|
+
node_assert_1.default.strictEqual(errors.email.length, 1);
|
|
26
|
+
node_assert_1.default.strictEqual(errors.email[0], 'The email must be a valid email address.');
|
|
27
|
+
});
|
|
28
|
+
(0, node_test_1.it)('validates nested objects with dot notation', async () => {
|
|
29
|
+
const data = {
|
|
30
|
+
user: {
|
|
31
|
+
profile: {
|
|
32
|
+
age: 15
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
const rules = {
|
|
37
|
+
'user.profile.age': 'number|min:18'
|
|
38
|
+
};
|
|
39
|
+
const validator = new src_1.Validator(data, rules);
|
|
40
|
+
const passed = await validator.validate();
|
|
41
|
+
node_assert_1.default.strictEqual(passed, false);
|
|
42
|
+
node_assert_1.default.ok(validator.errors()['user.profile.age']);
|
|
43
|
+
});
|
|
44
|
+
(0, node_test_1.it)('validates arrays with wildcards', async () => {
|
|
45
|
+
const data = {
|
|
46
|
+
users: [
|
|
47
|
+
{ email: 'valid@example.com' },
|
|
48
|
+
{ email: 'invalid' }
|
|
49
|
+
]
|
|
50
|
+
};
|
|
51
|
+
const rules = {
|
|
52
|
+
'users.*.email': 'required|email'
|
|
53
|
+
};
|
|
54
|
+
const validator = new src_1.Validator(data, rules);
|
|
55
|
+
const passed = await validator.validate();
|
|
56
|
+
node_assert_1.default.strictEqual(passed, false);
|
|
57
|
+
node_assert_1.default.ok(validator.errors()['users.1.email']);
|
|
58
|
+
node_assert_1.default.ok(!validator.errors()['users.0.email']);
|
|
59
|
+
});
|
|
60
|
+
(0, node_test_1.it)('handles conditional validation (required_if)', async () => {
|
|
61
|
+
const data = {
|
|
62
|
+
provider: 'email',
|
|
63
|
+
password: ''
|
|
64
|
+
};
|
|
65
|
+
const rules = {
|
|
66
|
+
password: 'required_if:provider,email|min:8'
|
|
67
|
+
};
|
|
68
|
+
const validator = new src_1.Validator(data, rules);
|
|
69
|
+
const passed = await validator.validate();
|
|
70
|
+
node_assert_1.default.strictEqual(passed, false);
|
|
71
|
+
node_assert_1.default.ok(validator.errors().password);
|
|
72
|
+
// Test fallback if condition not met
|
|
73
|
+
const data2 = { provider: 'google', password: '' };
|
|
74
|
+
const validator2 = new src_1.Validator(data2, rules);
|
|
75
|
+
node_assert_1.default.strictEqual(await validator2.validate(), true);
|
|
76
|
+
});
|
|
77
|
+
(0, node_test_1.it)('returns only validated data with validated()', async () => {
|
|
78
|
+
const data = {
|
|
79
|
+
name: 'Prakash',
|
|
80
|
+
email: 'prakash@example.com',
|
|
81
|
+
extra: 'ignore me'
|
|
82
|
+
};
|
|
83
|
+
const rules = {
|
|
84
|
+
name: 'required',
|
|
85
|
+
email: 'required|email'
|
|
86
|
+
};
|
|
87
|
+
const validator = new src_1.Validator(data, rules);
|
|
88
|
+
await validator.validate();
|
|
89
|
+
const validated = validator.validated();
|
|
90
|
+
node_assert_1.default.deepStrictEqual(validated, {
|
|
91
|
+
name: 'Prakash',
|
|
92
|
+
email: 'prakash@example.com'
|
|
93
|
+
});
|
|
94
|
+
node_assert_1.default.ok(!('extra' in validated));
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
//# sourceMappingURL=AdvancedValidation.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdvancedValidation.test.js","sourceRoot":"","sources":["../../tests/AdvancedValidation.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Validator.test.d.ts","sourceRoot":"","sources":["../../tests/Validator.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const node_test_1 = require("node:test");
|
|
37
|
+
const assert = __importStar(require("node:assert"));
|
|
38
|
+
const src_1 = require("../src");
|
|
39
|
+
(0, node_test_1.describe)('Arika Validation', () => {
|
|
40
|
+
(0, node_test_1.it)('validates required fields', async () => {
|
|
41
|
+
const data = { name: '' };
|
|
42
|
+
const rules = { name: 'required' };
|
|
43
|
+
const validator = new src_1.Validator(data, rules);
|
|
44
|
+
assert.strictEqual(await validator.fails(), true);
|
|
45
|
+
assert.deepStrictEqual(validator.errors(), {
|
|
46
|
+
name: ['The name field is required.']
|
|
47
|
+
});
|
|
48
|
+
const validData = { name: 'Arika' };
|
|
49
|
+
const validValidator = new src_1.Validator(validData, rules);
|
|
50
|
+
assert.strictEqual(await validValidator.fails(), false);
|
|
51
|
+
});
|
|
52
|
+
(0, node_test_1.it)('validates email fields', async () => {
|
|
53
|
+
const data = { email: 'invalid-email' };
|
|
54
|
+
const rules = { email: 'email' };
|
|
55
|
+
const validator = new src_1.Validator(data, rules);
|
|
56
|
+
assert.strictEqual(await validator.fails(), true);
|
|
57
|
+
assert.deepStrictEqual(validator.errors(), {
|
|
58
|
+
email: ['The email must be a valid email address.']
|
|
59
|
+
});
|
|
60
|
+
const validData = { email: 'test@example.com' };
|
|
61
|
+
const validValidator = new src_1.Validator(validData, rules);
|
|
62
|
+
assert.strictEqual(await validValidator.fails(), false);
|
|
63
|
+
});
|
|
64
|
+
(0, node_test_1.it)('validates min rule', async () => {
|
|
65
|
+
const data = { password: 'short', age: 10 };
|
|
66
|
+
const rules = { password: 'min:8', age: 'min:18' };
|
|
67
|
+
const validator = new src_1.Validator(data, rules);
|
|
68
|
+
assert.strictEqual(await validator.fails(), true);
|
|
69
|
+
const errors = validator.errors();
|
|
70
|
+
assert.ok(errors.password);
|
|
71
|
+
assert.ok(errors.age);
|
|
72
|
+
});
|
|
73
|
+
(0, node_test_1.it)('validates max rule', async () => {
|
|
74
|
+
const data = { username: 'reallylongusername', score: 101 };
|
|
75
|
+
const rules = { username: 'max:10', score: 'max:100' };
|
|
76
|
+
const validator = new src_1.Validator(data, rules);
|
|
77
|
+
assert.strictEqual(await validator.fails(), true);
|
|
78
|
+
const errors = validator.errors();
|
|
79
|
+
assert.ok(errors.username);
|
|
80
|
+
assert.ok(errors.score);
|
|
81
|
+
});
|
|
82
|
+
(0, node_test_1.it)('validates string rule', async () => {
|
|
83
|
+
const data = { name: 'Arika', age: 25 };
|
|
84
|
+
const rules = { name: 'string', age: 'string' };
|
|
85
|
+
const validator = new src_1.Validator(data, rules);
|
|
86
|
+
assert.strictEqual(await validator.fails(), true);
|
|
87
|
+
const errors = validator.errors();
|
|
88
|
+
assert.ok(errors.age);
|
|
89
|
+
assert.strictEqual(errors.age[0], 'The age must be a string.');
|
|
90
|
+
assert.ok(!errors.name);
|
|
91
|
+
});
|
|
92
|
+
(0, node_test_1.it)('validates number rule', async () => {
|
|
93
|
+
const data = { age: 25, name: 'Arika' };
|
|
94
|
+
const rules = { age: 'number', name: 'number' };
|
|
95
|
+
const validator = new src_1.Validator(data, rules);
|
|
96
|
+
assert.strictEqual(await validator.fails(), true);
|
|
97
|
+
const errors = validator.errors();
|
|
98
|
+
assert.ok(errors.name);
|
|
99
|
+
assert.strictEqual(errors.name[0], 'The name must be a number.');
|
|
100
|
+
assert.ok(!errors.age);
|
|
101
|
+
});
|
|
102
|
+
(0, node_test_1.it)('supports custom rule classes', async () => {
|
|
103
|
+
class Uppercase {
|
|
104
|
+
validate(value) {
|
|
105
|
+
return value === value.toUpperCase();
|
|
106
|
+
}
|
|
107
|
+
message() {
|
|
108
|
+
return 'Must be uppercase';
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const data = { code: 'abc' };
|
|
112
|
+
const validator = new src_1.Validator(data);
|
|
113
|
+
validator.extend('uppercase', new Uppercase());
|
|
114
|
+
// Directly test validate method as extension happens after constructor
|
|
115
|
+
const rules = { code: 'uppercase' };
|
|
116
|
+
const v = new src_1.Validator(data, rules);
|
|
117
|
+
v.extend('uppercase', new Uppercase());
|
|
118
|
+
assert.strictEqual(await v.fails(), true);
|
|
119
|
+
assert.deepStrictEqual(v.errors(), {
|
|
120
|
+
code: ['Must be uppercase']
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
(0, node_test_1.it)('supports pipe syntax for multiple rules', async () => {
|
|
124
|
+
const data = { email: 'invalid' };
|
|
125
|
+
const rules = { email: 'required|email|min:10' };
|
|
126
|
+
const validator = new src_1.Validator(data, rules);
|
|
127
|
+
assert.strictEqual(await validator.fails(), true);
|
|
128
|
+
const errors = validator.errors();
|
|
129
|
+
// Should have at least one error (email format)
|
|
130
|
+
assert.strictEqual(errors.email.includes('The email must be a valid email address.'), true);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
//# sourceMappingURL=Validator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Validator.test.js","sourceRoot":"","sources":["../../tests/Validator.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAAyC;AACzC,oDAAsC;AACtC,gCAAoE;AAEpE,IAAA,oBAAQ,EAAC,kBAAkB,EAAE,GAAG,EAAE;IAC9B,IAAA,cAAE,EAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACvC,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QACnC,MAAM,SAAS,GAAG,IAAI,eAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAE7C,MAAM,CAAC,WAAW,CAAC,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE;YACvC,IAAI,EAAE,CAAC,6BAA6B,CAAC;SACxC,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QACpC,MAAM,cAAc,GAAG,IAAI,eAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACvD,MAAM,CAAC,WAAW,CAAC,MAAM,cAAc,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACpC,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,IAAI,eAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAE7C,MAAM,CAAC,WAAW,CAAC,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE;YACvC,KAAK,EAAE,CAAC,0CAA0C,CAAC;SACtD,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;QAChD,MAAM,cAAc,GAAG,IAAI,eAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACvD,MAAM,CAAC,WAAW,CAAC,MAAM,cAAc,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;QAChC,MAAM,IAAI,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;QACnD,MAAM,SAAS,GAAG,IAAI,eAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAE7C,MAAM,CAAC,WAAW,CAAC,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC3B,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;QAChC,MAAM,IAAI,GAAG,EAAE,QAAQ,EAAE,oBAAoB,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;QAC5D,MAAM,KAAK,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QACvD,MAAM,SAAS,GAAG,IAAI,eAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAE7C,MAAM,CAAC,WAAW,CAAC,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC3B,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,IAAI,eAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAE7C,MAAM,CAAC,WAAW,CAAC,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACtB,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,2BAA2B,CAAC,CAAC;QAC/D,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,IAAI,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,IAAI,eAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAE7C,MAAM,CAAC,WAAW,CAAC,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvB,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,4BAA4B,CAAC,CAAC;QACjE,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,SAAS;YACX,QAAQ,CAAC,KAAU;gBACf,OAAO,KAAK,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC;YACzC,CAAC;YACD,OAAO;gBACH,OAAO,mBAAmB,CAAC;YAC/B,CAAC;SACJ;QAED,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,IAAI,eAAS,CAAC,IAAI,CAAC,CAAC;QACtC,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,SAAS,EAAE,CAAC,CAAC;QAE/C,uEAAuE;QACvE,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,IAAI,eAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACrC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,SAAS,EAAE,CAAC,CAAC;QAEvC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE;YAC/B,IAAI,EAAE,CAAC,mBAAmB,CAAC;SAC9B,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;QACjD,MAAM,SAAS,GAAG,IAAI,eAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAE7C,MAAM,CAAC,WAAW,CAAC,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;QAClC,gDAAgD;QAChD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,0CAA0C,CAAC,EAAE,IAAI,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|