UNPKG

angular2-json-schema-form

Version:
404 lines 22.1 kB
"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