quival 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,68 @@
1
+ export default class ErrorBag {
2
+ #data = {};
3
+
4
+ add(key, message) {
5
+ if (this.#data.hasOwnProperty(key)) {
6
+ this.#data[key].push(message);
7
+ } else {
8
+ this.#data[key] = [message];
9
+ }
10
+ }
11
+
12
+ get(key) {
13
+ if (!key.includes('*')) {
14
+ return this.#data.hasOwnProperty(key) ? this.#data[key] : {};
15
+ }
16
+
17
+ const pattern = new RegExp('^' + key.replaceAll('*', '.*?') + '$');
18
+ const result = {};
19
+
20
+ for (const [key, value] of Object.entries(this.#data)) {
21
+ if (pattern.test(key)) {
22
+ result[key] = value;
23
+ }
24
+ }
25
+
26
+ return result;
27
+ }
28
+
29
+ first(key) {
30
+ for (const message of Object.values(this.get(key))) {
31
+ return Array.isArray(message) ? message[0] : message;
32
+ }
33
+
34
+ return '';
35
+ }
36
+
37
+ has(key) {
38
+ return this.first(key) !== '';
39
+ }
40
+
41
+ messages() {
42
+ return this.#data;
43
+ }
44
+
45
+ all() {
46
+ const result = [];
47
+
48
+ Object.values(this.#data).forEach((messages) => result.push(...messages));
49
+
50
+ return result;
51
+ }
52
+
53
+ count() {
54
+ let count = 0;
55
+
56
+ Object.values(this.#data).forEach((messages) => (count += messages.length));
57
+
58
+ return count;
59
+ }
60
+
61
+ isEmpty() {
62
+ return Object.keys(this.#data).length === 0;
63
+ }
64
+
65
+ isNotEmpty() {
66
+ return !this.isEmpty();
67
+ }
68
+ }
package/src/Lang.js ADDED
@@ -0,0 +1,30 @@
1
+ import { flattenObject, isPlainObject } from './helpers.js';
2
+
3
+ export default class Lang {
4
+ static #locale;
5
+ static #messages = {};
6
+
7
+ static locale(locale) {
8
+ this.#locale = locale;
9
+ }
10
+
11
+ static setMessages(locale, messages) {
12
+ this.#messages[locale] = flattenObject(messages);
13
+ }
14
+
15
+ static get(path) {
16
+ return this.#messages[this.#locale][path];
17
+ }
18
+
19
+ static has(path) {
20
+ return typeof this.get(path) === 'undefined' ? false : true;
21
+ }
22
+
23
+ static set(path, value) {
24
+ if (isPlainObject(value)) {
25
+ Object.assign(this.#messages[this.#locale], flattenObject(value, path));
26
+ } else if (typeof value === 'string') {
27
+ this.#messages[this.#locale][path] = value;
28
+ }
29
+ }
30
+ }
@@ -0,0 +1,260 @@
1
+ export default class Replacers {
2
+ validator;
3
+
4
+ constructor(validator) {
5
+ this.validator = validator;
6
+ }
7
+
8
+ replace(message, data) {
9
+ Object.entries(data).forEach(([key, value]) => (message = message.replaceAll(':' + key, value)));
10
+
11
+ return message;
12
+ }
13
+
14
+ // Numeric
15
+ replaceDecimal(message, attribute, rule, parameters) {
16
+ return this.replace(message, {
17
+ decimal: parameters.join('-'),
18
+ });
19
+ }
20
+
21
+ replaceMultipleOf(message, attribute, rule, parameters) {
22
+ return this.replace(message, {
23
+ value: parameters[0],
24
+ });
25
+ }
26
+
27
+ // Agreement
28
+ replaceAcceptedIf(message, attribute, rule, parameters) {
29
+ return this.replace(message, {
30
+ other: this.validator.getDisplayableAttribute(parameters[0]),
31
+ value: this.validator.getDisplayableValue(parameters[0], this.validator.getValue(parameters[0])),
32
+ });
33
+ }
34
+
35
+ replaceDeclinedIf(message, attribute, rule, parameters) {
36
+ return this.replaceAcceptedIf(message, attribute, rule, parameters);
37
+ }
38
+
39
+ // Existence
40
+ replaceRequiredArrayKeys(message, attribute, rule, parameters) {
41
+ return this.replace(message, {
42
+ values: parameters.map((value) => this.validator.getDisplayableValue(attribute, value)).join(', '),
43
+ });
44
+ }
45
+
46
+ replaceRequiredIf(message, attribute, rule, parameters) {
47
+ return this.replaceAcceptedIf(message, attribute, rule, parameters);
48
+ }
49
+
50
+ replaceRequiredIfAccepted(message, attribute, rule, parameters) {
51
+ return this.replaceAcceptedIf(message, attribute, rule, parameters);
52
+ }
53
+
54
+ replaceRequiredUnless(message, attribute, rule, parameters) {
55
+ return this.replace(message, {
56
+ other: this.validator.getDisplayableAttribute(parameters[0]),
57
+ values: parameters
58
+ .slice(1)
59
+ .map((value) => this.validator.getDisplayableValue(parameters[0], value))
60
+ .join(', '),
61
+ });
62
+ }
63
+
64
+ replaceRequiredWith(message, attribute, rule, parameters) {
65
+ return this.replace(message, {
66
+ values: parameters.map((value) => this.validator.getDisplayableAttribute(value)).join(' / '),
67
+ });
68
+ }
69
+
70
+ replaceRequiredWithAll(message, attribute, rule, parameters) {
71
+ return this.replaceRequiredWith(message, attribute, rule, parameters);
72
+ }
73
+
74
+ replaceRequiredWithout(message, attribute, rule, parameters) {
75
+ return this.replaceRequiredWith(message, attribute, rule, parameters);
76
+ }
77
+
78
+ replaceRequiredWithoutAll(message, attribute, rule, parameters) {
79
+ return this.replaceRequiredWith(message, attribute, rule, parameters);
80
+ }
81
+
82
+ // Missing
83
+ replaceMissingIf(message, attribute, rule, parameters) {
84
+ return this.replaceAcceptedIf(message, attribute, rule, parameters);
85
+ }
86
+
87
+ replaceMissingUnless(message, attribute, rule, parameters) {
88
+ return this.replace(this.replaceRequiredUnless(message, attribute, rule, parameters), {
89
+ value: this.validator.getDisplayableValue(parameters[0], parameters[1]),
90
+ });
91
+ }
92
+
93
+ replaceMissingWith(message, attribute, rule, parameters) {
94
+ return this.replaceRequiredWith(message, attribute, rule, parameters);
95
+ }
96
+
97
+ replaceMissingWithAll(message, attribute, rule, parameters) {
98
+ return this.replaceRequiredWith(message, attribute, rule, parameters);
99
+ }
100
+
101
+ // Prohibition
102
+ replaceProhibitedIf(message, attribute, rule, parameters) {
103
+ return this.replaceAcceptedIf(message, attribute, rule, parameters);
104
+ }
105
+
106
+ replaceProhibitedUnless(message, attribute, rule, parameters) {
107
+ return this.replaceRequiredUnless(message, attribute, rule, parameters);
108
+ }
109
+
110
+ replaceProhibits(message, attribute, rule, parameters) {
111
+ return this.replace(message, {
112
+ other: parameters.map((value) => this.validator.getDisplayableAttribute(value)).join(' / '),
113
+ });
114
+ }
115
+
116
+ // Size
117
+ replaceSize(message, attribute, rule, parameters) {
118
+ return this.replace(message, {
119
+ size: parameters[0],
120
+ });
121
+ }
122
+
123
+ replaceMin(message, attribute, rule, parameters) {
124
+ return this.replace(message, {
125
+ min: parameters[0],
126
+ });
127
+ }
128
+
129
+ replaceMax(message, attribute, rule, parameters) {
130
+ return this.replace(message, {
131
+ max: parameters[0],
132
+ });
133
+ }
134
+
135
+ replaceBetween(message, attribute, rule, parameters) {
136
+ return this.replace(message, {
137
+ min: parameters[0],
138
+ max: parameters[1],
139
+ });
140
+ }
141
+
142
+ // Digits
143
+ replaceDigits(message, attribute, rule, parameters) {
144
+ return this.replace(message, {
145
+ digits: parameters[0],
146
+ });
147
+ }
148
+
149
+ replaceMinDigits(message, attribute, rule, parameters) {
150
+ return this.replaceMin(message, attribute, rule, parameters);
151
+ }
152
+
153
+ replaceMaxDigits(message, attribute, rule, parameters) {
154
+ return this.replaceMax(message, attribute, rule, parameters);
155
+ }
156
+
157
+ replaceDigitsBetween(message, attribute, rule, parameters) {
158
+ return this.replaceBetween(message, attribute, rule, parameters);
159
+ }
160
+
161
+ // String
162
+ replaceStartsWith(message, attribute, rule, parameters) {
163
+ return this.replaceRequiredArrayKeys(message, attribute, rule, parameters);
164
+ }
165
+
166
+ replaceDoesntStartWith(message, attribute, rule, parameters) {
167
+ return this.replaceRequiredArrayKeys(message, attribute, rule, parameters);
168
+ }
169
+
170
+ replaceEndsWith(message, attribute, rule, parameters) {
171
+ return this.replaceRequiredArrayKeys(message, attribute, rule, parameters);
172
+ }
173
+
174
+ replaceDoesntEndWith(message, attribute, rule, parameters) {
175
+ return this.replaceRequiredArrayKeys(message, attribute, rule, parameters);
176
+ }
177
+
178
+ // Compare values
179
+ replaceSame(message, attribute, rule, parameters) {
180
+ return this.replaceAcceptedIf(message, attribute, rule, parameters);
181
+ }
182
+
183
+ replaceDifferent(message, attribute, rule, parameters) {
184
+ return this.replaceAcceptedIf(message, attribute, rule, parameters);
185
+ }
186
+
187
+ replaceGt(message, attribute, rule, parameters) {
188
+ const value = this.validator.getValue(parameters[0]);
189
+
190
+ return this.replace(message, {
191
+ value: value ? this.validator.getSize(parameters[0], value) : this.validator.getDisplayableAttribute(parameters[0]),
192
+ });
193
+ }
194
+
195
+ replaceGte(message, attribute, rule, parameters) {
196
+ return this.replaceGt(message, attribute, rule, parameters);
197
+ }
198
+
199
+ replaceLt(message, attribute, rule, parameters) {
200
+ return this.replaceGt(message, attribute, rule, parameters);
201
+ }
202
+ replaceLte(message, attribute, rule, parameters) {
203
+ return this.replaceGt(message, attribute, rule, parameters);
204
+ }
205
+
206
+ // Dates
207
+ replaceAfter(message, attribute, rule, parameters) {
208
+ const other = parameters[0];
209
+
210
+ return this.replace(message, {
211
+ date: this.validator.hasAttribute(other) ? this.validator.getDisplayableAttribute(other) : other,
212
+ });
213
+ }
214
+
215
+ replaceAfterOrEqual(message, attribute, rule, parameters) {
216
+ return this.replaceAfter(message, attribute, rule, parameters);
217
+ }
218
+
219
+ replaceBefore(message, attribute, rule, parameters) {
220
+ return this.replaceAfter(message, attribute, rule, parameters);
221
+ }
222
+
223
+ replaceBeforeOrEqual(message, attribute, rule, parameters) {
224
+ return this.replaceAfter(message, attribute, rule, parameters);
225
+ }
226
+
227
+ replaceDateEquals(message, attribute, rule, parameters) {
228
+ return this.replaceAfter(message, attribute, rule, parameters);
229
+ }
230
+
231
+ replaceDateFormat(message, attribute, rule, parameters) {
232
+ return this.replace(message, {
233
+ format: parameters[0],
234
+ });
235
+ }
236
+
237
+ // Array
238
+ replaceInArray(message, attribute, rule, parameters) {
239
+ return this.replaceAcceptedIf(message, attribute, rule, parameters);
240
+ }
241
+
242
+ replaceIn(message, attribute, rule, parameters) {
243
+ return this.replaceRequiredArrayKeys(message, attribute, rule, parameters);
244
+ }
245
+
246
+ replaceNotIn(message, attribute, rule, parameters) {
247
+ return this.replaceRequiredArrayKeys(message, attribute, rule, parameters);
248
+ }
249
+
250
+ // File
251
+ replaceMimetypes(message, attribute, rule, parameters) {
252
+ return this.replace(message, {
253
+ values: parameters.join(', '),
254
+ });
255
+ }
256
+
257
+ replaceMimes(message, attribute, rule, parameters) {
258
+ return this.replaceMimetypes(message, attribute, rule, parameters);
259
+ }
260
+ }