angular2-json-schema-form
Version:
Angular 2 JSON Schema Form builder
404 lines • 22.1 kB
JavaScript
"use strict";
var validator_functions_1 = require("./validator.functions");
var utility_functions_1 = require("./utility.functions");
var JsonValidators = (function () {
function JsonValidators() {
}
JsonValidators.required = function (input) {
if (input === undefined)
input = true;
switch (input) {
case true:
return function (control, invert) {
if (invert === void 0) { invert = false; }
if (invert)
return null;
return validator_functions_1.hasValue(control.value) ? null : { 'required': true };
};
case false:
return function (control) { return null; };
default:
return validator_functions_1.hasValue(input.value) ?
null : { 'required': true };
}
};
;
JsonValidators.type = function (type) {
return function (control, invert) {
if (invert === void 0) { invert = false; }
if (validator_functions_1.isEmpty(control.value))
return null;
var actualValue = control.value;
var typeArray = validator_functions_1.isArray(type) ?
type : [type];
var isValid = false;
for (var _i = 0, typeArray_1 = typeArray; _i < typeArray_1.length; _i++) {
var typeValue = typeArray_1[_i];
if (validator_functions_1.isType(actualValue, typeValue) === true) {
isValid = true;
break;
}
}
return validator_functions_1.xor(isValid, invert) ?
null : { 'type': { type: type, actualValue: actualValue } };
};
};
JsonValidators.enum = function (enumList) {
return function (control, invert) {
if (invert === void 0) { invert = false; }
if (validator_functions_1.isEmpty(control.value))
return null;
var isValid = true;
var actualValues = (validator_functions_1.isArray(control.value)) ?
control.value : [control.value];
for (var i1 = 0, l1 = actualValues.length; i1 < l1; i1++) {
var actualValue = actualValues[i1];
var itemIsValid = false;
for (var i2 = 0, l2 = enumList.length; i2 < l2; i2++) {
var enumValue = enumList[i2];
if (actualValue === enumValue) {
itemIsValid = true;
break;
}
else if (validator_functions_1.isNumber(enumValue) && +actualValue === +enumValue) {
itemIsValid = true;
break;
}
else if (validator_functions_1.isBoolean(enumValue, 'strict') &&
validator_functions_1.toJavaScriptType(actualValue, 'boolean') === enumValue) {
itemIsValid = true;
break;
}
else if (enumValue === null && !validator_functions_1.hasValue(actualValue)) {
itemIsValid = true;
break;
}
}
if (!itemIsValid) {
isValid = false;
break;
}
}
return validator_functions_1.xor(isValid, invert) ?
null : { 'enum': { 'enum': enumList, 'actualValue': control.value } };
};
};
JsonValidators.minLength = function (requiredLength) {
return function (control, invert) {
if (invert === void 0) { invert = false; }
if (validator_functions_1.isEmpty(control.value))
return null;
var actualLength = validator_functions_1.isString(control.value) ? control.value.length : 0;
var isValid = actualLength >= requiredLength;
return validator_functions_1.xor(isValid, invert) ?
null :
{ 'minlength': { requiredLength: requiredLength, actualLength: actualLength } };
};
};
;
JsonValidators.maxLength = function (requiredLength) {
return function (control, invert) {
if (invert === void 0) { invert = false; }
var actualLength = validator_functions_1.isString(control.value) ? control.value.length : 0;
var isValid = actualLength <= requiredLength;
return validator_functions_1.xor(isValid, invert) ?
null :
{ 'maxlength': { requiredLength: requiredLength, actualLength: actualLength } };
};
};
;
JsonValidators.pattern = function (pattern, wholeString) {
if (wholeString === void 0) { wholeString = false; }
return function (control, invert) {
if (invert === void 0) { invert = false; }
if (validator_functions_1.isEmpty(control.value))
return null;
var actualValue = control.value;
var requiredPattern = (wholeString) ? "^" + pattern + "$" : pattern;
var regex = new RegExp(requiredPattern);
var isValid = validator_functions_1.isString(actualValue) ? regex.test(actualValue) : false;
return validator_functions_1.xor(isValid, invert) ?
null : { 'pattern': { requiredPattern: requiredPattern, actualValue: actualValue } };
};
};
JsonValidators.format = function (format) {
return function (control, invert) {
if (invert === void 0) { invert = false; }
if (validator_functions_1.isEmpty(control.value))
return null;
var isValid;
var actualValue = control.value;
if (!validator_functions_1.isString(actualValue)) {
isValid = false;
}
else {
switch (format) {
case 'date-time':
isValid = !!actualValue.match(/^([0-9]+)-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])[Tt]([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]|60)(\.[0-9]+)?(([Zz])|([\+|\-]([01][0-9]|2[0-3]):[0-5][0-9]))$/);
break;
case 'email':
var parts = actualValue.split('@');
isValid =
!!parts && parts.length === 2 &&
!!parts[0].match(/^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")$/)
&&
!!parts[1].match(/(?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|\b-){0,61}[0-9A-Za-z])?(?:\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|\b-){0,61}[0-9A-Za-z])?)*\.?/);
break;
case 'hostname':
isValid = !!actualValue.match(/(?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|\b-){0,61}[0-9A-Za-z])?(?:\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|\b-){0,61}[0-9A-Za-z])?)*\.?/);
break;
case 'ipv4':
isValid = !!actualValue.match(/^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/);
break;
case 'ipv6':
isValid = !!actualValue.match(/(([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))/);
break;
case 'uri':
case 'url':
isValid = !!actualValue.match(/^((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)$/);
break;
case 'color':
isValid = !!actualValue.match(/^#[A-Fa-f0-9]{6}$/);
break;
default:
console.error('format validator error: "' + format +
'" is not a recognized format.');
isValid = true;
}
}
return validator_functions_1.xor(isValid, invert) ?
null : { 'format': { format: format, actualValue: actualValue } };
};
};
JsonValidators.minimum = function (minimum, exclusiveMinimum) {
if (exclusiveMinimum === void 0) { exclusiveMinimum = false; }
return function (control, invert) {
if (invert === void 0) { invert = false; }
if (validator_functions_1.isEmpty(control.value))
return null;
var actualValue = control.value;
var isValid = validator_functions_1.isNumber(actualValue) &&
exclusiveMinimum ? actualValue > minimum : actualValue >= minimum;
return validator_functions_1.xor(isValid, invert) ?
null : { 'minimum': { minimum: minimum, exclusiveMinimum: exclusiveMinimum, actualValue: actualValue } };
};
};
JsonValidators.maximum = function (maximum, exclusiveMaximum) {
if (exclusiveMaximum === void 0) { exclusiveMaximum = false; }
return function (control, invert) {
if (invert === void 0) { invert = false; }
if (validator_functions_1.isEmpty(control.value))
return null;
var actualValue = control.value;
var isValid = validator_functions_1.isNumber(actualValue) &&
exclusiveMaximum ? actualValue < maximum : actualValue <= maximum;
return validator_functions_1.xor(isValid, invert) ?
null : { 'maximum': { maximum: maximum, exclusiveMaximum: exclusiveMaximum, actualValue: actualValue } };
};
};
JsonValidators.multipleOf = function (multipleOf) {
return function (control, invert) {
if (invert === void 0) { invert = false; }
if (validator_functions_1.isEmpty(control.value))
return null;
var actualValue = control.value;
var isValid = validator_functions_1.isNumber(actualValue) && actualValue % multipleOf === 0;
return validator_functions_1.xor(isValid, invert) ?
null : { 'multipleOf': { multipleOf: multipleOf, actualValue: actualValue } };
};
};
JsonValidators.minProperties = function (minProperties) {
return function (control, invert) {
if (invert === void 0) { invert = false; }
if (validator_functions_1.isEmpty(control.value))
return null;
var actualProperties = Object.keys(control.value).length || 0;
var isValid = actualProperties >= minProperties;
return validator_functions_1.xor(isValid, invert) ?
null : { 'minProperties': { minProperties: minProperties, actualProperties: actualProperties } };
};
};
JsonValidators.maxProperties = function (maxProperties) {
return function (control, invert) {
if (invert === void 0) { invert = false; }
var actualProperties = Object.keys(control.value).length || 0;
var isValid = actualProperties <= maxProperties;
return validator_functions_1.xor(isValid, invert) ?
null : { 'maxProperties': { maxProperties: maxProperties, actualProperties: actualProperties } };
};
};
JsonValidators.dependencies = function (dependencies) {
return function (control, invert) {
if (invert === void 0) { invert = false; }
if (validator_functions_1.isEmpty(control.value))
return null;
if (validator_functions_1.getType(dependencies) !== 'object' || validator_functions_1.isEmpty(dependencies))
return null;
var allErrors = validator_functions_1._mergeObjects(utility_functions_1.forEachCopy(dependencies, function (value, requiringField) {
if (!validator_functions_1.hasValue(control.value[requiringField]))
return null;
var requiringFieldErrors = {};
var requiredFields;
var properties = {};
if (validator_functions_1.getType(dependencies[requiringField]) === 'array') {
requiredFields = dependencies[requiringField];
}
else if (validator_functions_1.getType(dependencies[requiringField]) === 'object') {
requiredFields = dependencies[requiringField]['required'] || [];
properties = dependencies[requiringField]['properties'] || {};
}
for (var _i = 0, requiredFields_1 = requiredFields; _i < requiredFields_1.length; _i++) {
var requiredField = requiredFields_1[_i];
if (validator_functions_1.xor(!validator_functions_1.hasValue(control.value[requiredField]), invert)) {
requiringFieldErrors[requiredField] = { 'required': true };
}
}
requiringFieldErrors = validator_functions_1._mergeObjects(requiringFieldErrors, utility_functions_1.forEachCopy(properties, function (requirements, requiredField) {
var requiredFieldErrors = validator_functions_1._mergeObjects(utility_functions_1.forEachCopy(requirements, function (requirement, parameter) {
var validator = null;
if (requirement === 'maximum' || requirement === 'minimum') {
var exclusive = !!requirements['exclusiveM' + requirement.slice(1)];
validator = JsonValidators[requirement](parameter, exclusive);
}
else if (typeof JsonValidators[requirement] === 'function') {
validator = JsonValidators[requirement](parameter);
}
return !validator_functions_1.isDefined(validator) ?
null : validator(control.value[requiredField]);
}));
return validator_functions_1.isEmpty(requiredFieldErrors) ?
null : (_a = {}, _a[requiredField] = requiredFieldErrors, _a);
var _a;
}));
return validator_functions_1.isEmpty(requiringFieldErrors) ?
null : (_a = {}, _a[requiringField] = requiringFieldErrors, _a);
var _a;
}));
return validator_functions_1.isEmpty(allErrors) ? null : allErrors;
};
};
JsonValidators.minItems = function (minItems) {
return function (control, invert) {
if (invert === void 0) { invert = false; }
if (validator_functions_1.isEmpty(control.value))
return null;
var actualItems = validator_functions_1.isArray(control.value) ? control.value.length : 0;
var isValid = actualItems >= minItems;
return validator_functions_1.xor(isValid, invert) ?
null : { 'minItems': { minItems: minItems, actualItems: actualItems } };
};
};
JsonValidators.maxItems = function (maxItems) {
return function (control, invert) {
if (invert === void 0) { invert = false; }
var actualItems = validator_functions_1.isArray(control.value) ? control.value.length : 0;
var isValid = actualItems <= maxItems;
return validator_functions_1.xor(isValid, invert) ?
null : { 'maxItems': { maxItems: maxItems, actualItems: actualItems } };
};
};
JsonValidators.uniqueItems = function (unique) {
if (unique === void 0) { unique = true; }
return function (control, invert) {
if (invert === void 0) { invert = false; }
if (!unique)
return null;
if (validator_functions_1.isEmpty(control.value))
return null;
var sorted = control.value.slice().sort();
var duplicateItems = [];
for (var i = 1, l = sorted.length; i < l; i++) {
if (sorted[i - 1] === sorted[i] &&
duplicateItems.indexOf(sorted[i]) !== -1) {
duplicateItems.push(sorted[i]);
}
}
var isValid = !duplicateItems.length;
return validator_functions_1.xor(isValid, invert) ?
null : { 'uniqueItems': { duplicateItems: duplicateItems } };
};
};
JsonValidators.nullValidator = function (c) { return null; };
JsonValidators.composeAnyOf = function (validators) {
if (!validators)
return null;
var presentValidators = validators.filter(validator_functions_1.isDefined);
if (presentValidators.length === 0)
return null;
return function (control, invert) {
if (invert === void 0) { invert = false; }
var arrayOfErrors = validator_functions_1._executeValidators(control, presentValidators, invert).filter(validator_functions_1.isDefined);
var isValid = validators.length > arrayOfErrors.length;
return validator_functions_1.xor(isValid, invert) ?
null : validator_functions_1._mergeObjects.apply(arrayOfErrors.concat({ 'anyOf': !invert }));
};
};
JsonValidators.composeOneOf = function (validators) {
if (!validators)
return null;
var presentValidators = validators.filter(validator_functions_1.isDefined);
if (presentValidators.length === 0)
return null;
return function (control, invert) {
if (invert === void 0) { invert = false; }
var arrayOfErrors = validator_functions_1._executeValidators(control, presentValidators);
var validControls = validators.length - arrayOfErrors.filter(validator_functions_1.isDefined).length;
var isValid = validControls === 1;
if (validator_functions_1.xor(isValid, invert))
return null;
var arrayOfValids = validator_functions_1._executeValidators(control, presentValidators, invert);
return validator_functions_1._mergeObjects.apply(arrayOfErrors.concat(arrayOfValids).concat({ 'oneOf': !invert }));
};
};
JsonValidators.composeAllOf = function (validators) {
if (!validators)
return null;
var presentValidators = validators.filter(validator_functions_1.isDefined);
if (presentValidators.length === 0)
return null;
return function (control, invert) {
if (invert === void 0) { invert = false; }
var combinedErrors = validator_functions_1._mergeErrors(validator_functions_1._executeValidators(control, presentValidators, invert));
var isValid = combinedErrors === null;
return (validator_functions_1.xor(isValid, invert)) ?
null : validator_functions_1._mergeObjects(combinedErrors, { 'allOf': !invert });
};
};
JsonValidators.composeNot = function (validator) {
return function (control, invert) {
if (invert === void 0) { invert = false; }
if (validator_functions_1.isEmpty(control.value))
return null;
var error = validator(control, !invert);
var isValid = error === null;
return (validator_functions_1.xor(isValid, invert)) ?
null : validator_functions_1._mergeObjects(error, { 'not': !invert });
};
};
JsonValidators.compose = function (validators) {
if (!validators)
return null;
var presentValidators = validators.filter(validator_functions_1.isDefined);
if (presentValidators.length === 0)
return null;
return function (control, invert) {
if (invert === void 0) { invert = false; }
return validator_functions_1._mergeErrors(validator_functions_1._executeValidators(control, presentValidators, invert));
};
};
;
JsonValidators.composeAsync = function (validators) {
if (!validators)
return null;
var presentValidators = validators.filter(validator_functions_1.isDefined);
if (presentValidators.length === 0)
return null;
return function (control, invert) {
if (invert === void 0) { invert = false; }
return Promise.all(validator_functions_1._executeAsyncValidators(control, presentValidators).map(validator_functions_1._convertToPromise)).then(validator_functions_1._mergeErrors);
};
};
return JsonValidators;
}());
exports.JsonValidators = JsonValidators;
//# sourceMappingURL=json.validators.js.map