不要怂,就是干,撸起袖子干!

Commit e45af139 by Jan Aagaard Meier

Merge pull request #5433 from oss92/support_locales

Added locales support for localized validations
2 parents 3d2dd9c5 69f6da44
...@@ -250,18 +250,34 @@ InstanceValidator.prototype._invokeCustomValidator = Promise.method(function(val ...@@ -250,18 +250,34 @@ InstanceValidator.prototype._invokeCustomValidator = Promise.method(function(val
* @private * @private
*/ */
InstanceValidator.prototype._invokeBuiltinValidator = Promise.method(function(value, test, validatorType, field) { InstanceValidator.prototype._invokeBuiltinValidator = Promise.method(function(value, test, validatorType, field) {
var self = this;
// check if Validator knows that kind of validation test // check if Validator knows that kind of validation test
if (typeof validator[validatorType] !== 'function') { if (typeof validator[validatorType] !== 'function') {
throw new Error('Invalid validator function: ' + validatorType); throw new Error('Invalid validator function: ' + validatorType);
} }
var validatorArgs = self._extractValidatorArgs(test, validatorType, field);
if (!validator[validatorType].apply(validator, [value].concat(validatorArgs))) {
// extract the error msg
throw new Error(test.msg || 'Validation ' + validatorType + ' failed');
}
});
// extract extra arguments for the validator /**
* Will extract arguments for the validator.
*
* @param {*} test The test case.
* @param {string} validatorType One of known to Sequelize validators.
* @param {string} field The field that is being validated.
* @private
*/
InstanceValidator.prototype._extractValidatorArgs = function(test, validatorType, field) {
var validatorArgs = test.args || test; var validatorArgs = test.args || test;
var isLocalizedValidator = typeof(validatorArgs) !== 'string' && (validatorType === 'isAlpha' || validatorType === 'isAlphanumeric' || validatorType === 'isMobilePhone');
if (!Array.isArray(validatorArgs)) { if (!Array.isArray(validatorArgs)) {
if (validatorType === 'isImmutable') { if (validatorType === 'isImmutable') {
validatorArgs = [validatorArgs, field]; validatorArgs = [validatorArgs, field];
} else if (validatorType === 'isIP' || validatorType === 'isAlpha' || validatorType === 'isAlphanumeric') { } else if (isLocalizedValidator || validatorType === 'isIP') {
validatorArgs = []; validatorArgs = [];
} else { } else {
validatorArgs = [validatorArgs]; validatorArgs = [validatorArgs];
...@@ -269,12 +285,8 @@ InstanceValidator.prototype._invokeBuiltinValidator = Promise.method(function(va ...@@ -269,12 +285,8 @@ InstanceValidator.prototype._invokeBuiltinValidator = Promise.method(function(va
} else { } else {
validatorArgs = validatorArgs.slice(0); validatorArgs = validatorArgs.slice(0);
} }
return validatorArgs;
if (!validator[validatorType].apply(validator, [value].concat(validatorArgs))) { };
// extract the error msg
throw new Error(test.msg || 'Validation ' + validatorType + ' failed');
}
});
/** /**
* Will validate a single field against its schema definition (isnull). * Will validate a single field against its schema definition (isnull).
......
...@@ -46,10 +46,14 @@ describe(Support.getTestDialectTeaser('InstanceValidator'), function() { ...@@ -46,10 +46,14 @@ describe(Support.getTestDialectTeaser('InstanceValidator'), function() {
pass: 'fe80:0000:0000:0000:0204:61ff:fe9d:f156' pass: 'fe80:0000:0000:0000:0204:61ff:fe9d:f156'
} }
, isAlpha: { , isAlpha: {
stringOrBoolean: true,
spec: { args: 'en-GB' },
fail: '012', fail: '012',
pass: 'abc' pass: 'abc'
} }
, isAlphanumeric: { , isAlphanumeric: {
stringOrBoolean: true,
spec: { args: 'en-GB' },
fail: '_abc019', fail: '_abc019',
pass: 'abc019' pass: 'abc019'
} }
...@@ -183,12 +187,7 @@ describe(Support.getTestDialectTeaser('InstanceValidator'), function() { ...@@ -183,12 +187,7 @@ describe(Support.getTestDialectTeaser('InstanceValidator'), function() {
var validations = {} var validations = {}
, message = validator + '(' + failingValue + ')'; , message = validator + '(' + failingValue + ')';
if (validatorDetails.spec) { validations[validator] = validatorDetails.spec || {};
validations[validator] = validatorDetails.spec;
} else {
validations[validator] = {};
}
validations[validator].msg = message; validations[validator].msg = message;
var UserFail = this.sequelize.define('User' + config.rand(), { var UserFail = this.sequelize.define('User' + config.rand(), {
...@@ -210,19 +209,16 @@ describe(Support.getTestDialectTeaser('InstanceValidator'), function() { ...@@ -210,19 +209,16 @@ describe(Support.getTestDialectTeaser('InstanceValidator'), function() {
, applyPassTest = function applyPassTest(validatorDetails, j, validator, type) { , applyPassTest = function applyPassTest(validatorDetails, j, validator, type) {
var succeedingValue = validatorDetails.pass[j]; var succeedingValue = validatorDetails.pass[j];
it('correctly specifies an instance as valid using a value of "' + succeedingValue + '" for the validation "' + validator + '"', function() { it('correctly specifies an instance as valid using a value of "' + succeedingValue + '" for the validation "' + validator + '"', function() {
var validations = {}; var validations = {}
, message = validator + '(' + succeedingValue + ')';
if (validatorDetails.spec !== undefined) { validations[validator] = validatorDetails.spec || {};
validations[validator] = validatorDetails.spec;
} else {
validations[validator] = {};
}
if (type === 'msg') { if (type === 'msg') {
validations[validator].msg = validator + '(' + succeedingValue + ')'; validations[validator].msg = message;
} else if (type === 'args') { } else if (type === 'args') {
validations[validator].args = validations[validator].args || true; validations[validator].args = validations[validator].args || true;
validations[validator].msg = validator + '(' + succeedingValue + ')'; validations[validator].msg = message;
} else if (type === 'true') { } else if (type === 'true') {
validations[validator] = true; validations[validator] = true;
} }
...@@ -260,7 +256,7 @@ describe(Support.getTestDialectTeaser('InstanceValidator'), function() { ...@@ -260,7 +256,7 @@ describe(Support.getTestDialectTeaser('InstanceValidator'), function() {
applyPassTest(validatorDetails, i, validator); applyPassTest(validatorDetails, i, validator);
applyPassTest(validatorDetails, i, validator, 'msg'); applyPassTest(validatorDetails, i, validator, 'msg');
applyPassTest(validatorDetails, i, validator, 'args'); applyPassTest(validatorDetails, i, validator, 'args');
if (validatorDetails.spec === undefined) { if (validatorDetails.stringOrBoolean || (validatorDetails.spec === undefined)) {
applyPassTest(validatorDetails, i, validator, 'true'); applyPassTest(validatorDetails, i, validator, 'true');
} }
} }
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!