mirror of
https://github.com/atlanticbiomedical/biomedjs.git
synced 2025-07-02 00:47:26 -04:00
Changes
This commit is contained in:
3
node_modules/validator/.jshintrc
generated
vendored
Normal file
3
node_modules/validator/.jshintrc
generated
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"laxcomma": true
|
||||
}
|
3
node_modules/validator/.npmignore
generated
vendored
Normal file
3
node_modules/validator/.npmignore
generated
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
.DS_Store
|
||||
node_modules
|
||||
coverage
|
7
node_modules/validator/.travis.yml
generated
vendored
Normal file
7
node_modules/validator/.travis.yml
generated
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
sudo: false
|
||||
language: node_js
|
||||
node_js:
|
||||
- "4.0"
|
||||
- "4.1"
|
||||
after_script:
|
||||
- npm run coveralls
|
61
node_modules/validator/CHANGELOG.md
generated
vendored
Normal file
61
node_modules/validator/CHANGELOG.md
generated
vendored
Normal file
@ -0,0 +1,61 @@
|
||||
#### HEAD
|
||||
|
||||
- Fix `isDate()` handling of RFC2822 timezones
|
||||
([#447](https://github.com/chriso/validator.js/pull/447))
|
||||
|
||||
#### 4.2.0
|
||||
|
||||
- Fix `isDate()` handling of ISO8601 timezones
|
||||
([#444](https://github.com/chriso/validator.js/pull/444))
|
||||
- Fix the incorrect `isFloat('.') === true`
|
||||
([#443](https://github.com/chriso/validator.js/pull/443))
|
||||
- Added a Norwegian locale to `isMobilePhone()`
|
||||
([#439](https://github.com/chriso/validator.js/pull/439))
|
||||
|
||||
#### 4.1.0
|
||||
|
||||
- General `isDate()` improvements
|
||||
([#431](https://github.com/chriso/validator.js/pull/431))
|
||||
- Tests now require node 4.0+
|
||||
([#438](https://github.com/chriso/validator.js/pull/438))
|
||||
|
||||
#### 4.0.6
|
||||
|
||||
- Added a Taiwan locale to `isMobilePhone()`
|
||||
([#432](https://github.com/chriso/validator.js/pull/432))
|
||||
- Fixed a bug in `isBefore()` where it would return `null`
|
||||
([#436](https://github.com/chriso/validator.js/pull/436))
|
||||
|
||||
#### 4.0.5
|
||||
|
||||
- Fixed a denial of service vulnerability in the `isEmail()` regex
|
||||
([#152](https://github.com/chriso/validator.js/issues/152#issuecomment-131874928))
|
||||
|
||||
#### 4.0.4
|
||||
|
||||
- Reverted the leap year validation in `isDate()` as it introduced some regressions
|
||||
([#422](https://github.com/chriso/validator.js/issues/422), [#423](https://github.com/chriso/validator.js/issues/423))
|
||||
|
||||
#### 4.0.3
|
||||
|
||||
- Added leap year validation to `isDate()`
|
||||
([#418](https://github.com/chriso/validator.js/pull/418))
|
||||
|
||||
#### 4.0.2
|
||||
|
||||
- Fixed `isDecimal()` with an empty string
|
||||
([#419](https://github.com/chriso/validator.js/issues/419))
|
||||
|
||||
#### 4.0.1
|
||||
|
||||
- Fixed `isByteLength()` with certain strings
|
||||
([09f0c6d](https://github.com/chriso/validator.js/commit/09f0c6d2321f0c78af6a7de42e91b63955e4c01e))
|
||||
- Put length restrictions on email parts
|
||||
([#258](https://github.com/chriso/validator.js/issues/258#issuecomment-127173612))
|
||||
|
||||
#### 4.0.0
|
||||
|
||||
- Simplified the `isEmail()` regex and fixed some edge cases
|
||||
([#258](https://github.com/chriso/validator.js/issues/258#issuecomment-127173612))
|
||||
- Added ISO 8601 date validation via `isISO8601()`
|
||||
([#373](https://github.com/chriso/validator.js/issues/373))
|
20
node_modules/validator/LICENSE
generated
vendored
Normal file
20
node_modules/validator/LICENSE
generated
vendored
Normal file
@ -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.
|
34
node_modules/validator/Makefile
generated
vendored
Normal file
34
node_modules/validator/Makefile
generated
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
NPM=./node_modules/.bin
|
||||
|
||||
test: lint
|
||||
@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
|
179
node_modules/validator/README.md
generated
vendored
Normal file
179
node_modules/validator/README.md
generated
vendored
Normal file
@ -0,0 +1,179 @@
|
||||
# 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
|
||||
|
||||
- **contains(str, seed)** - check if the string contains the seed.
|
||||
- **equals(str, comparison)** - check if the string matches the comparison.
|
||||
- **isAfter(str [, date])** - check if the string is a date that's after the specified date (defaults to now).
|
||||
- **isAlpha(str)** - check if the string contains only letters (a-zA-Z).
|
||||
- **isAlphanumeric(str)** - check if the string contains only letters and numbers.
|
||||
- **isAscii(str)** - check if the string contains ASCII chars only.
|
||||
- **isBase64(str)** - check if a string is base64 encoded.
|
||||
- **isBefore(str [, date])** - check if the string is a date that's before the specified date.
|
||||
- **isBoolean(str)** - check if a string is a boolean.
|
||||
- **isByteLength(str, min [, max])** - check if the string's length (in bytes) falls in a range.
|
||||
- **isCreditCard(str)** - check if the string is a credit card.
|
||||
- **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 }`.
|
||||
- **isDate(str)** - check if the string is a date.
|
||||
- **isDecimal(str)** - check if the string represents a decimal number, such as 0.1, .3, 1.1, 1.00003, 4.0, etc.
|
||||
- **isDivisibleBy(str, number)** - check if the string is a number that's divisible by another.
|
||||
- **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, require_tld: 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. If `require_tld` is set to false, e-mail addresses without having TLD in their domain will also be matched.
|
||||
- **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 }`.
|
||||
- **isFloat(str [, options])** - check if the string is a float. `options` is an object which can contain the keys `min` and/or `max` to validate the float is within boundaries (e.g. `{ min: 7.22, max: 9.55 }`).
|
||||
- **isFullWidth(str)** - check if the string contains any full-width chars.
|
||||
- **isHalfWidth(str)** - check if the string contains any half-width chars.
|
||||
- **isHexColor(str)** - check if the string is a hexadecimal color.
|
||||
- **isHexadecimal(str)** - check if the string is a hexadecimal number.
|
||||
- **isIP(str [, version])** - check if the string is an IP (version 4 or 6).
|
||||
- **isISBN(str [, version])** - check if the string is an ISBN (version 10 or 13).
|
||||
- **isISIN(str)** - check if the string is an [ISIN][ISIN] (stock/security identifier).
|
||||
- **isISO8601(str)** - check if the string is a valid [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date.
|
||||
- **isIn(str, values)** - check if the string is in a array of allowed values.
|
||||
- **isInt(str [, options])** - check if the string is an integer. `options` is an object which can contain the keys `min` and/or `max` to check the integer is within boundaries (e.g. `{ min: 10, max: 99 }`).
|
||||
- **isJSON(str)** - check if the string is valid JSON (note: uses JSON.parse).
|
||||
- **isLength(str, min [, max])** - check if the string's length falls in a range. Note: this function takes into account surrogate pairs.
|
||||
- **isLowercase(str)** - check if the string is lowercase.
|
||||
- **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']`).
|
||||
- **isMongoId(str)** - check if the string is a valid hex-encoded representation of a [MongoDB ObjectId][mongoid].
|
||||
- **isMultibyte(str)** - check if the string contains one or more multibyte chars.
|
||||
- **isNull(str)** - check if the string is null.
|
||||
- **isNumeric(str)** - check if the string contains only numbers.
|
||||
- **isSurrogatePair(str)** - check if the string contains any surrogate pairs chars.
|
||||
- **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, require_valid_protocol: true, allow_underscores: false, host_whitelist: false, host_blacklist: false, allow_trailing_dot: false, allow_protocol_relative_urls: false }`.
|
||||
- **isUUID(str [, version])** - check if the string is a UUID (version 3, 4 or 5).
|
||||
- **isUppercase(str)** - check if the string is uppercase.
|
||||
- **isVariableWidth(str)** - check if the string contains a mixture of full and half-width chars.
|
||||
- **matches(str, pattern [, modifiers])** - check if string matches the pattern. Either `matches('foo', /foo/i)` or `matches('foo', 'foo', 'i')`.
|
||||
|
||||
### Sanitizers
|
||||
|
||||
- **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, '\\[\\]')`.
|
||||
- **escape(input)** - replace `<`, `>`, `&`, `'`, `"` and `/` with HTML entities.
|
||||
- **ltrim(input [, chars])** - trim characters from the left-side of the 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`.
|
||||
- **rtrim(input [, chars])** - trim characters from the right-side of the input.
|
||||
- **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.
|
||||
- **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`.
|
||||
- **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.
|
||||
- **toString(input)** - convert the input to a string.
|
||||
- **trim(input [, chars])** - trim characters (whitespace by default) from both sides of the input.
|
||||
- **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, '\\[\\]')`.
|
||||
|
||||
### 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
|
||||
|
||||
Tests require node v4.0+.
|
||||
|
||||
- `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
|
19
node_modules/validator/bower.json
generated
vendored
Normal file
19
node_modules/validator/bower.json
generated
vendored
Normal file
@ -0,0 +1,19 @@
|
||||
{
|
||||
"name": "validator-js",
|
||||
"main": "validator.js",
|
||||
"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",
|
||||
"Makefile",
|
||||
"package.json"
|
||||
]
|
||||
}
|
92
node_modules/validator/package.json
generated
vendored
Normal file
92
node_modules/validator/package.json
generated
vendored
Normal file
@ -0,0 +1,92 @@
|
||||
{
|
||||
"_args": [
|
||||
[
|
||||
"validator@4.2.x",
|
||||
"/Users/akira/src/biomedjs/node_modules/express-validator"
|
||||
]
|
||||
],
|
||||
"_from": "validator@>=4.2.0 <4.3.0",
|
||||
"_id": "validator@4.2.1",
|
||||
"_inCache": true,
|
||||
"_installable": true,
|
||||
"_location": "/validator",
|
||||
"_nodeVersion": "4.2.1",
|
||||
"_npmUser": {
|
||||
"email": "cohara87@gmail.com",
|
||||
"name": "cohara87"
|
||||
},
|
||||
"_npmVersion": "2.14.7",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"name": "validator",
|
||||
"raw": "validator@4.2.x",
|
||||
"rawSpec": "4.2.x",
|
||||
"scope": null,
|
||||
"spec": ">=4.2.0 <4.3.0",
|
||||
"type": "range"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/express-validator"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/validator/-/validator-4.2.1.tgz",
|
||||
"_shasum": "c4a8316242e515cd784171986296f8f81fc2ab35",
|
||||
"_shrinkwrap": null,
|
||||
"_spec": "validator@4.2.x",
|
||||
"_where": "/Users/akira/src/biomedjs/node_modules/express-validator",
|
||||
"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": {
|
||||
"coveralls": "latest",
|
||||
"istanbul": "latest",
|
||||
"jshint": "latest",
|
||||
"mocha": "latest",
|
||||
"uglify-js": "latest"
|
||||
},
|
||||
"directories": {},
|
||||
"dist": {
|
||||
"shasum": "c4a8316242e515cd784171986296f8f81fc2ab35",
|
||||
"tarball": "http://registry.npmjs.org/validator/-/validator-4.2.1.tgz"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.10"
|
||||
},
|
||||
"gitHead": "7b0c73d26decc20aa3bed3b7a15d09dc3d1b71ec",
|
||||
"homepage": "http://github.com/chriso/validator.js",
|
||||
"keywords": [
|
||||
"assert",
|
||||
"sanitisation",
|
||||
"sanitise",
|
||||
"sanitization",
|
||||
"sanitize",
|
||||
"validate",
|
||||
"validation",
|
||||
"validator"
|
||||
],
|
||||
"license": "MIT",
|
||||
"main": "validator.js",
|
||||
"maintainers": [
|
||||
{
|
||||
"name": "cohara87",
|
||||
"email": "cohara87@gmail.com"
|
||||
}
|
||||
],
|
||||
"name": "validator",
|
||||
"optionalDependencies": {},
|
||||
"readme": "ERROR: No README data found!",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+ssh://git@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": "4.2.1"
|
||||
}
|
26
node_modules/validator/test/client-side.js
generated
vendored
Normal file
26
node_modules/validator/test/client-side.js
generated
vendored
Normal file
@ -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
node_modules/validator/test/exports.js
generated
vendored
Normal file
21
node_modules/validator/test/exports.js
generated
vendored
Normal file
@ -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
node_modules/validator/test/sanitizers.js
generated
vendored
Normal file
223
node_modules/validator/test/sanitizers.js
generated
vendored
Normal file
@ -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'
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
});
|
2342
node_modules/validator/test/validators.js
generated
vendored
Normal file
2342
node_modules/validator/test/validators.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
863
node_modules/validator/validator.js
generated
vendored
Normal file
863
node_modules/validator/validator.js
generated
vendored
Normal file
@ -0,0 +1,863 @@
|
||||
/*!
|
||||
* 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.
|
||||
*/
|
||||
|
||||
(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: '4.2.1' };
|
||||
|
||||
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 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
|
||||
, 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 = {
|
||||
'zh-CN': /^(\+?0?86\-?)?1[345789]\d{9}$/,
|
||||
'zh-TW': /^(\+?886\-?|0)?9\d{8}$/,
|
||||
'en-ZA': /^(\+?27|0)\d{9}$/,
|
||||
'en-AU': /^(\+?61|0)4\d{8}$/,
|
||||
'en-HK': /^(\+?852\-?)?[569]\d{3}\-?\d{4}$/,
|
||||
'fr-FR': /^(\+?33|0)[67]\d{8}$/,
|
||||
'pt-PT': /^(\+351)?9[1236]\d{7}$/,
|
||||
'el-GR': /^(\+30)?((2\d{9})|(69\d{8}))$/,
|
||||
'en-GB': /^(\+?44|0)7\d{9}$/,
|
||||
'en-US': /^(\+?1)?[2-9]\d{2}[2-9](?!11)\d{6}$/,
|
||||
'en-ZM': /^(\+26)?09[567]\d{7}$/,
|
||||
'ru-RU': /^(\+?7|8)?9\d{9}$/,
|
||||
'nb-NO': /^(\+?47)?[49]\d{7}$/,
|
||||
'nn-NO': /^(\+?47)?[49]\d{7}$/
|
||||
};
|
||||
|
||||
// from http://goo.gl/0ejHHW
|
||||
var iso8601 = /^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24\:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/;
|
||||
|
||||
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 = '';
|
||||
}
|
||||
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,
|
||||
require_tld: 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];
|
||||
}
|
||||
}
|
||||
|
||||
var parts = str.split('@')
|
||||
, domain = parts.pop()
|
||||
, user = parts.join('@');
|
||||
|
||||
var lower_domain = domain.toLowerCase();
|
||||
if (lower_domain === 'gmail.com' || lower_domain === 'googlemail.com') {
|
||||
user = user.replace(/\./g, '').toLowerCase();
|
||||
}
|
||||
|
||||
if (!validator.isByteLength(user, 0, 64) ||
|
||||
!validator.isByteLength(domain, 0, 256)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!validator.isFQDN(domain, {require_tld: options.require_tld})) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (user[0] === '"') {
|
||||
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 user_parts = user.split('.');
|
||||
for (var i = 0; i < user_parts.length; i++) {
|
||||
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
|
||||
};
|
||||
|
||||
validator.isURL = function (url, options) {
|
||||
if (!url || url.length >= 2083 || /\s/.test(url)) {
|
||||
return false;
|
||||
}
|
||||
if (url.indexOf('mailto:') === 0) {
|
||||
return false;
|
||||
}
|
||||
options = merge(options, default_url_options);
|
||||
var protocol, auth, host, hostname, port,
|
||||
port_str, split;
|
||||
split = url.split('://');
|
||||
if (split.length > 1) {
|
||||
protocol = split.shift();
|
||||
if (options.require_valid_protocol && options.protocols.indexOf(protocol) === -1) {
|
||||
return false;
|
||||
}
|
||||
} else if (options.require_protocol) {
|
||||
return false;
|
||||
} else if (options.allow_protocol_relative_urls && url.substr(0, 2) === '//') {
|
||||
split[0] = url.substr(2);
|
||||
}
|
||||
url = split.join('://');
|
||||
split = url.split('#');
|
||||
url = split.shift();
|
||||
|
||||
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 ::
|
||||
|
||||
// At least some OS accept the last 32 bits of an IPv6 address
|
||||
// (i.e. 2 of the blocks) in IPv4 notation, and RFC 3493 says
|
||||
// that '::ffff:a.b.c.d' is valid for IPv4-mapped IPv6 addresses,
|
||||
// and '::a.b.c.d' is deprecated, but also valid.
|
||||
var foundIPv4TransitionBlock = validator.isIP(blocks[blocks.length - 1], 4);
|
||||
var expectedNumberOfBlocks = foundIPv4TransitionBlock ? 7 : 8;
|
||||
|
||||
if (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;
|
||||
} else {
|
||||
return blocks.length === expectedNumberOfBlocks;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
var default_fqdn_options = {
|
||||
require_tld: true
|
||||
, allow_underscores: false
|
||||
, allow_trailing_dot: false
|
||||
};
|
||||
|
||||
validator.isFQDN = function (str, options) {
|
||||
options = merge(options, default_fqdn_options);
|
||||
|
||||
/* Remove the optional trailing dot before checking validity */
|
||||
if (options.allow_trailing_dot && str[str.length - 1] === '.') {
|
||||
str = str.substring(0, str.length - 1);
|
||||
}
|
||||
var parts = str.split('.');
|
||||
if (options.require_tld) {
|
||||
var tld = parts.pop();
|
||||
if (!parts.length || !/^([a-z\u00a1-\uffff]{2,}|xn[a-z0-9-]{2,})$/i.test(tld)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
for (var part, i = 0; i < parts.length; i++) {
|
||||
part = parts[i];
|
||||
if (options.allow_underscores) {
|
||||
if (part.indexOf('__') >= 0) {
|
||||
return false;
|
||||
}
|
||||
part = part.replace(/_/g, '');
|
||||
}
|
||||
if (!/^[a-z\u00a1-\uffff0-9-]+$/i.test(part)) {
|
||||
return false;
|
||||
}
|
||||
if (/[\uff01-\uff5e]/.test(part)) {
|
||||
// disallow full-width chars
|
||||
return false;
|
||||
}
|
||||
if (part[0] === '-' || part[part.length - 1] === '-' ||
|
||||
part.indexOf('---') >= 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
validator.isBoolean = function(str) {
|
||||
return (['true', 'false', '1', '0'].indexOf(str) >= 0);
|
||||
};
|
||||
|
||||
validator.isAlpha = function (str) {
|
||||
return alpha.test(str);
|
||||
};
|
||||
|
||||
validator.isAlphanumeric = function (str) {
|
||||
return alphanumeric.test(str);
|
||||
};
|
||||
|
||||
validator.isNumeric = function (str) {
|
||||
return numeric.test(str);
|
||||
};
|
||||
|
||||
validator.isDecimal = function (str) {
|
||||
return str !== '' && decimal.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, options) {
|
||||
options = options || {};
|
||||
return int.test(str) && (!options.hasOwnProperty('min') || str >= options.min) && (!options.hasOwnProperty('max') || str <= options.max);
|
||||
};
|
||||
|
||||
validator.isFloat = function (str, options) {
|
||||
options = options || {};
|
||||
if (str === '' || str === '.') {
|
||||
return false;
|
||||
}
|
||||
return float.test(str) && (!options.hasOwnProperty('min') || str >= options.min) && (!options.hasOwnProperty('max') || str <= options.max);
|
||||
};
|
||||
|
||||
validator.isDivisibleBy = function (str, num) {
|
||||
return validator.toFloat(str) % validator.toInt(num) === 0;
|
||||
};
|
||||
|
||||
validator.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) {
|
||||
var len = encodeURI(str).split(/%..|./).length - 1;
|
||||
return len >= min && (typeof max === 'undefined' || len <= max);
|
||||
};
|
||||
|
||||
validator.isUUID = function (str, version) {
|
||||
var pattern = uuid[version ? version : 'all'];
|
||||
return pattern && pattern.test(str);
|
||||
};
|
||||
|
||||
function getTimezoneOffset(str) {
|
||||
var iso8601Parts = str.match(iso8601)
|
||||
, timezone, sign, hours, minutes;
|
||||
if (!iso8601Parts) {
|
||||
str = str.toLowerCase();
|
||||
timezone = str.match(/(?:\s|gmt\s*)(-|\+)(\d{1,4})(\s|$)/);
|
||||
if (!timezone) {
|
||||
return str.indexOf('gmt') !== -1 ? 0 : null;
|
||||
}
|
||||
sign = timezone[1];
|
||||
var offset = timezone[2];
|
||||
if (offset.length === 3) {
|
||||
offset = '0' + offset;
|
||||
}
|
||||
if (offset.length <= 2) {
|
||||
hours = 0;
|
||||
minutes = parseInt(offset);
|
||||
} else {
|
||||
hours = parseInt(offset.slice(0, 2));
|
||||
minutes = parseInt(offset.slice(2, 4));
|
||||
}
|
||||
} else {
|
||||
timezone = iso8601Parts[21];
|
||||
if (!timezone || timezone === 'z' || timezone === 'Z') {
|
||||
return 0;
|
||||
}
|
||||
sign = iso8601Parts[22];
|
||||
if (timezone.indexOf(':') !== -1) {
|
||||
hours = parseInt(iso8601Parts[23]);
|
||||
minutes = parseInt(iso8601Parts[24]);
|
||||
} else {
|
||||
hours = 0;
|
||||
minutes = parseInt(iso8601Parts[23]);
|
||||
}
|
||||
}
|
||||
return (hours * 60 + minutes) * (sign === '-' ? 1 : -1);
|
||||
}
|
||||
|
||||
validator.isDate = function (str) {
|
||||
var normalizedDate = new Date(Date.parse(str));
|
||||
if (isNaN(normalizedDate)) {
|
||||
return false;
|
||||
}
|
||||
// normalizedDate is in the user's timezone. Apply the input
|
||||
// timezone offset to the date so that the year and day match
|
||||
// the input
|
||||
var timezoneOffset = getTimezoneOffset(str);
|
||||
if (timezoneOffset !== null) {
|
||||
var timezoneDifference = normalizedDate.getTimezoneOffset() -
|
||||
timezoneOffset;
|
||||
normalizedDate = new Date(normalizedDate.getTime() +
|
||||
60000 * timezoneDifference);
|
||||
}
|
||||
var day = String(normalizedDate.getDate());
|
||||
var dayOrYear, dayOrYearMatches, year;
|
||||
//check for valid double digits that could be late days
|
||||
//check for all matches since a string like '12/23' is a valid date
|
||||
//ignore everything with nearby colons
|
||||
dayOrYearMatches = str.match(/(^|[^:\d])[23]\d([^:\d]|$)/g);
|
||||
if (!dayOrYearMatches) {
|
||||
return true;
|
||||
}
|
||||
dayOrYear = dayOrYearMatches.map(function(digitString) {
|
||||
return digitString.match(/\d+/g)[0];
|
||||
}).join('/');
|
||||
year = String(normalizedDate.getFullYear()).slice(-2);
|
||||
if (dayOrYear === day || dayOrYear === year) {
|
||||
return true;
|
||||
} else if ((dayOrYear === (day + '/' + year)) || (dayOrYear === (year + '/' + day))) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
validator.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 {
|
||||
var obj = JSON.parse(str);
|
||||
return !!obj && typeof obj === 'object';
|
||||
} catch (e) {}
|
||||
return false;
|
||||
};
|
||||
|
||||
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.isISO8601 = function (str) {
|
||||
return iso8601.test(str);
|
||||
};
|
||||
|
||||
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
node_modules/validator/validator.min.js
generated
vendored
Normal file
23
node_modules/validator/validator.min.js
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user