angular.validators
Advanced tools
Comparing version 4.0.7 to 4.2.1
@@ -125,740 +125,830 @@ 'use strict'; | ||
'use strict'; | ||
'use strict'; | ||
validator = { version: '4.0.2' }; | ||
validator = { version: '4.2.1' }; | ||
var emailUser = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~])+)*)|"(\s*(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e])|(\\[\x01-\x09\x0b\x0c\x0d-\x7f])))*\s*")$/i; | ||
var emailUserPart = /^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~]+$/i; | ||
var quotedEmailUser = /^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f]))*$/i; | ||
var emailUserUtf8 = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|"(\s*(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*\s*")$/i; | ||
var emailUserUtf8Part = /^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+$/i; | ||
var quotedEmailUserUtf8 = /^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))*$/i; | ||
var displayName = /^(?:[a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~\.]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(?:[a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~\.]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|\s)*<(.+)>$/i; | ||
var displayName = /^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~\.\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~\.\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF\s]*<(.+)>$/i; | ||
var 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})$/; | ||
var 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})$/; | ||
var isin = /^[A-Z]{2}[0-9A-Z]{9}[0-9]$/; | ||
var isin = /^[A-Z]{2}[0-9A-Z]{9}[0-9]$/; | ||
var isbn10Maybe = /^(?:[0-9]{9}X|[0-9]{10})$/ | ||
, isbn13Maybe = /^(?:[0-9]{13})$/; | ||
var isbn10Maybe = /^(?:[0-9]{9}X|[0-9]{10})$/ | ||
, isbn13Maybe = /^(?:[0-9]{13})$/; | ||
var ipv4Maybe = /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/ | ||
, ipv6Block = /^[0-9A-F]{1,4}$/i; | ||
var ipv4Maybe = /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/ | ||
, ipv6Block = /^[0-9A-F]{1,4}$/i; | ||
var uuid = { | ||
'3': /^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i | ||
, '4': /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i | ||
, '5': /^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i | ||
, all: /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i | ||
}; | ||
var uuid = { | ||
'3': /^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i | ||
, '4': /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i | ||
, '5': /^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i | ||
, all: /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i | ||
}; | ||
var alpha = /^[A-Z]+$/i | ||
, alphanumeric = /^[0-9A-Z]+$/i | ||
, numeric = /^[-+]?[0-9]+$/ | ||
, int = /^(?:[-+]?(?:0|[1-9][0-9]*))$/ | ||
, float = /^(?:[-+]?(?:[0-9]+))?(?:\.[0-9]*)?(?:[eE][\+\-]?(?:[0-9]+))?$/ | ||
, hexadecimal = /^[0-9A-F]+$/i | ||
, decimal = /^[-+]?([0-9]+|\.[0-9]+|[0-9]+\.[0-9]+)$/ | ||
, hexcolor = /^#?([0-9A-F]{3}|[0-9A-F]{6})$/i; | ||
var alpha = /^[A-Z]+$/i | ||
, alphanumeric = /^[0-9A-Z]+$/i | ||
, numeric = /^[-+]?[0-9]+$/ | ||
, int = /^(?:[-+]?(?:0|[1-9][0-9]*))$/ | ||
, float = /^(?:[-+]?(?:[0-9]+))?(?:\.[0-9]*)?(?:[eE][\+\-]?(?:[0-9]+))?$/ | ||
, hexadecimal = /^[0-9A-F]+$/i | ||
, decimal = /^[-+]?([0-9]+|\.[0-9]+|[0-9]+\.[0-9]+)$/ | ||
, hexcolor = /^#?([0-9A-F]{3}|[0-9A-F]{6})$/i; | ||
var ascii = /^[\x00-\x7F]+$/ | ||
, multibyte = /[^\x00-\x7F]/ | ||
, fullWidth = /[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/ | ||
, halfWidth = /[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/; | ||
var ascii = /^[\x00-\x7F]+$/ | ||
, multibyte = /[^\x00-\x7F]/ | ||
, fullWidth = /[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/ | ||
, halfWidth = /[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/; | ||
var surrogatePair = /[\uD800-\uDBFF][\uDC00-\uDFFF]/; | ||
var surrogatePair = /[\uD800-\uDBFF][\uDC00-\uDFFF]/; | ||
var base64 = /^(?:[A-Z0-9+\/]{4})*(?:[A-Z0-9+\/]{2}==|[A-Z0-9+\/]{3}=|[A-Z0-9+\/]{4})$/i; | ||
var base64 = /^(?:[A-Z0-9+\/]{4})*(?:[A-Z0-9+\/]{2}==|[A-Z0-9+\/]{3}=|[A-Z0-9+\/]{4})$/i; | ||
var phones = { | ||
'zh-CN': /^(\+?0?86\-?)?1[345789]\d{9}$/, | ||
'en-ZA': /^(\+?27|0)\d{9}$/, | ||
'en-AU': /^(\+?61|0)4\d{8}$/, | ||
'en-HK': /^(\+?852\-?)?[569]\d{3}\-?\d{4}$/, | ||
'fr-FR': /^(\+?33|0)[67]\d{8}$/, | ||
'pt-PT': /^(\+351)?9[1236]\d{7}$/, | ||
'el-GR': /^(\+30)?((2\d{9})|(69\d{8}))$/, | ||
'en-GB': /^(\+?44|0)7\d{9}$/, | ||
'en-US': /^(\+?1)?[2-9]\d{2}[2-9](?!11)\d{6}$/, | ||
'en-ZM': /^(\+26)?09[567]\d{7}$/, | ||
'ru-RU': /^(\+?7|8)?9\d{9}$/ | ||
}; | ||
var phones = { | ||
'zh-CN': /^(\+?0?86\-?)?1[345789]\d{9}$/, | ||
'zh-TW': /^(\+?886\-?|0)?9\d{8}$/, | ||
'en-ZA': /^(\+?27|0)\d{9}$/, | ||
'en-AU': /^(\+?61|0)4\d{8}$/, | ||
'en-HK': /^(\+?852\-?)?[569]\d{3}\-?\d{4}$/, | ||
'fr-FR': /^(\+?33|0)[67]\d{8}$/, | ||
'pt-PT': /^(\+351)?9[1236]\d{7}$/, | ||
'el-GR': /^(\+30)?((2\d{9})|(69\d{8}))$/, | ||
'en-GB': /^(\+?44|0)7\d{9}$/, | ||
'en-US': /^(\+?1)?[2-9]\d{2}[2-9](?!11)\d{6}$/, | ||
'en-ZM': /^(\+26)?09[567]\d{7}$/, | ||
'ru-RU': /^(\+?7|8)?9\d{9}$/, | ||
'nb-NO': /^(\+?47)?[49]\d{7}$/, | ||
'nn-NO': /^(\+?47)?[49]\d{7}$/ | ||
}; | ||
// from http://goo.gl/0ejHHW | ||
var iso8601 = /^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24\:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/; | ||
// from http://goo.gl/0ejHHW | ||
var iso8601 = /^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24\:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/; | ||
validator.extend = function (name, fn) { | ||
validator[name] = function () { | ||
var args = Array.prototype.slice.call(arguments); | ||
args[0] = validator.toString(args[0]); | ||
return fn.apply(validator, args); | ||
}; | ||
validator.extend = function (name, fn) { | ||
validator[name] = function () { | ||
var args = Array.prototype.slice.call(arguments); | ||
args[0] = validator.toString(args[0]); | ||
return fn.apply(validator, args); | ||
}; | ||
}; | ||
//Right before exporting the validator object, pass each of the builtins | ||
//through extend() so that their first argument is coerced to a string | ||
validator.init = function () { | ||
for (var name in validator) { | ||
if (typeof validator[name] !== 'function' || name === 'toString' || | ||
name === 'toDate' || name === 'extend' || name === 'init') { | ||
continue; | ||
} | ||
validator.extend(name, validator[name]); | ||
} | ||
}; | ||
//Right before exporting the validator object, pass each of the builtins | ||
//through extend() so that their first argument is coerced to a string | ||
validator.init = function () { | ||
for (var name in validator) { | ||
if (typeof validator[name] !== 'function' || name === 'toString' || | ||
name === 'toDate' || name === 'extend' || name === 'init') { | ||
continue; | ||
} | ||
validator.extend(name, validator[name]); | ||
} | ||
}; | ||
validator.toString = function (input) { | ||
if (typeof input === 'object' && input !== null && input.toString) { | ||
input = input.toString(); | ||
} else if (input === null || typeof input === 'undefined' || (isNaN(input) && !input.length)) { | ||
input = ''; | ||
} else if (typeof input !== 'string') { | ||
input += ''; | ||
} | ||
return input; | ||
}; | ||
validator.toString = function (input) { | ||
if (typeof input === 'object' && input !== null && input.toString) { | ||
input = input.toString(); | ||
} else if (input === null || typeof input === 'undefined' || (isNaN(input) && !input.length)) { | ||
input = ''; | ||
} | ||
return '' + input; | ||
}; | ||
validator.toDate = function (date) { | ||
if (Object.prototype.toString.call(date) === '[object Date]') { | ||
return date; | ||
} | ||
date = Date.parse(date); | ||
return !isNaN(date) ? new Date(date) : null; | ||
}; | ||
validator.toDate = function (date) { | ||
if (Object.prototype.toString.call(date) === '[object Date]') { | ||
return date; | ||
} | ||
date = Date.parse(date); | ||
return !isNaN(date) ? new Date(date) : null; | ||
}; | ||
validator.toFloat = function (str) { | ||
return parseFloat(str); | ||
}; | ||
validator.toFloat = function (str) { | ||
return parseFloat(str); | ||
}; | ||
validator.toInt = function (str, radix) { | ||
return parseInt(str, radix || 10); | ||
}; | ||
validator.toInt = function (str, radix) { | ||
return parseInt(str, radix || 10); | ||
}; | ||
validator.toBoolean = function (str, strict) { | ||
if (strict) { | ||
return str === '1' || str === 'true'; | ||
} | ||
return str !== '0' && str !== 'false' && str !== ''; | ||
}; | ||
validator.toBoolean = function (str, strict) { | ||
if (strict) { | ||
return str === '1' || str === 'true'; | ||
} | ||
return str !== '0' && str !== 'false' && str !== ''; | ||
}; | ||
validator.equals = function (str, comparison) { | ||
return str === validator.toString(comparison); | ||
}; | ||
validator.equals = function (str, comparison) { | ||
return str === validator.toString(comparison); | ||
}; | ||
validator.contains = function (str, elem) { | ||
return str.indexOf(validator.toString(elem)) >= 0; | ||
}; | ||
validator.contains = function (str, elem) { | ||
return str.indexOf(validator.toString(elem)) >= 0; | ||
}; | ||
validator.matches = function (str, pattern, modifiers) { | ||
if (Object.prototype.toString.call(pattern) !== '[object RegExp]') { | ||
pattern = new RegExp(pattern, modifiers); | ||
} | ||
return pattern.test(str); | ||
}; | ||
validator.matches = function (str, pattern, modifiers) { | ||
if (Object.prototype.toString.call(pattern) !== '[object RegExp]') { | ||
pattern = new RegExp(pattern, modifiers); | ||
} | ||
return pattern.test(str); | ||
}; | ||
var default_email_options = { | ||
allow_display_name: false, | ||
allow_utf8_local_part: true, | ||
require_tld: true | ||
}; | ||
var default_email_options = { | ||
allow_display_name: false, | ||
allow_utf8_local_part: true, | ||
require_tld: true | ||
}; | ||
validator.isEmail = function (str, options) { | ||
options = merge(options, default_email_options); | ||
validator.isEmail = function (str, options) { | ||
options = merge(options, default_email_options); | ||
if (options.allow_display_name) { | ||
var display_email = str.match(displayName); | ||
if (display_email) { | ||
str = display_email[1]; | ||
} | ||
} | ||
if (options.allow_display_name) { | ||
var display_email = str.match(displayName); | ||
if (display_email) { | ||
str = display_email[1]; | ||
} | ||
} | ||
var parts = str.split('@') | ||
, domain = parts.pop() | ||
, user = parts.join('@'); | ||
var parts = str.split('@') | ||
, domain = parts.pop() | ||
, user = parts.join('@'); | ||
var lower_domain = domain.toLowerCase(); | ||
if (lower_domain === 'gmail.com' || lower_domain === 'googlemail.com') { | ||
user = user.replace(/\./g, '').toLowerCase(); | ||
} | ||
var lower_domain = domain.toLowerCase(); | ||
if (lower_domain === 'gmail.com' || lower_domain === 'googlemail.com') { | ||
user = user.replace(/\./g, '').toLowerCase(); | ||
} | ||
if (!validator.isByteLength(user, 0, 64) || | ||
!validator.isByteLength(domain, 0, 256)) { | ||
return false; | ||
} | ||
if (!validator.isByteLength(user, 0, 64) || | ||
!validator.isByteLength(domain, 0, 256)) { | ||
return false; | ||
} | ||
if (!validator.isFQDN(domain, {require_tld: options.require_tld})) { | ||
return false; | ||
} | ||
if (!validator.isFQDN(domain, {require_tld: options.require_tld})) { | ||
return false; | ||
} | ||
return options.allow_utf8_local_part ? | ||
emailUserUtf8.test(user) : | ||
emailUser.test(user); | ||
}; | ||
if (user[0] === '"') { | ||
user = user.slice(1, user.length - 1); | ||
return options.allow_utf8_local_part ? | ||
quotedEmailUserUtf8.test(user) : | ||
quotedEmailUser.test(user); | ||
} | ||
var default_url_options = { | ||
protocols: [ 'http', 'https', 'ftp' ] | ||
, require_tld: true | ||
, require_protocol: false | ||
, require_valid_protocol: true | ||
, allow_underscores: false | ||
, allow_trailing_dot: false | ||
, allow_protocol_relative_urls: false | ||
}; | ||
var pattern = options.allow_utf8_local_part ? | ||
emailUserUtf8Part : emailUserPart; | ||
validator.isURL = function (url, options) { | ||
if (!url || url.length >= 2083 || /\s/.test(url)) { | ||
return false; | ||
} | ||
if (url.indexOf('mailto:') === 0) { | ||
return false; | ||
} | ||
options = merge(options, default_url_options); | ||
var protocol, auth, host, hostname, port, | ||
port_str, split; | ||
split = url.split('://'); | ||
if (split.length > 1) { | ||
protocol = split.shift(); | ||
if (options.require_valid_protocol && options.protocols.indexOf(protocol) === -1) { | ||
return false; | ||
} | ||
} else if (options.require_protocol) { | ||
return false; | ||
} else if (options.allow_protocol_relative_urls && url.substr(0, 2) === '//') { | ||
split[0] = url.substr(2); | ||
} | ||
url = split.join('://'); | ||
split = url.split('#'); | ||
url = split.shift(); | ||
var user_parts = user.split('.'); | ||
for (var i = 0; i < user_parts.length; i++) { | ||
if (!pattern.test(user_parts[i])) { | ||
return false; | ||
} | ||
} | ||
split = url.split('?'); | ||
url = split.shift(); | ||
return true; | ||
}; | ||
split = url.split('/'); | ||
url = split.shift(); | ||
split = url.split('@'); | ||
if (split.length > 1) { | ||
auth = split.shift(); | ||
if (auth.indexOf(':') >= 0 && auth.split(':').length > 2) { | ||
return false; | ||
} | ||
} | ||
hostname = split.join('@'); | ||
split = hostname.split(':'); | ||
host = split.shift(); | ||
if (split.length) { | ||
port_str = split.join(':'); | ||
port = parseInt(port_str, 10); | ||
if (!/^[0-9]+$/.test(port_str) || port <= 0 || port > 65535) { | ||
return false; | ||
} | ||
} | ||
if (!validator.isIP(host) && !validator.isFQDN(host, options) && | ||
host !== 'localhost') { | ||
return false; | ||
} | ||
if (options.host_whitelist && | ||
options.host_whitelist.indexOf(host) === -1) { | ||
return false; | ||
} | ||
if (options.host_blacklist && | ||
options.host_blacklist.indexOf(host) !== -1) { | ||
return false; | ||
} | ||
return true; | ||
}; | ||
var default_url_options = { | ||
protocols: [ 'http', 'https', 'ftp' ] | ||
, require_tld: true | ||
, require_protocol: false | ||
, require_valid_protocol: true | ||
, allow_underscores: false | ||
, allow_trailing_dot: false | ||
, allow_protocol_relative_urls: false | ||
}; | ||
validator.isIP = function (str, version) { | ||
version = validator.toString(version); | ||
if (!version) { | ||
return validator.isIP(str, 4) || validator.isIP(str, 6); | ||
} else if (version === '4') { | ||
if (!ipv4Maybe.test(str)) { | ||
return false; | ||
} | ||
var parts = str.split('.').sort(function (a, b) { | ||
return a - b; | ||
}); | ||
return parts[3] <= 255; | ||
} else if (version === '6') { | ||
var blocks = str.split(':'); | ||
var foundOmissionBlock = false; // marker to indicate :: | ||
validator.isURL = function (url, options) { | ||
if (!url || url.length >= 2083 || /\s/.test(url)) { | ||
return false; | ||
} | ||
if (url.indexOf('mailto:') === 0) { | ||
return false; | ||
} | ||
options = merge(options, default_url_options); | ||
var protocol, auth, host, hostname, port, | ||
port_str, split; | ||
split = url.split('://'); | ||
if (split.length > 1) { | ||
protocol = split.shift(); | ||
if (options.require_valid_protocol && options.protocols.indexOf(protocol) === -1) { | ||
return false; | ||
} | ||
} else if (options.require_protocol) { | ||
return false; | ||
} else if (options.allow_protocol_relative_urls && url.substr(0, 2) === '//') { | ||
split[0] = url.substr(2); | ||
} | ||
url = split.join('://'); | ||
split = url.split('#'); | ||
url = split.shift(); | ||
// At least some OS accept the last 32 bits of an IPv6 address | ||
// (i.e. 2 of the blocks) in IPv4 notation, and RFC 3493 says | ||
// that '::ffff:a.b.c.d' is valid for IPv4-mapped IPv6 addresses, | ||
// and '::a.b.c.d' is deprecated, but also valid. | ||
var foundIPv4TransitionBlock = validator.isIP(blocks[blocks.length - 1], 4); | ||
var expectedNumberOfBlocks = foundIPv4TransitionBlock ? 7 : 8; | ||
split = url.split('?'); | ||
url = split.shift(); | ||
if (blocks.length > expectedNumberOfBlocks) | ||
return false; | ||
split = url.split('/'); | ||
url = split.shift(); | ||
split = url.split('@'); | ||
if (split.length > 1) { | ||
auth = split.shift(); | ||
if (auth.indexOf(':') >= 0 && auth.split(':').length > 2) { | ||
return false; | ||
} | ||
} | ||
hostname = split.join('@'); | ||
split = hostname.split(':'); | ||
host = split.shift(); | ||
if (split.length) { | ||
port_str = split.join(':'); | ||
port = parseInt(port_str, 10); | ||
if (!/^[0-9]+$/.test(port_str) || port <= 0 || port > 65535) { | ||
return false; | ||
} | ||
} | ||
if (!validator.isIP(host) && !validator.isFQDN(host, options) && | ||
host !== 'localhost') { | ||
return false; | ||
} | ||
if (options.host_whitelist && | ||
options.host_whitelist.indexOf(host) === -1) { | ||
return false; | ||
} | ||
if (options.host_blacklist && | ||
options.host_blacklist.indexOf(host) !== -1) { | ||
return false; | ||
} | ||
return true; | ||
}; | ||
// initial or final :: | ||
if (str === '::') { | ||
return true; | ||
} else if (str.substr(0, 2) === '::') { | ||
blocks.shift(); | ||
blocks.shift(); | ||
foundOmissionBlock = true; | ||
} else if (str.substr(str.length - 2) === '::') { | ||
blocks.pop(); | ||
blocks.pop(); | ||
foundOmissionBlock = true; | ||
} | ||
validator.isIP = function (str, version) { | ||
version = validator.toString(version); | ||
if (!version) { | ||
return validator.isIP(str, 4) || validator.isIP(str, 6); | ||
} else if (version === '4') { | ||
if (!ipv4Maybe.test(str)) { | ||
return false; | ||
} | ||
var parts = str.split('.').sort(function (a, b) { | ||
return a - b; | ||
}); | ||
return parts[3] <= 255; | ||
} else if (version === '6') { | ||
var blocks = str.split(':'); | ||
var foundOmissionBlock = false; // marker to indicate :: | ||
for (var i = 0; i < blocks.length; ++i) { | ||
// test for a :: which can not be at the string start/end | ||
// since those cases have been handled above | ||
if (blocks[i] === '' && i > 0 && i < blocks.length -1) { | ||
if (foundOmissionBlock) | ||
return false; // multiple :: in address | ||
foundOmissionBlock = true; | ||
} else if (foundIPv4TransitionBlock && i == blocks.length - 1) { | ||
// it has been checked before that the last | ||
// block is a valid IPv4 address | ||
} else if (!ipv6Block.test(blocks[i])) { | ||
return false; | ||
} | ||
} | ||
// At least some OS accept the last 32 bits of an IPv6 address | ||
// (i.e. 2 of the blocks) in IPv4 notation, and RFC 3493 says | ||
// that '::ffff:a.b.c.d' is valid for IPv4-mapped IPv6 addresses, | ||
// and '::a.b.c.d' is deprecated, but also valid. | ||
var foundIPv4TransitionBlock = validator.isIP(blocks[blocks.length - 1], 4); | ||
var expectedNumberOfBlocks = foundIPv4TransitionBlock ? 7 : 8; | ||
if (foundOmissionBlock) { | ||
return blocks.length >= 1; | ||
} else { | ||
return blocks.length === expectedNumberOfBlocks; | ||
} | ||
} | ||
if (blocks.length > expectedNumberOfBlocks) | ||
return false; | ||
}; | ||
var default_fqdn_options = { | ||
require_tld: true | ||
, allow_underscores: false | ||
, allow_trailing_dot: false | ||
}; | ||
// initial or final :: | ||
if (str === '::') { | ||
return true; | ||
} else if (str.substr(0, 2) === '::') { | ||
blocks.shift(); | ||
blocks.shift(); | ||
foundOmissionBlock = true; | ||
} else if (str.substr(str.length - 2) === '::') { | ||
blocks.pop(); | ||
blocks.pop(); | ||
foundOmissionBlock = true; | ||
} | ||
validator.isFQDN = function (str, options) { | ||
options = merge(options, default_fqdn_options); | ||
for (var i = 0; i < blocks.length; ++i) { | ||
// test for a :: which can not be at the string start/end | ||
// since those cases have been handled above | ||
if (blocks[i] === '' && i > 0 && i < blocks.length -1) { | ||
if (foundOmissionBlock) | ||
return false; // multiple :: in address | ||
foundOmissionBlock = true; | ||
} else if (foundIPv4TransitionBlock && i == blocks.length - 1) { | ||
// it has been checked before that the last | ||
// block is a valid IPv4 address | ||
} else if (!ipv6Block.test(blocks[i])) { | ||
return false; | ||
} | ||
} | ||
/* Remove the optional trailing dot before checking validity */ | ||
if (options.allow_trailing_dot && str[str.length - 1] === '.') { | ||
str = str.substring(0, str.length - 1); | ||
if (foundOmissionBlock) { | ||
return blocks.length >= 1; | ||
} else { | ||
return blocks.length === expectedNumberOfBlocks; | ||
} | ||
} | ||
return false; | ||
}; | ||
var default_fqdn_options = { | ||
require_tld: true | ||
, allow_underscores: false | ||
, allow_trailing_dot: false | ||
}; | ||
validator.isFQDN = function (str, options) { | ||
options = merge(options, default_fqdn_options); | ||
/* Remove the optional trailing dot before checking validity */ | ||
if (options.allow_trailing_dot && str[str.length - 1] === '.') { | ||
str = str.substring(0, str.length - 1); | ||
} | ||
var parts = str.split('.'); | ||
if (options.require_tld) { | ||
var tld = parts.pop(); | ||
if (!parts.length || !/^([a-z\u00a1-\uffff]{2,}|xn[a-z0-9-]{2,})$/i.test(tld)) { | ||
return false; | ||
} | ||
} | ||
for (var part, i = 0; i < parts.length; i++) { | ||
part = parts[i]; | ||
if (options.allow_underscores) { | ||
if (part.indexOf('__') >= 0) { | ||
return false; | ||
} | ||
var parts = str.split('.'); | ||
if (options.require_tld) { | ||
var tld = parts.pop(); | ||
if (!parts.length || !/^([a-z\u00a1-\uffff]{2,}|xn[a-z0-9-]{2,})$/i.test(tld)) { | ||
return false; | ||
} | ||
} | ||
for (var part, i = 0; i < parts.length; i++) { | ||
part = parts[i]; | ||
if (options.allow_underscores) { | ||
if (part.indexOf('__') >= 0) { | ||
return false; | ||
} | ||
part = part.replace(/_/g, ''); | ||
} | ||
if (!/^[a-z\u00a1-\uffff0-9-]+$/i.test(part)) { | ||
return false; | ||
} | ||
if (/[\uff01-\uff5e]/.test(part)) { | ||
// disallow full-width chars | ||
return false; | ||
} | ||
if (part[0] === '-' || part[part.length - 1] === '-' || | ||
part.indexOf('---') >= 0) { | ||
return false; | ||
} | ||
} | ||
return true; | ||
}; | ||
part = part.replace(/_/g, ''); | ||
} | ||
if (!/^[a-z\u00a1-\uffff0-9-]+$/i.test(part)) { | ||
return false; | ||
} | ||
if (/[\uff01-\uff5e]/.test(part)) { | ||
// disallow full-width chars | ||
return false; | ||
} | ||
if (part[0] === '-' || part[part.length - 1] === '-' || | ||
part.indexOf('---') >= 0) { | ||
return false; | ||
} | ||
} | ||
return true; | ||
}; | ||
validator.isBoolean = function(str) { | ||
return (['true', 'false', '1', '0'].indexOf(str) >= 0); | ||
}; | ||
validator.isBoolean = function(str) { | ||
return (['true', 'false', '1', '0'].indexOf(str) >= 0); | ||
}; | ||
validator.isAlpha = function (str) { | ||
return alpha.test(str); | ||
}; | ||
validator.isAlpha = function (str) { | ||
return alpha.test(str); | ||
}; | ||
validator.isAlphanumeric = function (str) { | ||
return alphanumeric.test(str); | ||
}; | ||
validator.isAlphanumeric = function (str) { | ||
return alphanumeric.test(str); | ||
}; | ||
validator.isNumeric = function (str) { | ||
return numeric.test(str); | ||
}; | ||
validator.isNumeric = function (str) { | ||
return numeric.test(str); | ||
}; | ||
validator.isDecimal = function (str) { | ||
return str !== '' && decimal.test(str); | ||
}; | ||
validator.isDecimal = function (str) { | ||
return str !== '' && decimal.test(str); | ||
}; | ||
validator.isHexadecimal = function (str) { | ||
return hexadecimal.test(str); | ||
}; | ||
validator.isHexadecimal = function (str) { | ||
return hexadecimal.test(str); | ||
}; | ||
validator.isHexColor = function (str) { | ||
return hexcolor.test(str); | ||
}; | ||
validator.isHexColor = function (str) { | ||
return hexcolor.test(str); | ||
}; | ||
validator.isLowercase = function (str) { | ||
return str === str.toLowerCase(); | ||
}; | ||
validator.isLowercase = function (str) { | ||
return str === str.toLowerCase(); | ||
}; | ||
validator.isUppercase = function (str) { | ||
return str === str.toUpperCase(); | ||
}; | ||
validator.isUppercase = function (str) { | ||
return str === str.toUpperCase(); | ||
}; | ||
validator.isInt = function (str, options) { | ||
options = options || {}; | ||
return int.test(str) && (!options.hasOwnProperty('min') || str >= options.min) && (!options.hasOwnProperty('max') || str <= options.max); | ||
}; | ||
validator.isInt = function (str, options) { | ||
options = options || {}; | ||
return int.test(str) && (!options.hasOwnProperty('min') || str >= options.min) && (!options.hasOwnProperty('max') || str <= options.max); | ||
}; | ||
validator.isFloat = function (str, options) { | ||
options = options || {}; | ||
return str !== '' && float.test(str) && (!options.hasOwnProperty('min') || str >= options.min) && (!options.hasOwnProperty('max') || str <= options.max); | ||
}; | ||
validator.isFloat = function (str, options) { | ||
options = options || {}; | ||
if (str === '' || str === '.') { | ||
return false; | ||
} | ||
return float.test(str) && (!options.hasOwnProperty('min') || str >= options.min) && (!options.hasOwnProperty('max') || str <= options.max); | ||
}; | ||
validator.isDivisibleBy = function (str, num) { | ||
return validator.toFloat(str) % validator.toInt(num) === 0; | ||
}; | ||
validator.isDivisibleBy = function (str, num) { | ||
return validator.toFloat(str) % validator.toInt(num) === 0; | ||
}; | ||
validator.isNull = function (str) { | ||
return str.length === 0; | ||
}; | ||
validator.isNull = function (str) { | ||
return str.length === 0; | ||
}; | ||
validator.isLength = function (str, min, max) { | ||
var surrogatePairs = str.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g) || []; | ||
var len = str.length - surrogatePairs.length; | ||
return len >= min && (typeof max === 'undefined' || len <= max); | ||
}; | ||
validator.isLength = function (str, min, max) { | ||
var surrogatePairs = str.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g) || []; | ||
var len = str.length - surrogatePairs.length; | ||
return len >= min && (typeof max === 'undefined' || len <= max); | ||
}; | ||
validator.isByteLength = function (str, min, max) { | ||
var len = encodeURI(str).split(/%..|./).length - 1; | ||
return len >= min && (typeof max === 'undefined' || len <= max); | ||
}; | ||
validator.isByteLength = function (str, min, max) { | ||
var len = encodeURI(str).split(/%..|./).length - 1; | ||
return len >= min && (typeof max === 'undefined' || len <= max); | ||
}; | ||
validator.isUUID = function (str, version) { | ||
var pattern = uuid[version ? version : 'all']; | ||
return pattern && pattern.test(str); | ||
}; | ||
validator.isUUID = function (str, version) { | ||
var pattern = uuid[version ? version : 'all']; | ||
return pattern && pattern.test(str); | ||
}; | ||
validator.isDate = function (str) { | ||
return !isNaN(Date.parse(str)); | ||
}; | ||
function getTimezoneOffset(str) { | ||
var iso8601Parts = str.match(iso8601) | ||
, timezone, sign, hours, minutes; | ||
if (!iso8601Parts) { | ||
str = str.toLowerCase(); | ||
timezone = str.match(/(?:\s|gmt\s*)(-|\+)(\d{1,4})(\s|$)/); | ||
if (!timezone) { | ||
return str.indexOf('gmt') !== -1 ? 0 : null; | ||
} | ||
sign = timezone[1]; | ||
var offset = timezone[2]; | ||
if (offset.length === 3) { | ||
offset = '0' + offset; | ||
} | ||
if (offset.length <= 2) { | ||
hours = 0; | ||
minutes = parseInt(offset); | ||
} else { | ||
hours = parseInt(offset.slice(0, 2)); | ||
minutes = parseInt(offset.slice(2, 4)); | ||
} | ||
} else { | ||
timezone = iso8601Parts[21]; | ||
if (!timezone || timezone === 'z' || timezone === 'Z') { | ||
return 0; | ||
} | ||
sign = iso8601Parts[22]; | ||
if (timezone.indexOf(':') !== -1) { | ||
hours = parseInt(iso8601Parts[23]); | ||
minutes = parseInt(iso8601Parts[24]); | ||
} else { | ||
hours = 0; | ||
minutes = parseInt(iso8601Parts[23]); | ||
} | ||
} | ||
return (hours * 60 + minutes) * (sign === '-' ? 1 : -1); | ||
} | ||
validator.isAfter = function (str, date) { | ||
var comparison = validator.toDate(date || new Date()) | ||
, original = validator.toDate(str); | ||
return !!(original && comparison && original > comparison); | ||
}; | ||
validator.isDate = function (str) { | ||
var normalizedDate = new Date(Date.parse(str)); | ||
if (isNaN(normalizedDate)) { | ||
return false; | ||
} | ||
// normalizedDate is in the user's timezone. Apply the input | ||
// timezone offset to the date so that the year and day match | ||
// the input | ||
var timezoneOffset = getTimezoneOffset(str); | ||
if (timezoneOffset !== null) { | ||
var timezoneDifference = normalizedDate.getTimezoneOffset() - | ||
timezoneOffset; | ||
normalizedDate = new Date(normalizedDate.getTime() + | ||
60000 * timezoneDifference); | ||
} | ||
var day = String(normalizedDate.getDate()); | ||
var dayOrYear, dayOrYearMatches, year; | ||
//check for valid double digits that could be late days | ||
//check for all matches since a string like '12/23' is a valid date | ||
//ignore everything with nearby colons | ||
dayOrYearMatches = str.match(/(^|[^:\d])[23]\d([^:\d]|$)/g); | ||
if (!dayOrYearMatches) { | ||
return true; | ||
} | ||
dayOrYear = dayOrYearMatches.map(function(digitString) { | ||
return digitString.match(/\d+/g)[0]; | ||
}).join('/'); | ||
year = String(normalizedDate.getFullYear()).slice(-2); | ||
if (dayOrYear === day || dayOrYear === year) { | ||
return true; | ||
} else if ((dayOrYear === (day + '/' + year)) || (dayOrYear === (year + '/' + day))) { | ||
return true; | ||
} | ||
return false; | ||
}; | ||
validator.isBefore = function (str, date) { | ||
var comparison = validator.toDate(date || new Date()) | ||
, original = validator.toDate(str); | ||
return original && comparison && original < comparison; | ||
}; | ||
validator.isAfter = function (str, date) { | ||
var comparison = validator.toDate(date || new Date()) | ||
, original = validator.toDate(str); | ||
return !!(original && comparison && original > comparison); | ||
}; | ||
validator.isIn = function (str, options) { | ||
var i; | ||
if (Object.prototype.toString.call(options) === '[object Array]') { | ||
var array = []; | ||
for (i in options) { | ||
array[i] = validator.toString(options[i]); | ||
} | ||
return array.indexOf(str) >= 0; | ||
} else if (typeof options === 'object') { | ||
return options.hasOwnProperty(str); | ||
} else if (options && typeof options.indexOf === 'function') { | ||
return options.indexOf(str) >= 0; | ||
} | ||
return false; | ||
}; | ||
validator.isBefore = function (str, date) { | ||
var comparison = validator.toDate(date || new Date()) | ||
, original = validator.toDate(str); | ||
return !!(original && comparison && original < comparison); | ||
}; | ||
validator.isCreditCard = function (str) { | ||
var sanitized = str.replace(/[^0-9]+/g, ''); | ||
if (!creditCard.test(sanitized)) { | ||
return false; | ||
} | ||
var sum = 0, digit, tmpNum, shouldDouble; | ||
for (var i = sanitized.length - 1; i >= 0; i--) { | ||
digit = sanitized.substring(i, (i + 1)); | ||
tmpNum = parseInt(digit, 10); | ||
if (shouldDouble) { | ||
tmpNum *= 2; | ||
if (tmpNum >= 10) { | ||
sum += ((tmpNum % 10) + 1); | ||
} else { | ||
sum += tmpNum; | ||
} | ||
} else { | ||
sum += tmpNum; | ||
} | ||
shouldDouble = !shouldDouble; | ||
} | ||
return !!((sum % 10) === 0 ? sanitized : false); | ||
}; | ||
validator.isIn = function (str, options) { | ||
var i; | ||
if (Object.prototype.toString.call(options) === '[object Array]') { | ||
var array = []; | ||
for (i in options) { | ||
array[i] = validator.toString(options[i]); | ||
} | ||
return array.indexOf(str) >= 0; | ||
} else if (typeof options === 'object') { | ||
return options.hasOwnProperty(str); | ||
} else if (options && typeof options.indexOf === 'function') { | ||
return options.indexOf(str) >= 0; | ||
} | ||
return false; | ||
}; | ||
validator.isISIN = function (str) { | ||
if (!isin.test(str)) { | ||
return false; | ||
validator.isCreditCard = function (str) { | ||
var sanitized = str.replace(/[^0-9]+/g, ''); | ||
if (!creditCard.test(sanitized)) { | ||
return false; | ||
} | ||
var sum = 0, digit, tmpNum, shouldDouble; | ||
for (var i = sanitized.length - 1; i >= 0; i--) { | ||
digit = sanitized.substring(i, (i + 1)); | ||
tmpNum = parseInt(digit, 10); | ||
if (shouldDouble) { | ||
tmpNum *= 2; | ||
if (tmpNum >= 10) { | ||
sum += ((tmpNum % 10) + 1); | ||
} else { | ||
sum += tmpNum; | ||
} | ||
} else { | ||
sum += tmpNum; | ||
} | ||
shouldDouble = !shouldDouble; | ||
} | ||
return !!((sum % 10) === 0 ? sanitized : false); | ||
}; | ||
var checksumStr = str.replace(/[A-Z]/g, function(character) { | ||
return parseInt(character, 36); | ||
}); | ||
validator.isISIN = function (str) { | ||
if (!isin.test(str)) { | ||
return false; | ||
} | ||
var sum = 0, digit, tmpNum, shouldDouble = true; | ||
for (var i = checksumStr.length - 2; i >= 0; i--) { | ||
digit = checksumStr.substring(i, (i + 1)); | ||
tmpNum = parseInt(digit, 10); | ||
if (shouldDouble) { | ||
tmpNum *= 2; | ||
if (tmpNum >= 10) { | ||
sum += tmpNum + 1; | ||
} else { | ||
sum += tmpNum; | ||
} | ||
} else { | ||
sum += tmpNum; | ||
} | ||
shouldDouble = !shouldDouble; | ||
var checksumStr = str.replace(/[A-Z]/g, function(character) { | ||
return parseInt(character, 36); | ||
}); | ||
var sum = 0, digit, tmpNum, shouldDouble = true; | ||
for (var i = checksumStr.length - 2; i >= 0; i--) { | ||
digit = checksumStr.substring(i, (i + 1)); | ||
tmpNum = parseInt(digit, 10); | ||
if (shouldDouble) { | ||
tmpNum *= 2; | ||
if (tmpNum >= 10) { | ||
sum += tmpNum + 1; | ||
} else { | ||
sum += tmpNum; | ||
} | ||
} else { | ||
sum += tmpNum; | ||
} | ||
shouldDouble = !shouldDouble; | ||
} | ||
return parseInt(str.substr(str.length - 1), 10) === (10000 - sum) % 10; | ||
}; | ||
return parseInt(str.substr(str.length - 1), 10) === (10000 - sum) % 10; | ||
}; | ||
validator.isISBN = function (str, version) { | ||
version = validator.toString(version); | ||
if (!version) { | ||
return validator.isISBN(str, 10) || validator.isISBN(str, 13); | ||
} | ||
var sanitized = str.replace(/[\s-]+/g, '') | ||
, checksum = 0, i; | ||
if (version === '10') { | ||
if (!isbn10Maybe.test(sanitized)) { | ||
return false; | ||
} | ||
for (i = 0; i < 9; i++) { | ||
checksum += (i + 1) * sanitized.charAt(i); | ||
} | ||
if (sanitized.charAt(9) === 'X') { | ||
checksum += 10 * 10; | ||
} else { | ||
checksum += 10 * sanitized.charAt(9); | ||
} | ||
if ((checksum % 11) === 0) { | ||
return !!sanitized; | ||
} | ||
} else if (version === '13') { | ||
if (!isbn13Maybe.test(sanitized)) { | ||
return false; | ||
} | ||
var factor = [ 1, 3 ]; | ||
for (i = 0; i < 12; i++) { | ||
checksum += factor[i % 2] * sanitized.charAt(i); | ||
} | ||
if (sanitized.charAt(12) - ((10 - (checksum % 10)) % 10) === 0) { | ||
return !!sanitized; | ||
} | ||
} | ||
validator.isISBN = function (str, version) { | ||
version = validator.toString(version); | ||
if (!version) { | ||
return validator.isISBN(str, 10) || validator.isISBN(str, 13); | ||
} | ||
var sanitized = str.replace(/[\s-]+/g, '') | ||
, checksum = 0, i; | ||
if (version === '10') { | ||
if (!isbn10Maybe.test(sanitized)) { | ||
return false; | ||
}; | ||
validator.isMobilePhone = function(str, locale) { | ||
if (locale in phones) { | ||
return phones[locale].test(str); | ||
} | ||
} | ||
for (i = 0; i < 9; i++) { | ||
checksum += (i + 1) * sanitized.charAt(i); | ||
} | ||
if (sanitized.charAt(9) === 'X') { | ||
checksum += 10 * 10; | ||
} else { | ||
checksum += 10 * sanitized.charAt(9); | ||
} | ||
if ((checksum % 11) === 0) { | ||
return !!sanitized; | ||
} | ||
} else if (version === '13') { | ||
if (!isbn13Maybe.test(sanitized)) { | ||
return false; | ||
}; | ||
} | ||
var factor = [ 1, 3 ]; | ||
for (i = 0; i < 12; i++) { | ||
checksum += factor[i % 2] * sanitized.charAt(i); | ||
} | ||
if (sanitized.charAt(12) - ((10 - (checksum % 10)) % 10) === 0) { | ||
return !!sanitized; | ||
} | ||
} | ||
return false; | ||
}; | ||
var default_currency_options = { | ||
symbol: '$' | ||
, require_symbol: false | ||
, allow_space_after_symbol: false | ||
, symbol_after_digits: false | ||
, allow_negatives: true | ||
, parens_for_negatives: false | ||
, negative_sign_before_digits: false | ||
, negative_sign_after_digits: false | ||
, allow_negative_sign_placeholder: false | ||
, thousands_separator: ',' | ||
, decimal_separator: '.' | ||
, allow_space_after_digits: false | ||
}; | ||
validator.isMobilePhone = function(str, locale) { | ||
if (locale in phones) { | ||
return phones[locale].test(str); | ||
} | ||
return false; | ||
}; | ||
validator.isCurrency = function (str, options) { | ||
options = merge(options, default_currency_options); | ||
var default_currency_options = { | ||
symbol: '$' | ||
, require_symbol: false | ||
, allow_space_after_symbol: false | ||
, symbol_after_digits: false | ||
, allow_negatives: true | ||
, parens_for_negatives: false | ||
, negative_sign_before_digits: false | ||
, negative_sign_after_digits: false | ||
, allow_negative_sign_placeholder: false | ||
, thousands_separator: ',' | ||
, decimal_separator: '.' | ||
, allow_space_after_digits: false | ||
}; | ||
return currencyRegex(options).test(str); | ||
}; | ||
validator.isCurrency = function (str, options) { | ||
options = merge(options, default_currency_options); | ||
validator.isJSON = function (str) { | ||
try { | ||
var obj = JSON.parse(str); | ||
return !!obj && typeof obj === 'object'; | ||
} catch (e) {} | ||
return false; | ||
}; | ||
return currencyRegex(options).test(str); | ||
}; | ||
validator.isMultibyte = function (str) { | ||
return multibyte.test(str); | ||
}; | ||
validator.isJSON = function (str) { | ||
try { | ||
var obj = JSON.parse(str); | ||
return !!obj && typeof obj === 'object'; | ||
} catch (e) {} | ||
return false; | ||
}; | ||
validator.isAscii = function (str) { | ||
return ascii.test(str); | ||
}; | ||
validator.isMultibyte = function (str) { | ||
return multibyte.test(str); | ||
}; | ||
validator.isFullWidth = function (str) { | ||
return fullWidth.test(str); | ||
}; | ||
validator.isAscii = function (str) { | ||
return ascii.test(str); | ||
}; | ||
validator.isHalfWidth = function (str) { | ||
return halfWidth.test(str); | ||
}; | ||
validator.isFullWidth = function (str) { | ||
return fullWidth.test(str); | ||
}; | ||
validator.isVariableWidth = function (str) { | ||
return fullWidth.test(str) && halfWidth.test(str); | ||
}; | ||
validator.isHalfWidth = function (str) { | ||
return halfWidth.test(str); | ||
}; | ||
validator.isSurrogatePair = function (str) { | ||
return surrogatePair.test(str); | ||
}; | ||
validator.isVariableWidth = function (str) { | ||
return fullWidth.test(str) && halfWidth.test(str); | ||
}; | ||
validator.isBase64 = function (str) { | ||
return base64.test(str); | ||
}; | ||
validator.isSurrogatePair = function (str) { | ||
return surrogatePair.test(str); | ||
}; | ||
validator.isMongoId = function (str) { | ||
return validator.isHexadecimal(str) && str.length === 24; | ||
}; | ||
validator.isBase64 = function (str) { | ||
return base64.test(str); | ||
}; | ||
validator.isISO8601 = function (str) { | ||
return iso8601.test(str); | ||
}; | ||
validator.isMongoId = function (str) { | ||
return validator.isHexadecimal(str) && str.length === 24; | ||
}; | ||
validator.ltrim = function (str, chars) { | ||
var pattern = chars ? new RegExp('^[' + chars + ']+', 'g') : /^\s+/g; | ||
return str.replace(pattern, ''); | ||
}; | ||
validator.isISO8601 = function (str) { | ||
return iso8601.test(str); | ||
}; | ||
validator.rtrim = function (str, chars) { | ||
var pattern = chars ? new RegExp('[' + chars + ']+$', 'g') : /\s+$/g; | ||
return str.replace(pattern, ''); | ||
}; | ||
validator.ltrim = function (str, chars) { | ||
var pattern = chars ? new RegExp('^[' + chars + ']+', 'g') : /^\s+/g; | ||
return str.replace(pattern, ''); | ||
}; | ||
validator.trim = function (str, chars) { | ||
var pattern = chars ? new RegExp('^[' + chars + ']+|[' + chars + ']+$', 'g') : /^\s+|\s+$/g; | ||
return str.replace(pattern, ''); | ||
}; | ||
validator.rtrim = function (str, chars) { | ||
var pattern = chars ? new RegExp('[' + chars + ']+$', 'g') : /\s+$/g; | ||
return str.replace(pattern, ''); | ||
}; | ||
validator.escape = function (str) { | ||
return (str.replace(/&/g, '&') | ||
.replace(/"/g, '"') | ||
.replace(/'/g, ''') | ||
.replace(/</g, '<') | ||
.replace(/>/g, '>') | ||
.replace(/\//g, '/') | ||
.replace(/\`/g, '`')); | ||
}; | ||
validator.trim = function (str, chars) { | ||
var pattern = chars ? new RegExp('^[' + chars + ']+|[' + chars + ']+$', 'g') : /^\s+|\s+$/g; | ||
return str.replace(pattern, ''); | ||
}; | ||
validator.stripLow = function (str, keep_new_lines) { | ||
var chars = keep_new_lines ? '\\x00-\\x09\\x0B\\x0C\\x0E-\\x1F\\x7F' : '\\x00-\\x1F\\x7F'; | ||
return validator.blacklist(str, chars); | ||
}; | ||
validator.escape = function (str) { | ||
return (str.replace(/&/g, '&') | ||
.replace(/"/g, '"') | ||
.replace(/'/g, ''') | ||
.replace(/</g, '<') | ||
.replace(/>/g, '>') | ||
.replace(/\//g, '/') | ||
.replace(/\`/g, '`')); | ||
}; | ||
validator.whitelist = function (str, chars) { | ||
return str.replace(new RegExp('[^' + chars + ']+', 'g'), ''); | ||
}; | ||
validator.stripLow = function (str, keep_new_lines) { | ||
var chars = keep_new_lines ? '\\x00-\\x09\\x0B\\x0C\\x0E-\\x1F\\x7F' : '\\x00-\\x1F\\x7F'; | ||
return validator.blacklist(str, chars); | ||
}; | ||
validator.blacklist = function (str, chars) { | ||
return str.replace(new RegExp('[' + chars + ']+', 'g'), ''); | ||
}; | ||
validator.whitelist = function (str, chars) { | ||
return str.replace(new RegExp('[^' + chars + ']+', 'g'), ''); | ||
}; | ||
var default_normalize_email_options = { | ||
lowercase: true | ||
}; | ||
validator.blacklist = function (str, chars) { | ||
return str.replace(new RegExp('[' + chars + ']+', 'g'), ''); | ||
}; | ||
validator.normalizeEmail = function (email, options) { | ||
options = merge(options, default_normalize_email_options); | ||
if (!validator.isEmail(email)) { | ||
return false; | ||
} | ||
var parts = email.split('@', 2); | ||
parts[1] = parts[1].toLowerCase(); | ||
if (parts[1] === 'gmail.com' || parts[1] === 'googlemail.com') { | ||
parts[0] = parts[0].toLowerCase().replace(/\./g, ''); | ||
if (parts[0][0] === '+') { | ||
return false; | ||
} | ||
parts[0] = parts[0].split('+')[0]; | ||
parts[1] = 'gmail.com'; | ||
} else if (options.lowercase) { | ||
parts[0] = parts[0].toLowerCase(); | ||
} | ||
return parts.join('@'); | ||
}; | ||
var default_normalize_email_options = { | ||
lowercase: true | ||
}; | ||
function merge(obj, defaults) { | ||
obj = obj || {}; | ||
for (var key in defaults) { | ||
if (typeof obj[key] === 'undefined') { | ||
obj[key] = defaults[key]; | ||
} | ||
} | ||
return obj; | ||
validator.normalizeEmail = function (email, options) { | ||
options = merge(options, default_normalize_email_options); | ||
if (!validator.isEmail(email)) { | ||
return false; | ||
} | ||
var parts = email.split('@', 2); | ||
parts[1] = parts[1].toLowerCase(); | ||
if (parts[1] === 'gmail.com' || parts[1] === 'googlemail.com') { | ||
parts[0] = parts[0].toLowerCase().replace(/\./g, ''); | ||
if (parts[0][0] === '+') { | ||
return false; | ||
} | ||
parts[0] = parts[0].split('+')[0]; | ||
parts[1] = 'gmail.com'; | ||
} else if (options.lowercase) { | ||
parts[0] = parts[0].toLowerCase(); | ||
} | ||
return parts.join('@'); | ||
}; | ||
function currencyRegex(options) { | ||
var symbol = '(\\' + options.symbol.replace(/\./g, '\\.') + ')' + (options.require_symbol ? '' : '?') | ||
, negative = '-?' | ||
, whole_dollar_amount_without_sep = '[1-9]\\d*' | ||
, whole_dollar_amount_with_sep = '[1-9]\\d{0,2}(\\' + options.thousands_separator + '\\d{3})*' | ||
, valid_whole_dollar_amounts = ['0', whole_dollar_amount_without_sep, whole_dollar_amount_with_sep] | ||
, whole_dollar_amount = '(' + valid_whole_dollar_amounts.join('|') + ')?' | ||
, decimal_amount = '(\\' + options.decimal_separator + '\\d{2})?'; | ||
var pattern = whole_dollar_amount + decimal_amount; | ||
// default is negative sign before symbol, but there are two other options (besides parens) | ||
if (options.allow_negatives && !options.parens_for_negatives) { | ||
if (options.negative_sign_after_digits) { | ||
pattern += negative; | ||
} | ||
else if (options.negative_sign_before_digits) { | ||
pattern = negative + pattern; | ||
} | ||
} | ||
// South African Rand, for example, uses R 123 (space) and R-123 (no space) | ||
if (options.allow_negative_sign_placeholder) { | ||
pattern = '( (?!\\-))?' + pattern; | ||
} | ||
else if (options.allow_space_after_symbol) { | ||
pattern = ' ?' + pattern; | ||
} | ||
else if (options.allow_space_after_digits) { | ||
pattern += '( (?!$))?'; | ||
} | ||
if (options.symbol_after_digits) { | ||
pattern += symbol; | ||
} else { | ||
pattern = symbol + pattern; | ||
} | ||
if (options.allow_negatives) { | ||
if (options.parens_for_negatives) { | ||
pattern = '(\\(' + pattern + '\\)|' + pattern + ')'; | ||
} | ||
else if (!(options.negative_sign_before_digits || options.negative_sign_after_digits)) { | ||
pattern = negative + pattern; | ||
} | ||
} | ||
return new RegExp( | ||
'^' + | ||
// ensure there's a dollar and/or decimal amount, and that it doesn't start with a space or a negative sign followed by a space | ||
'(?!-? )(?=.*\\d)' + | ||
pattern + | ||
'$' | ||
); | ||
function merge(obj, defaults) { | ||
obj = obj || {}; | ||
for (var key in defaults) { | ||
if (typeof obj[key] === 'undefined') { | ||
obj[key] = defaults[key]; | ||
} | ||
} | ||
return obj; | ||
} | ||
validator.init(); | ||
function currencyRegex(options) { | ||
var symbol = '(\\' + options.symbol.replace(/\./g, '\\.') + ')' + (options.require_symbol ? '' : '?') | ||
, negative = '-?' | ||
, whole_dollar_amount_without_sep = '[1-9]\\d*' | ||
, whole_dollar_amount_with_sep = '[1-9]\\d{0,2}(\\' + options.thousands_separator + '\\d{3})*' | ||
, valid_whole_dollar_amounts = ['0', whole_dollar_amount_without_sep, whole_dollar_amount_with_sep] | ||
, whole_dollar_amount = '(' + valid_whole_dollar_amounts.join('|') + ')?' | ||
, decimal_amount = '(\\' + options.decimal_separator + '\\d{2})?'; | ||
var pattern = whole_dollar_amount + decimal_amount; | ||
// default is negative sign before symbol, but there are two other options (besides parens) | ||
if (options.allow_negatives && !options.parens_for_negatives) { | ||
if (options.negative_sign_after_digits) { | ||
pattern += negative; | ||
} | ||
else if (options.negative_sign_before_digits) { | ||
pattern = negative + pattern; | ||
} | ||
} | ||
// South African Rand, for example, uses R 123 (space) and R-123 (no space) | ||
if (options.allow_negative_sign_placeholder) { | ||
pattern = '( (?!\\-))?' + pattern; | ||
} | ||
else if (options.allow_space_after_symbol) { | ||
pattern = ' ?' + pattern; | ||
} | ||
else if (options.allow_space_after_digits) { | ||
pattern += '( (?!$))?'; | ||
} | ||
if (options.symbol_after_digits) { | ||
pattern += symbol; | ||
} else { | ||
pattern = symbol + pattern; | ||
} | ||
if (options.allow_negatives) { | ||
if (options.parens_for_negatives) { | ||
pattern = '(\\(' + pattern + '\\)|' + pattern + ')'; | ||
} | ||
else if (!(options.negative_sign_before_digits || options.negative_sign_after_digits)) { | ||
pattern = negative + pattern; | ||
} | ||
} | ||
return new RegExp( | ||
'^' + | ||
// ensure there's a dollar and/or decimal amount, and that it doesn't start with a space or a negative sign followed by a space | ||
'(?!-? )(?=.*\\d)' + | ||
pattern + | ||
'$' | ||
); | ||
} | ||
return validator; | ||
validator.init(); | ||
return validator; | ||
}); | ||
@@ -865,0 +955,0 @@ |
@@ -1,1 +0,1 @@ | ||
"use strict";angular.module("angular.validators",[]).provider("asyncValidator",function(){var a,b=!1,c={},d="get".toLowerCase(),e="false",f=3,g="valid",h="true",i="{value}";this.baseUrl=function(b){return a=b,this},this.defaultState=function(a){return b=!!a,this},this.endpoint=function(a,b){return c[a]=b,this},this.httpVerb=function(a){return d=a.toLowerCase(),this},this.invalidResponse=function(a){return e=a,this},this.minLength=function(a){return f=parseInt(a),this},this.responseField=function(a){return g=a,this},this.validResponse=function(a){return h=a,this},this.wildcard=function(a){return i=a,this},this.$get=["$http","$q",function(j,k){var l={};for(var m in c)l[m]=a+c[m];return new function(){var a=k.defer();this.defaultState=b,this.endpoints=l,this.getUrl=function(a,b){return this.endpoints[a].replace(i,b)},this.invalidResponse=e,this.minLength=f,this.resolve=function(b){return j[d](b).then(function(b){return b.data[g]===h?a.resolve(!0):b.data[g]===e?a.reject(!1):void 0})["catch"](function(b){return a.reject()})},this.validResponse=h}}]}).service("nodeValidator",function(){var a={};return function(b,c){"undefined"!=typeof exports&&"undefined"!=typeof module?module.exports=c():"function"==typeof define&&"object"==typeof define.amd?define(c):a[b]=c()}("validator",function(a){function b(a,b){a=a||{};for(var c in b)"undefined"==typeof a[c]&&(a[c]=b[c]);return a}function c(a){var b="(\\"+a.symbol.replace(/\./g,"\\.")+")"+(a.require_symbol?"":"?"),c="-?",d="[1-9]\\d*",e="[1-9]\\d{0,2}(\\"+a.thousands_separator+"\\d{3})*",f=["0",d,e],g="("+f.join("|")+")?",h="(\\"+a.decimal_separator+"\\d{2})?",i=g+h;return a.allow_negatives&&!a.parens_for_negatives&&(a.negative_sign_after_digits?i+=c:a.negative_sign_before_digits&&(i=c+i)),a.allow_negative_sign_placeholder?i="( (?!\\-))?"+i:a.allow_space_after_symbol?i=" ?"+i:a.allow_space_after_digits&&(i+="( (?!$))?"),a.symbol_after_digits?i+=b:i=b+i,a.allow_negatives&&(a.parens_for_negatives?i="(\\("+i+"\\)|"+i+")":a.negative_sign_before_digits||a.negative_sign_after_digits||(i=c+i)),new RegExp("^(?!-? )(?=.*\\d)"+i+"$")}a={version:"4.0.2"};var d=/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~])+)*)|"(\s*(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e])|(\\[\x01-\x09\x0b\x0c\x0d-\x7f])))*\s*")$/i,e=/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|"(\s*(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*\s*")$/i,f=/^(?:[a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~\.]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(?:[a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~\.]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|\s)*<(.+)>$/i,g=/^(?: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})$/,h=/^[A-Z]{2}[0-9A-Z]{9}[0-9]$/,i=/^(?:[0-9]{9}X|[0-9]{10})$/,j=/^(?:[0-9]{13})$/,k=/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/,l=/^[0-9A-F]{1,4}$/i,m={3:/^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,4:/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,5:/^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,all:/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i},n=/^[A-Z]+$/i,o=/^[0-9A-Z]+$/i,p=/^[-+]?[0-9]+$/,q=/^(?:[-+]?(?:0|[1-9][0-9]*))$/,r=/^(?:[-+]?(?:[0-9]+))?(?:\.[0-9]*)?(?:[eE][\+\-]?(?:[0-9]+))?$/,s=/^[0-9A-F]+$/i,t=/^[-+]?([0-9]+|\.[0-9]+|[0-9]+\.[0-9]+)$/,u=/^#?([0-9A-F]{3}|[0-9A-F]{6})$/i,v=/^[\x00-\x7F]+$/,w=/[^\x00-\x7F]/,x=/[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/,y=/[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/,z=/[\uD800-\uDBFF][\uDC00-\uDFFF]/,A=/^(?:[A-Z0-9+\/]{4})*(?:[A-Z0-9+\/]{2}==|[A-Z0-9+\/]{3}=|[A-Z0-9+\/]{4})$/i,B={"zh-CN":/^(\+?0?86\-?)?1[345789]\d{9}$/,"en-ZA":/^(\+?27|0)\d{9}$/,"en-AU":/^(\+?61|0)4\d{8}$/,"en-HK":/^(\+?852\-?)?[569]\d{3}\-?\d{4}$/,"fr-FR":/^(\+?33|0)[67]\d{8}$/,"pt-PT":/^(\+351)?9[1236]\d{7}$/,"el-GR":/^(\+30)?((2\d{9})|(69\d{8}))$/,"en-GB":/^(\+?44|0)7\d{9}$/,"en-US":/^(\+?1)?[2-9]\d{2}[2-9](?!11)\d{6}$/,"en-ZM":/^(\+26)?09[567]\d{7}$/,"ru-RU":/^(\+?7|8)?9\d{9}$/},C=/^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24\:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/;a.extend=function(b,c){a[b]=function(){var b=Array.prototype.slice.call(arguments);return b[0]=a.toString(b[0]),c.apply(a,b)}},a.init=function(){for(var b in a)"function"==typeof a[b]&&"toString"!==b&&"toDate"!==b&&"extend"!==b&&"init"!==b&&a.extend(b,a[b])},a.toString=function(a){return"object"==typeof a&&null!==a&&a.toString?a=a.toString():null===a||"undefined"==typeof a||isNaN(a)&&!a.length?a="":"string"!=typeof a&&(a+=""),a},a.toDate=function(a){return"[object Date]"===Object.prototype.toString.call(a)?a:(a=Date.parse(a),isNaN(a)?null:new Date(a))},a.toFloat=function(a){return parseFloat(a)},a.toInt=function(a,b){return parseInt(a,b||10)},a.toBoolean=function(a,b){return b?"1"===a||"true"===a:"0"!==a&&"false"!==a&&""!==a},a.equals=function(b,c){return b===a.toString(c)},a.contains=function(b,c){return b.indexOf(a.toString(c))>=0},a.matches=function(a,b,c){return"[object RegExp]"!==Object.prototype.toString.call(b)&&(b=new RegExp(b,c)),b.test(a)};var D={allow_display_name:!1,allow_utf8_local_part:!0,require_tld:!0};a.isEmail=function(c,g){if(g=b(g,D),g.allow_display_name){var h=c.match(f);h&&(c=h[1])}var i=c.split("@"),j=i.pop(),k=i.join("@"),l=j.toLowerCase();return("gmail.com"===l||"googlemail.com"===l)&&(k=k.replace(/\./g,"").toLowerCase()),a.isByteLength(k,0,64)&&a.isByteLength(j,0,256)&&a.isFQDN(j,{require_tld:g.require_tld})?g.allow_utf8_local_part?e.test(k):d.test(k):!1};var E={protocols:["http","https","ftp"],require_tld:!0,require_protocol:!1,require_valid_protocol:!0,allow_underscores:!1,allow_trailing_dot:!1,allow_protocol_relative_urls:!1};a.isURL=function(c,d){if(!c||c.length>=2083||/\s/.test(c))return!1;if(0===c.indexOf("mailto:"))return!1;d=b(d,E);var e,f,g,h,i,j,k;if(k=c.split("://"),k.length>1){if(e=k.shift(),d.require_valid_protocol&&-1===d.protocols.indexOf(e))return!1}else{if(d.require_protocol)return!1;d.allow_protocol_relative_urls&&"//"===c.substr(0,2)&&(k[0]=c.substr(2))}return c=k.join("://"),k=c.split("#"),c=k.shift(),k=c.split("?"),c=k.shift(),k=c.split("/"),c=k.shift(),k=c.split("@"),k.length>1&&(f=k.shift(),f.indexOf(":")>=0&&f.split(":").length>2)?!1:(h=k.join("@"),k=h.split(":"),g=k.shift(),k.length&&(j=k.join(":"),i=parseInt(j,10),!/^[0-9]+$/.test(j)||0>=i||i>65535)?!1:a.isIP(g)||a.isFQDN(g,d)||"localhost"===g?d.host_whitelist&&-1===d.host_whitelist.indexOf(g)?!1:d.host_blacklist&&-1!==d.host_blacklist.indexOf(g)?!1:!0:!1)},a.isIP=function(b,c){if(c=a.toString(c),!c)return a.isIP(b,4)||a.isIP(b,6);if("4"===c){if(!k.test(b))return!1;var d=b.split(".").sort(function(a,b){return a-b});return d[3]<=255}if("6"===c){var e=b.split(":"),f=!1,g=a.isIP(e[e.length-1],4),h=g?7:8;if(e.length>h)return!1;if("::"===b)return!0;"::"===b.substr(0,2)?(e.shift(),e.shift(),f=!0):"::"===b.substr(b.length-2)&&(e.pop(),e.pop(),f=!0);for(var i=0;i<e.length;++i)if(""===e[i]&&i>0&&i<e.length-1){if(f)return!1;f=!0}else if(g&&i==e.length-1);else if(!l.test(e[i]))return!1;return f?e.length>=1:e.length===h}return!1};var F={require_tld:!0,allow_underscores:!1,allow_trailing_dot:!1};a.isFQDN=function(a,c){c=b(c,F),c.allow_trailing_dot&&"."===a[a.length-1]&&(a=a.substring(0,a.length-1));var d=a.split(".");if(c.require_tld){var e=d.pop();if(!d.length||!/^([a-z\u00a1-\uffff]{2,}|xn[a-z0-9-]{2,})$/i.test(e))return!1}for(var f,g=0;g<d.length;g++){if(f=d[g],c.allow_underscores){if(f.indexOf("__")>=0)return!1;f=f.replace(/_/g,"")}if(!/^[a-z\u00a1-\uffff0-9-]+$/i.test(f))return!1;if(/[\uff01-\uff5e]/.test(f))return!1;if("-"===f[0]||"-"===f[f.length-1]||f.indexOf("---")>=0)return!1}return!0},a.isBoolean=function(a){return["true","false","1","0"].indexOf(a)>=0},a.isAlpha=function(a){return n.test(a)},a.isAlphanumeric=function(a){return o.test(a)},a.isNumeric=function(a){return p.test(a)},a.isDecimal=function(a){return""!==a&&t.test(a)},a.isHexadecimal=function(a){return s.test(a)},a.isHexColor=function(a){return u.test(a)},a.isLowercase=function(a){return a===a.toLowerCase()},a.isUppercase=function(a){return a===a.toUpperCase()},a.isInt=function(a,b){return b=b||{},q.test(a)&&(!b.hasOwnProperty("min")||a>=b.min)&&(!b.hasOwnProperty("max")||a<=b.max)},a.isFloat=function(a,b){return b=b||{},""!==a&&r.test(a)&&(!b.hasOwnProperty("min")||a>=b.min)&&(!b.hasOwnProperty("max")||a<=b.max)},a.isDivisibleBy=function(b,c){return a.toFloat(b)%a.toInt(c)===0},a.isNull=function(a){return 0===a.length},a.isLength=function(a,b,c){var d=a.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g)||[],e=a.length-d.length;return e>=b&&("undefined"==typeof c||c>=e)},a.isByteLength=function(a,b,c){var d=encodeURI(a).split(/%..|./).length-1;return d>=b&&("undefined"==typeof c||c>=d)},a.isUUID=function(a,b){var c=m[b?b:"all"];return c&&c.test(a)},a.isDate=function(a){return!isNaN(Date.parse(a))},a.isAfter=function(b,c){var d=a.toDate(c||new Date),e=a.toDate(b);return!!(e&&d&&e>d)},a.isBefore=function(b,c){var d=a.toDate(c||new Date),e=a.toDate(b);return e&&d&&d>e},a.isIn=function(b,c){var d;if("[object Array]"===Object.prototype.toString.call(c)){var e=[];for(d in c)e[d]=a.toString(c[d]);return e.indexOf(b)>=0}return"object"==typeof c?c.hasOwnProperty(b):c&&"function"==typeof c.indexOf?c.indexOf(b)>=0:!1},a.isCreditCard=function(a){var b=a.replace(/[^0-9]+/g,"");if(!g.test(b))return!1;for(var c,d,e,f=0,h=b.length-1;h>=0;h--)c=b.substring(h,h+1),d=parseInt(c,10),e?(d*=2,f+=d>=10?d%10+1:d):f+=d,e=!e;return!!(f%10===0?b:!1)},a.isISIN=function(a){if(!h.test(a))return!1;for(var b,c,d=a.replace(/[A-Z]/g,function(a){return parseInt(a,36)}),e=0,f=!0,g=d.length-2;g>=0;g--)b=d.substring(g,g+1),c=parseInt(b,10),f?(c*=2,e+=c>=10?c+1:c):e+=c,f=!f;return parseInt(a.substr(a.length-1),10)===(1e4-e)%10},a.isISBN=function(b,c){if(c=a.toString(c),!c)return a.isISBN(b,10)||a.isISBN(b,13);var d,e=b.replace(/[\s-]+/g,""),f=0;if("10"===c){if(!i.test(e))return!1;for(d=0;9>d;d++)f+=(d+1)*e.charAt(d);if(f+="X"===e.charAt(9)?100:10*e.charAt(9),f%11===0)return!!e}else if("13"===c){if(!j.test(e))return!1;var g=[1,3];for(d=0;12>d;d++)f+=g[d%2]*e.charAt(d);if(e.charAt(12)-(10-f%10)%10===0)return!!e}return!1},a.isMobilePhone=function(a,b){return b in B?B[b].test(a):!1};var G={symbol:"$",require_symbol:!1,allow_space_after_symbol:!1,symbol_after_digits:!1,allow_negatives:!0,parens_for_negatives:!1,negative_sign_before_digits:!1,negative_sign_after_digits:!1,allow_negative_sign_placeholder:!1,thousands_separator:",",decimal_separator:".",allow_space_after_digits:!1};a.isCurrency=function(a,d){return d=b(d,G),c(d).test(a)},a.isJSON=function(a){try{var b=JSON.parse(a);return!!b&&"object"==typeof b}catch(c){}return!1},a.isMultibyte=function(a){return w.test(a)},a.isAscii=function(a){return v.test(a)},a.isFullWidth=function(a){return x.test(a)},a.isHalfWidth=function(a){return y.test(a)},a.isVariableWidth=function(a){return x.test(a)&&y.test(a)},a.isSurrogatePair=function(a){return z.test(a)},a.isBase64=function(a){return A.test(a)},a.isMongoId=function(b){return a.isHexadecimal(b)&&24===b.length},a.isISO8601=function(a){return C.test(a)},a.ltrim=function(a,b){var c=b?new RegExp("^["+b+"]+","g"):/^\s+/g;return a.replace(c,"")},a.rtrim=function(a,b){var c=b?new RegExp("["+b+"]+$","g"):/\s+$/g;return a.replace(c,"")},a.trim=function(a,b){var c=b?new RegExp("^["+b+"]+|["+b+"]+$","g"):/^\s+|\s+$/g;return a.replace(c,"")},a.escape=function(a){return a.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">").replace(/\//g,"/").replace(/\`/g,"`")},a.stripLow=function(b,c){var d=c?"\\x00-\\x09\\x0B\\x0C\\x0E-\\x1F\\x7F":"\\x00-\\x1F\\x7F";return a.blacklist(b,d)},a.whitelist=function(a,b){return a.replace(new RegExp("[^"+b+"]+","g"),"")},a.blacklist=function(a,b){return a.replace(new RegExp("["+b+"]+","g"),"")};var H={lowercase:!0};return a.normalizeEmail=function(c,d){if(d=b(d,H),!a.isEmail(c))return!1;var e=c.split("@",2);if(e[1]=e[1].toLowerCase(),"gmail.com"===e[1]||"googlemail.com"===e[1]){if(e[0]=e[0].toLowerCase().replace(/\./g,""),"+"===e[0][0])return!1;e[0]=e[0].split("+")[0],e[1]="gmail.com"}else d.lowercase&&(e[0]=e[0].toLowerCase());return e.join("@")},a.init(),a}),a.validator}).directive("asyncValid",["asyncValidator","$q",function(a,b){return{require:"ngModel",restrict:"A",link:function(c,d,e,f){var g=a[e.asyncValid],h=e.asyncDefaultState||a.defaultState,i=e.asyncInvalidResponse||a.invalidResponse,j=parseInt(e.asyncMinLength)||a.minLength,k=e.asyncValidResponse||a.validResponse;f.$asyncValidators.asyncValid=function(c,d){if(d.length<j&&h==k)return b.defer().resolve(!0);if(d.length<j&&h==i)return b.defer().resolve(!1);var e=a.getUrl(g,d);return a.resolve(e).then(function(a){return a?a===!0?b.defer().resolve(!0):0==a?b.defer().reject(!1):!1:b.reject(!1)})}}}}]).directive("contains",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.contains=function(b,c){return e.$isEmpty(b)?!0:a.contains(c,d.contains)}}}}]).directive("equals",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.equals=function(b,c){return e.$isEmpty(b)?!0:a.equals(c,d.equals)}}}}]).directive("isAfter",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isAfter=function(b,c){return e.$isEmpty(b)?!0:""!==d.isAfter?a.isAfter(c,d.isAfter):a.isAfter(c)}}}}]).directive("isAlpha",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isAlpha=function(b,c){return e.$isEmpty(b)?!0:a.isAlpha(c)}}}}]).directive("isAlphanumeric",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isAlphanumeric=function(b,c){return e.$isEmpty(b)?!0:a.isAlphanumeric(c)}}}}]).directive("isAscii",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isAscii=function(b,c){return e.$isEmpty(b)?!0:a.isAscii(c)}}}}]).directive("isBase64",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isAlphanumeric=function(b,c){return e.$isEmpty(b)?!0:a.isBase64(c)}}}}]).directive("isBefore",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isBefore=function(b,c){return e.$isEmpty(b)?!0:""!==d.isBefore?a.isBefore(c,d.isBefore):a.isBefore(c)}}}}]).directive("isBoolean",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isBoolean=function(b,c){return e.$isEmpty(b)?!0:a.isBoolean(c)}}}}]).directive("isCreditCard",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isCreditCard=function(b,c){return e.$isEmpty(b)?!0:a.isCreditCard(c)}}}}]).directive("isCurrency",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isCurrency=function(b,c){return e.$isEmpty(b)?!0:null!=d.isCurrency&&""!=d.isCurrency?a.isCurrency(c,d.isCurrency):a.isCurrency(c)}}}}]).directive("isDate",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isDate=function(b,c){return e.$isEmpty(b)?!0:a.isDate(c)}}}}]).directive("isDivisibleBy",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isDivisibleBy=function(b,c){return e.$isEmpty(b)?!0:a.isDivisibleBy(c,d.isDivisibleBy)}}}}]).directive("isEmail",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isEmail=function(b,c){return e.$isEmpty(b)?!0:null!=d.isEmail&&""!=d.isEmail?a.isEmail(c,d.isEmail):a.isEmail(c)}}}}]).directive("isFqdn",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isFqdn=function(b,c){return e.$isEmpty(b)?!0:null!=d.isFqdn&&""!=d.isFqdn?a.isFQDN(c,d.isFqdn):a.isFQDN(c)}}}}]).directive("isFloat",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isFloat=function(b,c){return e.$isEmpty(b)?!0:a.isFloat(c)}}}}]).directive("isFullWidth",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isFullWidth=function(b,c){return e.$isEmpty(b)?!0:a.isFullWidth(c)}}}}]).directive("isHalfWidth",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isHalfWidth=function(b,c){return e.$isEmpty(b)?!0:a.isHalfWidth(c)}}}}]).directive("isHexColor",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isHexColor=function(b,c){return e.$isEmpty(b)?!0:a.isHexColor(c)}}}}]).directive("isHexadecimal",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isHexadecimal=function(b,c){return e.$isEmpty(b)?!0:a.isHexadecimal(c)}}}}]).directive("isIp",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isIp=function(b,c){if(e.$isEmpty(b))return!0;var f=d.isIp.toString();return"6"===f||"4"===f?a.isIP(c,f):a.isIP(c)}}}}]).directive("isIsbn",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isIsbn=function(b,c){if(e.$isEmpty(b))return!0;var f=parseInt(d.isIsbn);return 10===f||13===f?a.isISBN(c,f):a.isISBN(c)}}}}]).directive("isIsin",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isIsin=function(b,c){return e.$isEmpty(b)?!0:a.isISIN(c)}}}}]).directive("isIso8601",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isIsin=function(b,c){return e.$isEmpty(b)?!0:a.isISO8601(c)}}}}]).directive("isIn",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isIn=function(b,c){return e.$isEmpty(b)?!0:a.isIn(c,d.isIn)}}}}]).directive("isInt",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isInt=function(b,c){return e.$isEmpty(b)?!0:a.isInt(c)}}}}]).directive("isJson",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isJson=function(b,c){return e.$isEmpty(b)?!0:a.isJSON(c)}}}}]).directive("isLowercase",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isLowercase=function(b,c){return e.$isEmpty(b)?!0:a.isLowercase(c)}}}}]).directive("isMobilePhone",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isMobilePhone=function(b,c){return e.$isEmpty(b)?!0:""!==d.isMobilePhone?a.isMobilePhone(c,d.isMobilePhone):!1}}}}]).directive("isMongoId",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isMongoId=function(b,c){return e.$isEmpty(b)?!0:a.isMongoId(c)}}}}]).directive("isMultibyte",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isMultibyte=function(b,c){return e.$isEmpty(b)?!0:a.isMultibyte(c)}}}}]).directive("isNull",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isNull=function(b,c){return e.$isEmpty(b)?!0:a.isNull(c)}}}}]).directive("isNumeric",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isNumeric=function(b,c){return e.$isEmpty(b)?!0:a.isNumeric(c)}}}}]).directive("isUrl",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isUrl=function(b,c){return e.$isEmpty(b)?!0:null!=d.isUrl&&""!=d.isUrl?a.isURL(c,d.isUrl):a.isURL(c)}}}}]).directive("isUuid",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isUuid=function(b,c){if(e.$isEmpty(b))return!0;var f=parseInt(d.isUuid.toString());return 3===f||4===f||5===f?a.isUUID(c,f):a.isUUID(c)}}}}]).directive("isUppercase",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isUppercase=function(b,c){return e.$isEmpty(b)?!0:a.isUppercase(c)}}}}]).directive("isVariableWidth",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isVariableWidth=function(b,c){return e.$isEmpty(b)?!0:a.isVariableWidth(c)}}}}]).directive("isSurrogatePair",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isSurrogatePair=function(b,c){return e.$isEmpty(b)?!0:a.isSurrogatePair(c)}}}}]).directive("watchEquals",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.watchEquals=function(c,f){b.$watch(d.ngModel,function(){null!=f&&null!=d.watchEquals&&e.$setValidity("watchEquals",a.equals(f,d.watchEquals))}),d.$observe("watchEquals",function(){null!=f&&null!=d.watchEquals&&e.$setValidity("watchEquals",a.equals(f,d.watchEquals))})}}}}]); | ||
"use strict";angular.module("angular.validators",[]).provider("asyncValidator",function(){var a,b=!1,c={},d="get".toLowerCase(),e="false",f=3,g="valid",h="true",i="{value}";this.baseUrl=function(b){return a=b,this},this.defaultState=function(a){return b=!!a,this},this.endpoint=function(a,b){return c[a]=b,this},this.httpVerb=function(a){return d=a.toLowerCase(),this},this.invalidResponse=function(a){return e=a,this},this.minLength=function(a){return f=parseInt(a),this},this.responseField=function(a){return g=a,this},this.validResponse=function(a){return h=a,this},this.wildcard=function(a){return i=a,this},this.$get=["$http","$q",function(j,k){var l={};for(var m in c)l[m]=a+c[m];return new function(){var a=k.defer();this.defaultState=b,this.endpoints=l,this.getUrl=function(a,b){return this.endpoints[a].replace(i,b)},this.invalidResponse=e,this.minLength=f,this.resolve=function(b){return j[d](b).then(function(b){return b.data[g]===h?a.resolve(!0):b.data[g]===e?a.reject(!1):void 0})["catch"](function(b){return a.reject()})},this.validResponse=h}}]}).service("nodeValidator",function(){var a={};return function(b,c){"undefined"!=typeof exports&&"undefined"!=typeof module?module.exports=c():"function"==typeof define&&"object"==typeof define.amd?define(c):a[b]=c()}("validator",function(a){function b(a){var b,c,d,e,f=a.match(F);if(f){if(b=f[21],!b||"z"===b||"Z"===b)return 0;c=f[22],-1!==b.indexOf(":")?(d=parseInt(f[23]),e=parseInt(f[24])):(d=0,e=parseInt(f[23]))}else{if(a=a.toLowerCase(),b=a.match(/(?:\s|gmt\s*)(-|\+)(\d{1,4})(\s|$)/),!b)return-1!==a.indexOf("gmt")?0:null;c=b[1];var g=b[2];3===g.length&&(g="0"+g),g.length<=2?(d=0,e=parseInt(g)):(d=parseInt(g.slice(0,2)),e=parseInt(g.slice(2,4)))}return(60*d+e)*("-"===c?1:-1)}function c(a,b){a=a||{};for(var c in b)"undefined"==typeof a[c]&&(a[c]=b[c]);return a}function d(a){var b="(\\"+a.symbol.replace(/\./g,"\\.")+")"+(a.require_symbol?"":"?"),c="-?",d="[1-9]\\d*",e="[1-9]\\d{0,2}(\\"+a.thousands_separator+"\\d{3})*",f=["0",d,e],g="("+f.join("|")+")?",h="(\\"+a.decimal_separator+"\\d{2})?",i=g+h;return a.allow_negatives&&!a.parens_for_negatives&&(a.negative_sign_after_digits?i+=c:a.negative_sign_before_digits&&(i=c+i)),a.allow_negative_sign_placeholder?i="( (?!\\-))?"+i:a.allow_space_after_symbol?i=" ?"+i:a.allow_space_after_digits&&(i+="( (?!$))?"),a.symbol_after_digits?i+=b:i=b+i,a.allow_negatives&&(a.parens_for_negatives?i="(\\("+i+"\\)|"+i+")":a.negative_sign_before_digits||a.negative_sign_after_digits||(i=c+i)),new RegExp("^(?!-? )(?=.*\\d)"+i+"$")}a={version:"4.2.1"};var e=/^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~]+$/i,f=/^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f]))*$/i,g=/^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+$/i,h=/^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))*$/i,i=/^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~\.\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~\.\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF\s]*<(.+)>$/i,j=/^(?: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})$/,k=/^[A-Z]{2}[0-9A-Z]{9}[0-9]$/,l=/^(?:[0-9]{9}X|[0-9]{10})$/,m=/^(?:[0-9]{13})$/,n=/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/,o=/^[0-9A-F]{1,4}$/i,p={3:/^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,4:/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,5:/^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,all:/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i},q=/^[A-Z]+$/i,r=/^[0-9A-Z]+$/i,s=/^[-+]?[0-9]+$/,t=/^(?:[-+]?(?:0|[1-9][0-9]*))$/,u=/^(?:[-+]?(?:[0-9]+))?(?:\.[0-9]*)?(?:[eE][\+\-]?(?:[0-9]+))?$/,v=/^[0-9A-F]+$/i,w=/^[-+]?([0-9]+|\.[0-9]+|[0-9]+\.[0-9]+)$/,x=/^#?([0-9A-F]{3}|[0-9A-F]{6})$/i,y=/^[\x00-\x7F]+$/,z=/[^\x00-\x7F]/,A=/[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/,B=/[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/,C=/[\uD800-\uDBFF][\uDC00-\uDFFF]/,D=/^(?:[A-Z0-9+\/]{4})*(?:[A-Z0-9+\/]{2}==|[A-Z0-9+\/]{3}=|[A-Z0-9+\/]{4})$/i,E={"zh-CN":/^(\+?0?86\-?)?1[345789]\d{9}$/,"zh-TW":/^(\+?886\-?|0)?9\d{8}$/,"en-ZA":/^(\+?27|0)\d{9}$/,"en-AU":/^(\+?61|0)4\d{8}$/,"en-HK":/^(\+?852\-?)?[569]\d{3}\-?\d{4}$/,"fr-FR":/^(\+?33|0)[67]\d{8}$/,"pt-PT":/^(\+351)?9[1236]\d{7}$/,"el-GR":/^(\+30)?((2\d{9})|(69\d{8}))$/,"en-GB":/^(\+?44|0)7\d{9}$/,"en-US":/^(\+?1)?[2-9]\d{2}[2-9](?!11)\d{6}$/,"en-ZM":/^(\+26)?09[567]\d{7}$/,"ru-RU":/^(\+?7|8)?9\d{9}$/,"nb-NO":/^(\+?47)?[49]\d{7}$/,"nn-NO":/^(\+?47)?[49]\d{7}$/},F=/^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24\:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/;a.extend=function(b,c){a[b]=function(){var b=Array.prototype.slice.call(arguments);return b[0]=a.toString(b[0]),c.apply(a,b)}},a.init=function(){for(var b in a)"function"==typeof a[b]&&"toString"!==b&&"toDate"!==b&&"extend"!==b&&"init"!==b&&a.extend(b,a[b])},a.toString=function(a){return"object"==typeof a&&null!==a&&a.toString?a=a.toString():(null===a||"undefined"==typeof a||isNaN(a)&&!a.length)&&(a=""),""+a},a.toDate=function(a){return"[object Date]"===Object.prototype.toString.call(a)?a:(a=Date.parse(a),isNaN(a)?null:new Date(a))},a.toFloat=function(a){return parseFloat(a)},a.toInt=function(a,b){return parseInt(a,b||10)},a.toBoolean=function(a,b){return b?"1"===a||"true"===a:"0"!==a&&"false"!==a&&""!==a},a.equals=function(b,c){return b===a.toString(c)},a.contains=function(b,c){return b.indexOf(a.toString(c))>=0},a.matches=function(a,b,c){return"[object RegExp]"!==Object.prototype.toString.call(b)&&(b=new RegExp(b,c)),b.test(a)};var G={allow_display_name:!1,allow_utf8_local_part:!0,require_tld:!0};a.isEmail=function(b,d){if(d=c(d,G),d.allow_display_name){var j=b.match(i);j&&(b=j[1])}var k=b.split("@"),l=k.pop(),m=k.join("@"),n=l.toLowerCase();if(("gmail.com"===n||"googlemail.com"===n)&&(m=m.replace(/\./g,"").toLowerCase()),!a.isByteLength(m,0,64)||!a.isByteLength(l,0,256))return!1;if(!a.isFQDN(l,{require_tld:d.require_tld}))return!1;if('"'===m[0])return m=m.slice(1,m.length-1),d.allow_utf8_local_part?h.test(m):f.test(m);for(var o=d.allow_utf8_local_part?g:e,p=m.split("."),q=0;q<p.length;q++)if(!o.test(p[q]))return!1;return!0};var H={protocols:["http","https","ftp"],require_tld:!0,require_protocol:!1,require_valid_protocol:!0,allow_underscores:!1,allow_trailing_dot:!1,allow_protocol_relative_urls:!1};a.isURL=function(b,d){if(!b||b.length>=2083||/\s/.test(b))return!1;if(0===b.indexOf("mailto:"))return!1;d=c(d,H);var e,f,g,h,i,j,k;if(k=b.split("://"),k.length>1){if(e=k.shift(),d.require_valid_protocol&&-1===d.protocols.indexOf(e))return!1}else{if(d.require_protocol)return!1;d.allow_protocol_relative_urls&&"//"===b.substr(0,2)&&(k[0]=b.substr(2))}return b=k.join("://"),k=b.split("#"),b=k.shift(),k=b.split("?"),b=k.shift(),k=b.split("/"),b=k.shift(),k=b.split("@"),k.length>1&&(f=k.shift(),f.indexOf(":")>=0&&f.split(":").length>2)?!1:(h=k.join("@"),k=h.split(":"),g=k.shift(),k.length&&(j=k.join(":"),i=parseInt(j,10),!/^[0-9]+$/.test(j)||0>=i||i>65535)?!1:a.isIP(g)||a.isFQDN(g,d)||"localhost"===g?d.host_whitelist&&-1===d.host_whitelist.indexOf(g)?!1:d.host_blacklist&&-1!==d.host_blacklist.indexOf(g)?!1:!0:!1)},a.isIP=function(b,c){if(c=a.toString(c),!c)return a.isIP(b,4)||a.isIP(b,6);if("4"===c){if(!n.test(b))return!1;var d=b.split(".").sort(function(a,b){return a-b});return d[3]<=255}if("6"===c){var e=b.split(":"),f=!1,g=a.isIP(e[e.length-1],4),h=g?7:8;if(e.length>h)return!1;if("::"===b)return!0;"::"===b.substr(0,2)?(e.shift(),e.shift(),f=!0):"::"===b.substr(b.length-2)&&(e.pop(),e.pop(),f=!0);for(var i=0;i<e.length;++i)if(""===e[i]&&i>0&&i<e.length-1){if(f)return!1;f=!0}else if(g&&i==e.length-1);else if(!o.test(e[i]))return!1;return f?e.length>=1:e.length===h}return!1};var I={require_tld:!0,allow_underscores:!1,allow_trailing_dot:!1};a.isFQDN=function(a,b){b=c(b,I),b.allow_trailing_dot&&"."===a[a.length-1]&&(a=a.substring(0,a.length-1));var d=a.split(".");if(b.require_tld){var e=d.pop();if(!d.length||!/^([a-z\u00a1-\uffff]{2,}|xn[a-z0-9-]{2,})$/i.test(e))return!1}for(var f,g=0;g<d.length;g++){if(f=d[g],b.allow_underscores){if(f.indexOf("__")>=0)return!1;f=f.replace(/_/g,"")}if(!/^[a-z\u00a1-\uffff0-9-]+$/i.test(f))return!1;if(/[\uff01-\uff5e]/.test(f))return!1;if("-"===f[0]||"-"===f[f.length-1]||f.indexOf("---")>=0)return!1}return!0},a.isBoolean=function(a){return["true","false","1","0"].indexOf(a)>=0},a.isAlpha=function(a){return q.test(a)},a.isAlphanumeric=function(a){return r.test(a)},a.isNumeric=function(a){return s.test(a)},a.isDecimal=function(a){return""!==a&&w.test(a)},a.isHexadecimal=function(a){return v.test(a)},a.isHexColor=function(a){return x.test(a)},a.isLowercase=function(a){return a===a.toLowerCase()},a.isUppercase=function(a){return a===a.toUpperCase()},a.isInt=function(a,b){return b=b||{},t.test(a)&&(!b.hasOwnProperty("min")||a>=b.min)&&(!b.hasOwnProperty("max")||a<=b.max)},a.isFloat=function(a,b){return b=b||{},""===a||"."===a?!1:u.test(a)&&(!b.hasOwnProperty("min")||a>=b.min)&&(!b.hasOwnProperty("max")||a<=b.max)},a.isDivisibleBy=function(b,c){return a.toFloat(b)%a.toInt(c)===0},a.isNull=function(a){return 0===a.length},a.isLength=function(a,b,c){var d=a.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g)||[],e=a.length-d.length;return e>=b&&("undefined"==typeof c||c>=e)},a.isByteLength=function(a,b,c){var d=encodeURI(a).split(/%..|./).length-1;return d>=b&&("undefined"==typeof c||c>=d)},a.isUUID=function(a,b){var c=p[b?b:"all"];return c&&c.test(a)},a.isDate=function(a){var c=new Date(Date.parse(a));if(isNaN(c))return!1;var d=b(a);if(null!==d){var e=c.getTimezoneOffset()-d;c=new Date(c.getTime()+6e4*e)}var f,g,h,i=String(c.getDate());return(g=a.match(/(^|[^:\d])[23]\d([^:\d]|$)/g))?(f=g.map(function(a){return a.match(/\d+/g)[0]}).join("/"),h=String(c.getFullYear()).slice(-2),f===i||f===h?!0:f===i+"/"+h||f===h+"/"+i?!0:!1):!0},a.isAfter=function(b,c){var d=a.toDate(c||new Date),e=a.toDate(b);return!!(e&&d&&e>d)},a.isBefore=function(b,c){var d=a.toDate(c||new Date),e=a.toDate(b);return!!(e&&d&&d>e)},a.isIn=function(b,c){var d;if("[object Array]"===Object.prototype.toString.call(c)){var e=[];for(d in c)e[d]=a.toString(c[d]);return e.indexOf(b)>=0}return"object"==typeof c?c.hasOwnProperty(b):c&&"function"==typeof c.indexOf?c.indexOf(b)>=0:!1},a.isCreditCard=function(a){var b=a.replace(/[^0-9]+/g,"");if(!j.test(b))return!1;for(var c,d,e,f=0,g=b.length-1;g>=0;g--)c=b.substring(g,g+1),d=parseInt(c,10),e?(d*=2,f+=d>=10?d%10+1:d):f+=d,e=!e;return!!(f%10===0?b:!1)},a.isISIN=function(a){if(!k.test(a))return!1;for(var b,c,d=a.replace(/[A-Z]/g,function(a){return parseInt(a,36)}),e=0,f=!0,g=d.length-2;g>=0;g--)b=d.substring(g,g+1),c=parseInt(b,10),f?(c*=2,e+=c>=10?c+1:c):e+=c,f=!f;return parseInt(a.substr(a.length-1),10)===(1e4-e)%10},a.isISBN=function(b,c){if(c=a.toString(c),!c)return a.isISBN(b,10)||a.isISBN(b,13);var d,e=b.replace(/[\s-]+/g,""),f=0;if("10"===c){if(!l.test(e))return!1;for(d=0;9>d;d++)f+=(d+1)*e.charAt(d);if(f+="X"===e.charAt(9)?100:10*e.charAt(9),f%11===0)return!!e}else if("13"===c){if(!m.test(e))return!1;var g=[1,3];for(d=0;12>d;d++)f+=g[d%2]*e.charAt(d);if(e.charAt(12)-(10-f%10)%10===0)return!!e}return!1},a.isMobilePhone=function(a,b){return b in E?E[b].test(a):!1};var J={symbol:"$",require_symbol:!1,allow_space_after_symbol:!1,symbol_after_digits:!1,allow_negatives:!0,parens_for_negatives:!1,negative_sign_before_digits:!1,negative_sign_after_digits:!1,allow_negative_sign_placeholder:!1,thousands_separator:",",decimal_separator:".",allow_space_after_digits:!1};a.isCurrency=function(a,b){return b=c(b,J),d(b).test(a)},a.isJSON=function(a){try{var b=JSON.parse(a);return!!b&&"object"==typeof b}catch(c){}return!1},a.isMultibyte=function(a){return z.test(a)},a.isAscii=function(a){return y.test(a)},a.isFullWidth=function(a){return A.test(a)},a.isHalfWidth=function(a){return B.test(a)},a.isVariableWidth=function(a){return A.test(a)&&B.test(a)},a.isSurrogatePair=function(a){return C.test(a)},a.isBase64=function(a){return D.test(a)},a.isMongoId=function(b){return a.isHexadecimal(b)&&24===b.length},a.isISO8601=function(a){return F.test(a)},a.ltrim=function(a,b){var c=b?new RegExp("^["+b+"]+","g"):/^\s+/g;return a.replace(c,"")},a.rtrim=function(a,b){var c=b?new RegExp("["+b+"]+$","g"):/\s+$/g;return a.replace(c,"")},a.trim=function(a,b){var c=b?new RegExp("^["+b+"]+|["+b+"]+$","g"):/^\s+|\s+$/g;return a.replace(c,"")},a.escape=function(a){return a.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">").replace(/\//g,"/").replace(/\`/g,"`")},a.stripLow=function(b,c){var d=c?"\\x00-\\x09\\x0B\\x0C\\x0E-\\x1F\\x7F":"\\x00-\\x1F\\x7F";return a.blacklist(b,d)},a.whitelist=function(a,b){return a.replace(new RegExp("[^"+b+"]+","g"),"")},a.blacklist=function(a,b){return a.replace(new RegExp("["+b+"]+","g"),"")};var K={lowercase:!0};return a.normalizeEmail=function(b,d){if(d=c(d,K),!a.isEmail(b))return!1;var e=b.split("@",2);if(e[1]=e[1].toLowerCase(),"gmail.com"===e[1]||"googlemail.com"===e[1]){if(e[0]=e[0].toLowerCase().replace(/\./g,""),"+"===e[0][0])return!1;e[0]=e[0].split("+")[0],e[1]="gmail.com"}else d.lowercase&&(e[0]=e[0].toLowerCase());return e.join("@")},a.init(),a}),a.validator}).directive("asyncValid",["asyncValidator","$q",function(a,b){return{require:"ngModel",restrict:"A",link:function(c,d,e,f){var g=a[e.asyncValid],h=e.asyncDefaultState||a.defaultState,i=e.asyncInvalidResponse||a.invalidResponse,j=parseInt(e.asyncMinLength)||a.minLength,k=e.asyncValidResponse||a.validResponse;f.$asyncValidators.asyncValid=function(c,d){if(d.length<j&&h==k)return b.defer().resolve(!0);if(d.length<j&&h==i)return b.defer().resolve(!1);var e=a.getUrl(g,d);return a.resolve(e).then(function(a){return a?a===!0?b.defer().resolve(!0):0==a?b.defer().reject(!1):!1:b.reject(!1)})}}}}]).directive("contains",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.contains=function(b,c){return e.$isEmpty(b)?!0:a.contains(c,d.contains)}}}}]).directive("equals",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.equals=function(b,c){return e.$isEmpty(b)?!0:a.equals(c,d.equals)}}}}]).directive("isAfter",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isAfter=function(b,c){return e.$isEmpty(b)?!0:""!==d.isAfter?a.isAfter(c,d.isAfter):a.isAfter(c)}}}}]).directive("isAlpha",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isAlpha=function(b,c){return e.$isEmpty(b)?!0:a.isAlpha(c)}}}}]).directive("isAlphanumeric",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isAlphanumeric=function(b,c){return e.$isEmpty(b)?!0:a.isAlphanumeric(c)}}}}]).directive("isAscii",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isAscii=function(b,c){return e.$isEmpty(b)?!0:a.isAscii(c)}}}}]).directive("isBase64",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isAlphanumeric=function(b,c){return e.$isEmpty(b)?!0:a.isBase64(c)}}}}]).directive("isBefore",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isBefore=function(b,c){return e.$isEmpty(b)?!0:""!==d.isBefore?a.isBefore(c,d.isBefore):a.isBefore(c)}}}}]).directive("isBoolean",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isBoolean=function(b,c){return e.$isEmpty(b)?!0:a.isBoolean(c)}}}}]).directive("isCreditCard",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isCreditCard=function(b,c){return e.$isEmpty(b)?!0:a.isCreditCard(c)}}}}]).directive("isCurrency",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isCurrency=function(b,c){return e.$isEmpty(b)?!0:null!=d.isCurrency&&""!=d.isCurrency?a.isCurrency(c,d.isCurrency):a.isCurrency(c)}}}}]).directive("isDate",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isDate=function(b,c){return e.$isEmpty(b)?!0:a.isDate(c)}}}}]).directive("isDivisibleBy",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isDivisibleBy=function(b,c){return e.$isEmpty(b)?!0:a.isDivisibleBy(c,d.isDivisibleBy)}}}}]).directive("isEmail",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isEmail=function(b,c){return e.$isEmpty(b)?!0:null!=d.isEmail&&""!=d.isEmail?a.isEmail(c,d.isEmail):a.isEmail(c)}}}}]).directive("isFqdn",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isFqdn=function(b,c){return e.$isEmpty(b)?!0:null!=d.isFqdn&&""!=d.isFqdn?a.isFQDN(c,d.isFqdn):a.isFQDN(c)}}}}]).directive("isFloat",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isFloat=function(b,c){return e.$isEmpty(b)?!0:a.isFloat(c)}}}}]).directive("isFullWidth",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isFullWidth=function(b,c){return e.$isEmpty(b)?!0:a.isFullWidth(c)}}}}]).directive("isHalfWidth",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isHalfWidth=function(b,c){return e.$isEmpty(b)?!0:a.isHalfWidth(c)}}}}]).directive("isHexColor",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isHexColor=function(b,c){return e.$isEmpty(b)?!0:a.isHexColor(c)}}}}]).directive("isHexadecimal",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isHexadecimal=function(b,c){return e.$isEmpty(b)?!0:a.isHexadecimal(c)}}}}]).directive("isIp",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isIp=function(b,c){if(e.$isEmpty(b))return!0;var f=d.isIp.toString();return"6"===f||"4"===f?a.isIP(c,f):a.isIP(c)}}}}]).directive("isIsbn",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isIsbn=function(b,c){if(e.$isEmpty(b))return!0;var f=parseInt(d.isIsbn);return 10===f||13===f?a.isISBN(c,f):a.isISBN(c)}}}}]).directive("isIsin",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isIsin=function(b,c){return e.$isEmpty(b)?!0:a.isISIN(c)}}}}]).directive("isIso8601",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isIsin=function(b,c){return e.$isEmpty(b)?!0:a.isISO8601(c)}}}}]).directive("isIn",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isIn=function(b,c){return e.$isEmpty(b)?!0:a.isIn(c,d.isIn)}}}}]).directive("isInt",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isInt=function(b,c){return e.$isEmpty(b)?!0:a.isInt(c)}}}}]).directive("isJson",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isJson=function(b,c){return e.$isEmpty(b)?!0:a.isJSON(c)}}}}]).directive("isLowercase",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isLowercase=function(b,c){return e.$isEmpty(b)?!0:a.isLowercase(c)}}}}]).directive("isMobilePhone",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isMobilePhone=function(b,c){return e.$isEmpty(b)?!0:""!==d.isMobilePhone?a.isMobilePhone(c,d.isMobilePhone):!1}}}}]).directive("isMongoId",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isMongoId=function(b,c){return e.$isEmpty(b)?!0:a.isMongoId(c)}}}}]).directive("isMultibyte",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isMultibyte=function(b,c){return e.$isEmpty(b)?!0:a.isMultibyte(c)}}}}]).directive("isNull",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isNull=function(b,c){return e.$isEmpty(b)?!0:a.isNull(c)}}}}]).directive("isNumeric",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isNumeric=function(b,c){return e.$isEmpty(b)?!0:a.isNumeric(c)}}}}]).directive("isUrl",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isUrl=function(b,c){return e.$isEmpty(b)?!0:null!=d.isUrl&&""!=d.isUrl?a.isURL(c,d.isUrl):a.isURL(c)}}}}]).directive("isUuid",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isUuid=function(b,c){if(e.$isEmpty(b))return!0;var f=parseInt(d.isUuid.toString());return 3===f||4===f||5===f?a.isUUID(c,f):a.isUUID(c)}}}}]).directive("isUppercase",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isUppercase=function(b,c){return e.$isEmpty(b)?!0:a.isUppercase(c)}}}}]).directive("isVariableWidth",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isVariableWidth=function(b,c){return e.$isEmpty(b)?!0:a.isVariableWidth(c)}}}}]).directive("isSurrogatePair",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.isSurrogatePair=function(b,c){return e.$isEmpty(b)?!0:a.isSurrogatePair(c)}}}}]).directive("watchEquals",["nodeValidator",function(a){return{require:"ngModel",restrict:"A",link:function(b,c,d,e){e.$validators.watchEquals=function(c,f){b.$watch(d.ngModel,function(){null!=f&&null!=d.watchEquals&&e.$setValidity("watchEquals",a.equals(f,d.watchEquals))}),d.$observe("watchEquals",function(){null!=f&&null!=d.watchEquals&&e.$setValidity("watchEquals",a.equals(f,d.watchEquals))})}}}}]); |
{ | ||
"name": "angular.validators", | ||
"version": "4.0.7", | ||
"version": "4.2.1", | ||
"description": "Angular validation directives using validator.js", | ||
@@ -5,0 +5,0 @@ "main": "./angular.validators.js", |
{ | ||
"name": "angular.validators", | ||
"version": "4.0.7", | ||
"version": "4.2.1", | ||
"license": "MIT", | ||
@@ -5,0 +5,0 @@ "devDependencies": { |
@@ -147,2 +147,4 @@ [![npm version](https://badge.fury.io/js/angular.validators.svg)](http://badge.fury.io/js/angular.validators) | ||
v4.2.1 - It's been a long time, updated to version 4.2.1 | ||
v4.0.6 - reverted back to code from v4.0.2 since v4.0.3 & v4.0.4 where riddled with bugs. | ||
@@ -149,0 +151,0 @@ |
Sorry, the diff of this file is not supported yet
2286
228
134838