Initial commit
This commit is contained in:
commit
ec49fedc45
1288 files changed
+226749
No files matched your search
+3
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"laxcomma": true
|
||||
}
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
.DS_Store
|
||||
node_modules
|
||||
coverage
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
sudo: false
|
||||
language: node_js
|
||||
node_js:
|
||||
- "0.10"
|
||||
- "0.12"
|
||||
after_script:
|
||||
- npm run coveralls
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
Copyright (c) 2015 Chris O'Hara <cohara87@gmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
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,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
NPM=./node_modules/.bin
|
||||
|
||||
test: dependencies
|
||||
@node $(NPM)/_mocha \
|
||||
--reporter $(if $(or $(TEST),$(V)),spec,dot) \
|
||||
--slow 600 --timeout 2000 \
|
||||
--grep '$(TEST)'
|
||||
|
||||
lint: dependencies
|
||||
@$(NPM)/jshint --config .jshintrc \
|
||||
validator.js test/*.js
|
||||
|
||||
dependencies: node_modules
|
||||
|
||||
node_modules:
|
||||
@echo "Installing dependencies.."
|
||||
@npm install
|
||||
|
||||
coverage: dependencies
|
||||
@$(NPM)/istanbul cover $(NPM)/_mocha -- --reporter spec
|
||||
@open coverage/lcov-report/validator.js/validator.js.html
|
||||
|
||||
clean:
|
||||
@rm -rf coverage
|
||||
|
||||
distclean: clean
|
||||
@rm -rf node_modules
|
||||
|
||||
min: validator.min.js
|
||||
|
||||
%.min.js: %.js dependencies
|
||||
@$(NPM)/uglifyjs --compress --mangle --comments '/Copyright/' $< > $@
|
||||
|
||||
check: test
|
||||
deps: dependencies
|
||||
+174
@@ -0,0 +1,174 @@
|
||||
# validator.js
|
||||
|
||||
[![NPM version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Downloads][downloads-image]][npm-url]
|
||||
|
||||
A library of string validators and sanitizers.
|
||||
|
||||
### Server-side usage
|
||||
|
||||
Install the library with `npm install validator`
|
||||
|
||||
```javascript
|
||||
var validator = require('validator');
|
||||
|
||||
validator.isEmail('foo@bar.com'); //=> true
|
||||
```
|
||||
|
||||
### Client-side usage
|
||||
|
||||
The library can be loaded either as a standalone script, or through an [AMD][amd]-compatible loader
|
||||
|
||||
```html
|
||||
<script type="text/javascript" src="validator.min.js"></script>
|
||||
<script type="text/javascript">
|
||||
validator.isEmail('foo@bar.com'); //=> true
|
||||
</script>
|
||||
```
|
||||
|
||||
The library can also be installed through [bower][bower]
|
||||
|
||||
```bash
|
||||
$ bower install validator-js
|
||||
```
|
||||
|
||||
### Validators
|
||||
|
||||
- **equals(str, comparison)** - check if the string matches the comparison.
|
||||
- **contains(str, seed)** - check if the string contains the seed.
|
||||
- **matches(str, pattern [, modifiers])** - check if string matches the pattern. Either `matches('foo', /foo/i)` or `matches('foo', 'foo', 'i')`.
|
||||
- **isEmail(str [, options])** - check if the string is an email. `options` is an object which defaults to `{ allow_display_name: false, allow_utf8_local_part: true }`. If `allow_display_name` is set to true, the validator will also match `Display Name <email-address>`. If `allow_utf8_local_part` is set to false, the validator will not allow any non-English UTF8 character in email address' local part.
|
||||
- **isURL(str [, options])** - check if the string is an URL. `options` is an object which defaults to `{ protocols: ['http','https','ftp'], require_tld: true, require_protocol: false, allow_underscores: false, host_whitelist: false, host_blacklist: false, allow_trailing_dot: false, allow_protocol_relative_urls: false }`.
|
||||
- **isFQDN(str [, options])** - check if the string is a fully qualified domain name (e.g. domain.com). `options` is an object which defaults to `{ require_tld: true, allow_underscores: false, allow_trailing_dot: false }`.
|
||||
- **isIP(str [, version])** - check if the string is an IP (version 4 or 6).
|
||||
- **isAlpha(str)** - check if the string contains only letters (a-zA-Z).
|
||||
- **isNumeric(str)** - check if the string contains only numbers.
|
||||
- **isAlphanumeric(str)** - check if the string contains only letters and numbers.
|
||||
- **isBase64(str)** - check if a string is base64 encoded.
|
||||
- **isHexadecimal(str)** - check if the string is a hexadecimal number.
|
||||
- **isHexColor(str)** - check if the string is a hexadecimal color.
|
||||
- **isLowercase(str)** - check if the string is lowercase.
|
||||
- **isUppercase(str)** - check if the string is uppercase.
|
||||
- **isInt(str)** - check if the string is an integer.
|
||||
- **isFloat(str)** - check if the string is a float.
|
||||
- **isDivisibleBy(str, number)** - check if the string is a number that's divisible by another.
|
||||
- **isNull(str)** - check if the string is null.
|
||||
- **isLength(str, min [, max])** - check if the string's length falls in a range. Note: this function takes into account surrogate pairs.
|
||||
- **isByteLength(str, min [, max])** - check if the string's length (in bytes) falls in a range.
|
||||
- **isUUID(str [, version])** - check if the string is a UUID (version 3, 4 or 5).
|
||||
- **isDate(str)** - check if the string is a date.
|
||||
- **isAfter(str [, date])** - check if the string is a date that's after the specified date (defaults to now).
|
||||
- **isBefore(str [, date])** - check if the string is a date that's before the specified date.
|
||||
- **isIn(str, values)** - check if the string is in a array of allowed values.
|
||||
- **isCreditCard(str)** - check if the string is a credit card.
|
||||
- **isISIN(str)** - check if the string is an [ISIN][ISIN] (stock/security identifier).
|
||||
- **isISBN(str [, version])** - check if the string is an ISBN (version 10 or 13).
|
||||
- **isMobilePhone(str, locale)** - check if the string is a mobile phone number, (locale is one of `['zh-CN', 'en-ZA', 'en-AU', 'en-HK', 'pt-PT', 'fr-FR', 'el-GR', 'en-GB']`).
|
||||
- **isJSON(str)** - check if the string is valid JSON (note: uses JSON.parse).
|
||||
- **isMultibyte(str)** - check if the string contains one or more multibyte chars.
|
||||
- **isAscii(str)** - check if the string contains ASCII chars only.
|
||||
- **isFullWidth(str)** - check if the string contains any full-width chars.
|
||||
- **isHalfWidth(str)** - check if the string contains any half-width chars.
|
||||
- **isVariableWidth(str)** - check if the string contains a mixture of full and half-width chars.
|
||||
- **isSurrogatePair(str)** - check if the string contains any surrogate pairs chars.
|
||||
- **isMongoId(str)** - check if the string is a valid hex-encoded representation of a [MongoDB ObjectId][mongoid].
|
||||
- **isCurrency(str, options)** - check if the string is a valid currency amount. `options` is an object which defaults to `{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 }`.
|
||||
|
||||
### Sanitizers
|
||||
|
||||
- **toString(input)** - convert the input to a string.
|
||||
- **toDate(input)** - convert the input to a date, or `null` if the input is not a date.
|
||||
- **toFloat(input)** - convert the input to a float, or `NaN` if the input is not a float.
|
||||
- **toInt(input [, radix])** - convert the input to an integer, or `NaN` if the input is not an integer.
|
||||
- **toBoolean(input [, strict])** - convert the input to a boolean. Everything except for `'0'`, `'false'` and `''` returns `true`. In strict mode only `'1'` and `'true'` return `true`.
|
||||
- **trim(input [, chars])** - trim characters (whitespace by default) from both sides of the input.
|
||||
- **ltrim(input [, chars])** - trim characters from the left-side of the input.
|
||||
- **rtrim(input [, chars])** - trim characters from the right-side of the input.
|
||||
- **escape(input)** - replace `<`, `>`, `&`, `'`, `"` and `/` with HTML entities.
|
||||
- **stripLow(input [, keep_new_lines])** - remove characters with a numerical value < 32 and 127, mostly control characters. If `keep_new_lines` is `true`, newline characters are preserved (`\n` and `\r`, hex `0xA` and `0xD`). Unicode-safe in JavaScript.
|
||||
- **whitelist(input, chars)** - remove characters that do not appear in the whitelist. The characters are used in a RegExp and so you will need to escape some chars, e.g. whitelist(input, '\\[\\]').
|
||||
- **blacklist(input, chars)** - remove characters that appear in the blacklist. The characters are used in a RegExp and so you will need to escape some chars, e.g. blacklist(input, '\\[\\]').
|
||||
- **normalizeEmail(email [, options])** - canonicalize an email address. `options` is an object which defaults to `{ lowercase: true }`. With `lowercase` set to `true`, the local part of the email address is lowercased for all domains; the hostname is always lowercased and the local part of the email address is always lowercased for hosts that are known to be case-insensitive (currently only GMail). Normalization follows special rules for known providers: currently, GMail addresses have dots removed in the local part and are stripped of tags (e.g. `some.one+tag@gmail.com` becomes `someone@gmail.com`) and all `@googlemail.com` addresses are normalized to `@gmail.com`.
|
||||
|
||||
### XSS Sanitization
|
||||
|
||||
XSS sanitization was removed from the library in [2d5d6999](https://github.com/chriso/validator.js/commit/2d5d6999541add350fb396ef02dc42ca3215049e).
|
||||
|
||||
For an alternative, look at Yahoo's [xss-filters library](https://github.com/yahoo/xss-filters).
|
||||
|
||||
### Strings only
|
||||
|
||||
This library validates and sanitizes **strings** only. All input will be coerced to a string using the following rules
|
||||
|
||||
- Call the `toString` property if available.
|
||||
- Replace `null`, `undefined` or `NaN` with an empty string.
|
||||
- Everything else is coerced with `input + ''`.
|
||||
|
||||
### 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.
|
||||
|
||||
```javascript
|
||||
validator.isWhitespace(' \t\r\n');
|
||||
// => true
|
||||
|
||||
validator.isWhitespace('foo bar');
|
||||
// => false
|
||||
```
|
||||
|
||||
### Tests
|
||||
|
||||
- `make test` - run the test suite.
|
||||
- `make test V=1` - run the test suite with added verbosity.
|
||||
- `make test TEST=pattern` - run tests that match a pattern.
|
||||
- `make coverage` - run a coverage analysis tool.
|
||||
- `make lint` - run a lint tool.
|
||||
|
||||
### License (MIT)
|
||||
|
||||
```
|
||||
Copyright (c) 2015 Chris O'Hara <cohara87@gmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
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,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
```
|
||||
|
||||
[downloads-image]: http://img.shields.io/npm/dm/validator.svg
|
||||
|
||||
[npm-url]: https://npmjs.org/package/validator
|
||||
[npm-image]: http://img.shields.io/npm/v/validator.svg
|
||||
|
||||
[travis-url]: https://travis-ci.org/chriso/validator.js
|
||||
[travis-image]: http://img.shields.io/travis/chriso/validator.js.svg
|
||||
|
||||
[coveralls-url]: https://coveralls.io/r/chriso/validator.js
|
||||
[coveralls-image]: http://img.shields.io/coveralls/chriso/validator.js/master.svg
|
||||
|
||||
[amd]: http://requirejs.org/docs/whyamd.html
|
||||
[bower]: http://bower.io/
|
||||
|
||||
[mongoid]: http://docs.mongodb.org/manual/reference/object-id/
|
||||
[ISIN]: https://en.wikipedia.org/wiki/International_Securities_Identification_Number
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"name": "validator-js",
|
||||
"main": "validator.js",
|
||||
"version": "3.11.2",
|
||||
"homepage": "https://github.com/chriso/validator.js",
|
||||
"authors": [
|
||||
"Chris O'Hara <cohara87+gh@gmail.com>"
|
||||
],
|
||||
"description": "String validation and sanitization",
|
||||
"license": "MIT",
|
||||
"ignore": [
|
||||
"**/.*",
|
||||
"node_modules",
|
||||
"bower_components",
|
||||
"test",
|
||||
"tests"
|
||||
]
|
||||
}
|
||||
+97
@@ -0,0 +1,97 @@
|
||||
{
|
||||
"_args": [
|
||||
[
|
||||
"validator@~3.35.0",
|
||||
"c:\\users\\luis\\source\\repos\\AACharly\\node_modules\\azure-storage"
|
||||
]
|
||||
],
|
||||
"_from": "validator@>=3.35.0-0 <3.36.0-0",
|
||||
"_id": "validator@3.35.0",
|
||||
"_inCache": true,
|
||||
"_location": "/validator",
|
||||
"_nodeVersion": "0.12.0",
|
||||
"_npmUser": {
|
||||
"email": "cohara87@gmail.com",
|
||||
"name": "cohara87"
|
||||
},
|
||||
"_npmVersion": "2.7.1",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"name": "validator",
|
||||
"raw": "validator@~3.35.0",
|
||||
"rawSpec": "~3.35.0",
|
||||
"scope": null,
|
||||
"spec": ">=3.35.0-0 <3.36.0-0",
|
||||
"type": "range"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/azure-storage"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/validator/-/validator-3.35.0.tgz",
|
||||
"_shasum": "3f07249402c1fc8fc093c32c6e43d72a79cca1dc",
|
||||
"_shrinkwrap": null,
|
||||
"_spec": "validator@~3.35.0",
|
||||
"_where": "c:\\users\\luis\\source\\repos\\AACharly\\node_modules\\azure-storage",
|
||||
"author": {
|
||||
"email": "cohara87@gmail.com",
|
||||
"name": "Chris O'Hara"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "http://github.com/chriso/validator.js/issues"
|
||||
},
|
||||
"dependencies": {},
|
||||
"description": "String validation and sanitization",
|
||||
"devDependencies": {
|
||||
"contextify": "latest",
|
||||
"coveralls": "latest",
|
||||
"istanbul": "latest",
|
||||
"jshint": "latest",
|
||||
"mocha": "latest",
|
||||
"uglify-js": "latest"
|
||||
},
|
||||
"directories": {},
|
||||
"dist": {
|
||||
"shasum": "3f07249402c1fc8fc093c32c6e43d72a79cca1dc",
|
||||
"tarball": "https://registry.npmjs.org/validator/-/validator-3.35.0.tgz"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.10"
|
||||
},
|
||||
"gitHead": "b2a3d4c06249520d746968317b339d848e97972f",
|
||||
"homepage": "http://github.com/chriso/validator.js",
|
||||
"installable": true,
|
||||
"keywords": [
|
||||
"assert",
|
||||
"sanitisation",
|
||||
"sanitise",
|
||||
"sanitization",
|
||||
"sanitize",
|
||||
"validate",
|
||||
"validation",
|
||||
"validator"
|
||||
],
|
||||
"licenses": [
|
||||
{
|
||||
"type": "MIT",
|
||||
"url": "http://github.com/chriso/validator.js/raw/master/LICENSE"
|
||||
}
|
||||
],
|
||||
"main": "validator.js",
|
||||
"maintainers": [
|
||||
{
|
||||
"name": "cohara87",
|
||||
"email": "cohara87@gmail.com"
|
||||
}
|
||||
],
|
||||
"name": "validator",
|
||||
"optionalDependencies": {},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "http://github.com/chriso/validator.js.git"
|
||||
},
|
||||
"scripts": {
|
||||
"coveralls": "istanbul cover _mocha --report lcovonly -- -R spec && cat ./coverage/lcov.info | coveralls && rm -rf ./coverage",
|
||||
"test": "node ./node_modules/.bin/_mocha --reporter spec"
|
||||
},
|
||||
"version": "3.35.0"
|
||||
}
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
var assert = require('assert')
|
||||
, validator = require('../validator')
|
||||
, min = require('../validator.min');
|
||||
|
||||
describe('Minified version', function () {
|
||||
|
||||
it('should export the same things as the server-side version', function () {
|
||||
for (var key in validator) {
|
||||
assert.equal(typeof validator[key], typeof min[key], 'Minified version did not export ' + key);
|
||||
}
|
||||
});
|
||||
|
||||
it('should be up to date', function () {
|
||||
assert.equal(min.version, validator.version, 'Minified version mismatch. Run `make min`');
|
||||
});
|
||||
|
||||
it('should validate strings', function () {
|
||||
assert.equal(min.isEmail('foo@bar.com'), true);
|
||||
assert.equal(min.isEmail('foo'), false);
|
||||
});
|
||||
|
||||
it('should sanitize strings', function () {
|
||||
assert.equal(min.toBoolean('1'), true);
|
||||
});
|
||||
|
||||
});
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
var assert = require('assert')
|
||||
, validator = require('../validator');
|
||||
|
||||
describe('Exports', function () {
|
||||
|
||||
it('should export validators', function () {
|
||||
assert.equal(typeof validator.isEmail, 'function');
|
||||
assert.equal(typeof validator.isAlpha, 'function');
|
||||
});
|
||||
|
||||
it('should export sanitizers', function () {
|
||||
assert.equal(typeof validator.toBoolean, 'function');
|
||||
assert.equal(typeof validator.toFloat, 'function');
|
||||
});
|
||||
|
||||
it('should export the version number', function () {
|
||||
assert.equal(validator.version, require('../package.json').version,
|
||||
'Version number mismatch in "package.json" vs. "validator.js"');
|
||||
});
|
||||
|
||||
});
|
||||
+223
@@ -0,0 +1,223 @@
|
||||
var validator = require('../validator')
|
||||
, format = require('util').format;
|
||||
|
||||
function test(options) {
|
||||
var args = options.args || [];
|
||||
args.unshift(null);
|
||||
Object.keys(options.expect).forEach(function (input) {
|
||||
args[0] = input;
|
||||
var result = validator[options.sanitizer].apply(validator, args)
|
||||
, expected = options.expect[input];
|
||||
if (isNaN(result) && !result.length && isNaN(expected)) {
|
||||
return;
|
||||
}
|
||||
if (result !== expected) {
|
||||
var warning = format('validator.%s(%s) returned "%s" but should have returned "%s"',
|
||||
options.sanitizer, args.join(', '), result, expected);
|
||||
throw new Error(warning);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
describe('Sanitizers', function () {
|
||||
|
||||
it('should sanitize boolean strings', function () {
|
||||
test({
|
||||
sanitizer: 'toBoolean'
|
||||
, expect: {
|
||||
'0': false
|
||||
, '': false
|
||||
, '1': true
|
||||
, 'true': true
|
||||
, 'foobar': true
|
||||
, ' ': true
|
||||
}
|
||||
});
|
||||
test({
|
||||
sanitizer: 'toBoolean'
|
||||
, args: [ true ] //strict
|
||||
, expect: {
|
||||
'0': false
|
||||
, '': false
|
||||
, '1': true
|
||||
, 'true': true
|
||||
, 'foobar': false
|
||||
, ' ': false
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
it('should trim whitespace', function () {
|
||||
test({
|
||||
sanitizer: 'trim'
|
||||
, expect: { ' \r\n\tfoo \r\n\t ': 'foo' }
|
||||
});
|
||||
test({
|
||||
sanitizer: 'ltrim'
|
||||
, expect: { ' \r\n\tfoo \r\n\t ': 'foo \r\n\t ' }
|
||||
});
|
||||
test({
|
||||
sanitizer: 'rtrim'
|
||||
, expect: { ' \r\n\tfoo \r\n\t ': ' \r\n\tfoo' }
|
||||
});
|
||||
});
|
||||
|
||||
it('should trim custom characters', function () {
|
||||
test({
|
||||
sanitizer: 'trim'
|
||||
, args: [ '01' ]
|
||||
, expect: { '010100201000': '2' }
|
||||
});
|
||||
test({
|
||||
sanitizer: 'ltrim'
|
||||
, args: [ '01' ]
|
||||
, expect: { '010100201000': '201000' }
|
||||
});
|
||||
test({
|
||||
sanitizer: 'rtrim'
|
||||
, args: [ '01' ]
|
||||
, expect: { '010100201000': '0101002' }
|
||||
});
|
||||
});
|
||||
|
||||
it('should convert strings to integers', function () {
|
||||
test({
|
||||
sanitizer: 'toInt'
|
||||
, expect: {
|
||||
'3': 3
|
||||
, ' 3 ': 3
|
||||
, '2.4': 2
|
||||
, 'foo': NaN
|
||||
}
|
||||
});
|
||||
test({
|
||||
sanitizer: 'toInt'
|
||||
, args: [ 16 ]
|
||||
, expect: { 'ff': 255 }
|
||||
});
|
||||
});
|
||||
|
||||
it('should convert strings to floats', function () {
|
||||
test({
|
||||
sanitizer: 'toFloat'
|
||||
, expect: {
|
||||
'2': 2.0
|
||||
, '2.': 2.0
|
||||
, '-2.5': -2.5
|
||||
, '.5': 0.5
|
||||
, 'foo': NaN
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
it('should escape HTML', function () {
|
||||
test({
|
||||
sanitizer: 'escape'
|
||||
, expect: {
|
||||
'<script> alert("xss&fun"); </script>': '<script> alert("xss&fun"); </script>'
|
||||
, "<script> alert('xss&fun'); </script>": '<script> alert('xss&fun'); </script>'
|
||||
, 'Backtick: `': 'Backtick: `'
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
it('should remove control characters (<32 and 127)', function () {
|
||||
// Check basic functionality
|
||||
test({
|
||||
sanitizer: 'stripLow'
|
||||
, expect: {
|
||||
"foo\x00": "foo"
|
||||
, "\x7Ffoo\x02": "foo"
|
||||
, "\x01\x09": ""
|
||||
, "foo\x0A\x0D": "foo"
|
||||
}
|
||||
});
|
||||
// Unicode safety
|
||||
test({
|
||||
sanitizer: 'stripLow'
|
||||
, expect: {
|
||||
"perch\u00e9": "perch\u00e9"
|
||||
, "\u20ac": "\u20ac"
|
||||
, "\u2206\x0A": "\u2206"
|
||||
, "\ud83d\ude04": "\ud83d\ude04"
|
||||
}
|
||||
});
|
||||
// Preserve newlines
|
||||
test({
|
||||
sanitizer: 'stripLow'
|
||||
, args: [ true ] //keep_new_lines
|
||||
, expect: {
|
||||
"foo\x0A\x0D": "foo\x0A\x0D"
|
||||
, "\x03foo\x0A\x0D": "foo\x0A\x0D"
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
it('should sanitize a string based on a whitelist', function () {
|
||||
test({
|
||||
sanitizer: 'whitelist'
|
||||
, args: [ 'abc' ]
|
||||
, expect: {
|
||||
'abcdef': 'abc'
|
||||
, 'aaaaaaaaaabbbbbbbbbb': 'aaaaaaaaaabbbbbbbbbb'
|
||||
, 'a1b2c3': 'abc'
|
||||
, ' ': ''
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
it('should sanitize a string based on a blacklist', function () {
|
||||
test({
|
||||
sanitizer: 'blacklist'
|
||||
, args: [ 'abc' ]
|
||||
, expect: {
|
||||
'abcdef': 'def'
|
||||
, 'aaaaaaaaaabbbbbbbbbb': ''
|
||||
, 'a1b2c3': '123'
|
||||
, ' ': ' '
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
it('should normalize an email based on domain', function () {
|
||||
test({
|
||||
sanitizer: 'normalizeEmail'
|
||||
, expect: {
|
||||
'test@me.com': 'test@me.com'
|
||||
, 'some.name@gmail.com': 'somename@gmail.com'
|
||||
, 'some.name@googleMail.com': 'somename@gmail.com'
|
||||
, 'some.name+extension@gmail.com': 'somename@gmail.com'
|
||||
, 'some.Name+extension@GoogleMail.com': 'somename@gmail.com'
|
||||
, 'some.name.middleName+extension@gmail.com': 'somenamemiddlename@gmail.com'
|
||||
, 'some.name.middleName+extension@GoogleMail.com': 'somenamemiddlename@gmail.com'
|
||||
, 'some.name.midd.leNa.me.+extension@gmail.com': 'somenamemiddlename@gmail.com'
|
||||
, 'some.name.midd.leNa.me.+extension@GoogleMail.com': 'somenamemiddlename@gmail.com'
|
||||
, 'some.name+extension@unknown.com': 'some.name+extension@unknown.com'
|
||||
, 'hans@m端ller.com': 'hans@m端ller.com'
|
||||
, 'an invalid email address': false
|
||||
, '': false
|
||||
, '+extension@gmail.com': false
|
||||
// some.name.midd..leNa...me...+extension@GoogleMail.com was removed from test cases because of a bug with validator.isEmail. See issue #258
|
||||
}
|
||||
});
|
||||
test({
|
||||
sanitizer: 'normalizeEmail'
|
||||
, args: [{lowercase: false}]
|
||||
, expect: {
|
||||
'test@me.com': 'test@me.com'
|
||||
, 'hans@m端ller.com': 'hans@m端ller.com'
|
||||
, 'test@ME.COM': 'test@me.com' // Hostname is always lowercased
|
||||
, 'TEST@me.com': 'TEST@me.com'
|
||||
, 'TEST@ME.COM': 'TEST@me.com'
|
||||
, 'blAH@x.com': 'blAH@x.com'
|
||||
|
||||
// Domains that are known for being case-insensitive are always lowercased
|
||||
, 'SOME.name@GMAIL.com': 'somename@gmail.com'
|
||||
, 'SOME.name.middleName+extension@GoogleMail.com': 'somenamemiddlename@gmail.com'
|
||||
, 'SOME.name.midd.leNa.me.+extension@gmail.com': 'somenamemiddlename@gmail.com'
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
+1947
File diff suppressed because it is too large.
Load diff
+727
@@ -0,0 +1,727 @@
|
||||
/*!
|
||||
* Copyright (c) 2014 Chris O'Hara <cohara87@gmail.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* 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,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
(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 {
|
||||
this[name] = definition();
|
||||
}
|
||||
})('validator', function (validator) {
|
||||
|
||||
'use strict';
|
||||
|
||||
validator = { version: '3.35.0' };
|
||||
|
||||
var emailUser = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e])|(\\[\x01-\x09\x0b\x0c\x0d-\x7f])))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))$/i;
|
||||
|
||||
var emailUserUtf8 = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\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]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))$/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 ipv4Maybe = /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/
|
||||
, ipv6Block = /^[0-9A-F]{1,4}$/i;
|
||||
|
||||
var uuid = {
|
||||
'3': /^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i
|
||||
, '4': /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
|
||||
, '5': /^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
|
||||
, all: /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i
|
||||
};
|
||||
|
||||
var alpha = /^[A-Z]+$/i
|
||||
, alphanumeric = /^[0-9A-Z]+$/i
|
||||
, numeric = /^[-+]?[0-9]+$/
|
||||
, int = /^(?:[-+]?(?:0|[1-9][0-9]*))$/
|
||||
, float = /^(?:[-+]?(?:[0-9]+))?(?:\.[0-9]*)?(?:[eE][\+\-]?(?:[0-9]+))?$/
|
||||
, hexadecimal = /^[0-9A-F]+$/i
|
||||
, 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 = {
|
||||
'zh-CN': /^(\+?0?86\-?)?1[345789]\d{9}$/,
|
||||
'en-ZA': /^(\+?27|0)\d{9}$/,
|
||||
'en-AU': /^(\+?61|0)4\d{8}$/,
|
||||
'en-HK': /^(\+?852\-?)?[569]\d{3}\-?\d{4}$/,
|
||||
'fr-FR': /^(\+?33|0)[67]\d{8}$/,
|
||||
'pt-PT': /^(\+351)?9[1236]\d{7}$/,
|
||||
'el-GR': /^(\+30)?((2\d{9})|(69\d{8}))$/,
|
||||
'en-GB': /^(\+?44|0)7\d{9}$/
|
||||
};
|
||||
|
||||
validator.extend = function (name, fn) {
|
||||
validator[name] = function () {
|
||||
var args = Array.prototype.slice.call(arguments);
|
||||
args[0] = validator.toString(args[0]);
|
||||
return fn.apply(validator, args);
|
||||
};
|
||||
};
|
||||
|
||||
//Right before exporting the validator object, pass each of the builtins
|
||||
//through extend() so that their first argument is coerced to a string
|
||||
validator.init = function () {
|
||||
for (var name in validator) {
|
||||
if (typeof validator[name] !== 'function' || name === 'toString' ||
|
||||
name === 'toDate' || name === 'extend' || name === 'init') {
|
||||
continue;
|
||||
}
|
||||
validator.extend(name, validator[name]);
|
||||
}
|
||||
};
|
||||
|
||||
validator.toString = function (input) {
|
||||
if (typeof input === 'object' && input !== null && input.toString) {
|
||||
input = input.toString();
|
||||
} else if (input === null || typeof input === 'undefined' || (isNaN(input) && !input.length)) {
|
||||
input = '';
|
||||
} else if (typeof input !== 'string') {
|
||||
input += '';
|
||||
}
|
||||
return input;
|
||||
};
|
||||
|
||||
validator.toDate = function (date) {
|
||||
if (Object.prototype.toString.call(date) === '[object Date]') {
|
||||
return date;
|
||||
}
|
||||
date = Date.parse(date);
|
||||
return !isNaN(date) ? new Date(date) : null;
|
||||
};
|
||||
|
||||
validator.toFloat = function (str) {
|
||||
return parseFloat(str);
|
||||
};
|
||||
|
||||
validator.toInt = function (str, radix) {
|
||||
return parseInt(str, radix || 10);
|
||||
};
|
||||
|
||||
validator.toBoolean = function (str, strict) {
|
||||
if (strict) {
|
||||
return str === '1' || str === 'true';
|
||||
}
|
||||
return str !== '0' && str !== 'false' && str !== '';
|
||||
};
|
||||
|
||||
validator.equals = function (str, comparison) {
|
||||
return str === validator.toString(comparison);
|
||||
};
|
||||
|
||||
validator.contains = function (str, elem) {
|
||||
return str.indexOf(validator.toString(elem)) >= 0;
|
||||
};
|
||||
|
||||
validator.matches = function (str, pattern, modifiers) {
|
||||
if (Object.prototype.toString.call(pattern) !== '[object RegExp]') {
|
||||
pattern = new RegExp(pattern, modifiers);
|
||||
}
|
||||
return pattern.test(str);
|
||||
};
|
||||
|
||||
var default_email_options = {
|
||||
allow_display_name: false,
|
||||
allow_utf8_local_part: true
|
||||
};
|
||||
|
||||
validator.isEmail = function (str, options) {
|
||||
options = merge(options, default_email_options);
|
||||
|
||||
if (options.allow_display_name) {
|
||||
var display_email = str.match(displayName);
|
||||
if (display_email) {
|
||||
str = display_email[1];
|
||||
}
|
||||
} else if (/\s/.test(str)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
var parts = str.split('@')
|
||||
, domain = parts.pop()
|
||||
, user = parts.join('@');
|
||||
|
||||
if (!validator.isFQDN(domain, {require_tld: false})) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return options.allow_utf8_local_part ?
|
||||
emailUserUtf8.test(user) :
|
||||
emailUser.test(user);
|
||||
};
|
||||
|
||||
var default_url_options = {
|
||||
protocols: [ 'http', 'https', 'ftp' ]
|
||||
, require_tld: true
|
||||
, require_protocol: false
|
||||
, allow_underscores: false
|
||||
, allow_trailing_dot: false
|
||||
, allow_protocol_relative_urls: false
|
||||
};
|
||||
|
||||
validator.isURL = function (url, options) {
|
||||
if (!url || url.length >= 2083 || /\s/.test(url)) {
|
||||
return false;
|
||||
}
|
||||
if (url.indexOf('mailto:') === 0) {
|
||||
return false;
|
||||
}
|
||||
options = merge(options, default_url_options);
|
||||
var protocol, auth, host, hostname, port,
|
||||
port_str, split;
|
||||
split = url.split('://');
|
||||
if (split.length > 1) {
|
||||
protocol = split.shift();
|
||||
if (options.protocols.indexOf(protocol) === -1) {
|
||||
return false;
|
||||
}
|
||||
} else if (options.require_protocol) {
|
||||
return false;
|
||||
} else if (options.allow_protocol_relative_urls && url.substr(0, 2) === '//') {
|
||||
split[0] = url.substr(2);
|
||||
}
|
||||
url = split.join('://');
|
||||
split = url.split('#');
|
||||
url = split.shift();
|
||||
|
||||
split = url.split('?');
|
||||
url = split.shift();
|
||||
|
||||
split = url.split('/');
|
||||
url = split.shift();
|
||||
split = url.split('@');
|
||||
if (split.length > 1) {
|
||||
auth = split.shift();
|
||||
if (auth.indexOf(':') >= 0 && auth.split(':').length > 2) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
hostname = split.join('@');
|
||||
split = hostname.split(':');
|
||||
host = split.shift();
|
||||
if (split.length) {
|
||||
port_str = split.join(':');
|
||||
port = parseInt(port_str, 10);
|
||||
if (!/^[0-9]+$/.test(port_str) || port <= 0 || port > 65535) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (!validator.isIP(host) && !validator.isFQDN(host, options) &&
|
||||
host !== 'localhost') {
|
||||
return false;
|
||||
}
|
||||
if (options.host_whitelist &&
|
||||
options.host_whitelist.indexOf(host) === -1) {
|
||||
return false;
|
||||
}
|
||||
if (options.host_blacklist &&
|
||||
options.host_blacklist.indexOf(host) !== -1) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
validator.isIP = function (str, version) {
|
||||
version = validator.toString(version);
|
||||
if (!version) {
|
||||
return validator.isIP(str, 4) || validator.isIP(str, 6);
|
||||
} else if (version === '4') {
|
||||
if (!ipv4Maybe.test(str)) {
|
||||
return false;
|
||||
}
|
||||
var parts = str.split('.').sort(function (a, b) {
|
||||
return a - b;
|
||||
});
|
||||
return parts[3] <= 255;
|
||||
} else if (version === '6') {
|
||||
var blocks = str.split(':');
|
||||
var foundOmissionBlock = false; // marker to indicate ::
|
||||
|
||||
if (blocks.length > 8)
|
||||
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 (!ipv6Block.test(blocks[i])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (foundOmissionBlock) {
|
||||
return blocks.length >= 1;
|
||||
} else {
|
||||
return blocks.length === 8;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
var default_fqdn_options = {
|
||||
require_tld: true
|
||||
, allow_underscores: false
|
||||
, allow_trailing_dot: false
|
||||
};
|
||||
|
||||
validator.isFQDN = function (str, options) {
|
||||
options = merge(options, default_fqdn_options);
|
||||
|
||||
/* Remove the optional trailing dot before checking validity */
|
||||
if (options.allow_trailing_dot && str[str.length - 1] === '.') {
|
||||
str = str.substring(0, str.length - 1);
|
||||
}
|
||||
var parts = str.split('.');
|
||||
if (options.require_tld) {
|
||||
var tld = parts.pop();
|
||||
if (!parts.length || !/^([a-z\u00a1-\uffff]{2,}|xn[a-z0-9-]{2,})$/i.test(tld)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
for (var part, i = 0; i < parts.length; i++) {
|
||||
part = parts[i];
|
||||
if (options.allow_underscores) {
|
||||
if (part.indexOf('__') >= 0) {
|
||||
return false;
|
||||
}
|
||||
part = part.replace(/_/g, '');
|
||||
}
|
||||
if (!/^[a-z\u00a1-\uffff0-9-]+$/i.test(part)) {
|
||||
return false;
|
||||
}
|
||||
if (part[0] === '-' || part[part.length - 1] === '-' ||
|
||||
part.indexOf('---') >= 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
validator.isAlpha = function (str) {
|
||||
return alpha.test(str);
|
||||
};
|
||||
|
||||
validator.isAlphanumeric = function (str) {
|
||||
return alphanumeric.test(str);
|
||||
};
|
||||
|
||||
validator.isNumeric = function (str) {
|
||||
return numeric.test(str);
|
||||
};
|
||||
|
||||
validator.isHexadecimal = function (str) {
|
||||
return hexadecimal.test(str);
|
||||
};
|
||||
|
||||
validator.isHexColor = function (str) {
|
||||
return hexcolor.test(str);
|
||||
};
|
||||
|
||||
validator.isLowercase = function (str) {
|
||||
return str === str.toLowerCase();
|
||||
};
|
||||
|
||||
validator.isUppercase = function (str) {
|
||||
return str === str.toUpperCase();
|
||||
};
|
||||
|
||||
validator.isInt = function (str) {
|
||||
return int.test(str);
|
||||
};
|
||||
|
||||
validator.isFloat = function (str) {
|
||||
return str !== '' && float.test(str);
|
||||
};
|
||||
|
||||
validator.isDivisibleBy = function (str, num) {
|
||||
return validator.toFloat(str) % validator.toInt(num) === 0;
|
||||
};
|
||||
|
||||
validator.isNull = function (str) {
|
||||
return str.length === 0;
|
||||
};
|
||||
|
||||
validator.isLength = function (str, min, max) {
|
||||
var surrogatePairs = str.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g) || [];
|
||||
var len = str.length - surrogatePairs.length;
|
||||
return len >= min && (typeof max === 'undefined' || len <= max);
|
||||
};
|
||||
|
||||
validator.isByteLength = function (str, min, max) {
|
||||
return str.length >= min && (typeof max === 'undefined' || str.length <= max);
|
||||
};
|
||||
|
||||
validator.isUUID = function (str, version) {
|
||||
var pattern = uuid[version ? version : 'all'];
|
||||
return pattern && pattern.test(str);
|
||||
};
|
||||
|
||||
validator.isDate = function (str) {
|
||||
return !isNaN(Date.parse(str));
|
||||
};
|
||||
|
||||
validator.isAfter = function (str, date) {
|
||||
var comparison = validator.toDate(date || new Date())
|
||||
, original = validator.toDate(str);
|
||||
return !!(original && comparison && original > comparison);
|
||||
};
|
||||
|
||||
validator.isBefore = function (str, date) {
|
||||
var comparison = validator.toDate(date || new Date())
|
||||
, original = validator.toDate(str);
|
||||
return original && comparison && original < comparison;
|
||||
};
|
||||
|
||||
validator.isIn = function (str, options) {
|
||||
var i;
|
||||
if (Object.prototype.toString.call(options) === '[object Array]') {
|
||||
var array = [];
|
||||
for (i in options) {
|
||||
array[i] = validator.toString(options[i]);
|
||||
}
|
||||
return array.indexOf(str) >= 0;
|
||||
} else if (typeof options === 'object') {
|
||||
return options.hasOwnProperty(str);
|
||||
} else if (options && typeof options.indexOf === 'function') {
|
||||
return options.indexOf(str) >= 0;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
validator.isCreditCard = function (str) {
|
||||
var sanitized = str.replace(/[^0-9]+/g, '');
|
||||
if (!creditCard.test(sanitized)) {
|
||||
return false;
|
||||
}
|
||||
var sum = 0, digit, tmpNum, shouldDouble;
|
||||
for (var i = sanitized.length - 1; i >= 0; i--) {
|
||||
digit = sanitized.substring(i, (i + 1));
|
||||
tmpNum = parseInt(digit, 10);
|
||||
if (shouldDouble) {
|
||||
tmpNum *= 2;
|
||||
if (tmpNum >= 10) {
|
||||
sum += ((tmpNum % 10) + 1);
|
||||
} else {
|
||||
sum += tmpNum;
|
||||
}
|
||||
} else {
|
||||
sum += tmpNum;
|
||||
}
|
||||
shouldDouble = !shouldDouble;
|
||||
}
|
||||
return !!((sum % 10) === 0 ? sanitized : false);
|
||||
};
|
||||
|
||||
validator.isISIN = function (str) {
|
||||
if (!isin.test(str)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
var checksumStr = str.replace(/[A-Z]/g, function(character) {
|
||||
return parseInt(character, 36);
|
||||
});
|
||||
|
||||
var sum = 0, digit, tmpNum, shouldDouble = true;
|
||||
for (var i = checksumStr.length - 2; i >= 0; i--) {
|
||||
digit = checksumStr.substring(i, (i + 1));
|
||||
tmpNum = parseInt(digit, 10);
|
||||
if (shouldDouble) {
|
||||
tmpNum *= 2;
|
||||
if (tmpNum >= 10) {
|
||||
sum += tmpNum + 1;
|
||||
} else {
|
||||
sum += tmpNum;
|
||||
}
|
||||
} else {
|
||||
sum += tmpNum;
|
||||
}
|
||||
shouldDouble = !shouldDouble;
|
||||
}
|
||||
|
||||
return parseInt(str.substr(str.length - 1), 10) === (10000 - sum) % 10;
|
||||
};
|
||||
|
||||
validator.isISBN = function (str, version) {
|
||||
version = validator.toString(version);
|
||||
if (!version) {
|
||||
return validator.isISBN(str, 10) || validator.isISBN(str, 13);
|
||||
}
|
||||
var sanitized = str.replace(/[\s-]+/g, '')
|
||||
, checksum = 0, i;
|
||||
if (version === '10') {
|
||||
if (!isbn10Maybe.test(sanitized)) {
|
||||
return false;
|
||||
}
|
||||
for (i = 0; i < 9; i++) {
|
||||
checksum += (i + 1) * sanitized.charAt(i);
|
||||
}
|
||||
if (sanitized.charAt(9) === 'X') {
|
||||
checksum += 10 * 10;
|
||||
} else {
|
||||
checksum += 10 * sanitized.charAt(9);
|
||||
}
|
||||
if ((checksum % 11) === 0) {
|
||||
return !!sanitized;
|
||||
}
|
||||
} else if (version === '13') {
|
||||
if (!isbn13Maybe.test(sanitized)) {
|
||||
return false;
|
||||
}
|
||||
var factor = [ 1, 3 ];
|
||||
for (i = 0; i < 12; i++) {
|
||||
checksum += factor[i % 2] * sanitized.charAt(i);
|
||||
}
|
||||
if (sanitized.charAt(12) - ((10 - (checksum % 10)) % 10) === 0) {
|
||||
return !!sanitized;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
validator.isMobilePhone = function(str, locale) {
|
||||
if (locale in phones) {
|
||||
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
|
||||
};
|
||||
|
||||
validator.isCurrency = function (str, options) {
|
||||
options = merge(options, default_currency_options);
|
||||
|
||||
return currencyRegex(options).test(str);
|
||||
};
|
||||
|
||||
validator.isJSON = function (str) {
|
||||
try {
|
||||
JSON.parse(str);
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
validator.isMultibyte = function (str) {
|
||||
return multibyte.test(str);
|
||||
};
|
||||
|
||||
validator.isAscii = function (str) {
|
||||
return ascii.test(str);
|
||||
};
|
||||
|
||||
validator.isFullWidth = function (str) {
|
||||
return fullWidth.test(str);
|
||||
};
|
||||
|
||||
validator.isHalfWidth = function (str) {
|
||||
return halfWidth.test(str);
|
||||
};
|
||||
|
||||
validator.isVariableWidth = function (str) {
|
||||
return fullWidth.test(str) && halfWidth.test(str);
|
||||
};
|
||||
|
||||
validator.isSurrogatePair = function (str) {
|
||||
return surrogatePair.test(str);
|
||||
};
|
||||
|
||||
validator.isBase64 = function (str) {
|
||||
return base64.test(str);
|
||||
};
|
||||
|
||||
validator.isMongoId = function (str) {
|
||||
return validator.isHexadecimal(str) && str.length === 24;
|
||||
};
|
||||
|
||||
validator.ltrim = function (str, chars) {
|
||||
var pattern = chars ? new RegExp('^[' + chars + ']+', 'g') : /^\s+/g;
|
||||
return str.replace(pattern, '');
|
||||
};
|
||||
|
||||
validator.rtrim = function (str, chars) {
|
||||
var pattern = chars ? new RegExp('[' + chars + ']+$', 'g') : /\s+$/g;
|
||||
return str.replace(pattern, '');
|
||||
};
|
||||
|
||||
validator.trim = function (str, chars) {
|
||||
var pattern = chars ? new RegExp('^[' + chars + ']+|[' + chars + ']+$', 'g') : /^\s+|\s+$/g;
|
||||
return str.replace(pattern, '');
|
||||
};
|
||||
|
||||
validator.escape = function (str) {
|
||||
return (str.replace(/&/g, '&')
|
||||
.replace(/"/g, '"')
|
||||
.replace(/'/g, ''')
|
||||
.replace(/</g, '<')
|
||||
.replace(/>/g, '>')
|
||||
.replace(/\//g, '/')
|
||||
.replace(/\`/g, '`'));
|
||||
};
|
||||
|
||||
validator.stripLow = function (str, keep_new_lines) {
|
||||
var chars = keep_new_lines ? '\\x00-\\x09\\x0B\\x0C\\x0E-\\x1F\\x7F' : '\\x00-\\x1F\\x7F';
|
||||
return validator.blacklist(str, chars);
|
||||
};
|
||||
|
||||
validator.whitelist = function (str, chars) {
|
||||
return str.replace(new RegExp('[^' + chars + ']+', 'g'), '');
|
||||
};
|
||||
|
||||
validator.blacklist = function (str, chars) {
|
||||
return str.replace(new RegExp('[' + chars + ']+', 'g'), '');
|
||||
};
|
||||
|
||||
var default_normalize_email_options = {
|
||||
lowercase: true
|
||||
};
|
||||
|
||||
validator.normalizeEmail = function (email, options) {
|
||||
options = merge(options, default_normalize_email_options);
|
||||
if (!validator.isEmail(email)) {
|
||||
return false;
|
||||
}
|
||||
var parts = email.split('@', 2);
|
||||
parts[1] = parts[1].toLowerCase();
|
||||
if (parts[1] === 'gmail.com' || parts[1] === 'googlemail.com') {
|
||||
parts[0] = parts[0].toLowerCase().replace(/\./g, '');
|
||||
if (parts[0][0] === '+') {
|
||||
return false;
|
||||
}
|
||||
parts[0] = parts[0].split('+')[0];
|
||||
parts[1] = 'gmail.com';
|
||||
} else if (options.lowercase) {
|
||||
parts[0] = parts[0].toLowerCase();
|
||||
}
|
||||
return parts.join('@');
|
||||
};
|
||||
|
||||
function merge(obj, defaults) {
|
||||
obj = obj || {};
|
||||
for (var key in defaults) {
|
||||
if (typeof obj[key] === 'undefined') {
|
||||
obj[key] = defaults[key];
|
||||
}
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
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 +
|
||||
'$'
|
||||
);
|
||||
}
|
||||
|
||||
validator.init();
|
||||
|
||||
return validator;
|
||||
|
||||
});
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
/*!
|
||||
* Copyright (c) 2014 Chris O'Hara <cohara87@gmail.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* 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,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
!function(t,e){"undefined"!=typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&"object"==typeof define.amd?define(e):this[t]=e()}("validator",function(t){"use strict";function e(t,e){t=t||{};for(var r in e)"undefined"==typeof t[r]&&(t[r]=e[r]);return t}function r(t){var e="(\\"+t.symbol.replace(/\./g,"\\.")+")"+(t.require_symbol?"":"?"),r="-?",n="[1-9]\\d*",i="[1-9]\\d{0,2}(\\"+t.thousands_separator+"\\d{3})*",u=["0",n,i],o="("+u.join("|")+")?",a="(\\"+t.decimal_separator+"\\d{2})?",s=o+a;return t.allow_negatives&&!t.parens_for_negatives&&(t.negative_sign_after_digits?s+=r:t.negative_sign_before_digits&&(s=r+s)),t.allow_negative_sign_placeholder?s="( (?!\\-))?"+s:t.allow_space_after_symbol?s=" ?"+s:t.allow_space_after_digits&&(s+="( (?!$))?"),t.symbol_after_digits?s+=e:s=e+s,t.allow_negatives&&(t.parens_for_negatives?s="(\\("+s+"\\)|"+s+")":t.negative_sign_before_digits||t.negative_sign_after_digits||(s=r+s)),new RegExp("^(?!-? )(?=.*\\d)"+s+"$")}t={version:"3.35.0"};var n=/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e])|(\\[\x01-\x09\x0b\x0c\x0d-\x7f])))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))$/i,i=/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\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]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))$/i,u=/^(?:[a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~\.]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(?:[a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~\.]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|\s)*<(.+)>$/i,o=/^(?: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})$/,a=/^[A-Z]{2}[0-9A-Z]{9}[0-9]$/,s=/^(?:[0-9]{9}X|[0-9]{10})$/,l=/^(?:[0-9]{13})$/,f=/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/,c=/^[0-9A-F]{1,4}$/i,F={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},p=/^[A-Z]+$/i,g=/^[0-9A-Z]+$/i,x=/^[-+]?[0-9]+$/,d=/^(?:[-+]?(?:0|[1-9][0-9]*))$/,_=/^(?:[-+]?(?:[0-9]+))?(?:\.[0-9]*)?(?:[eE][\+\-]?(?:[0-9]+))?$/,h=/^[0-9A-F]+$/i,A=/^#?([0-9A-F]{3}|[0-9A-F]{6})$/i,v=/^[\x00-\x7F]+$/,D=/[^\x00-\x7F]/,$=/[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/,w=/[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/,b=/[\uD800-\uDBFF][\uDC00-\uDFFF]/,m=/^(?:[A-Z0-9+\/]{4})*(?:[A-Z0-9+\/]{2}==|[A-Z0-9+\/]{3}=|[A-Z0-9+\/]{4})$/i,y={"zh-CN":/^(\+?0?86\-?)?1[345789]\d{9}$/,"en-ZA":/^(\+?27|0)\d{9}$/,"en-AU":/^(\+?61|0)4\d{8}$/,"en-HK":/^(\+?852\-?)?[569]\d{3}\-?\d{4}$/,"fr-FR":/^(\+?33|0)[67]\d{8}$/,"pt-PT":/^(\+351)?9[1236]\d{7}$/,"el-GR":/^(\+30)?((2\d{9})|(69\d{8}))$/,"en-GB":/^(\+?44|0)7\d{9}$/};t.extend=function(e,r){t[e]=function(){var e=Array.prototype.slice.call(arguments);return e[0]=t.toString(e[0]),r.apply(t,e)}},t.init=function(){for(var e in t)"function"==typeof t[e]&&"toString"!==e&&"toDate"!==e&&"extend"!==e&&"init"!==e&&t.extend(e,t[e])},t.toString=function(t){return"object"==typeof t&&null!==t&&t.toString?t=t.toString():null===t||"undefined"==typeof t||isNaN(t)&&!t.length?t="":"string"!=typeof t&&(t+=""),t},t.toDate=function(t){return"[object Date]"===Object.prototype.toString.call(t)?t:(t=Date.parse(t),isNaN(t)?null:new Date(t))},t.toFloat=function(t){return parseFloat(t)},t.toInt=function(t,e){return parseInt(t,e||10)},t.toBoolean=function(t,e){return e?"1"===t||"true"===t:"0"!==t&&"false"!==t&&""!==t},t.equals=function(e,r){return e===t.toString(r)},t.contains=function(e,r){return e.indexOf(t.toString(r))>=0},t.matches=function(t,e,r){return"[object RegExp]"!==Object.prototype.toString.call(e)&&(e=new RegExp(e,r)),e.test(t)};var E={allow_display_name:!1,allow_utf8_local_part:!0};t.isEmail=function(r,o){if(o=e(o,E),o.allow_display_name){var a=r.match(u);a&&(r=a[1])}else if(/\s/.test(r))return!1;var s=r.split("@"),l=s.pop(),f=s.join("@");return t.isFQDN(l,{require_tld:!1})?o.allow_utf8_local_part?i.test(f):n.test(f):!1};var C={protocols:["http","https","ftp"],require_tld:!0,require_protocol:!1,allow_underscores:!1,allow_trailing_dot:!1,allow_protocol_relative_urls:!1};t.isURL=function(r,n){if(!r||r.length>=2083||/\s/.test(r))return!1;if(0===r.indexOf("mailto:"))return!1;n=e(n,C);var i,u,o,a,s,l,f;if(f=r.split("://"),f.length>1){if(i=f.shift(),-1===n.protocols.indexOf(i))return!1}else{if(n.require_protocol)return!1;n.allow_protocol_Line truncated
|
||||
Reference in new issue
Block a user