Skip to content

Commit 1dc7fb7

Browse files
committed
add .locale method to every validator
1 parent dd33ea0 commit 1dc7fb7

File tree

2 files changed

+84
-51
lines changed

2 files changed

+84
-51
lines changed

src/utils/validators.js

Lines changed: 60 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { isNil, isNumber, isString, isArray } from "lodash";
1+
import { defaults, isNil, isNumber, isString, isArray, isFunction } from "lodash";
22
import fecha from "fecha";
33

4-
function checkEmpty(value, required) {
4+
function checkEmpty(value, required, messages) {
55
if (isNil(value) || value === "") {
66
if (required)
7-
return [msg(resources.fieldIsRequired)];
7+
return [msg(messages.fieldIsRequired)];
88
else
99
return [];
1010
}
@@ -54,139 +54,139 @@ module.exports = {
5454

5555
resources,
5656

57-
required(value, field) {
58-
return checkEmpty(value, field.required);
57+
required(value, field, messages = resources) {
58+
return checkEmpty(value, field.required, messages);
5959
},
6060

61-
number(value, field) {
62-
let res = checkEmpty(value, field.required); if (res != null) return res;
61+
number(value, field, messages = resources) {
62+
let res = checkEmpty(value, field.required, messages); if (res != null) return res;
6363

6464
let err = [];
6565
if (isNumber(value)) {
6666
if (!isNil(field.min) && value < field.min)
67-
err.push(msg(resources.numberTooSmall, field.min));
67+
err.push(msg(messages.numberTooSmall, field.min));
6868

6969
if (!isNil(field.max) && value > field.max)
70-
err.push(msg(resources.numberTooBig, field.max));
70+
err.push(msg(messages.numberTooBig, field.max));
7171

7272
} else
73-
err.push(msg(resources.invalidNumber));
73+
err.push(msg(messages.invalidNumber));
7474

7575
return err;
7676
},
7777

78-
integer(value, field) {
79-
let res = checkEmpty(value, field.required); if (res != null) return res;
78+
integer(value, field, messages = resources) {
79+
let res = checkEmpty(value, field.required, messages); if (res != null) return res;
8080

8181
if (!(Number(value) === value && value % 1 === 0))
82-
return [msg(resources.invalidNumber)];
82+
return [msg(messages.invalidNumber)];
8383
},
8484

85-
double(value, field) {
86-
let res = checkEmpty(value, field.required); if (res != null) return res;
85+
double(value, field, messages = resources) {
86+
let res = checkEmpty(value, field.required, messages); if (res != null) return res;
8787

8888
if (!isNumber(value) || isNaN(value))
89-
return [msg(resources.invalidNumber)];
89+
return [msg(messages.invalidNumber)];
9090
},
9191

92-
string(value, field) {
93-
let res = checkEmpty(value, field.required); if (res != null) return res;
92+
string(value, field, messages = resources) {
93+
let res = checkEmpty(value, field.required, messages); if (res != null) return res;
9494

9595
let err = [];
9696
if (isString(value)) {
9797
if (!isNil(field.min) && value.length < field.min)
98-
err.push(msg(resources.textTooSmall, value.length, field.min));
98+
err.push(msg(messages.textTooSmall, value.length, field.min));
9999

100100
if (!isNil(field.max) && value.length > field.max)
101-
err.push(msg(resources.textTooBig, value.length, field.max));
101+
err.push(msg(messages.textTooBig, value.length, field.max));
102102

103103
} else
104-
err.push(msg(resources.thisNotText));
104+
err.push(msg(messages.thisNotText));
105105

106106
return err;
107107
},
108108

109-
array(value, field) {
109+
array(value, field, messages = resources) {
110110
if (field.required) {
111111

112112
if (!isArray(value))
113-
return [msg(resources.thisNotArray)];
113+
return [msg(messages.thisNotArray)];
114114

115115
if (value.length == 0)
116-
return [msg(resources.fieldIsRequired)];
116+
return [msg(messages.fieldIsRequired)];
117117
}
118118

119119
if (!isNil(value)) {
120120
if (!isNil(field.min))
121121
if (value.length < field.min)
122-
return [msg(resources.selectMinItems, field.min)];
122+
return [msg(messages.selectMinItems, field.min)];
123123

124124
if (!isNil(field.max))
125125
if (value.length > field.max)
126-
return [msg(resources.selectMaxItems, field.max)];
126+
return [msg(messages.selectMaxItems, field.max)];
127127
}
128128
},
129129

130-
date(value, field) {
131-
let res = checkEmpty(value, field.required); if (res != null) return res;
130+
date(value, field, messages = resources) {
131+
let res = checkEmpty(value, field.required, messages); if (res != null) return res;
132132

133133
let m = new Date(value);
134134
if (!m)
135-
return [msg(resources.invalidDate)];
135+
return [msg(messages.invalidDate)];
136136

137137
let err = [];
138138

139139
if (!isNil(field.min)) {
140140
let min = new Date(field.min);
141141
if (m.valueOf() < min.valueOf())
142-
err.push(msg(resources.dateIsEarly, fecha.format(m), fecha.format(min)));
142+
err.push(msg(messages.dateIsEarly, fecha.format(m), fecha.format(min)));
143143
}
144144

145145
if (!isNil(field.max)) {
146146
let max = new Date(field.max);
147147
if (m.valueOf() > max.valueOf())
148-
err.push(msg(resources.dateIsLate, fecha.format(m), fecha.format(max)));
148+
err.push(msg(messages.dateIsLate, fecha.format(m), fecha.format(max)));
149149
}
150150

151151
return err;
152152
},
153153

154-
regexp(value, field) {
155-
let res = checkEmpty(value, field.required); if (res != null) return res;
154+
regexp(value, field, messages = resources) {
155+
let res = checkEmpty(value, field.required, messages); if (res != null) return res;
156156

157157
if (!isNil(field.pattern)) {
158158
let re = new RegExp(field.pattern);
159159
if (!re.test(value))
160-
return [msg(resources.invalidFormat)];
160+
return [msg(messages.invalidFormat)];
161161
}
162162
},
163163

164-
email(value, field) {
165-
let res = checkEmpty(value, field.required); if (res != null) return res;
164+
email(value, field, messages = resources) {
165+
let res = checkEmpty(value, field.required, messages); if (res != null) return res;
166166

167167
let re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
168168
if (!re.test(value))
169-
return [msg(resources.invalidEmail)];
169+
return [msg(messages.invalidEmail)];
170170
},
171171

172-
url(value, field) {
173-
let res = checkEmpty(value, field.required); if (res != null) return res;
172+
url(value, field, messages = resources) {
173+
let res = checkEmpty(value, field.required, messages); if (res != null) return res;
174174

175175
let re = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,4}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/g;
176176
if (!re.test(value))
177-
return [msg(resources.invalidURL)];
177+
return [msg(messages.invalidURL)];
178178
},
179179

180-
creditCard(value, field) {
181-
let res = checkEmpty(value, field.required); if (res != null) return res;
180+
creditCard(value, field, messages = resources) {
181+
let res = checkEmpty(value, field.required, messages); if (res != null) return res;
182182

183183
/* From validator.js code
184184
https://github.com/chriso/validator.js/blob/master/src/lib/isCreditCard.js
185185
*/
186186
const creditCard = /^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/;
187187
const sanitized = value.replace(/[^0-9]+/g, "");
188188
if (!creditCard.test(sanitized)) {
189-
return [msg(resources.invalidCard)];
189+
return [msg(messages.invalidCard)];
190190
}
191191
let sum = 0;
192192
let digit;
@@ -209,22 +209,32 @@ module.exports = {
209209
}
210210

211211
if (!((sum % 10) === 0 ? sanitized : false))
212-
return [msg(resources.invalidCardNumber)];
212+
return [msg(messages.invalidCardNumber)];
213213
},
214214

215-
alpha(value, field) {
216-
let res = checkEmpty(value, field.required); if (res != null) return res;
215+
alpha(value, field, messages = resources) {
216+
let res = checkEmpty(value, field.required, messages); if (res != null) return res;
217217

218218
let re = /^[a-zA-Z]*$/;
219219
if (!re.test(value))
220-
return [msg(resources.invalidTextContainNumber)];
220+
return [msg(messages.invalidTextContainNumber)];
221221
},
222222

223-
alphaNumeric(value, field) {
224-
let res = checkEmpty(value, field.required); if (res != null) return res;
223+
alphaNumeric(value, field, messages = resources) {
224+
let res = checkEmpty(value, field.required, messages); if (res != null) return res;
225225

226226
let re = /^[a-zA-Z0-9]*$/;
227227
if (!re.test(value))
228-
return [msg(resources.invalidTextContainSpec)];
228+
return [msg(messages.invalidTextContainSpec)];
229229
}
230230
};
231+
232+
Object.keys(module.exports).forEach(name => {
233+
const fn = module.exports[name];
234+
if (isFunction(fn)) {
235+
fn.locale = (customMessages) => {
236+
const messages = defaults(customMessages, resources);
237+
return (value, field) => fn(value, field, messages);
238+
};
239+
}
240+
});

test/unit/specs/utils/validators.spec.js

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ function check(validator, value, field, errorCount) {
1111
return res;
1212
}
1313

14-
describe("Validators", () => {
14+
describe.only("Validators", () => {
1515

1616
describe("test Validators.required", () => {
1717

@@ -427,4 +427,27 @@ describe("Validators", () => {
427427
});
428428

429429
});
430+
431+
describe("test local custom error messages", () => {
432+
433+
let field = {
434+
min: 5,
435+
max: 10,
436+
required: true
437+
};
438+
439+
let locNumber = v.number.locale({
440+
fieldIsRequired: "Ezt a mezőt kötelező kitölteni!",
441+
numberTooSmall: "Ez a szám nem lehet kisebb mint {0}!"
442+
});
443+
444+
it("should give the custom error message", () => {
445+
expect(locNumber(null, field)[0]).to.be.equal("Ezt a mezőt kötelező kitölteni!");
446+
expect(locNumber(2, field)[0]).to.be.equal("Ez a szám nem lehet kisebb mint 5!");
447+
});
448+
449+
it("should give the default error message", () => {
450+
expect(locNumber(30, field)[0]).to.be.equal("The number is too big! Maximum: 10");
451+
});
452+
});
430453
});

0 commit comments

Comments
 (0)