diff --git a/dist/aspnet-validation.min.js b/dist/aspnet-validation.min.js index 0ccfdd0..91cdf4c 100644 --- a/dist/aspnet-validation.min.js +++ b/dist/aspnet-validation.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.aspnetValidation=e():t.aspnetValidation=e()}(this,function(){return function(t){function e(n){if(r[n])return r[n].exports;var i=r[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,e),i.l=!0,i.exports}var r={};return e.m=t,e.c=r,e.d=function(t,r,n){e.o(t,r)||Object.defineProperty(t,r,{configurable:!1,enumerable:!0,get:n})},e.n=function(t){var r=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(r,"a",r),r},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=0)}([function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),r.d(e,"MvcValidationProviders",function(){return a}),r.d(e,"ValidationService",function(){return o});var n=this&&this.__awaiter||function(t,e,r,n){return new(r||(r=Promise))(function(i,a){function o(t){try{u(n.next(t))}catch(t){a(t)}}function s(t){try{u(n.throw(t))}catch(t){a(t)}}function u(t){t.done?i(t.value):new r(function(e){e(t.value)}).then(o,s)}u((n=n.apply(t,e||[])).next())})},i=this&&this.__generator||function(t,e){function r(t){return function(e){return n([t,e])}}function n(r){if(i)throw new TypeError("Generator is already executing.");for(;u;)try{if(i=1,a&&(o=a[2&r[0]?"return":r[0]?"throw":"next"])&&!(o=o.call(a,r[1])).done)return o;switch(a=0,o&&(r=[0,o.value]),r[0]){case 0:case 1:o=r;break;case 4:return u.label++,{value:r[1],done:!1};case 5:u.label++,a=r[1],r=[0];continue;case 7:r=u.ops.pop(),u.trys.pop();continue;default:if(o=u.trys,!(o=o.length>0&&o[o.length-1])&&(6===r[0]||2===r[0])){u=0;continue}if(3===r[0]&&(!o||r[1]>o[0]&&r[1]i)return!1}return!0},this.compare=function(t,e,r){if(!r.other)return!0;var n=document.getElementById(r.other.substr(2));return!n||n.value===t},this.range=function(t,e,r){if(!t)return!0;var n=parseFloat(t);if(isNaN(n))return!1;if(r.min){if(nparseFloat(r.max))return!1}return!0},this.regex=function(t,e,r){return!t||!r.pattern||new RegExp(r.pattern).test(t)},this.email=function(t,e,r){return!t||/^([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x22([^\x0d\x22\x5c\x80-\xff]|\x5c[\x00-\x7f])*\x22)(\x2e([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x22([^\x0d\x22\x5c\x80-\xff]|\x5c[\x00-\x7f])*\x22))*\x40([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x5b([^\x0d\x5b-\x5d\x80-\xff]|\x5c[\x00-\x7f])*\x5d)(\x2e([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x5b([^\x0d\x5b-\x5d\x80-\xff]|\x5c[\x00-\x7f])*\x5d))*(\.\w{2,})+$/.test(t)},this.creditcard=function(t,e,r){if(!t)return!0;if(/[^0-9 \-]+/.test(t))return!1;var n,i,a=0,o=0,s=!1;if(t=t.replace(/\D/g,""),t.length<13||t.length>19)return!1;for(n=t.length-1;n>=0;n--)i=t.charAt(n),o=parseInt(i,10),s&&(o*=2)>9&&(o-=9),a+=o,s=!s;return a%10==0},this.url=function(t,e,r){return!t||new RegExp("^(?:(?:https?|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))\\.?)(?::\\d{2,5})?(?:[/?#]\\S*)?$","i").test(t)},this.phone=function(t,e,r){return!t||!/[\+\-\s][\-\s]/g.test(t)&&/^\+?[0-9\-\s]+$/.test(t)},this.remote=function(t,e,r){return!t||new Promise(function(n,i){for(var a=r.url+"?"+e.name+"="+encodeURIComponent(t),o=r.additionalfields.split(","),s=0;s=200&&f.status<300){var e=JSON.parse(f.responseText);n(e)}else i({status:f.status,statusText:f.statusText,data:f.responseText})},f.onerror=function(t){i({status:f.status,statusText:f.statusText,data:f.responseText})},f.send()})}}return t}(),o=function(){function t(){this.providers={},this.messageFor={},this.elementUIDs=[],this.formInputs={},this.validators={},this.elementEvents={},this.summary={},this.debounce=300}return t.prototype.addProvider=function(t,e){this.providers[t]||(this.providers[t]=e)},t.prototype.addMvcProviders=function(){var t=new a;this.addProvider("required",t.required),this.addProvider("length",t.stringLength),this.addProvider("maxlength",t.stringLength),this.addProvider("minlength",t.stringLength),this.addProvider("equalto",t.compare),this.addProvider("range",t.range),this.addProvider("regex",t.regex),this.addProvider("creditcard",t.creditcard),this.addProvider("email",t.email),this.addProvider("url",t.url),this.addProvider("phone",t.phone),this.addProvider("remote",t.remote)},t.prototype.scanMessages=function(){for(var t=document.querySelectorAll("[data-valmsg-for]"),e=0;e0&&o[o.length-1])&&(6===r[0]||2===r[0])){u=0;continue}if(3===r[0]&&(!o||r[1]>o[0]&&r[1]i)return!1}return!0},this.compare=function(t,e,r){if(!r.other)return!0;var n=document.getElementById(r.other.substr(2));return!n||n.value===t},this.range=function(t,e,r){if(!t)return!0;var n=parseFloat(t);if(isNaN(n))return!1;if(r.min){if(nparseFloat(r.max))return!1}return!0},this.regex=function(t,e,r){return!t||!r.pattern||new RegExp(r.pattern).test(t)},this.email=function(t,e,r){return!t||/^([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x22([^\x0d\x22\x5c\x80-\xff]|\x5c[\x00-\x7f])*\x22)(\x2e([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x22([^\x0d\x22\x5c\x80-\xff]|\x5c[\x00-\x7f])*\x22))*\x40([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x5b([^\x0d\x5b-\x5d\x80-\xff]|\x5c[\x00-\x7f])*\x5d)(\x2e([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x5b([^\x0d\x5b-\x5d\x80-\xff]|\x5c[\x00-\x7f])*\x5d))*(\.\w{2,})+$/.test(t)},this.creditcard=function(t,e,r){if(!t)return!0;if(/[^0-9 \-]+/.test(t))return!1;var n,i,a=0,o=0,s=!1;if(t=t.replace(/\D/g,""),t.length<13||t.length>19)return!1;for(n=t.length-1;n>=0;n--)i=t.charAt(n),o=parseInt(i,10),s&&(o*=2)>9&&(o-=9),a+=o,s=!s;return a%10==0},this.url=function(t,e,r){return!t||new RegExp("^(?:(?:https?|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))\\.?)(?::\\d{2,5})?(?:[/?#]\\S*)?$","i").test(t)},this.phone=function(t,e,r){return!t||!/[\+\-\s][\-\s]/g.test(t)&&/^\+?[0-9\-\s]+$/.test(t)},this.remote=function(t,e,r){return!t||new Promise(function(n,i){for(var a=r.url+"?"+e.name+"="+encodeURIComponent(t),o=r.additionalfields.split(","),s=0;s=200&&f.status<300){var e=JSON.parse(f.responseText);n(e)}else i({status:f.status,statusText:f.statusText,data:f.responseText})},f.onerror=function(t){i({status:f.status,statusText:f.statusText,data:f.responseText})},f.send()})}}return t}(),o=function(){function t(){this.providers={},this.messageFor={},this.elementUIDs=[],this.formInputs={},this.validators={},this.elementEvents={},this.summary={},this.debounce=300}return t.prototype.addProvider=function(t,e){this.providers[t]||(this.providers[t]=e)},t.prototype.addMvcProviders=function(){var t=new a;this.addProvider("required",t.required),this.addProvider("length",t.stringLength),this.addProvider("maxlength",t.stringLength),this.addProvider("minlength",t.stringLength),this.addProvider("equalto",t.compare),this.addProvider("range",t.range),this.addProvider("regex",t.regex),this.addProvider("creditcard",t.creditcard),this.addProvider("email",t.email),this.addProvider("url",t.url),this.addProvider("phone",t.phone),this.addProvider("remote",t.remote)},t.prototype.scanMessages=function(){for(var t=document.querySelectorAll("[data-valmsg-for]"),e=0;e 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\n/**\r\n * Contains default implementations for ASP.NET Core MVC validation attributes.\r\n */\r\nvar MvcValidationProviders = (function () {\r\n function MvcValidationProviders() {\r\n /**\r\n * Validates whether the input has a value.\r\n */\r\n this.required = function (value, element, params) {\r\n return Boolean(value);\r\n };\r\n /**\r\n * Validates whether the input value satisfies the length contstraint.\r\n */\r\n this.stringLength = function (value, element, params) {\r\n if (!value) {\r\n return true;\r\n }\r\n if (params.min) {\r\n var min = parseInt(params.min);\r\n if (value.length < min) {\r\n return false;\r\n }\r\n }\r\n if (params.max) {\r\n var max = parseInt(params.max);\r\n if (value.length > max) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n /**\r\n * Validates whether the input value is equal to another input value.\r\n */\r\n this.compare = function (value, element, params) {\r\n if (!params.other) {\r\n return true;\r\n }\r\n // Sample other parameter: \"*.Name\"\r\n // Wat?\r\n var otherElement = document.getElementById(params.other.substr(2));\r\n if (!otherElement) {\r\n return true;\r\n }\r\n return (otherElement.value === value);\r\n };\r\n /**\r\n * Validates whether the input value is a number within a given range.\r\n */\r\n this.range = function (value, element, params) {\r\n if (!value) {\r\n return true;\r\n }\r\n var val = parseFloat(value);\r\n if (isNaN(val)) {\r\n return false;\r\n }\r\n if (params.min) {\r\n var min = parseFloat(params.min);\r\n if (val < min) {\r\n return false;\r\n }\r\n }\r\n if (params.max) {\r\n var max = parseFloat(params.max);\r\n if (val > max) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n /**\r\n * Validates whether the input value satisfies a regular expression pattern.\r\n */\r\n this.regex = function (value, element, params) {\r\n if (!value || !params.pattern) {\r\n return true;\r\n }\r\n var r = new RegExp(params.pattern);\r\n return r.test(value);\r\n };\r\n /**\r\n * Validates whether the input value is an email in accordance to RFC822 specification, with a top level domain.\r\n */\r\n this.email = function (value, element, params) {\r\n if (!value) {\r\n return true;\r\n }\r\n // RFC822 email address with .TLD validation\r\n // (c) Richard Willis, Chris Ferdinandi, MIT Licensed\r\n // https://gist.github.com/badsyntax/719800\r\n // https://gist.github.com/cferdinandi/d04aad4ce064b8da3edf21e26f8944c4\r\n var r = /^([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x22([^\\x0d\\x22\\x5c\\x80-\\xff]|\\x5c[\\x00-\\x7f])*\\x22)(\\x2e([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x22([^\\x0d\\x22\\x5c\\x80-\\xff]|\\x5c[\\x00-\\x7f])*\\x22))*\\x40([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x5b([^\\x0d\\x5b-\\x5d\\x80-\\xff]|\\x5c[\\x00-\\x7f])*\\x5d)(\\x2e([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x5b([^\\x0d\\x5b-\\x5d\\x80-\\xff]|\\x5c[\\x00-\\x7f])*\\x5d))*(\\.\\w{2,})+$/;\r\n return r.test(value);\r\n };\r\n /**\r\n * Validates whether the input value is a credit card number, with Luhn's Algorithm.\r\n */\r\n this.creditcard = function (value, element, params) {\r\n if (!value) {\r\n return true;\r\n }\r\n // (c) jquery-validation, MIT Licensed\r\n // https://github.com/jquery-validation/jquery-validation/blob/master/src/additional/creditcard.js\r\n // based on https://en.wikipedia.org/wiki/Luhn_algorithm\r\n // Accept only spaces, digits and dashes\r\n if (/[^0-9 \\-]+/.test(value)) {\r\n return false;\r\n }\r\n var nCheck = 0, nDigit = 0, bEven = false, n, cDigit;\r\n value = value.replace(/\\D/g, \"\");\r\n // Basing min and max length on https://developer.ean.com/general_info/Valid_Credit_Card_Types\r\n if (value.length < 13 || value.length > 19) {\r\n return false;\r\n }\r\n for (n = value.length - 1; n >= 0; n--) {\r\n cDigit = value.charAt(n);\r\n nDigit = parseInt(cDigit, 10);\r\n if (bEven) {\r\n if ((nDigit *= 2) > 9) {\r\n nDigit -= 9;\r\n }\r\n }\r\n nCheck += nDigit;\r\n bEven = !bEven;\r\n }\r\n return (nCheck % 10) === 0;\r\n };\r\n /**\r\n * Validates whether the input value is a URL.\r\n */\r\n this.url = function (value, element, params) {\r\n if (!value) {\r\n return true;\r\n }\r\n // (c) Diego Perini, MIT Licensed\r\n // https://gist.github.com/dperini/729294\r\n var r = new RegExp(\"^\" +\r\n // protocol identifier\r\n \"(?:(?:https?|ftp)://)\" +\r\n // user:pass authentication\r\n \"(?:\\\\S+(?::\\\\S*)?@)?\" +\r\n \"(?:\" +\r\n // IP address exclusion\r\n // private & local networks\r\n \"(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})\" +\r\n \"(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})\" +\r\n \"(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})\" +\r\n // IP address dotted notation octets\r\n // excludes loopback network 0.0.0.0\r\n // excludes reserved space >= 224.0.0.0\r\n // excludes network & broacast addresses\r\n // (first & last IP address of each class)\r\n \"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])\" +\r\n \"(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}\" +\r\n \"(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\" +\r\n \"|\" +\r\n // host name\r\n \"(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)\" +\r\n // domain name\r\n \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*\" +\r\n // TLD identifier\r\n \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,}))\" +\r\n // TLD may end with dot\r\n \"\\\\.?\" +\r\n \")\" +\r\n // port number\r\n \"(?::\\\\d{2,5})?\" +\r\n // resource path\r\n \"(?:[/?#]\\\\S*)?\" +\r\n \"$\", \"i\");\r\n return r.test(value);\r\n };\r\n /**\r\n * Validates whether the input value is a phone number.\r\n */\r\n this.phone = function (value, element, params) {\r\n if (!value) {\r\n return true;\r\n }\r\n // Allows whitespace or dash as number separator because some people like to do that...\r\n var consecutiveSeparator = /[\\+\\-\\s][\\-\\s]/g;\r\n if (consecutiveSeparator.test(value)) {\r\n return false;\r\n }\r\n var r = /^\\+?[0-9\\-\\s]+$/;\r\n return r.test(value);\r\n };\r\n /**\r\n * Asynchronously validates the input value to a JSON GET API endpoint.\r\n */\r\n this.remote = function (value, element, params) {\r\n if (!value) {\r\n return true;\r\n }\r\n return new Promise(function (ok, reject) {\r\n var url = params['url'] + '?' + element.name + '=' + encodeURIComponent(value);\r\n // params.additionalfields: *.Email,*.Username\r\n var xtras = params.additionalfields.split(',');\r\n for (var i = 0; i < xtras.length; i++) {\r\n var xtra = xtras[i].substr(2);\r\n if (xtra === element.name) {\r\n continue;\r\n }\r\n var e = document.getElementById(xtra);\r\n if (!e || !e.value) {\r\n continue;\r\n }\r\n url = url + '&' + e.name + '=' + encodeURIComponent(e.value);\r\n }\r\n var request = new XMLHttpRequest();\r\n request.open('get', url);\r\n request.onload = function (e) {\r\n if (request.status >= 200 && request.status < 300) {\r\n var data = JSON.parse(request.responseText);\r\n ok(data);\r\n }\r\n else {\r\n reject({\r\n status: request.status,\r\n statusText: request.statusText,\r\n data: request.responseText\r\n });\r\n }\r\n };\r\n request.onerror = function (e) {\r\n reject({\r\n status: request.status,\r\n statusText: request.statusText,\r\n data: request.responseText\r\n });\r\n };\r\n request.send();\r\n });\r\n };\r\n }\r\n return MvcValidationProviders;\r\n}());\r\n\r\n/**\r\n * Responsibles for managing the DOM elements and running the validation providers.\r\n */\r\nvar ValidationService = (function () {\r\n function ValidationService() {\r\n /**\r\n * A key-value collection of loaded validation plugins.\r\n */\r\n this.providers = {};\r\n /**\r\n * A key-value collection of elements for displaying validation messages for an input (by DOM ID).\r\n */\r\n this.messageFor = {};\r\n /**\r\n * A list of managed elements, each having a randomly assigned unique identifier (UID).\r\n */\r\n this.elementUIDs = [];\r\n /**\r\n * A key-value collection of input UIDs for a
UID.\r\n */\r\n this.formInputs = {};\r\n /**\r\n * A key-value map for input UID to its validator factory.\r\n */\r\n this.validators = {};\r\n /**\r\n * A key-value map for element UID to its trigger element (submit event for , input event for