@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.
Files changed (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +271 -0
  3. package/dist/ErrorBag.d.ts +28 -0
  4. package/dist/ErrorBag.d.ts.map +1 -0
  5. package/dist/ErrorBag.js +49 -0
  6. package/dist/ErrorBag.js.map +1 -0
  7. package/dist/Rule.d.ts +11 -0
  8. package/dist/Rule.d.ts.map +1 -0
  9. package/dist/Rule.js +3 -0
  10. package/dist/Rule.js.map +1 -0
  11. package/dist/Rules/Email.d.ts +6 -0
  12. package/dist/Rules/Email.d.ts.map +1 -0
  13. package/dist/Rules/Email.js +18 -0
  14. package/dist/Rules/Email.js.map +1 -0
  15. package/dist/Rules/Max.d.ts +8 -0
  16. package/dist/Rules/Max.d.ts.map +1 -0
  17. package/dist/Rules/Max.js +24 -0
  18. package/dist/Rules/Max.js.map +1 -0
  19. package/dist/Rules/Min.d.ts +8 -0
  20. package/dist/Rules/Min.d.ts.map +1 -0
  21. package/dist/Rules/Min.js +24 -0
  22. package/dist/Rules/Min.js.map +1 -0
  23. package/dist/Rules/Number.d.ts +6 -0
  24. package/dist/Rules/Number.d.ts.map +1 -0
  25. package/dist/Rules/Number.js +15 -0
  26. package/dist/Rules/Number.js.map +1 -0
  27. package/dist/Rules/Required.d.ts +6 -0
  28. package/dist/Rules/Required.d.ts.map +1 -0
  29. package/dist/Rules/Required.js +22 -0
  30. package/dist/Rules/Required.js.map +1 -0
  31. package/dist/Rules/RequiredIf.d.ts +11 -0
  32. package/dist/Rules/RequiredIf.d.ts.map +1 -0
  33. package/dist/Rules/RequiredIf.js +25 -0
  34. package/dist/Rules/RequiredIf.js.map +1 -0
  35. package/dist/Rules/String.d.ts +6 -0
  36. package/dist/Rules/String.d.ts.map +1 -0
  37. package/dist/Rules/String.js +15 -0
  38. package/dist/Rules/String.js.map +1 -0
  39. package/dist/ValidationError.d.ts +5 -0
  40. package/dist/ValidationError.d.ts.map +1 -0
  41. package/dist/ValidationError.js +12 -0
  42. package/dist/ValidationError.js.map +1 -0
  43. package/dist/Validator.d.ts +31 -0
  44. package/dist/Validator.d.ts.map +1 -0
  45. package/dist/Validator.js +193 -0
  46. package/dist/Validator.js.map +1 -0
  47. package/dist/index.d.ts +11 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +27 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/src/ErrorBag.d.ts +28 -0
  52. package/dist/src/ErrorBag.d.ts.map +1 -0
  53. package/dist/src/ErrorBag.js +49 -0
  54. package/dist/src/ErrorBag.js.map +1 -0
  55. package/dist/src/Rule.d.ts +11 -0
  56. package/dist/src/Rule.d.ts.map +1 -0
  57. package/dist/src/Rule.js +3 -0
  58. package/dist/src/Rule.js.map +1 -0
  59. package/dist/src/Rules/Email.d.ts +6 -0
  60. package/dist/src/Rules/Email.d.ts.map +1 -0
  61. package/dist/src/Rules/Email.js +18 -0
  62. package/dist/src/Rules/Email.js.map +1 -0
  63. package/dist/src/Rules/Max.d.ts +8 -0
  64. package/dist/src/Rules/Max.d.ts.map +1 -0
  65. package/dist/src/Rules/Max.js +24 -0
  66. package/dist/src/Rules/Max.js.map +1 -0
  67. package/dist/src/Rules/Min.d.ts +8 -0
  68. package/dist/src/Rules/Min.d.ts.map +1 -0
  69. package/dist/src/Rules/Min.js +24 -0
  70. package/dist/src/Rules/Min.js.map +1 -0
  71. package/dist/src/Rules/Number.d.ts +6 -0
  72. package/dist/src/Rules/Number.d.ts.map +1 -0
  73. package/dist/src/Rules/Number.js +15 -0
  74. package/dist/src/Rules/Number.js.map +1 -0
  75. package/dist/src/Rules/Required.d.ts +6 -0
  76. package/dist/src/Rules/Required.d.ts.map +1 -0
  77. package/dist/src/Rules/Required.js +22 -0
  78. package/dist/src/Rules/Required.js.map +1 -0
  79. package/dist/src/Rules/RequiredIf.d.ts +11 -0
  80. package/dist/src/Rules/RequiredIf.d.ts.map +1 -0
  81. package/dist/src/Rules/RequiredIf.js +25 -0
  82. package/dist/src/Rules/RequiredIf.js.map +1 -0
  83. package/dist/src/Rules/String.d.ts +6 -0
  84. package/dist/src/Rules/String.d.ts.map +1 -0
  85. package/dist/src/Rules/String.js +15 -0
  86. package/dist/src/Rules/String.js.map +1 -0
  87. package/dist/src/ValidationError.d.ts +5 -0
  88. package/dist/src/ValidationError.d.ts.map +1 -0
  89. package/dist/src/ValidationError.js +12 -0
  90. package/dist/src/ValidationError.js.map +1 -0
  91. package/dist/src/Validator.d.ts +31 -0
  92. package/dist/src/Validator.d.ts.map +1 -0
  93. package/dist/src/Validator.js +193 -0
  94. package/dist/src/Validator.js.map +1 -0
  95. package/dist/src/index.d.ts +11 -0
  96. package/dist/src/index.d.ts.map +1 -0
  97. package/dist/src/index.js +27 -0
  98. package/dist/src/index.js.map +1 -0
  99. package/dist/tests/AdvancedValidation.test.d.ts +2 -0
  100. package/dist/tests/AdvancedValidation.test.d.ts.map +1 -0
  101. package/dist/tests/AdvancedValidation.test.js +97 -0
  102. package/dist/tests/AdvancedValidation.test.js.map +1 -0
  103. package/dist/tests/Validator.test.d.ts +2 -0
  104. package/dist/tests/Validator.test.d.ts.map +1 -0
  105. package/dist/tests/Validator.test.js +133 -0
  106. package/dist/tests/Validator.test.js.map +1 -0
  107. 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,6 @@
1
+ import { Rule } from '../Rule';
2
+ export declare class IsString implements Rule {
3
+ validate(value: any): boolean;
4
+ message(): string;
5
+ }
6
+ //# sourceMappingURL=String.d.ts.map
@@ -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,5 @@
1
+ export declare class ValidationError extends Error {
2
+ errors: Record<string, string[]>;
3
+ constructor(errors: Record<string, string[]>);
4
+ }
5
+ //# sourceMappingURL=ValidationError.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=AdvancedValidation.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Validator.test.d.ts.map
@@ -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":"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"}