validator
Advanced tools
Comparing version 4.9.0 to 5.0.0
@@ -0,1 +1,16 @@ | ||
#### 5.0.0 | ||
- Migrate to ES6 | ||
([#496](https://github.com/chriso/validator.js/pull/496)) | ||
- Break the library up so that individual functions can be imported | ||
([#496](https://github.com/chriso/validator.js/pull/496)) | ||
- Remove auto-coercion of input to a string | ||
([#496](https://github.com/chriso/validator.js/pull/496)) | ||
- Remove the `extend()` function | ||
([#496](https://github.com/chriso/validator.js/pull/496)) | ||
- Added Arabic locales to `isAlpha()` and `isAlphanumeric()` | ||
([#496](https://github.com/chriso/validator.js/pull/496#issuecomment-184781730)) | ||
- Fix validation of very large base64 strings | ||
([#503](https://github.com/chriso/validator.js/pull/503)) | ||
#### 4.9.0 | ||
@@ -2,0 +17,0 @@ |
@@ -1,11 +0,26 @@ | ||
{ "name": "validator", | ||
{ | ||
"name": "validator", | ||
"description": "String validation and sanitization", | ||
"version": "4.9.0", | ||
"version": "5.0.0", | ||
"homepage": "http://github.com/chriso/validator.js", | ||
"files": [ | ||
"index.js", | ||
"lib", | ||
"README.md", | ||
"LICENCE", | ||
"validator.js", | ||
"validator.min.js" | ||
], | ||
"keywords": [ | ||
"validator", "validation", "validate", "sanitization", | ||
"sanitize", "sanitisation", "sanitise", "assert" | ||
"validator", | ||
"validation", | ||
"validate", | ||
"sanitization", | ||
"sanitize", | ||
"sanitisation", | ||
"sanitise", | ||
"assert" | ||
], | ||
"author": "Chris O'Hara <cohara87@gmail.com>", | ||
"main": "validator.js", | ||
"main": "index.js", | ||
"bugs": { | ||
@@ -18,18 +33,33 @@ "url": "http://github.com/chriso/validator.js/issues" | ||
}, | ||
"dependencies": { | ||
"depd": "1.1.0" | ||
}, | ||
"devDependencies": { | ||
"babel-cli": "^6.5.1", | ||
"babel-plugin-add-module-exports": "^0.1.2", | ||
"babel-preset-es2015": "^6.5.0", | ||
"babel-preset-es2015-rollup": "^1.1.1", | ||
"coveralls": "latest", | ||
"eslint": "^2.2.0", | ||
"eslint-config-airbnb": "^6.0.0", | ||
"istanbul": "latest", | ||
"mocha": "latest", | ||
"istanbul": "latest", | ||
"jshint": "latest", | ||
"uglify-js": "latest", | ||
"coveralls": "latest" | ||
"rollup": "^0.25.4", | ||
"rollup-plugin-babel": "^2.3.9", | ||
"uglify-js": "latest" | ||
}, | ||
"scripts": { | ||
"lint": "eslint src test", | ||
"clean:node": "rm -rf index.js lib", | ||
"clean:browser": "rm -rf validator*.js", | ||
"clean": "npm run clean:node && npm run clean:browser", | ||
"minify": "uglifyjs validator.js -o validator.min.js --compress --mangle --comments '/Copyright/'", | ||
"build:browser": "babel-node build-browser && npm run minify", | ||
"build:node": "babel src -d . --presets es2015 --plugins add-module-exports", | ||
"build": "npm run build:browser && npm run build:node", | ||
"pretest": "npm run lint && npm run build", | ||
"test": "node ./node_modules/.bin/_mocha --reporter spec", | ||
"coveralls": "istanbul cover _mocha --report lcovonly -- -R spec && cat ./coverage/lcov.info | coveralls && rm -rf ./coverage" | ||
}, | ||
"engines": { "node" : ">= 0.10" }, | ||
"engines": { | ||
"node": ">= 0.10" | ||
}, | ||
"license": "MIT" | ||
} |
@@ -17,2 +17,14 @@ # validator.js | ||
#### ES6 | ||
```javascript | ||
import validator from 'validator'; | ||
``` | ||
Or, import only a subset of the library: | ||
```javascript | ||
import isEmail from 'validator/lib/isEmail'; | ||
``` | ||
### Client-side usage | ||
@@ -37,8 +49,6 @@ | ||
This library validates and sanitizes strings only. | ||
**This library validates and sanitizes strings only.** | ||
**Repeat: this library validates and sanitizes strings only**. | ||
Passing input that isn't a string will be an error in an upcoming release. | ||
If you're not sure if your input is a string, coerce it using `input + ''`. | ||
Passing anything other than a string is an error. | ||
@@ -50,4 +60,4 @@ ### Validators | ||
- **isAfter(str [, date])** - check if the string is a date that's after the specified date (defaults to now). | ||
- **isAlpha(str [, locale])** - check if the string contains only letters (a-zA-Z). Locale is one of `['en-US', 'de-DE', 'es-ES', 'fr-FR', 'nl-NL', 'pt-PT', 'en-AU', 'en-GB', 'en-HK', 'en-IN', 'en-NZ', 'en-ZA', 'en-ZM']`) and defaults to `en-US`. | ||
- **isAlphanumeric(str [, locale])** - check if the string contains only letters and numbers. Locale is one of `['en-US', 'de-DE', 'es-ES', 'fr-FR', 'nl-NL', 'pt-PT', 'en-AU', 'en-GB', 'en-HK', 'en-IN', 'en-NZ', 'en-ZA', 'en-ZM']`) and defaults to `en-US`. | ||
- **isAlpha(str [, locale])** - check if the string contains only letters (a-zA-Z). Locale is one of `['ar', 'ar-AE', 'ar-BH', 'ar-DZ', 'ar-EG', 'ar-IQ', 'ar-JO', 'ar-KW', 'ar-LB', 'ar-LY', 'ar-MA', 'ar-QM', 'ar-QA', 'ar-SA', 'ar-SD', 'ar-SY', 'ar-TN', 'ar-YE', 'en-US', 'de-DE', 'es-ES', 'fr-FR', 'nl-NL', 'pt-PT', 'en-AU', 'en-GB', 'en-HK', 'en-IN', 'en-NZ', 'en-ZA', 'en-ZM', 'ru-RU']`) and defaults to `en-US`. | ||
- **isAlphanumeric(str [, locale])** - check if the string contains only letters and numbers. Locale is one of `['ar', 'ar-AE', 'ar-BH', 'ar-DZ', 'ar-EG', 'ar-IQ', 'ar-JO', 'ar-KW', 'ar-LB', 'ar-LY', 'ar-MA', 'ar-QM', 'ar-QA', 'ar-SA', 'ar-SD', 'ar-SY', 'ar-TN', 'ar-YE', 'en-US', 'de-DE', 'es-ES', 'fr-FR', 'nl-NL', 'pt-PT', 'en-AU', 'en-GB', 'en-HK', 'en-IN', 'en-NZ', 'en-ZA', 'en-ZM', 'ru-RU']`) and defaults to `en-US`. | ||
- **isAscii(str)** - check if the string contains ASCII chars only. | ||
@@ -80,3 +90,3 @@ - **isBase64(str)** - check if a string is base64 encoded. | ||
- **isMACAddress(str)** - check if the string is a MAC address. | ||
- **isMobilePhone(str, locale)** - check if the string is a mobile phone number, (locale is one of `['zh-CN', 'zh-TW', 'en-ZA', 'en-AU', 'en-HK', 'pt-PT', 'fr-FR', 'el-GR', 'en-GB', 'en-US', 'en-ZM', 'ru-RU', 'nb-NO', 'nn-NO', 'vi-VN', 'en-NZ', 'en-IN', 'es-ES', 'de-DE', 'fi-FI']`). | ||
- **isMobilePhone(str, locale)** - check if the string is a mobile phone number, (locale is one of `['ar-SY', 'zh-CN', 'zh-TW', 'en-ZA', 'en-AU', 'en-HK', 'pt-PT', 'fr-FR', 'el-GR', 'en-GB', 'en-US', 'en-ZM', 'ru-RU', 'nb-NO', 'nn-NO', 'vi-VN', 'en-NZ', 'en-IN', 'es-ES', 'de-DE', 'fi-FI']`). | ||
- **isMongoId(str)** - check if the string is a valid hex-encoded representation of a [MongoDB ObjectId][mongoid]. | ||
@@ -115,12 +125,2 @@ - **isMultibyte(str)** - check if the string contains one or more multibyte chars. | ||
### Extensions | ||
You can add your own validators using `validator.extend(name, fn)` | ||
```javascript | ||
validator.extend('isWhitespace', function (str) { | ||
return /^\s+$/.test(str); | ||
}); | ||
``` | ||
Note that the first argument will be automatically coerced to a string. | ||
@@ -127,0 +127,0 @@ |
1550
validator.js
/*! | ||
* Copyright (c) 2015 Chris O'Hara <cohara87@gmail.com> | ||
* | ||
* Copyright (c) 2016 Chris O'Hara <cohara87@gmail.com> | ||
* | ||
* Permission is hereby granted, free of charge, to any person obtaining | ||
@@ -11,6 +11,6 @@ * a copy of this software and associated documentation files (the | ||
* the following conditions: | ||
* | ||
* | ||
* The above copyright notice and this permission notice shall be | ||
* included in all copies or substantial portions of the Software. | ||
* | ||
* | ||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||
@@ -24,299 +24,312 @@ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
*/ | ||
(function (global, factory) { | ||
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : | ||
typeof define === 'function' && define.amd ? define(factory) : | ||
(global.validator = factory()); | ||
}(this, function () { 'use strict'; | ||
(function (name, definition) { | ||
if (typeof exports !== 'undefined' && typeof module !== 'undefined') { | ||
module.exports = definition(); | ||
} else if (typeof define === 'function' && typeof define.amd === 'object') { | ||
define(definition); | ||
} else if (typeof define === 'function' && typeof define.petal === 'object') { | ||
define(name, [], definition); | ||
} else { | ||
this[name] = definition(); | ||
} | ||
})('validator', function (validator) { | ||
'use strict'; | ||
validator = { version: '4.9.0', coerce: true }; | ||
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 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 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 isbn10Maybe = /^(?:[0-9]{9}X|[0-9]{10})$/ | ||
, isbn13Maybe = /^(?:[0-9]{13})$/; | ||
var macAddress = /^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$/; | ||
var ipv4Maybe = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/ | ||
, 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 alpha = { | ||
'en-US': /^[A-Z]+$/i, | ||
'de-DE': /^[A-ZÄÖÜß]+$/i, | ||
'es-ES': /^[A-ZÁÉÍÑÓÚÜ]+$/i, | ||
'fr-FR': /^[A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i, | ||
'nl-NL': /^[A-ZÉËÏÓÖÜ]+$/i, | ||
'pt-PT': /^[A-ZÃÁÀÂÇÉÊÍÕÓÔÚÜ]+$/i, | ||
'ru-RU': /^[А-ЯЁа-яё]+$/i | ||
} | ||
, alphanumeric = { | ||
'en-US': /^[0-9A-Z]+$/i, | ||
'de-DE': /^[0-9A-ZÄÖÜß]+$/i, | ||
'es-ES': /^[0-9A-ZÁÉÍÑÓÚÜ]+$/i, | ||
'fr-FR': /^[0-9A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i, | ||
'nl-NL': /^[0-9A-ZÉËÏÓÖÜ]+$/i, | ||
'pt-PT': /^[0-9A-ZÃÁÀÂÇÉÊÍÕÓÔÚÜ]+$/i, | ||
'ru-RU': /^[0-9А-ЯЁа-яё]+$/i | ||
var babelHelpers = {}; | ||
babelHelpers.typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { | ||
return typeof obj; | ||
} : function (obj) { | ||
return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; | ||
}; | ||
babelHelpers; | ||
var englishLocales = ['AU', 'GB', 'HK', 'IN', 'NZ', 'ZA', 'ZM']; | ||
for (var locale, i = 0; i < englishLocales.length; i++) { | ||
locale = 'en-' + englishLocales[i]; | ||
alpha[locale] = alpha['en-US']; | ||
alphanumeric[locale] = alphanumeric['en-US']; | ||
} | ||
var 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 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 phones = { | ||
'en-US': /^(\+?1)?[2-9]\d{2}[2-9](?!11)\d{6}$/, | ||
'de-DE': /^(\+?49[ \.\-])?([\(]{1}[0-9]{1,6}[\)])?([0-9 \.\-\/]{3,20})((x|ext|extension)[ ]?[0-9]{1,4})?$/, | ||
'el-GR': /^(\+?30)?(69\d{8})$/, | ||
'en-AU': /^(\+?61|0)4\d{8}$/, | ||
'en-GB': /^(\+?44|0)7\d{9}$/, | ||
'en-HK': /^(\+?852\-?)?[569]\d{3}\-?\d{4}$/, | ||
'en-IN': /^(\+?91|0)?[789]\d{9}$/, | ||
'en-NZ': /^(\+?64|0)2\d{7,9}$/, | ||
'en-ZA': /^(\+?27|0)\d{9}$/, | ||
'en-ZM': /^(\+?26)?09[567]\d{7}$/, | ||
'es-ES': /^(\+?34)?(6\d{1}|7[1234])\d{7}$/, | ||
'fi-FI': /^(\+?358|0)\s?(4(0|1|2|4|5)?|50)\s?(\d\s?){4,8}\d$/, | ||
'fr-FR': /^(\+?33|0)[67]\d{8}$/, | ||
'nb-NO': /^(\+?47)?[49]\d{7}$/, | ||
'nn-NO': /^(\+?47)?[49]\d{7}$/, | ||
'pt-BR': /^(\+?55|0)\-?[1-9]{2}\-?[2-9]{1}\d{3,4}\-?\d{4}$/, | ||
'pt-PT': /^(\+?351)?9[1236]\d{7}$/, | ||
'ru-RU': /^(\+?7|8)?9\d{9}$/, | ||
'vi-VN': /^(\+?84|0)?((1(2([0-9])|6([2-9])|88|99))|(9((?!5)[0-9])))([0-9]{7})$/, | ||
'zh-CN': /^(\+?0?86\-?)?((13\d|14[57]|15[^4,\D]|17[678]|18\d)\d{8}|170[059]\d{7})$/, | ||
'zh-TW': /^(\+?886\-?|0)?9\d{8}$/ | ||
}; | ||
// 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); | ||
}; | ||
}; | ||
//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' || | ||
name === 'isServerSide') { | ||
continue; | ||
} | ||
validator.extend(name, validator[name]); | ||
} | ||
}; | ||
validator.isServerSide = function () { | ||
return typeof module === 'object' && module && | ||
typeof module.exports === 'object' && | ||
typeof process === 'object' && | ||
typeof require === 'function'; | ||
}; | ||
var depd = null; | ||
validator.deprecation = function (msg) { | ||
if (depd === null) { | ||
if (!validator.isServerSide()) { | ||
return; | ||
} | ||
depd = require('depd')('validator'); | ||
} | ||
depd(msg); | ||
}; | ||
validator.toString = function (input) { | ||
function assertString(input) { | ||
if (typeof input !== 'string') { | ||
// The library validates strings only. Currently it coerces all input to a string, but this | ||
// will go away in an upcoming major version change. Print a deprecation notice for now | ||
if (!validator.coerce) { | ||
throw new Error('this library validates strings only'); | ||
} | ||
validator.deprecation('you tried to validate a ' + typeof input + ' but this library ' + | ||
'(validator.js) validates strings only. Please update your code as this will ' + | ||
'be an error soon.'); | ||
throw new TypeError('This library (validator.js) validates strings only'); | ||
} | ||
if (typeof input === 'object' && input !== null) { | ||
if (typeof input.toString === 'function') { | ||
input = input.toString(); | ||
} else { | ||
input = '[object Object]'; | ||
} | ||
} 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; | ||
} | ||
function toDate(date) { | ||
assertString(date); | ||
date = Date.parse(date); | ||
return !isNaN(date) ? new Date(date) : null; | ||
}; | ||
} | ||
validator.toFloat = function (str) { | ||
function toFloat(str) { | ||
assertString(str); | ||
return parseFloat(str); | ||
}; | ||
} | ||
validator.toInt = function (str, radix) { | ||
function toInt(str, radix) { | ||
assertString(str); | ||
return parseInt(str, radix || 10); | ||
}; | ||
} | ||
validator.toBoolean = function (str, strict) { | ||
function toBoolean(str, strict) { | ||
assertString(str); | ||
if (strict) { | ||
return str === '1' || str === 'true'; | ||
return str === '1' || str === 'true'; | ||
} | ||
return str !== '0' && str !== 'false' && str !== ''; | ||
}; | ||
} | ||
validator.equals = function (str, comparison) { | ||
return str === validator.toString(comparison); | ||
}; | ||
function equals(str, comparison) { | ||
assertString(str); | ||
return str === comparison; | ||
} | ||
validator.contains = function (str, elem) { | ||
return str.indexOf(validator.toString(elem)) >= 0; | ||
}; | ||
function toString(input) { | ||
if ((typeof input === 'undefined' ? 'undefined' : babelHelpers.typeof(input)) === 'object' && input !== null) { | ||
if (typeof input.toString === 'function') { | ||
input = input.toString(); | ||
} else { | ||
input = '[object Object]'; | ||
} | ||
} else if (input === null || typeof input === 'undefined' || isNaN(input) && !input.length) { | ||
input = ''; | ||
} | ||
return String(input); | ||
} | ||
validator.matches = function (str, pattern, modifiers) { | ||
function contains(str, elem) { | ||
assertString(str); | ||
return str.indexOf(toString(elem)) >= 0; | ||
} | ||
function matches(str, pattern, modifiers) { | ||
assertString(str); | ||
if (Object.prototype.toString.call(pattern) !== '[object RegExp]') { | ||
pattern = new RegExp(pattern, modifiers); | ||
pattern = new RegExp(pattern, modifiers); | ||
} | ||
return pattern.test(str); | ||
}; | ||
} | ||
var default_email_options = { | ||
function merge() { | ||
var obj = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; | ||
var defaults = arguments[1]; | ||
for (var key in defaults) { | ||
if (typeof obj[key] === 'undefined') { | ||
obj[key] = defaults[key]; | ||
} | ||
} | ||
return obj; | ||
} | ||
/* eslint-disable prefer-rest-params */ | ||
function isByteLength(str, options) { | ||
assertString(str); | ||
var min = undefined; | ||
var max = undefined; | ||
if ((typeof options === 'undefined' ? 'undefined' : babelHelpers.typeof(options)) === 'object') { | ||
min = options.min || 0; | ||
max = options.max; | ||
} else { | ||
// backwards compatibility: isByteLength(str, min [, max]) | ||
min = arguments[1]; | ||
max = arguments[2]; | ||
} | ||
var len = encodeURI(str).split(/%..|./).length - 1; | ||
return len >= min && (typeof max === 'undefined' || len <= max); | ||
} | ||
var default_fqdn_options = { | ||
require_tld: true, | ||
allow_underscores: false, | ||
allow_trailing_dot: false | ||
}; | ||
function isFDQN(str, options) { | ||
assertString(str); | ||
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; | ||
} | ||
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] === '-') { | ||
return false; | ||
} | ||
} | ||
return true; | ||
} | ||
var default_email_options = { | ||
allow_display_name: false, | ||
allow_utf8_local_part: true, | ||
require_tld: true | ||
}; | ||
}; | ||
validator.isEmail = function (str, options) { | ||
/* eslint-disable max-len */ | ||
var displayName = /^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~\.\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~\.\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF\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 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; | ||
/* eslint-enable max-len */ | ||
function isEmail(str, options) { | ||
assertString(str); | ||
options = merge(options, default_email_options); | ||
if (options.allow_display_name) { | ||
var display_email = str.match(displayName); | ||
if (display_email) { | ||
str = display_email[1]; | ||
} | ||
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('@'); | ||
var domain = parts.pop(); | ||
var user = parts.join('@'); | ||
var lower_domain = domain.toLowerCase(); | ||
if (lower_domain === 'gmail.com' || lower_domain === 'googlemail.com') { | ||
user = user.replace(/\./g, '').toLowerCase(); | ||
user = user.replace(/\./g, '').toLowerCase(); | ||
} | ||
if (!validator.isByteLength(user, {max: 64}) || | ||
!validator.isByteLength(domain, {max: 256})) { | ||
return false; | ||
if (!isByteLength(user, { max: 64 }) || !isByteLength(domain, { max: 256 })) { | ||
return false; | ||
} | ||
if (!validator.isFQDN(domain, {require_tld: options.require_tld})) { | ||
return false; | ||
if (!isFDQN(domain, { require_tld: options.require_tld })) { | ||
return false; | ||
} | ||
if (user[0] === '"') { | ||
user = user.slice(1, user.length - 1); | ||
return options.allow_utf8_local_part ? | ||
quotedEmailUserUtf8.test(user) : | ||
quotedEmailUser.test(user); | ||
user = user.slice(1, user.length - 1); | ||
return options.allow_utf8_local_part ? quotedEmailUserUtf8.test(user) : quotedEmailUser.test(user); | ||
} | ||
var pattern = options.allow_utf8_local_part ? | ||
emailUserUtf8Part : emailUserPart; | ||
var pattern = options.allow_utf8_local_part ? emailUserUtf8Part : emailUserPart; | ||
var user_parts = user.split('.'); | ||
for (var i = 0; i < user_parts.length; i++) { | ||
if (!pattern.test(user_parts[i])) { | ||
return false; | ||
} | ||
if (!pattern.test(user_parts[i])) { | ||
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 | ||
}; | ||
var ipv4Maybe = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/; | ||
var ipv6Block = /^[0-9A-F]{1,4}$/i; | ||
validator.isURL = function (url, options) { | ||
if (!url || url.length >= 2083 || /\s/.test(url)) { | ||
function isIP(str) { | ||
var version = arguments.length <= 1 || arguments[1] === undefined ? '' : arguments[1]; | ||
assertString(str); | ||
version = String(version); | ||
if (!version) { | ||
return isIP(str, 4) || 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 :: | ||
// 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 = isIP(blocks[blocks.length - 1], 4); | ||
var expectedNumberOfBlocks = foundIPv4TransitionBlock ? 7 : 8; | ||
if (blocks.length > expectedNumberOfBlocks) { | ||
return 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; | ||
} | ||
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; | ||
} | ||
} | ||
if (foundOmissionBlock) { | ||
return blocks.length >= 1; | ||
} | ||
return blocks.length === expectedNumberOfBlocks; | ||
} | ||
return false; | ||
} | ||
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 | ||
}; | ||
function isURL(url, options) { | ||
assertString(url); | ||
if (!url || url.length >= 2083 || /\s/.test(url)) { | ||
return false; | ||
} | ||
if (url.indexOf('mailto:') === 0) { | ||
return false; | ||
return false; | ||
} | ||
options = merge(options, default_url_options); | ||
var protocol, auth, host, hostname, port, | ||
port_str, split; | ||
var protocol = undefined, | ||
auth = undefined, | ||
host = undefined, | ||
hostname = undefined, | ||
port = undefined, | ||
port_str = undefined, | ||
split = undefined; | ||
split = url.split('://'); | ||
if (split.length > 1) { | ||
protocol = split.shift(); | ||
if (options.require_valid_protocol && options.protocols.indexOf(protocol) === -1) { | ||
return false; | ||
} | ||
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); | ||
return false; | ||
} else if (options.allow_protocol_relative_urls && url.substr(0, 2) === '//') { | ||
split[0] = url.substr(2); | ||
} | ||
@@ -334,6 +347,6 @@ url = split.join('://'); | ||
if (split.length > 1) { | ||
auth = split.shift(); | ||
if (auth.indexOf(':') >= 0 && auth.split(':').length > 2) { | ||
return false; | ||
} | ||
auth = split.shift(); | ||
if (auth.indexOf(':') >= 0 && auth.split(':').length > 2) { | ||
return false; | ||
} | ||
} | ||
@@ -344,205 +357,219 @@ hostname = split.join('@'); | ||
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') { | ||
port_str = split.join(':'); | ||
port = parseInt(port_str, 10); | ||
if (!/^[0-9]+$/.test(port_str) || port <= 0 || port > 65535) { | ||
return false; | ||
} | ||
} | ||
if (options.host_whitelist && | ||
options.host_whitelist.indexOf(host) === -1) { | ||
return false; | ||
if (!isIP(host) && !isFDQN(host, options) && host !== 'localhost') { | ||
return false; | ||
} | ||
if (options.host_blacklist && | ||
options.host_blacklist.indexOf(host) !== -1) { | ||
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; | ||
}; | ||
} | ||
validator.isMACAddress = function (str) { | ||
var macAddress = /^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$/; | ||
function isMACAddress(str) { | ||
assertString(str); | ||
return macAddress.test(str); | ||
}; | ||
} | ||
validator.isIP = function (str, version) { | ||
version = version ? 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 :: | ||
function isBoolean(str) { | ||
assertString(str); | ||
return ['true', 'false', '1', '0'].indexOf(str) >= 0; | ||
} | ||
// 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; | ||
var alpha = { | ||
'en-US': /^[A-Z]+$/i, | ||
'de-DE': /^[A-ZÄÖÜß]+$/i, | ||
'es-ES': /^[A-ZÁÉÍÑÓÚÜ]+$/i, | ||
'fr-FR': /^[A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i, | ||
'nl-NL': /^[A-ZÉËÏÓÖÜ]+$/i, | ||
'pt-PT': /^[A-ZÃÁÀÂÇÉÊÍÕÓÔÚÜ]+$/i, | ||
'ru-RU': /^[А-ЯЁа-яё]+$/i, | ||
ar: /^[ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]+$/ | ||
}; | ||
if (blocks.length > expectedNumberOfBlocks) | ||
return false; | ||
var alphanumeric = { | ||
'en-US': /^[0-9A-Z]+$/i, | ||
'de-DE': /^[0-9A-ZÄÖÜß]+$/i, | ||
'es-ES': /^[0-9A-ZÁÉÍÑÓÚÜ]+$/i, | ||
'fr-FR': /^[0-9A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i, | ||
'nl-NL': /^[0-9A-ZÉËÏÓÖÜ]+$/i, | ||
'pt-PT': /^[0-9A-ZÃÁÀÂÇÉÊÍÕÓÔÚÜ]+$/i, | ||
'ru-RU': /^[0-9А-ЯЁа-яё]+$/i, | ||
ar: /^[٠١٢٣٤٥٦٧٨٩0-9ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]+$/ | ||
}; | ||
// 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; | ||
} | ||
var englishLocales = ['AU', 'GB', 'HK', 'IN', 'NZ', 'ZA', 'ZM']; | ||
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; | ||
} | ||
} | ||
for (var locale, i = 0; i < englishLocales.length; i++) { | ||
locale = 'en-' + englishLocales[i]; | ||
alpha[locale] = alpha['en-US']; | ||
alphanumeric[locale] = alphanumeric['en-US']; | ||
} | ||
if (foundOmissionBlock) { | ||
return blocks.length >= 1; | ||
} else { | ||
return blocks.length === expectedNumberOfBlocks; | ||
} | ||
} | ||
return false; | ||
}; | ||
// Source: http://www.localeplanet.com/java/ | ||
var arabicLocales = ['AE', 'BH', 'DZ', 'EG', 'IQ', 'JO', 'KW', 'LB', 'LY', 'MA', 'QM', 'QA', 'SA', 'SD', 'SY', 'TN', 'YE']; | ||
var default_fqdn_options = { | ||
require_tld: true | ||
, allow_underscores: false | ||
, allow_trailing_dot: false | ||
}; | ||
for (var locale, i = 0; i < arabicLocales.length; i++) { | ||
locale = 'ar-' + arabicLocales[i]; | ||
alpha[locale] = alpha.ar; | ||
alphanumeric[locale] = alphanumeric.ar; | ||
} | ||
validator.isFQDN = function (str, options) { | ||
options = merge(options, default_fqdn_options); | ||
function isAlpha(str) { | ||
var locale = arguments.length <= 1 || arguments[1] === undefined ? 'en-US' : arguments[1]; | ||
/* 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; | ||
} | ||
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] === '-') { | ||
return false; | ||
} | ||
} | ||
return true; | ||
}; | ||
validator.isBoolean = function(str) { | ||
return (['true', 'false', '1', '0'].indexOf(str) >= 0); | ||
}; | ||
validator.isAlpha = function (str, locale) { | ||
locale = locale || 'en-US'; | ||
assertString(str); | ||
if (locale in alpha) { | ||
return alpha[locale].test(str); | ||
return alpha[locale].test(str); | ||
} | ||
throw new Error('Invalid locale \'' + locale + '\''); | ||
}; | ||
} | ||
validator.isAlphanumeric = function (str, locale) { | ||
locale = locale || 'en-US'; | ||
function isAlphanumeric(str) { | ||
var locale = arguments.length <= 1 || arguments[1] === undefined ? 'en-US' : arguments[1]; | ||
assertString(str); | ||
if (locale in alphanumeric) { | ||
return alphanumeric[locale].test(str); | ||
return alphanumeric[locale].test(str); | ||
} | ||
throw new Error('Invalid locale \'' + locale + '\''); | ||
}; | ||
} | ||
validator.isNumeric = function (str) { | ||
var numeric = /^[-+]?[0-9]+$/; | ||
function isNumeric(str) { | ||
assertString(str); | ||
return numeric.test(str); | ||
}; | ||
} | ||
validator.isDecimal = function (str) { | ||
return str !== '' && decimal.test(str); | ||
}; | ||
function isLowercase(str) { | ||
assertString(str); | ||
return str === str.toLowerCase(); | ||
} | ||
validator.isHexadecimal = function (str) { | ||
return hexadecimal.test(str); | ||
}; | ||
function isUppercase(str) { | ||
assertString(str); | ||
return str === str.toUpperCase(); | ||
} | ||
validator.isHexColor = function (str) { | ||
return hexcolor.test(str); | ||
}; | ||
var ascii = /^[\x00-\x7F]+$/; | ||
validator.isLowercase = function (str) { | ||
return str === str.toLowerCase(); | ||
}; | ||
function isAscii(str) { | ||
assertString(str); | ||
return ascii.test(str); | ||
} | ||
validator.isUppercase = function (str) { | ||
return str === str.toUpperCase(); | ||
}; | ||
var fullWidth = /[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/; | ||
validator.isInt = function (str, options) { | ||
function isFullWidth(str) { | ||
assertString(str); | ||
return fullWidth.test(str); | ||
} | ||
var halfWidth = /[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/; | ||
function isHalfWidth(str) { | ||
assertString(str); | ||
return halfWidth.test(str); | ||
} | ||
function isVariableWidth(str) { | ||
assertString(str); | ||
return fullWidth.test(str) && halfWidth.test(str); | ||
} | ||
var multibyte = /[^\x00-\x7F]/; | ||
function isMultibyte(str) { | ||
assertString(str); | ||
return multibyte.test(str); | ||
} | ||
var surrogatePair = /[\uD800-\uDBFF][\uDC00-\uDFFF]/; | ||
function isSurrogatePair(str) { | ||
assertString(str); | ||
return surrogatePair.test(str); | ||
} | ||
var int = /^(?:[-+]?(?:0|[1-9][0-9]*))$/; | ||
function isInt(str, options) { | ||
assertString(str); | ||
options = options || {}; | ||
return int.test(str) && (!options.hasOwnProperty('min') || str >= options.min) && (!options.hasOwnProperty('max') || str <= options.max); | ||
}; | ||
} | ||
validator.isFloat = function (str, options) { | ||
var float = /^(?:[-+]?(?:[0-9]+))?(?:\.[0-9]*)?(?:[eE][\+\-]?(?:[0-9]+))?$/; | ||
function isFloat(str, options) { | ||
assertString(str); | ||
options = options || {}; | ||
if (str === '' || str === '.') { | ||
return false; | ||
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) % parseInt(num, 10) === 0; | ||
}; | ||
var decimal = /^[-+]?([0-9]+|\.[0-9]+|[0-9]+\.[0-9]+)$/; | ||
validator.isNull = function (str) { | ||
function isDecimal(str) { | ||
assertString(str); | ||
return str !== '' && decimal.test(str); | ||
} | ||
var hexadecimal = /^[0-9A-F]+$/i; | ||
function isHexadecimal(str) { | ||
assertString(str); | ||
return hexadecimal.test(str); | ||
} | ||
function isDivisibleBy(str, num) { | ||
assertString(str); | ||
return toFloat(str) % parseInt(num, 10) === 0; | ||
} | ||
var hexcolor = /^#?([0-9A-F]{3}|[0-9A-F]{6})$/i; | ||
function isHexColor(str) { | ||
assertString(str); | ||
return hexcolor.test(str); | ||
} | ||
function isJSON(str) { | ||
assertString(str); | ||
try { | ||
var obj = JSON.parse(str); | ||
return !!obj && (typeof obj === 'undefined' ? 'undefined' : babelHelpers.typeof(obj)) === 'object'; | ||
} catch (e) {/* ignore */} | ||
return false; | ||
} | ||
function isNull(str) { | ||
assertString(str); | ||
return str.length === 0; | ||
}; | ||
} | ||
validator.isLength = function (str, options) { | ||
var min, max; | ||
if (typeof(options) === 'object') { | ||
min = options.min || 0; | ||
max = options.max; | ||
} else { // backwards compatibility: isLength(str, min [, max]) | ||
min = arguments[1]; | ||
max = arguments[2]; | ||
/* eslint-disable prefer-rest-params */ | ||
function isLength(str, options) { | ||
assertString(str); | ||
var min = undefined; | ||
var max = undefined; | ||
if ((typeof options === 'undefined' ? 'undefined' : babelHelpers.typeof(options)) === 'object') { | ||
min = options.min || 0; | ||
max = options.max; | ||
} else { | ||
// backwards compatibility: isLength(str, min [, max]) | ||
min = arguments[1]; | ||
max = arguments[2]; | ||
} | ||
@@ -552,67 +579,84 @@ var surrogatePairs = str.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g) || []; | ||
return len >= min && (typeof max === 'undefined' || len <= max); | ||
}; | ||
validator.isByteLength = function (str, options) { | ||
var min, max; | ||
if (typeof(options) === 'object') { | ||
min = options.min || 0; | ||
max = options.max; | ||
} else { // backwards compatibility: isByteLength(str, min [, max]) | ||
min = arguments[1]; | ||
max = arguments[2]; | ||
} | ||
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']; | ||
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 | ||
}; | ||
function isUUID(str) { | ||
var version = arguments.length <= 1 || arguments[1] === undefined ? 'all' : arguments[1]; | ||
assertString(str); | ||
var pattern = uuid[version]; | ||
return pattern && pattern.test(str); | ||
}; | ||
} | ||
function getTimezoneOffset(str) { | ||
var iso8601Parts = str.match(iso8601) | ||
, timezone, sign, hours, minutes; | ||
function isMongoId(str) { | ||
assertString(str); | ||
return isHexadecimal(str) && str.length === 24; | ||
} | ||
/* eslint-disable max-len */ | ||
// 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)?)?)?)?$/; | ||
/* eslint-enable max-len */ | ||
function isISO8601 (str) { | ||
assertString(str); | ||
return iso8601.test(str); | ||
} | ||
function getTimezoneOffset(str) { | ||
var iso8601Parts = str.match(iso8601); | ||
var timezone = undefined, | ||
sign = undefined, | ||
hours = undefined, | ||
minutes = undefined; | ||
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)); | ||
} | ||
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, 10); | ||
} else { | ||
hours = parseInt(offset.slice(0, 2), 10); | ||
minutes = parseInt(offset.slice(2, 4), 10); | ||
} | ||
} else { | ||
timezone = iso8601Parts[21]; | ||
if (!timezone) { | ||
// if no hour/minute was provided, the date is GMT | ||
return !iso8601Parts[12] ? 0 : null; | ||
} | ||
if (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]); | ||
} | ||
timezone = iso8601Parts[21]; | ||
if (!timezone) { | ||
// if no hour/minute was provided, the date is GMT | ||
return !iso8601Parts[12] ? 0 : null; | ||
} | ||
if (timezone === 'z' || timezone === 'Z') { | ||
return 0; | ||
} | ||
sign = iso8601Parts[22]; | ||
if (timezone.indexOf(':') !== -1) { | ||
hours = parseInt(iso8601Parts[23], 10); | ||
minutes = parseInt(iso8601Parts[24], 10); | ||
} else { | ||
hours = 0; | ||
minutes = parseInt(iso8601Parts[23], 10); | ||
} | ||
} | ||
return (hours * 60 + minutes) * (sign === '-' ? 1 : -1); | ||
} | ||
} | ||
validator.isDate = function (str) { | ||
function isDate(str) { | ||
assertString(str); | ||
var normalizedDate = new Date(Date.parse(str)); | ||
if (isNaN(normalizedDate)) { | ||
return false; | ||
return false; | ||
} | ||
@@ -625,19 +669,19 @@ | ||
if (timezoneOffset !== null) { | ||
var timezoneDifference = normalizedDate.getTimezoneOffset() - | ||
timezoneOffset; | ||
normalizedDate = new Date(normalizedDate.getTime() + | ||
60000 * timezoneDifference); | ||
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 | ||
var dayOrYear = undefined, | ||
dayOrYearMatches = undefined, | ||
year = undefined; | ||
// 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; | ||
return true; | ||
} | ||
dayOrYear = dayOrYearMatches.map(function(digitString) { | ||
return digitString.match(/\d+/g)[0]; | ||
dayOrYear = dayOrYearMatches.map(function (digitString) { | ||
return digitString.match(/\d+/g)[0]; | ||
}).join('/'); | ||
@@ -647,257 +691,334 @@ | ||
if (dayOrYear === day || dayOrYear === year) { | ||
return true; | ||
} else if ((dayOrYear === (day + '/' + year)) || (dayOrYear === (year + '/' + day))) { | ||
return true; | ||
return true; | ||
} else if (dayOrYear === '' + day / year || dayOrYear === '' + year / day) { | ||
return true; | ||
} | ||
return false; | ||
}; | ||
} | ||
validator.isAfter = function (str, date) { | ||
var comparison = validator.toDate(date || new Date()) | ||
, original = validator.toDate(str); | ||
function isAfter(str) { | ||
var date = arguments.length <= 1 || arguments[1] === undefined ? String(new Date()) : arguments[1]; | ||
assertString(str); | ||
var comparison = toDate(date); | ||
var original = toDate(str); | ||
return !!(original && comparison && original > comparison); | ||
}; | ||
} | ||
validator.isBefore = function (str, date) { | ||
var comparison = validator.toDate(date || new Date()) | ||
, original = validator.toDate(str); | ||
function isBefore(str) { | ||
var date = arguments.length <= 1 || arguments[1] === undefined ? String(new Date()) : arguments[1]; | ||
assertString(str); | ||
var comparison = toDate(date); | ||
var original = toDate(str); | ||
return !!(original && comparison && original < comparison); | ||
}; | ||
} | ||
validator.isIn = function (str, options) { | ||
var i; | ||
function isIn(str, options) { | ||
assertString(str); | ||
var i = undefined; | ||
if (Object.prototype.toString.call(options) === '[object Array]') { | ||
var array = []; | ||
for (i in options) { | ||
array[i] = validator.toString(options[i]); | ||
var array = []; | ||
for (i in options) { | ||
if ({}.hasOwnProperty.call(options, i)) { | ||
array[i] = toString(options[i]); | ||
} | ||
return array.indexOf(str) >= 0; | ||
} else if (typeof options === 'object') { | ||
return options.hasOwnProperty(str); | ||
} | ||
return array.indexOf(str) >= 0; | ||
} else if ((typeof options === 'undefined' ? 'undefined' : babelHelpers.typeof(options)) === 'object') { | ||
return options.hasOwnProperty(str); | ||
} else if (options && typeof options.indexOf === 'function') { | ||
return options.indexOf(str) >= 0; | ||
return options.indexOf(str) >= 0; | ||
} | ||
return false; | ||
}; | ||
} | ||
validator.isWhitelisted = function (str, chars) { | ||
for (var i = str.length - 1; i >= 0; i--) { | ||
if (chars.indexOf(str[i]) === -1) { | ||
return false; | ||
} | ||
} | ||
/* eslint-disable max-len */ | ||
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})$/; | ||
/* eslint-enable max-len */ | ||
return true; | ||
}; | ||
validator.isCreditCard = function (str) { | ||
function isCreditCard(str) { | ||
assertString(str); | ||
var sanitized = str.replace(/[^0-9]+/g, ''); | ||
if (!creditCard.test(sanitized)) { | ||
return false; | ||
return false; | ||
} | ||
var sum = 0, digit, tmpNum, shouldDouble; | ||
var sum = 0; | ||
var digit = undefined; | ||
var tmpNum = undefined; | ||
var shouldDouble = undefined; | ||
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; | ||
} | ||
digit = sanitized.substring(i, i + 1); | ||
tmpNum = parseInt(digit, 10); | ||
if (shouldDouble) { | ||
tmpNum *= 2; | ||
if (tmpNum >= 10) { | ||
sum += tmpNum % 10 + 1; | ||
} else { | ||
sum += tmpNum; | ||
sum += tmpNum; | ||
} | ||
shouldDouble = !shouldDouble; | ||
} else { | ||
sum += tmpNum; | ||
} | ||
shouldDouble = !shouldDouble; | ||
} | ||
return !!((sum % 10) === 0 ? sanitized : false); | ||
}; | ||
return !!(sum % 10 === 0 ? sanitized : false); | ||
} | ||
validator.isISIN = function (str) { | ||
var isin = /^[A-Z]{2}[0-9A-Z]{9}[0-9]$/; | ||
function isISIN(str) { | ||
assertString(str); | ||
if (!isin.test(str)) { | ||
return false; | ||
return false; | ||
} | ||
var checksumStr = str.replace(/[A-Z]/g, function(character) { | ||
return parseInt(character, 36); | ||
var checksumStr = str.replace(/[A-Z]/g, function (character) { | ||
return parseInt(character, 36); | ||
}); | ||
var sum = 0, digit, tmpNum, shouldDouble = true; | ||
var sum = 0; | ||
var digit = undefined; | ||
var tmpNum = undefined; | ||
var 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; | ||
} | ||
digit = checksumStr.substring(i, i + 1); | ||
tmpNum = parseInt(digit, 10); | ||
if (shouldDouble) { | ||
tmpNum *= 2; | ||
if (tmpNum >= 10) { | ||
sum += tmpNum + 1; | ||
} else { | ||
sum += tmpNum; | ||
sum += tmpNum; | ||
} | ||
shouldDouble = !shouldDouble; | ||
} else { | ||
sum += tmpNum; | ||
} | ||
shouldDouble = !shouldDouble; | ||
} | ||
return parseInt(str.substr(str.length - 1), 10) === (10000 - sum) % 10; | ||
}; | ||
} | ||
validator.isISBN = function (str, version) { | ||
version = version ? version + '' : ''; | ||
var isbn10Maybe = /^(?:[0-9]{9}X|[0-9]{10})$/; | ||
var isbn13Maybe = /^(?:[0-9]{13})$/; | ||
var factor = [1, 3]; | ||
function isISBN(str) { | ||
var version = arguments.length <= 1 || arguments[1] === undefined ? '' : arguments[1]; | ||
assertString(str); | ||
version = String(version); | ||
if (!version) { | ||
return validator.isISBN(str, 10) || validator.isISBN(str, 13); | ||
return isISBN(str, 10) || isISBN(str, 13); | ||
} | ||
var sanitized = str.replace(/[\s-]+/g, '') | ||
, checksum = 0, i; | ||
var sanitized = str.replace(/[\s-]+/g, ''); | ||
var checksum = 0; | ||
var i = undefined; | ||
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; | ||
} | ||
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; | ||
} | ||
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; | ||
}; | ||
} | ||
validator.isMobilePhone = function(str, locale) { | ||
/* eslint-disable max-len */ | ||
var phones = { | ||
'ar-SY': /^(!?(\+?963)|0)?9\d{8}$/, | ||
'en-US': /^(\+?1)?[2-9]\d{2}[2-9](?!11)\d{6}$/, | ||
'de-DE': /^(\+?49[ \.\-])?([\(]{1}[0-9]{1,6}[\)])?([0-9 \.\-\/]{3,20})((x|ext|extension)[ ]?[0-9]{1,4})?$/, | ||
'el-GR': /^(\+?30)?(69\d{8})$/, | ||
'en-AU': /^(\+?61|0)4\d{8}$/, | ||
'en-GB': /^(\+?44|0)7\d{9}$/, | ||
'en-HK': /^(\+?852\-?)?[569]\d{3}\-?\d{4}$/, | ||
'en-IN': /^(\+?91|0)?[789]\d{9}$/, | ||
'en-NZ': /^(\+?64|0)2\d{7,9}$/, | ||
'en-ZA': /^(\+?27|0)\d{9}$/, | ||
'en-ZM': /^(\+?26)?09[567]\d{7}$/, | ||
'es-ES': /^(\+?34)?(6\d{1}|7[1234])\d{7}$/, | ||
'fi-FI': /^(\+?358|0)\s?(4(0|1|2|4|5)?|50)\s?(\d\s?){4,8}\d$/, | ||
'fr-FR': /^(\+?33|0)[67]\d{8}$/, | ||
'nb-NO': /^(\+?47)?[49]\d{7}$/, | ||
'nn-NO': /^(\+?47)?[49]\d{7}$/, | ||
'pt-BR': /^(\+?55|0)\-?[1-9]{2}\-?[2-9]{1}\d{3,4}\-?\d{4}$/, | ||
'pt-PT': /^(\+?351)?9[1236]\d{7}$/, | ||
'ru-RU': /^(\+?7|8)?9\d{9}$/, | ||
'vi-VN': /^(\+?84|0)?((1(2([0-9])|6([2-9])|88|99))|(9((?!5)[0-9])))([0-9]{7})$/, | ||
'zh-CN': /^(\+?0?86\-?)?((13\d|14[57]|15[^4,\D]|17[678]|18\d)\d{8}|170[059]\d{7})$/, | ||
'zh-TW': /^(\+?886\-?|0)?9\d{8}$/ | ||
}; | ||
/* eslint-enable max-len */ | ||
function isMobilePhone(str, locale) { | ||
assertString(str); | ||
if (locale in phones) { | ||
return phones[locale].test(str); | ||
return phones[locale].test(str); | ||
} | ||
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 | ||
}; | ||
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; | ||
validator.isCurrency = function (str, options) { | ||
options = merge(options, default_currency_options); | ||
// 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; | ||
} | ||
} | ||
return currencyRegex(options).test(str); | ||
}; | ||
// 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 += '( (?!$))?'; | ||
} | ||
validator.isJSON = function (str) { | ||
try { | ||
var obj = JSON.parse(str); | ||
return !!obj && typeof obj === 'object'; | ||
} catch (e) {} | ||
return false; | ||
}; | ||
if (options.symbol_after_digits) { | ||
pattern += symbol; | ||
} else { | ||
pattern = symbol + pattern; | ||
} | ||
validator.isMultibyte = function (str) { | ||
return multibyte.test(str); | ||
}; | ||
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; | ||
} | ||
} | ||
validator.isAscii = function (str) { | ||
return ascii.test(str); | ||
}; | ||
/* eslint-disable prefer-template */ | ||
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 + '$'); | ||
/* eslint-enable prefer-template */ | ||
} | ||
validator.isFullWidth = function (str) { | ||
return fullWidth.test(str); | ||
}; | ||
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.isHalfWidth = function (str) { | ||
return halfWidth.test(str); | ||
}; | ||
function isCurrency(str, options) { | ||
assertString(str); | ||
options = merge(options, default_currency_options); | ||
return currencyRegex(options).test(str); | ||
} | ||
validator.isVariableWidth = function (str) { | ||
return fullWidth.test(str) && halfWidth.test(str); | ||
}; | ||
var notBase64 = /[^A-Z0-9+\/=]/i; | ||
validator.isSurrogatePair = function (str) { | ||
return surrogatePair.test(str); | ||
}; | ||
function isBase64(str) { | ||
assertString(str); | ||
var len = str.length; | ||
if (!len || len % 4 !== 0 || notBase64.test(str)) { | ||
return false; | ||
} | ||
var firstPaddingChar = str.indexOf('='); | ||
return firstPaddingChar === -1 || firstPaddingChar === len - 1 || firstPaddingChar === len - 2 && str[len - 1] === '='; | ||
} | ||
validator.isBase64 = function (str) { | ||
return base64.test(str); | ||
}; | ||
validator.isMongoId = function (str) { | ||
return validator.isHexadecimal(str) && str.length === 24; | ||
}; | ||
validator.isISO8601 = function (str) { | ||
return iso8601.test(str); | ||
}; | ||
validator.ltrim = function (str, chars) { | ||
function ltrim(str, chars) { | ||
assertString(str); | ||
var pattern = chars ? new RegExp('^[' + chars + ']+', 'g') : /^\s+/g; | ||
return str.replace(pattern, ''); | ||
}; | ||
} | ||
validator.rtrim = function (str, chars) { | ||
function rtrim(str, chars) { | ||
assertString(str); | ||
var pattern = chars ? new RegExp('[' + chars + ']+$', 'g') : /\s+$/g; | ||
return str.replace(pattern, ''); | ||
}; | ||
} | ||
validator.trim = function (str, chars) { | ||
function trim(str, chars) { | ||
assertString(str); | ||
var pattern = chars ? new RegExp('^[' + chars + ']+|[' + chars + ']+$', 'g') : /^\s+|\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, '`')); | ||
}; | ||
function escape(str) { | ||
assertString(str); | ||
return str.replace(/&/g, '&').replace(/"/g, '"').replace(/'/g, ''').replace(/</g, '<').replace(/>/g, '>').replace(/\//g, '/').replace(/\`/g, '`'); | ||
} | ||
validator.stripLow = function (str, keep_new_lines) { | ||
function blacklist(str, chars) { | ||
assertString(str); | ||
return str.replace(new RegExp('[' + chars + ']+', 'g'), ''); | ||
} | ||
function stripLow(str, keep_new_lines) { | ||
assertString(str); | ||
var chars = keep_new_lines ? '\\x00-\\x09\\x0B\\x0C\\x0E-\\x1F\\x7F' : '\\x00-\\x1F\\x7F'; | ||
return validator.blacklist(str, chars); | ||
}; | ||
return blacklist(str, chars); | ||
} | ||
validator.whitelist = function (str, chars) { | ||
function whitelist(str, chars) { | ||
assertString(str); | ||
return str.replace(new RegExp('[^' + chars + ']+', 'g'), ''); | ||
}; | ||
} | ||
validator.blacklist = function (str, chars) { | ||
return str.replace(new RegExp('[' + chars + ']+', 'g'), ''); | ||
}; | ||
function isWhitelisted(str, chars) { | ||
assertString(str); | ||
for (var i = str.length - 1; i >= 0; i--) { | ||
if (chars.indexOf(str[i]) === -1) { | ||
return false; | ||
} | ||
} | ||
return true; | ||
} | ||
var default_normalize_email_options = { | ||
var default_normalize_email_options = { | ||
lowercase: true, | ||
remove_dots: true, | ||
remove_extension: true | ||
}; | ||
}; | ||
validator.normalizeEmail = function (email, options) { | ||
function normalizeEmail(email, options) { | ||
options = merge(options, default_normalize_email_options); | ||
if (!validator.isEmail(email)) { | ||
return false; | ||
if (!isEmail(email)) { | ||
return false; | ||
} | ||
@@ -907,83 +1028,56 @@ var parts = email.split('@', 2); | ||
if (parts[1] === 'gmail.com' || parts[1] === 'googlemail.com') { | ||
if (options.remove_extension) { | ||
parts[0] = parts[0].split('+')[0]; | ||
} | ||
if (options.remove_dots) { | ||
parts[0] = parts[0].replace(/\./g, ''); | ||
} | ||
if (!parts[0].length) { | ||
return false; | ||
} | ||
parts[0] = parts[0].toLowerCase(); | ||
parts[1] = 'gmail.com'; | ||
if (options.remove_extension) { | ||
parts[0] = parts[0].split('+')[0]; | ||
} | ||
if (options.remove_dots) { | ||
parts[0] = parts[0].replace(/\./g, ''); | ||
} | ||
if (!parts[0].length) { | ||
return false; | ||
} | ||
parts[0] = parts[0].toLowerCase(); | ||
parts[1] = 'gmail.com'; | ||
} else if (options.lowercase) { | ||
parts[0] = parts[0].toLowerCase(); | ||
parts[0] = parts[0].toLowerCase(); | ||
} | ||
return parts.join('@'); | ||
}; | ||
} | ||
function merge(obj, defaults) { | ||
obj = obj || {}; | ||
for (var key in defaults) { | ||
if (typeof obj[key] === 'undefined') { | ||
obj[key] = defaults[key]; | ||
} | ||
} | ||
return obj; | ||
} | ||
var version = '5.0.0'; | ||
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 + | ||
'$' | ||
); | ||
} | ||
var validator = { | ||
version: version, | ||
toDate: toDate, | ||
toFloat: toFloat, toInt: toInt, | ||
toBoolean: toBoolean, | ||
equals: equals, contains: contains, matches: matches, | ||
isEmail: isEmail, isURL: isURL, isMACAddress: isMACAddress, isIP: isIP, isFQDN: isFDQN, | ||
isBoolean: isBoolean, | ||
isAlpha: isAlpha, isAlphanumeric: isAlphanumeric, isNumeric: isNumeric, isLowercase: isLowercase, isUppercase: isUppercase, | ||
isAscii: isAscii, isFullWidth: isFullWidth, isHalfWidth: isHalfWidth, isVariableWidth: isVariableWidth, | ||
isMultibyte: isMultibyte, isSurrogatePair: isSurrogatePair, | ||
isInt: isInt, isFloat: isFloat, isDecimal: isDecimal, isHexadecimal: isHexadecimal, isDivisibleBy: isDivisibleBy, | ||
isHexColor: isHexColor, | ||
isJSON: isJSON, | ||
isNull: isNull, | ||
isLength: isLength, isByteLength: isByteLength, | ||
isUUID: isUUID, isMongoId: isMongoId, | ||
isDate: isDate, isAfter: isAfter, isBefore: isBefore, | ||
isIn: isIn, | ||
isCreditCard: isCreditCard, | ||
isISIN: isISIN, isISBN: isISBN, | ||
isMobilePhone: isMobilePhone, | ||
isCurrency: isCurrency, | ||
isISO8601: isISO8601, | ||
isBase64: isBase64, | ||
ltrim: ltrim, rtrim: rtrim, trim: trim, | ||
escape: escape, stripLow: stripLow, | ||
whitelist: whitelist, blacklist: blacklist, | ||
isWhitelisted: isWhitelisted, | ||
normalizeEmail: normalizeEmail, | ||
toString: toString | ||
}; | ||
validator.init(); | ||
return validator; | ||
return validator; | ||
}); | ||
})); |
/*! | ||
* Copyright (c) 2015 Chris O'Hara <cohara87@gmail.com> | ||
* | ||
* Copyright (c) 2016 Chris O'Hara <cohara87@gmail.com> | ||
* | ||
* Permission is hereby granted, free of charge, to any person obtaining | ||
@@ -11,6 +11,6 @@ * a copy of this software and associated documentation files (the | ||
* the following conditions: | ||
* | ||
* | ||
* The above copyright notice and this permission notice shall be | ||
* included in all copies or substantial portions of the Software. | ||
* | ||
* | ||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||
@@ -24,2 +24,2 @@ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
*/ | ||
!function(e,t){"undefined"!=typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&"object"==typeof define.amd?define(t):"function"==typeof define&&"object"==typeof define.petal?define(e,[],t):this[e]=t()}("validator",function(e){"use strict";function t(e){var t,r,n,i,o=e.match(B);if(o){if(t=o[21],!t)return o[12]?null:0;if("z"===t||"Z"===t)return 0;r=o[22],-1!==t.indexOf(":")?(n=parseInt(o[23]),i=parseInt(o[24])):(n=0,i=parseInt(o[23]))}else{if(e=e.toLowerCase(),t=e.match(/(?:\s|gmt\s*)(-|\+)(\d{1,4})(\s|$)/),!t)return-1!==e.indexOf("gmt")?0:null;r=t[1];var a=t[2];3===a.length&&(a="0"+a),a.length<=2?(n=0,i=parseInt(a)):(n=parseInt(a.slice(0,2)),i=parseInt(a.slice(2,4)))}return(60*n+i)*("-"===r?1:-1)}function r(e,t){e=e||{};for(var r in t)"undefined"==typeof e[r]&&(e[r]=t[r]);return e}function n(e){var t="(\\"+e.symbol.replace(/\./g,"\\.")+")"+(e.require_symbol?"":"?"),r="-?",n="[1-9]\\d*",i="[1-9]\\d{0,2}(\\"+e.thousands_separator+"\\d{3})*",o=["0",n,i],a="("+o.join("|")+")?",s="(\\"+e.decimal_separator+"\\d{2})?",u=a+s;return e.allow_negatives&&!e.parens_for_negatives&&(e.negative_sign_after_digits?u+=r:e.negative_sign_before_digits&&(u=r+u)),e.allow_negative_sign_placeholder?u="( (?!\\-))?"+u:e.allow_space_after_symbol?u=" ?"+u:e.allow_space_after_digits&&(u+="( (?!$))?"),e.symbol_after_digits?u+=t:u=t+u,e.allow_negatives&&(e.parens_for_negatives?u="(\\("+u+"\\)|"+u+")":e.negative_sign_before_digits||e.negative_sign_after_digits||(u=r+u)),new RegExp("^(?!-? )(?=.*\\d)"+u+"$")}e={version:"4.9.0",coerce:!0};for(var i,o=/^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~]+$/i,a=/^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f]))*$/i,s=/^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+$/i,u=/^([\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,l=/^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~\.\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~\.\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF\s]*<(.+)>$/i,f=/^(?: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})$/,c=/^[A-Z]{2}[0-9A-Z]{9}[0-9]$/,d=/^(?:[0-9]{9}X|[0-9]{10})$/,p=/^(?:[0-9]{13})$/,g=/^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$/,F=/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/,_=/^[0-9A-F]{1,4}$/i,x={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},h={"en-US":/^[A-Z]+$/i,"de-DE":/^[A-ZÄÖÜß]+$/i,"es-ES":/^[A-ZÁÉÍÑÓÚÜ]+$/i,"fr-FR":/^[A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i,"nl-NL":/^[A-ZÉËÏÓÖÜ]+$/i,"pt-PT":/^[A-ZÃÁÀÂÇÉÊÍÕÓÔÚÜ]+$/i,"ru-RU":/^[А-ЯЁа-яё]+$/i},v={"en-US":/^[0-9A-Z]+$/i,"de-DE":/^[0-9A-ZÄÖÜß]+$/i,"es-ES":/^[0-9A-ZÁÉÍÑÓÚÜ]+$/i,"fr-FR":/^[0-9A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i,"nl-NL":/^[0-9A-ZÉËÏÓÖÜ]+$/i,"pt-PT":/^[0-9A-ZÃÁÀÂÇÉÊÍÕÓÔÚÜ]+$/i,"ru-RU":/^[0-9А-ЯЁа-яё]+$/i},m=["AU","GB","HK","IN","NZ","ZA","ZM"],$=0;$<m.length;$++)i="en-"+m[$],h[i]=h["en-US"],v[i]=v["en-US"];var A=/^[-+]?[0-9]+$/,w=/^(?:[-+]?(?:0|[1-9][0-9]*))$/,y=/^(?:[-+]?(?:[0-9]+))?(?:\.[0-9]*)?(?:[eE][\+\-]?(?:[0-9]+))?$/,b=/^[0-9A-F]+$/i,D=/^[-+]?([0-9]+|\.[0-9]+|[0-9]+\.[0-9]+)$/,S=/^#?([0-9A-F]{3}|[0-9A-F]{6})$/i,E=/^[\x00-\x7F]+$/,I=/[^\x00-\x7F]/,O=/[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/,Z=/[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/,N=/[\uD800-\uDBFF][\uDC00-\uDFFF]/,j=/^(?:[A-Z0-9+\/]{4})*(?:[A-Z0-9+\/]{2}==|[A-Z0-9+\/]{3}=|[A-Z0-9+\/]{4})$/i,C={"en-US":/^(\+?1)?[2-9]\d{2}[2-9](?!11)\d{6}$/,"de-DE":/^(\+?49[ \.\-])?([\(]{1}[0-9]{1,6}[\)])?([0-9 \.\-\/]{3,20})((x|ext|extension)[ ]?[0-9]{1,4})?$/,"el-GR":/^(\+?30)?(69\d{8})$/,"en-AU":/^(\+?61|0)4\d{8}$/,"en-GB":/^(\+?44|0)7\d{9}$/,"en-HK":/^(\+?852\-?)?[569]\d{3}\-?\d{4}$/,"en-IN":/^(\+?91|0)?[789]\d{9}$/,"en-NZ":/^(\+?64|0)2\d{7,9}$/,"en-ZA":/^(\+?27|0)\d{9}$/,"en-ZM":/^(\+?26)?09[567]\d{7}$/,"es-ES":/^(\+?34)?(6\d{1}|7[1234])\d{7}$/,"fi-FI":/^(\+?358|0)\s?(4(0|1|2|4|5)?|50)\s?(\d\s?){4,8}\d$/,"fr-FR":/^(\+?33|0)[67]\d{8}$/,"nb-NO":/^(\+?47)?[49]\d{7}$/,"nn-NO":/^(\+?47)?[49]\d{7}$/,"pt-BR":/^(\+?55|0)\-?[1-9]{2}\-?[2-9]{1}\d{3,4}\-?\d{4}$/,"pt-PT":/^(\+?351)?9[1236]\d{7}$/,"ru-RU":/^(\+?7|8)?9\d{9}$/,"vi-VN":/^(\+?84|0)?((1(2([0-9])|6([2-9])|88|99))|(9((?!5)[0-9])))([0-9]{7})$/,"zh-CN":/^(\+?0?86\-?)?((13\d|14[57]|15[^4,\D]|17[678]|18\d)\d{8}|170[059]\d{7})$/,"zh-TW":/^(\+?886\-?|0)?9\d{8}$/},B=/^([\+-]?\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)?)?)?)?$/;e.extend=function(t,r){e[t]=function(){var t=Array.prototype.slice.call(arguments);return t[0]=e.toString(t[0]),r.apply(e,t)}},e.init=function(){for(var t in e)"function"==typeof e[t]&&"toString"!==t&&"toDate"!==t&&"extend"!==t&&"init"!==t&&"isServerSide"!==t&&e.extend(t,e[t])},e.isServerSide=function(){return"object"==typeof module&&module&&"object"==typeof module.exports&&"object"==typeof process&&"function"==typeof require};var R=null;e.deprecation=function(t){if(null===R){if(!e.isServerSide())return;R=require("depd")("validator")}R(t)},e.toString=function(t){if("string"!=typeof t){if(!e.coerce)throw new Error("this library validates strings only");e.deprecation("you tried to validate a "+typeof t+" but this library (validator.js) validates strings only. Please update your code as this will be an error soon.")}return"object"==typeof t&&null!==t?t="function"==typeof t.toString?t.toString():"[object Object]":(null===t||"undefined"==typeof t||isNaN(t)&&!t.length)&&(t=""),""+t},e.toDate=function(e){return"[object Date]"===Object.prototype.toString.call(e)?e:(e=Date.parse(e),isNaN(e)?null:new Date(e))},e.toFloat=function(e){return parseFloat(e)},e.toInt=function(e,t){return parseInt(e,t||10)},e.toBoolean=function(e,t){return t?"1"===e||"true"===e:"0"!==e&&"false"!==e&&""!==e},e.equals=function(t,r){return t===e.toString(r)},e.contains=function(t,r){return t.indexOf(e.toString(r))>=0},e.matches=function(e,t,r){return"[object RegExp]"!==Object.prototype.toString.call(t)&&(t=new RegExp(t,r)),t.test(e)};var U={allow_display_name:!1,allow_utf8_local_part:!0,require_tld:!0};e.isEmail=function(t,n){if(n=r(n,U),n.allow_display_name){var i=t.match(l);i&&(t=i[1])}var f=t.split("@"),c=f.pop(),d=f.join("@"),p=c.toLowerCase();if(("gmail.com"===p||"googlemail.com"===p)&&(d=d.replace(/\./g,"").toLowerCase()),!e.isByteLength(d,{max:64})||!e.isByteLength(c,{max:256}))return!1;if(!e.isFQDN(c,{require_tld:n.require_tld}))return!1;if('"'===d[0])return d=d.slice(1,d.length-1),n.allow_utf8_local_part?u.test(d):a.test(d);for(var g=n.allow_utf8_local_part?s:o,F=d.split("."),_=0;_<F.length;_++)if(!g.test(F[_]))return!1;return!0};var q={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};e.isURL=function(t,n){if(!t||t.length>=2083||/\s/.test(t))return!1;if(0===t.indexOf("mailto:"))return!1;n=r(n,q);var i,o,a,s,u,l,f;if(f=t.split("://"),f.length>1){if(i=f.shift(),n.require_valid_protocol&&-1===n.protocols.indexOf(i))return!1}else{if(n.require_protocol)return!1;n.allow_protocol_relative_urls&&"//"===t.substr(0,2)&&(f[0]=t.substr(2))}return t=f.join("://"),f=t.split("#"),t=f.shift(),f=t.split("?"),t=f.shift(),f=t.split("/"),t=f.shift(),f=t.split("@"),f.length>1&&(o=f.shift(),o.indexOf(":")>=0&&o.split(":").length>2)?!1:(s=f.join("@"),f=s.split(":"),a=f.shift(),f.length&&(l=f.join(":"),u=parseInt(l,10),!/^[0-9]+$/.test(l)||0>=u||u>65535)?!1:e.isIP(a)||e.isFQDN(a,n)||"localhost"===a?n.host_whitelist&&-1===n.host_whitelist.indexOf(a)?!1:n.host_blacklist&&-1!==n.host_blacklist.indexOf(a)?!1:!0:!1)},e.isMACAddress=function(e){return g.test(e)},e.isIP=function(t,r){if(r=r?r+"":"",!r)return e.isIP(t,4)||e.isIP(t,6);if("4"===r){if(!F.test(t))return!1;var n=t.split(".").sort(function(e,t){return e-t});return n[3]<=255}if("6"===r){var i=t.split(":"),o=!1,a=e.isIP(i[i.length-1],4),s=a?7:8;if(i.length>s)return!1;if("::"===t)return!0;"::"===t.substr(0,2)?(i.shift(),i.shift(),o=!0):"::"===t.substr(t.length-2)&&(i.pop(),i.pop(),o=!0);for(var u=0;u<i.length;++u)if(""===i[u]&&u>0&&u<i.length-1){if(o)return!1;o=!0}else if(a&&u==i.length-1);else if(!_.test(i[u]))return!1;return o?i.length>=1:i.length===s}return!1};var L={require_tld:!0,allow_underscores:!1,allow_trailing_dot:!1};e.isFQDN=function(e,t){t=r(t,L),t.allow_trailing_dot&&"."===e[e.length-1]&&(e=e.substring(0,e.length-1));var n=e.split(".");if(t.require_tld){var i=n.pop();if(!n.length||!/^([a-z\u00a1-\uffff]{2,}|xn[a-z0-9-]{2,})$/i.test(i))return!1}for(var o,a=0;a<n.length;a++){if(o=n[a],t.allow_underscores){if(o.indexOf("__")>=0)return!1;o=o.replace(/_/g,"")}if(!/^[a-z\u00a1-\uffff0-9-]+$/i.test(o))return!1;if(/[\uff01-\uff5e]/.test(o))return!1;if("-"===o[0]||"-"===o[o.length-1])return!1}return!0},e.isBoolean=function(e){return["true","false","1","0"].indexOf(e)>=0},e.isAlpha=function(e,t){if(t=t||"en-US",t in h)return h[t].test(e);throw new Error("Invalid locale '"+t+"'")},e.isAlphanumeric=function(e,t){if(t=t||"en-US",t in v)return v[t].test(e);throw new Error("Invalid locale '"+t+"'")},e.isNumeric=function(e){return A.test(e)},e.isDecimal=function(e){return""!==e&&D.test(e)},e.isHexadecimal=function(e){return b.test(e)},e.isHexColor=function(e){return S.test(e)},e.isLowercase=function(e){return e===e.toLowerCase()},e.isUppercase=function(e){return e===e.toUpperCase()},e.isInt=function(e,t){return t=t||{},w.test(e)&&(!t.hasOwnProperty("min")||e>=t.min)&&(!t.hasOwnProperty("max")||e<=t.max)},e.isFloat=function(e,t){return t=t||{},""===e||"."===e?!1:y.test(e)&&(!t.hasOwnProperty("min")||e>=t.min)&&(!t.hasOwnProperty("max")||e<=t.max)},e.isDivisibleBy=function(t,r){return e.toFloat(t)%parseInt(r,10)===0},e.isNull=function(e){return 0===e.length},e.isLength=function(e,t){var r,n;"object"==typeof t?(r=t.min||0,n=t.max):(r=arguments[1],n=arguments[2]);var i=e.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g)||[],o=e.length-i.length;return o>=r&&("undefined"==typeof n||n>=o)},e.isByteLength=function(e,t){var r,n;"object"==typeof t?(r=t.min||0,n=t.max):(r=arguments[1],n=arguments[2]);var i=encodeURI(e).split(/%..|./).length-1;return i>=r&&("undefined"==typeof n||n>=i)},e.isUUID=function(e,t){var r=x[t?t:"all"];return r&&r.test(e)},e.isDate=function(e){var r=new Date(Date.parse(e));if(isNaN(r))return!1;var n=t(e);if(null!==n){var i=r.getTimezoneOffset()-n;r=new Date(r.getTime()+6e4*i)}var o,a,s,u=String(r.getDate());return(a=e.match(/(^|[^:\d])[23]\d([^:\d]|$)/g))?(o=a.map(function(e){return e.match(/\d+/g)[0]}).join("/"),s=String(r.getFullYear()).slice(-2),o===u||o===s?!0:o===u+"/"+s||o===s+"/"+u?!0:!1):!0},e.isAfter=function(t,r){var n=e.toDate(r||new Date),i=e.toDate(t);return!!(i&&n&&i>n)},e.isBefore=function(t,r){var n=e.toDate(r||new Date),i=e.toDate(t);return!!(i&&n&&n>i)},e.isIn=function(t,r){var n;if("[object Array]"===Object.prototype.toString.call(r)){var i=[];for(n in r)i[n]=e.toString(r[n]);return i.indexOf(t)>=0}return"object"==typeof r?r.hasOwnProperty(t):r&&"function"==typeof r.indexOf?r.indexOf(t)>=0:!1},e.isWhitelisted=function(e,t){for(var r=e.length-1;r>=0;r--)if(-1===t.indexOf(e[r]))return!1;return!0},e.isCreditCard=function(e){var t=e.replace(/[^0-9]+/g,"");if(!f.test(t))return!1;for(var r,n,i,o=0,a=t.length-1;a>=0;a--)r=t.substring(a,a+1),n=parseInt(r,10),i?(n*=2,o+=n>=10?n%10+1:n):o+=n,i=!i;return!!(o%10===0?t:!1)},e.isISIN=function(e){if(!c.test(e))return!1;for(var t,r,n=e.replace(/[A-Z]/g,function(e){return parseInt(e,36)}),i=0,o=!0,a=n.length-2;a>=0;a--)t=n.substring(a,a+1),r=parseInt(t,10),o?(r*=2,i+=r>=10?r+1:r):i+=r,o=!o;return parseInt(e.substr(e.length-1),10)===(1e4-i)%10},e.isISBN=function(t,r){if(r=r?r+"":"",!r)return e.isISBN(t,10)||e.isISBN(t,13);var n,i=t.replace(/[\s-]+/g,""),o=0;if("10"===r){if(!d.test(i))return!1;for(n=0;9>n;n++)o+=(n+1)*i.charAt(n);if(o+="X"===i.charAt(9)?100:10*i.charAt(9),o%11===0)return!!i}else if("13"===r){if(!p.test(i))return!1;var a=[1,3];for(n=0;12>n;n++)o+=a[n%2]*i.charAt(n);if(i.charAt(12)-(10-o%10)%10===0)return!!i}return!1},e.isMobilePhone=function(e,t){return t in C?C[t].test(e):!1};var P={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};e.isCurrency=function(e,t){return t=r(t,P),n(t).test(e)},e.isJSON=function(e){try{var t=JSON.parse(e);return!!t&&"object"==typeof t}catch(r){}return!1},e.isMultibyte=function(e){return I.test(e)},e.isAscii=function(e){return E.test(e)},e.isFullWidth=function(e){return O.test(e)},e.isHalfWidth=function(e){return Z.test(e)},e.isVariableWidth=function(e){return O.test(e)&&Z.test(e)},e.isSurrogatePair=function(e){return N.test(e)},e.isBase64=function(e){return j.test(e)},e.isMongoId=function(t){return e.isHexadecimal(t)&&24===t.length},e.isISO8601=function(e){return B.test(e)},e.ltrim=function(e,t){var r=t?new RegExp("^["+t+"]+","g"):/^\s+/g;return e.replace(r,"")},e.rtrim=function(e,t){var r=t?new RegExp("["+t+"]+$","g"):/\s+$/g;return e.replace(r,"")},e.trim=function(e,t){var r=t?new RegExp("^["+t+"]+|["+t+"]+$","g"):/^\s+|\s+$/g;return e.replace(r,"")},e.escape=function(e){return e.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">").replace(/\//g,"/").replace(/\`/g,"`")},e.stripLow=function(t,r){var n=r?"\\x00-\\x09\\x0B\\x0C\\x0E-\\x1F\\x7F":"\\x00-\\x1F\\x7F";return e.blacklist(t,n)},e.whitelist=function(e,t){return e.replace(new RegExp("[^"+t+"]+","g"),"")},e.blacklist=function(e,t){return e.replace(new RegExp("["+t+"]+","g"),"")};var z={lowercase:!0,remove_dots:!0,remove_extension:!0};return e.normalizeEmail=function(t,n){if(n=r(n,z),!e.isEmail(t))return!1;var i=t.split("@",2);if(i[1]=i[1].toLowerCase(),"gmail.com"===i[1]||"googlemail.com"===i[1]){if(n.remove_extension&&(i[0]=i[0].split("+")[0]),n.remove_dots&&(i[0]=i[0].replace(/\./g,"")),!i[0].length)return!1;i[0]=i[0].toLowerCase(),i[1]="gmail.com"}else n.lowercase&&(i[0]=i[0].toLowerCase());return i.join("@")},e.init(),e}); | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.validator=t()}(this,function(){"use strict";function e(e){if("string"!=typeof e)throw new TypeError("This library (validator.js) validates strings only")}function t(t){return e(t),t=Date.parse(t),isNaN(t)?null:new Date(t)}function r(t){return e(t),parseFloat(t)}function n(t,r){return e(t),parseInt(t,r||10)}function i(t,r){return e(t),r?"1"===t||"true"===t:"0"!==t&&"false"!==t&&""!==t}function o(t,r){return e(t),t===r}function u(e){return"object"===("undefined"==typeof e?"undefined":ae["typeof"](e))&&null!==e?e="function"==typeof e.toString?e.toString():"[object Object]":(null===e||"undefined"==typeof e||isNaN(e)&&!e.length)&&(e=""),String(e)}function a(t,r){return e(t),t.indexOf(u(r))>=0}function s(t,r,n){return e(t),"[object RegExp]"!==Object.prototype.toString.call(r)&&(r=new RegExp(r,n)),r.test(t)}function l(){var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],t=arguments[1];for(var r in t)"undefined"==typeof e[r]&&(e[r]=t[r]);return e}function f(t,r){e(t);var n=void 0,i=void 0;"object"===("undefined"==typeof r?"undefined":ae["typeof"](r))?(n=r.min||0,i=r.max):(n=arguments[1],i=arguments[2]);var o=encodeURI(t).split(/%..|./).length-1;return o>=n&&("undefined"==typeof i||i>=o)}function d(t,r){e(t),r=l(r,le),r.allow_trailing_dot&&"."===t[t.length-1]&&(t=t.substring(0,t.length-1));var n=t.split(".");if(r.require_tld){var i=n.pop();if(!n.length||!/^([a-z\u00a1-\uffff]{2,}|xn[a-z0-9-]{2,})$/i.test(i))return!1}for(var o,u=0;u<n.length;u++){if(o=n[u],r.allow_underscores){if(o.indexOf("__")>=0)return!1;o=o.replace(/_/g,"")}if(!/^[a-z\u00a1-\uffff0-9-]+$/i.test(o))return!1;if(/[\uff01-\uff5e]/.test(o))return!1;if("-"===o[0]||"-"===o[o.length-1])return!1}return!0}function c(t,r){if(e(t),r=l(r,fe),r.allow_display_name){var n=t.match(de);n&&(t=n[1])}var i=t.split("@"),o=i.pop(),u=i.join("@"),a=o.toLowerCase();if(("gmail.com"===a||"googlemail.com"===a)&&(u=u.replace(/\./g,"").toLowerCase()),!f(u,{max:64})||!f(o,{max:256}))return!1;if(!d(o,{require_tld:r.require_tld}))return!1;if('"'===u[0])return u=u.slice(1,u.length-1),r.allow_utf8_local_part?Fe.test(u):ge.test(u);for(var s=r.allow_utf8_local_part?pe:ce,c=u.split("."),g=0;g<c.length;g++)if(!s.test(c[g]))return!1;return!0}function g(t){var r=arguments.length<=1||void 0===arguments[1]?"":arguments[1];if(e(t),r=String(r),!r)return g(t,4)||g(t,6);if("4"===r){if(!ve.test(t))return!1;var n=t.split(".").sort(function(e,t){return e-t});return n[3]<=255}if("6"===r){var i=t.split(":"),o=!1,u=g(i[i.length-1],4),a=u?7:8;if(i.length>a)return!1;if("::"===t)return!0;"::"===t.substr(0,2)?(i.shift(),i.shift(),o=!0):"::"===t.substr(t.length-2)&&(i.pop(),i.pop(),o=!0);for(var s=0;s<i.length;++s)if(""===i[s]&&s>0&&s<i.length-1){if(o)return!1;o=!0}else if(u&&s===i.length-1);else if(!_e.test(i[s]))return!1;return o?i.length>=1:i.length===a}return!1}function p(t,r){if(e(t),!t||t.length>=2083||/\s/.test(t))return!1;if(0===t.indexOf("mailto:"))return!1;r=l(r,me);var n=void 0,i=void 0,o=void 0,u=void 0,a=void 0,s=void 0,f=void 0;if(f=t.split("://"),f.length>1){if(n=f.shift(),r.require_valid_protocol&&-1===r.protocols.indexOf(n))return!1}else{if(r.require_protocol)return!1;r.allow_protocol_relative_urls&&"//"===t.substr(0,2)&&(f[0]=t.substr(2))}return t=f.join("://"),f=t.split("#"),t=f.shift(),f=t.split("?"),t=f.shift(),f=t.split("/"),t=f.shift(),f=t.split("@"),f.length>1&&(i=f.shift(),i.indexOf(":")>=0&&i.split(":").length>2)?!1:(u=f.join("@"),f=u.split(":"),o=f.shift(),f.length&&(s=f.join(":"),a=parseInt(s,10),!/^[0-9]+$/.test(s)||0>=a||a>65535)?!1:g(o)||d(o,r)||"localhost"===o?r.host_whitelist&&-1===r.host_whitelist.indexOf(o)?!1:r.host_blacklist&&-1!==r.host_blacklist.indexOf(o)?!1:!0:!1)}function F(t){return e(t),he.test(t)}function v(t){return e(t),["true","false","1","0"].indexOf(t)>=0}function _(t){var r=arguments.length<=1||void 0===arguments[1]?"en-US":arguments[1];if(e(t),r in xe)return xe[r].test(t);throw new Error("Invalid locale '"+r+"'")}function m(t){var r=arguments.length<=1||void 0===arguments[1]?"en-US":arguments[1];if(e(t),r in $e)return $e[r].test(t);throw new Error("Invalid locale '"+r+"'")}function h(t){return e(t),be.test(t)}function x(t){return e(t),t===t.toLowerCase()}function $(t){return e(t),t===t.toUpperCase()}function A(t){return e(t),De.test(t)}function w(t){return e(t),Ee.test(t)}function y(t){return e(t),Se.test(t)}function b(t){return e(t),Ee.test(t)&&Se.test(t)}function D(t){return e(t),Oe.test(t)}function E(t){return e(t),Ie.test(t)}function S(t,r){return e(t),r=r||{},Ze.test(t)&&(!r.hasOwnProperty("min")||t>=r.min)&&(!r.hasOwnProperty("max")||t<=r.max)}function O(t,r){return e(t),r=r||{},""===t||"."===t?!1:Ce.test(t)&&(!r.hasOwnProperty("min")||t>=r.min)&&(!r.hasOwnProperty("max")||t<=r.max)}function I(t){return e(t),""!==t&&Ne.test(t)}function Z(t){return e(t),je.test(t)}function C(t,n){return e(t),r(t)%parseInt(n,10)===0}function N(t){return e(t),Re.test(t)}function j(t){e(t);try{var r=JSON.parse(t);return!!r&&"object"===("undefined"==typeof r?"undefined":ae["typeof"](r))}catch(n){}return!1}function R(t){return e(t),0===t.length}function U(t,r){e(t);var n=void 0,i=void 0;"object"===("undefined"==typeof r?"undefined":ae["typeof"](r))?(n=r.min||0,i=r.max):(n=arguments[1],i=arguments[2]);var o=t.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g)||[],u=t.length-o.length;return u>=n&&("undefined"==typeof i||i>=u)}function B(t){var r=arguments.length<=1||void 0===arguments[1]?"all":arguments[1];e(t);var n=Ue[r];return n&&n.test(t)}function L(t){return e(t),Z(t)&&24===t.length}function z(t){return e(t),Be.test(t)}function q(e){var t=e.match(Be),r=void 0,n=void 0,i=void 0,o=void 0;if(t){if(r=t[21],!r)return t[12]?null:0;if("z"===r||"Z"===r)return 0;n=t[22],-1!==r.indexOf(":")?(i=parseInt(t[23],10),o=parseInt(t[24],10)):(i=0,o=parseInt(t[23],10))}else{if(e=e.toLowerCase(),r=e.match(/(?:\s|gmt\s*)(-|\+)(\d{1,4})(\s|$)/),!r)return-1!==e.indexOf("gmt")?0:null;n=r[1];var u=r[2];3===u.length&&(u="0"+u),u.length<=2?(i=0,o=parseInt(u,10)):(i=parseInt(u.slice(0,2),10),o=parseInt(u.slice(2,4),10))}return(60*i+o)*("-"===n?1:-1)}function P(t){e(t);var r=new Date(Date.parse(t));if(isNaN(r))return!1;var n=q(t);if(null!==n){var i=r.getTimezoneOffset()-n;r=new Date(r.getTime()+6e4*i)}var o=String(r.getDate()),u=void 0,a=void 0,s=void 0;return(a=t.match(/(^|[^:\d])[23]\d([^:\d]|$)/g))?(u=a.map(function(e){return e.match(/\d+/g)[0]}).join("/"),s=String(r.getFullYear()).slice(-2),u===o||u===s?!0:u===""+o/s||u===""+s/o?!0:!1):!0}function T(r){var n=arguments.length<=1||void 0===arguments[1]?String(new Date):arguments[1];e(r);var i=t(n),o=t(r);return!!(o&&i&&o>i)}function M(r){var n=arguments.length<=1||void 0===arguments[1]?String(new Date):arguments[1];e(r);var i=t(n),o=t(r);return!!(o&&i&&i>o)}function W(t,r){e(t);var n=void 0;if("[object Array]"===Object.prototype.toString.call(r)){var i=[];for(n in r)({}).hasOwnProperty.call(r,n)&&(i[n]=u(r[n]));return i.indexOf(t)>=0}return"object"===("undefined"==typeof r?"undefined":ae["typeof"](r))?r.hasOwnProperty(t):r&&"function"==typeof r.indexOf?r.indexOf(t)>=0:!1}function H(t){e(t);var r=t.replace(/[^0-9]+/g,"");if(!Le.test(r))return!1;for(var n=0,i=void 0,o=void 0,u=void 0,a=r.length-1;a>=0;a--)i=r.substring(a,a+1),o=parseInt(i,10),u?(o*=2,n+=o>=10?o%10+1:o):n+=o,u=!u;return!!(n%10===0?r:!1)}function Y(t){if(e(t),!ze.test(t))return!1;for(var r=t.replace(/[A-Z]/g,function(e){return parseInt(e,36)}),n=0,i=void 0,o=void 0,u=!0,a=r.length-2;a>=0;a--)i=r.substring(a,a+1),o=parseInt(i,10),u?(o*=2,n+=o>=10?o+1:o):n+=o,u=!u;return parseInt(t.substr(t.length-1),10)===(1e4-n)%10}function G(t){var r=arguments.length<=1||void 0===arguments[1]?"":arguments[1];if(e(t),r=String(r),!r)return G(t,10)||G(t,13);var n=t.replace(/[\s-]+/g,""),i=0,o=void 0;if("10"===r){if(!qe.test(n))return!1;for(o=0;9>o;o++)i+=(o+1)*n.charAt(o);if(i+="X"===n.charAt(9)?100:10*n.charAt(9),i%11===0)return!!n}else if("13"===r){if(!Pe.test(n))return!1;for(o=0;12>o;o++)i+=Te[o%2]*n.charAt(o);if(n.charAt(12)-(10-i%10)%10===0)return!!n}return!1}function Q(t,r){return e(t),r in Me?Me[r].test(t):!1}function k(e){var t="(\\"+e.symbol.replace(/\./g,"\\.")+")"+(e.require_symbol?"":"?"),r="-?",n="[1-9]\\d*",i="[1-9]\\d{0,2}(\\"+e.thousands_separator+"\\d{3})*",o=["0",n,i],u="("+o.join("|")+")?",a="(\\"+e.decimal_separator+"\\d{2})?",s=u+a;return e.allow_negatives&&!e.parens_for_negatives&&(e.negative_sign_after_digits?s+=r:e.negative_sign_before_digits&&(s=r+s)),e.allow_negative_sign_placeholder?s="( (?!\\-))?"+s:e.allow_space_after_symbol?s=" ?"+s:e.allow_space_after_digits&&(s+="( (?!$))?"),e.symbol_after_digits?s+=t:s=t+s,e.allow_negatives&&(e.parens_for_negatives?s="(\\("+s+"\\)|"+s+")":e.negative_sign_before_digits||e.negative_sign_after_digits||(s=r+s)),new RegExp("^(?!-? )(?=.*\\d)"+s+"$")}function J(t,r){return e(t),r=l(r,We),k(r).test(t)}function K(t){e(t);var r=t.length;if(!r||r%4!==0||He.test(t))return!1;var n=t.indexOf("=");return-1===n||n===r-1||n===r-2&&"="===t[r-1]}function V(t,r){e(t);var n=r?new RegExp("^["+r+"]+","g"):/^\s+/g;return t.replace(n,"")}function X(t,r){e(t);var n=r?new RegExp("["+r+"]+$","g"):/\s+$/g;return t.replace(n,"")}function ee(t,r){e(t);var n=r?new RegExp("^["+r+"]+|["+r+"]+$","g"):/^\s+|\s+$/g;return t.replace(n,"")}function te(t){return e(t),t.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">").replace(/\//g,"/").replace(/\`/g,"`")}function re(t,r){return e(t),t.replace(new RegExp("["+r+"]+","g"),"")}function ne(t,r){e(t);var n=r?"\\x00-\\x09\\x0B\\x0C\\x0E-\\x1F\\x7F":"\\x00-\\x1F\\x7F";return re(t,n)}function ie(t,r){return e(t),t.replace(new RegExp("[^"+r+"]+","g"),"")}function oe(t,r){e(t);for(var n=t.length-1;n>=0;n--)if(-1===r.indexOf(t[n]))return!1;return!0}function ue(e,t){if(t=l(t,Ye),!c(e))return!1;var r=e.split("@",2);if(r[1]=r[1].toLowerCase(),"gmail.com"===r[1]||"googlemail.com"===r[1]){if(t.remove_extension&&(r[0]=r[0].split("+")[0]),t.remove_dots&&(r[0]=r[0].replace(/\./g,"")),!r[0].length)return!1;r[0]=r[0].toLowerCase(),r[1]="gmail.com"}else t.lowercase&&(r[0]=r[0].toLowerCase());return r.join("@")}var ae={};ae["typeof"]="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e};for(var se,le={require_tld:!0,allow_underscores:!1,allow_trailing_dot:!1},fe={allow_display_name:!1,allow_utf8_local_part:!0,require_tld:!0},de=/^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~\.\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~\.\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF\s]*<(.+)>$/i,ce=/^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~]+$/i,ge=/^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f]))*$/i,pe=/^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+$/i,Fe=/^([\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,ve=/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/,_e=/^[0-9A-F]{1,4}$/i,me={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},he=/^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$/,xe={"en-US":/^[A-Z]+$/i,"de-DE":/^[A-ZÄÖÜß]+$/i,"es-ES":/^[A-ZÁÉÍÑÓÚÜ]+$/i,"fr-FR":/^[A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i,"nl-NL":/^[A-ZÉËÏÓÖÜ]+$/i,"pt-PT":/^[A-ZÃÁÀÂÇÉÊÍÕÓÔÚÜ]+$/i,"ru-RU":/^[А-ЯЁа-яё]+$/i,ar:/^[ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]+$/},$e={"en-US":/^[0-9A-Z]+$/i,"de-DE":/^[0-9A-ZÄÖÜß]+$/i,"es-ES":/^[0-9A-ZÁÉÍÑÓÚÜ]+$/i,"fr-FR":/^[0-9A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i,"nl-NL":/^[0-9A-ZÉËÏÓÖÜ]+$/i,"pt-PT":/^[0-9A-ZÃÁÀÂÇÉÊÍÕÓÔÚÜ]+$/i,"ru-RU":/^[0-9А-ЯЁа-яё]+$/i,ar:/^[٠١٢٣٤٥٦٧٨٩0-9ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]+$/},Ae=["AU","GB","HK","IN","NZ","ZA","ZM"],we=0;we<Ae.length;we++)se="en-"+Ae[we],xe[se]=xe["en-US"],$e[se]=$e["en-US"];for(var se,ye=["AE","BH","DZ","EG","IQ","JO","KW","LB","LY","MA","QM","QA","SA","SD","SY","TN","YE"],we=0;we<ye.length;we++)se="ar-"+ye[we],xe[se]=xe.ar,$e[se]=$e.ar;var be=/^[-+]?[0-9]+$/,De=/^[\x00-\x7F]+$/,Ee=/[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/,Se=/[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/,Oe=/[^\x00-\x7F]/,Ie=/[\uD800-\uDBFF][\uDC00-\uDFFF]/,Ze=/^(?:[-+]?(?:0|[1-9][0-9]*))$/,Ce=/^(?:[-+]?(?:[0-9]+))?(?:\.[0-9]*)?(?:[eE][\+\-]?(?:[0-9]+))?$/,Ne=/^[-+]?([0-9]+|\.[0-9]+|[0-9]+\.[0-9]+)$/,je=/^[0-9A-F]+$/i,Re=/^#?([0-9A-F]{3}|[0-9A-F]{6})$/i,Ue={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},Be=/^([\+-]?\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)?)?)?)?$/,Le=/^(?: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})$/,ze=/^[A-Z]{2}[0-9A-Z]{9}[0-9]$/,qe=/^(?:[0-9]{9}X|[0-9]{10})$/,Pe=/^(?:[0-9]{13})$/,Te=[1,3],Me={"ar-SY":/^(!?(\+?963)|0)?9\d{8}$/,"en-US":/^(\+?1)?[2-9]\d{2}[2-9](?!11)\d{6}$/,"de-DE":/^(\+?49[ \.\-])?([\(]{1}[0-9]{1,6}[\)])?([0-9 \.\-\/]{3,20})((x|ext|extension)[ ]?[0-9]{1,4})?$/,"el-GR":/^(\+?30)?(69\d{8})$/,"en-AU":/^(\+?61|0)4\d{8}$/,"en-GB":/^(\+?44|0)7\d{9}$/,"en-HK":/^(\+?852\-?)?[569]\d{3}\-?\d{4}$/,"en-IN":/^(\+?91|0)?[789]\d{9}$/,"en-NZ":/^(\+?64|0)2\d{7,9}$/,"en-ZA":/^(\+?27|0)\d{9}$/,"en-ZM":/^(\+?26)?09[567]\d{7}$/,"es-ES":/^(\+?34)?(6\d{1}|7[1234])\d{7}$/,"fi-FI":/^(\+?358|0)\s?(4(0|1|2|4|5)?|50)\s?(\d\s?){4,8}\d$/,"fr-FR":/^(\+?33|0)[67]\d{8}$/,"nb-NO":/^(\+?47)?[49]\d{7}$/,"nn-NO":/^(\+?47)?[49]\d{7}$/,"pt-BR":/^(\+?55|0)\-?[1-9]{2}\-?[2-9]{1}\d{3,4}\-?\d{4}$/,"pt-PT":/^(\+?351)?9[1236]\d{7}$/,"ru-RU":/^(\+?7|8)?9\d{9}$/,"vi-VN":/^(\+?84|0)?((1(2([0-9])|6([2-9])|88|99))|(9((?!5)[0-9])))([0-9]{7})$/,"zh-CN":/^(\+?0?86\-?)?((13\d|14[57]|15[^4,\D]|17[678]|18\d)\d{8}|170[059]\d{7})$/,"zh-TW":/^(\+?886\-?|0)?9\d{8}$/},We={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},He=/[^A-Z0-9+\/=]/i,Ye={lowercase:!0,remove_dots:!0,remove_extension:!0},Ge="5.0.0",Qe={version:Ge,toDate:t,toFloat:r,toInt:n,toBoolean:i,equals:o,contains:a,matches:s,isEmail:c,isURL:p,isMACAddress:F,isIP:g,isFQDN:d,isBoolean:v,isAlpha:_,isAlphanumeric:m,isNumeric:h,isLowercase:x,isUppercase:$,isAscii:A,isFullWidth:w,isHalfWidth:y,isVariableWidth:b,isMultibyte:D,isSurrogatePair:E,isInt:S,isFloat:O,isDecimal:I,isHexadecimal:Z,isDivisibleBy:C,isHexColor:N,isJSON:j,isNull:R,isLength:U,isByteLength:f,isUUID:B,isMongoId:L,isDate:P,isAfter:T,isBefore:M,isIn:W,isCreditCard:H,isISIN:Y,isISBN:G,isMobilePhone:Q,isCurrency:J,isISO8601:z,isBase64:K,ltrim:V,rtrim:X,trim:ee,escape:te,stripLow:ne,whitelist:ie,blacklist:re,isWhitelisted:oe,normalizeEmail:ue,toString:u};return Qe}); |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Debug access
Supply chain riskUses debug, reflection and dynamic code execution features.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
0
67
0
0
136369
12
2500
1
- Removeddepd@1.1.0
- Removeddepd@1.1.0(transitive)