12902 lines
401 KiB
JavaScript
12902 lines
401 KiB
JavaScript
|
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.ZSchema = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
|
|||
|
(function (global){(function (){
|
|||
|
/**
|
|||
|
* lodash (Custom Build) <https://lodash.com/>
|
|||
|
* Build: `lodash modularize exports="npm" -o ./`
|
|||
|
* Copyright jQuery Foundation and other contributors <https://jquery.org/>
|
|||
|
* Released under MIT license <https://lodash.com/license>
|
|||
|
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
|
|||
|
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|||
|
*/
|
|||
|
|
|||
|
/** Used as the `TypeError` message for "Functions" methods. */
|
|||
|
var FUNC_ERROR_TEXT = 'Expected a function';
|
|||
|
|
|||
|
/** Used to stand-in for `undefined` hash values. */
|
|||
|
var HASH_UNDEFINED = '__lodash_hash_undefined__';
|
|||
|
|
|||
|
/** Used as references for various `Number` constants. */
|
|||
|
var INFINITY = 1 / 0;
|
|||
|
|
|||
|
/** `Object#toString` result references. */
|
|||
|
var funcTag = '[object Function]',
|
|||
|
genTag = '[object GeneratorFunction]',
|
|||
|
symbolTag = '[object Symbol]';
|
|||
|
|
|||
|
/** Used to match property names within property paths. */
|
|||
|
var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
|
|||
|
reIsPlainProp = /^\w*$/,
|
|||
|
reLeadingDot = /^\./,
|
|||
|
rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
|
|||
|
|
|||
|
/**
|
|||
|
* Used to match `RegExp`
|
|||
|
* [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
|
|||
|
*/
|
|||
|
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
|
|||
|
|
|||
|
/** Used to match backslashes in property paths. */
|
|||
|
var reEscapeChar = /\\(\\)?/g;
|
|||
|
|
|||
|
/** Used to detect host constructors (Safari). */
|
|||
|
var reIsHostCtor = /^\[object .+?Constructor\]$/;
|
|||
|
|
|||
|
/** Detect free variable `global` from Node.js. */
|
|||
|
var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
|
|||
|
|
|||
|
/** Detect free variable `self`. */
|
|||
|
var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
|
|||
|
|
|||
|
/** Used as a reference to the global object. */
|
|||
|
var root = freeGlobal || freeSelf || Function('return this')();
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the value at `key` of `object`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} [object] The object to query.
|
|||
|
* @param {string} key The key of the property to get.
|
|||
|
* @returns {*} Returns the property value.
|
|||
|
*/
|
|||
|
function getValue(object, key) {
|
|||
|
return object == null ? undefined : object[key];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is a host object in IE < 9.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is a host object, else `false`.
|
|||
|
*/
|
|||
|
function isHostObject(value) {
|
|||
|
// Many host objects are `Object` objects that can coerce to strings
|
|||
|
// despite having improperly defined `toString` methods.
|
|||
|
var result = false;
|
|||
|
if (value != null && typeof value.toString != 'function') {
|
|||
|
try {
|
|||
|
result = !!(value + '');
|
|||
|
} catch (e) {}
|
|||
|
}
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
/** Used for built-in method references. */
|
|||
|
var arrayProto = Array.prototype,
|
|||
|
funcProto = Function.prototype,
|
|||
|
objectProto = Object.prototype;
|
|||
|
|
|||
|
/** Used to detect overreaching core-js shims. */
|
|||
|
var coreJsData = root['__core-js_shared__'];
|
|||
|
|
|||
|
/** Used to detect methods masquerading as native. */
|
|||
|
var maskSrcKey = (function() {
|
|||
|
var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
|
|||
|
return uid ? ('Symbol(src)_1.' + uid) : '';
|
|||
|
}());
|
|||
|
|
|||
|
/** Used to resolve the decompiled source of functions. */
|
|||
|
var funcToString = funcProto.toString;
|
|||
|
|
|||
|
/** Used to check objects for own properties. */
|
|||
|
var hasOwnProperty = objectProto.hasOwnProperty;
|
|||
|
|
|||
|
/**
|
|||
|
* Used to resolve the
|
|||
|
* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
|
|||
|
* of values.
|
|||
|
*/
|
|||
|
var objectToString = objectProto.toString;
|
|||
|
|
|||
|
/** Used to detect if a method is native. */
|
|||
|
var reIsNative = RegExp('^' +
|
|||
|
funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
|
|||
|
.replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
|
|||
|
);
|
|||
|
|
|||
|
/** Built-in value references. */
|
|||
|
var Symbol = root.Symbol,
|
|||
|
splice = arrayProto.splice;
|
|||
|
|
|||
|
/* Built-in method references that are verified to be native. */
|
|||
|
var Map = getNative(root, 'Map'),
|
|||
|
nativeCreate = getNative(Object, 'create');
|
|||
|
|
|||
|
/** Used to convert symbols to primitives and strings. */
|
|||
|
var symbolProto = Symbol ? Symbol.prototype : undefined,
|
|||
|
symbolToString = symbolProto ? symbolProto.toString : undefined;
|
|||
|
|
|||
|
/**
|
|||
|
* Creates a hash object.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @constructor
|
|||
|
* @param {Array} [entries] The key-value pairs to cache.
|
|||
|
*/
|
|||
|
function Hash(entries) {
|
|||
|
var index = -1,
|
|||
|
length = entries ? entries.length : 0;
|
|||
|
|
|||
|
this.clear();
|
|||
|
while (++index < length) {
|
|||
|
var entry = entries[index];
|
|||
|
this.set(entry[0], entry[1]);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes all key-value entries from the hash.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name clear
|
|||
|
* @memberOf Hash
|
|||
|
*/
|
|||
|
function hashClear() {
|
|||
|
this.__data__ = nativeCreate ? nativeCreate(null) : {};
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes `key` and its value from the hash.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name delete
|
|||
|
* @memberOf Hash
|
|||
|
* @param {Object} hash The hash to modify.
|
|||
|
* @param {string} key The key of the value to remove.
|
|||
|
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
|||
|
*/
|
|||
|
function hashDelete(key) {
|
|||
|
return this.has(key) && delete this.__data__[key];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the hash value for `key`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name get
|
|||
|
* @memberOf Hash
|
|||
|
* @param {string} key The key of the value to get.
|
|||
|
* @returns {*} Returns the entry value.
|
|||
|
*/
|
|||
|
function hashGet(key) {
|
|||
|
var data = this.__data__;
|
|||
|
if (nativeCreate) {
|
|||
|
var result = data[key];
|
|||
|
return result === HASH_UNDEFINED ? undefined : result;
|
|||
|
}
|
|||
|
return hasOwnProperty.call(data, key) ? data[key] : undefined;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if a hash value for `key` exists.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name has
|
|||
|
* @memberOf Hash
|
|||
|
* @param {string} key The key of the entry to check.
|
|||
|
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
|||
|
*/
|
|||
|
function hashHas(key) {
|
|||
|
var data = this.__data__;
|
|||
|
return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Sets the hash `key` to `value`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name set
|
|||
|
* @memberOf Hash
|
|||
|
* @param {string} key The key of the value to set.
|
|||
|
* @param {*} value The value to set.
|
|||
|
* @returns {Object} Returns the hash instance.
|
|||
|
*/
|
|||
|
function hashSet(key, value) {
|
|||
|
var data = this.__data__;
|
|||
|
data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
// Add methods to `Hash`.
|
|||
|
Hash.prototype.clear = hashClear;
|
|||
|
Hash.prototype['delete'] = hashDelete;
|
|||
|
Hash.prototype.get = hashGet;
|
|||
|
Hash.prototype.has = hashHas;
|
|||
|
Hash.prototype.set = hashSet;
|
|||
|
|
|||
|
/**
|
|||
|
* Creates an list cache object.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @constructor
|
|||
|
* @param {Array} [entries] The key-value pairs to cache.
|
|||
|
*/
|
|||
|
function ListCache(entries) {
|
|||
|
var index = -1,
|
|||
|
length = entries ? entries.length : 0;
|
|||
|
|
|||
|
this.clear();
|
|||
|
while (++index < length) {
|
|||
|
var entry = entries[index];
|
|||
|
this.set(entry[0], entry[1]);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes all key-value entries from the list cache.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name clear
|
|||
|
* @memberOf ListCache
|
|||
|
*/
|
|||
|
function listCacheClear() {
|
|||
|
this.__data__ = [];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes `key` and its value from the list cache.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name delete
|
|||
|
* @memberOf ListCache
|
|||
|
* @param {string} key The key of the value to remove.
|
|||
|
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
|||
|
*/
|
|||
|
function listCacheDelete(key) {
|
|||
|
var data = this.__data__,
|
|||
|
index = assocIndexOf(data, key);
|
|||
|
|
|||
|
if (index < 0) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
var lastIndex = data.length - 1;
|
|||
|
if (index == lastIndex) {
|
|||
|
data.pop();
|
|||
|
} else {
|
|||
|
splice.call(data, index, 1);
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the list cache value for `key`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name get
|
|||
|
* @memberOf ListCache
|
|||
|
* @param {string} key The key of the value to get.
|
|||
|
* @returns {*} Returns the entry value.
|
|||
|
*/
|
|||
|
function listCacheGet(key) {
|
|||
|
var data = this.__data__,
|
|||
|
index = assocIndexOf(data, key);
|
|||
|
|
|||
|
return index < 0 ? undefined : data[index][1];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if a list cache value for `key` exists.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name has
|
|||
|
* @memberOf ListCache
|
|||
|
* @param {string} key The key of the entry to check.
|
|||
|
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
|||
|
*/
|
|||
|
function listCacheHas(key) {
|
|||
|
return assocIndexOf(this.__data__, key) > -1;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Sets the list cache `key` to `value`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name set
|
|||
|
* @memberOf ListCache
|
|||
|
* @param {string} key The key of the value to set.
|
|||
|
* @param {*} value The value to set.
|
|||
|
* @returns {Object} Returns the list cache instance.
|
|||
|
*/
|
|||
|
function listCacheSet(key, value) {
|
|||
|
var data = this.__data__,
|
|||
|
index = assocIndexOf(data, key);
|
|||
|
|
|||
|
if (index < 0) {
|
|||
|
data.push([key, value]);
|
|||
|
} else {
|
|||
|
data[index][1] = value;
|
|||
|
}
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
// Add methods to `ListCache`.
|
|||
|
ListCache.prototype.clear = listCacheClear;
|
|||
|
ListCache.prototype['delete'] = listCacheDelete;
|
|||
|
ListCache.prototype.get = listCacheGet;
|
|||
|
ListCache.prototype.has = listCacheHas;
|
|||
|
ListCache.prototype.set = listCacheSet;
|
|||
|
|
|||
|
/**
|
|||
|
* Creates a map cache object to store key-value pairs.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @constructor
|
|||
|
* @param {Array} [entries] The key-value pairs to cache.
|
|||
|
*/
|
|||
|
function MapCache(entries) {
|
|||
|
var index = -1,
|
|||
|
length = entries ? entries.length : 0;
|
|||
|
|
|||
|
this.clear();
|
|||
|
while (++index < length) {
|
|||
|
var entry = entries[index];
|
|||
|
this.set(entry[0], entry[1]);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes all key-value entries from the map.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name clear
|
|||
|
* @memberOf MapCache
|
|||
|
*/
|
|||
|
function mapCacheClear() {
|
|||
|
this.__data__ = {
|
|||
|
'hash': new Hash,
|
|||
|
'map': new (Map || ListCache),
|
|||
|
'string': new Hash
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes `key` and its value from the map.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name delete
|
|||
|
* @memberOf MapCache
|
|||
|
* @param {string} key The key of the value to remove.
|
|||
|
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
|||
|
*/
|
|||
|
function mapCacheDelete(key) {
|
|||
|
return getMapData(this, key)['delete'](key);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the map value for `key`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name get
|
|||
|
* @memberOf MapCache
|
|||
|
* @param {string} key The key of the value to get.
|
|||
|
* @returns {*} Returns the entry value.
|
|||
|
*/
|
|||
|
function mapCacheGet(key) {
|
|||
|
return getMapData(this, key).get(key);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if a map value for `key` exists.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name has
|
|||
|
* @memberOf MapCache
|
|||
|
* @param {string} key The key of the entry to check.
|
|||
|
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
|||
|
*/
|
|||
|
function mapCacheHas(key) {
|
|||
|
return getMapData(this, key).has(key);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Sets the map `key` to `value`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name set
|
|||
|
* @memberOf MapCache
|
|||
|
* @param {string} key The key of the value to set.
|
|||
|
* @param {*} value The value to set.
|
|||
|
* @returns {Object} Returns the map cache instance.
|
|||
|
*/
|
|||
|
function mapCacheSet(key, value) {
|
|||
|
getMapData(this, key).set(key, value);
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
// Add methods to `MapCache`.
|
|||
|
MapCache.prototype.clear = mapCacheClear;
|
|||
|
MapCache.prototype['delete'] = mapCacheDelete;
|
|||
|
MapCache.prototype.get = mapCacheGet;
|
|||
|
MapCache.prototype.has = mapCacheHas;
|
|||
|
MapCache.prototype.set = mapCacheSet;
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the index at which the `key` is found in `array` of key-value pairs.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Array} array The array to inspect.
|
|||
|
* @param {*} key The key to search for.
|
|||
|
* @returns {number} Returns the index of the matched value, else `-1`.
|
|||
|
*/
|
|||
|
function assocIndexOf(array, key) {
|
|||
|
var length = array.length;
|
|||
|
while (length--) {
|
|||
|
if (eq(array[length][0], key)) {
|
|||
|
return length;
|
|||
|
}
|
|||
|
}
|
|||
|
return -1;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* The base implementation of `_.get` without support for default values.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} object The object to query.
|
|||
|
* @param {Array|string} path The path of the property to get.
|
|||
|
* @returns {*} Returns the resolved value.
|
|||
|
*/
|
|||
|
function baseGet(object, path) {
|
|||
|
path = isKey(path, object) ? [path] : castPath(path);
|
|||
|
|
|||
|
var index = 0,
|
|||
|
length = path.length;
|
|||
|
|
|||
|
while (object != null && index < length) {
|
|||
|
object = object[toKey(path[index++])];
|
|||
|
}
|
|||
|
return (index && index == length) ? object : undefined;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* The base implementation of `_.isNative` without bad shim checks.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is a native function,
|
|||
|
* else `false`.
|
|||
|
*/
|
|||
|
function baseIsNative(value) {
|
|||
|
if (!isObject(value) || isMasked(value)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;
|
|||
|
return pattern.test(toSource(value));
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* The base implementation of `_.toString` which doesn't convert nullish
|
|||
|
* values to empty strings.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to process.
|
|||
|
* @returns {string} Returns the string.
|
|||
|
*/
|
|||
|
function baseToString(value) {
|
|||
|
// Exit early for strings to avoid a performance hit in some environments.
|
|||
|
if (typeof value == 'string') {
|
|||
|
return value;
|
|||
|
}
|
|||
|
if (isSymbol(value)) {
|
|||
|
return symbolToString ? symbolToString.call(value) : '';
|
|||
|
}
|
|||
|
var result = (value + '');
|
|||
|
return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Casts `value` to a path array if it's not one.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to inspect.
|
|||
|
* @returns {Array} Returns the cast property path array.
|
|||
|
*/
|
|||
|
function castPath(value) {
|
|||
|
return isArray(value) ? value : stringToPath(value);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the data for `map`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} map The map to query.
|
|||
|
* @param {string} key The reference key.
|
|||
|
* @returns {*} Returns the map data.
|
|||
|
*/
|
|||
|
function getMapData(map, key) {
|
|||
|
var data = map.__data__;
|
|||
|
return isKeyable(key)
|
|||
|
? data[typeof key == 'string' ? 'string' : 'hash']
|
|||
|
: data.map;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the native function at `key` of `object`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} object The object to query.
|
|||
|
* @param {string} key The key of the method to get.
|
|||
|
* @returns {*} Returns the function if it's native, else `undefined`.
|
|||
|
*/
|
|||
|
function getNative(object, key) {
|
|||
|
var value = getValue(object, key);
|
|||
|
return baseIsNative(value) ? value : undefined;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is a property name and not a property path.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @param {Object} [object] The object to query keys on.
|
|||
|
* @returns {boolean} Returns `true` if `value` is a property name, else `false`.
|
|||
|
*/
|
|||
|
function isKey(value, object) {
|
|||
|
if (isArray(value)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
var type = typeof value;
|
|||
|
if (type == 'number' || type == 'symbol' || type == 'boolean' ||
|
|||
|
value == null || isSymbol(value)) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
|
|||
|
(object != null && value in Object(object));
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is suitable for use as unique object key.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is suitable, else `false`.
|
|||
|
*/
|
|||
|
function isKeyable(value) {
|
|||
|
var type = typeof value;
|
|||
|
return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
|
|||
|
? (value !== '__proto__')
|
|||
|
: (value === null);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `func` has its source masked.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Function} func The function to check.
|
|||
|
* @returns {boolean} Returns `true` if `func` is masked, else `false`.
|
|||
|
*/
|
|||
|
function isMasked(func) {
|
|||
|
return !!maskSrcKey && (maskSrcKey in func);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Converts `string` to a property path array.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {string} string The string to convert.
|
|||
|
* @returns {Array} Returns the property path array.
|
|||
|
*/
|
|||
|
var stringToPath = memoize(function(string) {
|
|||
|
string = toString(string);
|
|||
|
|
|||
|
var result = [];
|
|||
|
if (reLeadingDot.test(string)) {
|
|||
|
result.push('');
|
|||
|
}
|
|||
|
string.replace(rePropName, function(match, number, quote, string) {
|
|||
|
result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));
|
|||
|
});
|
|||
|
return result;
|
|||
|
});
|
|||
|
|
|||
|
/**
|
|||
|
* Converts `value` to a string key if it's not a string or symbol.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to inspect.
|
|||
|
* @returns {string|symbol} Returns the key.
|
|||
|
*/
|
|||
|
function toKey(value) {
|
|||
|
if (typeof value == 'string' || isSymbol(value)) {
|
|||
|
return value;
|
|||
|
}
|
|||
|
var result = (value + '');
|
|||
|
return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Converts `func` to its source code.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Function} func The function to process.
|
|||
|
* @returns {string} Returns the source code.
|
|||
|
*/
|
|||
|
function toSource(func) {
|
|||
|
if (func != null) {
|
|||
|
try {
|
|||
|
return funcToString.call(func);
|
|||
|
} catch (e) {}
|
|||
|
try {
|
|||
|
return (func + '');
|
|||
|
} catch (e) {}
|
|||
|
}
|
|||
|
return '';
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Creates a function that memoizes the result of `func`. If `resolver` is
|
|||
|
* provided, it determines the cache key for storing the result based on the
|
|||
|
* arguments provided to the memoized function. By default, the first argument
|
|||
|
* provided to the memoized function is used as the map cache key. The `func`
|
|||
|
* is invoked with the `this` binding of the memoized function.
|
|||
|
*
|
|||
|
* **Note:** The cache is exposed as the `cache` property on the memoized
|
|||
|
* function. Its creation may be customized by replacing the `_.memoize.Cache`
|
|||
|
* constructor with one whose instances implement the
|
|||
|
* [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
|
|||
|
* method interface of `delete`, `get`, `has`, and `set`.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 0.1.0
|
|||
|
* @category Function
|
|||
|
* @param {Function} func The function to have its output memoized.
|
|||
|
* @param {Function} [resolver] The function to resolve the cache key.
|
|||
|
* @returns {Function} Returns the new memoized function.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* var object = { 'a': 1, 'b': 2 };
|
|||
|
* var other = { 'c': 3, 'd': 4 };
|
|||
|
*
|
|||
|
* var values = _.memoize(_.values);
|
|||
|
* values(object);
|
|||
|
* // => [1, 2]
|
|||
|
*
|
|||
|
* values(other);
|
|||
|
* // => [3, 4]
|
|||
|
*
|
|||
|
* object.a = 2;
|
|||
|
* values(object);
|
|||
|
* // => [1, 2]
|
|||
|
*
|
|||
|
* // Modify the result cache.
|
|||
|
* values.cache.set(object, ['a', 'b']);
|
|||
|
* values(object);
|
|||
|
* // => ['a', 'b']
|
|||
|
*
|
|||
|
* // Replace `_.memoize.Cache`.
|
|||
|
* _.memoize.Cache = WeakMap;
|
|||
|
*/
|
|||
|
function memoize(func, resolver) {
|
|||
|
if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {
|
|||
|
throw new TypeError(FUNC_ERROR_TEXT);
|
|||
|
}
|
|||
|
var memoized = function() {
|
|||
|
var args = arguments,
|
|||
|
key = resolver ? resolver.apply(this, args) : args[0],
|
|||
|
cache = memoized.cache;
|
|||
|
|
|||
|
if (cache.has(key)) {
|
|||
|
return cache.get(key);
|
|||
|
}
|
|||
|
var result = func.apply(this, args);
|
|||
|
memoized.cache = cache.set(key, result);
|
|||
|
return result;
|
|||
|
};
|
|||
|
memoized.cache = new (memoize.Cache || MapCache);
|
|||
|
return memoized;
|
|||
|
}
|
|||
|
|
|||
|
// Assign cache to `_.memoize`.
|
|||
|
memoize.Cache = MapCache;
|
|||
|
|
|||
|
/**
|
|||
|
* Performs a
|
|||
|
* [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
|
|||
|
* comparison between two values to determine if they are equivalent.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 4.0.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to compare.
|
|||
|
* @param {*} other The other value to compare.
|
|||
|
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* var object = { 'a': 1 };
|
|||
|
* var other = { 'a': 1 };
|
|||
|
*
|
|||
|
* _.eq(object, object);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.eq(object, other);
|
|||
|
* // => false
|
|||
|
*
|
|||
|
* _.eq('a', 'a');
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.eq('a', Object('a'));
|
|||
|
* // => false
|
|||
|
*
|
|||
|
* _.eq(NaN, NaN);
|
|||
|
* // => true
|
|||
|
*/
|
|||
|
function eq(value, other) {
|
|||
|
return value === other || (value !== value && other !== other);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is classified as an `Array` object.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 0.1.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is an array, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isArray([1, 2, 3]);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isArray(document.body.children);
|
|||
|
* // => false
|
|||
|
*
|
|||
|
* _.isArray('abc');
|
|||
|
* // => false
|
|||
|
*
|
|||
|
* _.isArray(_.noop);
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
var isArray = Array.isArray;
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is classified as a `Function` object.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 0.1.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is a function, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isFunction(_);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isFunction(/abc/);
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
function isFunction(value) {
|
|||
|
// The use of `Object#toString` avoids issues with the `typeof` operator
|
|||
|
// in Safari 8-9 which returns 'object' for typed array and other constructors.
|
|||
|
var tag = isObject(value) ? objectToString.call(value) : '';
|
|||
|
return tag == funcTag || tag == genTag;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is the
|
|||
|
* [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
|
|||
|
* of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 0.1.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is an object, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isObject({});
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isObject([1, 2, 3]);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isObject(_.noop);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isObject(null);
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
function isObject(value) {
|
|||
|
var type = typeof value;
|
|||
|
return !!value && (type == 'object' || type == 'function');
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is object-like. A value is object-like if it's not `null`
|
|||
|
* and has a `typeof` result of "object".
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 4.0.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is object-like, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isObjectLike({});
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isObjectLike([1, 2, 3]);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isObjectLike(_.noop);
|
|||
|
* // => false
|
|||
|
*
|
|||
|
* _.isObjectLike(null);
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
function isObjectLike(value) {
|
|||
|
return !!value && typeof value == 'object';
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is classified as a `Symbol` primitive or object.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 4.0.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isSymbol(Symbol.iterator);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isSymbol('abc');
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
function isSymbol(value) {
|
|||
|
return typeof value == 'symbol' ||
|
|||
|
(isObjectLike(value) && objectToString.call(value) == symbolTag);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Converts `value` to a string. An empty string is returned for `null`
|
|||
|
* and `undefined` values. The sign of `-0` is preserved.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 4.0.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to process.
|
|||
|
* @returns {string} Returns the string.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.toString(null);
|
|||
|
* // => ''
|
|||
|
*
|
|||
|
* _.toString(-0);
|
|||
|
* // => '-0'
|
|||
|
*
|
|||
|
* _.toString([1, 2, 3]);
|
|||
|
* // => '1,2,3'
|
|||
|
*/
|
|||
|
function toString(value) {
|
|||
|
return value == null ? '' : baseToString(value);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the value at `path` of `object`. If the resolved value is
|
|||
|
* `undefined`, the `defaultValue` is returned in its place.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 3.7.0
|
|||
|
* @category Object
|
|||
|
* @param {Object} object The object to query.
|
|||
|
* @param {Array|string} path The path of the property to get.
|
|||
|
* @param {*} [defaultValue] The value returned for `undefined` resolved values.
|
|||
|
* @returns {*} Returns the resolved value.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* var object = { 'a': [{ 'b': { 'c': 3 } }] };
|
|||
|
*
|
|||
|
* _.get(object, 'a[0].b.c');
|
|||
|
* // => 3
|
|||
|
*
|
|||
|
* _.get(object, ['a', '0', 'b', 'c']);
|
|||
|
* // => 3
|
|||
|
*
|
|||
|
* _.get(object, 'a.b.c', 'default');
|
|||
|
* // => 'default'
|
|||
|
*/
|
|||
|
function get(object, path, defaultValue) {
|
|||
|
var result = object == null ? undefined : baseGet(object, path);
|
|||
|
return result === undefined ? defaultValue : result;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = get;
|
|||
|
|
|||
|
}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|||
|
},{}],2:[function(require,module,exports){
|
|||
|
(function (global){(function (){
|
|||
|
/**
|
|||
|
* Lodash (Custom Build) <https://lodash.com/>
|
|||
|
* Build: `lodash modularize exports="npm" -o ./`
|
|||
|
* Copyright JS Foundation and other contributors <https://js.foundation/>
|
|||
|
* Released under MIT license <https://lodash.com/license>
|
|||
|
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
|
|||
|
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|||
|
*/
|
|||
|
|
|||
|
/** Used as the size to enable large array optimizations. */
|
|||
|
var LARGE_ARRAY_SIZE = 200;
|
|||
|
|
|||
|
/** Used to stand-in for `undefined` hash values. */
|
|||
|
var HASH_UNDEFINED = '__lodash_hash_undefined__';
|
|||
|
|
|||
|
/** Used to compose bitmasks for value comparisons. */
|
|||
|
var COMPARE_PARTIAL_FLAG = 1,
|
|||
|
COMPARE_UNORDERED_FLAG = 2;
|
|||
|
|
|||
|
/** Used as references for various `Number` constants. */
|
|||
|
var MAX_SAFE_INTEGER = 9007199254740991;
|
|||
|
|
|||
|
/** `Object#toString` result references. */
|
|||
|
var argsTag = '[object Arguments]',
|
|||
|
arrayTag = '[object Array]',
|
|||
|
asyncTag = '[object AsyncFunction]',
|
|||
|
boolTag = '[object Boolean]',
|
|||
|
dateTag = '[object Date]',
|
|||
|
errorTag = '[object Error]',
|
|||
|
funcTag = '[object Function]',
|
|||
|
genTag = '[object GeneratorFunction]',
|
|||
|
mapTag = '[object Map]',
|
|||
|
numberTag = '[object Number]',
|
|||
|
nullTag = '[object Null]',
|
|||
|
objectTag = '[object Object]',
|
|||
|
promiseTag = '[object Promise]',
|
|||
|
proxyTag = '[object Proxy]',
|
|||
|
regexpTag = '[object RegExp]',
|
|||
|
setTag = '[object Set]',
|
|||
|
stringTag = '[object String]',
|
|||
|
symbolTag = '[object Symbol]',
|
|||
|
undefinedTag = '[object Undefined]',
|
|||
|
weakMapTag = '[object WeakMap]';
|
|||
|
|
|||
|
var arrayBufferTag = '[object ArrayBuffer]',
|
|||
|
dataViewTag = '[object DataView]',
|
|||
|
float32Tag = '[object Float32Array]',
|
|||
|
float64Tag = '[object Float64Array]',
|
|||
|
int8Tag = '[object Int8Array]',
|
|||
|
int16Tag = '[object Int16Array]',
|
|||
|
int32Tag = '[object Int32Array]',
|
|||
|
uint8Tag = '[object Uint8Array]',
|
|||
|
uint8ClampedTag = '[object Uint8ClampedArray]',
|
|||
|
uint16Tag = '[object Uint16Array]',
|
|||
|
uint32Tag = '[object Uint32Array]';
|
|||
|
|
|||
|
/**
|
|||
|
* Used to match `RegExp`
|
|||
|
* [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
|
|||
|
*/
|
|||
|
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
|
|||
|
|
|||
|
/** Used to detect host constructors (Safari). */
|
|||
|
var reIsHostCtor = /^\[object .+?Constructor\]$/;
|
|||
|
|
|||
|
/** Used to detect unsigned integer values. */
|
|||
|
var reIsUint = /^(?:0|[1-9]\d*)$/;
|
|||
|
|
|||
|
/** Used to identify `toStringTag` values of typed arrays. */
|
|||
|
var typedArrayTags = {};
|
|||
|
typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
|
|||
|
typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
|
|||
|
typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
|
|||
|
typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
|
|||
|
typedArrayTags[uint32Tag] = true;
|
|||
|
typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
|
|||
|
typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
|
|||
|
typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
|
|||
|
typedArrayTags[errorTag] = typedArrayTags[funcTag] =
|
|||
|
typedArrayTags[mapTag] = typedArrayTags[numberTag] =
|
|||
|
typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
|
|||
|
typedArrayTags[setTag] = typedArrayTags[stringTag] =
|
|||
|
typedArrayTags[weakMapTag] = false;
|
|||
|
|
|||
|
/** Detect free variable `global` from Node.js. */
|
|||
|
var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
|
|||
|
|
|||
|
/** Detect free variable `self`. */
|
|||
|
var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
|
|||
|
|
|||
|
/** Used as a reference to the global object. */
|
|||
|
var root = freeGlobal || freeSelf || Function('return this')();
|
|||
|
|
|||
|
/** Detect free variable `exports`. */
|
|||
|
var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
|
|||
|
|
|||
|
/** Detect free variable `module`. */
|
|||
|
var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
|
|||
|
|
|||
|
/** Detect the popular CommonJS extension `module.exports`. */
|
|||
|
var moduleExports = freeModule && freeModule.exports === freeExports;
|
|||
|
|
|||
|
/** Detect free variable `process` from Node.js. */
|
|||
|
var freeProcess = moduleExports && freeGlobal.process;
|
|||
|
|
|||
|
/** Used to access faster Node.js helpers. */
|
|||
|
var nodeUtil = (function() {
|
|||
|
try {
|
|||
|
return freeProcess && freeProcess.binding && freeProcess.binding('util');
|
|||
|
} catch (e) {}
|
|||
|
}());
|
|||
|
|
|||
|
/* Node.js helper references. */
|
|||
|
var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
|
|||
|
|
|||
|
/**
|
|||
|
* A specialized version of `_.filter` for arrays without support for
|
|||
|
* iteratee shorthands.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Array} [array] The array to iterate over.
|
|||
|
* @param {Function} predicate The function invoked per iteration.
|
|||
|
* @returns {Array} Returns the new filtered array.
|
|||
|
*/
|
|||
|
function arrayFilter(array, predicate) {
|
|||
|
var index = -1,
|
|||
|
length = array == null ? 0 : array.length,
|
|||
|
resIndex = 0,
|
|||
|
result = [];
|
|||
|
|
|||
|
while (++index < length) {
|
|||
|
var value = array[index];
|
|||
|
if (predicate(value, index, array)) {
|
|||
|
result[resIndex++] = value;
|
|||
|
}
|
|||
|
}
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Appends the elements of `values` to `array`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Array} array The array to modify.
|
|||
|
* @param {Array} values The values to append.
|
|||
|
* @returns {Array} Returns `array`.
|
|||
|
*/
|
|||
|
function arrayPush(array, values) {
|
|||
|
var index = -1,
|
|||
|
length = values.length,
|
|||
|
offset = array.length;
|
|||
|
|
|||
|
while (++index < length) {
|
|||
|
array[offset + index] = values[index];
|
|||
|
}
|
|||
|
return array;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* A specialized version of `_.some` for arrays without support for iteratee
|
|||
|
* shorthands.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Array} [array] The array to iterate over.
|
|||
|
* @param {Function} predicate The function invoked per iteration.
|
|||
|
* @returns {boolean} Returns `true` if any element passes the predicate check,
|
|||
|
* else `false`.
|
|||
|
*/
|
|||
|
function arraySome(array, predicate) {
|
|||
|
var index = -1,
|
|||
|
length = array == null ? 0 : array.length;
|
|||
|
|
|||
|
while (++index < length) {
|
|||
|
if (predicate(array[index], index, array)) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* The base implementation of `_.times` without support for iteratee shorthands
|
|||
|
* or max array length checks.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {number} n The number of times to invoke `iteratee`.
|
|||
|
* @param {Function} iteratee The function invoked per iteration.
|
|||
|
* @returns {Array} Returns the array of results.
|
|||
|
*/
|
|||
|
function baseTimes(n, iteratee) {
|
|||
|
var index = -1,
|
|||
|
result = Array(n);
|
|||
|
|
|||
|
while (++index < n) {
|
|||
|
result[index] = iteratee(index);
|
|||
|
}
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* The base implementation of `_.unary` without support for storing metadata.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Function} func The function to cap arguments for.
|
|||
|
* @returns {Function} Returns the new capped function.
|
|||
|
*/
|
|||
|
function baseUnary(func) {
|
|||
|
return function(value) {
|
|||
|
return func(value);
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if a `cache` value for `key` exists.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} cache The cache to query.
|
|||
|
* @param {string} key The key of the entry to check.
|
|||
|
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
|||
|
*/
|
|||
|
function cacheHas(cache, key) {
|
|||
|
return cache.has(key);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the value at `key` of `object`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} [object] The object to query.
|
|||
|
* @param {string} key The key of the property to get.
|
|||
|
* @returns {*} Returns the property value.
|
|||
|
*/
|
|||
|
function getValue(object, key) {
|
|||
|
return object == null ? undefined : object[key];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Converts `map` to its key-value pairs.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} map The map to convert.
|
|||
|
* @returns {Array} Returns the key-value pairs.
|
|||
|
*/
|
|||
|
function mapToArray(map) {
|
|||
|
var index = -1,
|
|||
|
result = Array(map.size);
|
|||
|
|
|||
|
map.forEach(function(value, key) {
|
|||
|
result[++index] = [key, value];
|
|||
|
});
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Creates a unary function that invokes `func` with its argument transformed.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Function} func The function to wrap.
|
|||
|
* @param {Function} transform The argument transform.
|
|||
|
* @returns {Function} Returns the new function.
|
|||
|
*/
|
|||
|
function overArg(func, transform) {
|
|||
|
return function(arg) {
|
|||
|
return func(transform(arg));
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Converts `set` to an array of its values.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} set The set to convert.
|
|||
|
* @returns {Array} Returns the values.
|
|||
|
*/
|
|||
|
function setToArray(set) {
|
|||
|
var index = -1,
|
|||
|
result = Array(set.size);
|
|||
|
|
|||
|
set.forEach(function(value) {
|
|||
|
result[++index] = value;
|
|||
|
});
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
/** Used for built-in method references. */
|
|||
|
var arrayProto = Array.prototype,
|
|||
|
funcProto = Function.prototype,
|
|||
|
objectProto = Object.prototype;
|
|||
|
|
|||
|
/** Used to detect overreaching core-js shims. */
|
|||
|
var coreJsData = root['__core-js_shared__'];
|
|||
|
|
|||
|
/** Used to resolve the decompiled source of functions. */
|
|||
|
var funcToString = funcProto.toString;
|
|||
|
|
|||
|
/** Used to check objects for own properties. */
|
|||
|
var hasOwnProperty = objectProto.hasOwnProperty;
|
|||
|
|
|||
|
/** Used to detect methods masquerading as native. */
|
|||
|
var maskSrcKey = (function() {
|
|||
|
var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
|
|||
|
return uid ? ('Symbol(src)_1.' + uid) : '';
|
|||
|
}());
|
|||
|
|
|||
|
/**
|
|||
|
* Used to resolve the
|
|||
|
* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
|
|||
|
* of values.
|
|||
|
*/
|
|||
|
var nativeObjectToString = objectProto.toString;
|
|||
|
|
|||
|
/** Used to detect if a method is native. */
|
|||
|
var reIsNative = RegExp('^' +
|
|||
|
funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
|
|||
|
.replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
|
|||
|
);
|
|||
|
|
|||
|
/** Built-in value references. */
|
|||
|
var Buffer = moduleExports ? root.Buffer : undefined,
|
|||
|
Symbol = root.Symbol,
|
|||
|
Uint8Array = root.Uint8Array,
|
|||
|
propertyIsEnumerable = objectProto.propertyIsEnumerable,
|
|||
|
splice = arrayProto.splice,
|
|||
|
symToStringTag = Symbol ? Symbol.toStringTag : undefined;
|
|||
|
|
|||
|
/* Built-in method references for those with the same name as other `lodash` methods. */
|
|||
|
var nativeGetSymbols = Object.getOwnPropertySymbols,
|
|||
|
nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,
|
|||
|
nativeKeys = overArg(Object.keys, Object);
|
|||
|
|
|||
|
/* Built-in method references that are verified to be native. */
|
|||
|
var DataView = getNative(root, 'DataView'),
|
|||
|
Map = getNative(root, 'Map'),
|
|||
|
Promise = getNative(root, 'Promise'),
|
|||
|
Set = getNative(root, 'Set'),
|
|||
|
WeakMap = getNative(root, 'WeakMap'),
|
|||
|
nativeCreate = getNative(Object, 'create');
|
|||
|
|
|||
|
/** Used to detect maps, sets, and weakmaps. */
|
|||
|
var dataViewCtorString = toSource(DataView),
|
|||
|
mapCtorString = toSource(Map),
|
|||
|
promiseCtorString = toSource(Promise),
|
|||
|
setCtorString = toSource(Set),
|
|||
|
weakMapCtorString = toSource(WeakMap);
|
|||
|
|
|||
|
/** Used to convert symbols to primitives and strings. */
|
|||
|
var symbolProto = Symbol ? Symbol.prototype : undefined,
|
|||
|
symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
|
|||
|
|
|||
|
/**
|
|||
|
* Creates a hash object.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @constructor
|
|||
|
* @param {Array} [entries] The key-value pairs to cache.
|
|||
|
*/
|
|||
|
function Hash(entries) {
|
|||
|
var index = -1,
|
|||
|
length = entries == null ? 0 : entries.length;
|
|||
|
|
|||
|
this.clear();
|
|||
|
while (++index < length) {
|
|||
|
var entry = entries[index];
|
|||
|
this.set(entry[0], entry[1]);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes all key-value entries from the hash.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name clear
|
|||
|
* @memberOf Hash
|
|||
|
*/
|
|||
|
function hashClear() {
|
|||
|
this.__data__ = nativeCreate ? nativeCreate(null) : {};
|
|||
|
this.size = 0;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes `key` and its value from the hash.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name delete
|
|||
|
* @memberOf Hash
|
|||
|
* @param {Object} hash The hash to modify.
|
|||
|
* @param {string} key The key of the value to remove.
|
|||
|
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
|||
|
*/
|
|||
|
function hashDelete(key) {
|
|||
|
var result = this.has(key) && delete this.__data__[key];
|
|||
|
this.size -= result ? 1 : 0;
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the hash value for `key`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name get
|
|||
|
* @memberOf Hash
|
|||
|
* @param {string} key The key of the value to get.
|
|||
|
* @returns {*} Returns the entry value.
|
|||
|
*/
|
|||
|
function hashGet(key) {
|
|||
|
var data = this.__data__;
|
|||
|
if (nativeCreate) {
|
|||
|
var result = data[key];
|
|||
|
return result === HASH_UNDEFINED ? undefined : result;
|
|||
|
}
|
|||
|
return hasOwnProperty.call(data, key) ? data[key] : undefined;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if a hash value for `key` exists.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name has
|
|||
|
* @memberOf Hash
|
|||
|
* @param {string} key The key of the entry to check.
|
|||
|
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
|||
|
*/
|
|||
|
function hashHas(key) {
|
|||
|
var data = this.__data__;
|
|||
|
return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Sets the hash `key` to `value`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name set
|
|||
|
* @memberOf Hash
|
|||
|
* @param {string} key The key of the value to set.
|
|||
|
* @param {*} value The value to set.
|
|||
|
* @returns {Object} Returns the hash instance.
|
|||
|
*/
|
|||
|
function hashSet(key, value) {
|
|||
|
var data = this.__data__;
|
|||
|
this.size += this.has(key) ? 0 : 1;
|
|||
|
data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
// Add methods to `Hash`.
|
|||
|
Hash.prototype.clear = hashClear;
|
|||
|
Hash.prototype['delete'] = hashDelete;
|
|||
|
Hash.prototype.get = hashGet;
|
|||
|
Hash.prototype.has = hashHas;
|
|||
|
Hash.prototype.set = hashSet;
|
|||
|
|
|||
|
/**
|
|||
|
* Creates an list cache object.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @constructor
|
|||
|
* @param {Array} [entries] The key-value pairs to cache.
|
|||
|
*/
|
|||
|
function ListCache(entries) {
|
|||
|
var index = -1,
|
|||
|
length = entries == null ? 0 : entries.length;
|
|||
|
|
|||
|
this.clear();
|
|||
|
while (++index < length) {
|
|||
|
var entry = entries[index];
|
|||
|
this.set(entry[0], entry[1]);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes all key-value entries from the list cache.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name clear
|
|||
|
* @memberOf ListCache
|
|||
|
*/
|
|||
|
function listCacheClear() {
|
|||
|
this.__data__ = [];
|
|||
|
this.size = 0;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes `key` and its value from the list cache.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name delete
|
|||
|
* @memberOf ListCache
|
|||
|
* @param {string} key The key of the value to remove.
|
|||
|
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
|||
|
*/
|
|||
|
function listCacheDelete(key) {
|
|||
|
var data = this.__data__,
|
|||
|
index = assocIndexOf(data, key);
|
|||
|
|
|||
|
if (index < 0) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
var lastIndex = data.length - 1;
|
|||
|
if (index == lastIndex) {
|
|||
|
data.pop();
|
|||
|
} else {
|
|||
|
splice.call(data, index, 1);
|
|||
|
}
|
|||
|
--this.size;
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the list cache value for `key`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name get
|
|||
|
* @memberOf ListCache
|
|||
|
* @param {string} key The key of the value to get.
|
|||
|
* @returns {*} Returns the entry value.
|
|||
|
*/
|
|||
|
function listCacheGet(key) {
|
|||
|
var data = this.__data__,
|
|||
|
index = assocIndexOf(data, key);
|
|||
|
|
|||
|
return index < 0 ? undefined : data[index][1];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if a list cache value for `key` exists.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name has
|
|||
|
* @memberOf ListCache
|
|||
|
* @param {string} key The key of the entry to check.
|
|||
|
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
|||
|
*/
|
|||
|
function listCacheHas(key) {
|
|||
|
return assocIndexOf(this.__data__, key) > -1;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Sets the list cache `key` to `value`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name set
|
|||
|
* @memberOf ListCache
|
|||
|
* @param {string} key The key of the value to set.
|
|||
|
* @param {*} value The value to set.
|
|||
|
* @returns {Object} Returns the list cache instance.
|
|||
|
*/
|
|||
|
function listCacheSet(key, value) {
|
|||
|
var data = this.__data__,
|
|||
|
index = assocIndexOf(data, key);
|
|||
|
|
|||
|
if (index < 0) {
|
|||
|
++this.size;
|
|||
|
data.push([key, value]);
|
|||
|
} else {
|
|||
|
data[index][1] = value;
|
|||
|
}
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
// Add methods to `ListCache`.
|
|||
|
ListCache.prototype.clear = listCacheClear;
|
|||
|
ListCache.prototype['delete'] = listCacheDelete;
|
|||
|
ListCache.prototype.get = listCacheGet;
|
|||
|
ListCache.prototype.has = listCacheHas;
|
|||
|
ListCache.prototype.set = listCacheSet;
|
|||
|
|
|||
|
/**
|
|||
|
* Creates a map cache object to store key-value pairs.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @constructor
|
|||
|
* @param {Array} [entries] The key-value pairs to cache.
|
|||
|
*/
|
|||
|
function MapCache(entries) {
|
|||
|
var index = -1,
|
|||
|
length = entries == null ? 0 : entries.length;
|
|||
|
|
|||
|
this.clear();
|
|||
|
while (++index < length) {
|
|||
|
var entry = entries[index];
|
|||
|
this.set(entry[0], entry[1]);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes all key-value entries from the map.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name clear
|
|||
|
* @memberOf MapCache
|
|||
|
*/
|
|||
|
function mapCacheClear() {
|
|||
|
this.size = 0;
|
|||
|
this.__data__ = {
|
|||
|
'hash': new Hash,
|
|||
|
'map': new (Map || ListCache),
|
|||
|
'string': new Hash
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes `key` and its value from the map.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name delete
|
|||
|
* @memberOf MapCache
|
|||
|
* @param {string} key The key of the value to remove.
|
|||
|
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
|||
|
*/
|
|||
|
function mapCacheDelete(key) {
|
|||
|
var result = getMapData(this, key)['delete'](key);
|
|||
|
this.size -= result ? 1 : 0;
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the map value for `key`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name get
|
|||
|
* @memberOf MapCache
|
|||
|
* @param {string} key The key of the value to get.
|
|||
|
* @returns {*} Returns the entry value.
|
|||
|
*/
|
|||
|
function mapCacheGet(key) {
|
|||
|
return getMapData(this, key).get(key);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if a map value for `key` exists.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name has
|
|||
|
* @memberOf MapCache
|
|||
|
* @param {string} key The key of the entry to check.
|
|||
|
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
|||
|
*/
|
|||
|
function mapCacheHas(key) {
|
|||
|
return getMapData(this, key).has(key);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Sets the map `key` to `value`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name set
|
|||
|
* @memberOf MapCache
|
|||
|
* @param {string} key The key of the value to set.
|
|||
|
* @param {*} value The value to set.
|
|||
|
* @returns {Object} Returns the map cache instance.
|
|||
|
*/
|
|||
|
function mapCacheSet(key, value) {
|
|||
|
var data = getMapData(this, key),
|
|||
|
size = data.size;
|
|||
|
|
|||
|
data.set(key, value);
|
|||
|
this.size += data.size == size ? 0 : 1;
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
// Add methods to `MapCache`.
|
|||
|
MapCache.prototype.clear = mapCacheClear;
|
|||
|
MapCache.prototype['delete'] = mapCacheDelete;
|
|||
|
MapCache.prototype.get = mapCacheGet;
|
|||
|
MapCache.prototype.has = mapCacheHas;
|
|||
|
MapCache.prototype.set = mapCacheSet;
|
|||
|
|
|||
|
/**
|
|||
|
*
|
|||
|
* Creates an array cache object to store unique values.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @constructor
|
|||
|
* @param {Array} [values] The values to cache.
|
|||
|
*/
|
|||
|
function SetCache(values) {
|
|||
|
var index = -1,
|
|||
|
length = values == null ? 0 : values.length;
|
|||
|
|
|||
|
this.__data__ = new MapCache;
|
|||
|
while (++index < length) {
|
|||
|
this.add(values[index]);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Adds `value` to the array cache.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name add
|
|||
|
* @memberOf SetCache
|
|||
|
* @alias push
|
|||
|
* @param {*} value The value to cache.
|
|||
|
* @returns {Object} Returns the cache instance.
|
|||
|
*/
|
|||
|
function setCacheAdd(value) {
|
|||
|
this.__data__.set(value, HASH_UNDEFINED);
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is in the array cache.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name has
|
|||
|
* @memberOf SetCache
|
|||
|
* @param {*} value The value to search for.
|
|||
|
* @returns {number} Returns `true` if `value` is found, else `false`.
|
|||
|
*/
|
|||
|
function setCacheHas(value) {
|
|||
|
return this.__data__.has(value);
|
|||
|
}
|
|||
|
|
|||
|
// Add methods to `SetCache`.
|
|||
|
SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
|
|||
|
SetCache.prototype.has = setCacheHas;
|
|||
|
|
|||
|
/**
|
|||
|
* Creates a stack cache object to store key-value pairs.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @constructor
|
|||
|
* @param {Array} [entries] The key-value pairs to cache.
|
|||
|
*/
|
|||
|
function Stack(entries) {
|
|||
|
var data = this.__data__ = new ListCache(entries);
|
|||
|
this.size = data.size;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes all key-value entries from the stack.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name clear
|
|||
|
* @memberOf Stack
|
|||
|
*/
|
|||
|
function stackClear() {
|
|||
|
this.__data__ = new ListCache;
|
|||
|
this.size = 0;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes `key` and its value from the stack.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name delete
|
|||
|
* @memberOf Stack
|
|||
|
* @param {string} key The key of the value to remove.
|
|||
|
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
|||
|
*/
|
|||
|
function stackDelete(key) {
|
|||
|
var data = this.__data__,
|
|||
|
result = data['delete'](key);
|
|||
|
|
|||
|
this.size = data.size;
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the stack value for `key`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name get
|
|||
|
* @memberOf Stack
|
|||
|
* @param {string} key The key of the value to get.
|
|||
|
* @returns {*} Returns the entry value.
|
|||
|
*/
|
|||
|
function stackGet(key) {
|
|||
|
return this.__data__.get(key);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if a stack value for `key` exists.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name has
|
|||
|
* @memberOf Stack
|
|||
|
* @param {string} key The key of the entry to check.
|
|||
|
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
|||
|
*/
|
|||
|
function stackHas(key) {
|
|||
|
return this.__data__.has(key);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Sets the stack `key` to `value`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name set
|
|||
|
* @memberOf Stack
|
|||
|
* @param {string} key The key of the value to set.
|
|||
|
* @param {*} value The value to set.
|
|||
|
* @returns {Object} Returns the stack cache instance.
|
|||
|
*/
|
|||
|
function stackSet(key, value) {
|
|||
|
var data = this.__data__;
|
|||
|
if (data instanceof ListCache) {
|
|||
|
var pairs = data.__data__;
|
|||
|
if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
|
|||
|
pairs.push([key, value]);
|
|||
|
this.size = ++data.size;
|
|||
|
return this;
|
|||
|
}
|
|||
|
data = this.__data__ = new MapCache(pairs);
|
|||
|
}
|
|||
|
data.set(key, value);
|
|||
|
this.size = data.size;
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
// Add methods to `Stack`.
|
|||
|
Stack.prototype.clear = stackClear;
|
|||
|
Stack.prototype['delete'] = stackDelete;
|
|||
|
Stack.prototype.get = stackGet;
|
|||
|
Stack.prototype.has = stackHas;
|
|||
|
Stack.prototype.set = stackSet;
|
|||
|
|
|||
|
/**
|
|||
|
* Creates an array of the enumerable property names of the array-like `value`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to query.
|
|||
|
* @param {boolean} inherited Specify returning inherited property names.
|
|||
|
* @returns {Array} Returns the array of property names.
|
|||
|
*/
|
|||
|
function arrayLikeKeys(value, inherited) {
|
|||
|
var isArr = isArray(value),
|
|||
|
isArg = !isArr && isArguments(value),
|
|||
|
isBuff = !isArr && !isArg && isBuffer(value),
|
|||
|
isType = !isArr && !isArg && !isBuff && isTypedArray(value),
|
|||
|
skipIndexes = isArr || isArg || isBuff || isType,
|
|||
|
result = skipIndexes ? baseTimes(value.length, String) : [],
|
|||
|
length = result.length;
|
|||
|
|
|||
|
for (var key in value) {
|
|||
|
if ((inherited || hasOwnProperty.call(value, key)) &&
|
|||
|
!(skipIndexes && (
|
|||
|
// Safari 9 has enumerable `arguments.length` in strict mode.
|
|||
|
key == 'length' ||
|
|||
|
// Node.js 0.10 has enumerable non-index properties on buffers.
|
|||
|
(isBuff && (key == 'offset' || key == 'parent')) ||
|
|||
|
// PhantomJS 2 has enumerable non-index properties on typed arrays.
|
|||
|
(isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
|
|||
|
// Skip index properties.
|
|||
|
isIndex(key, length)
|
|||
|
))) {
|
|||
|
result.push(key);
|
|||
|
}
|
|||
|
}
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the index at which the `key` is found in `array` of key-value pairs.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Array} array The array to inspect.
|
|||
|
* @param {*} key The key to search for.
|
|||
|
* @returns {number} Returns the index of the matched value, else `-1`.
|
|||
|
*/
|
|||
|
function assocIndexOf(array, key) {
|
|||
|
var length = array.length;
|
|||
|
while (length--) {
|
|||
|
if (eq(array[length][0], key)) {
|
|||
|
return length;
|
|||
|
}
|
|||
|
}
|
|||
|
return -1;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* The base implementation of `getAllKeys` and `getAllKeysIn` which uses
|
|||
|
* `keysFunc` and `symbolsFunc` to get the enumerable property names and
|
|||
|
* symbols of `object`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} object The object to query.
|
|||
|
* @param {Function} keysFunc The function to get the keys of `object`.
|
|||
|
* @param {Function} symbolsFunc The function to get the symbols of `object`.
|
|||
|
* @returns {Array} Returns the array of property names and symbols.
|
|||
|
*/
|
|||
|
function baseGetAllKeys(object, keysFunc, symbolsFunc) {
|
|||
|
var result = keysFunc(object);
|
|||
|
return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* The base implementation of `getTag` without fallbacks for buggy environments.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to query.
|
|||
|
* @returns {string} Returns the `toStringTag`.
|
|||
|
*/
|
|||
|
function baseGetTag(value) {
|
|||
|
if (value == null) {
|
|||
|
return value === undefined ? undefinedTag : nullTag;
|
|||
|
}
|
|||
|
return (symToStringTag && symToStringTag in Object(value))
|
|||
|
? getRawTag(value)
|
|||
|
: objectToString(value);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* The base implementation of `_.isArguments`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is an `arguments` object,
|
|||
|
*/
|
|||
|
function baseIsArguments(value) {
|
|||
|
return isObjectLike(value) && baseGetTag(value) == argsTag;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* The base implementation of `_.isEqual` which supports partial comparisons
|
|||
|
* and tracks traversed objects.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to compare.
|
|||
|
* @param {*} other The other value to compare.
|
|||
|
* @param {boolean} bitmask The bitmask flags.
|
|||
|
* 1 - Unordered comparison
|
|||
|
* 2 - Partial comparison
|
|||
|
* @param {Function} [customizer] The function to customize comparisons.
|
|||
|
* @param {Object} [stack] Tracks traversed `value` and `other` objects.
|
|||
|
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
|
|||
|
*/
|
|||
|
function baseIsEqual(value, other, bitmask, customizer, stack) {
|
|||
|
if (value === other) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
|
|||
|
return value !== value && other !== other;
|
|||
|
}
|
|||
|
return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* A specialized version of `baseIsEqual` for arrays and objects which performs
|
|||
|
* deep comparisons and tracks traversed objects enabling objects with circular
|
|||
|
* references to be compared.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} object The object to compare.
|
|||
|
* @param {Object} other The other object to compare.
|
|||
|
* @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
|
|||
|
* @param {Function} customizer The function to customize comparisons.
|
|||
|
* @param {Function} equalFunc The function to determine equivalents of values.
|
|||
|
* @param {Object} [stack] Tracks traversed `object` and `other` objects.
|
|||
|
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
|
|||
|
*/
|
|||
|
function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
|
|||
|
var objIsArr = isArray(object),
|
|||
|
othIsArr = isArray(other),
|
|||
|
objTag = objIsArr ? arrayTag : getTag(object),
|
|||
|
othTag = othIsArr ? arrayTag : getTag(other);
|
|||
|
|
|||
|
objTag = objTag == argsTag ? objectTag : objTag;
|
|||
|
othTag = othTag == argsTag ? objectTag : othTag;
|
|||
|
|
|||
|
var objIsObj = objTag == objectTag,
|
|||
|
othIsObj = othTag == objectTag,
|
|||
|
isSameTag = objTag == othTag;
|
|||
|
|
|||
|
if (isSameTag && isBuffer(object)) {
|
|||
|
if (!isBuffer(other)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
objIsArr = true;
|
|||
|
objIsObj = false;
|
|||
|
}
|
|||
|
if (isSameTag && !objIsObj) {
|
|||
|
stack || (stack = new Stack);
|
|||
|
return (objIsArr || isTypedArray(object))
|
|||
|
? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
|
|||
|
: equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
|
|||
|
}
|
|||
|
if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
|
|||
|
var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
|
|||
|
othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
|
|||
|
|
|||
|
if (objIsWrapped || othIsWrapped) {
|
|||
|
var objUnwrapped = objIsWrapped ? object.value() : object,
|
|||
|
othUnwrapped = othIsWrapped ? other.value() : other;
|
|||
|
|
|||
|
stack || (stack = new Stack);
|
|||
|
return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
|
|||
|
}
|
|||
|
}
|
|||
|
if (!isSameTag) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
stack || (stack = new Stack);
|
|||
|
return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* The base implementation of `_.isNative` without bad shim checks.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is a native function,
|
|||
|
* else `false`.
|
|||
|
*/
|
|||
|
function baseIsNative(value) {
|
|||
|
if (!isObject(value) || isMasked(value)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
|
|||
|
return pattern.test(toSource(value));
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* The base implementation of `_.isTypedArray` without Node.js optimizations.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
|
|||
|
*/
|
|||
|
function baseIsTypedArray(value) {
|
|||
|
return isObjectLike(value) &&
|
|||
|
isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} object The object to query.
|
|||
|
* @returns {Array} Returns the array of property names.
|
|||
|
*/
|
|||
|
function baseKeys(object) {
|
|||
|
if (!isPrototype(object)) {
|
|||
|
return nativeKeys(object);
|
|||
|
}
|
|||
|
var result = [];
|
|||
|
for (var key in Object(object)) {
|
|||
|
if (hasOwnProperty.call(object, key) && key != 'constructor') {
|
|||
|
result.push(key);
|
|||
|
}
|
|||
|
}
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* A specialized version of `baseIsEqualDeep` for arrays with support for
|
|||
|
* partial deep comparisons.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Array} array The array to compare.
|
|||
|
* @param {Array} other The other array to compare.
|
|||
|
* @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
|
|||
|
* @param {Function} customizer The function to customize comparisons.
|
|||
|
* @param {Function} equalFunc The function to determine equivalents of values.
|
|||
|
* @param {Object} stack Tracks traversed `array` and `other` objects.
|
|||
|
* @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
|
|||
|
*/
|
|||
|
function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
|
|||
|
var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
|
|||
|
arrLength = array.length,
|
|||
|
othLength = other.length;
|
|||
|
|
|||
|
if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
// Assume cyclic values are equal.
|
|||
|
var stacked = stack.get(array);
|
|||
|
if (stacked && stack.get(other)) {
|
|||
|
return stacked == other;
|
|||
|
}
|
|||
|
var index = -1,
|
|||
|
result = true,
|
|||
|
seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
|
|||
|
|
|||
|
stack.set(array, other);
|
|||
|
stack.set(other, array);
|
|||
|
|
|||
|
// Ignore non-index properties.
|
|||
|
while (++index < arrLength) {
|
|||
|
var arrValue = array[index],
|
|||
|
othValue = other[index];
|
|||
|
|
|||
|
if (customizer) {
|
|||
|
var compared = isPartial
|
|||
|
? customizer(othValue, arrValue, index, other, array, stack)
|
|||
|
: customizer(arrValue, othValue, index, array, other, stack);
|
|||
|
}
|
|||
|
if (compared !== undefined) {
|
|||
|
if (compared) {
|
|||
|
continue;
|
|||
|
}
|
|||
|
result = false;
|
|||
|
break;
|
|||
|
}
|
|||
|
// Recursively compare arrays (susceptible to call stack limits).
|
|||
|
if (seen) {
|
|||
|
if (!arraySome(other, function(othValue, othIndex) {
|
|||
|
if (!cacheHas(seen, othIndex) &&
|
|||
|
(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
|
|||
|
return seen.push(othIndex);
|
|||
|
}
|
|||
|
})) {
|
|||
|
result = false;
|
|||
|
break;
|
|||
|
}
|
|||
|
} else if (!(
|
|||
|
arrValue === othValue ||
|
|||
|
equalFunc(arrValue, othValue, bitmask, customizer, stack)
|
|||
|
)) {
|
|||
|
result = false;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
stack['delete'](array);
|
|||
|
stack['delete'](other);
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* A specialized version of `baseIsEqualDeep` for comparing objects of
|
|||
|
* the same `toStringTag`.
|
|||
|
*
|
|||
|
* **Note:** This function only supports comparing values with tags of
|
|||
|
* `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} object The object to compare.
|
|||
|
* @param {Object} other The other object to compare.
|
|||
|
* @param {string} tag The `toStringTag` of the objects to compare.
|
|||
|
* @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
|
|||
|
* @param {Function} customizer The function to customize comparisons.
|
|||
|
* @param {Function} equalFunc The function to determine equivalents of values.
|
|||
|
* @param {Object} stack Tracks traversed `object` and `other` objects.
|
|||
|
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
|
|||
|
*/
|
|||
|
function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
|
|||
|
switch (tag) {
|
|||
|
case dataViewTag:
|
|||
|
if ((object.byteLength != other.byteLength) ||
|
|||
|
(object.byteOffset != other.byteOffset)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
object = object.buffer;
|
|||
|
other = other.buffer;
|
|||
|
|
|||
|
case arrayBufferTag:
|
|||
|
if ((object.byteLength != other.byteLength) ||
|
|||
|
!equalFunc(new Uint8Array(object), new Uint8Array(other))) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
return true;
|
|||
|
|
|||
|
case boolTag:
|
|||
|
case dateTag:
|
|||
|
case numberTag:
|
|||
|
// Coerce booleans to `1` or `0` and dates to milliseconds.
|
|||
|
// Invalid dates are coerced to `NaN`.
|
|||
|
return eq(+object, +other);
|
|||
|
|
|||
|
case errorTag:
|
|||
|
return object.name == other.name && object.message == other.message;
|
|||
|
|
|||
|
case regexpTag:
|
|||
|
case stringTag:
|
|||
|
// Coerce regexes to strings and treat strings, primitives and objects,
|
|||
|
// as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
|
|||
|
// for more details.
|
|||
|
return object == (other + '');
|
|||
|
|
|||
|
case mapTag:
|
|||
|
var convert = mapToArray;
|
|||
|
|
|||
|
case setTag:
|
|||
|
var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
|
|||
|
convert || (convert = setToArray);
|
|||
|
|
|||
|
if (object.size != other.size && !isPartial) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
// Assume cyclic values are equal.
|
|||
|
var stacked = stack.get(object);
|
|||
|
if (stacked) {
|
|||
|
return stacked == other;
|
|||
|
}
|
|||
|
bitmask |= COMPARE_UNORDERED_FLAG;
|
|||
|
|
|||
|
// Recursively compare objects (susceptible to call stack limits).
|
|||
|
stack.set(object, other);
|
|||
|
var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
|
|||
|
stack['delete'](object);
|
|||
|
return result;
|
|||
|
|
|||
|
case symbolTag:
|
|||
|
if (symbolValueOf) {
|
|||
|
return symbolValueOf.call(object) == symbolValueOf.call(other);
|
|||
|
}
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* A specialized version of `baseIsEqualDeep` for objects with support for
|
|||
|
* partial deep comparisons.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} object The object to compare.
|
|||
|
* @param {Object} other The other object to compare.
|
|||
|
* @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
|
|||
|
* @param {Function} customizer The function to customize comparisons.
|
|||
|
* @param {Function} equalFunc The function to determine equivalents of values.
|
|||
|
* @param {Object} stack Tracks traversed `object` and `other` objects.
|
|||
|
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
|
|||
|
*/
|
|||
|
function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
|
|||
|
var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
|
|||
|
objProps = getAllKeys(object),
|
|||
|
objLength = objProps.length,
|
|||
|
othProps = getAllKeys(other),
|
|||
|
othLength = othProps.length;
|
|||
|
|
|||
|
if (objLength != othLength && !isPartial) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
var index = objLength;
|
|||
|
while (index--) {
|
|||
|
var key = objProps[index];
|
|||
|
if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
// Assume cyclic values are equal.
|
|||
|
var stacked = stack.get(object);
|
|||
|
if (stacked && stack.get(other)) {
|
|||
|
return stacked == other;
|
|||
|
}
|
|||
|
var result = true;
|
|||
|
stack.set(object, other);
|
|||
|
stack.set(other, object);
|
|||
|
|
|||
|
var skipCtor = isPartial;
|
|||
|
while (++index < objLength) {
|
|||
|
key = objProps[index];
|
|||
|
var objValue = object[key],
|
|||
|
othValue = other[key];
|
|||
|
|
|||
|
if (customizer) {
|
|||
|
var compared = isPartial
|
|||
|
? customizer(othValue, objValue, key, other, object, stack)
|
|||
|
: customizer(objValue, othValue, key, object, other, stack);
|
|||
|
}
|
|||
|
// Recursively compare objects (susceptible to call stack limits).
|
|||
|
if (!(compared === undefined
|
|||
|
? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
|
|||
|
: compared
|
|||
|
)) {
|
|||
|
result = false;
|
|||
|
break;
|
|||
|
}
|
|||
|
skipCtor || (skipCtor = key == 'constructor');
|
|||
|
}
|
|||
|
if (result && !skipCtor) {
|
|||
|
var objCtor = object.constructor,
|
|||
|
othCtor = other.constructor;
|
|||
|
|
|||
|
// Non `Object` object instances with different constructors are not equal.
|
|||
|
if (objCtor != othCtor &&
|
|||
|
('constructor' in object && 'constructor' in other) &&
|
|||
|
!(typeof objCtor == 'function' && objCtor instanceof objCtor &&
|
|||
|
typeof othCtor == 'function' && othCtor instanceof othCtor)) {
|
|||
|
result = false;
|
|||
|
}
|
|||
|
}
|
|||
|
stack['delete'](object);
|
|||
|
stack['delete'](other);
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Creates an array of own enumerable property names and symbols of `object`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} object The object to query.
|
|||
|
* @returns {Array} Returns the array of property names and symbols.
|
|||
|
*/
|
|||
|
function getAllKeys(object) {
|
|||
|
return baseGetAllKeys(object, keys, getSymbols);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the data for `map`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} map The map to query.
|
|||
|
* @param {string} key The reference key.
|
|||
|
* @returns {*} Returns the map data.
|
|||
|
*/
|
|||
|
function getMapData(map, key) {
|
|||
|
var data = map.__data__;
|
|||
|
return isKeyable(key)
|
|||
|
? data[typeof key == 'string' ? 'string' : 'hash']
|
|||
|
: data.map;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the native function at `key` of `object`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} object The object to query.
|
|||
|
* @param {string} key The key of the method to get.
|
|||
|
* @returns {*} Returns the function if it's native, else `undefined`.
|
|||
|
*/
|
|||
|
function getNative(object, key) {
|
|||
|
var value = getValue(object, key);
|
|||
|
return baseIsNative(value) ? value : undefined;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to query.
|
|||
|
* @returns {string} Returns the raw `toStringTag`.
|
|||
|
*/
|
|||
|
function getRawTag(value) {
|
|||
|
var isOwn = hasOwnProperty.call(value, symToStringTag),
|
|||
|
tag = value[symToStringTag];
|
|||
|
|
|||
|
try {
|
|||
|
value[symToStringTag] = undefined;
|
|||
|
var unmasked = true;
|
|||
|
} catch (e) {}
|
|||
|
|
|||
|
var result = nativeObjectToString.call(value);
|
|||
|
if (unmasked) {
|
|||
|
if (isOwn) {
|
|||
|
value[symToStringTag] = tag;
|
|||
|
} else {
|
|||
|
delete value[symToStringTag];
|
|||
|
}
|
|||
|
}
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Creates an array of the own enumerable symbols of `object`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} object The object to query.
|
|||
|
* @returns {Array} Returns the array of symbols.
|
|||
|
*/
|
|||
|
var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
|
|||
|
if (object == null) {
|
|||
|
return [];
|
|||
|
}
|
|||
|
object = Object(object);
|
|||
|
return arrayFilter(nativeGetSymbols(object), function(symbol) {
|
|||
|
return propertyIsEnumerable.call(object, symbol);
|
|||
|
});
|
|||
|
};
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the `toStringTag` of `value`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to query.
|
|||
|
* @returns {string} Returns the `toStringTag`.
|
|||
|
*/
|
|||
|
var getTag = baseGetTag;
|
|||
|
|
|||
|
// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
|
|||
|
if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
|
|||
|
(Map && getTag(new Map) != mapTag) ||
|
|||
|
(Promise && getTag(Promise.resolve()) != promiseTag) ||
|
|||
|
(Set && getTag(new Set) != setTag) ||
|
|||
|
(WeakMap && getTag(new WeakMap) != weakMapTag)) {
|
|||
|
getTag = function(value) {
|
|||
|
var result = baseGetTag(value),
|
|||
|
Ctor = result == objectTag ? value.constructor : undefined,
|
|||
|
ctorString = Ctor ? toSource(Ctor) : '';
|
|||
|
|
|||
|
if (ctorString) {
|
|||
|
switch (ctorString) {
|
|||
|
case dataViewCtorString: return dataViewTag;
|
|||
|
case mapCtorString: return mapTag;
|
|||
|
case promiseCtorString: return promiseTag;
|
|||
|
case setCtorString: return setTag;
|
|||
|
case weakMapCtorString: return weakMapTag;
|
|||
|
}
|
|||
|
}
|
|||
|
return result;
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is a valid array-like index.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
|
|||
|
* @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
|
|||
|
*/
|
|||
|
function isIndex(value, length) {
|
|||
|
length = length == null ? MAX_SAFE_INTEGER : length;
|
|||
|
return !!length &&
|
|||
|
(typeof value == 'number' || reIsUint.test(value)) &&
|
|||
|
(value > -1 && value % 1 == 0 && value < length);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is suitable for use as unique object key.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is suitable, else `false`.
|
|||
|
*/
|
|||
|
function isKeyable(value) {
|
|||
|
var type = typeof value;
|
|||
|
return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
|
|||
|
? (value !== '__proto__')
|
|||
|
: (value === null);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `func` has its source masked.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Function} func The function to check.
|
|||
|
* @returns {boolean} Returns `true` if `func` is masked, else `false`.
|
|||
|
*/
|
|||
|
function isMasked(func) {
|
|||
|
return !!maskSrcKey && (maskSrcKey in func);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is likely a prototype object.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
|
|||
|
*/
|
|||
|
function isPrototype(value) {
|
|||
|
var Ctor = value && value.constructor,
|
|||
|
proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
|
|||
|
|
|||
|
return value === proto;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Converts `value` to a string using `Object.prototype.toString`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to convert.
|
|||
|
* @returns {string} Returns the converted string.
|
|||
|
*/
|
|||
|
function objectToString(value) {
|
|||
|
return nativeObjectToString.call(value);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Converts `func` to its source code.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Function} func The function to convert.
|
|||
|
* @returns {string} Returns the source code.
|
|||
|
*/
|
|||
|
function toSource(func) {
|
|||
|
if (func != null) {
|
|||
|
try {
|
|||
|
return funcToString.call(func);
|
|||
|
} catch (e) {}
|
|||
|
try {
|
|||
|
return (func + '');
|
|||
|
} catch (e) {}
|
|||
|
}
|
|||
|
return '';
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Performs a
|
|||
|
* [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
|
|||
|
* comparison between two values to determine if they are equivalent.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 4.0.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to compare.
|
|||
|
* @param {*} other The other value to compare.
|
|||
|
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* var object = { 'a': 1 };
|
|||
|
* var other = { 'a': 1 };
|
|||
|
*
|
|||
|
* _.eq(object, object);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.eq(object, other);
|
|||
|
* // => false
|
|||
|
*
|
|||
|
* _.eq('a', 'a');
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.eq('a', Object('a'));
|
|||
|
* // => false
|
|||
|
*
|
|||
|
* _.eq(NaN, NaN);
|
|||
|
* // => true
|
|||
|
*/
|
|||
|
function eq(value, other) {
|
|||
|
return value === other || (value !== value && other !== other);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is likely an `arguments` object.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 0.1.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is an `arguments` object,
|
|||
|
* else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isArguments(function() { return arguments; }());
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isArguments([1, 2, 3]);
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
|
|||
|
return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
|
|||
|
!propertyIsEnumerable.call(value, 'callee');
|
|||
|
};
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is classified as an `Array` object.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 0.1.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is an array, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isArray([1, 2, 3]);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isArray(document.body.children);
|
|||
|
* // => false
|
|||
|
*
|
|||
|
* _.isArray('abc');
|
|||
|
* // => false
|
|||
|
*
|
|||
|
* _.isArray(_.noop);
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
var isArray = Array.isArray;
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is array-like. A value is considered array-like if it's
|
|||
|
* not a function and has a `value.length` that's an integer greater than or
|
|||
|
* equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 4.0.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is array-like, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isArrayLike([1, 2, 3]);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isArrayLike(document.body.children);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isArrayLike('abc');
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isArrayLike(_.noop);
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
function isArrayLike(value) {
|
|||
|
return value != null && isLength(value.length) && !isFunction(value);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is a buffer.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 4.3.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isBuffer(new Buffer(2));
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isBuffer(new Uint8Array(2));
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
var isBuffer = nativeIsBuffer || stubFalse;
|
|||
|
|
|||
|
/**
|
|||
|
* Performs a deep comparison between two values to determine if they are
|
|||
|
* equivalent.
|
|||
|
*
|
|||
|
* **Note:** This method supports comparing arrays, array buffers, booleans,
|
|||
|
* date objects, error objects, maps, numbers, `Object` objects, regexes,
|
|||
|
* sets, strings, symbols, and typed arrays. `Object` objects are compared
|
|||
|
* by their own, not inherited, enumerable properties. Functions and DOM
|
|||
|
* nodes are compared by strict equality, i.e. `===`.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 0.1.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to compare.
|
|||
|
* @param {*} other The other value to compare.
|
|||
|
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* var object = { 'a': 1 };
|
|||
|
* var other = { 'a': 1 };
|
|||
|
*
|
|||
|
* _.isEqual(object, other);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* object === other;
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
function isEqual(value, other) {
|
|||
|
return baseIsEqual(value, other);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is classified as a `Function` object.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 0.1.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is a function, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isFunction(_);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isFunction(/abc/);
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
function isFunction(value) {
|
|||
|
if (!isObject(value)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
// The use of `Object#toString` avoids issues with the `typeof` operator
|
|||
|
// in Safari 9 which returns 'object' for typed arrays and other constructors.
|
|||
|
var tag = baseGetTag(value);
|
|||
|
return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is a valid array-like length.
|
|||
|
*
|
|||
|
* **Note:** This method is loosely based on
|
|||
|
* [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 4.0.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isLength(3);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isLength(Number.MIN_VALUE);
|
|||
|
* // => false
|
|||
|
*
|
|||
|
* _.isLength(Infinity);
|
|||
|
* // => false
|
|||
|
*
|
|||
|
* _.isLength('3');
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
function isLength(value) {
|
|||
|
return typeof value == 'number' &&
|
|||
|
value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is the
|
|||
|
* [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
|
|||
|
* of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 0.1.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is an object, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isObject({});
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isObject([1, 2, 3]);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isObject(_.noop);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isObject(null);
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
function isObject(value) {
|
|||
|
var type = typeof value;
|
|||
|
return value != null && (type == 'object' || type == 'function');
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is object-like. A value is object-like if it's not `null`
|
|||
|
* and has a `typeof` result of "object".
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 4.0.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is object-like, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isObjectLike({});
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isObjectLike([1, 2, 3]);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isObjectLike(_.noop);
|
|||
|
* // => false
|
|||
|
*
|
|||
|
* _.isObjectLike(null);
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
function isObjectLike(value) {
|
|||
|
return value != null && typeof value == 'object';
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is classified as a typed array.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 3.0.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isTypedArray(new Uint8Array);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isTypedArray([]);
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
|
|||
|
|
|||
|
/**
|
|||
|
* Creates an array of the own enumerable property names of `object`.
|
|||
|
*
|
|||
|
* **Note:** Non-object values are coerced to objects. See the
|
|||
|
* [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
|
|||
|
* for more details.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @since 0.1.0
|
|||
|
* @memberOf _
|
|||
|
* @category Object
|
|||
|
* @param {Object} object The object to query.
|
|||
|
* @returns {Array} Returns the array of property names.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* function Foo() {
|
|||
|
* this.a = 1;
|
|||
|
* this.b = 2;
|
|||
|
* }
|
|||
|
*
|
|||
|
* Foo.prototype.c = 3;
|
|||
|
*
|
|||
|
* _.keys(new Foo);
|
|||
|
* // => ['a', 'b'] (iteration order is not guaranteed)
|
|||
|
*
|
|||
|
* _.keys('hi');
|
|||
|
* // => ['0', '1']
|
|||
|
*/
|
|||
|
function keys(object) {
|
|||
|
return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* This method returns a new empty array.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 4.13.0
|
|||
|
* @category Util
|
|||
|
* @returns {Array} Returns the new empty array.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* var arrays = _.times(2, _.stubArray);
|
|||
|
*
|
|||
|
* console.log(arrays);
|
|||
|
* // => [[], []]
|
|||
|
*
|
|||
|
* console.log(arrays[0] === arrays[1]);
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
function stubArray() {
|
|||
|
return [];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* This method returns `false`.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 4.13.0
|
|||
|
* @category Util
|
|||
|
* @returns {boolean} Returns `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.times(2, _.stubFalse);
|
|||
|
* // => [false, false]
|
|||
|
*/
|
|||
|
function stubFalse() {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = isEqual;
|
|||
|
|
|||
|
}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|||
|
},{}],3:[function(require,module,exports){
|
|||
|
// shim for using process in browser
|
|||
|
var process = module.exports = {};
|
|||
|
|
|||
|
// cached from whatever global is present so that test runners that stub it
|
|||
|
// don't break things. But we need to wrap it in a try catch in case it is
|
|||
|
// wrapped in strict mode code which doesn't define any globals. It's inside a
|
|||
|
// function because try/catches deoptimize in certain engines.
|
|||
|
|
|||
|
var cachedSetTimeout;
|
|||
|
var cachedClearTimeout;
|
|||
|
|
|||
|
function defaultSetTimout() {
|
|||
|
throw new Error('setTimeout has not been defined');
|
|||
|
}
|
|||
|
function defaultClearTimeout () {
|
|||
|
throw new Error('clearTimeout has not been defined');
|
|||
|
}
|
|||
|
(function () {
|
|||
|
try {
|
|||
|
if (typeof setTimeout === 'function') {
|
|||
|
cachedSetTimeout = setTimeout;
|
|||
|
} else {
|
|||
|
cachedSetTimeout = defaultSetTimout;
|
|||
|
}
|
|||
|
} catch (e) {
|
|||
|
cachedSetTimeout = defaultSetTimout;
|
|||
|
}
|
|||
|
try {
|
|||
|
if (typeof clearTimeout === 'function') {
|
|||
|
cachedClearTimeout = clearTimeout;
|
|||
|
} else {
|
|||
|
cachedClearTimeout = defaultClearTimeout;
|
|||
|
}
|
|||
|
} catch (e) {
|
|||
|
cachedClearTimeout = defaultClearTimeout;
|
|||
|
}
|
|||
|
} ())
|
|||
|
function runTimeout(fun) {
|
|||
|
if (cachedSetTimeout === setTimeout) {
|
|||
|
//normal enviroments in sane situations
|
|||
|
return setTimeout(fun, 0);
|
|||
|
}
|
|||
|
// if setTimeout wasn't available but was latter defined
|
|||
|
if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
|
|||
|
cachedSetTimeout = setTimeout;
|
|||
|
return setTimeout(fun, 0);
|
|||
|
}
|
|||
|
try {
|
|||
|
// when when somebody has screwed with setTimeout but no I.E. maddness
|
|||
|
return cachedSetTimeout(fun, 0);
|
|||
|
} catch(e){
|
|||
|
try {
|
|||
|
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
|
|||
|
return cachedSetTimeout.call(null, fun, 0);
|
|||
|
} catch(e){
|
|||
|
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
|
|||
|
return cachedSetTimeout.call(this, fun, 0);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
function runClearTimeout(marker) {
|
|||
|
if (cachedClearTimeout === clearTimeout) {
|
|||
|
//normal enviroments in sane situations
|
|||
|
return clearTimeout(marker);
|
|||
|
}
|
|||
|
// if clearTimeout wasn't available but was latter defined
|
|||
|
if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
|
|||
|
cachedClearTimeout = clearTimeout;
|
|||
|
return clearTimeout(marker);
|
|||
|
}
|
|||
|
try {
|
|||
|
// when when somebody has screwed with setTimeout but no I.E. maddness
|
|||
|
return cachedClearTimeout(marker);
|
|||
|
} catch (e){
|
|||
|
try {
|
|||
|
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
|
|||
|
return cachedClearTimeout.call(null, marker);
|
|||
|
} catch (e){
|
|||
|
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
|
|||
|
// Some versions of I.E. have different rules for clearTimeout vs setTimeout
|
|||
|
return cachedClearTimeout.call(this, marker);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
var queue = [];
|
|||
|
var draining = false;
|
|||
|
var currentQueue;
|
|||
|
var queueIndex = -1;
|
|||
|
|
|||
|
function cleanUpNextTick() {
|
|||
|
if (!draining || !currentQueue) {
|
|||
|
return;
|
|||
|
}
|
|||
|
draining = false;
|
|||
|
if (currentQueue.length) {
|
|||
|
queue = currentQueue.concat(queue);
|
|||
|
} else {
|
|||
|
queueIndex = -1;
|
|||
|
}
|
|||
|
if (queue.length) {
|
|||
|
drainQueue();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function drainQueue() {
|
|||
|
if (draining) {
|
|||
|
return;
|
|||
|
}
|
|||
|
var timeout = runTimeout(cleanUpNextTick);
|
|||
|
draining = true;
|
|||
|
|
|||
|
var len = queue.length;
|
|||
|
while(len) {
|
|||
|
currentQueue = queue;
|
|||
|
queue = [];
|
|||
|
while (++queueIndex < len) {
|
|||
|
if (currentQueue) {
|
|||
|
currentQueue[queueIndex].run();
|
|||
|
}
|
|||
|
}
|
|||
|
queueIndex = -1;
|
|||
|
len = queue.length;
|
|||
|
}
|
|||
|
currentQueue = null;
|
|||
|
draining = false;
|
|||
|
runClearTimeout(timeout);
|
|||
|
}
|
|||
|
|
|||
|
process.nextTick = function (fun) {
|
|||
|
var args = new Array(arguments.length - 1);
|
|||
|
if (arguments.length > 1) {
|
|||
|
for (var i = 1; i < arguments.length; i++) {
|
|||
|
args[i - 1] = arguments[i];
|
|||
|
}
|
|||
|
}
|
|||
|
queue.push(new Item(fun, args));
|
|||
|
if (queue.length === 1 && !draining) {
|
|||
|
runTimeout(drainQueue);
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
// v8 likes predictible objects
|
|||
|
function Item(fun, array) {
|
|||
|
this.fun = fun;
|
|||
|
this.array = array;
|
|||
|
}
|
|||
|
Item.prototype.run = function () {
|
|||
|
this.fun.apply(null, this.array);
|
|||
|
};
|
|||
|
process.title = 'browser';
|
|||
|
process.browser = true;
|
|||
|
process.env = {};
|
|||
|
process.argv = [];
|
|||
|
process.version = ''; // empty string to avoid regexp issues
|
|||
|
process.versions = {};
|
|||
|
|
|||
|
function noop() {}
|
|||
|
|
|||
|
process.on = noop;
|
|||
|
process.addListener = noop;
|
|||
|
process.once = noop;
|
|||
|
process.off = noop;
|
|||
|
process.removeListener = noop;
|
|||
|
process.removeAllListeners = noop;
|
|||
|
process.emit = noop;
|
|||
|
process.prependListener = noop;
|
|||
|
process.prependOnceListener = noop;
|
|||
|
|
|||
|
process.listeners = function (name) { return [] }
|
|||
|
|
|||
|
process.binding = function (name) {
|
|||
|
throw new Error('process.binding is not supported');
|
|||
|
};
|
|||
|
|
|||
|
process.cwd = function () { return '/' };
|
|||
|
process.chdir = function (dir) {
|
|||
|
throw new Error('process.chdir is not supported');
|
|||
|
};
|
|||
|
process.umask = function() { return 0; };
|
|||
|
|
|||
|
},{}],4:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = void 0;
|
|||
|
|
|||
|
var _toDate = _interopRequireDefault(require("./lib/toDate"));
|
|||
|
|
|||
|
var _toFloat = _interopRequireDefault(require("./lib/toFloat"));
|
|||
|
|
|||
|
var _toInt = _interopRequireDefault(require("./lib/toInt"));
|
|||
|
|
|||
|
var _toBoolean = _interopRequireDefault(require("./lib/toBoolean"));
|
|||
|
|
|||
|
var _equals = _interopRequireDefault(require("./lib/equals"));
|
|||
|
|
|||
|
var _contains = _interopRequireDefault(require("./lib/contains"));
|
|||
|
|
|||
|
var _matches = _interopRequireDefault(require("./lib/matches"));
|
|||
|
|
|||
|
var _isEmail = _interopRequireDefault(require("./lib/isEmail"));
|
|||
|
|
|||
|
var _isURL = _interopRequireDefault(require("./lib/isURL"));
|
|||
|
|
|||
|
var _isMACAddress = _interopRequireDefault(require("./lib/isMACAddress"));
|
|||
|
|
|||
|
var _isIP = _interopRequireDefault(require("./lib/isIP"));
|
|||
|
|
|||
|
var _isIPRange = _interopRequireDefault(require("./lib/isIPRange"));
|
|||
|
|
|||
|
var _isFQDN = _interopRequireDefault(require("./lib/isFQDN"));
|
|||
|
|
|||
|
var _isDate = _interopRequireDefault(require("./lib/isDate"));
|
|||
|
|
|||
|
var _isBoolean = _interopRequireDefault(require("./lib/isBoolean"));
|
|||
|
|
|||
|
var _isLocale = _interopRequireDefault(require("./lib/isLocale"));
|
|||
|
|
|||
|
var _isAlpha = _interopRequireWildcard(require("./lib/isAlpha"));
|
|||
|
|
|||
|
var _isAlphanumeric = _interopRequireWildcard(require("./lib/isAlphanumeric"));
|
|||
|
|
|||
|
var _isNumeric = _interopRequireDefault(require("./lib/isNumeric"));
|
|||
|
|
|||
|
var _isPassportNumber = _interopRequireDefault(require("./lib/isPassportNumber"));
|
|||
|
|
|||
|
var _isPort = _interopRequireDefault(require("./lib/isPort"));
|
|||
|
|
|||
|
var _isLowercase = _interopRequireDefault(require("./lib/isLowercase"));
|
|||
|
|
|||
|
var _isUppercase = _interopRequireDefault(require("./lib/isUppercase"));
|
|||
|
|
|||
|
var _isIMEI = _interopRequireDefault(require("./lib/isIMEI"));
|
|||
|
|
|||
|
var _isAscii = _interopRequireDefault(require("./lib/isAscii"));
|
|||
|
|
|||
|
var _isFullWidth = _interopRequireDefault(require("./lib/isFullWidth"));
|
|||
|
|
|||
|
var _isHalfWidth = _interopRequireDefault(require("./lib/isHalfWidth"));
|
|||
|
|
|||
|
var _isVariableWidth = _interopRequireDefault(require("./lib/isVariableWidth"));
|
|||
|
|
|||
|
var _isMultibyte = _interopRequireDefault(require("./lib/isMultibyte"));
|
|||
|
|
|||
|
var _isSemVer = _interopRequireDefault(require("./lib/isSemVer"));
|
|||
|
|
|||
|
var _isSurrogatePair = _interopRequireDefault(require("./lib/isSurrogatePair"));
|
|||
|
|
|||
|
var _isInt = _interopRequireDefault(require("./lib/isInt"));
|
|||
|
|
|||
|
var _isFloat = _interopRequireWildcard(require("./lib/isFloat"));
|
|||
|
|
|||
|
var _isDecimal = _interopRequireDefault(require("./lib/isDecimal"));
|
|||
|
|
|||
|
var _isHexadecimal = _interopRequireDefault(require("./lib/isHexadecimal"));
|
|||
|
|
|||
|
var _isOctal = _interopRequireDefault(require("./lib/isOctal"));
|
|||
|
|
|||
|
var _isDivisibleBy = _interopRequireDefault(require("./lib/isDivisibleBy"));
|
|||
|
|
|||
|
var _isHexColor = _interopRequireDefault(require("./lib/isHexColor"));
|
|||
|
|
|||
|
var _isRgbColor = _interopRequireDefault(require("./lib/isRgbColor"));
|
|||
|
|
|||
|
var _isHSL = _interopRequireDefault(require("./lib/isHSL"));
|
|||
|
|
|||
|
var _isISRC = _interopRequireDefault(require("./lib/isISRC"));
|
|||
|
|
|||
|
var _isIBAN = _interopRequireWildcard(require("./lib/isIBAN"));
|
|||
|
|
|||
|
var _isBIC = _interopRequireDefault(require("./lib/isBIC"));
|
|||
|
|
|||
|
var _isMD = _interopRequireDefault(require("./lib/isMD5"));
|
|||
|
|
|||
|
var _isHash = _interopRequireDefault(require("./lib/isHash"));
|
|||
|
|
|||
|
var _isJWT = _interopRequireDefault(require("./lib/isJWT"));
|
|||
|
|
|||
|
var _isJSON = _interopRequireDefault(require("./lib/isJSON"));
|
|||
|
|
|||
|
var _isEmpty = _interopRequireDefault(require("./lib/isEmpty"));
|
|||
|
|
|||
|
var _isLength = _interopRequireDefault(require("./lib/isLength"));
|
|||
|
|
|||
|
var _isByteLength = _interopRequireDefault(require("./lib/isByteLength"));
|
|||
|
|
|||
|
var _isUUID = _interopRequireDefault(require("./lib/isUUID"));
|
|||
|
|
|||
|
var _isMongoId = _interopRequireDefault(require("./lib/isMongoId"));
|
|||
|
|
|||
|
var _isAfter = _interopRequireDefault(require("./lib/isAfter"));
|
|||
|
|
|||
|
var _isBefore = _interopRequireDefault(require("./lib/isBefore"));
|
|||
|
|
|||
|
var _isIn = _interopRequireDefault(require("./lib/isIn"));
|
|||
|
|
|||
|
var _isCreditCard = _interopRequireDefault(require("./lib/isCreditCard"));
|
|||
|
|
|||
|
var _isIdentityCard = _interopRequireDefault(require("./lib/isIdentityCard"));
|
|||
|
|
|||
|
var _isEAN = _interopRequireDefault(require("./lib/isEAN"));
|
|||
|
|
|||
|
var _isISIN = _interopRequireDefault(require("./lib/isISIN"));
|
|||
|
|
|||
|
var _isISBN = _interopRequireDefault(require("./lib/isISBN"));
|
|||
|
|
|||
|
var _isISSN = _interopRequireDefault(require("./lib/isISSN"));
|
|||
|
|
|||
|
var _isTaxID = _interopRequireDefault(require("./lib/isTaxID"));
|
|||
|
|
|||
|
var _isMobilePhone = _interopRequireWildcard(require("./lib/isMobilePhone"));
|
|||
|
|
|||
|
var _isEthereumAddress = _interopRequireDefault(require("./lib/isEthereumAddress"));
|
|||
|
|
|||
|
var _isCurrency = _interopRequireDefault(require("./lib/isCurrency"));
|
|||
|
|
|||
|
var _isBtcAddress = _interopRequireDefault(require("./lib/isBtcAddress"));
|
|||
|
|
|||
|
var _isISO = _interopRequireDefault(require("./lib/isISO8601"));
|
|||
|
|
|||
|
var _isRFC = _interopRequireDefault(require("./lib/isRFC3339"));
|
|||
|
|
|||
|
var _isISO31661Alpha = _interopRequireDefault(require("./lib/isISO31661Alpha2"));
|
|||
|
|
|||
|
var _isISO31661Alpha2 = _interopRequireDefault(require("./lib/isISO31661Alpha3"));
|
|||
|
|
|||
|
var _isISO2 = _interopRequireDefault(require("./lib/isISO4217"));
|
|||
|
|
|||
|
var _isBase = _interopRequireDefault(require("./lib/isBase32"));
|
|||
|
|
|||
|
var _isBase2 = _interopRequireDefault(require("./lib/isBase58"));
|
|||
|
|
|||
|
var _isBase3 = _interopRequireDefault(require("./lib/isBase64"));
|
|||
|
|
|||
|
var _isDataURI = _interopRequireDefault(require("./lib/isDataURI"));
|
|||
|
|
|||
|
var _isMagnetURI = _interopRequireDefault(require("./lib/isMagnetURI"));
|
|||
|
|
|||
|
var _isMimeType = _interopRequireDefault(require("./lib/isMimeType"));
|
|||
|
|
|||
|
var _isLatLong = _interopRequireDefault(require("./lib/isLatLong"));
|
|||
|
|
|||
|
var _isPostalCode = _interopRequireWildcard(require("./lib/isPostalCode"));
|
|||
|
|
|||
|
var _ltrim = _interopRequireDefault(require("./lib/ltrim"));
|
|||
|
|
|||
|
var _rtrim = _interopRequireDefault(require("./lib/rtrim"));
|
|||
|
|
|||
|
var _trim = _interopRequireDefault(require("./lib/trim"));
|
|||
|
|
|||
|
var _escape = _interopRequireDefault(require("./lib/escape"));
|
|||
|
|
|||
|
var _unescape = _interopRequireDefault(require("./lib/unescape"));
|
|||
|
|
|||
|
var _stripLow = _interopRequireDefault(require("./lib/stripLow"));
|
|||
|
|
|||
|
var _whitelist = _interopRequireDefault(require("./lib/whitelist"));
|
|||
|
|
|||
|
var _blacklist = _interopRequireDefault(require("./lib/blacklist"));
|
|||
|
|
|||
|
var _isWhitelisted = _interopRequireDefault(require("./lib/isWhitelisted"));
|
|||
|
|
|||
|
var _normalizeEmail = _interopRequireDefault(require("./lib/normalizeEmail"));
|
|||
|
|
|||
|
var _isSlug = _interopRequireDefault(require("./lib/isSlug"));
|
|||
|
|
|||
|
var _isLicensePlate = _interopRequireDefault(require("./lib/isLicensePlate"));
|
|||
|
|
|||
|
var _isStrongPassword = _interopRequireDefault(require("./lib/isStrongPassword"));
|
|||
|
|
|||
|
var _isVAT = _interopRequireDefault(require("./lib/isVAT"));
|
|||
|
|
|||
|
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
|
|||
|
|
|||
|
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var version = '13.7.0';
|
|||
|
var validator = {
|
|||
|
version: version,
|
|||
|
toDate: _toDate.default,
|
|||
|
toFloat: _toFloat.default,
|
|||
|
toInt: _toInt.default,
|
|||
|
toBoolean: _toBoolean.default,
|
|||
|
equals: _equals.default,
|
|||
|
contains: _contains.default,
|
|||
|
matches: _matches.default,
|
|||
|
isEmail: _isEmail.default,
|
|||
|
isURL: _isURL.default,
|
|||
|
isMACAddress: _isMACAddress.default,
|
|||
|
isIP: _isIP.default,
|
|||
|
isIPRange: _isIPRange.default,
|
|||
|
isFQDN: _isFQDN.default,
|
|||
|
isBoolean: _isBoolean.default,
|
|||
|
isIBAN: _isIBAN.default,
|
|||
|
isBIC: _isBIC.default,
|
|||
|
isAlpha: _isAlpha.default,
|
|||
|
isAlphaLocales: _isAlpha.locales,
|
|||
|
isAlphanumeric: _isAlphanumeric.default,
|
|||
|
isAlphanumericLocales: _isAlphanumeric.locales,
|
|||
|
isNumeric: _isNumeric.default,
|
|||
|
isPassportNumber: _isPassportNumber.default,
|
|||
|
isPort: _isPort.default,
|
|||
|
isLowercase: _isLowercase.default,
|
|||
|
isUppercase: _isUppercase.default,
|
|||
|
isAscii: _isAscii.default,
|
|||
|
isFullWidth: _isFullWidth.default,
|
|||
|
isHalfWidth: _isHalfWidth.default,
|
|||
|
isVariableWidth: _isVariableWidth.default,
|
|||
|
isMultibyte: _isMultibyte.default,
|
|||
|
isSemVer: _isSemVer.default,
|
|||
|
isSurrogatePair: _isSurrogatePair.default,
|
|||
|
isInt: _isInt.default,
|
|||
|
isIMEI: _isIMEI.default,
|
|||
|
isFloat: _isFloat.default,
|
|||
|
isFloatLocales: _isFloat.locales,
|
|||
|
isDecimal: _isDecimal.default,
|
|||
|
isHexadecimal: _isHexadecimal.default,
|
|||
|
isOctal: _isOctal.default,
|
|||
|
isDivisibleBy: _isDivisibleBy.default,
|
|||
|
isHexColor: _isHexColor.default,
|
|||
|
isRgbColor: _isRgbColor.default,
|
|||
|
isHSL: _isHSL.default,
|
|||
|
isISRC: _isISRC.default,
|
|||
|
isMD5: _isMD.default,
|
|||
|
isHash: _isHash.default,
|
|||
|
isJWT: _isJWT.default,
|
|||
|
isJSON: _isJSON.default,
|
|||
|
isEmpty: _isEmpty.default,
|
|||
|
isLength: _isLength.default,
|
|||
|
isLocale: _isLocale.default,
|
|||
|
isByteLength: _isByteLength.default,
|
|||
|
isUUID: _isUUID.default,
|
|||
|
isMongoId: _isMongoId.default,
|
|||
|
isAfter: _isAfter.default,
|
|||
|
isBefore: _isBefore.default,
|
|||
|
isIn: _isIn.default,
|
|||
|
isCreditCard: _isCreditCard.default,
|
|||
|
isIdentityCard: _isIdentityCard.default,
|
|||
|
isEAN: _isEAN.default,
|
|||
|
isISIN: _isISIN.default,
|
|||
|
isISBN: _isISBN.default,
|
|||
|
isISSN: _isISSN.default,
|
|||
|
isMobilePhone: _isMobilePhone.default,
|
|||
|
isMobilePhoneLocales: _isMobilePhone.locales,
|
|||
|
isPostalCode: _isPostalCode.default,
|
|||
|
isPostalCodeLocales: _isPostalCode.locales,
|
|||
|
isEthereumAddress: _isEthereumAddress.default,
|
|||
|
isCurrency: _isCurrency.default,
|
|||
|
isBtcAddress: _isBtcAddress.default,
|
|||
|
isISO8601: _isISO.default,
|
|||
|
isRFC3339: _isRFC.default,
|
|||
|
isISO31661Alpha2: _isISO31661Alpha.default,
|
|||
|
isISO31661Alpha3: _isISO31661Alpha2.default,
|
|||
|
isISO4217: _isISO2.default,
|
|||
|
isBase32: _isBase.default,
|
|||
|
isBase58: _isBase2.default,
|
|||
|
isBase64: _isBase3.default,
|
|||
|
isDataURI: _isDataURI.default,
|
|||
|
isMagnetURI: _isMagnetURI.default,
|
|||
|
isMimeType: _isMimeType.default,
|
|||
|
isLatLong: _isLatLong.default,
|
|||
|
ltrim: _ltrim.default,
|
|||
|
rtrim: _rtrim.default,
|
|||
|
trim: _trim.default,
|
|||
|
escape: _escape.default,
|
|||
|
unescape: _unescape.default,
|
|||
|
stripLow: _stripLow.default,
|
|||
|
whitelist: _whitelist.default,
|
|||
|
blacklist: _blacklist.default,
|
|||
|
isWhitelisted: _isWhitelisted.default,
|
|||
|
normalizeEmail: _normalizeEmail.default,
|
|||
|
toString: toString,
|
|||
|
isSlug: _isSlug.default,
|
|||
|
isStrongPassword: _isStrongPassword.default,
|
|||
|
isTaxID: _isTaxID.default,
|
|||
|
isDate: _isDate.default,
|
|||
|
isLicensePlate: _isLicensePlate.default,
|
|||
|
isVAT: _isVAT.default,
|
|||
|
ibanLocales: _isIBAN.locales
|
|||
|
};
|
|||
|
var _default = validator;
|
|||
|
exports.default = _default;
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./lib/blacklist":6,"./lib/contains":7,"./lib/equals":8,"./lib/escape":9,"./lib/isAfter":10,"./lib/isAlpha":11,"./lib/isAlphanumeric":12,"./lib/isAscii":13,"./lib/isBIC":14,"./lib/isBase32":15,"./lib/isBase58":16,"./lib/isBase64":17,"./lib/isBefore":18,"./lib/isBoolean":19,"./lib/isBtcAddress":20,"./lib/isByteLength":21,"./lib/isCreditCard":22,"./lib/isCurrency":23,"./lib/isDataURI":24,"./lib/isDate":25,"./lib/isDecimal":26,"./lib/isDivisibleBy":27,"./lib/isEAN":28,"./lib/isEmail":29,"./lib/isEmpty":30,"./lib/isEthereumAddress":31,"./lib/isFQDN":32,"./lib/isFloat":33,"./lib/isFullWidth":34,"./lib/isHSL":35,"./lib/isHalfWidth":36,"./lib/isHash":37,"./lib/isHexColor":38,"./lib/isHexadecimal":39,"./lib/isIBAN":40,"./lib/isIMEI":41,"./lib/isIP":42,"./lib/isIPRange":43,"./lib/isISBN":44,"./lib/isISIN":45,"./lib/isISO31661Alpha2":46,"./lib/isISO31661Alpha3":47,"./lib/isISO4217":48,"./lib/isISO8601":49,"./lib/isISRC":50,"./lib/isISSN":51,"./lib/isIdentityCard":52,"./lib/isIn":53,"./lib/isInt":54,"./lib/isJSON":55,"./lib/isJWT":56,"./lib/isLatLong":57,"./lib/isLength":58,"./lib/isLicensePlate":59,"./lib/isLocale":60,"./lib/isLowercase":61,"./lib/isMACAddress":62,"./lib/isMD5":63,"./lib/isMagnetURI":64,"./lib/isMimeType":65,"./lib/isMobilePhone":66,"./lib/isMongoId":67,"./lib/isMultibyte":68,"./lib/isNumeric":69,"./lib/isOctal":70,"./lib/isPassportNumber":71,"./lib/isPort":72,"./lib/isPostalCode":73,"./lib/isRFC3339":74,"./lib/isRgbColor":75,"./lib/isSemVer":76,"./lib/isSlug":77,"./lib/isStrongPassword":78,"./lib/isSurrogatePair":79,"./lib/isTaxID":80,"./lib/isURL":81,"./lib/isUUID":82,"./lib/isUppercase":83,"./lib/isVAT":84,"./lib/isVariableWidth":85,"./lib/isWhitelisted":86,"./lib/ltrim":87,"./lib/matches":88,"./lib/normalizeEmail":89,"./lib/rtrim":90,"./lib/stripLow":91,"./lib/toBoolean":92,"./lib/toDate":93,"./lib/toFloat":94,"./lib/toInt":95,"./lib/trim":96,"./lib/unescape":97,"./lib/whitelist":104}],5:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.commaDecimal = exports.dotDecimal = exports.farsiLocales = exports.arabicLocales = exports.englishLocales = exports.decimal = exports.alphanumeric = exports.alpha = void 0;
|
|||
|
var alpha = {
|
|||
|
'en-US': /^[A-Z]+$/i,
|
|||
|
'az-AZ': /^[A-VXYZÇƏĞİıÖŞÜ]+$/i,
|
|||
|
'bg-BG': /^[А-Я]+$/i,
|
|||
|
'cs-CZ': /^[A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]+$/i,
|
|||
|
'da-DK': /^[A-ZÆØÅ]+$/i,
|
|||
|
'de-DE': /^[A-ZÄÖÜß]+$/i,
|
|||
|
'el-GR': /^[Α-ώ]+$/i,
|
|||
|
'es-ES': /^[A-ZÁÉÍÑÓÚÜ]+$/i,
|
|||
|
'fa-IR': /^[ابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی]+$/i,
|
|||
|
'fi-FI': /^[A-ZÅÄÖ]+$/i,
|
|||
|
'fr-FR': /^[A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i,
|
|||
|
'it-IT': /^[A-ZÀÉÈÌÎÓÒÙ]+$/i,
|
|||
|
'nb-NO': /^[A-ZÆØÅ]+$/i,
|
|||
|
'nl-NL': /^[A-ZÁÉËÏÓÖÜÚ]+$/i,
|
|||
|
'nn-NO': /^[A-ZÆØÅ]+$/i,
|
|||
|
'hu-HU': /^[A-ZÁÉÍÓÖŐÚÜŰ]+$/i,
|
|||
|
'pl-PL': /^[A-ZĄĆĘŚŁŃÓŻŹ]+$/i,
|
|||
|
'pt-PT': /^[A-ZÃÁÀÂÄÇÉÊËÍÏÕÓÔÖÚÜ]+$/i,
|
|||
|
'ru-RU': /^[А-ЯЁ]+$/i,
|
|||
|
'sl-SI': /^[A-ZČĆĐŠŽ]+$/i,
|
|||
|
'sk-SK': /^[A-ZÁČĎÉÍŇÓŠŤÚÝŽĹŔĽÄÔ]+$/i,
|
|||
|
'sr-RS@latin': /^[A-ZČĆŽŠĐ]+$/i,
|
|||
|
'sr-RS': /^[А-ЯЂЈЉЊЋЏ]+$/i,
|
|||
|
'sv-SE': /^[A-ZÅÄÖ]+$/i,
|
|||
|
'th-TH': /^[ก-๐\s]+$/i,
|
|||
|
'tr-TR': /^[A-ZÇĞİıÖŞÜ]+$/i,
|
|||
|
'uk-UA': /^[А-ЩЬЮЯЄIЇҐі]+$/i,
|
|||
|
'vi-VN': /^[A-ZÀÁẠẢÃÂẦẤẬẨẪĂẰẮẶẲẴĐÈÉẸẺẼÊỀẾỆỂỄÌÍỊỈĨÒÓỌỎÕÔỒỐỘỔỖƠỜỚỢỞỠÙÚỤỦŨƯỪỨỰỬỮỲÝỴỶỸ]+$/i,
|
|||
|
'ku-IQ': /^[ئابپتجچحخدرڕزژسشعغفڤقکگلڵمنوۆھەیێيطؤثآإأكضصةظذ]+$/i,
|
|||
|
ar: /^[ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]+$/,
|
|||
|
he: /^[א-ת]+$/,
|
|||
|
fa: /^['آاءأؤئبپتثجچحخدذرزژسشصضطظعغفقکگلمنوهةی']+$/i,
|
|||
|
'hi-IN': /^[\u0900-\u0961]+[\u0972-\u097F]*$/i
|
|||
|
};
|
|||
|
exports.alpha = alpha;
|
|||
|
var alphanumeric = {
|
|||
|
'en-US': /^[0-9A-Z]+$/i,
|
|||
|
'az-AZ': /^[0-9A-VXYZÇƏĞİıÖŞÜ]+$/i,
|
|||
|
'bg-BG': /^[0-9А-Я]+$/i,
|
|||
|
'cs-CZ': /^[0-9A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]+$/i,
|
|||
|
'da-DK': /^[0-9A-ZÆØÅ]+$/i,
|
|||
|
'de-DE': /^[0-9A-ZÄÖÜß]+$/i,
|
|||
|
'el-GR': /^[0-9Α-ω]+$/i,
|
|||
|
'es-ES': /^[0-9A-ZÁÉÍÑÓÚÜ]+$/i,
|
|||
|
'fi-FI': /^[0-9A-ZÅÄÖ]+$/i,
|
|||
|
'fr-FR': /^[0-9A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i,
|
|||
|
'it-IT': /^[0-9A-ZÀÉÈÌÎÓÒÙ]+$/i,
|
|||
|
'hu-HU': /^[0-9A-ZÁÉÍÓÖŐÚÜŰ]+$/i,
|
|||
|
'nb-NO': /^[0-9A-ZÆØÅ]+$/i,
|
|||
|
'nl-NL': /^[0-9A-ZÁÉËÏÓÖÜÚ]+$/i,
|
|||
|
'nn-NO': /^[0-9A-ZÆØÅ]+$/i,
|
|||
|
'pl-PL': /^[0-9A-ZĄĆĘŚŁŃÓŻŹ]+$/i,
|
|||
|
'pt-PT': /^[0-9A-ZÃÁÀÂÄÇÉÊËÍÏÕÓÔÖÚÜ]+$/i,
|
|||
|
'ru-RU': /^[0-9А-ЯЁ]+$/i,
|
|||
|
'sl-SI': /^[0-9A-ZČĆĐŠŽ]+$/i,
|
|||
|
'sk-SK': /^[0-9A-ZÁČĎÉÍŇÓŠŤÚÝŽĹŔĽÄÔ]+$/i,
|
|||
|
'sr-RS@latin': /^[0-9A-ZČĆŽŠĐ]+$/i,
|
|||
|
'sr-RS': /^[0-9А-ЯЂЈЉЊЋЏ]+$/i,
|
|||
|
'sv-SE': /^[0-9A-ZÅÄÖ]+$/i,
|
|||
|
'th-TH': /^[ก-๙\s]+$/i,
|
|||
|
'tr-TR': /^[0-9A-ZÇĞİıÖŞÜ]+$/i,
|
|||
|
'uk-UA': /^[0-9А-ЩЬЮЯЄIЇҐі]+$/i,
|
|||
|
'ku-IQ': /^[٠١٢٣٤٥٦٧٨٩0-9ئابپتجچحخدرڕزژسشعغفڤقکگلڵمنوۆھەیێيطؤثآإأكضصةظذ]+$/i,
|
|||
|
'vi-VN': /^[0-9A-ZÀÁẠẢÃÂẦẤẬẨẪĂẰẮẶẲẴĐÈÉẸẺẼÊỀẾỆỂỄÌÍỊỈĨÒÓỌỎÕÔỒỐỘỔỖƠỜỚỢỞỠÙÚỤỦŨƯỪỨỰỬỮỲÝỴỶỸ]+$/i,
|
|||
|
ar: /^[٠١٢٣٤٥٦٧٨٩0-9ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]+$/,
|
|||
|
he: /^[0-9א-ת]+$/,
|
|||
|
fa: /^['0-9آاءأؤئبپتثجچحخدذرزژسشصضطظعغفقکگلمنوهةی۱۲۳۴۵۶۷۸۹۰']+$/i,
|
|||
|
'hi-IN': /^[\u0900-\u0963]+[\u0966-\u097F]*$/i
|
|||
|
};
|
|||
|
exports.alphanumeric = alphanumeric;
|
|||
|
var decimal = {
|
|||
|
'en-US': '.',
|
|||
|
ar: '٫'
|
|||
|
};
|
|||
|
exports.decimal = decimal;
|
|||
|
var englishLocales = ['AU', 'GB', 'HK', 'IN', 'NZ', 'ZA', 'ZM'];
|
|||
|
exports.englishLocales = englishLocales;
|
|||
|
|
|||
|
for (var locale, i = 0; i < englishLocales.length; i++) {
|
|||
|
locale = "en-".concat(englishLocales[i]);
|
|||
|
alpha[locale] = alpha['en-US'];
|
|||
|
alphanumeric[locale] = alphanumeric['en-US'];
|
|||
|
decimal[locale] = decimal['en-US'];
|
|||
|
} // Source: http://www.localeplanet.com/java/
|
|||
|
|
|||
|
|
|||
|
var arabicLocales = ['AE', 'BH', 'DZ', 'EG', 'IQ', 'JO', 'KW', 'LB', 'LY', 'MA', 'QM', 'QA', 'SA', 'SD', 'SY', 'TN', 'YE'];
|
|||
|
exports.arabicLocales = arabicLocales;
|
|||
|
|
|||
|
for (var _locale, _i = 0; _i < arabicLocales.length; _i++) {
|
|||
|
_locale = "ar-".concat(arabicLocales[_i]);
|
|||
|
alpha[_locale] = alpha.ar;
|
|||
|
alphanumeric[_locale] = alphanumeric.ar;
|
|||
|
decimal[_locale] = decimal.ar;
|
|||
|
}
|
|||
|
|
|||
|
var farsiLocales = ['IR', 'AF'];
|
|||
|
exports.farsiLocales = farsiLocales;
|
|||
|
|
|||
|
for (var _locale2, _i2 = 0; _i2 < farsiLocales.length; _i2++) {
|
|||
|
_locale2 = "fa-".concat(farsiLocales[_i2]);
|
|||
|
alphanumeric[_locale2] = alphanumeric.fa;
|
|||
|
decimal[_locale2] = decimal.ar;
|
|||
|
} // Source: https://en.wikipedia.org/wiki/Decimal_mark
|
|||
|
|
|||
|
|
|||
|
var dotDecimal = ['ar-EG', 'ar-LB', 'ar-LY'];
|
|||
|
exports.dotDecimal = dotDecimal;
|
|||
|
var commaDecimal = ['bg-BG', 'cs-CZ', 'da-DK', 'de-DE', 'el-GR', 'en-ZM', 'es-ES', 'fr-CA', 'fr-FR', 'id-ID', 'it-IT', 'ku-IQ', 'hi-IN', 'hu-HU', 'nb-NO', 'nn-NO', 'nl-NL', 'pl-PL', 'pt-PT', 'ru-RU', 'sl-SI', 'sr-RS@latin', 'sr-RS', 'sv-SE', 'tr-TR', 'uk-UA', 'vi-VN'];
|
|||
|
exports.commaDecimal = commaDecimal;
|
|||
|
|
|||
|
for (var _i3 = 0; _i3 < dotDecimal.length; _i3++) {
|
|||
|
decimal[dotDecimal[_i3]] = decimal['en-US'];
|
|||
|
}
|
|||
|
|
|||
|
for (var _i4 = 0; _i4 < commaDecimal.length; _i4++) {
|
|||
|
decimal[commaDecimal[_i4]] = ',';
|
|||
|
}
|
|||
|
|
|||
|
alpha['fr-CA'] = alpha['fr-FR'];
|
|||
|
alphanumeric['fr-CA'] = alphanumeric['fr-FR'];
|
|||
|
alpha['pt-BR'] = alpha['pt-PT'];
|
|||
|
alphanumeric['pt-BR'] = alphanumeric['pt-PT'];
|
|||
|
decimal['pt-BR'] = decimal['pt-PT']; // see #862
|
|||
|
|
|||
|
alpha['pl-Pl'] = alpha['pl-PL'];
|
|||
|
alphanumeric['pl-Pl'] = alphanumeric['pl-PL'];
|
|||
|
decimal['pl-Pl'] = decimal['pl-PL']; // see #1455
|
|||
|
|
|||
|
alpha['fa-AF'] = alpha.fa;
|
|||
|
},{}],6:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = blacklist;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function blacklist(str, chars) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return str.replace(new RegExp("[".concat(chars, "]+"), 'g'), '');
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],7:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = contains;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
var _toString = _interopRequireDefault(require("./util/toString"));
|
|||
|
|
|||
|
var _merge = _interopRequireDefault(require("./util/merge"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var defaulContainsOptions = {
|
|||
|
ignoreCase: false,
|
|||
|
minOccurrences: 1
|
|||
|
};
|
|||
|
|
|||
|
function contains(str, elem, options) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
options = (0, _merge.default)(options, defaulContainsOptions);
|
|||
|
|
|||
|
if (options.ignoreCase) {
|
|||
|
return str.toLowerCase().split((0, _toString.default)(elem).toLowerCase()).length > options.minOccurrences;
|
|||
|
}
|
|||
|
|
|||
|
return str.split((0, _toString.default)(elem)).length > options.minOccurrences;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99,"./util/merge":101,"./util/toString":103}],8:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = equals;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function equals(str, comparison) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return str === comparison;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],9:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = escape;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function escape(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return str.replace(/&/g, '&').replace(/"/g, '"').replace(/'/g, ''').replace(/</g, '<').replace(/>/g, '>').replace(/\//g, '/').replace(/\\/g, '\').replace(/`/g, '`');
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],10:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isAfter;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
var _toDate = _interopRequireDefault(require("./toDate"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function isAfter(str) {
|
|||
|
var date = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : String(new Date());
|
|||
|
(0, _assertString.default)(str);
|
|||
|
var comparison = (0, _toDate.default)(date);
|
|||
|
var original = (0, _toDate.default)(str);
|
|||
|
return !!(original && comparison && original > comparison);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./toDate":93,"./util/assertString":99}],11:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isAlpha;
|
|||
|
exports.locales = void 0;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
var _alpha = require("./alpha");
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function isAlpha(_str) {
|
|||
|
var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en-US';
|
|||
|
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|||
|
(0, _assertString.default)(_str);
|
|||
|
var str = _str;
|
|||
|
var ignore = options.ignore;
|
|||
|
|
|||
|
if (ignore) {
|
|||
|
if (ignore instanceof RegExp) {
|
|||
|
str = str.replace(ignore, '');
|
|||
|
} else if (typeof ignore === 'string') {
|
|||
|
str = str.replace(new RegExp("[".concat(ignore.replace(/[-[\]{}()*+?.,\\^$|#\\s]/g, '\\$&'), "]"), 'g'), ''); // escape regex for ignore
|
|||
|
} else {
|
|||
|
throw new Error('ignore should be instance of a String or RegExp');
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (locale in _alpha.alpha) {
|
|||
|
return _alpha.alpha[locale].test(str);
|
|||
|
}
|
|||
|
|
|||
|
throw new Error("Invalid locale '".concat(locale, "'"));
|
|||
|
}
|
|||
|
|
|||
|
var locales = Object.keys(_alpha.alpha);
|
|||
|
exports.locales = locales;
|
|||
|
},{"./alpha":5,"./util/assertString":99}],12:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isAlphanumeric;
|
|||
|
exports.locales = void 0;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
var _alpha = require("./alpha");
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function isAlphanumeric(_str) {
|
|||
|
var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en-US';
|
|||
|
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|||
|
(0, _assertString.default)(_str);
|
|||
|
var str = _str;
|
|||
|
var ignore = options.ignore;
|
|||
|
|
|||
|
if (ignore) {
|
|||
|
if (ignore instanceof RegExp) {
|
|||
|
str = str.replace(ignore, '');
|
|||
|
} else if (typeof ignore === 'string') {
|
|||
|
str = str.replace(new RegExp("[".concat(ignore.replace(/[-[\]{}()*+?.,\\^$|#\\s]/g, '\\$&'), "]"), 'g'), ''); // escape regex for ignore
|
|||
|
} else {
|
|||
|
throw new Error('ignore should be instance of a String or RegExp');
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (locale in _alpha.alphanumeric) {
|
|||
|
return _alpha.alphanumeric[locale].test(str);
|
|||
|
}
|
|||
|
|
|||
|
throw new Error("Invalid locale '".concat(locale, "'"));
|
|||
|
}
|
|||
|
|
|||
|
var locales = Object.keys(_alpha.alphanumeric);
|
|||
|
exports.locales = locales;
|
|||
|
},{"./alpha":5,"./util/assertString":99}],13:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isAscii;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
/* eslint-disable no-control-regex */
|
|||
|
var ascii = /^[\x00-\x7F]+$/;
|
|||
|
/* eslint-enable no-control-regex */
|
|||
|
|
|||
|
function isAscii(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return ascii.test(str);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],14:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isBIC;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
var _isISO31661Alpha = require("./isISO31661Alpha2");
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
// https://en.wikipedia.org/wiki/ISO_9362
|
|||
|
var isBICReg = /^[A-Za-z]{6}[A-Za-z0-9]{2}([A-Za-z0-9]{3})?$/;
|
|||
|
|
|||
|
function isBIC(str) {
|
|||
|
(0, _assertString.default)(str); // toUpperCase() should be removed when a new major version goes out that changes
|
|||
|
// the regex to [A-Z] (per the spec).
|
|||
|
|
|||
|
if (!_isISO31661Alpha.CountryCodes.has(str.slice(4, 6).toUpperCase())) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
return isBICReg.test(str);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./isISO31661Alpha2":46,"./util/assertString":99}],15:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isBase32;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var base32 = /^[A-Z2-7]+=*$/;
|
|||
|
|
|||
|
function isBase32(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
var len = str.length;
|
|||
|
|
|||
|
if (len % 8 === 0 && base32.test(str)) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],16:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isBase58;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
// Accepted chars - 123456789ABCDEFGH JKLMN PQRSTUVWXYZabcdefghijk mnopqrstuvwxyz
|
|||
|
var base58Reg = /^[A-HJ-NP-Za-km-z1-9]*$/;
|
|||
|
|
|||
|
function isBase58(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
|
|||
|
if (base58Reg.test(str)) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],17:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isBase64;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
var _merge = _interopRequireDefault(require("./util/merge"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var notBase64 = /[^A-Z0-9+\/=]/i;
|
|||
|
var urlSafeBase64 = /^[A-Z0-9_\-]*$/i;
|
|||
|
var defaultBase64Options = {
|
|||
|
urlSafe: false
|
|||
|
};
|
|||
|
|
|||
|
function isBase64(str, options) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
options = (0, _merge.default)(options, defaultBase64Options);
|
|||
|
var len = str.length;
|
|||
|
|
|||
|
if (options.urlSafe) {
|
|||
|
return urlSafeBase64.test(str);
|
|||
|
}
|
|||
|
|
|||
|
if (len % 4 !== 0 || notBase64.test(str)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
var firstPaddingChar = str.indexOf('=');
|
|||
|
return firstPaddingChar === -1 || firstPaddingChar === len - 1 || firstPaddingChar === len - 2 && str[len - 1] === '=';
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99,"./util/merge":101}],18:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isBefore;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
var _toDate = _interopRequireDefault(require("./toDate"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function isBefore(str) {
|
|||
|
var date = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : String(new Date());
|
|||
|
(0, _assertString.default)(str);
|
|||
|
var comparison = (0, _toDate.default)(date);
|
|||
|
var original = (0, _toDate.default)(str);
|
|||
|
return !!(original && comparison && original < comparison);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./toDate":93,"./util/assertString":99}],19:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isBoolean;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var defaultOptions = {
|
|||
|
loose: false
|
|||
|
};
|
|||
|
var strictBooleans = ['true', 'false', '1', '0'];
|
|||
|
var looseBooleans = [].concat(strictBooleans, ['yes', 'no']);
|
|||
|
|
|||
|
function isBoolean(str) {
|
|||
|
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultOptions;
|
|||
|
(0, _assertString.default)(str);
|
|||
|
|
|||
|
if (options.loose) {
|
|||
|
return looseBooleans.includes(str.toLowerCase());
|
|||
|
}
|
|||
|
|
|||
|
return strictBooleans.includes(str);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],20:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isBtcAddress;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
// supports Bech32 addresses
|
|||
|
var bech32 = /^(bc1)[a-z0-9]{25,39}$/;
|
|||
|
var base58 = /^(1|3)[A-HJ-NP-Za-km-z1-9]{25,39}$/;
|
|||
|
|
|||
|
function isBtcAddress(str) {
|
|||
|
(0, _assertString.default)(str); // check for bech32
|
|||
|
|
|||
|
if (str.startsWith('bc1')) {
|
|||
|
return bech32.test(str);
|
|||
|
}
|
|||
|
|
|||
|
return base58.test(str);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],21:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isByteLength;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|||
|
|
|||
|
/* eslint-disable prefer-rest-params */
|
|||
|
function isByteLength(str, options) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
var min;
|
|||
|
var max;
|
|||
|
|
|||
|
if (_typeof(options) === 'object') {
|
|||
|
min = options.min || 0;
|
|||
|
max = options.max;
|
|||
|
} else {
|
|||
|
// backwards compatibility: isByteLength(str, min [, max])
|
|||
|
min = arguments[1];
|
|||
|
max = arguments[2];
|
|||
|
}
|
|||
|
|
|||
|
var len = encodeURI(str).split(/%..|./).length - 1;
|
|||
|
return len >= min && (typeof max === 'undefined' || len <= max);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],22:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isCreditCard;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
/* eslint-disable max-len */
|
|||
|
var creditCard = /^(?:4[0-9]{12}(?:[0-9]{3,6})?|5[1-5][0-9]{14}|(222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12,15}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11}|6[27][0-9]{14}|^(81[0-9]{14,17}))$/;
|
|||
|
/* eslint-enable max-len */
|
|||
|
|
|||
|
function isCreditCard(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
var sanitized = str.replace(/[- ]+/g, '');
|
|||
|
|
|||
|
if (!creditCard.test(sanitized)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
var sum = 0;
|
|||
|
var digit;
|
|||
|
var tmpNum;
|
|||
|
var 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);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],23:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isCurrency;
|
|||
|
|
|||
|
var _merge = _interopRequireDefault(require("./util/merge"));
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function currencyRegex(options) {
|
|||
|
var decimal_digits = "\\d{".concat(options.digits_after_decimal[0], "}");
|
|||
|
options.digits_after_decimal.forEach(function (digit, index) {
|
|||
|
if (index !== 0) decimal_digits = "".concat(decimal_digits, "|\\d{").concat(digit, "}");
|
|||
|
});
|
|||
|
var symbol = "(".concat(options.symbol.replace(/\W/, function (m) {
|
|||
|
return "\\".concat(m);
|
|||
|
}), ")").concat(options.require_symbol ? '' : '?'),
|
|||
|
negative = '-?',
|
|||
|
whole_dollar_amount_without_sep = '[1-9]\\d*',
|
|||
|
whole_dollar_amount_with_sep = "[1-9]\\d{0,2}(\\".concat(options.thousands_separator, "\\d{3})*"),
|
|||
|
valid_whole_dollar_amounts = ['0', whole_dollar_amount_without_sep, whole_dollar_amount_with_sep],
|
|||
|
whole_dollar_amount = "(".concat(valid_whole_dollar_amounts.join('|'), ")?"),
|
|||
|
decimal_amount = "(\\".concat(options.decimal_separator, "(").concat(decimal_digits, "))").concat(options.require_decimal ? '' : '?');
|
|||
|
var pattern = whole_dollar_amount + (options.allow_decimal || options.require_decimal ? 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 = "( (?!\\-))?".concat(pattern);
|
|||
|
} else if (options.allow_space_after_symbol) {
|
|||
|
pattern = " ?".concat(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 = "(\\(".concat(pattern, "\\)|").concat(pattern, ")");
|
|||
|
} else if (!(options.negative_sign_before_digits || options.negative_sign_after_digits)) {
|
|||
|
pattern = negative + pattern;
|
|||
|
}
|
|||
|
} // 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
|
|||
|
|
|||
|
|
|||
|
return new RegExp("^(?!-? )(?=.*\\d)".concat(pattern, "$"));
|
|||
|
}
|
|||
|
|
|||
|
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_decimal: true,
|
|||
|
require_decimal: false,
|
|||
|
digits_after_decimal: [2],
|
|||
|
allow_space_after_digits: false
|
|||
|
};
|
|||
|
|
|||
|
function isCurrency(str, options) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
options = (0, _merge.default)(options, default_currency_options);
|
|||
|
return currencyRegex(options).test(str);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99,"./util/merge":101}],24:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isDataURI;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var validMediaType = /^[a-z]+\/[a-z0-9\-\+]+$/i;
|
|||
|
var validAttribute = /^[a-z\-]+=[a-z0-9\-]+$/i;
|
|||
|
var validData = /^[a-z0-9!\$&'\(\)\*\+,;=\-\._~:@\/\?%\s]*$/i;
|
|||
|
|
|||
|
function isDataURI(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
var data = str.split(',');
|
|||
|
|
|||
|
if (data.length < 2) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
var attributes = data.shift().trim().split(';');
|
|||
|
var schemeAndMediaType = attributes.shift();
|
|||
|
|
|||
|
if (schemeAndMediaType.substr(0, 5) !== 'data:') {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
var mediaType = schemeAndMediaType.substr(5);
|
|||
|
|
|||
|
if (mediaType !== '' && !validMediaType.test(mediaType)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
for (var i = 0; i < attributes.length; i++) {
|
|||
|
if (!(i === attributes.length - 1 && attributes[i].toLowerCase() === 'base64') && !validAttribute.test(attributes[i])) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
for (var _i = 0; _i < data.length; _i++) {
|
|||
|
if (!validData.test(data[_i])) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],25:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isDate;
|
|||
|
|
|||
|
var _merge = _interopRequireDefault(require("./util/merge"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|||
|
|
|||
|
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|||
|
|
|||
|
function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|||
|
|
|||
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|||
|
|
|||
|
function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|||
|
|
|||
|
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|||
|
|
|||
|
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|||
|
|
|||
|
var default_date_options = {
|
|||
|
format: 'YYYY/MM/DD',
|
|||
|
delimiters: ['/', '-'],
|
|||
|
strictMode: false
|
|||
|
};
|
|||
|
|
|||
|
function isValidFormat(format) {
|
|||
|
return /(^(y{4}|y{2})[.\/-](m{1,2})[.\/-](d{1,2})$)|(^(m{1,2})[.\/-](d{1,2})[.\/-]((y{4}|y{2})$))|(^(d{1,2})[.\/-](m{1,2})[.\/-]((y{4}|y{2})$))/gi.test(format);
|
|||
|
}
|
|||
|
|
|||
|
function zip(date, format) {
|
|||
|
var zippedArr = [],
|
|||
|
len = Math.min(date.length, format.length);
|
|||
|
|
|||
|
for (var i = 0; i < len; i++) {
|
|||
|
zippedArr.push([date[i], format[i]]);
|
|||
|
}
|
|||
|
|
|||
|
return zippedArr;
|
|||
|
}
|
|||
|
|
|||
|
function isDate(input, options) {
|
|||
|
if (typeof options === 'string') {
|
|||
|
// Allow backward compatbility for old format isDate(input [, format])
|
|||
|
options = (0, _merge.default)({
|
|||
|
format: options
|
|||
|
}, default_date_options);
|
|||
|
} else {
|
|||
|
options = (0, _merge.default)(options, default_date_options);
|
|||
|
}
|
|||
|
|
|||
|
if (typeof input === 'string' && isValidFormat(options.format)) {
|
|||
|
var formatDelimiter = options.delimiters.find(function (delimiter) {
|
|||
|
return options.format.indexOf(delimiter) !== -1;
|
|||
|
});
|
|||
|
var dateDelimiter = options.strictMode ? formatDelimiter : options.delimiters.find(function (delimiter) {
|
|||
|
return input.indexOf(delimiter) !== -1;
|
|||
|
});
|
|||
|
var dateAndFormat = zip(input.split(dateDelimiter), options.format.toLowerCase().split(formatDelimiter));
|
|||
|
var dateObj = {};
|
|||
|
|
|||
|
var _iterator = _createForOfIteratorHelper(dateAndFormat),
|
|||
|
_step;
|
|||
|
|
|||
|
try {
|
|||
|
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|||
|
var _step$value = _slicedToArray(_step.value, 2),
|
|||
|
dateWord = _step$value[0],
|
|||
|
formatWord = _step$value[1];
|
|||
|
|
|||
|
if (dateWord.length !== formatWord.length) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
dateObj[formatWord.charAt(0)] = dateWord;
|
|||
|
}
|
|||
|
} catch (err) {
|
|||
|
_iterator.e(err);
|
|||
|
} finally {
|
|||
|
_iterator.f();
|
|||
|
}
|
|||
|
|
|||
|
return new Date("".concat(dateObj.m, "/").concat(dateObj.d, "/").concat(dateObj.y)).getDate() === +dateObj.d;
|
|||
|
}
|
|||
|
|
|||
|
if (!options.strictMode) {
|
|||
|
return Object.prototype.toString.call(input) === '[object Date]' && isFinite(input);
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/merge":101}],26:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isDecimal;
|
|||
|
|
|||
|
var _merge = _interopRequireDefault(require("./util/merge"));
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
var _includes = _interopRequireDefault(require("./util/includes"));
|
|||
|
|
|||
|
var _alpha = require("./alpha");
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function decimalRegExp(options) {
|
|||
|
var regExp = new RegExp("^[-+]?([0-9]+)?(\\".concat(_alpha.decimal[options.locale], "[0-9]{").concat(options.decimal_digits, "})").concat(options.force_decimal ? '' : '?', "$"));
|
|||
|
return regExp;
|
|||
|
}
|
|||
|
|
|||
|
var default_decimal_options = {
|
|||
|
force_decimal: false,
|
|||
|
decimal_digits: '1,',
|
|||
|
locale: 'en-US'
|
|||
|
};
|
|||
|
var blacklist = ['', '-', '+'];
|
|||
|
|
|||
|
function isDecimal(str, options) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
options = (0, _merge.default)(options, default_decimal_options);
|
|||
|
|
|||
|
if (options.locale in _alpha.decimal) {
|
|||
|
return !(0, _includes.default)(blacklist, str.replace(/ /g, '')) && decimalRegExp(options).test(str);
|
|||
|
}
|
|||
|
|
|||
|
throw new Error("Invalid locale '".concat(options.locale, "'"));
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./alpha":5,"./util/assertString":99,"./util/includes":100,"./util/merge":101}],27:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isDivisibleBy;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
var _toFloat = _interopRequireDefault(require("./toFloat"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function isDivisibleBy(str, num) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return (0, _toFloat.default)(str) % parseInt(num, 10) === 0;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./toFloat":94,"./util/assertString":99}],28:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isEAN;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
/**
|
|||
|
* The most commonly used EAN standard is
|
|||
|
* the thirteen-digit EAN-13, while the
|
|||
|
* less commonly used 8-digit EAN-8 barcode was
|
|||
|
* introduced for use on small packages.
|
|||
|
* Also EAN/UCC-14 is used for Grouping of individual
|
|||
|
* trade items above unit level(Intermediate, Carton or Pallet).
|
|||
|
* For more info about EAN-14 checkout: https://www.gtin.info/itf-14-barcodes/
|
|||
|
* EAN consists of:
|
|||
|
* GS1 prefix, manufacturer code, product code and check digit
|
|||
|
* Reference: https://en.wikipedia.org/wiki/International_Article_Number
|
|||
|
* Reference: https://www.gtin.info/
|
|||
|
*/
|
|||
|
|
|||
|
/**
|
|||
|
* Define EAN Lenghts; 8 for EAN-8; 13 for EAN-13; 14 for EAN-14
|
|||
|
* and Regular Expression for valid EANs (EAN-8, EAN-13, EAN-14),
|
|||
|
* with exact numberic matching of 8 or 13 or 14 digits [0-9]
|
|||
|
*/
|
|||
|
var LENGTH_EAN_8 = 8;
|
|||
|
var LENGTH_EAN_14 = 14;
|
|||
|
var validEanRegex = /^(\d{8}|\d{13}|\d{14})$/;
|
|||
|
/**
|
|||
|
* Get position weight given:
|
|||
|
* EAN length and digit index/position
|
|||
|
*
|
|||
|
* @param {number} length
|
|||
|
* @param {number} index
|
|||
|
* @return {number}
|
|||
|
*/
|
|||
|
|
|||
|
function getPositionWeightThroughLengthAndIndex(length, index) {
|
|||
|
if (length === LENGTH_EAN_8 || length === LENGTH_EAN_14) {
|
|||
|
return index % 2 === 0 ? 3 : 1;
|
|||
|
}
|
|||
|
|
|||
|
return index % 2 === 0 ? 1 : 3;
|
|||
|
}
|
|||
|
/**
|
|||
|
* Calculate EAN Check Digit
|
|||
|
* Reference: https://en.wikipedia.org/wiki/International_Article_Number#Calculation_of_checksum_digit
|
|||
|
*
|
|||
|
* @param {string} ean
|
|||
|
* @return {number}
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function calculateCheckDigit(ean) {
|
|||
|
var checksum = ean.slice(0, -1).split('').map(function (char, index) {
|
|||
|
return Number(char) * getPositionWeightThroughLengthAndIndex(ean.length, index);
|
|||
|
}).reduce(function (acc, partialSum) {
|
|||
|
return acc + partialSum;
|
|||
|
}, 0);
|
|||
|
var remainder = 10 - checksum % 10;
|
|||
|
return remainder < 10 ? remainder : 0;
|
|||
|
}
|
|||
|
/**
|
|||
|
* Check if string is valid EAN:
|
|||
|
* Matches EAN-8/EAN-13/EAN-14 regex
|
|||
|
* Has valid check digit.
|
|||
|
*
|
|||
|
* @param {string} str
|
|||
|
* @return {boolean}
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function isEAN(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
var actualCheckDigit = Number(str.slice(-1));
|
|||
|
return validEanRegex.test(str) && actualCheckDigit === calculateCheckDigit(str);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],29:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isEmail;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
var _merge = _interopRequireDefault(require("./util/merge"));
|
|||
|
|
|||
|
var _isByteLength = _interopRequireDefault(require("./isByteLength"));
|
|||
|
|
|||
|
var _isFQDN = _interopRequireDefault(require("./isFQDN"));
|
|||
|
|
|||
|
var _isIP = _interopRequireDefault(require("./isIP"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var default_email_options = {
|
|||
|
allow_display_name: false,
|
|||
|
require_display_name: false,
|
|||
|
allow_utf8_local_part: true,
|
|||
|
require_tld: true,
|
|||
|
blacklisted_chars: '',
|
|||
|
ignore_max_length: false,
|
|||
|
host_blacklist: []
|
|||
|
};
|
|||
|
/* eslint-disable max-len */
|
|||
|
|
|||
|
/* eslint-disable no-control-regex */
|
|||
|
|
|||
|
var splitNameAddress = /^([^\x00-\x1F\x7F-\x9F\cX]+)</i;
|
|||
|
var emailUserPart = /^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~]+$/i;
|
|||
|
var gmailUserPart = /^[a-z\d]+$/;
|
|||
|
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 defaultMaxEmailLength = 254;
|
|||
|
/* eslint-enable max-len */
|
|||
|
|
|||
|
/* eslint-enable no-control-regex */
|
|||
|
|
|||
|
/**
|
|||
|
* Validate display name according to the RFC2822: https://tools.ietf.org/html/rfc2822#appendix-A.1.2
|
|||
|
* @param {String} display_name
|
|||
|
*/
|
|||
|
|
|||
|
function validateDisplayName(display_name) {
|
|||
|
var display_name_without_quotes = display_name.replace(/^"(.+)"$/, '$1'); // display name with only spaces is not valid
|
|||
|
|
|||
|
if (!display_name_without_quotes.trim()) {
|
|||
|
return false;
|
|||
|
} // check whether display name contains illegal character
|
|||
|
|
|||
|
|
|||
|
var contains_illegal = /[\.";<>]/.test(display_name_without_quotes);
|
|||
|
|
|||
|
if (contains_illegal) {
|
|||
|
// if contains illegal characters,
|
|||
|
// must to be enclosed in double-quotes, otherwise it's not a valid display name
|
|||
|
if (display_name_without_quotes === display_name) {
|
|||
|
return false;
|
|||
|
} // the quotes in display name must start with character symbol \
|
|||
|
|
|||
|
|
|||
|
var all_start_with_back_slash = display_name_without_quotes.split('"').length === display_name_without_quotes.split('\\"').length;
|
|||
|
|
|||
|
if (!all_start_with_back_slash) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
function isEmail(str, options) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
options = (0, _merge.default)(options, default_email_options);
|
|||
|
|
|||
|
if (options.require_display_name || options.allow_display_name) {
|
|||
|
var display_email = str.match(splitNameAddress);
|
|||
|
|
|||
|
if (display_email) {
|
|||
|
var display_name = display_email[1]; // Remove display name and angle brackets to get email address
|
|||
|
// Can be done in the regex but will introduce a ReDOS (See #1597 for more info)
|
|||
|
|
|||
|
str = str.replace(display_name, '').replace(/(^<|>$)/g, ''); // sometimes need to trim the last space to get the display name
|
|||
|
// because there may be a space between display name and email address
|
|||
|
// eg. myname <address@gmail.com>
|
|||
|
// the display name is `myname` instead of `myname `, so need to trim the last space
|
|||
|
|
|||
|
if (display_name.endsWith(' ')) {
|
|||
|
display_name = display_name.substr(0, display_name.length - 1);
|
|||
|
}
|
|||
|
|
|||
|
if (!validateDisplayName(display_name)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
} else if (options.require_display_name) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (!options.ignore_max_length && str.length > defaultMaxEmailLength) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
var parts = str.split('@');
|
|||
|
var domain = parts.pop();
|
|||
|
var lower_domain = domain.toLowerCase();
|
|||
|
|
|||
|
if (options.host_blacklist.includes(lower_domain)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
var user = parts.join('@');
|
|||
|
|
|||
|
if (options.domain_specific_validation && (lower_domain === 'gmail.com' || lower_domain === 'googlemail.com')) {
|
|||
|
/*
|
|||
|
Previously we removed dots for gmail addresses before validating.
|
|||
|
This was removed because it allows `multiple..dots@gmail.com`
|
|||
|
to be reported as valid, but it is not.
|
|||
|
Gmail only normalizes single dots, removing them from here is pointless,
|
|||
|
should be done in normalizeEmail
|
|||
|
*/
|
|||
|
user = user.toLowerCase(); // Removing sub-address from username before gmail validation
|
|||
|
|
|||
|
var username = user.split('+')[0]; // Dots are not included in gmail length restriction
|
|||
|
|
|||
|
if (!(0, _isByteLength.default)(username.replace(/\./g, ''), {
|
|||
|
min: 6,
|
|||
|
max: 30
|
|||
|
})) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
var _user_parts = username.split('.');
|
|||
|
|
|||
|
for (var i = 0; i < _user_parts.length; i++) {
|
|||
|
if (!gmailUserPart.test(_user_parts[i])) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (options.ignore_max_length === false && (!(0, _isByteLength.default)(user, {
|
|||
|
max: 64
|
|||
|
}) || !(0, _isByteLength.default)(domain, {
|
|||
|
max: 254
|
|||
|
}))) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (!(0, _isFQDN.default)(domain, {
|
|||
|
require_tld: options.require_tld
|
|||
|
})) {
|
|||
|
if (!options.allow_ip_domain) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (!(0, _isIP.default)(domain)) {
|
|||
|
if (!domain.startsWith('[') || !domain.endsWith(']')) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
var noBracketdomain = domain.substr(1, domain.length - 2);
|
|||
|
|
|||
|
if (noBracketdomain.length === 0 || !(0, _isIP.default)(noBracketdomain)) {
|
|||
|
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;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (options.blacklisted_chars) {
|
|||
|
if (user.search(new RegExp("[".concat(options.blacklisted_chars, "]+"), 'g')) !== -1) return false;
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./isByteLength":21,"./isFQDN":32,"./isIP":42,"./util/assertString":99,"./util/merge":101}],30:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isEmpty;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
var _merge = _interopRequireDefault(require("./util/merge"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var default_is_empty_options = {
|
|||
|
ignore_whitespace: false
|
|||
|
};
|
|||
|
|
|||
|
function isEmpty(str, options) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
options = (0, _merge.default)(options, default_is_empty_options);
|
|||
|
return (options.ignore_whitespace ? str.trim().length : str.length) === 0;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99,"./util/merge":101}],31:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isEthereumAddress;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var eth = /^(0x)[0-9a-f]{40}$/i;
|
|||
|
|
|||
|
function isEthereumAddress(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return eth.test(str);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],32:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isFQDN;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
var _merge = _interopRequireDefault(require("./util/merge"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var default_fqdn_options = {
|
|||
|
require_tld: true,
|
|||
|
allow_underscores: false,
|
|||
|
allow_trailing_dot: false,
|
|||
|
allow_numeric_tld: false,
|
|||
|
allow_wildcard: false
|
|||
|
};
|
|||
|
|
|||
|
function isFQDN(str, options) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
options = (0, _merge.default)(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);
|
|||
|
}
|
|||
|
/* Remove the optional wildcard before checking validity */
|
|||
|
|
|||
|
|
|||
|
if (options.allow_wildcard === true && str.indexOf('*.') === 0) {
|
|||
|
str = str.substring(2);
|
|||
|
}
|
|||
|
|
|||
|
var parts = str.split('.');
|
|||
|
var tld = parts[parts.length - 1];
|
|||
|
|
|||
|
if (options.require_tld) {
|
|||
|
// disallow fqdns without tld
|
|||
|
if (parts.length < 2) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (!/^([a-z\u00A1-\u00A8\u00AA-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]{2,}|xn[a-z0-9-]{2,})$/i.test(tld)) {
|
|||
|
return false;
|
|||
|
} // disallow spaces
|
|||
|
|
|||
|
|
|||
|
if (/\s/.test(tld)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
} // reject numeric TLDs
|
|||
|
|
|||
|
|
|||
|
if (!options.allow_numeric_tld && /^\d+$/.test(tld)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
return parts.every(function (part) {
|
|||
|
if (part.length > 63) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (!/^[a-z_\u00a1-\uffff0-9-]+$/i.test(part)) {
|
|||
|
return false;
|
|||
|
} // disallow full-width chars
|
|||
|
|
|||
|
|
|||
|
if (/[\uff01-\uff5e]/.test(part)) {
|
|||
|
return false;
|
|||
|
} // disallow parts starting or ending with hyphen
|
|||
|
|
|||
|
|
|||
|
if (/^-|-$/.test(part)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (!options.allow_underscores && /_/.test(part)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99,"./util/merge":101}],33:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isFloat;
|
|||
|
exports.locales = void 0;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
var _alpha = require("./alpha");
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function isFloat(str, options) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
options = options || {};
|
|||
|
var float = new RegExp("^(?:[-+])?(?:[0-9]+)?(?:\\".concat(options.locale ? _alpha.decimal[options.locale] : '.', "[0-9]*)?(?:[eE][\\+\\-]?(?:[0-9]+))?$"));
|
|||
|
|
|||
|
if (str === '' || str === '.' || str === '-' || str === '+') {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
var value = parseFloat(str.replace(',', '.'));
|
|||
|
return float.test(str) && (!options.hasOwnProperty('min') || value >= options.min) && (!options.hasOwnProperty('max') || value <= options.max) && (!options.hasOwnProperty('lt') || value < options.lt) && (!options.hasOwnProperty('gt') || value > options.gt);
|
|||
|
}
|
|||
|
|
|||
|
var locales = Object.keys(_alpha.decimal);
|
|||
|
exports.locales = locales;
|
|||
|
},{"./alpha":5,"./util/assertString":99}],34:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isFullWidth;
|
|||
|
exports.fullWidth = void 0;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var fullWidth = /[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/;
|
|||
|
exports.fullWidth = fullWidth;
|
|||
|
|
|||
|
function isFullWidth(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return fullWidth.test(str);
|
|||
|
}
|
|||
|
},{"./util/assertString":99}],35:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isHSL;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var hslComma = /^hsla?\(((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?))(deg|grad|rad|turn)?(,(\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%){2}(,((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%?))?\)$/i;
|
|||
|
var hslSpace = /^hsla?\(((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?))(deg|grad|rad|turn)?(\s(\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%){2}\s?(\/\s((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%?)\s?)?\)$/i;
|
|||
|
|
|||
|
function isHSL(str) {
|
|||
|
(0, _assertString.default)(str); // Strip duplicate spaces before calling the validation regex (See #1598 for more info)
|
|||
|
|
|||
|
var strippedStr = str.replace(/\s+/g, ' ').replace(/\s?(hsla?\(|\)|,)\s?/ig, '$1');
|
|||
|
|
|||
|
if (strippedStr.indexOf(',') !== -1) {
|
|||
|
return hslComma.test(strippedStr);
|
|||
|
}
|
|||
|
|
|||
|
return hslSpace.test(strippedStr);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],36:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isHalfWidth;
|
|||
|
exports.halfWidth = void 0;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var halfWidth = /[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/;
|
|||
|
exports.halfWidth = halfWidth;
|
|||
|
|
|||
|
function isHalfWidth(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return halfWidth.test(str);
|
|||
|
}
|
|||
|
},{"./util/assertString":99}],37:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isHash;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var lengths = {
|
|||
|
md5: 32,
|
|||
|
md4: 32,
|
|||
|
sha1: 40,
|
|||
|
sha256: 64,
|
|||
|
sha384: 96,
|
|||
|
sha512: 128,
|
|||
|
ripemd128: 32,
|
|||
|
ripemd160: 40,
|
|||
|
tiger128: 32,
|
|||
|
tiger160: 40,
|
|||
|
tiger192: 48,
|
|||
|
crc32: 8,
|
|||
|
crc32b: 8
|
|||
|
};
|
|||
|
|
|||
|
function isHash(str, algorithm) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
var hash = new RegExp("^[a-fA-F0-9]{".concat(lengths[algorithm], "}$"));
|
|||
|
return hash.test(str);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],38:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isHexColor;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var hexcolor = /^#?([0-9A-F]{3}|[0-9A-F]{4}|[0-9A-F]{6}|[0-9A-F]{8})$/i;
|
|||
|
|
|||
|
function isHexColor(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return hexcolor.test(str);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],39:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isHexadecimal;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var hexadecimal = /^(0x|0h)?[0-9A-F]+$/i;
|
|||
|
|
|||
|
function isHexadecimal(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return hexadecimal.test(str);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],40:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isIBAN;
|
|||
|
exports.locales = void 0;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
/**
|
|||
|
* List of country codes with
|
|||
|
* corresponding IBAN regular expression
|
|||
|
* Reference: https://en.wikipedia.org/wiki/International_Bank_Account_Number
|
|||
|
*/
|
|||
|
var ibanRegexThroughCountryCode = {
|
|||
|
AD: /^(AD[0-9]{2})\d{8}[A-Z0-9]{12}$/,
|
|||
|
AE: /^(AE[0-9]{2})\d{3}\d{16}$/,
|
|||
|
AL: /^(AL[0-9]{2})\d{8}[A-Z0-9]{16}$/,
|
|||
|
AT: /^(AT[0-9]{2})\d{16}$/,
|
|||
|
AZ: /^(AZ[0-9]{2})[A-Z0-9]{4}\d{20}$/,
|
|||
|
BA: /^(BA[0-9]{2})\d{16}$/,
|
|||
|
BE: /^(BE[0-9]{2})\d{12}$/,
|
|||
|
BG: /^(BG[0-9]{2})[A-Z]{4}\d{6}[A-Z0-9]{8}$/,
|
|||
|
BH: /^(BH[0-9]{2})[A-Z]{4}[A-Z0-9]{14}$/,
|
|||
|
BR: /^(BR[0-9]{2})\d{23}[A-Z]{1}[A-Z0-9]{1}$/,
|
|||
|
BY: /^(BY[0-9]{2})[A-Z0-9]{4}\d{20}$/,
|
|||
|
CH: /^(CH[0-9]{2})\d{5}[A-Z0-9]{12}$/,
|
|||
|
CR: /^(CR[0-9]{2})\d{18}$/,
|
|||
|
CY: /^(CY[0-9]{2})\d{8}[A-Z0-9]{16}$/,
|
|||
|
CZ: /^(CZ[0-9]{2})\d{20}$/,
|
|||
|
DE: /^(DE[0-9]{2})\d{18}$/,
|
|||
|
DK: /^(DK[0-9]{2})\d{14}$/,
|
|||
|
DO: /^(DO[0-9]{2})[A-Z]{4}\d{20}$/,
|
|||
|
EE: /^(EE[0-9]{2})\d{16}$/,
|
|||
|
EG: /^(EG[0-9]{2})\d{25}$/,
|
|||
|
ES: /^(ES[0-9]{2})\d{20}$/,
|
|||
|
FI: /^(FI[0-9]{2})\d{14}$/,
|
|||
|
FO: /^(FO[0-9]{2})\d{14}$/,
|
|||
|
FR: /^(FR[0-9]{2})\d{10}[A-Z0-9]{11}\d{2}$/,
|
|||
|
GB: /^(GB[0-9]{2})[A-Z]{4}\d{14}$/,
|
|||
|
GE: /^(GE[0-9]{2})[A-Z0-9]{2}\d{16}$/,
|
|||
|
GI: /^(GI[0-9]{2})[A-Z]{4}[A-Z0-9]{15}$/,
|
|||
|
GL: /^(GL[0-9]{2})\d{14}$/,
|
|||
|
GR: /^(GR[0-9]{2})\d{7}[A-Z0-9]{16}$/,
|
|||
|
GT: /^(GT[0-9]{2})[A-Z0-9]{4}[A-Z0-9]{20}$/,
|
|||
|
HR: /^(HR[0-9]{2})\d{17}$/,
|
|||
|
HU: /^(HU[0-9]{2})\d{24}$/,
|
|||
|
IE: /^(IE[0-9]{2})[A-Z0-9]{4}\d{14}$/,
|
|||
|
IL: /^(IL[0-9]{2})\d{19}$/,
|
|||
|
IQ: /^(IQ[0-9]{2})[A-Z]{4}\d{15}$/,
|
|||
|
IR: /^(IR[0-9]{2})0\d{2}0\d{18}$/,
|
|||
|
IS: /^(IS[0-9]{2})\d{22}$/,
|
|||
|
IT: /^(IT[0-9]{2})[A-Z]{1}\d{10}[A-Z0-9]{12}$/,
|
|||
|
JO: /^(JO[0-9]{2})[A-Z]{4}\d{22}$/,
|
|||
|
KW: /^(KW[0-9]{2})[A-Z]{4}[A-Z0-9]{22}$/,
|
|||
|
KZ: /^(KZ[0-9]{2})\d{3}[A-Z0-9]{13}$/,
|
|||
|
LB: /^(LB[0-9]{2})\d{4}[A-Z0-9]{20}$/,
|
|||
|
LC: /^(LC[0-9]{2})[A-Z]{4}[A-Z0-9]{24}$/,
|
|||
|
LI: /^(LI[0-9]{2})\d{5}[A-Z0-9]{12}$/,
|
|||
|
LT: /^(LT[0-9]{2})\d{16}$/,
|
|||
|
LU: /^(LU[0-9]{2})\d{3}[A-Z0-9]{13}$/,
|
|||
|
LV: /^(LV[0-9]{2})[A-Z]{4}[A-Z0-9]{13}$/,
|
|||
|
MC: /^(MC[0-9]{2})\d{10}[A-Z0-9]{11}\d{2}$/,
|
|||
|
MD: /^(MD[0-9]{2})[A-Z0-9]{20}$/,
|
|||
|
ME: /^(ME[0-9]{2})\d{18}$/,
|
|||
|
MK: /^(MK[0-9]{2})\d{3}[A-Z0-9]{10}\d{2}$/,
|
|||
|
MR: /^(MR[0-9]{2})\d{23}$/,
|
|||
|
MT: /^(MT[0-9]{2})[A-Z]{4}\d{5}[A-Z0-9]{18}$/,
|
|||
|
MU: /^(MU[0-9]{2})[A-Z]{4}\d{19}[A-Z]{3}$/,
|
|||
|
MZ: /^(MZ[0-9]{2})\d{21}$/,
|
|||
|
NL: /^(NL[0-9]{2})[A-Z]{4}\d{10}$/,
|
|||
|
NO: /^(NO[0-9]{2})\d{11}$/,
|
|||
|
PK: /^(PK[0-9]{2})[A-Z0-9]{4}\d{16}$/,
|
|||
|
PL: /^(PL[0-9]{2})\d{24}$/,
|
|||
|
PS: /^(PS[0-9]{2})[A-Z0-9]{4}\d{21}$/,
|
|||
|
PT: /^(PT[0-9]{2})\d{21}$/,
|
|||
|
QA: /^(QA[0-9]{2})[A-Z]{4}[A-Z0-9]{21}$/,
|
|||
|
RO: /^(RO[0-9]{2})[A-Z]{4}[A-Z0-9]{16}$/,
|
|||
|
RS: /^(RS[0-9]{2})\d{18}$/,
|
|||
|
SA: /^(SA[0-9]{2})\d{2}[A-Z0-9]{18}$/,
|
|||
|
SC: /^(SC[0-9]{2})[A-Z]{4}\d{20}[A-Z]{3}$/,
|
|||
|
SE: /^(SE[0-9]{2})\d{20}$/,
|
|||
|
SI: /^(SI[0-9]{2})\d{15}$/,
|
|||
|
SK: /^(SK[0-9]{2})\d{20}$/,
|
|||
|
SM: /^(SM[0-9]{2})[A-Z]{1}\d{10}[A-Z0-9]{12}$/,
|
|||
|
SV: /^(SV[0-9]{2})[A-Z0-9]{4}\d{20}$/,
|
|||
|
TL: /^(TL[0-9]{2})\d{19}$/,
|
|||
|
TN: /^(TN[0-9]{2})\d{20}$/,
|
|||
|
TR: /^(TR[0-9]{2})\d{5}[A-Z0-9]{17}$/,
|
|||
|
UA: /^(UA[0-9]{2})\d{6}[A-Z0-9]{19}$/,
|
|||
|
VA: /^(VA[0-9]{2})\d{18}$/,
|
|||
|
VG: /^(VG[0-9]{2})[A-Z0-9]{4}\d{16}$/,
|
|||
|
XK: /^(XK[0-9]{2})\d{16}$/
|
|||
|
};
|
|||
|
/**
|
|||
|
* Check whether string has correct universal IBAN format
|
|||
|
* The IBAN consists of up to 34 alphanumeric characters, as follows:
|
|||
|
* Country Code using ISO 3166-1 alpha-2, two letters
|
|||
|
* check digits, two digits and
|
|||
|
* Basic Bank Account Number (BBAN), up to 30 alphanumeric characters.
|
|||
|
* NOTE: Permitted IBAN characters are: digits [0-9] and the 26 latin alphabetic [A-Z]
|
|||
|
*
|
|||
|
* @param {string} str - string under validation
|
|||
|
* @return {boolean}
|
|||
|
*/
|
|||
|
|
|||
|
function hasValidIbanFormat(str) {
|
|||
|
// Strip white spaces and hyphens
|
|||
|
var strippedStr = str.replace(/[\s\-]+/gi, '').toUpperCase();
|
|||
|
var isoCountryCode = strippedStr.slice(0, 2).toUpperCase();
|
|||
|
return isoCountryCode in ibanRegexThroughCountryCode && ibanRegexThroughCountryCode[isoCountryCode].test(strippedStr);
|
|||
|
}
|
|||
|
/**
|
|||
|
* Check whether string has valid IBAN Checksum
|
|||
|
* by performing basic mod-97 operation and
|
|||
|
* the remainder should equal 1
|
|||
|
* -- Start by rearranging the IBAN by moving the four initial characters to the end of the string
|
|||
|
* -- Replace each letter in the string with two digits, A -> 10, B = 11, Z = 35
|
|||
|
* -- Interpret the string as a decimal integer and
|
|||
|
* -- compute the remainder on division by 97 (mod 97)
|
|||
|
* Reference: https://en.wikipedia.org/wiki/International_Bank_Account_Number
|
|||
|
*
|
|||
|
* @param {string} str
|
|||
|
* @return {boolean}
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function hasValidIbanChecksum(str) {
|
|||
|
var strippedStr = str.replace(/[^A-Z0-9]+/gi, '').toUpperCase(); // Keep only digits and A-Z latin alphabetic
|
|||
|
|
|||
|
var rearranged = strippedStr.slice(4) + strippedStr.slice(0, 4);
|
|||
|
var alphaCapsReplacedWithDigits = rearranged.replace(/[A-Z]/g, function (char) {
|
|||
|
return char.charCodeAt(0) - 55;
|
|||
|
});
|
|||
|
var remainder = alphaCapsReplacedWithDigits.match(/\d{1,7}/g).reduce(function (acc, value) {
|
|||
|
return Number(acc + value) % 97;
|
|||
|
}, '');
|
|||
|
return remainder === 1;
|
|||
|
}
|
|||
|
|
|||
|
function isIBAN(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return hasValidIbanFormat(str) && hasValidIbanChecksum(str);
|
|||
|
}
|
|||
|
|
|||
|
var locales = Object.keys(ibanRegexThroughCountryCode);
|
|||
|
exports.locales = locales;
|
|||
|
},{"./util/assertString":99}],41:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isIMEI;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var imeiRegexWithoutHypens = /^[0-9]{15}$/;
|
|||
|
var imeiRegexWithHypens = /^\d{2}-\d{6}-\d{6}-\d{1}$/;
|
|||
|
|
|||
|
function isIMEI(str, options) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
options = options || {}; // default regex for checking imei is the one without hyphens
|
|||
|
|
|||
|
var imeiRegex = imeiRegexWithoutHypens;
|
|||
|
|
|||
|
if (options.allow_hyphens) {
|
|||
|
imeiRegex = imeiRegexWithHypens;
|
|||
|
}
|
|||
|
|
|||
|
if (!imeiRegex.test(str)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
str = str.replace(/-/g, '');
|
|||
|
var sum = 0,
|
|||
|
mul = 2,
|
|||
|
l = 14;
|
|||
|
|
|||
|
for (var i = 0; i < l; i++) {
|
|||
|
var digit = str.substring(l - i - 1, l - i);
|
|||
|
var tp = parseInt(digit, 10) * mul;
|
|||
|
|
|||
|
if (tp >= 10) {
|
|||
|
sum += tp % 10 + 1;
|
|||
|
} else {
|
|||
|
sum += tp;
|
|||
|
}
|
|||
|
|
|||
|
if (mul === 1) {
|
|||
|
mul += 1;
|
|||
|
} else {
|
|||
|
mul -= 1;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
var chk = (10 - sum % 10) % 10;
|
|||
|
|
|||
|
if (chk !== parseInt(str.substring(14, 15), 10)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],42:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isIP;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
/**
|
|||
|
11.3. Examples
|
|||
|
|
|||
|
The following addresses
|
|||
|
|
|||
|
fe80::1234 (on the 1st link of the node)
|
|||
|
ff02::5678 (on the 5th link of the node)
|
|||
|
ff08::9abc (on the 10th organization of the node)
|
|||
|
|
|||
|
would be represented as follows:
|
|||
|
|
|||
|
fe80::1234%1
|
|||
|
ff02::5678%5
|
|||
|
ff08::9abc%10
|
|||
|
|
|||
|
(Here we assume a natural translation from a zone index to the
|
|||
|
<zone_id> part, where the Nth zone of any scope is translated into
|
|||
|
"N".)
|
|||
|
|
|||
|
If we use interface names as <zone_id>, those addresses could also be
|
|||
|
represented as follows:
|
|||
|
|
|||
|
fe80::1234%ne0
|
|||
|
ff02::5678%pvc1.3
|
|||
|
ff08::9abc%interface10
|
|||
|
|
|||
|
where the interface "ne0" belongs to the 1st link, "pvc1.3" belongs
|
|||
|
to the 5th link, and "interface10" belongs to the 10th organization.
|
|||
|
* * */
|
|||
|
var IPv4SegmentFormat = '(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';
|
|||
|
var IPv4AddressFormat = "(".concat(IPv4SegmentFormat, "[.]){3}").concat(IPv4SegmentFormat);
|
|||
|
var IPv4AddressRegExp = new RegExp("^".concat(IPv4AddressFormat, "$"));
|
|||
|
var IPv6SegmentFormat = '(?:[0-9a-fA-F]{1,4})';
|
|||
|
var IPv6AddressRegExp = new RegExp('^(' + "(?:".concat(IPv6SegmentFormat, ":){7}(?:").concat(IPv6SegmentFormat, "|:)|") + "(?:".concat(IPv6SegmentFormat, ":){6}(?:").concat(IPv4AddressFormat, "|:").concat(IPv6SegmentFormat, "|:)|") + "(?:".concat(IPv6SegmentFormat, ":){5}(?::").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,2}|:)|") + "(?:".concat(IPv6SegmentFormat, ":){4}(?:(:").concat(IPv6SegmentFormat, "){0,1}:").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,3}|:)|") + "(?:".concat(IPv6SegmentFormat, ":){3}(?:(:").concat(IPv6SegmentFormat, "){0,2}:").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,4}|:)|") + "(?:".concat(IPv6SegmentFormat, ":){2}(?:(:").concat(IPv6SegmentFormat, "){0,3}:").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,5}|:)|") + "(?:".concat(IPv6SegmentFormat, ":){1}(?:(:").concat(IPv6SegmentFormat, "){0,4}:").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,6}|:)|") + "(?::((?::".concat(IPv6SegmentFormat, "){0,5}:").concat(IPv4AddressFormat, "|(?::").concat(IPv6SegmentFormat, "){1,7}|:))") + ')(%[0-9a-zA-Z-.:]{1,})?$');
|
|||
|
|
|||
|
function isIP(str) {
|
|||
|
var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
|||
|
(0, _assertString.default)(str);
|
|||
|
version = String(version);
|
|||
|
|
|||
|
if (!version) {
|
|||
|
return isIP(str, 4) || isIP(str, 6);
|
|||
|
}
|
|||
|
|
|||
|
if (version === '4') {
|
|||
|
if (!IPv4AddressRegExp.test(str)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
var parts = str.split('.').sort(function (a, b) {
|
|||
|
return a - b;
|
|||
|
});
|
|||
|
return parts[3] <= 255;
|
|||
|
}
|
|||
|
|
|||
|
if (version === '6') {
|
|||
|
return !!IPv6AddressRegExp.test(str);
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],43:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isIPRange;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
var _isIP = _interopRequireDefault(require("./isIP"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var subnetMaybe = /^\d{1,3}$/;
|
|||
|
var v4Subnet = 32;
|
|||
|
var v6Subnet = 128;
|
|||
|
|
|||
|
function isIPRange(str) {
|
|||
|
var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
|||
|
(0, _assertString.default)(str);
|
|||
|
var parts = str.split('/'); // parts[0] -> ip, parts[1] -> subnet
|
|||
|
|
|||
|
if (parts.length !== 2) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (!subnetMaybe.test(parts[1])) {
|
|||
|
return false;
|
|||
|
} // Disallow preceding 0 i.e. 01, 02, ...
|
|||
|
|
|||
|
|
|||
|
if (parts[1].length > 1 && parts[1].startsWith('0')) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
var isValidIP = (0, _isIP.default)(parts[0], version);
|
|||
|
|
|||
|
if (!isValidIP) {
|
|||
|
return false;
|
|||
|
} // Define valid subnet according to IP's version
|
|||
|
|
|||
|
|
|||
|
var expectedSubnet = null;
|
|||
|
|
|||
|
switch (String(version)) {
|
|||
|
case '4':
|
|||
|
expectedSubnet = v4Subnet;
|
|||
|
break;
|
|||
|
|
|||
|
case '6':
|
|||
|
expectedSubnet = v6Subnet;
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
expectedSubnet = (0, _isIP.default)(parts[0], '6') ? v6Subnet : v4Subnet;
|
|||
|
}
|
|||
|
|
|||
|
return parts[1] <= expectedSubnet && parts[1] >= 0;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./isIP":42,"./util/assertString":99}],44:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isISBN;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var isbn10Maybe = /^(?:[0-9]{9}X|[0-9]{10})$/;
|
|||
|
var isbn13Maybe = /^(?:[0-9]{13})$/;
|
|||
|
var factor = [1, 3];
|
|||
|
|
|||
|
function isISBN(str) {
|
|||
|
var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
|||
|
(0, _assertString.default)(str);
|
|||
|
version = String(version);
|
|||
|
|
|||
|
if (!version) {
|
|||
|
return isISBN(str, 10) || isISBN(str, 13);
|
|||
|
}
|
|||
|
|
|||
|
var sanitized = str.replace(/[\s-]+/g, '');
|
|||
|
var checksum = 0;
|
|||
|
var 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;
|
|||
|
}
|
|||
|
|
|||
|
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;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],45:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isISIN;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var isin = /^[A-Z]{2}[0-9A-Z]{9}[0-9]$/; // this link details how the check digit is calculated:
|
|||
|
// https://www.isin.org/isin-format/. it is a little bit
|
|||
|
// odd in that it works with digits, not numbers. in order
|
|||
|
// to make only one pass through the ISIN characters, the
|
|||
|
// each alpha character is handled as 2 characters within
|
|||
|
// the loop.
|
|||
|
|
|||
|
function isISIN(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
|
|||
|
if (!isin.test(str)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
var double = true;
|
|||
|
var sum = 0; // convert values
|
|||
|
|
|||
|
for (var i = str.length - 2; i >= 0; i--) {
|
|||
|
if (str[i] >= 'A' && str[i] <= 'Z') {
|
|||
|
var value = str[i].charCodeAt(0) - 55;
|
|||
|
var lo = value % 10;
|
|||
|
var hi = Math.trunc(value / 10); // letters have two digits, so handle the low order
|
|||
|
// and high order digits separately.
|
|||
|
|
|||
|
for (var _i = 0, _arr = [lo, hi]; _i < _arr.length; _i++) {
|
|||
|
var digit = _arr[_i];
|
|||
|
|
|||
|
if (double) {
|
|||
|
if (digit >= 5) {
|
|||
|
sum += 1 + (digit - 5) * 2;
|
|||
|
} else {
|
|||
|
sum += digit * 2;
|
|||
|
}
|
|||
|
} else {
|
|||
|
sum += digit;
|
|||
|
}
|
|||
|
|
|||
|
double = !double;
|
|||
|
}
|
|||
|
} else {
|
|||
|
var _digit = str[i].charCodeAt(0) - '0'.charCodeAt(0);
|
|||
|
|
|||
|
if (double) {
|
|||
|
if (_digit >= 5) {
|
|||
|
sum += 1 + (_digit - 5) * 2;
|
|||
|
} else {
|
|||
|
sum += _digit * 2;
|
|||
|
}
|
|||
|
} else {
|
|||
|
sum += _digit;
|
|||
|
}
|
|||
|
|
|||
|
double = !double;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
var check = Math.trunc((sum + 9) / 10) * 10 - sum;
|
|||
|
return +str[str.length - 1] === check;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],46:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isISO31661Alpha2;
|
|||
|
exports.CountryCodes = void 0;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
// from https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
|
|||
|
var validISO31661Alpha2CountriesCodes = new Set(['AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AO', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AW', 'AX', 'AZ', 'BA', 'BB', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BL', 'BM', 'BN', 'BO', 'BQ', 'BR', 'BS', 'BT', 'BV', 'BW', 'BY', 'BZ', 'CA', 'CC', 'CD', 'CF', 'CG', 'CH', 'CI', 'CK', 'CL', 'CM', 'CN', 'CO', 'CR', 'CU', 'CV', 'CW', 'CX', 'CY', 'CZ', 'DE', 'DJ', 'DK', 'DM', 'DO', 'DZ', 'EC', 'EE', 'EG', 'EH', 'ER', 'ES', 'ET', 'FI', 'FJ', 'FK', 'FM', 'FO', 'FR', 'GA', 'GB', 'GD', 'GE', 'GF', 'GG', 'GH', 'GI', 'GL', 'GM', 'GN', 'GP', 'GQ', 'GR', 'GS', 'GT', 'GU', 'GW', 'GY', 'HK', 'HM', 'HN', 'HR', 'HT', 'HU', 'ID', 'IE', 'IL', 'IM', 'IN', 'IO', 'IQ', 'IR', 'IS', 'IT', 'JE', 'JM', 'JO', 'JP', 'KE', 'KG', 'KH', 'KI', 'KM', 'KN', 'KP', 'KR', 'KW', 'KY', 'KZ', 'LA', 'LB', 'LC', 'LI', 'LK', 'LR', 'LS', 'LT', 'LU', 'LV', 'LY', 'MA', 'MC', 'MD', 'ME', 'MF', 'MG', 'MH', 'MK', 'ML', 'MM', 'MN', 'MO', 'MP', 'MQ', 'MR', 'MS', 'MT', 'MU', 'MV', 'MW', 'MX', 'MY', 'MZ', 'NA', 'NC', 'NE', 'NF', 'NG', 'NI', 'NL', 'NO', 'NP', 'NR', 'NU', 'NZ', 'OM', 'PA', 'PE', 'PF', 'PG', 'PH', 'PK', 'PL', 'PM', 'PN', 'PR', 'PS', 'PT', 'PW', 'PY', 'QA', 'RE', 'RO', 'RS', 'RU', 'RW', 'SA', 'SB', 'SC', 'SD', 'SE', 'SG', 'SH', 'SI', 'SJ', 'SK', 'SL', 'SM', 'SN', 'SO', 'SR', 'SS', 'ST', 'SV', 'SX', 'SY', 'SZ', 'TC', 'TD', 'TF', 'TG', 'TH', 'TJ', 'TK', 'TL', 'TM', 'TN', 'TO', 'TR', 'TT', 'TV', 'TW', 'TZ', 'UA', 'UG', 'UM', 'US', 'UY', 'UZ', 'VA', 'VC', 'VE', 'VG', 'VI', 'VN', 'VU', 'WF', 'WS', 'YE', 'YT', 'ZA', 'ZM', 'ZW']);
|
|||
|
|
|||
|
function isISO31661Alpha2(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return validISO31661Alpha2CountriesCodes.has(str.toUpperCase());
|
|||
|
}
|
|||
|
|
|||
|
var CountryCodes = validISO31661Alpha2CountriesCodes;
|
|||
|
exports.CountryCodes = CountryCodes;
|
|||
|
},{"./util/assertString":99}],47:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isISO31661Alpha3;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
// from https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3
|
|||
|
var validISO31661Alpha3CountriesCodes = new Set(['AFG', 'ALA', 'ALB', 'DZA', 'ASM', 'AND', 'AGO', 'AIA', 'ATA', 'ATG', 'ARG', 'ARM', 'ABW', 'AUS', 'AUT', 'AZE', 'BHS', 'BHR', 'BGD', 'BRB', 'BLR', 'BEL', 'BLZ', 'BEN', 'BMU', 'BTN', 'BOL', 'BES', 'BIH', 'BWA', 'BVT', 'BRA', 'IOT', 'BRN', 'BGR', 'BFA', 'BDI', 'KHM', 'CMR', 'CAN', 'CPV', 'CYM', 'CAF', 'TCD', 'CHL', 'CHN', 'CXR', 'CCK', 'COL', 'COM', 'COG', 'COD', 'COK', 'CRI', 'CIV', 'HRV', 'CUB', 'CUW', 'CYP', 'CZE', 'DNK', 'DJI', 'DMA', 'DOM', 'ECU', 'EGY', 'SLV', 'GNQ', 'ERI', 'EST', 'ETH', 'FLK', 'FRO', 'FJI', 'FIN', 'FRA', 'GUF', 'PYF', 'ATF', 'GAB', 'GMB', 'GEO', 'DEU', 'GHA', 'GIB', 'GRC', 'GRL', 'GRD', 'GLP', 'GUM', 'GTM', 'GGY', 'GIN', 'GNB', 'GUY', 'HTI', 'HMD', 'VAT', 'HND', 'HKG', 'HUN', 'ISL', 'IND', 'IDN', 'IRN', 'IRQ', 'IRL', 'IMN', 'ISR', 'ITA', 'JAM', 'JPN', 'JEY', 'JOR', 'KAZ', 'KEN', 'KIR', 'PRK', 'KOR', 'KWT', 'KGZ', 'LAO', 'LVA', 'LBN', 'LSO', 'LBR', 'LBY', 'LIE', 'LTU', 'LUX', 'MAC', 'MKD', 'MDG', 'MWI', 'MYS', 'MDV', 'MLI', 'MLT', 'MHL', 'MTQ', 'MRT', 'MUS', 'MYT', 'MEX', 'FSM', 'MDA', 'MCO', 'MNG', 'MNE', 'MSR', 'MAR', 'MOZ', 'MMR', 'NAM', 'NRU', 'NPL', 'NLD', 'NCL', 'NZL', 'NIC', 'NER', 'NGA', 'NIU', 'NFK', 'MNP', 'NOR', 'OMN', 'PAK', 'PLW', 'PSE', 'PAN', 'PNG', 'PRY', 'PER', 'PHL', 'PCN', 'POL', 'PRT', 'PRI', 'QAT', 'REU', 'ROU', 'RUS', 'RWA', 'BLM', 'SHN', 'KNA', 'LCA', 'MAF', 'SPM', 'VCT', 'WSM', 'SMR', 'STP', 'SAU', 'SEN', 'SRB', 'SYC', 'SLE', 'SGP', 'SXM', 'SVK', 'SVN', 'SLB', 'SOM', 'ZAF', 'SGS', 'SSD', 'ESP', 'LKA', 'SDN', 'SUR', 'SJM', 'SWZ', 'SWE', 'CHE', 'SYR', 'TWN', 'TJK', 'TZA', 'THA', 'TLS', 'TGO', 'TKL', 'TON', 'TTO', 'TUN', 'TUR', 'TKM', 'TCA', 'TUV', 'UGA', 'UKR', 'ARE', 'GBR', 'USA', 'UMI', 'URY', 'UZB', 'VUT', 'VEN', 'VNM', 'VGB', 'VIR', 'WLF', 'ESH', 'YEM', 'ZMB', 'ZWE']);
|
|||
|
|
|||
|
function isISO31661Alpha3(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return validISO31661Alpha3CountriesCodes.has(str.toUpperCase());
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],48:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isISO4217;
|
|||
|
exports.CurrencyCodes = void 0;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
// from https://en.wikipedia.org/wiki/ISO_4217
|
|||
|
var validISO4217CurrencyCodes = new Set(['AED', 'AFN', 'ALL', 'AMD', 'ANG', 'AOA', 'ARS', 'AUD', 'AWG', 'AZN', 'BAM', 'BBD', 'BDT', 'BGN', 'BHD', 'BIF', 'BMD', 'BND', 'BOB', 'BOV', 'BRL', 'BSD', 'BTN', 'BWP', 'BYN', 'BZD', 'CAD', 'CDF', 'CHE', 'CHF', 'CHW', 'CLF', 'CLP', 'CNY', 'COP', 'COU', 'CRC', 'CUC', 'CUP', 'CVE', 'CZK', 'DJF', 'DKK', 'DOP', 'DZD', 'EGP', 'ERN', 'ETB', 'EUR', 'FJD', 'FKP', 'GBP', 'GEL', 'GHS', 'GIP', 'GMD', 'GNF', 'GTQ', 'GYD', 'HKD', 'HNL', 'HRK', 'HTG', 'HUF', 'IDR', 'ILS', 'INR', 'IQD', 'IRR', 'ISK', 'JMD', 'JOD', 'JPY', 'KES', 'KGS', 'KHR', 'KMF', 'KPW', 'KRW', 'KWD', 'KYD', 'KZT', 'LAK', 'LBP', 'LKR', 'LRD', 'LSL', 'LYD', 'MAD', 'MDL', 'MGA', 'MKD', 'MMK', 'MNT', 'MOP', 'MRU', 'MUR', 'MVR', 'MWK', 'MXN', 'MXV', 'MYR', 'MZN', 'NAD', 'NGN', 'NIO', 'NOK', 'NPR', 'NZD', 'OMR', 'PAB', 'PEN', 'PGK', 'PHP', 'PKR', 'PLN', 'PYG', 'QAR', 'RON', 'RSD', 'RUB', 'RWF', 'SAR', 'SBD', 'SCR', 'SDG', 'SEK', 'SGD', 'SHP', 'SLL', 'SOS', 'SRD', 'SSP', 'STN', 'SVC', 'SYP', 'SZL', 'THB', 'TJS', 'TMT', 'TND', 'TOP', 'TRY', 'TTD', 'TWD', 'TZS', 'UAH', 'UGX', 'USD', 'USN', 'UYI', 'UYU', 'UYW', 'UZS', 'VES', 'VND', 'VUV', 'WST', 'XAF', 'XAG', 'XAU', 'XBA', 'XBB', 'XBC', 'XBD', 'XCD', 'XDR', 'XOF', 'XPD', 'XPF', 'XPT', 'XSU', 'XTS', 'XUA', 'XXX', 'YER', 'ZAR', 'ZMW', 'ZWL']);
|
|||
|
|
|||
|
function isISO4217(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return validISO4217CurrencyCodes.has(str.toUpperCase());
|
|||
|
}
|
|||
|
|
|||
|
var CurrencyCodes = validISO4217CurrencyCodes;
|
|||
|
exports.CurrencyCodes = CurrencyCodes;
|
|||
|
},{"./util/assertString":99}],49:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isISO8601;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
/* eslint-disable max-len */
|
|||
|
// from http://goo.gl/0ejHHW
|
|||
|
var iso8601 = /^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-3])(-?[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)?)?)?)?$/; // same as above, except with a strict 'T' separator between date and time
|
|||
|
|
|||
|
var iso8601StrictSeparator = /^([\+-]?\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-3])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T]((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/;
|
|||
|
/* eslint-enable max-len */
|
|||
|
|
|||
|
var isValidDate = function isValidDate(str) {
|
|||
|
// str must have passed the ISO8601 check
|
|||
|
// this check is meant to catch invalid dates
|
|||
|
// like 2009-02-31
|
|||
|
// first check for ordinal dates
|
|||
|
var ordinalMatch = str.match(/^(\d{4})-?(\d{3})([ T]{1}\.*|$)/);
|
|||
|
|
|||
|
if (ordinalMatch) {
|
|||
|
var oYear = Number(ordinalMatch[1]);
|
|||
|
var oDay = Number(ordinalMatch[2]); // if is leap year
|
|||
|
|
|||
|
if (oYear % 4 === 0 && oYear % 100 !== 0 || oYear % 400 === 0) return oDay <= 366;
|
|||
|
return oDay <= 365;
|
|||
|
}
|
|||
|
|
|||
|
var match = str.match(/(\d{4})-?(\d{0,2})-?(\d*)/).map(Number);
|
|||
|
var year = match[1];
|
|||
|
var month = match[2];
|
|||
|
var day = match[3];
|
|||
|
var monthString = month ? "0".concat(month).slice(-2) : month;
|
|||
|
var dayString = day ? "0".concat(day).slice(-2) : day; // create a date object and compare
|
|||
|
|
|||
|
var d = new Date("".concat(year, "-").concat(monthString || '01', "-").concat(dayString || '01'));
|
|||
|
|
|||
|
if (month && day) {
|
|||
|
return d.getUTCFullYear() === year && d.getUTCMonth() + 1 === month && d.getUTCDate() === day;
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
};
|
|||
|
|
|||
|
function isISO8601(str) {
|
|||
|
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|||
|
(0, _assertString.default)(str);
|
|||
|
var check = options.strictSeparator ? iso8601StrictSeparator.test(str) : iso8601.test(str);
|
|||
|
if (check && options.strict) return isValidDate(str);
|
|||
|
return check;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],50:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isISRC;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
// see http://isrc.ifpi.org/en/isrc-standard/code-syntax
|
|||
|
var isrc = /^[A-Z]{2}[0-9A-Z]{3}\d{2}\d{5}$/;
|
|||
|
|
|||
|
function isISRC(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return isrc.test(str);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],51:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isISSN;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var issn = '^\\d{4}-?\\d{3}[\\dX]$';
|
|||
|
|
|||
|
function isISSN(str) {
|
|||
|
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|||
|
(0, _assertString.default)(str);
|
|||
|
var testIssn = issn;
|
|||
|
testIssn = options.require_hyphen ? testIssn.replace('?', '') : testIssn;
|
|||
|
testIssn = options.case_sensitive ? new RegExp(testIssn) : new RegExp(testIssn, 'i');
|
|||
|
|
|||
|
if (!testIssn.test(str)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
var digits = str.replace('-', '').toUpperCase();
|
|||
|
var checksum = 0;
|
|||
|
|
|||
|
for (var i = 0; i < digits.length; i++) {
|
|||
|
var digit = digits[i];
|
|||
|
checksum += (digit === 'X' ? 10 : +digit) * (8 - i);
|
|||
|
}
|
|||
|
|
|||
|
return checksum % 11 === 0;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],52:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isIdentityCard;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
var _isInt = _interopRequireDefault(require("./isInt"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var validators = {
|
|||
|
PL: function PL(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
var weightOfDigits = {
|
|||
|
1: 1,
|
|||
|
2: 3,
|
|||
|
3: 7,
|
|||
|
4: 9,
|
|||
|
5: 1,
|
|||
|
6: 3,
|
|||
|
7: 7,
|
|||
|
8: 9,
|
|||
|
9: 1,
|
|||
|
10: 3,
|
|||
|
11: 0
|
|||
|
};
|
|||
|
|
|||
|
if (str != null && str.length === 11 && (0, _isInt.default)(str, {
|
|||
|
allow_leading_zeroes: true
|
|||
|
})) {
|
|||
|
var digits = str.split('').slice(0, -1);
|
|||
|
var sum = digits.reduce(function (acc, digit, index) {
|
|||
|
return acc + Number(digit) * weightOfDigits[index + 1];
|
|||
|
}, 0);
|
|||
|
var modulo = sum % 10;
|
|||
|
var lastDigit = Number(str.charAt(str.length - 1));
|
|||
|
|
|||
|
if (modulo === 0 && lastDigit === 0 || lastDigit === 10 - modulo) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
},
|
|||
|
ES: function ES(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
var DNI = /^[0-9X-Z][0-9]{7}[TRWAGMYFPDXBNJZSQVHLCKE]$/;
|
|||
|
var charsValue = {
|
|||
|
X: 0,
|
|||
|
Y: 1,
|
|||
|
Z: 2
|
|||
|
};
|
|||
|
var controlDigits = ['T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'E']; // sanitize user input
|
|||
|
|
|||
|
var sanitized = str.trim().toUpperCase(); // validate the data structure
|
|||
|
|
|||
|
if (!DNI.test(sanitized)) {
|
|||
|
return false;
|
|||
|
} // validate the control digit
|
|||
|
|
|||
|
|
|||
|
var number = sanitized.slice(0, -1).replace(/[X,Y,Z]/g, function (char) {
|
|||
|
return charsValue[char];
|
|||
|
});
|
|||
|
return sanitized.endsWith(controlDigits[number % 23]);
|
|||
|
},
|
|||
|
FI: function FI(str) {
|
|||
|
// https://dvv.fi/en/personal-identity-code#:~:text=control%20character%20for%20a-,personal,-identity%20code%20calculated
|
|||
|
(0, _assertString.default)(str);
|
|||
|
|
|||
|
if (str.length !== 11) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (!str.match(/^\d{6}[\-A\+]\d{3}[0-9ABCDEFHJKLMNPRSTUVWXY]{1}$/)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
var checkDigits = '0123456789ABCDEFHJKLMNPRSTUVWXY';
|
|||
|
var idAsNumber = parseInt(str.slice(0, 6), 10) * 1000 + parseInt(str.slice(7, 10), 10);
|
|||
|
var remainder = idAsNumber % 31;
|
|||
|
var checkDigit = checkDigits[remainder];
|
|||
|
return checkDigit === str.slice(10, 11);
|
|||
|
},
|
|||
|
IN: function IN(str) {
|
|||
|
var DNI = /^[1-9]\d{3}\s?\d{4}\s?\d{4}$/; // multiplication table
|
|||
|
|
|||
|
var d = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 0, 6, 7, 8, 9, 5], [2, 3, 4, 0, 1, 7, 8, 9, 5, 6], [3, 4, 0, 1, 2, 8, 9, 5, 6, 7], [4, 0, 1, 2, 3, 9, 5, 6, 7, 8], [5, 9, 8, 7, 6, 0, 4, 3, 2, 1], [6, 5, 9, 8, 7, 1, 0, 4, 3, 2], [7, 6, 5, 9, 8, 2, 1, 0, 4, 3], [8, 7, 6, 5, 9, 3, 2, 1, 0, 4], [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]]; // permutation table
|
|||
|
|
|||
|
var p = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 5, 7, 6, 2, 8, 3, 0, 9, 4], [5, 8, 0, 3, 7, 9, 6, 1, 4, 2], [8, 9, 1, 6, 0, 4, 3, 5, 2, 7], [9, 4, 5, 3, 1, 2, 6, 8, 7, 0], [4, 2, 8, 6, 5, 7, 3, 9, 0, 1], [2, 7, 9, 3, 8, 0, 6, 4, 1, 5], [7, 0, 4, 6, 9, 1, 3, 2, 5, 8]]; // sanitize user input
|
|||
|
|
|||
|
var sanitized = str.trim(); // validate the data structure
|
|||
|
|
|||
|
if (!DNI.test(sanitized)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
var c = 0;
|
|||
|
var invertedArray = sanitized.replace(/\s/g, '').split('').map(Number).reverse();
|
|||
|
invertedArray.forEach(function (val, i) {
|
|||
|
c = d[c][p[i % 8][val]];
|
|||
|
});
|
|||
|
return c === 0;
|
|||
|
},
|
|||
|
IR: function IR(str) {
|
|||
|
if (!str.match(/^\d{10}$/)) return false;
|
|||
|
str = "0000".concat(str).substr(str.length - 6);
|
|||
|
if (parseInt(str.substr(3, 6), 10) === 0) return false;
|
|||
|
var lastNumber = parseInt(str.substr(9, 1), 10);
|
|||
|
var sum = 0;
|
|||
|
|
|||
|
for (var i = 0; i < 9; i++) {
|
|||
|
sum += parseInt(str.substr(i, 1), 10) * (10 - i);
|
|||
|
}
|
|||
|
|
|||
|
sum %= 11;
|
|||
|
return sum < 2 && lastNumber === sum || sum >= 2 && lastNumber === 11 - sum;
|
|||
|
},
|
|||
|
IT: function IT(str) {
|
|||
|
if (str.length !== 9) return false;
|
|||
|
if (str === 'CA00000AA') return false; // https://it.wikipedia.org/wiki/Carta_d%27identit%C3%A0_elettronica_italiana
|
|||
|
|
|||
|
return str.search(/C[A-Z][0-9]{5}[A-Z]{2}/i) > -1;
|
|||
|
},
|
|||
|
NO: function NO(str) {
|
|||
|
var sanitized = str.trim();
|
|||
|
if (isNaN(Number(sanitized))) return false;
|
|||
|
if (sanitized.length !== 11) return false;
|
|||
|
if (sanitized === '00000000000') return false; // https://no.wikipedia.org/wiki/F%C3%B8dselsnummer
|
|||
|
|
|||
|
var f = sanitized.split('').map(Number);
|
|||
|
var k1 = (11 - (3 * f[0] + 7 * f[1] + 6 * f[2] + 1 * f[3] + 8 * f[4] + 9 * f[5] + 4 * f[6] + 5 * f[7] + 2 * f[8]) % 11) % 11;
|
|||
|
var k2 = (11 - (5 * f[0] + 4 * f[1] + 3 * f[2] + 2 * f[3] + 7 * f[4] + 6 * f[5] + 5 * f[6] + 4 * f[7] + 3 * f[8] + 2 * k1) % 11) % 11;
|
|||
|
if (k1 !== f[9] || k2 !== f[10]) return false;
|
|||
|
return true;
|
|||
|
},
|
|||
|
TH: function TH(str) {
|
|||
|
if (!str.match(/^[1-8]\d{12}$/)) return false; // validate check digit
|
|||
|
|
|||
|
var sum = 0;
|
|||
|
|
|||
|
for (var i = 0; i < 12; i++) {
|
|||
|
sum += parseInt(str[i], 10) * (13 - i);
|
|||
|
}
|
|||
|
|
|||
|
return str[12] === ((11 - sum % 11) % 10).toString();
|
|||
|
},
|
|||
|
LK: function LK(str) {
|
|||
|
var old_nic = /^[1-9]\d{8}[vx]$/i;
|
|||
|
var new_nic = /^[1-9]\d{11}$/i;
|
|||
|
if (str.length === 10 && old_nic.test(str)) return true;else if (str.length === 12 && new_nic.test(str)) return true;
|
|||
|
return false;
|
|||
|
},
|
|||
|
'he-IL': function heIL(str) {
|
|||
|
var DNI = /^\d{9}$/; // sanitize user input
|
|||
|
|
|||
|
var sanitized = str.trim(); // validate the data structure
|
|||
|
|
|||
|
if (!DNI.test(sanitized)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
var id = sanitized;
|
|||
|
var sum = 0,
|
|||
|
incNum;
|
|||
|
|
|||
|
for (var i = 0; i < id.length; i++) {
|
|||
|
incNum = Number(id[i]) * (i % 2 + 1); // Multiply number by 1 or 2
|
|||
|
|
|||
|
sum += incNum > 9 ? incNum - 9 : incNum; // Sum the digits up and add to total
|
|||
|
}
|
|||
|
|
|||
|
return sum % 10 === 0;
|
|||
|
},
|
|||
|
'ar-LY': function arLY(str) {
|
|||
|
// Libya National Identity Number NIN is 12 digits, the first digit is either 1 or 2
|
|||
|
var NIN = /^(1|2)\d{11}$/; // sanitize user input
|
|||
|
|
|||
|
var sanitized = str.trim(); // validate the data structure
|
|||
|
|
|||
|
if (!NIN.test(sanitized)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
},
|
|||
|
'ar-TN': function arTN(str) {
|
|||
|
var DNI = /^\d{8}$/; // sanitize user input
|
|||
|
|
|||
|
var sanitized = str.trim(); // validate the data structure
|
|||
|
|
|||
|
if (!DNI.test(sanitized)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
},
|
|||
|
'zh-CN': function zhCN(str) {
|
|||
|
var provincesAndCities = ['11', // 北京
|
|||
|
'12', // 天津
|
|||
|
'13', // 河北
|
|||
|
'14', // 山西
|
|||
|
'15', // 内蒙古
|
|||
|
'21', // 辽宁
|
|||
|
'22', // 吉林
|
|||
|
'23', // 黑龙江
|
|||
|
'31', // 上海
|
|||
|
'32', // 江苏
|
|||
|
'33', // 浙江
|
|||
|
'34', // 安徽
|
|||
|
'35', // 福建
|
|||
|
'36', // 江西
|
|||
|
'37', // 山东
|
|||
|
'41', // 河南
|
|||
|
'42', // 湖北
|
|||
|
'43', // 湖南
|
|||
|
'44', // 广东
|
|||
|
'45', // 广西
|
|||
|
'46', // 海南
|
|||
|
'50', // 重庆
|
|||
|
'51', // 四川
|
|||
|
'52', // 贵州
|
|||
|
'53', // 云南
|
|||
|
'54', // 西藏
|
|||
|
'61', // 陕西
|
|||
|
'62', // 甘肃
|
|||
|
'63', // 青海
|
|||
|
'64', // 宁夏
|
|||
|
'65', // 新疆
|
|||
|
'71', // 台湾
|
|||
|
'81', // 香港
|
|||
|
'82', // 澳门
|
|||
|
'91' // 国外
|
|||
|
];
|
|||
|
var powers = ['7', '9', '10', '5', '8', '4', '2', '1', '6', '3', '7', '9', '10', '5', '8', '4', '2'];
|
|||
|
var parityBit = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
|
|||
|
|
|||
|
var checkAddressCode = function checkAddressCode(addressCode) {
|
|||
|
return provincesAndCities.includes(addressCode);
|
|||
|
};
|
|||
|
|
|||
|
var checkBirthDayCode = function checkBirthDayCode(birDayCode) {
|
|||
|
var yyyy = parseInt(birDayCode.substring(0, 4), 10);
|
|||
|
var mm = parseInt(birDayCode.substring(4, 6), 10);
|
|||
|
var dd = parseInt(birDayCode.substring(6), 10);
|
|||
|
var xdata = new Date(yyyy, mm - 1, dd);
|
|||
|
|
|||
|
if (xdata > new Date()) {
|
|||
|
return false; // eslint-disable-next-line max-len
|
|||
|
} else if (xdata.getFullYear() === yyyy && xdata.getMonth() === mm - 1 && xdata.getDate() === dd) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
};
|
|||
|
|
|||
|
var getParityBit = function getParityBit(idCardNo) {
|
|||
|
var id17 = idCardNo.substring(0, 17);
|
|||
|
var power = 0;
|
|||
|
|
|||
|
for (var i = 0; i < 17; i++) {
|
|||
|
power += parseInt(id17.charAt(i), 10) * parseInt(powers[i], 10);
|
|||
|
}
|
|||
|
|
|||
|
var mod = power % 11;
|
|||
|
return parityBit[mod];
|
|||
|
};
|
|||
|
|
|||
|
var checkParityBit = function checkParityBit(idCardNo) {
|
|||
|
return getParityBit(idCardNo) === idCardNo.charAt(17).toUpperCase();
|
|||
|
};
|
|||
|
|
|||
|
var check15IdCardNo = function check15IdCardNo(idCardNo) {
|
|||
|
var check = /^[1-9]\d{7}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))\d{3}$/.test(idCardNo);
|
|||
|
if (!check) return false;
|
|||
|
var addressCode = idCardNo.substring(0, 2);
|
|||
|
check = checkAddressCode(addressCode);
|
|||
|
if (!check) return false;
|
|||
|
var birDayCode = "19".concat(idCardNo.substring(6, 12));
|
|||
|
check = checkBirthDayCode(birDayCode);
|
|||
|
if (!check) return false;
|
|||
|
return true;
|
|||
|
};
|
|||
|
|
|||
|
var check18IdCardNo = function check18IdCardNo(idCardNo) {
|
|||
|
var check = /^[1-9]\d{5}[1-9]\d{3}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))\d{3}(\d|x|X)$/.test(idCardNo);
|
|||
|
if (!check) return false;
|
|||
|
var addressCode = idCardNo.substring(0, 2);
|
|||
|
check = checkAddressCode(addressCode);
|
|||
|
if (!check) return false;
|
|||
|
var birDayCode = idCardNo.substring(6, 14);
|
|||
|
check = checkBirthDayCode(birDayCode);
|
|||
|
if (!check) return false;
|
|||
|
return checkParityBit(idCardNo);
|
|||
|
};
|
|||
|
|
|||
|
var checkIdCardNo = function checkIdCardNo(idCardNo) {
|
|||
|
var check = /^\d{15}|(\d{17}(\d|x|X))$/.test(idCardNo);
|
|||
|
if (!check) return false;
|
|||
|
|
|||
|
if (idCardNo.length === 15) {
|
|||
|
return check15IdCardNo(idCardNo);
|
|||
|
}
|
|||
|
|
|||
|
return check18IdCardNo(idCardNo);
|
|||
|
};
|
|||
|
|
|||
|
return checkIdCardNo(str);
|
|||
|
},
|
|||
|
'zh-TW': function zhTW(str) {
|
|||
|
var ALPHABET_CODES = {
|
|||
|
A: 10,
|
|||
|
B: 11,
|
|||
|
C: 12,
|
|||
|
D: 13,
|
|||
|
E: 14,
|
|||
|
F: 15,
|
|||
|
G: 16,
|
|||
|
H: 17,
|
|||
|
I: 34,
|
|||
|
J: 18,
|
|||
|
K: 19,
|
|||
|
L: 20,
|
|||
|
M: 21,
|
|||
|
N: 22,
|
|||
|
O: 35,
|
|||
|
P: 23,
|
|||
|
Q: 24,
|
|||
|
R: 25,
|
|||
|
S: 26,
|
|||
|
T: 27,
|
|||
|
U: 28,
|
|||
|
V: 29,
|
|||
|
W: 32,
|
|||
|
X: 30,
|
|||
|
Y: 31,
|
|||
|
Z: 33
|
|||
|
};
|
|||
|
var sanitized = str.trim().toUpperCase();
|
|||
|
if (!/^[A-Z][0-9]{9}$/.test(sanitized)) return false;
|
|||
|
return Array.from(sanitized).reduce(function (sum, number, index) {
|
|||
|
if (index === 0) {
|
|||
|
var code = ALPHABET_CODES[number];
|
|||
|
return code % 10 * 9 + Math.floor(code / 10);
|
|||
|
}
|
|||
|
|
|||
|
if (index === 9) {
|
|||
|
return (10 - sum % 10 - Number(number)) % 10 === 0;
|
|||
|
}
|
|||
|
|
|||
|
return sum + Number(number) * (9 - index);
|
|||
|
}, 0);
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
function isIdentityCard(str, locale) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
|
|||
|
if (locale in validators) {
|
|||
|
return validators[locale](str);
|
|||
|
} else if (locale === 'any') {
|
|||
|
for (var key in validators) {
|
|||
|
// https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
|
|||
|
// istanbul ignore else
|
|||
|
if (validators.hasOwnProperty(key)) {
|
|||
|
var validator = validators[key];
|
|||
|
|
|||
|
if (validator(str)) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
throw new Error("Invalid locale '".concat(locale, "'"));
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./isInt":54,"./util/assertString":99}],53:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isIn;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
var _toString = _interopRequireDefault(require("./util/toString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|||
|
|
|||
|
function isIn(str, options) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
var i;
|
|||
|
|
|||
|
if (Object.prototype.toString.call(options) === '[object Array]') {
|
|||
|
var array = [];
|
|||
|
|
|||
|
for (i in options) {
|
|||
|
// https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
|
|||
|
// istanbul ignore else
|
|||
|
if ({}.hasOwnProperty.call(options, i)) {
|
|||
|
array[i] = (0, _toString.default)(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;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99,"./util/toString":103}],54:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isInt;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var int = /^(?:[-+]?(?:0|[1-9][0-9]*))$/;
|
|||
|
var intLeadingZeroes = /^[-+]?[0-9]+$/;
|
|||
|
|
|||
|
function isInt(str, options) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
options = options || {}; // Get the regex to use for testing, based on whether
|
|||
|
// leading zeroes are allowed or not.
|
|||
|
|
|||
|
var regex = options.hasOwnProperty('allow_leading_zeroes') && !options.allow_leading_zeroes ? int : intLeadingZeroes; // Check min/max/lt/gt
|
|||
|
|
|||
|
var minCheckPassed = !options.hasOwnProperty('min') || str >= options.min;
|
|||
|
var maxCheckPassed = !options.hasOwnProperty('max') || str <= options.max;
|
|||
|
var ltCheckPassed = !options.hasOwnProperty('lt') || str < options.lt;
|
|||
|
var gtCheckPassed = !options.hasOwnProperty('gt') || str > options.gt;
|
|||
|
return regex.test(str) && minCheckPassed && maxCheckPassed && ltCheckPassed && gtCheckPassed;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],55:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isJSON;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
var _merge = _interopRequireDefault(require("./util/merge"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|||
|
|
|||
|
var default_json_options = {
|
|||
|
allow_primitives: false
|
|||
|
};
|
|||
|
|
|||
|
function isJSON(str, options) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
|
|||
|
try {
|
|||
|
options = (0, _merge.default)(options, default_json_options);
|
|||
|
var primitives = [];
|
|||
|
|
|||
|
if (options.allow_primitives) {
|
|||
|
primitives = [null, false, true];
|
|||
|
}
|
|||
|
|
|||
|
var obj = JSON.parse(str);
|
|||
|
return primitives.includes(obj) || !!obj && _typeof(obj) === 'object';
|
|||
|
} catch (e) {
|
|||
|
/* ignore */
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99,"./util/merge":101}],56:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isJWT;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
var _isBase = _interopRequireDefault(require("./isBase64"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function isJWT(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
var dotSplit = str.split('.');
|
|||
|
var len = dotSplit.length;
|
|||
|
|
|||
|
if (len > 3 || len < 2) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
return dotSplit.reduce(function (acc, currElem) {
|
|||
|
return acc && (0, _isBase.default)(currElem, {
|
|||
|
urlSafe: true
|
|||
|
});
|
|||
|
}, true);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./isBase64":17,"./util/assertString":99}],57:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isLatLong;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
var _merge = _interopRequireDefault(require("./util/merge"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var lat = /^\(?[+-]?(90(\.0+)?|[1-8]?\d(\.\d+)?)$/;
|
|||
|
var long = /^\s?[+-]?(180(\.0+)?|1[0-7]\d(\.\d+)?|\d{1,2}(\.\d+)?)\)?$/;
|
|||
|
var latDMS = /^(([1-8]?\d)\D+([1-5]?\d|60)\D+([1-5]?\d|60)(\.\d+)?|90\D+0\D+0)\D+[NSns]?$/i;
|
|||
|
var longDMS = /^\s*([1-7]?\d{1,2}\D+([1-5]?\d|60)\D+([1-5]?\d|60)(\.\d+)?|180\D+0\D+0)\D+[EWew]?$/i;
|
|||
|
var defaultLatLongOptions = {
|
|||
|
checkDMS: false
|
|||
|
};
|
|||
|
|
|||
|
function isLatLong(str, options) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
options = (0, _merge.default)(options, defaultLatLongOptions);
|
|||
|
if (!str.includes(',')) return false;
|
|||
|
var pair = str.split(',');
|
|||
|
if (pair[0].startsWith('(') && !pair[1].endsWith(')') || pair[1].endsWith(')') && !pair[0].startsWith('(')) return false;
|
|||
|
|
|||
|
if (options.checkDMS) {
|
|||
|
return latDMS.test(pair[0]) && longDMS.test(pair[1]);
|
|||
|
}
|
|||
|
|
|||
|
return lat.test(pair[0]) && long.test(pair[1]);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99,"./util/merge":101}],58:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isLength;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|||
|
|
|||
|
/* eslint-disable prefer-rest-params */
|
|||
|
function isLength(str, options) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
var min;
|
|||
|
var max;
|
|||
|
|
|||
|
if (_typeof(options) === 'object') {
|
|||
|
min = options.min || 0;
|
|||
|
max = options.max;
|
|||
|
} else {
|
|||
|
// backwards compatibility: isLength(str, min [, max])
|
|||
|
min = arguments[1] || 0;
|
|||
|
max = arguments[2];
|
|||
|
}
|
|||
|
|
|||
|
var surrogatePairs = str.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g) || [];
|
|||
|
var len = str.length - surrogatePairs.length;
|
|||
|
return len >= min && (typeof max === 'undefined' || len <= max);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],59:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isLicensePlate;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var validators = {
|
|||
|
'cs-CZ': function csCZ(str) {
|
|||
|
return /^(([ABCDEFHKIJKLMNPRSTUVXYZ]|[0-9])-?){5,8}$/.test(str);
|
|||
|
},
|
|||
|
'de-DE': function deDE(str) {
|
|||
|
return /^((AW|UL|AK|GA|AÖ|LF|AZ|AM|AS|ZE|AN|AB|A|KG|KH|BA|EW|BZ|HY|KM|BT|HP|B|BC|BI|BO|FN|TT|ÜB|BN|AH|BS|FR|HB|ZZ|BB|BK|BÖ|OC|OK|CW|CE|C|CO|LH|CB|KW|LC|LN|DA|DI|DE|DH|SY|NÖ|DO|DD|DU|DN|D|EI|EA|EE|FI|EM|EL|EN|PF|ED|EF|ER|AU|ZP|E|ES|NT|EU|FL|FO|FT|FF|F|FS|FD|FÜ|GE|G|GI|GF|GS|ZR|GG|GP|GR|NY|ZI|GÖ|GZ|GT|HA|HH|HM|HU|WL|HZ|WR|RN|HK|HD|HN|HS|GK|HE|HF|RZ|HI|HG|HO|HX|IK|IL|IN|J|JL|KL|KA|KS|KF|KE|KI|KT|KO|KN|KR|KC|KU|K|LD|LL|LA|L|OP|LM|LI|LB|LU|LÖ|HL|LG|MD|GN|MZ|MA|ML|MR|MY|AT|DM|MC|NZ|RM|RG|MM|ME|MB|MI|FG|DL|HC|MW|RL|MK|MG|MÜ|WS|MH|M|MS|NU|NB|ND|NM|NK|NW|NR|NI|NF|DZ|EB|OZ|TG|TO|N|OA|GM|OB|CA|EH|FW|OF|OL|OE|OG|BH|LR|OS|AA|GD|OH|KY|NP|WK|PB|PA|PE|PI|PS|P|PM|PR|RA|RV|RE|R|H|SB|WN|RS|RD|RT|BM|NE|GV|RP|SU|GL|RO|GÜ|RH|EG|RW|PN|SK|MQ|RU|SZ|RI|SL|SM|SC|HR|FZ|VS|SW|SN|CR|SE|SI|SO|LP|SG|NH|SP|IZ|ST|BF|TE|HV|OD|SR|S|AC|DW|ZW|TF|TS|TR|TÜ|UM|PZ|TP|UE|UN|UH|MN|KK|VB|V|AE|PL|RC|VG|GW|PW|VR|VK|KB|WA|WT|BE|WM|WE|AP|MO|WW|FB|WZ|WI|WB|JE|WF|WO|W|WÜ|BL|Z|GC)[- ]?[A-Z]{1,2}[- ]?\d{1,4}|(AIC|FDB|ABG|SLN|SAW|KLZ|BUL|ESB|NAB|SUL|WST|ABI|AZE|BTF|KÖT|DKB|FEU|ROT|ALZ|SMÜ|WER|AUR|NOR|DÜW|BRK|HAB|TÖL|WOR|BAD|BAR|BER|BIW|EBS|KEM|MÜB|PEG|BGL|BGD|REI|WIL|BKS|BIR|WAT|BOR|BOH|BOT|BRB|BLK|HHM|NEB|NMB|WSF|LEO|HDL|WMS|WZL|BÜS|CHA|KÖZ|ROD|WÜM|CLP|NEC|COC|ZEL|COE|CUX|DAH|LDS|DEG|DEL|RSL|DLG|DGF|LAN|HEI|MED|DON|KIB|ROK|JÜL|MON|SLE|EBE|EIC|HIG|WBS|BIT|PRÜ|LIB|EMD|WIT|ERH|HÖS|ERZ|ANA|ASZ|MAB|MEK|STL|SZB|FDS|HCH|HOR|WOL|FRG|GRA|WOS|FRI|FFB|GAP|GER|BRL|CLZ|GTH|NOH|HGW|GRZ|LÖB|NOL|WSW|DUD|HMÜ|OHA|KRU|HAL|HAM|HBS|QLB|HVL|NAU|HAS|EBN|GEO|HOH|HDH|ERK|HER|WAN|HEF|ROF|HBN|ALF|HSK|USI|NAI|REH|SAN|KÜN|ÖHR|HOL|WAR|ARN|BRG|GNT|HOG|WOH|KEH|MAI|PAR|RID|ROL|KLE|GEL|KUS|KYF|ART|SDH|LDK|DIL|MAL|VIB|LER|BNA|GHA|GRM|MTL|WUR|LEV|LIF|STE|WEL|LIP|VAI|LUP|HGN|LBZ|LWL|PCH|STB|DAN|MKK|SLÜ|MSP|TBB|MGH|MTK|BIN|MSH|EIL|HET|SGH|BID|MYK|MSE|MST|MÜR|WRN|MEI|GRH|RIE|MZG|MIL|OBB|BED|FLÖ|MOL|FRW|SEE|SRB|AIB|MOS|BCH|ILL|SOB|NMS|NEA|SEF|UFF|NEW|VOH|NDH|TDO|NWM|GDB|GVM|WIS|NOM|EIN|GAN|LAU|HEB|OHV|OSL|SFB|ERB|LOS|BSK|KEL|BSB|MEL|WTL|OAL|FÜS|MOD|OHZ|OPR|BÜR|PAF|PLÖ|CAS|GLA|REG|VIT|ECK|SIM|GOA|EMS|DIZ|GOH|RÜD|SWA|NES|KÖN|MET|LRO|BÜZ|DBR|ROS|TET|HRO|ROW|BRV|HIP|PAN|GRI|SHK|EIS|SRO|SOK|LBS|SCZ|MER|QFT|SLF|SLS|HOM|SLK|ASL|BBG|SBK|SFT|SHG|MGN|MEG|ZIG|SAD|NEN|OVI|SHA|BLB|SIG|SON|SPN|FOR|GUB|SPB|IGB|WND|STD|STA|SDL|OBG|HST|BOG|SHL|PIR|FTL|SEB|SÖM|SÜW|TIR|SAB|TUT|ANG|SDT|LÜN|LSZ|MHL|VEC|VER|VIE|OVL|ANK|OVP|SBG|UEM|UER|WLG|GMN|NVP|RDG|RÜG|DAU|FKB|WAF|WAK|SLZ|WEN|SOG|APD|WUG|GUN|ESW|WIZ|WES|DIN|BRA|BÜD|WHV|HWI|GHC|WTM|WOB|WUN|MAK|SEL|OCH|HOT|WDA)[- ]?(([A-Z][- ]?\d{1,4})|([A-Z]{2}[- ]?\d{1,3})))[- ]?(E|H)?$/.test(str);
|
|||
|
},
|
|||
|
'de-LI': function deLI(str) {
|
|||
|
return /^FL[- ]?\d{1,5}[UZ]?$/.test(str);
|
|||
|
},
|
|||
|
'fi-FI': function fiFI(str) {
|
|||
|
return /^(?=.{4,7})(([A-Z]{1,3}|[0-9]{1,3})[\s-]?([A-Z]{1,3}|[0-9]{1,5}))$/.test(str);
|
|||
|
},
|
|||
|
'pt-PT': function ptPT(str) {
|
|||
|
return /^([A-Z]{2}|[0-9]{2})[ -·]?([A-Z]{2}|[0-9]{2})[ -·]?([A-Z]{2}|[0-9]{2})$/.test(str);
|
|||
|
},
|
|||
|
'sq-AL': function sqAL(str) {
|
|||
|
return /^[A-Z]{2}[- ]?((\d{3}[- ]?(([A-Z]{2})|T))|(R[- ]?\d{3}))$/.test(str);
|
|||
|
},
|
|||
|
'pt-BR': function ptBR(str) {
|
|||
|
return /^[A-Z]{3}[ -]?[0-9][A-Z][0-9]{2}|[A-Z]{3}[ -]?[0-9]{4}$/.test(str);
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
function isLicensePlate(str, locale) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
|
|||
|
if (locale in validators) {
|
|||
|
return validators[locale](str);
|
|||
|
} else if (locale === 'any') {
|
|||
|
for (var key in validators) {
|
|||
|
/* eslint guard-for-in: 0 */
|
|||
|
var validator = validators[key];
|
|||
|
|
|||
|
if (validator(str)) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
throw new Error("Invalid locale '".concat(locale, "'"));
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],60:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isLocale;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var localeReg = /^[A-Za-z]{2,4}([_-]([A-Za-z]{4}|[\d]{3}))?([_-]([A-Za-z]{2}|[\d]{3}))?$/;
|
|||
|
|
|||
|
function isLocale(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
|
|||
|
if (str === 'en_US_POSIX' || str === 'ca_ES_VALENCIA') {
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
return localeReg.test(str);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],61:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isLowercase;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function isLowercase(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return str === str.toLowerCase();
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],62:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isMACAddress;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var macAddress = /^(?:[0-9a-fA-F]{2}([-:\s]))([0-9a-fA-F]{2}\1){4}([0-9a-fA-F]{2})$/;
|
|||
|
var macAddressNoSeparators = /^([0-9a-fA-F]){12}$/;
|
|||
|
var macAddressWithDots = /^([0-9a-fA-F]{4}\.){2}([0-9a-fA-F]{4})$/;
|
|||
|
|
|||
|
function isMACAddress(str, options) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
/**
|
|||
|
* @deprecated `no_colons` TODO: remove it in the next major
|
|||
|
*/
|
|||
|
|
|||
|
if (options && (options.no_colons || options.no_separators)) {
|
|||
|
return macAddressNoSeparators.test(str);
|
|||
|
}
|
|||
|
|
|||
|
return macAddress.test(str) || macAddressWithDots.test(str);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],63:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isMD5;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var md5 = /^[a-f0-9]{32}$/;
|
|||
|
|
|||
|
function isMD5(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return md5.test(str);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],64:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isMagnetURI;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var magnetURI = /^magnet:\?xt(?:\.1)?=urn:(?:aich|bitprint|btih|ed2k|ed2khash|kzhash|md5|sha1|tree:tiger):[a-z0-9]{32}(?:[a-z0-9]{8})?($|&)/i;
|
|||
|
|
|||
|
function isMagnetURI(url) {
|
|||
|
(0, _assertString.default)(url);
|
|||
|
return magnetURI.test(url.trim());
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],65:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isMimeType;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
/*
|
|||
|
Checks if the provided string matches to a correct Media type format (MIME type)
|
|||
|
|
|||
|
This function only checks is the string format follows the
|
|||
|
etablished rules by the according RFC specifications.
|
|||
|
This function supports 'charset' in textual media types
|
|||
|
(https://tools.ietf.org/html/rfc6657).
|
|||
|
|
|||
|
This function does not check against all the media types listed
|
|||
|
by the IANA (https://www.iana.org/assignments/media-types/media-types.xhtml)
|
|||
|
because of lightness purposes : it would require to include
|
|||
|
all these MIME types in this librairy, which would weigh it
|
|||
|
significantly. This kind of effort maybe is not worth for the use that
|
|||
|
this function has in this entire librairy.
|
|||
|
|
|||
|
More informations in the RFC specifications :
|
|||
|
- https://tools.ietf.org/html/rfc2045
|
|||
|
- https://tools.ietf.org/html/rfc2046
|
|||
|
- https://tools.ietf.org/html/rfc7231#section-3.1.1.1
|
|||
|
- https://tools.ietf.org/html/rfc7231#section-3.1.1.5
|
|||
|
*/
|
|||
|
// Match simple MIME types
|
|||
|
// NB :
|
|||
|
// Subtype length must not exceed 100 characters.
|
|||
|
// This rule does not comply to the RFC specs (what is the max length ?).
|
|||
|
var mimeTypeSimple = /^(application|audio|font|image|message|model|multipart|text|video)\/[a-zA-Z0-9\.\-\+]{1,100}$/i; // eslint-disable-line max-len
|
|||
|
// Handle "charset" in "text/*"
|
|||
|
|
|||
|
var mimeTypeText = /^text\/[a-zA-Z0-9\.\-\+]{1,100};\s?charset=("[a-zA-Z0-9\.\-\+\s]{0,70}"|[a-zA-Z0-9\.\-\+]{0,70})(\s?\([a-zA-Z0-9\.\-\+\s]{1,20}\))?$/i; // eslint-disable-line max-len
|
|||
|
// Handle "boundary" in "multipart/*"
|
|||
|
|
|||
|
var mimeTypeMultipart = /^multipart\/[a-zA-Z0-9\.\-\+]{1,100}(;\s?(boundary|charset)=("[a-zA-Z0-9\.\-\+\s]{0,70}"|[a-zA-Z0-9\.\-\+]{0,70})(\s?\([a-zA-Z0-9\.\-\+\s]{1,20}\))?){0,2}$/i; // eslint-disable-line max-len
|
|||
|
|
|||
|
function isMimeType(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return mimeTypeSimple.test(str) || mimeTypeText.test(str) || mimeTypeMultipart.test(str);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],66:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isMobilePhone;
|
|||
|
exports.locales = void 0;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
/* eslint-disable max-len */
|
|||
|
var phones = {
|
|||
|
'am-AM': /^(\+?374|0)((10|[9|7][0-9])\d{6}$|[2-4]\d{7}$)/,
|
|||
|
'ar-AE': /^((\+?971)|0)?5[024568]\d{7}$/,
|
|||
|
'ar-BH': /^(\+?973)?(3|6)\d{7}$/,
|
|||
|
'ar-DZ': /^(\+?213|0)(5|6|7)\d{8}$/,
|
|||
|
'ar-LB': /^(\+?961)?((3|81)\d{6}|7\d{7})$/,
|
|||
|
'ar-EG': /^((\+?20)|0)?1[0125]\d{8}$/,
|
|||
|
'ar-IQ': /^(\+?964|0)?7[0-9]\d{8}$/,
|
|||
|
'ar-JO': /^(\+?962|0)?7[789]\d{7}$/,
|
|||
|
'ar-KW': /^(\+?965)[569]\d{7}$/,
|
|||
|
'ar-LY': /^((\+?218)|0)?(9[1-6]\d{7}|[1-8]\d{7,9})$/,
|
|||
|
'ar-MA': /^(?:(?:\+|00)212|0)[5-7]\d{8}$/,
|
|||
|
'ar-OM': /^((\+|00)968)?(9[1-9])\d{6}$/,
|
|||
|
'ar-PS': /^(\+?970|0)5[6|9](\d{7})$/,
|
|||
|
'ar-SA': /^(!?(\+?966)|0)?5\d{8}$/,
|
|||
|
'ar-SY': /^(!?(\+?963)|0)?9\d{8}$/,
|
|||
|
'ar-TN': /^(\+?216)?[2459]\d{7}$/,
|
|||
|
'az-AZ': /^(\+994|0)(5[015]|7[07]|99)\d{7}$/,
|
|||
|
'bs-BA': /^((((\+|00)3876)|06))((([0-3]|[5-6])\d{6})|(4\d{7}))$/,
|
|||
|
'be-BY': /^(\+?375)?(24|25|29|33|44)\d{7}$/,
|
|||
|
'bg-BG': /^(\+?359|0)?8[789]\d{7}$/,
|
|||
|
'bn-BD': /^(\+?880|0)1[13456789][0-9]{8}$/,
|
|||
|
'ca-AD': /^(\+376)?[346]\d{5}$/,
|
|||
|
'cs-CZ': /^(\+?420)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$/,
|
|||
|
'da-DK': /^(\+?45)?\s?\d{2}\s?\d{2}\s?\d{2}\s?\d{2}$/,
|
|||
|
'de-DE': /^((\+49|0)[1|3])([0|5][0-45-9]\d|6([23]|0\d?)|7([0-57-9]|6\d))\d{7,9}$/,
|
|||
|
'de-AT': /^(\+43|0)\d{1,4}\d{3,12}$/,
|
|||
|
'de-CH': /^(\+41|0)([1-9])\d{1,9}$/,
|
|||
|
'de-LU': /^(\+352)?((6\d1)\d{6})$/,
|
|||
|
'dv-MV': /^(\+?960)?(7[2-9]|91|9[3-9])\d{7}$/,
|
|||
|
'el-GR': /^(\+?30|0)?(69\d{8})$/,
|
|||
|
'en-AU': /^(\+?61|0)4\d{8}$/,
|
|||
|
'en-BM': /^(\+?1)?441(((3|7)\d{6}$)|(5[0-3][0-9]\d{4}$)|(59\d{5}))/,
|
|||
|
'en-GB': /^(\+?44|0)7\d{9}$/,
|
|||
|
'en-GG': /^(\+?44|0)1481\d{6}$/,
|
|||
|
'en-GH': /^(\+233|0)(20|50|24|54|27|57|26|56|23|28|55|59)\d{7}$/,
|
|||
|
'en-GY': /^(\+592|0)6\d{6}$/,
|
|||
|
'en-HK': /^(\+?852[-\s]?)?[456789]\d{3}[-\s]?\d{4}$/,
|
|||
|
'en-MO': /^(\+?853[-\s]?)?[6]\d{3}[-\s]?\d{4}$/,
|
|||
|
'en-IE': /^(\+?353|0)8[356789]\d{7}$/,
|
|||
|
'en-IN': /^(\+?91|0)?[6789]\d{9}$/,
|
|||
|
'en-KE': /^(\+?254|0)(7|1)\d{8}$/,
|
|||
|
'en-KI': /^((\+686|686)?)?( )?((6|7)(2|3|8)[0-9]{6})$/,
|
|||
|
'en-MT': /^(\+?356|0)?(99|79|77|21|27|22|25)[0-9]{6}$/,
|
|||
|
'en-MU': /^(\+?230|0)?\d{8}$/,
|
|||
|
'en-NA': /^(\+?264|0)(6|8)\d{7}$/,
|
|||
|
'en-NG': /^(\+?234|0)?[789]\d{9}$/,
|
|||
|
'en-NZ': /^(\+?64|0)[28]\d{7,9}$/,
|
|||
|
'en-PK': /^((00|\+)?92|0)3[0-6]\d{8}$/,
|
|||
|
'en-PH': /^(09|\+639)\d{9}$/,
|
|||
|
'en-RW': /^(\+?250|0)?[7]\d{8}$/,
|
|||
|
'en-SG': /^(\+65)?[3689]\d{7}$/,
|
|||
|
'en-SL': /^(\+?232|0)\d{8}$/,
|
|||
|
'en-TZ': /^(\+?255|0)?[67]\d{8}$/,
|
|||
|
'en-UG': /^(\+?256|0)?[7]\d{8}$/,
|
|||
|
'en-US': /^((\+1|1)?( |-)?)?(\([2-9][0-9]{2}\)|[2-9][0-9]{2})( |-)?([2-9][0-9]{2}( |-)?[0-9]{4})$/,
|
|||
|
'en-ZA': /^(\+?27|0)\d{9}$/,
|
|||
|
'en-ZM': /^(\+?26)?09[567]\d{7}$/,
|
|||
|
'en-ZW': /^(\+263)[0-9]{9}$/,
|
|||
|
'en-BW': /^(\+?267)?(7[1-8]{1})\d{6}$/,
|
|||
|
'es-AR': /^\+?549(11|[2368]\d)\d{8}$/,
|
|||
|
'es-BO': /^(\+?591)?(6|7)\d{7}$/,
|
|||
|
'es-CO': /^(\+?57)?3(0(0|1|2|4|5)|1\d|2[0-4]|5(0|1))\d{7}$/,
|
|||
|
'es-CL': /^(\+?56|0)[2-9]\d{1}\d{7}$/,
|
|||
|
'es-CR': /^(\+506)?[2-8]\d{7}$/,
|
|||
|
'es-CU': /^(\+53|0053)?5\d{7}/,
|
|||
|
'es-DO': /^(\+?1)?8[024]9\d{7}$/,
|
|||
|
'es-HN': /^(\+?504)?[9|8]\d{7}$/,
|
|||
|
'es-EC': /^(\+?593|0)([2-7]|9[2-9])\d{7}$/,
|
|||
|
'es-ES': /^(\+?34)?[6|7]\d{8}$/,
|
|||
|
'es-PE': /^(\+?51)?9\d{8}$/,
|
|||
|
'es-MX': /^(\+?52)?(1|01)?\d{10,11}$/,
|
|||
|
'es-PA': /^(\+?507)\d{7,8}$/,
|
|||
|
'es-PY': /^(\+?595|0)9[9876]\d{7}$/,
|
|||
|
'es-SV': /^(\+?503)?[67]\d{7}$/,
|
|||
|
'es-UY': /^(\+598|0)9[1-9][\d]{6}$/,
|
|||
|
'es-VE': /^(\+?58)?(2|4)\d{9}$/,
|
|||
|
'et-EE': /^(\+?372)?\s?(5|8[1-4])\s?([0-9]\s?){6,7}$/,
|
|||
|
'fa-IR': /^(\+?98[\-\s]?|0)9[0-39]\d[\-\s]?\d{3}[\-\s]?\d{4}$/,
|
|||
|
'fi-FI': /^(\+?358|0)\s?(4(0|1|2|4|5|6)?|50)\s?(\d\s?){4,8}\d$/,
|
|||
|
'fj-FJ': /^(\+?679)?\s?\d{3}\s?\d{4}$/,
|
|||
|
'fo-FO': /^(\+?298)?\s?\d{2}\s?\d{2}\s?\d{2}$/,
|
|||
|
'fr-BF': /^(\+226|0)[67]\d{7}$/,
|
|||
|
'fr-CM': /^(\+?237)6[0-9]{8}$/,
|
|||
|
'fr-FR': /^(\+?33|0)[67]\d{8}$/,
|
|||
|
'fr-GF': /^(\+?594|0|00594)[67]\d{8}$/,
|
|||
|
'fr-GP': /^(\+?590|0|00590)[67]\d{8}$/,
|
|||
|
'fr-MQ': /^(\+?596|0|00596)[67]\d{8}$/,
|
|||
|
'fr-PF': /^(\+?689)?8[789]\d{6}$/,
|
|||
|
'fr-RE': /^(\+?262|0|00262)[67]\d{8}$/,
|
|||
|
'he-IL': /^(\+972|0)([23489]|5[012345689]|77)[1-9]\d{6}$/,
|
|||
|
'hu-HU': /^(\+?36|06)(20|30|31|50|70)\d{7}$/,
|
|||
|
'id-ID': /^(\+?62|0)8(1[123456789]|2[1238]|3[1238]|5[12356789]|7[78]|9[56789]|8[123456789])([\s?|\d]{5,11})$/,
|
|||
|
'it-IT': /^(\+?39)?\s?3\d{2} ?\d{6,7}$/,
|
|||
|
'it-SM': /^((\+378)|(0549)|(\+390549)|(\+3780549))?6\d{5,9}$/,
|
|||
|
'ja-JP': /^(\+81[ \-]?(\(0\))?|0)[6789]0[ \-]?\d{4}[ \-]?\d{4}$/,
|
|||
|
'ka-GE': /^(\+?995)?(5|79)\d{7}$/,
|
|||
|
'kk-KZ': /^(\+?7|8)?7\d{9}$/,
|
|||
|
'kl-GL': /^(\+?299)?\s?\d{2}\s?\d{2}\s?\d{2}$/,
|
|||
|
'ko-KR': /^((\+?82)[ \-]?)?0?1([0|1|6|7|8|9]{1})[ \-]?\d{3,4}[ \-]?\d{4}$/,
|
|||
|
'lt-LT': /^(\+370|8)\d{8}$/,
|
|||
|
'lv-LV': /^(\+?371)2\d{7}$/,
|
|||
|
'ms-MY': /^(\+?6?01){1}(([0145]{1}(\-|\s)?\d{7,8})|([236789]{1}(\s|\-)?\d{7}))$/,
|
|||
|
'mz-MZ': /^(\+?258)?8[234567]\d{7}$/,
|
|||
|
'nb-NO': /^(\+?47)?[49]\d{7}$/,
|
|||
|
'ne-NP': /^(\+?977)?9[78]\d{8}$/,
|
|||
|
'nl-BE': /^(\+?32|0)4\d{8}$/,
|
|||
|
'nl-NL': /^(((\+|00)?31\(0\))|((\+|00)?31)|0)6{1}\d{8}$/,
|
|||
|
'nn-NO': /^(\+?47)?[49]\d{7}$/,
|
|||
|
'pl-PL': /^(\+?48)? ?[5-8]\d ?\d{3} ?\d{2} ?\d{2}$/,
|
|||
|
'pt-BR': /^((\+?55\ ?[1-9]{2}\ ?)|(\+?55\ ?\([1-9]{2}\)\ ?)|(0[1-9]{2}\ ?)|(\([1-9]{2}\)\ ?)|([1-9]{2}\ ?))((\d{4}\-?\d{4})|(9[2-9]{1}\d{3}\-?\d{4}))$/,
|
|||
|
'pt-PT': /^(\+?351)?9[1236]\d{7}$/,
|
|||
|
'pt-AO': /^(\+244)\d{9}$/,
|
|||
|
'ro-RO': /^(\+?4?0)\s?7\d{2}(\/|\s|\.|\-)?\d{3}(\s|\.|\-)?\d{3}$/,
|
|||
|
'ru-RU': /^(\+?7|8)?9\d{9}$/,
|
|||
|
'si-LK': /^(?:0|94|\+94)?(7(0|1|2|4|5|6|7|8)( |-)?)\d{7}$/,
|
|||
|
'sl-SI': /^(\+386\s?|0)(\d{1}\s?\d{3}\s?\d{2}\s?\d{2}|\d{2}\s?\d{3}\s?\d{3})$/,
|
|||
|
'sk-SK': /^(\+?421)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$/,
|
|||
|
'sq-AL': /^(\+355|0)6[789]\d{6}$/,
|
|||
|
'sr-RS': /^(\+3816|06)[- \d]{5,9}$/,
|
|||
|
'sv-SE': /^(\+?46|0)[\s\-]?7[\s\-]?[02369]([\s\-]?\d){7}$/,
|
|||
|
'tg-TJ': /^(\+?992)?[5][5]\d{7}$/,
|
|||
|
'th-TH': /^(\+66|66|0)\d{9}$/,
|
|||
|
'tr-TR': /^(\+?90|0)?5\d{9}$/,
|
|||
|
'tk-TM': /^(\+993|993|8)\d{8}$/,
|
|||
|
'uk-UA': /^(\+?38|8)?0\d{9}$/,
|
|||
|
'uz-UZ': /^(\+?998)?(6[125-79]|7[1-69]|88|9\d)\d{7}$/,
|
|||
|
'vi-VN': /^((\+?84)|0)((3([2-9]))|(5([25689]))|(7([0|6-9]))|(8([1-9]))|(9([0-9])))([0-9]{7})$/,
|
|||
|
'zh-CN': /^((\+|00)86)?(1[3-9]|9[28])\d{9}$/,
|
|||
|
'zh-TW': /^(\+?886\-?|0)?9\d{8}$/,
|
|||
|
'dz-BT': /^(\+?975|0)?(17|16|77|02)\d{6}$/
|
|||
|
};
|
|||
|
/* eslint-enable max-len */
|
|||
|
// aliases
|
|||
|
|
|||
|
phones['en-CA'] = phones['en-US'];
|
|||
|
phones['fr-CA'] = phones['en-CA'];
|
|||
|
phones['fr-BE'] = phones['nl-BE'];
|
|||
|
phones['zh-HK'] = phones['en-HK'];
|
|||
|
phones['zh-MO'] = phones['en-MO'];
|
|||
|
phones['ga-IE'] = phones['en-IE'];
|
|||
|
phones['fr-CH'] = phones['de-CH'];
|
|||
|
phones['it-CH'] = phones['fr-CH'];
|
|||
|
|
|||
|
function isMobilePhone(str, locale, options) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
|
|||
|
if (options && options.strictMode && !str.startsWith('+')) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (Array.isArray(locale)) {
|
|||
|
return locale.some(function (key) {
|
|||
|
// https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
|
|||
|
// istanbul ignore else
|
|||
|
if (phones.hasOwnProperty(key)) {
|
|||
|
var phone = phones[key];
|
|||
|
|
|||
|
if (phone.test(str)) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
});
|
|||
|
} else if (locale in phones) {
|
|||
|
return phones[locale].test(str); // alias falsey locale as 'any'
|
|||
|
} else if (!locale || locale === 'any') {
|
|||
|
for (var key in phones) {
|
|||
|
// istanbul ignore else
|
|||
|
if (phones.hasOwnProperty(key)) {
|
|||
|
var phone = phones[key];
|
|||
|
|
|||
|
if (phone.test(str)) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
throw new Error("Invalid locale '".concat(locale, "'"));
|
|||
|
}
|
|||
|
|
|||
|
var locales = Object.keys(phones);
|
|||
|
exports.locales = locales;
|
|||
|
},{"./util/assertString":99}],67:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isMongoId;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
var _isHexadecimal = _interopRequireDefault(require("./isHexadecimal"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function isMongoId(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return (0, _isHexadecimal.default)(str) && str.length === 24;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./isHexadecimal":39,"./util/assertString":99}],68:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isMultibyte;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
/* eslint-disable no-control-regex */
|
|||
|
var multibyte = /[^\x00-\x7F]/;
|
|||
|
/* eslint-enable no-control-regex */
|
|||
|
|
|||
|
function isMultibyte(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return multibyte.test(str);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],69:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isNumeric;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
var _alpha = require("./alpha");
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var numericNoSymbols = /^[0-9]+$/;
|
|||
|
|
|||
|
function isNumeric(str, options) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
|
|||
|
if (options && options.no_symbols) {
|
|||
|
return numericNoSymbols.test(str);
|
|||
|
}
|
|||
|
|
|||
|
return new RegExp("^[+-]?([0-9]*[".concat((options || {}).locale ? _alpha.decimal[options.locale] : '.', "])?[0-9]+$")).test(str);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./alpha":5,"./util/assertString":99}],70:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isOctal;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var octal = /^(0o)?[0-7]+$/i;
|
|||
|
|
|||
|
function isOctal(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return octal.test(str);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],71:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isPassportNumber;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
/**
|
|||
|
* Reference:
|
|||
|
* https://en.wikipedia.org/ -- Wikipedia
|
|||
|
* https://docs.microsoft.com/en-us/microsoft-365/compliance/eu-passport-number -- EU Passport Number
|
|||
|
* https://countrycode.org/ -- Country Codes
|
|||
|
*/
|
|||
|
var passportRegexByCountryCode = {
|
|||
|
AM: /^[A-Z]{2}\d{7}$/,
|
|||
|
// ARMENIA
|
|||
|
AR: /^[A-Z]{3}\d{6}$/,
|
|||
|
// ARGENTINA
|
|||
|
AT: /^[A-Z]\d{7}$/,
|
|||
|
// AUSTRIA
|
|||
|
AU: /^[A-Z]\d{7}$/,
|
|||
|
// AUSTRALIA
|
|||
|
BE: /^[A-Z]{2}\d{6}$/,
|
|||
|
// BELGIUM
|
|||
|
BG: /^\d{9}$/,
|
|||
|
// BULGARIA
|
|||
|
BR: /^[A-Z]{2}\d{6}$/,
|
|||
|
// BRAZIL
|
|||
|
BY: /^[A-Z]{2}\d{7}$/,
|
|||
|
// BELARUS
|
|||
|
CA: /^[A-Z]{2}\d{6}$/,
|
|||
|
// CANADA
|
|||
|
CH: /^[A-Z]\d{7}$/,
|
|||
|
// SWITZERLAND
|
|||
|
CN: /^G\d{8}$|^E(?![IO])[A-Z0-9]\d{7}$/,
|
|||
|
// CHINA [G=Ordinary, E=Electronic] followed by 8-digits, or E followed by any UPPERCASE letter (except I and O) followed by 7 digits
|
|||
|
CY: /^[A-Z](\d{6}|\d{8})$/,
|
|||
|
// CYPRUS
|
|||
|
CZ: /^\d{8}$/,
|
|||
|
// CZECH REPUBLIC
|
|||
|
DE: /^[CFGHJKLMNPRTVWXYZ0-9]{9}$/,
|
|||
|
// GERMANY
|
|||
|
DK: /^\d{9}$/,
|
|||
|
// DENMARK
|
|||
|
DZ: /^\d{9}$/,
|
|||
|
// ALGERIA
|
|||
|
EE: /^([A-Z]\d{7}|[A-Z]{2}\d{7})$/,
|
|||
|
// ESTONIA (K followed by 7-digits), e-passports have 2 UPPERCASE followed by 7 digits
|
|||
|
ES: /^[A-Z0-9]{2}([A-Z0-9]?)\d{6}$/,
|
|||
|
// SPAIN
|
|||
|
FI: /^[A-Z]{2}\d{7}$/,
|
|||
|
// FINLAND
|
|||
|
FR: /^\d{2}[A-Z]{2}\d{5}$/,
|
|||
|
// FRANCE
|
|||
|
GB: /^\d{9}$/,
|
|||
|
// UNITED KINGDOM
|
|||
|
GR: /^[A-Z]{2}\d{7}$/,
|
|||
|
// GREECE
|
|||
|
HR: /^\d{9}$/,
|
|||
|
// CROATIA
|
|||
|
HU: /^[A-Z]{2}(\d{6}|\d{7})$/,
|
|||
|
// HUNGARY
|
|||
|
IE: /^[A-Z0-9]{2}\d{7}$/,
|
|||
|
// IRELAND
|
|||
|
IN: /^[A-Z]{1}-?\d{7}$/,
|
|||
|
// INDIA
|
|||
|
ID: /^[A-C]\d{7}$/,
|
|||
|
// INDONESIA
|
|||
|
IR: /^[A-Z]\d{8}$/,
|
|||
|
// IRAN
|
|||
|
IS: /^(A)\d{7}$/,
|
|||
|
// ICELAND
|
|||
|
IT: /^[A-Z0-9]{2}\d{7}$/,
|
|||
|
// ITALY
|
|||
|
JP: /^[A-Z]{2}\d{7}$/,
|
|||
|
// JAPAN
|
|||
|
KR: /^[MS]\d{8}$/,
|
|||
|
// SOUTH KOREA, REPUBLIC OF KOREA, [S=PS Passports, M=PM Passports]
|
|||
|
LT: /^[A-Z0-9]{8}$/,
|
|||
|
// LITHUANIA
|
|||
|
LU: /^[A-Z0-9]{8}$/,
|
|||
|
// LUXEMBURG
|
|||
|
LV: /^[A-Z0-9]{2}\d{7}$/,
|
|||
|
// LATVIA
|
|||
|
LY: /^[A-Z0-9]{8}$/,
|
|||
|
// LIBYA
|
|||
|
MT: /^\d{7}$/,
|
|||
|
// MALTA
|
|||
|
MZ: /^([A-Z]{2}\d{7})|(\d{2}[A-Z]{2}\d{5})$/,
|
|||
|
// MOZAMBIQUE
|
|||
|
MY: /^[AHK]\d{8}$/,
|
|||
|
// MALAYSIA
|
|||
|
NL: /^[A-Z]{2}[A-Z0-9]{6}\d$/,
|
|||
|
// NETHERLANDS
|
|||
|
PL: /^[A-Z]{2}\d{7}$/,
|
|||
|
// POLAND
|
|||
|
PT: /^[A-Z]\d{6}$/,
|
|||
|
// PORTUGAL
|
|||
|
RO: /^\d{8,9}$/,
|
|||
|
// ROMANIA
|
|||
|
RU: /^\d{9}$/,
|
|||
|
// RUSSIAN FEDERATION
|
|||
|
SE: /^\d{8}$/,
|
|||
|
// SWEDEN
|
|||
|
SL: /^(P)[A-Z]\d{7}$/,
|
|||
|
// SLOVANIA
|
|||
|
SK: /^[0-9A-Z]\d{7}$/,
|
|||
|
// SLOVAKIA
|
|||
|
TR: /^[A-Z]\d{8}$/,
|
|||
|
// TURKEY
|
|||
|
UA: /^[A-Z]{2}\d{6}$/,
|
|||
|
// UKRAINE
|
|||
|
US: /^\d{9}$/ // UNITED STATES
|
|||
|
|
|||
|
};
|
|||
|
/**
|
|||
|
* Check if str is a valid passport number
|
|||
|
* relative to provided ISO Country Code.
|
|||
|
*
|
|||
|
* @param {string} str
|
|||
|
* @param {string} countryCode
|
|||
|
* @return {boolean}
|
|||
|
*/
|
|||
|
|
|||
|
function isPassportNumber(str, countryCode) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
/** Remove All Whitespaces, Convert to UPPERCASE */
|
|||
|
|
|||
|
var normalizedStr = str.replace(/\s/g, '').toUpperCase();
|
|||
|
return countryCode.toUpperCase() in passportRegexByCountryCode && passportRegexByCountryCode[countryCode].test(normalizedStr);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],72:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isPort;
|
|||
|
|
|||
|
var _isInt = _interopRequireDefault(require("./isInt"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function isPort(str) {
|
|||
|
return (0, _isInt.default)(str, {
|
|||
|
min: 0,
|
|||
|
max: 65535
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./isInt":54}],73:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isPostalCode;
|
|||
|
exports.locales = void 0;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
// common patterns
|
|||
|
var threeDigit = /^\d{3}$/;
|
|||
|
var fourDigit = /^\d{4}$/;
|
|||
|
var fiveDigit = /^\d{5}$/;
|
|||
|
var sixDigit = /^\d{6}$/;
|
|||
|
var patterns = {
|
|||
|
AD: /^AD\d{3}$/,
|
|||
|
AT: fourDigit,
|
|||
|
AU: fourDigit,
|
|||
|
AZ: /^AZ\d{4}$/,
|
|||
|
BE: fourDigit,
|
|||
|
BG: fourDigit,
|
|||
|
BR: /^\d{5}-\d{3}$/,
|
|||
|
BY: /2[1-4]{1}\d{4}$/,
|
|||
|
CA: /^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][\s\-]?\d[ABCEGHJ-NPRSTV-Z]\d$/i,
|
|||
|
CH: fourDigit,
|
|||
|
CN: /^(0[1-7]|1[012356]|2[0-7]|3[0-6]|4[0-7]|5[1-7]|6[1-7]|7[1-5]|8[1345]|9[09])\d{4}$/,
|
|||
|
CZ: /^\d{3}\s?\d{2}$/,
|
|||
|
DE: fiveDigit,
|
|||
|
DK: fourDigit,
|
|||
|
DO: fiveDigit,
|
|||
|
DZ: fiveDigit,
|
|||
|
EE: fiveDigit,
|
|||
|
ES: /^(5[0-2]{1}|[0-4]{1}\d{1})\d{3}$/,
|
|||
|
FI: fiveDigit,
|
|||
|
FR: /^\d{2}\s?\d{3}$/,
|
|||
|
GB: /^(gir\s?0aa|[a-z]{1,2}\d[\da-z]?\s?(\d[a-z]{2})?)$/i,
|
|||
|
GR: /^\d{3}\s?\d{2}$/,
|
|||
|
HR: /^([1-5]\d{4}$)/,
|
|||
|
HT: /^HT\d{4}$/,
|
|||
|
HU: fourDigit,
|
|||
|
ID: fiveDigit,
|
|||
|
IE: /^(?!.*(?:o))[A-Za-z]\d[\dw]\s\w{4}$/i,
|
|||
|
IL: /^(\d{5}|\d{7})$/,
|
|||
|
IN: /^((?!10|29|35|54|55|65|66|86|87|88|89)[1-9][0-9]{5})$/,
|
|||
|
IR: /\b(?!(\d)\1{3})[13-9]{4}[1346-9][013-9]{5}\b/,
|
|||
|
IS: threeDigit,
|
|||
|
IT: fiveDigit,
|
|||
|
JP: /^\d{3}\-\d{4}$/,
|
|||
|
KE: fiveDigit,
|
|||
|
KR: /^(\d{5}|\d{6})$/,
|
|||
|
LI: /^(948[5-9]|949[0-7])$/,
|
|||
|
LT: /^LT\-\d{5}$/,
|
|||
|
LU: fourDigit,
|
|||
|
LV: /^LV\-\d{4}$/,
|
|||
|
LK: fiveDigit,
|
|||
|
MX: fiveDigit,
|
|||
|
MT: /^[A-Za-z]{3}\s{0,1}\d{4}$/,
|
|||
|
MY: fiveDigit,
|
|||
|
NL: /^\d{4}\s?[a-z]{2}$/i,
|
|||
|
NO: fourDigit,
|
|||
|
NP: /^(10|21|22|32|33|34|44|45|56|57)\d{3}$|^(977)$/i,
|
|||
|
NZ: fourDigit,
|
|||
|
PL: /^\d{2}\-\d{3}$/,
|
|||
|
PR: /^00[679]\d{2}([ -]\d{4})?$/,
|
|||
|
PT: /^\d{4}\-\d{3}?$/,
|
|||
|
RO: sixDigit,
|
|||
|
RU: sixDigit,
|
|||
|
SA: fiveDigit,
|
|||
|
SE: /^[1-9]\d{2}\s?\d{2}$/,
|
|||
|
SG: sixDigit,
|
|||
|
SI: fourDigit,
|
|||
|
SK: /^\d{3}\s?\d{2}$/,
|
|||
|
TH: fiveDigit,
|
|||
|
TN: fourDigit,
|
|||
|
TW: /^\d{3}(\d{2})?$/,
|
|||
|
UA: fiveDigit,
|
|||
|
US: /^\d{5}(-\d{4})?$/,
|
|||
|
ZA: fourDigit,
|
|||
|
ZM: fiveDigit
|
|||
|
};
|
|||
|
var locales = Object.keys(patterns);
|
|||
|
exports.locales = locales;
|
|||
|
|
|||
|
function isPostalCode(str, locale) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
|
|||
|
if (locale in patterns) {
|
|||
|
return patterns[locale].test(str);
|
|||
|
} else if (locale === 'any') {
|
|||
|
for (var key in patterns) {
|
|||
|
// https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
|
|||
|
// istanbul ignore else
|
|||
|
if (patterns.hasOwnProperty(key)) {
|
|||
|
var pattern = patterns[key];
|
|||
|
|
|||
|
if (pattern.test(str)) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
throw new Error("Invalid locale '".concat(locale, "'"));
|
|||
|
}
|
|||
|
},{"./util/assertString":99}],74:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isRFC3339;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
/* Based on https://tools.ietf.org/html/rfc3339#section-5.6 */
|
|||
|
var dateFullYear = /[0-9]{4}/;
|
|||
|
var dateMonth = /(0[1-9]|1[0-2])/;
|
|||
|
var dateMDay = /([12]\d|0[1-9]|3[01])/;
|
|||
|
var timeHour = /([01][0-9]|2[0-3])/;
|
|||
|
var timeMinute = /[0-5][0-9]/;
|
|||
|
var timeSecond = /([0-5][0-9]|60)/;
|
|||
|
var timeSecFrac = /(\.[0-9]+)?/;
|
|||
|
var timeNumOffset = new RegExp("[-+]".concat(timeHour.source, ":").concat(timeMinute.source));
|
|||
|
var timeOffset = new RegExp("([zZ]|".concat(timeNumOffset.source, ")"));
|
|||
|
var partialTime = new RegExp("".concat(timeHour.source, ":").concat(timeMinute.source, ":").concat(timeSecond.source).concat(timeSecFrac.source));
|
|||
|
var fullDate = new RegExp("".concat(dateFullYear.source, "-").concat(dateMonth.source, "-").concat(dateMDay.source));
|
|||
|
var fullTime = new RegExp("".concat(partialTime.source).concat(timeOffset.source));
|
|||
|
var rfc3339 = new RegExp("^".concat(fullDate.source, "[ tT]").concat(fullTime.source, "$"));
|
|||
|
|
|||
|
function isRFC3339(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return rfc3339.test(str);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],75:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isRgbColor;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var rgbColor = /^rgb\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){2}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\)$/;
|
|||
|
var rgbaColor = /^rgba\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)$/;
|
|||
|
var rgbColorPercent = /^rgb\((([0-9]%|[1-9][0-9]%|100%),){2}([0-9]%|[1-9][0-9]%|100%)\)/;
|
|||
|
var rgbaColorPercent = /^rgba\((([0-9]%|[1-9][0-9]%|100%),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)/;
|
|||
|
|
|||
|
function isRgbColor(str) {
|
|||
|
var includePercentValues = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|||
|
(0, _assertString.default)(str);
|
|||
|
|
|||
|
if (!includePercentValues) {
|
|||
|
return rgbColor.test(str) || rgbaColor.test(str);
|
|||
|
}
|
|||
|
|
|||
|
return rgbColor.test(str) || rgbaColor.test(str) || rgbColorPercent.test(str) || rgbaColorPercent.test(str);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],76:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isSemVer;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
var _multilineRegex = _interopRequireDefault(require("./util/multilineRegex"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
/**
|
|||
|
* Regular Expression to match
|
|||
|
* semantic versioning (SemVer)
|
|||
|
* built from multi-line, multi-parts regexp
|
|||
|
* Reference: https://semver.org/
|
|||
|
*/
|
|||
|
var semanticVersioningRegex = (0, _multilineRegex.default)(['^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)', '(?:-((?:0|[1-9]\\d*|\\d*[a-z-][0-9a-z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-z-][0-9a-z-]*))*))', '?(?:\\+([0-9a-z-]+(?:\\.[0-9a-z-]+)*))?$'], 'i');
|
|||
|
|
|||
|
function isSemVer(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return semanticVersioningRegex.test(str);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99,"./util/multilineRegex":102}],77:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isSlug;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var charsetRegex = /^[^\s-_](?!.*?[-_]{2,})[a-z0-9-\\][^\s]*[^-_\s]$/;
|
|||
|
|
|||
|
function isSlug(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return charsetRegex.test(str);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],78:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isStrongPassword;
|
|||
|
|
|||
|
var _merge = _interopRequireDefault(require("./util/merge"));
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var upperCaseRegex = /^[A-Z]$/;
|
|||
|
var lowerCaseRegex = /^[a-z]$/;
|
|||
|
var numberRegex = /^[0-9]$/;
|
|||
|
var symbolRegex = /^[-#!$@%^&*()_+|~=`{}\[\]:";'<>?,.\/ ]$/;
|
|||
|
var defaultOptions = {
|
|||
|
minLength: 8,
|
|||
|
minLowercase: 1,
|
|||
|
minUppercase: 1,
|
|||
|
minNumbers: 1,
|
|||
|
minSymbols: 1,
|
|||
|
returnScore: false,
|
|||
|
pointsPerUnique: 1,
|
|||
|
pointsPerRepeat: 0.5,
|
|||
|
pointsForContainingLower: 10,
|
|||
|
pointsForContainingUpper: 10,
|
|||
|
pointsForContainingNumber: 10,
|
|||
|
pointsForContainingSymbol: 10
|
|||
|
};
|
|||
|
/* Counts number of occurrences of each char in a string
|
|||
|
* could be moved to util/ ?
|
|||
|
*/
|
|||
|
|
|||
|
function countChars(str) {
|
|||
|
var result = {};
|
|||
|
Array.from(str).forEach(function (char) {
|
|||
|
var curVal = result[char];
|
|||
|
|
|||
|
if (curVal) {
|
|||
|
result[char] += 1;
|
|||
|
} else {
|
|||
|
result[char] = 1;
|
|||
|
}
|
|||
|
});
|
|||
|
return result;
|
|||
|
}
|
|||
|
/* Return information about a password */
|
|||
|
|
|||
|
|
|||
|
function analyzePassword(password) {
|
|||
|
var charMap = countChars(password);
|
|||
|
var analysis = {
|
|||
|
length: password.length,
|
|||
|
uniqueChars: Object.keys(charMap).length,
|
|||
|
uppercaseCount: 0,
|
|||
|
lowercaseCount: 0,
|
|||
|
numberCount: 0,
|
|||
|
symbolCount: 0
|
|||
|
};
|
|||
|
Object.keys(charMap).forEach(function (char) {
|
|||
|
/* istanbul ignore else */
|
|||
|
if (upperCaseRegex.test(char)) {
|
|||
|
analysis.uppercaseCount += charMap[char];
|
|||
|
} else if (lowerCaseRegex.test(char)) {
|
|||
|
analysis.lowercaseCount += charMap[char];
|
|||
|
} else if (numberRegex.test(char)) {
|
|||
|
analysis.numberCount += charMap[char];
|
|||
|
} else if (symbolRegex.test(char)) {
|
|||
|
analysis.symbolCount += charMap[char];
|
|||
|
}
|
|||
|
});
|
|||
|
return analysis;
|
|||
|
}
|
|||
|
|
|||
|
function scorePassword(analysis, scoringOptions) {
|
|||
|
var points = 0;
|
|||
|
points += analysis.uniqueChars * scoringOptions.pointsPerUnique;
|
|||
|
points += (analysis.length - analysis.uniqueChars) * scoringOptions.pointsPerRepeat;
|
|||
|
|
|||
|
if (analysis.lowercaseCount > 0) {
|
|||
|
points += scoringOptions.pointsForContainingLower;
|
|||
|
}
|
|||
|
|
|||
|
if (analysis.uppercaseCount > 0) {
|
|||
|
points += scoringOptions.pointsForContainingUpper;
|
|||
|
}
|
|||
|
|
|||
|
if (analysis.numberCount > 0) {
|
|||
|
points += scoringOptions.pointsForContainingNumber;
|
|||
|
}
|
|||
|
|
|||
|
if (analysis.symbolCount > 0) {
|
|||
|
points += scoringOptions.pointsForContainingSymbol;
|
|||
|
}
|
|||
|
|
|||
|
return points;
|
|||
|
}
|
|||
|
|
|||
|
function isStrongPassword(str) {
|
|||
|
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
|||
|
(0, _assertString.default)(str);
|
|||
|
var analysis = analyzePassword(str);
|
|||
|
options = (0, _merge.default)(options || {}, defaultOptions);
|
|||
|
|
|||
|
if (options.returnScore) {
|
|||
|
return scorePassword(analysis, options);
|
|||
|
}
|
|||
|
|
|||
|
return analysis.length >= options.minLength && analysis.lowercaseCount >= options.minLowercase && analysis.uppercaseCount >= options.minUppercase && analysis.numberCount >= options.minNumbers && analysis.symbolCount >= options.minSymbols;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99,"./util/merge":101}],79:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isSurrogatePair;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var surrogatePair = /[\uD800-\uDBFF][\uDC00-\uDFFF]/;
|
|||
|
|
|||
|
function isSurrogatePair(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return surrogatePair.test(str);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],80:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isTaxID;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
var algorithms = _interopRequireWildcard(require("./util/algorithms"));
|
|||
|
|
|||
|
var _isDate = _interopRequireDefault(require("./isDate"));
|
|||
|
|
|||
|
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
|
|||
|
|
|||
|
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|||
|
|
|||
|
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|||
|
|
|||
|
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|||
|
|
|||
|
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
|
|||
|
|
|||
|
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|||
|
|
|||
|
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|||
|
|
|||
|
/**
|
|||
|
* TIN Validation
|
|||
|
* Validates Tax Identification Numbers (TINs) from the US, EU member states and the United Kingdom.
|
|||
|
*
|
|||
|
* EU-UK:
|
|||
|
* National TIN validity is calculated using public algorithms as made available by DG TAXUD.
|
|||
|
*
|
|||
|
* See `https://ec.europa.eu/taxation_customs/tin/specs/FS-TIN%20Algorithms-Public.docx` for more information.
|
|||
|
*
|
|||
|
* US:
|
|||
|
* An Employer Identification Number (EIN), also known as a Federal Tax Identification Number,
|
|||
|
* is used to identify a business entity.
|
|||
|
*
|
|||
|
* NOTES:
|
|||
|
* - Prefix 47 is being reserved for future use
|
|||
|
* - Prefixes 26, 27, 45, 46 and 47 were previously assigned by the Philadelphia campus.
|
|||
|
*
|
|||
|
* See `http://www.irs.gov/Businesses/Small-Businesses-&-Self-Employed/How-EINs-are-Assigned-and-Valid-EIN-Prefixes`
|
|||
|
* for more information.
|
|||
|
*/
|
|||
|
// Locale functions
|
|||
|
|
|||
|
/*
|
|||
|
* bg-BG validation function
|
|||
|
* (Edinen graždanski nomer (EGN/ЕГН), persons only)
|
|||
|
* Checks if birth date (first six digits) is valid and calculates check (last) digit
|
|||
|
*/
|
|||
|
function bgBgCheck(tin) {
|
|||
|
// Extract full year, normalize month and check birth date validity
|
|||
|
var century_year = tin.slice(0, 2);
|
|||
|
var month = parseInt(tin.slice(2, 4), 10);
|
|||
|
|
|||
|
if (month > 40) {
|
|||
|
month -= 40;
|
|||
|
century_year = "20".concat(century_year);
|
|||
|
} else if (month > 20) {
|
|||
|
month -= 20;
|
|||
|
century_year = "18".concat(century_year);
|
|||
|
} else {
|
|||
|
century_year = "19".concat(century_year);
|
|||
|
}
|
|||
|
|
|||
|
if (month < 10) {
|
|||
|
month = "0".concat(month);
|
|||
|
}
|
|||
|
|
|||
|
var date = "".concat(century_year, "/").concat(month, "/").concat(tin.slice(4, 6));
|
|||
|
|
|||
|
if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {
|
|||
|
return false;
|
|||
|
} // split digits into an array for further processing
|
|||
|
|
|||
|
|
|||
|
var digits = tin.split('').map(function (a) {
|
|||
|
return parseInt(a, 10);
|
|||
|
}); // Calculate checksum by multiplying digits with fixed values
|
|||
|
|
|||
|
var multip_lookup = [2, 4, 8, 5, 10, 9, 7, 3, 6];
|
|||
|
var checksum = 0;
|
|||
|
|
|||
|
for (var i = 0; i < multip_lookup.length; i++) {
|
|||
|
checksum += digits[i] * multip_lookup[i];
|
|||
|
}
|
|||
|
|
|||
|
checksum = checksum % 11 === 10 ? 0 : checksum % 11;
|
|||
|
return checksum === digits[9];
|
|||
|
}
|
|||
|
/*
|
|||
|
* cs-CZ validation function
|
|||
|
* (Rodné číslo (RČ), persons only)
|
|||
|
* Checks if birth date (first six digits) is valid and divisibility by 11
|
|||
|
* Material not in DG TAXUD document sourced from:
|
|||
|
* -`https://lorenc.info/3MA381/overeni-spravnosti-rodneho-cisla.htm`
|
|||
|
* -`https://www.mvcr.cz/clanek/rady-a-sluzby-dokumenty-rodne-cislo.aspx`
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function csCzCheck(tin) {
|
|||
|
tin = tin.replace(/\W/, ''); // Extract full year from TIN length
|
|||
|
|
|||
|
var full_year = parseInt(tin.slice(0, 2), 10);
|
|||
|
|
|||
|
if (tin.length === 10) {
|
|||
|
if (full_year < 54) {
|
|||
|
full_year = "20".concat(full_year);
|
|||
|
} else {
|
|||
|
full_year = "19".concat(full_year);
|
|||
|
}
|
|||
|
} else {
|
|||
|
if (tin.slice(6) === '000') {
|
|||
|
return false;
|
|||
|
} // Three-zero serial not assigned before 1954
|
|||
|
|
|||
|
|
|||
|
if (full_year < 54) {
|
|||
|
full_year = "19".concat(full_year);
|
|||
|
} else {
|
|||
|
return false; // No 18XX years seen in any of the resources
|
|||
|
}
|
|||
|
} // Add missing zero if needed
|
|||
|
|
|||
|
|
|||
|
if (full_year.length === 3) {
|
|||
|
full_year = [full_year.slice(0, 2), '0', full_year.slice(2)].join('');
|
|||
|
} // Extract month from TIN and normalize
|
|||
|
|
|||
|
|
|||
|
var month = parseInt(tin.slice(2, 4), 10);
|
|||
|
|
|||
|
if (month > 50) {
|
|||
|
month -= 50;
|
|||
|
}
|
|||
|
|
|||
|
if (month > 20) {
|
|||
|
// Month-plus-twenty was only introduced in 2004
|
|||
|
if (parseInt(full_year, 10) < 2004) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
month -= 20;
|
|||
|
}
|
|||
|
|
|||
|
if (month < 10) {
|
|||
|
month = "0".concat(month);
|
|||
|
} // Check date validity
|
|||
|
|
|||
|
|
|||
|
var date = "".concat(full_year, "/").concat(month, "/").concat(tin.slice(4, 6));
|
|||
|
|
|||
|
if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {
|
|||
|
return false;
|
|||
|
} // Verify divisibility by 11
|
|||
|
|
|||
|
|
|||
|
if (tin.length === 10) {
|
|||
|
if (parseInt(tin, 10) % 11 !== 0) {
|
|||
|
// Some numbers up to and including 1985 are still valid if
|
|||
|
// check (last) digit equals 0 and modulo of first 9 digits equals 10
|
|||
|
var checkdigit = parseInt(tin.slice(0, 9), 10) % 11;
|
|||
|
|
|||
|
if (parseInt(full_year, 10) < 1986 && checkdigit === 10) {
|
|||
|
if (parseInt(tin.slice(9), 10) !== 0) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
} else {
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
/*
|
|||
|
* de-AT validation function
|
|||
|
* (Abgabenkontonummer, persons/entities)
|
|||
|
* Verify TIN validity by calling luhnCheck()
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function deAtCheck(tin) {
|
|||
|
return algorithms.luhnCheck(tin);
|
|||
|
}
|
|||
|
/*
|
|||
|
* de-DE validation function
|
|||
|
* (Steueridentifikationsnummer (Steuer-IdNr.), persons only)
|
|||
|
* Tests for single duplicate/triplicate value, then calculates ISO 7064 check (last) digit
|
|||
|
* Partial implementation of spec (same result with both algorithms always)
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function deDeCheck(tin) {
|
|||
|
// Split digits into an array for further processing
|
|||
|
var digits = tin.split('').map(function (a) {
|
|||
|
return parseInt(a, 10);
|
|||
|
}); // Fill array with strings of number positions
|
|||
|
|
|||
|
var occurences = [];
|
|||
|
|
|||
|
for (var i = 0; i < digits.length - 1; i++) {
|
|||
|
occurences.push('');
|
|||
|
|
|||
|
for (var j = 0; j < digits.length - 1; j++) {
|
|||
|
if (digits[i] === digits[j]) {
|
|||
|
occurences[i] += j;
|
|||
|
}
|
|||
|
}
|
|||
|
} // Remove digits with one occurence and test for only one duplicate/triplicate
|
|||
|
|
|||
|
|
|||
|
occurences = occurences.filter(function (a) {
|
|||
|
return a.length > 1;
|
|||
|
});
|
|||
|
|
|||
|
if (occurences.length !== 2 && occurences.length !== 3) {
|
|||
|
return false;
|
|||
|
} // In case of triplicate value only two digits are allowed next to each other
|
|||
|
|
|||
|
|
|||
|
if (occurences[0].length === 3) {
|
|||
|
var trip_locations = occurences[0].split('').map(function (a) {
|
|||
|
return parseInt(a, 10);
|
|||
|
});
|
|||
|
var recurrent = 0; // Amount of neighbour occurences
|
|||
|
|
|||
|
for (var _i = 0; _i < trip_locations.length - 1; _i++) {
|
|||
|
if (trip_locations[_i] + 1 === trip_locations[_i + 1]) {
|
|||
|
recurrent += 1;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (recurrent === 2) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return algorithms.iso7064Check(tin);
|
|||
|
}
|
|||
|
/*
|
|||
|
* dk-DK validation function
|
|||
|
* (CPR-nummer (personnummer), persons only)
|
|||
|
* Checks if birth date (first six digits) is valid and assigned to century (seventh) digit,
|
|||
|
* and calculates check (last) digit
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function dkDkCheck(tin) {
|
|||
|
tin = tin.replace(/\W/, ''); // Extract year, check if valid for given century digit and add century
|
|||
|
|
|||
|
var year = parseInt(tin.slice(4, 6), 10);
|
|||
|
var century_digit = tin.slice(6, 7);
|
|||
|
|
|||
|
switch (century_digit) {
|
|||
|
case '0':
|
|||
|
case '1':
|
|||
|
case '2':
|
|||
|
case '3':
|
|||
|
year = "19".concat(year);
|
|||
|
break;
|
|||
|
|
|||
|
case '4':
|
|||
|
case '9':
|
|||
|
if (year < 37) {
|
|||
|
year = "20".concat(year);
|
|||
|
} else {
|
|||
|
year = "19".concat(year);
|
|||
|
}
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
if (year < 37) {
|
|||
|
year = "20".concat(year);
|
|||
|
} else if (year > 58) {
|
|||
|
year = "18".concat(year);
|
|||
|
} else {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
break;
|
|||
|
} // Add missing zero if needed
|
|||
|
|
|||
|
|
|||
|
if (year.length === 3) {
|
|||
|
year = [year.slice(0, 2), '0', year.slice(2)].join('');
|
|||
|
} // Check date validity
|
|||
|
|
|||
|
|
|||
|
var date = "".concat(year, "/").concat(tin.slice(2, 4), "/").concat(tin.slice(0, 2));
|
|||
|
|
|||
|
if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {
|
|||
|
return false;
|
|||
|
} // Split digits into an array for further processing
|
|||
|
|
|||
|
|
|||
|
var digits = tin.split('').map(function (a) {
|
|||
|
return parseInt(a, 10);
|
|||
|
});
|
|||
|
var checksum = 0;
|
|||
|
var weight = 4; // Multiply by weight and add to checksum
|
|||
|
|
|||
|
for (var i = 0; i < 9; i++) {
|
|||
|
checksum += digits[i] * weight;
|
|||
|
weight -= 1;
|
|||
|
|
|||
|
if (weight === 1) {
|
|||
|
weight = 7;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
checksum %= 11;
|
|||
|
|
|||
|
if (checksum === 1) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
return checksum === 0 ? digits[9] === 0 : digits[9] === 11 - checksum;
|
|||
|
}
|
|||
|
/*
|
|||
|
* el-CY validation function
|
|||
|
* (Arithmos Forologikou Mitroou (AFM/ΑΦΜ), persons only)
|
|||
|
* Verify TIN validity by calculating ASCII value of check (last) character
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function elCyCheck(tin) {
|
|||
|
// split digits into an array for further processing
|
|||
|
var digits = tin.slice(0, 8).split('').map(function (a) {
|
|||
|
return parseInt(a, 10);
|
|||
|
});
|
|||
|
var checksum = 0; // add digits in even places
|
|||
|
|
|||
|
for (var i = 1; i < digits.length; i += 2) {
|
|||
|
checksum += digits[i];
|
|||
|
} // add digits in odd places
|
|||
|
|
|||
|
|
|||
|
for (var _i2 = 0; _i2 < digits.length; _i2 += 2) {
|
|||
|
if (digits[_i2] < 2) {
|
|||
|
checksum += 1 - digits[_i2];
|
|||
|
} else {
|
|||
|
checksum += 2 * (digits[_i2] - 2) + 5;
|
|||
|
|
|||
|
if (digits[_i2] > 4) {
|
|||
|
checksum += 2;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return String.fromCharCode(checksum % 26 + 65) === tin.charAt(8);
|
|||
|
}
|
|||
|
/*
|
|||
|
* el-GR validation function
|
|||
|
* (Arithmos Forologikou Mitroou (AFM/ΑΦΜ), persons/entities)
|
|||
|
* Verify TIN validity by calculating check (last) digit
|
|||
|
* Algorithm not in DG TAXUD document- sourced from:
|
|||
|
* - `http://epixeirisi.gr/%CE%9A%CE%A1%CE%99%CE%A3%CE%99%CE%9C%CE%91-%CE%98%CE%95%CE%9C%CE%91%CE%A4%CE%91-%CE%A6%CE%9F%CE%A1%CE%9F%CE%9B%CE%9F%CE%93%CE%99%CE%91%CE%A3-%CE%9A%CE%91%CE%99-%CE%9B%CE%9F%CE%93%CE%99%CE%A3%CE%A4%CE%99%CE%9A%CE%97%CE%A3/23791/%CE%91%CF%81%CE%B9%CE%B8%CE%BC%CF%8C%CF%82-%CE%A6%CE%BF%CF%81%CE%BF%CE%BB%CE%BF%CE%B3%CE%B9%CE%BA%CE%BF%CF%8D-%CE%9C%CE%B7%CF%84%CF%81%CF%8E%CE%BF%CF%85`
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function elGrCheck(tin) {
|
|||
|
// split digits into an array for further processing
|
|||
|
var digits = tin.split('').map(function (a) {
|
|||
|
return parseInt(a, 10);
|
|||
|
});
|
|||
|
var checksum = 0;
|
|||
|
|
|||
|
for (var i = 0; i < 8; i++) {
|
|||
|
checksum += digits[i] * Math.pow(2, 8 - i);
|
|||
|
}
|
|||
|
|
|||
|
return checksum % 11 % 10 === digits[8];
|
|||
|
}
|
|||
|
/*
|
|||
|
* en-GB validation function (should go here if needed)
|
|||
|
* (National Insurance Number (NINO) or Unique Taxpayer Reference (UTR),
|
|||
|
* persons/entities respectively)
|
|||
|
*/
|
|||
|
|
|||
|
/*
|
|||
|
* en-IE validation function
|
|||
|
* (Personal Public Service Number (PPS No), persons only)
|
|||
|
* Verify TIN validity by calculating check (second to last) character
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function enIeCheck(tin) {
|
|||
|
var checksum = algorithms.reverseMultiplyAndSum(tin.split('').slice(0, 7).map(function (a) {
|
|||
|
return parseInt(a, 10);
|
|||
|
}), 8);
|
|||
|
|
|||
|
if (tin.length === 9 && tin[8] !== 'W') {
|
|||
|
checksum += (tin[8].charCodeAt(0) - 64) * 9;
|
|||
|
}
|
|||
|
|
|||
|
checksum %= 23;
|
|||
|
|
|||
|
if (checksum === 0) {
|
|||
|
return tin[7].toUpperCase() === 'W';
|
|||
|
}
|
|||
|
|
|||
|
return tin[7].toUpperCase() === String.fromCharCode(64 + checksum);
|
|||
|
} // Valid US IRS campus prefixes
|
|||
|
|
|||
|
|
|||
|
var enUsCampusPrefix = {
|
|||
|
andover: ['10', '12'],
|
|||
|
atlanta: ['60', '67'],
|
|||
|
austin: ['50', '53'],
|
|||
|
brookhaven: ['01', '02', '03', '04', '05', '06', '11', '13', '14', '16', '21', '22', '23', '25', '34', '51', '52', '54', '55', '56', '57', '58', '59', '65'],
|
|||
|
cincinnati: ['30', '32', '35', '36', '37', '38', '61'],
|
|||
|
fresno: ['15', '24'],
|
|||
|
internet: ['20', '26', '27', '45', '46', '47'],
|
|||
|
kansas: ['40', '44'],
|
|||
|
memphis: ['94', '95'],
|
|||
|
ogden: ['80', '90'],
|
|||
|
philadelphia: ['33', '39', '41', '42', '43', '46', '48', '62', '63', '64', '66', '68', '71', '72', '73', '74', '75', '76', '77', '81', '82', '83', '84', '85', '86', '87', '88', '91', '92', '93', '98', '99'],
|
|||
|
sba: ['31']
|
|||
|
}; // Return an array of all US IRS campus prefixes
|
|||
|
|
|||
|
function enUsGetPrefixes() {
|
|||
|
var prefixes = [];
|
|||
|
|
|||
|
for (var location in enUsCampusPrefix) {
|
|||
|
// https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
|
|||
|
// istanbul ignore else
|
|||
|
if (enUsCampusPrefix.hasOwnProperty(location)) {
|
|||
|
prefixes.push.apply(prefixes, _toConsumableArray(enUsCampusPrefix[location]));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return prefixes;
|
|||
|
}
|
|||
|
/*
|
|||
|
* en-US validation function
|
|||
|
* Verify that the TIN starts with a valid IRS campus prefix
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function enUsCheck(tin) {
|
|||
|
return enUsGetPrefixes().indexOf(tin.substr(0, 2)) !== -1;
|
|||
|
}
|
|||
|
/*
|
|||
|
* es-ES validation function
|
|||
|
* (Documento Nacional de Identidad (DNI)
|
|||
|
* or Número de Identificación de Extranjero (NIE), persons only)
|
|||
|
* Verify TIN validity by calculating check (last) character
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function esEsCheck(tin) {
|
|||
|
// Split characters into an array for further processing
|
|||
|
var chars = tin.toUpperCase().split(''); // Replace initial letter if needed
|
|||
|
|
|||
|
if (isNaN(parseInt(chars[0], 10)) && chars.length > 1) {
|
|||
|
var lead_replace = 0;
|
|||
|
|
|||
|
switch (chars[0]) {
|
|||
|
case 'Y':
|
|||
|
lead_replace = 1;
|
|||
|
break;
|
|||
|
|
|||
|
case 'Z':
|
|||
|
lead_replace = 2;
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
}
|
|||
|
|
|||
|
chars.splice(0, 1, lead_replace); // Fill with zeros if smaller than proper
|
|||
|
} else {
|
|||
|
while (chars.length < 9) {
|
|||
|
chars.unshift(0);
|
|||
|
}
|
|||
|
} // Calculate checksum and check according to lookup
|
|||
|
|
|||
|
|
|||
|
var lookup = ['T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'E'];
|
|||
|
chars = chars.join('');
|
|||
|
var checksum = parseInt(chars.slice(0, 8), 10) % 23;
|
|||
|
return chars[8] === lookup[checksum];
|
|||
|
}
|
|||
|
/*
|
|||
|
* et-EE validation function
|
|||
|
* (Isikukood (IK), persons only)
|
|||
|
* Checks if birth date (century digit and six following) is valid and calculates check (last) digit
|
|||
|
* Material not in DG TAXUD document sourced from:
|
|||
|
* - `https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Estonia-TIN.pdf`
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function etEeCheck(tin) {
|
|||
|
// Extract year and add century
|
|||
|
var full_year = tin.slice(1, 3);
|
|||
|
var century_digit = tin.slice(0, 1);
|
|||
|
|
|||
|
switch (century_digit) {
|
|||
|
case '1':
|
|||
|
case '2':
|
|||
|
full_year = "18".concat(full_year);
|
|||
|
break;
|
|||
|
|
|||
|
case '3':
|
|||
|
case '4':
|
|||
|
full_year = "19".concat(full_year);
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
full_year = "20".concat(full_year);
|
|||
|
break;
|
|||
|
} // Check date validity
|
|||
|
|
|||
|
|
|||
|
var date = "".concat(full_year, "/").concat(tin.slice(3, 5), "/").concat(tin.slice(5, 7));
|
|||
|
|
|||
|
if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {
|
|||
|
return false;
|
|||
|
} // Split digits into an array for further processing
|
|||
|
|
|||
|
|
|||
|
var digits = tin.split('').map(function (a) {
|
|||
|
return parseInt(a, 10);
|
|||
|
});
|
|||
|
var checksum = 0;
|
|||
|
var weight = 1; // Multiply by weight and add to checksum
|
|||
|
|
|||
|
for (var i = 0; i < 10; i++) {
|
|||
|
checksum += digits[i] * weight;
|
|||
|
weight += 1;
|
|||
|
|
|||
|
if (weight === 10) {
|
|||
|
weight = 1;
|
|||
|
}
|
|||
|
} // Do again if modulo 11 of checksum is 10
|
|||
|
|
|||
|
|
|||
|
if (checksum % 11 === 10) {
|
|||
|
checksum = 0;
|
|||
|
weight = 3;
|
|||
|
|
|||
|
for (var _i3 = 0; _i3 < 10; _i3++) {
|
|||
|
checksum += digits[_i3] * weight;
|
|||
|
weight += 1;
|
|||
|
|
|||
|
if (weight === 10) {
|
|||
|
weight = 1;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (checksum % 11 === 10) {
|
|||
|
return digits[10] === 0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return checksum % 11 === digits[10];
|
|||
|
}
|
|||
|
/*
|
|||
|
* fi-FI validation function
|
|||
|
* (Henkilötunnus (HETU), persons only)
|
|||
|
* Checks if birth date (first six digits plus century symbol) is valid
|
|||
|
* and calculates check (last) digit
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function fiFiCheck(tin) {
|
|||
|
// Extract year and add century
|
|||
|
var full_year = tin.slice(4, 6);
|
|||
|
var century_symbol = tin.slice(6, 7);
|
|||
|
|
|||
|
switch (century_symbol) {
|
|||
|
case '+':
|
|||
|
full_year = "18".concat(full_year);
|
|||
|
break;
|
|||
|
|
|||
|
case '-':
|
|||
|
full_year = "19".concat(full_year);
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
full_year = "20".concat(full_year);
|
|||
|
break;
|
|||
|
} // Check date validity
|
|||
|
|
|||
|
|
|||
|
var date = "".concat(full_year, "/").concat(tin.slice(2, 4), "/").concat(tin.slice(0, 2));
|
|||
|
|
|||
|
if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {
|
|||
|
return false;
|
|||
|
} // Calculate check character
|
|||
|
|
|||
|
|
|||
|
var checksum = parseInt(tin.slice(0, 6) + tin.slice(7, 10), 10) % 31;
|
|||
|
|
|||
|
if (checksum < 10) {
|
|||
|
return checksum === parseInt(tin.slice(10), 10);
|
|||
|
}
|
|||
|
|
|||
|
checksum -= 10;
|
|||
|
var letters_lookup = ['A', 'B', 'C', 'D', 'E', 'F', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y'];
|
|||
|
return letters_lookup[checksum] === tin.slice(10);
|
|||
|
}
|
|||
|
/*
|
|||
|
* fr/nl-BE validation function
|
|||
|
* (Numéro national (N.N.), persons only)
|
|||
|
* Checks if birth date (first six digits) is valid and calculates check (last two) digits
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function frBeCheck(tin) {
|
|||
|
// Zero month/day value is acceptable
|
|||
|
if (tin.slice(2, 4) !== '00' || tin.slice(4, 6) !== '00') {
|
|||
|
// Extract date from first six digits of TIN
|
|||
|
var date = "".concat(tin.slice(0, 2), "/").concat(tin.slice(2, 4), "/").concat(tin.slice(4, 6));
|
|||
|
|
|||
|
if (!(0, _isDate.default)(date, 'YY/MM/DD')) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
var checksum = 97 - parseInt(tin.slice(0, 9), 10) % 97;
|
|||
|
var checkdigits = parseInt(tin.slice(9, 11), 10);
|
|||
|
|
|||
|
if (checksum !== checkdigits) {
|
|||
|
checksum = 97 - parseInt("2".concat(tin.slice(0, 9)), 10) % 97;
|
|||
|
|
|||
|
if (checksum !== checkdigits) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
/*
|
|||
|
* fr-FR validation function
|
|||
|
* (Numéro fiscal de référence (numéro SPI), persons only)
|
|||
|
* Verify TIN validity by calculating check (last three) digits
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function frFrCheck(tin) {
|
|||
|
tin = tin.replace(/\s/g, '');
|
|||
|
var checksum = parseInt(tin.slice(0, 10), 10) % 511;
|
|||
|
var checkdigits = parseInt(tin.slice(10, 13), 10);
|
|||
|
return checksum === checkdigits;
|
|||
|
}
|
|||
|
/*
|
|||
|
* fr/lb-LU validation function
|
|||
|
* (numéro d’identification personnelle, persons only)
|
|||
|
* Verify birth date validity and run Luhn and Verhoeff checks
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function frLuCheck(tin) {
|
|||
|
// Extract date and check validity
|
|||
|
var date = "".concat(tin.slice(0, 4), "/").concat(tin.slice(4, 6), "/").concat(tin.slice(6, 8));
|
|||
|
|
|||
|
if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {
|
|||
|
return false;
|
|||
|
} // Run Luhn check
|
|||
|
|
|||
|
|
|||
|
if (!algorithms.luhnCheck(tin.slice(0, 12))) {
|
|||
|
return false;
|
|||
|
} // Remove Luhn check digit and run Verhoeff check
|
|||
|
|
|||
|
|
|||
|
return algorithms.verhoeffCheck("".concat(tin.slice(0, 11)).concat(tin[12]));
|
|||
|
}
|
|||
|
/*
|
|||
|
* hr-HR validation function
|
|||
|
* (Osobni identifikacijski broj (OIB), persons/entities)
|
|||
|
* Verify TIN validity by calling iso7064Check(digits)
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function hrHrCheck(tin) {
|
|||
|
return algorithms.iso7064Check(tin);
|
|||
|
}
|
|||
|
/*
|
|||
|
* hu-HU validation function
|
|||
|
* (Adóazonosító jel, persons only)
|
|||
|
* Verify TIN validity by calculating check (last) digit
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function huHuCheck(tin) {
|
|||
|
// split digits into an array for further processing
|
|||
|
var digits = tin.split('').map(function (a) {
|
|||
|
return parseInt(a, 10);
|
|||
|
});
|
|||
|
var checksum = 8;
|
|||
|
|
|||
|
for (var i = 1; i < 9; i++) {
|
|||
|
checksum += digits[i] * (i + 1);
|
|||
|
}
|
|||
|
|
|||
|
return checksum % 11 === digits[9];
|
|||
|
}
|
|||
|
/*
|
|||
|
* lt-LT validation function (should go here if needed)
|
|||
|
* (Asmens kodas, persons/entities respectively)
|
|||
|
* Current validation check is alias of etEeCheck- same format applies
|
|||
|
*/
|
|||
|
|
|||
|
/*
|
|||
|
* it-IT first/last name validity check
|
|||
|
* Accepts it-IT TIN-encoded names as a three-element character array and checks their validity
|
|||
|
* Due to lack of clarity between resources ("Are only Italian consonants used?
|
|||
|
* What happens if a person has X in their name?" etc.) only two test conditions
|
|||
|
* have been implemented:
|
|||
|
* Vowels may only be followed by other vowels or an X character
|
|||
|
* and X characters after vowels may only be followed by other X characters.
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function itItNameCheck(name) {
|
|||
|
// true at the first occurence of a vowel
|
|||
|
var vowelflag = false; // true at the first occurence of an X AFTER vowel
|
|||
|
// (to properly handle last names with X as consonant)
|
|||
|
|
|||
|
var xflag = false;
|
|||
|
|
|||
|
for (var i = 0; i < 3; i++) {
|
|||
|
if (!vowelflag && /[AEIOU]/.test(name[i])) {
|
|||
|
vowelflag = true;
|
|||
|
} else if (!xflag && vowelflag && name[i] === 'X') {
|
|||
|
xflag = true;
|
|||
|
} else if (i > 0) {
|
|||
|
if (vowelflag && !xflag) {
|
|||
|
if (!/[AEIOU]/.test(name[i])) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (xflag) {
|
|||
|
if (!/X/.test(name[i])) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
/*
|
|||
|
* it-IT validation function
|
|||
|
* (Codice fiscale (TIN-IT), persons only)
|
|||
|
* Verify name, birth date and codice catastale validity
|
|||
|
* and calculate check character.
|
|||
|
* Material not in DG-TAXUD document sourced from:
|
|||
|
* `https://en.wikipedia.org/wiki/Italian_fiscal_code`
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function itItCheck(tin) {
|
|||
|
// Capitalize and split characters into an array for further processing
|
|||
|
var chars = tin.toUpperCase().split(''); // Check first and last name validity calling itItNameCheck()
|
|||
|
|
|||
|
if (!itItNameCheck(chars.slice(0, 3))) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (!itItNameCheck(chars.slice(3, 6))) {
|
|||
|
return false;
|
|||
|
} // Convert letters in number spaces back to numbers if any
|
|||
|
|
|||
|
|
|||
|
var number_locations = [6, 7, 9, 10, 12, 13, 14];
|
|||
|
var number_replace = {
|
|||
|
L: '0',
|
|||
|
M: '1',
|
|||
|
N: '2',
|
|||
|
P: '3',
|
|||
|
Q: '4',
|
|||
|
R: '5',
|
|||
|
S: '6',
|
|||
|
T: '7',
|
|||
|
U: '8',
|
|||
|
V: '9'
|
|||
|
};
|
|||
|
|
|||
|
for (var _i4 = 0, _number_locations = number_locations; _i4 < _number_locations.length; _i4++) {
|
|||
|
var i = _number_locations[_i4];
|
|||
|
|
|||
|
if (chars[i] in number_replace) {
|
|||
|
chars.splice(i, 1, number_replace[chars[i]]);
|
|||
|
}
|
|||
|
} // Extract month and day, and check date validity
|
|||
|
|
|||
|
|
|||
|
var month_replace = {
|
|||
|
A: '01',
|
|||
|
B: '02',
|
|||
|
C: '03',
|
|||
|
D: '04',
|
|||
|
E: '05',
|
|||
|
H: '06',
|
|||
|
L: '07',
|
|||
|
M: '08',
|
|||
|
P: '09',
|
|||
|
R: '10',
|
|||
|
S: '11',
|
|||
|
T: '12'
|
|||
|
};
|
|||
|
var month = month_replace[chars[8]];
|
|||
|
var day = parseInt(chars[9] + chars[10], 10);
|
|||
|
|
|||
|
if (day > 40) {
|
|||
|
day -= 40;
|
|||
|
}
|
|||
|
|
|||
|
if (day < 10) {
|
|||
|
day = "0".concat(day);
|
|||
|
}
|
|||
|
|
|||
|
var date = "".concat(chars[6]).concat(chars[7], "/").concat(month, "/").concat(day);
|
|||
|
|
|||
|
if (!(0, _isDate.default)(date, 'YY/MM/DD')) {
|
|||
|
return false;
|
|||
|
} // Calculate check character by adding up even and odd characters as numbers
|
|||
|
|
|||
|
|
|||
|
var checksum = 0;
|
|||
|
|
|||
|
for (var _i5 = 1; _i5 < chars.length - 1; _i5 += 2) {
|
|||
|
var char_to_int = parseInt(chars[_i5], 10);
|
|||
|
|
|||
|
if (isNaN(char_to_int)) {
|
|||
|
char_to_int = chars[_i5].charCodeAt(0) - 65;
|
|||
|
}
|
|||
|
|
|||
|
checksum += char_to_int;
|
|||
|
}
|
|||
|
|
|||
|
var odd_convert = {
|
|||
|
// Maps of characters at odd places
|
|||
|
A: 1,
|
|||
|
B: 0,
|
|||
|
C: 5,
|
|||
|
D: 7,
|
|||
|
E: 9,
|
|||
|
F: 13,
|
|||
|
G: 15,
|
|||
|
H: 17,
|
|||
|
I: 19,
|
|||
|
J: 21,
|
|||
|
K: 2,
|
|||
|
L: 4,
|
|||
|
M: 18,
|
|||
|
N: 20,
|
|||
|
O: 11,
|
|||
|
P: 3,
|
|||
|
Q: 6,
|
|||
|
R: 8,
|
|||
|
S: 12,
|
|||
|
T: 14,
|
|||
|
U: 16,
|
|||
|
V: 10,
|
|||
|
W: 22,
|
|||
|
X: 25,
|
|||
|
Y: 24,
|
|||
|
Z: 23,
|
|||
|
0: 1,
|
|||
|
1: 0
|
|||
|
};
|
|||
|
|
|||
|
for (var _i6 = 0; _i6 < chars.length - 1; _i6 += 2) {
|
|||
|
var _char_to_int = 0;
|
|||
|
|
|||
|
if (chars[_i6] in odd_convert) {
|
|||
|
_char_to_int = odd_convert[chars[_i6]];
|
|||
|
} else {
|
|||
|
var multiplier = parseInt(chars[_i6], 10);
|
|||
|
_char_to_int = 2 * multiplier + 1;
|
|||
|
|
|||
|
if (multiplier > 4) {
|
|||
|
_char_to_int += 2;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
checksum += _char_to_int;
|
|||
|
}
|
|||
|
|
|||
|
if (String.fromCharCode(65 + checksum % 26) !== chars[15]) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
/*
|
|||
|
* lv-LV validation function
|
|||
|
* (Personas kods (PK), persons only)
|
|||
|
* Check validity of birth date and calculate check (last) digit
|
|||
|
* Support only for old format numbers (not starting with '32', issued before 2017/07/01)
|
|||
|
* Material not in DG TAXUD document sourced from:
|
|||
|
* `https://boot.ritakafija.lv/forums/index.php?/topic/88314-personas-koda-algoritms-%C4%8Deksumma/`
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function lvLvCheck(tin) {
|
|||
|
tin = tin.replace(/\W/, ''); // Extract date from TIN
|
|||
|
|
|||
|
var day = tin.slice(0, 2);
|
|||
|
|
|||
|
if (day !== '32') {
|
|||
|
// No date/checksum check if new format
|
|||
|
var month = tin.slice(2, 4);
|
|||
|
|
|||
|
if (month !== '00') {
|
|||
|
// No date check if unknown month
|
|||
|
var full_year = tin.slice(4, 6);
|
|||
|
|
|||
|
switch (tin[6]) {
|
|||
|
case '0':
|
|||
|
full_year = "18".concat(full_year);
|
|||
|
break;
|
|||
|
|
|||
|
case '1':
|
|||
|
full_year = "19".concat(full_year);
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
full_year = "20".concat(full_year);
|
|||
|
break;
|
|||
|
} // Check date validity
|
|||
|
|
|||
|
|
|||
|
var date = "".concat(full_year, "/").concat(tin.slice(2, 4), "/").concat(day);
|
|||
|
|
|||
|
if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
} // Calculate check digit
|
|||
|
|
|||
|
|
|||
|
var checksum = 1101;
|
|||
|
var multip_lookup = [1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
|
|||
|
|
|||
|
for (var i = 0; i < tin.length - 1; i++) {
|
|||
|
checksum -= parseInt(tin[i], 10) * multip_lookup[i];
|
|||
|
}
|
|||
|
|
|||
|
return parseInt(tin[10], 10) === checksum % 11;
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
/*
|
|||
|
* mt-MT validation function
|
|||
|
* (Identity Card Number or Unique Taxpayer Reference, persons/entities)
|
|||
|
* Verify Identity Card Number structure (no other tests found)
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function mtMtCheck(tin) {
|
|||
|
if (tin.length !== 9) {
|
|||
|
// No tests for UTR
|
|||
|
var chars = tin.toUpperCase().split(''); // Fill with zeros if smaller than proper
|
|||
|
|
|||
|
while (chars.length < 8) {
|
|||
|
chars.unshift(0);
|
|||
|
} // Validate format according to last character
|
|||
|
|
|||
|
|
|||
|
switch (tin[7]) {
|
|||
|
case 'A':
|
|||
|
case 'P':
|
|||
|
if (parseInt(chars[6], 10) === 0) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
{
|
|||
|
var first_part = parseInt(chars.join('').slice(0, 5), 10);
|
|||
|
|
|||
|
if (first_part > 32000) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
var second_part = parseInt(chars.join('').slice(5, 7), 10);
|
|||
|
|
|||
|
if (first_part === second_part) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
/*
|
|||
|
* nl-NL validation function
|
|||
|
* (Burgerservicenummer (BSN) or Rechtspersonen Samenwerkingsverbanden Informatie Nummer (RSIN),
|
|||
|
* persons/entities respectively)
|
|||
|
* Verify TIN validity by calculating check (last) digit (variant of MOD 11)
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function nlNlCheck(tin) {
|
|||
|
return algorithms.reverseMultiplyAndSum(tin.split('').slice(0, 8).map(function (a) {
|
|||
|
return parseInt(a, 10);
|
|||
|
}), 9) % 11 === parseInt(tin[8], 10);
|
|||
|
}
|
|||
|
/*
|
|||
|
* pl-PL validation function
|
|||
|
* (Powszechny Elektroniczny System Ewidencji Ludności (PESEL)
|
|||
|
* or Numer identyfikacji podatkowej (NIP), persons/entities)
|
|||
|
* Verify TIN validity by validating birth date (PESEL) and calculating check (last) digit
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function plPlCheck(tin) {
|
|||
|
// NIP
|
|||
|
if (tin.length === 10) {
|
|||
|
// Calculate last digit by multiplying with lookup
|
|||
|
var lookup = [6, 5, 7, 2, 3, 4, 5, 6, 7];
|
|||
|
var _checksum = 0;
|
|||
|
|
|||
|
for (var i = 0; i < lookup.length; i++) {
|
|||
|
_checksum += parseInt(tin[i], 10) * lookup[i];
|
|||
|
}
|
|||
|
|
|||
|
_checksum %= 11;
|
|||
|
|
|||
|
if (_checksum === 10) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
return _checksum === parseInt(tin[9], 10);
|
|||
|
} // PESEL
|
|||
|
// Extract full year using month
|
|||
|
|
|||
|
|
|||
|
var full_year = tin.slice(0, 2);
|
|||
|
var month = parseInt(tin.slice(2, 4), 10);
|
|||
|
|
|||
|
if (month > 80) {
|
|||
|
full_year = "18".concat(full_year);
|
|||
|
month -= 80;
|
|||
|
} else if (month > 60) {
|
|||
|
full_year = "22".concat(full_year);
|
|||
|
month -= 60;
|
|||
|
} else if (month > 40) {
|
|||
|
full_year = "21".concat(full_year);
|
|||
|
month -= 40;
|
|||
|
} else if (month > 20) {
|
|||
|
full_year = "20".concat(full_year);
|
|||
|
month -= 20;
|
|||
|
} else {
|
|||
|
full_year = "19".concat(full_year);
|
|||
|
} // Add leading zero to month if needed
|
|||
|
|
|||
|
|
|||
|
if (month < 10) {
|
|||
|
month = "0".concat(month);
|
|||
|
} // Check date validity
|
|||
|
|
|||
|
|
|||
|
var date = "".concat(full_year, "/").concat(month, "/").concat(tin.slice(4, 6));
|
|||
|
|
|||
|
if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {
|
|||
|
return false;
|
|||
|
} // Calculate last digit by mulitplying with odd one-digit numbers except 5
|
|||
|
|
|||
|
|
|||
|
var checksum = 0;
|
|||
|
var multiplier = 1;
|
|||
|
|
|||
|
for (var _i7 = 0; _i7 < tin.length - 1; _i7++) {
|
|||
|
checksum += parseInt(tin[_i7], 10) * multiplier % 10;
|
|||
|
multiplier += 2;
|
|||
|
|
|||
|
if (multiplier > 10) {
|
|||
|
multiplier = 1;
|
|||
|
} else if (multiplier === 5) {
|
|||
|
multiplier += 2;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
checksum = 10 - checksum % 10;
|
|||
|
return checksum === parseInt(tin[10], 10);
|
|||
|
}
|
|||
|
/*
|
|||
|
* pt-BR validation function
|
|||
|
* (Cadastro de Pessoas Físicas (CPF, persons)
|
|||
|
* Cadastro Nacional de Pessoas Jurídicas (CNPJ, entities)
|
|||
|
* Both inputs will be validated
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function ptBrCheck(tin) {
|
|||
|
if (tin.length === 11) {
|
|||
|
var _sum;
|
|||
|
|
|||
|
var remainder;
|
|||
|
_sum = 0;
|
|||
|
if ( // Reject known invalid CPFs
|
|||
|
tin === '11111111111' || tin === '22222222222' || tin === '33333333333' || tin === '44444444444' || tin === '55555555555' || tin === '66666666666' || tin === '77777777777' || tin === '88888888888' || tin === '99999999999' || tin === '00000000000') return false;
|
|||
|
|
|||
|
for (var i = 1; i <= 9; i++) {
|
|||
|
_sum += parseInt(tin.substring(i - 1, i), 10) * (11 - i);
|
|||
|
}
|
|||
|
|
|||
|
remainder = _sum * 10 % 11;
|
|||
|
if (remainder === 10) remainder = 0;
|
|||
|
if (remainder !== parseInt(tin.substring(9, 10), 10)) return false;
|
|||
|
_sum = 0;
|
|||
|
|
|||
|
for (var _i8 = 1; _i8 <= 10; _i8++) {
|
|||
|
_sum += parseInt(tin.substring(_i8 - 1, _i8), 10) * (12 - _i8);
|
|||
|
}
|
|||
|
|
|||
|
remainder = _sum * 10 % 11;
|
|||
|
if (remainder === 10) remainder = 0;
|
|||
|
if (remainder !== parseInt(tin.substring(10, 11), 10)) return false;
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
if ( // Reject know invalid CNPJs
|
|||
|
tin === '00000000000000' || tin === '11111111111111' || tin === '22222222222222' || tin === '33333333333333' || tin === '44444444444444' || tin === '55555555555555' || tin === '66666666666666' || tin === '77777777777777' || tin === '88888888888888' || tin === '99999999999999') {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
var length = tin.length - 2;
|
|||
|
var identifiers = tin.substring(0, length);
|
|||
|
var verificators = tin.substring(length);
|
|||
|
var sum = 0;
|
|||
|
var pos = length - 7;
|
|||
|
|
|||
|
for (var _i9 = length; _i9 >= 1; _i9--) {
|
|||
|
sum += identifiers.charAt(length - _i9) * pos;
|
|||
|
pos -= 1;
|
|||
|
|
|||
|
if (pos < 2) {
|
|||
|
pos = 9;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
var result = sum % 11 < 2 ? 0 : 11 - sum % 11;
|
|||
|
|
|||
|
if (result !== parseInt(verificators.charAt(0), 10)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
length += 1;
|
|||
|
identifiers = tin.substring(0, length);
|
|||
|
sum = 0;
|
|||
|
pos = length - 7;
|
|||
|
|
|||
|
for (var _i10 = length; _i10 >= 1; _i10--) {
|
|||
|
sum += identifiers.charAt(length - _i10) * pos;
|
|||
|
pos -= 1;
|
|||
|
|
|||
|
if (pos < 2) {
|
|||
|
pos = 9;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
result = sum % 11 < 2 ? 0 : 11 - sum % 11;
|
|||
|
|
|||
|
if (result !== parseInt(verificators.charAt(1), 10)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
/*
|
|||
|
* pt-PT validation function
|
|||
|
* (Número de identificação fiscal (NIF), persons/entities)
|
|||
|
* Verify TIN validity by calculating check (last) digit (variant of MOD 11)
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function ptPtCheck(tin) {
|
|||
|
var checksum = 11 - algorithms.reverseMultiplyAndSum(tin.split('').slice(0, 8).map(function (a) {
|
|||
|
return parseInt(a, 10);
|
|||
|
}), 9) % 11;
|
|||
|
|
|||
|
if (checksum > 9) {
|
|||
|
return parseInt(tin[8], 10) === 0;
|
|||
|
}
|
|||
|
|
|||
|
return checksum === parseInt(tin[8], 10);
|
|||
|
}
|
|||
|
/*
|
|||
|
* ro-RO validation function
|
|||
|
* (Cod Numeric Personal (CNP) or Cod de înregistrare fiscală (CIF),
|
|||
|
* persons only)
|
|||
|
* Verify CNP validity by calculating check (last) digit (test not found for CIF)
|
|||
|
* Material not in DG TAXUD document sourced from:
|
|||
|
* `https://en.wikipedia.org/wiki/National_identification_number#Romania`
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function roRoCheck(tin) {
|
|||
|
if (tin.slice(0, 4) !== '9000') {
|
|||
|
// No test found for this format
|
|||
|
// Extract full year using century digit if possible
|
|||
|
var full_year = tin.slice(1, 3);
|
|||
|
|
|||
|
switch (tin[0]) {
|
|||
|
case '1':
|
|||
|
case '2':
|
|||
|
full_year = "19".concat(full_year);
|
|||
|
break;
|
|||
|
|
|||
|
case '3':
|
|||
|
case '4':
|
|||
|
full_year = "18".concat(full_year);
|
|||
|
break;
|
|||
|
|
|||
|
case '5':
|
|||
|
case '6':
|
|||
|
full_year = "20".concat(full_year);
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
} // Check date validity
|
|||
|
|
|||
|
|
|||
|
var date = "".concat(full_year, "/").concat(tin.slice(3, 5), "/").concat(tin.slice(5, 7));
|
|||
|
|
|||
|
if (date.length === 8) {
|
|||
|
if (!(0, _isDate.default)(date, 'YY/MM/DD')) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
} else if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {
|
|||
|
return false;
|
|||
|
} // Calculate check digit
|
|||
|
|
|||
|
|
|||
|
var digits = tin.split('').map(function (a) {
|
|||
|
return parseInt(a, 10);
|
|||
|
});
|
|||
|
var multipliers = [2, 7, 9, 1, 4, 6, 3, 5, 8, 2, 7, 9];
|
|||
|
var checksum = 0;
|
|||
|
|
|||
|
for (var i = 0; i < multipliers.length; i++) {
|
|||
|
checksum += digits[i] * multipliers[i];
|
|||
|
}
|
|||
|
|
|||
|
if (checksum % 11 === 10) {
|
|||
|
return digits[12] === 1;
|
|||
|
}
|
|||
|
|
|||
|
return digits[12] === checksum % 11;
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
/*
|
|||
|
* sk-SK validation function
|
|||
|
* (Rodné číslo (RČ) or bezvýznamové identifikačné číslo (BIČ), persons only)
|
|||
|
* Checks validity of pre-1954 birth numbers (rodné číslo) only
|
|||
|
* Due to the introduction of the pseudo-random BIČ it is not possible to test
|
|||
|
* post-1954 birth numbers without knowing whether they are BIČ or RČ beforehand
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function skSkCheck(tin) {
|
|||
|
if (tin.length === 9) {
|
|||
|
tin = tin.replace(/\W/, '');
|
|||
|
|
|||
|
if (tin.slice(6) === '000') {
|
|||
|
return false;
|
|||
|
} // Three-zero serial not assigned before 1954
|
|||
|
// Extract full year from TIN length
|
|||
|
|
|||
|
|
|||
|
var full_year = parseInt(tin.slice(0, 2), 10);
|
|||
|
|
|||
|
if (full_year > 53) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (full_year < 10) {
|
|||
|
full_year = "190".concat(full_year);
|
|||
|
} else {
|
|||
|
full_year = "19".concat(full_year);
|
|||
|
} // Extract month from TIN and normalize
|
|||
|
|
|||
|
|
|||
|
var month = parseInt(tin.slice(2, 4), 10);
|
|||
|
|
|||
|
if (month > 50) {
|
|||
|
month -= 50;
|
|||
|
}
|
|||
|
|
|||
|
if (month < 10) {
|
|||
|
month = "0".concat(month);
|
|||
|
} // Check date validity
|
|||
|
|
|||
|
|
|||
|
var date = "".concat(full_year, "/").concat(month, "/").concat(tin.slice(4, 6));
|
|||
|
|
|||
|
if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
/*
|
|||
|
* sl-SI validation function
|
|||
|
* (Davčna številka, persons/entities)
|
|||
|
* Verify TIN validity by calculating check (last) digit (variant of MOD 11)
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function slSiCheck(tin) {
|
|||
|
var checksum = 11 - algorithms.reverseMultiplyAndSum(tin.split('').slice(0, 7).map(function (a) {
|
|||
|
return parseInt(a, 10);
|
|||
|
}), 8) % 11;
|
|||
|
|
|||
|
if (checksum === 10) {
|
|||
|
return parseInt(tin[7], 10) === 0;
|
|||
|
}
|
|||
|
|
|||
|
return checksum === parseInt(tin[7], 10);
|
|||
|
}
|
|||
|
/*
|
|||
|
* sv-SE validation function
|
|||
|
* (Personnummer or samordningsnummer, persons only)
|
|||
|
* Checks validity of birth date and calls luhnCheck() to validate check (last) digit
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function svSeCheck(tin) {
|
|||
|
// Make copy of TIN and normalize to two-digit year form
|
|||
|
var tin_copy = tin.slice(0);
|
|||
|
|
|||
|
if (tin.length > 11) {
|
|||
|
tin_copy = tin_copy.slice(2);
|
|||
|
} // Extract date of birth
|
|||
|
|
|||
|
|
|||
|
var full_year = '';
|
|||
|
var month = tin_copy.slice(2, 4);
|
|||
|
var day = parseInt(tin_copy.slice(4, 6), 10);
|
|||
|
|
|||
|
if (tin.length > 11) {
|
|||
|
full_year = tin.slice(0, 4);
|
|||
|
} else {
|
|||
|
full_year = tin.slice(0, 2);
|
|||
|
|
|||
|
if (tin.length === 11 && day < 60) {
|
|||
|
// Extract full year from centenarian symbol
|
|||
|
// Should work just fine until year 10000 or so
|
|||
|
var current_year = new Date().getFullYear().toString();
|
|||
|
var current_century = parseInt(current_year.slice(0, 2), 10);
|
|||
|
current_year = parseInt(current_year, 10);
|
|||
|
|
|||
|
if (tin[6] === '-') {
|
|||
|
if (parseInt("".concat(current_century).concat(full_year), 10) > current_year) {
|
|||
|
full_year = "".concat(current_century - 1).concat(full_year);
|
|||
|
} else {
|
|||
|
full_year = "".concat(current_century).concat(full_year);
|
|||
|
}
|
|||
|
} else {
|
|||
|
full_year = "".concat(current_century - 1).concat(full_year);
|
|||
|
|
|||
|
if (current_year - parseInt(full_year, 10) < 100) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
} // Normalize day and check date validity
|
|||
|
|
|||
|
|
|||
|
if (day > 60) {
|
|||
|
day -= 60;
|
|||
|
}
|
|||
|
|
|||
|
if (day < 10) {
|
|||
|
day = "0".concat(day);
|
|||
|
}
|
|||
|
|
|||
|
var date = "".concat(full_year, "/").concat(month, "/").concat(day);
|
|||
|
|
|||
|
if (date.length === 8) {
|
|||
|
if (!(0, _isDate.default)(date, 'YY/MM/DD')) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
} else if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
return algorithms.luhnCheck(tin.replace(/\W/, ''));
|
|||
|
} // Locale lookup objects
|
|||
|
|
|||
|
/*
|
|||
|
* Tax id regex formats for various locales
|
|||
|
*
|
|||
|
* Where not explicitly specified in DG-TAXUD document both
|
|||
|
* uppercase and lowercase letters are acceptable.
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
var taxIdFormat = {
|
|||
|
'bg-BG': /^\d{10}$/,
|
|||
|
'cs-CZ': /^\d{6}\/{0,1}\d{3,4}$/,
|
|||
|
'de-AT': /^\d{9}$/,
|
|||
|
'de-DE': /^[1-9]\d{10}$/,
|
|||
|
'dk-DK': /^\d{6}-{0,1}\d{4}$/,
|
|||
|
'el-CY': /^[09]\d{7}[A-Z]$/,
|
|||
|
'el-GR': /^([0-4]|[7-9])\d{8}$/,
|
|||
|
'en-GB': /^\d{10}$|^(?!GB|NK|TN|ZZ)(?![DFIQUV])[A-Z](?![DFIQUVO])[A-Z]\d{6}[ABCD ]$/i,
|
|||
|
'en-IE': /^\d{7}[A-W][A-IW]{0,1}$/i,
|
|||
|
'en-US': /^\d{2}[- ]{0,1}\d{7}$/,
|
|||
|
'es-ES': /^(\d{0,8}|[XYZKLM]\d{7})[A-HJ-NP-TV-Z]$/i,
|
|||
|
'et-EE': /^[1-6]\d{6}(00[1-9]|0[1-9][0-9]|[1-6][0-9]{2}|70[0-9]|710)\d$/,
|
|||
|
'fi-FI': /^\d{6}[-+A]\d{3}[0-9A-FHJ-NPR-Y]$/i,
|
|||
|
'fr-BE': /^\d{11}$/,
|
|||
|
'fr-FR': /^[0-3]\d{12}$|^[0-3]\d\s\d{2}(\s\d{3}){3}$/,
|
|||
|
// Conforms both to official spec and provided example
|
|||
|
'fr-LU': /^\d{13}$/,
|
|||
|
'hr-HR': /^\d{11}$/,
|
|||
|
'hu-HU': /^8\d{9}$/,
|
|||
|
'it-IT': /^[A-Z]{6}[L-NP-V0-9]{2}[A-EHLMPRST][L-NP-V0-9]{2}[A-ILMZ][L-NP-V0-9]{3}[A-Z]$/i,
|
|||
|
'lv-LV': /^\d{6}-{0,1}\d{5}$/,
|
|||
|
// Conforms both to DG TAXUD spec and original research
|
|||
|
'mt-MT': /^\d{3,7}[APMGLHBZ]$|^([1-8])\1\d{7}$/i,
|
|||
|
'nl-NL': /^\d{9}$/,
|
|||
|
'pl-PL': /^\d{10,11}$/,
|
|||
|
'pt-BR': /(?:^\d{11}$)|(?:^\d{14}$)/,
|
|||
|
'pt-PT': /^\d{9}$/,
|
|||
|
'ro-RO': /^\d{13}$/,
|
|||
|
'sk-SK': /^\d{6}\/{0,1}\d{3,4}$/,
|
|||
|
'sl-SI': /^[1-9]\d{7}$/,
|
|||
|
'sv-SE': /^(\d{6}[-+]{0,1}\d{4}|(18|19|20)\d{6}[-+]{0,1}\d{4})$/
|
|||
|
}; // taxIdFormat locale aliases
|
|||
|
|
|||
|
taxIdFormat['lb-LU'] = taxIdFormat['fr-LU'];
|
|||
|
taxIdFormat['lt-LT'] = taxIdFormat['et-EE'];
|
|||
|
taxIdFormat['nl-BE'] = taxIdFormat['fr-BE']; // Algorithmic tax id check functions for various locales
|
|||
|
|
|||
|
var taxIdCheck = {
|
|||
|
'bg-BG': bgBgCheck,
|
|||
|
'cs-CZ': csCzCheck,
|
|||
|
'de-AT': deAtCheck,
|
|||
|
'de-DE': deDeCheck,
|
|||
|
'dk-DK': dkDkCheck,
|
|||
|
'el-CY': elCyCheck,
|
|||
|
'el-GR': elGrCheck,
|
|||
|
'en-IE': enIeCheck,
|
|||
|
'en-US': enUsCheck,
|
|||
|
'es-ES': esEsCheck,
|
|||
|
'et-EE': etEeCheck,
|
|||
|
'fi-FI': fiFiCheck,
|
|||
|
'fr-BE': frBeCheck,
|
|||
|
'fr-FR': frFrCheck,
|
|||
|
'fr-LU': frLuCheck,
|
|||
|
'hr-HR': hrHrCheck,
|
|||
|
'hu-HU': huHuCheck,
|
|||
|
'it-IT': itItCheck,
|
|||
|
'lv-LV': lvLvCheck,
|
|||
|
'mt-MT': mtMtCheck,
|
|||
|
'nl-NL': nlNlCheck,
|
|||
|
'pl-PL': plPlCheck,
|
|||
|
'pt-BR': ptBrCheck,
|
|||
|
'pt-PT': ptPtCheck,
|
|||
|
'ro-RO': roRoCheck,
|
|||
|
'sk-SK': skSkCheck,
|
|||
|
'sl-SI': slSiCheck,
|
|||
|
'sv-SE': svSeCheck
|
|||
|
}; // taxIdCheck locale aliases
|
|||
|
|
|||
|
taxIdCheck['lb-LU'] = taxIdCheck['fr-LU'];
|
|||
|
taxIdCheck['lt-LT'] = taxIdCheck['et-EE'];
|
|||
|
taxIdCheck['nl-BE'] = taxIdCheck['fr-BE']; // Regexes for locales where characters should be omitted before checking format
|
|||
|
|
|||
|
var allsymbols = /[-\\\/!@#$%\^&\*\(\)\+\=\[\]]+/g;
|
|||
|
var sanitizeRegexes = {
|
|||
|
'de-AT': allsymbols,
|
|||
|
'de-DE': /[\/\\]/g,
|
|||
|
'fr-BE': allsymbols
|
|||
|
}; // sanitizeRegexes locale aliases
|
|||
|
|
|||
|
sanitizeRegexes['nl-BE'] = sanitizeRegexes['fr-BE'];
|
|||
|
/*
|
|||
|
* Validator function
|
|||
|
* Return true if the passed string is a valid tax identification number
|
|||
|
* for the specified locale.
|
|||
|
* Throw an error exception if the locale is not supported.
|
|||
|
*/
|
|||
|
|
|||
|
function isTaxID(str) {
|
|||
|
var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en-US';
|
|||
|
(0, _assertString.default)(str); // Copy TIN to avoid replacement if sanitized
|
|||
|
|
|||
|
var strcopy = str.slice(0);
|
|||
|
|
|||
|
if (locale in taxIdFormat) {
|
|||
|
if (locale in sanitizeRegexes) {
|
|||
|
strcopy = strcopy.replace(sanitizeRegexes[locale], '');
|
|||
|
}
|
|||
|
|
|||
|
if (!taxIdFormat[locale].test(strcopy)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (locale in taxIdCheck) {
|
|||
|
return taxIdCheck[locale](strcopy);
|
|||
|
} // Fallthrough; not all locales have algorithmic checks
|
|||
|
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
throw new Error("Invalid locale '".concat(locale, "'"));
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./isDate":25,"./util/algorithms":98,"./util/assertString":99}],81:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isURL;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
var _isFQDN = _interopRequireDefault(require("./isFQDN"));
|
|||
|
|
|||
|
var _isIP = _interopRequireDefault(require("./isIP"));
|
|||
|
|
|||
|
var _merge = _interopRequireDefault(require("./util/merge"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|||
|
|
|||
|
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|||
|
|
|||
|
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|||
|
|
|||
|
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|||
|
|
|||
|
function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|||
|
|
|||
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|||
|
|
|||
|
/*
|
|||
|
options for isURL method
|
|||
|
|
|||
|
require_protocol - if set as true isURL will return false if protocol is not present in the URL
|
|||
|
require_valid_protocol - isURL will check if the URL's protocol is present in the protocols option
|
|||
|
protocols - valid protocols can be modified with this option
|
|||
|
require_host - if set as false isURL will not check if host is present in the URL
|
|||
|
require_port - if set as true isURL will check if port is present in the URL
|
|||
|
allow_protocol_relative_urls - if set as true protocol relative URLs will be allowed
|
|||
|
validate_length - if set as false isURL will skip string length validation (IE maximum is 2083)
|
|||
|
|
|||
|
*/
|
|||
|
var default_url_options = {
|
|||
|
protocols: ['http', 'https', 'ftp'],
|
|||
|
require_tld: true,
|
|||
|
require_protocol: false,
|
|||
|
require_host: true,
|
|||
|
require_port: false,
|
|||
|
require_valid_protocol: true,
|
|||
|
allow_underscores: false,
|
|||
|
allow_trailing_dot: false,
|
|||
|
allow_protocol_relative_urls: false,
|
|||
|
allow_fragments: true,
|
|||
|
allow_query_components: true,
|
|||
|
validate_length: true
|
|||
|
};
|
|||
|
var wrapped_ipv6 = /^\[([^\]]+)\](?::([0-9]+))?$/;
|
|||
|
|
|||
|
function isRegExp(obj) {
|
|||
|
return Object.prototype.toString.call(obj) === '[object RegExp]';
|
|||
|
}
|
|||
|
|
|||
|
function checkHost(host, matches) {
|
|||
|
for (var i = 0; i < matches.length; i++) {
|
|||
|
var match = matches[i];
|
|||
|
|
|||
|
if (host === match || isRegExp(match) && match.test(host)) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
function isURL(url, options) {
|
|||
|
(0, _assertString.default)(url);
|
|||
|
|
|||
|
if (!url || /[\s<>]/.test(url)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (url.indexOf('mailto:') === 0) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
options = (0, _merge.default)(options, default_url_options);
|
|||
|
|
|||
|
if (options.validate_length && url.length >= 2083) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (!options.allow_fragments && url.includes('#')) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (!options.allow_query_components && (url.includes('?') || url.includes('&'))) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
var protocol, auth, host, hostname, port, port_str, split, ipv6;
|
|||
|
split = url.split('#');
|
|||
|
url = split.shift();
|
|||
|
split = url.split('?');
|
|||
|
url = split.shift();
|
|||
|
split = url.split('://');
|
|||
|
|
|||
|
if (split.length > 1) {
|
|||
|
protocol = split.shift().toLowerCase();
|
|||
|
|
|||
|
if (options.require_valid_protocol && options.protocols.indexOf(protocol) === -1) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
} else if (options.require_protocol) {
|
|||
|
return false;
|
|||
|
} else if (url.substr(0, 2) === '//') {
|
|||
|
if (!options.allow_protocol_relative_urls) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
split[0] = url.substr(2);
|
|||
|
}
|
|||
|
|
|||
|
url = split.join('://');
|
|||
|
|
|||
|
if (url === '') {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
split = url.split('/');
|
|||
|
url = split.shift();
|
|||
|
|
|||
|
if (url === '' && !options.require_host) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
split = url.split('@');
|
|||
|
|
|||
|
if (split.length > 1) {
|
|||
|
if (options.disallow_auth) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (split[0] === '') {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
auth = split.shift();
|
|||
|
|
|||
|
if (auth.indexOf(':') >= 0 && auth.split(':').length > 2) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
var _auth$split = auth.split(':'),
|
|||
|
_auth$split2 = _slicedToArray(_auth$split, 2),
|
|||
|
user = _auth$split2[0],
|
|||
|
password = _auth$split2[1];
|
|||
|
|
|||
|
if (user === '' && password === '') {
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
hostname = split.join('@');
|
|||
|
port_str = null;
|
|||
|
ipv6 = null;
|
|||
|
var ipv6_match = hostname.match(wrapped_ipv6);
|
|||
|
|
|||
|
if (ipv6_match) {
|
|||
|
host = '';
|
|||
|
ipv6 = ipv6_match[1];
|
|||
|
port_str = ipv6_match[2] || null;
|
|||
|
} else {
|
|||
|
split = hostname.split(':');
|
|||
|
host = split.shift();
|
|||
|
|
|||
|
if (split.length) {
|
|||
|
port_str = split.join(':');
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (port_str !== null && port_str.length > 0) {
|
|||
|
port = parseInt(port_str, 10);
|
|||
|
|
|||
|
if (!/^[0-9]+$/.test(port_str) || port <= 0 || port > 65535) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
} else if (options.require_port) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (options.host_whitelist) {
|
|||
|
return checkHost(host, options.host_whitelist);
|
|||
|
}
|
|||
|
|
|||
|
if (!(0, _isIP.default)(host) && !(0, _isFQDN.default)(host, options) && (!ipv6 || !(0, _isIP.default)(ipv6, 6))) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
host = host || ipv6;
|
|||
|
|
|||
|
if (options.host_blacklist && checkHost(host, options.host_blacklist)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./isFQDN":32,"./isIP":42,"./util/assertString":99,"./util/merge":101}],82:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isUUID;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var uuid = {
|
|||
|
1: /^[0-9A-F]{8}-[0-9A-F]{4}-1[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,
|
|||
|
2: /^[0-9A-F]{8}-[0-9A-F]{4}-2[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,
|
|||
|
3: /^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,
|
|||
|
4: /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,
|
|||
|
5: /^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,
|
|||
|
all: /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i
|
|||
|
};
|
|||
|
|
|||
|
function isUUID(str, version) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
var pattern = uuid[![undefined, null].includes(version) ? version : 'all'];
|
|||
|
return !!pattern && pattern.test(str);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],83:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isUppercase;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function isUppercase(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return str === str.toUpperCase();
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],84:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isVAT;
|
|||
|
exports.vatMatchers = void 0;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var vatMatchers = {
|
|||
|
GB: /^GB((\d{3} \d{4} ([0-8][0-9]|9[0-6]))|(\d{9} \d{3})|(((GD[0-4])|(HA[5-9]))[0-9]{2}))$/,
|
|||
|
IT: /^(IT)?[0-9]{11}$/,
|
|||
|
NL: /^(NL)?[0-9]{9}B[0-9]{2}$/
|
|||
|
};
|
|||
|
exports.vatMatchers = vatMatchers;
|
|||
|
|
|||
|
function isVAT(str, countryCode) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
(0, _assertString.default)(countryCode);
|
|||
|
|
|||
|
if (countryCode in vatMatchers) {
|
|||
|
return vatMatchers[countryCode].test(str);
|
|||
|
}
|
|||
|
|
|||
|
throw new Error("Invalid country code: '".concat(countryCode, "'"));
|
|||
|
}
|
|||
|
},{"./util/assertString":99}],85:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isVariableWidth;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
var _isFullWidth = require("./isFullWidth");
|
|||
|
|
|||
|
var _isHalfWidth = require("./isHalfWidth");
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function isVariableWidth(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return _isFullWidth.fullWidth.test(str) && _isHalfWidth.halfWidth.test(str);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./isFullWidth":34,"./isHalfWidth":36,"./util/assertString":99}],86:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = isWhitelisted;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function isWhitelisted(str, chars) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
|
|||
|
for (var i = str.length - 1; i >= 0; i--) {
|
|||
|
if (chars.indexOf(str[i]) === -1) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],87:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = ltrim;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function ltrim(str, chars) {
|
|||
|
(0, _assertString.default)(str); // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping
|
|||
|
|
|||
|
var pattern = chars ? new RegExp("^[".concat(chars.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), "]+"), 'g') : /^\s+/g;
|
|||
|
return str.replace(pattern, '');
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],88:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = matches;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function matches(str, pattern, modifiers) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
|
|||
|
if (Object.prototype.toString.call(pattern) !== '[object RegExp]') {
|
|||
|
pattern = new RegExp(pattern, modifiers);
|
|||
|
}
|
|||
|
|
|||
|
return pattern.test(str);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],89:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = normalizeEmail;
|
|||
|
|
|||
|
var _merge = _interopRequireDefault(require("./util/merge"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
var default_normalize_email_options = {
|
|||
|
// The following options apply to all email addresses
|
|||
|
// Lowercases the local part of the email address.
|
|||
|
// Please note this may violate RFC 5321 as per http://stackoverflow.com/a/9808332/192024).
|
|||
|
// The domain is always lowercased, as per RFC 1035
|
|||
|
all_lowercase: true,
|
|||
|
// The following conversions are specific to GMail
|
|||
|
// Lowercases the local part of the GMail address (known to be case-insensitive)
|
|||
|
gmail_lowercase: true,
|
|||
|
// Removes dots from the local part of the email address, as that's ignored by GMail
|
|||
|
gmail_remove_dots: true,
|
|||
|
// Removes the subaddress (e.g. "+foo") from the email address
|
|||
|
gmail_remove_subaddress: true,
|
|||
|
// Conversts the googlemail.com domain to gmail.com
|
|||
|
gmail_convert_googlemaildotcom: true,
|
|||
|
// The following conversions are specific to Outlook.com / Windows Live / Hotmail
|
|||
|
// Lowercases the local part of the Outlook.com address (known to be case-insensitive)
|
|||
|
outlookdotcom_lowercase: true,
|
|||
|
// Removes the subaddress (e.g. "+foo") from the email address
|
|||
|
outlookdotcom_remove_subaddress: true,
|
|||
|
// The following conversions are specific to Yahoo
|
|||
|
// Lowercases the local part of the Yahoo address (known to be case-insensitive)
|
|||
|
yahoo_lowercase: true,
|
|||
|
// Removes the subaddress (e.g. "-foo") from the email address
|
|||
|
yahoo_remove_subaddress: true,
|
|||
|
// The following conversions are specific to Yandex
|
|||
|
// Lowercases the local part of the Yandex address (known to be case-insensitive)
|
|||
|
yandex_lowercase: true,
|
|||
|
// The following conversions are specific to iCloud
|
|||
|
// Lowercases the local part of the iCloud address (known to be case-insensitive)
|
|||
|
icloud_lowercase: true,
|
|||
|
// Removes the subaddress (e.g. "+foo") from the email address
|
|||
|
icloud_remove_subaddress: true
|
|||
|
}; // List of domains used by iCloud
|
|||
|
|
|||
|
var icloud_domains = ['icloud.com', 'me.com']; // List of domains used by Outlook.com and its predecessors
|
|||
|
// This list is likely incomplete.
|
|||
|
// Partial reference:
|
|||
|
// https://blogs.office.com/2013/04/17/outlook-com-gets-two-step-verification-sign-in-by-alias-and-new-international-domains/
|
|||
|
|
|||
|
var outlookdotcom_domains = ['hotmail.at', 'hotmail.be', 'hotmail.ca', 'hotmail.cl', 'hotmail.co.il', 'hotmail.co.nz', 'hotmail.co.th', 'hotmail.co.uk', 'hotmail.com', 'hotmail.com.ar', 'hotmail.com.au', 'hotmail.com.br', 'hotmail.com.gr', 'hotmail.com.mx', 'hotmail.com.pe', 'hotmail.com.tr', 'hotmail.com.vn', 'hotmail.cz', 'hotmail.de', 'hotmail.dk', 'hotmail.es', 'hotmail.fr', 'hotmail.hu', 'hotmail.id', 'hotmail.ie', 'hotmail.in', 'hotmail.it', 'hotmail.jp', 'hotmail.kr', 'hotmail.lv', 'hotmail.my', 'hotmail.ph', 'hotmail.pt', 'hotmail.sa', 'hotmail.sg', 'hotmail.sk', 'live.be', 'live.co.uk', 'live.com', 'live.com.ar', 'live.com.mx', 'live.de', 'live.es', 'live.eu', 'live.fr', 'live.it', 'live.nl', 'msn.com', 'outlook.at', 'outlook.be', 'outlook.cl', 'outlook.co.il', 'outlook.co.nz', 'outlook.co.th', 'outlook.com', 'outlook.com.ar', 'outlook.com.au', 'outlook.com.br', 'outlook.com.gr', 'outlook.com.pe', 'outlook.com.tr', 'outlook.com.vn', 'outlook.cz', 'outlook.de', 'outlook.dk', 'outlook.es', 'outlook.fr', 'outlook.hu', 'outlook.id', 'outlook.ie', 'outlook.in', 'outlook.it', 'outlook.jp', 'outlook.kr', 'outlook.lv', 'outlook.my', 'outlook.ph', 'outlook.pt', 'outlook.sa', 'outlook.sg', 'outlook.sk', 'passport.com']; // List of domains used by Yahoo Mail
|
|||
|
// This list is likely incomplete
|
|||
|
|
|||
|
var yahoo_domains = ['rocketmail.com', 'yahoo.ca', 'yahoo.co.uk', 'yahoo.com', 'yahoo.de', 'yahoo.fr', 'yahoo.in', 'yahoo.it', 'ymail.com']; // List of domains used by yandex.ru
|
|||
|
|
|||
|
var yandex_domains = ['yandex.ru', 'yandex.ua', 'yandex.kz', 'yandex.com', 'yandex.by', 'ya.ru']; // replace single dots, but not multiple consecutive dots
|
|||
|
|
|||
|
function dotsReplacer(match) {
|
|||
|
if (match.length > 1) {
|
|||
|
return match;
|
|||
|
}
|
|||
|
|
|||
|
return '';
|
|||
|
}
|
|||
|
|
|||
|
function normalizeEmail(email, options) {
|
|||
|
options = (0, _merge.default)(options, default_normalize_email_options);
|
|||
|
var raw_parts = email.split('@');
|
|||
|
var domain = raw_parts.pop();
|
|||
|
var user = raw_parts.join('@');
|
|||
|
var parts = [user, domain]; // The domain is always lowercased, as it's case-insensitive per RFC 1035
|
|||
|
|
|||
|
parts[1] = parts[1].toLowerCase();
|
|||
|
|
|||
|
if (parts[1] === 'gmail.com' || parts[1] === 'googlemail.com') {
|
|||
|
// Address is GMail
|
|||
|
if (options.gmail_remove_subaddress) {
|
|||
|
parts[0] = parts[0].split('+')[0];
|
|||
|
}
|
|||
|
|
|||
|
if (options.gmail_remove_dots) {
|
|||
|
// this does not replace consecutive dots like example..email@gmail.com
|
|||
|
parts[0] = parts[0].replace(/\.+/g, dotsReplacer);
|
|||
|
}
|
|||
|
|
|||
|
if (!parts[0].length) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (options.all_lowercase || options.gmail_lowercase) {
|
|||
|
parts[0] = parts[0].toLowerCase();
|
|||
|
}
|
|||
|
|
|||
|
parts[1] = options.gmail_convert_googlemaildotcom ? 'gmail.com' : parts[1];
|
|||
|
} else if (icloud_domains.indexOf(parts[1]) >= 0) {
|
|||
|
// Address is iCloud
|
|||
|
if (options.icloud_remove_subaddress) {
|
|||
|
parts[0] = parts[0].split('+')[0];
|
|||
|
}
|
|||
|
|
|||
|
if (!parts[0].length) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (options.all_lowercase || options.icloud_lowercase) {
|
|||
|
parts[0] = parts[0].toLowerCase();
|
|||
|
}
|
|||
|
} else if (outlookdotcom_domains.indexOf(parts[1]) >= 0) {
|
|||
|
// Address is Outlook.com
|
|||
|
if (options.outlookdotcom_remove_subaddress) {
|
|||
|
parts[0] = parts[0].split('+')[0];
|
|||
|
}
|
|||
|
|
|||
|
if (!parts[0].length) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (options.all_lowercase || options.outlookdotcom_lowercase) {
|
|||
|
parts[0] = parts[0].toLowerCase();
|
|||
|
}
|
|||
|
} else if (yahoo_domains.indexOf(parts[1]) >= 0) {
|
|||
|
// Address is Yahoo
|
|||
|
if (options.yahoo_remove_subaddress) {
|
|||
|
var components = parts[0].split('-');
|
|||
|
parts[0] = components.length > 1 ? components.slice(0, -1).join('-') : components[0];
|
|||
|
}
|
|||
|
|
|||
|
if (!parts[0].length) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (options.all_lowercase || options.yahoo_lowercase) {
|
|||
|
parts[0] = parts[0].toLowerCase();
|
|||
|
}
|
|||
|
} else if (yandex_domains.indexOf(parts[1]) >= 0) {
|
|||
|
if (options.all_lowercase || options.yandex_lowercase) {
|
|||
|
parts[0] = parts[0].toLowerCase();
|
|||
|
}
|
|||
|
|
|||
|
parts[1] = 'yandex.ru'; // all yandex domains are equal, 1st preferred
|
|||
|
} else if (options.all_lowercase) {
|
|||
|
// Any other address
|
|||
|
parts[0] = parts[0].toLowerCase();
|
|||
|
}
|
|||
|
|
|||
|
return parts.join('@');
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/merge":101}],90:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = rtrim;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function rtrim(str, chars) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
|
|||
|
if (chars) {
|
|||
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping
|
|||
|
var pattern = new RegExp("[".concat(chars.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), "]+$"), 'g');
|
|||
|
return str.replace(pattern, '');
|
|||
|
} // Use a faster and more safe than regex trim method https://blog.stevenlevithan.com/archives/faster-trim-javascript
|
|||
|
|
|||
|
|
|||
|
var strIndex = str.length - 1;
|
|||
|
|
|||
|
while (/\s/.test(str.charAt(strIndex))) {
|
|||
|
strIndex -= 1;
|
|||
|
}
|
|||
|
|
|||
|
return str.slice(0, strIndex + 1);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],91:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = stripLow;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
var _blacklist = _interopRequireDefault(require("./blacklist"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function stripLow(str, keep_new_lines) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
var chars = keep_new_lines ? '\\x00-\\x09\\x0B\\x0C\\x0E-\\x1F\\x7F' : '\\x00-\\x1F\\x7F';
|
|||
|
return (0, _blacklist.default)(str, chars);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./blacklist":6,"./util/assertString":99}],92:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = toBoolean;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function toBoolean(str, strict) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
|
|||
|
if (strict) {
|
|||
|
return str === '1' || /^true$/i.test(str);
|
|||
|
}
|
|||
|
|
|||
|
return str !== '0' && !/^false$/i.test(str) && str !== '';
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],93:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = toDate;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function toDate(date) {
|
|||
|
(0, _assertString.default)(date);
|
|||
|
date = Date.parse(date);
|
|||
|
return !isNaN(date) ? new Date(date) : null;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],94:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = toFloat;
|
|||
|
|
|||
|
var _isFloat = _interopRequireDefault(require("./isFloat"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function toFloat(str) {
|
|||
|
if (!(0, _isFloat.default)(str)) return NaN;
|
|||
|
return parseFloat(str);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./isFloat":33}],95:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = toInt;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function toInt(str, radix) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return parseInt(str, radix || 10);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],96:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = trim;
|
|||
|
|
|||
|
var _rtrim = _interopRequireDefault(require("./rtrim"));
|
|||
|
|
|||
|
var _ltrim = _interopRequireDefault(require("./ltrim"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function trim(str, chars) {
|
|||
|
return (0, _rtrim.default)((0, _ltrim.default)(str, chars), chars);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./ltrim":87,"./rtrim":90}],97:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = unescape;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function unescape(str) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return str.replace(/"/g, '"').replace(/'/g, "'").replace(/</g, '<').replace(/>/g, '>').replace(///g, '/').replace(/\/g, '\\').replace(/`/g, '`').replace(/&/g, '&'); // & replacement has to be the last one to prevent
|
|||
|
// bugs with intermediate strings containing escape sequences
|
|||
|
// See: https://github.com/validatorjs/validator.js/issues/1827
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],98:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.iso7064Check = iso7064Check;
|
|||
|
exports.luhnCheck = luhnCheck;
|
|||
|
exports.reverseMultiplyAndSum = reverseMultiplyAndSum;
|
|||
|
exports.verhoeffCheck = verhoeffCheck;
|
|||
|
|
|||
|
/**
|
|||
|
* Algorithmic validation functions
|
|||
|
* May be used as is or implemented in the workflow of other validators.
|
|||
|
*/
|
|||
|
|
|||
|
/*
|
|||
|
* ISO 7064 validation function
|
|||
|
* Called with a string of numbers (incl. check digit)
|
|||
|
* to validate according to ISO 7064 (MOD 11, 10).
|
|||
|
*/
|
|||
|
function iso7064Check(str) {
|
|||
|
var checkvalue = 10;
|
|||
|
|
|||
|
for (var i = 0; i < str.length - 1; i++) {
|
|||
|
checkvalue = (parseInt(str[i], 10) + checkvalue) % 10 === 0 ? 10 * 2 % 11 : (parseInt(str[i], 10) + checkvalue) % 10 * 2 % 11;
|
|||
|
}
|
|||
|
|
|||
|
checkvalue = checkvalue === 1 ? 0 : 11 - checkvalue;
|
|||
|
return checkvalue === parseInt(str[10], 10);
|
|||
|
}
|
|||
|
/*
|
|||
|
* Luhn (mod 10) validation function
|
|||
|
* Called with a string of numbers (incl. check digit)
|
|||
|
* to validate according to the Luhn algorithm.
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function luhnCheck(str) {
|
|||
|
var checksum = 0;
|
|||
|
var second = false;
|
|||
|
|
|||
|
for (var i = str.length - 1; i >= 0; i--) {
|
|||
|
if (second) {
|
|||
|
var product = parseInt(str[i], 10) * 2;
|
|||
|
|
|||
|
if (product > 9) {
|
|||
|
// sum digits of product and add to checksum
|
|||
|
checksum += product.toString().split('').map(function (a) {
|
|||
|
return parseInt(a, 10);
|
|||
|
}).reduce(function (a, b) {
|
|||
|
return a + b;
|
|||
|
}, 0);
|
|||
|
} else {
|
|||
|
checksum += product;
|
|||
|
}
|
|||
|
} else {
|
|||
|
checksum += parseInt(str[i], 10);
|
|||
|
}
|
|||
|
|
|||
|
second = !second;
|
|||
|
}
|
|||
|
|
|||
|
return checksum % 10 === 0;
|
|||
|
}
|
|||
|
/*
|
|||
|
* Reverse TIN multiplication and summation helper function
|
|||
|
* Called with an array of single-digit integers and a base multiplier
|
|||
|
* to calculate the sum of the digits multiplied in reverse.
|
|||
|
* Normally used in variations of MOD 11 algorithmic checks.
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function reverseMultiplyAndSum(digits, base) {
|
|||
|
var total = 0;
|
|||
|
|
|||
|
for (var i = 0; i < digits.length; i++) {
|
|||
|
total += digits[i] * (base - i);
|
|||
|
}
|
|||
|
|
|||
|
return total;
|
|||
|
}
|
|||
|
/*
|
|||
|
* Verhoeff validation helper function
|
|||
|
* Called with a string of numbers
|
|||
|
* to validate according to the Verhoeff algorithm.
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
function verhoeffCheck(str) {
|
|||
|
var d_table = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 0, 6, 7, 8, 9, 5], [2, 3, 4, 0, 1, 7, 8, 9, 5, 6], [3, 4, 0, 1, 2, 8, 9, 5, 6, 7], [4, 0, 1, 2, 3, 9, 5, 6, 7, 8], [5, 9, 8, 7, 6, 0, 4, 3, 2, 1], [6, 5, 9, 8, 7, 1, 0, 4, 3, 2], [7, 6, 5, 9, 8, 2, 1, 0, 4, 3], [8, 7, 6, 5, 9, 3, 2, 1, 0, 4], [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]];
|
|||
|
var p_table = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 5, 7, 6, 2, 8, 3, 0, 9, 4], [5, 8, 0, 3, 7, 9, 6, 1, 4, 2], [8, 9, 1, 6, 0, 4, 3, 5, 2, 7], [9, 4, 5, 3, 1, 2, 6, 8, 7, 0], [4, 2, 8, 6, 5, 7, 3, 9, 0, 1], [2, 7, 9, 3, 8, 0, 6, 4, 1, 5], [7, 0, 4, 6, 9, 1, 3, 2, 5, 8]]; // Copy (to prevent replacement) and reverse
|
|||
|
|
|||
|
var str_copy = str.split('').reverse().join('');
|
|||
|
var checksum = 0;
|
|||
|
|
|||
|
for (var i = 0; i < str_copy.length; i++) {
|
|||
|
checksum = d_table[checksum][p_table[i % 8][parseInt(str_copy[i], 10)]];
|
|||
|
}
|
|||
|
|
|||
|
return checksum === 0;
|
|||
|
}
|
|||
|
},{}],99:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = assertString;
|
|||
|
|
|||
|
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|||
|
|
|||
|
function assertString(input) {
|
|||
|
var isString = typeof input === 'string' || input instanceof String;
|
|||
|
|
|||
|
if (!isString) {
|
|||
|
var invalidType = _typeof(input);
|
|||
|
|
|||
|
if (input === null) invalidType = 'null';else if (invalidType === 'object') invalidType = input.constructor.name;
|
|||
|
throw new TypeError("Expected a string but received a ".concat(invalidType));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{}],100:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = void 0;
|
|||
|
|
|||
|
var includes = function includes(arr, val) {
|
|||
|
return arr.some(function (arrVal) {
|
|||
|
return val === arrVal;
|
|||
|
});
|
|||
|
};
|
|||
|
|
|||
|
var _default = includes;
|
|||
|
exports.default = _default;
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{}],101:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = merge;
|
|||
|
|
|||
|
function merge() {
|
|||
|
var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|||
|
var defaults = arguments.length > 1 ? arguments[1] : undefined;
|
|||
|
|
|||
|
for (var key in defaults) {
|
|||
|
if (typeof obj[key] === 'undefined') {
|
|||
|
obj[key] = defaults[key];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return obj;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{}],102:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = multilineRegexp;
|
|||
|
|
|||
|
/**
|
|||
|
* Build RegExp object from an array
|
|||
|
* of multiple/multi-line regexp parts
|
|||
|
*
|
|||
|
* @param {string[]} parts
|
|||
|
* @param {string} flags
|
|||
|
* @return {object} - RegExp object
|
|||
|
*/
|
|||
|
function multilineRegexp(parts, flags) {
|
|||
|
var regexpAsStringLiteral = parts.join('');
|
|||
|
return new RegExp(regexpAsStringLiteral, flags);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{}],103:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = toString;
|
|||
|
|
|||
|
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|||
|
|
|||
|
function toString(input) {
|
|||
|
if (_typeof(input) === 'object' && input !== null) {
|
|||
|
if (typeof input.toString === 'function') {
|
|||
|
input = input.toString();
|
|||
|
} else {
|
|||
|
input = '[object Object]';
|
|||
|
}
|
|||
|
} else if (input === null || typeof input === 'undefined' || isNaN(input) && !input.length) {
|
|||
|
input = '';
|
|||
|
}
|
|||
|
|
|||
|
return String(input);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{}],104:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports.default = whitelist;
|
|||
|
|
|||
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|||
|
|
|||
|
function whitelist(str, chars) {
|
|||
|
(0, _assertString.default)(str);
|
|||
|
return str.replace(new RegExp("[^".concat(chars, "]+"), 'g'), '');
|
|||
|
}
|
|||
|
|
|||
|
module.exports = exports.default;
|
|||
|
module.exports.default = exports.default;
|
|||
|
},{"./util/assertString":99}],105:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
module.exports = {
|
|||
|
|
|||
|
INVALID_TYPE: "Expected type {0} but found type {1}",
|
|||
|
INVALID_FORMAT: "Object didn't pass validation for format {0}: {1}",
|
|||
|
ENUM_MISMATCH: "No enum match for: {0}",
|
|||
|
ENUM_CASE_MISMATCH: "Enum does not match case for: {0}",
|
|||
|
ANY_OF_MISSING: "Data does not match any schemas from 'anyOf'",
|
|||
|
ONE_OF_MISSING: "Data does not match any schemas from 'oneOf'",
|
|||
|
ONE_OF_MULTIPLE: "Data is valid against more than one schema from 'oneOf'",
|
|||
|
NOT_PASSED: "Data matches schema from 'not'",
|
|||
|
|
|||
|
// Array errors
|
|||
|
ARRAY_LENGTH_SHORT: "Array is too short ({0}), minimum {1}",
|
|||
|
ARRAY_LENGTH_LONG: "Array is too long ({0}), maximum {1}",
|
|||
|
ARRAY_UNIQUE: "Array items are not unique (indexes {0} and {1})",
|
|||
|
ARRAY_ADDITIONAL_ITEMS: "Additional items not allowed",
|
|||
|
|
|||
|
// Numeric errors
|
|||
|
MULTIPLE_OF: "Value {0} is not a multiple of {1}",
|
|||
|
MINIMUM: "Value {0} is less than minimum {1}",
|
|||
|
MINIMUM_EXCLUSIVE: "Value {0} is equal or less than exclusive minimum {1}",
|
|||
|
MAXIMUM: "Value {0} is greater than maximum {1}",
|
|||
|
MAXIMUM_EXCLUSIVE: "Value {0} is equal or greater than exclusive maximum {1}",
|
|||
|
|
|||
|
// Object errors
|
|||
|
OBJECT_PROPERTIES_MINIMUM: "Too few properties defined ({0}), minimum {1}",
|
|||
|
OBJECT_PROPERTIES_MAXIMUM: "Too many properties defined ({0}), maximum {1}",
|
|||
|
OBJECT_MISSING_REQUIRED_PROPERTY: "Missing required property: {0}",
|
|||
|
OBJECT_ADDITIONAL_PROPERTIES: "Additional properties not allowed: {0}",
|
|||
|
OBJECT_DEPENDENCY_KEY: "Dependency failed - key must exist: {0} (due to key: {1})",
|
|||
|
|
|||
|
// String errors
|
|||
|
MIN_LENGTH: "String is too short ({0} chars), minimum {1}",
|
|||
|
MAX_LENGTH: "String is too long ({0} chars), maximum {1}",
|
|||
|
PATTERN: "String does not match pattern {0}: {1}",
|
|||
|
|
|||
|
// Schema validation errors
|
|||
|
KEYWORD_TYPE_EXPECTED: "Keyword '{0}' is expected to be of type '{1}'",
|
|||
|
KEYWORD_UNDEFINED_STRICT: "Keyword '{0}' must be defined in strict mode",
|
|||
|
KEYWORD_UNEXPECTED: "Keyword '{0}' is not expected to appear in the schema",
|
|||
|
KEYWORD_MUST_BE: "Keyword '{0}' must be {1}",
|
|||
|
KEYWORD_DEPENDENCY: "Keyword '{0}' requires keyword '{1}'",
|
|||
|
KEYWORD_PATTERN: "Keyword '{0}' is not a valid RegExp pattern: {1}",
|
|||
|
KEYWORD_VALUE_TYPE: "Each element of keyword '{0}' array must be a '{1}'",
|
|||
|
UNKNOWN_FORMAT: "There is no validation function for format '{0}'",
|
|||
|
CUSTOM_MODE_FORCE_PROPERTIES: "{0} must define at least one property if present",
|
|||
|
|
|||
|
// Remote errors
|
|||
|
REF_UNRESOLVED: "Reference has not been resolved during compilation: {0}",
|
|||
|
UNRESOLVABLE_REFERENCE: "Reference could not be resolved: {0}",
|
|||
|
SCHEMA_NOT_REACHABLE: "Validator was not able to read schema with uri: {0}",
|
|||
|
SCHEMA_TYPE_EXPECTED: "Schema is expected to be of type 'object'",
|
|||
|
SCHEMA_NOT_AN_OBJECT: "Schema is not an object: {0}",
|
|||
|
ASYNC_TIMEOUT: "{0} asynchronous task(s) have timed out after {1} ms",
|
|||
|
PARENT_SCHEMA_VALIDATION_FAILED: "Schema failed to validate against its parent schema, see inner errors for details.",
|
|||
|
REMOTE_NOT_VALID: "Remote reference didn't compile successfully: {0}"
|
|||
|
|
|||
|
};
|
|||
|
|
|||
|
},{}],106:[function(require,module,exports){
|
|||
|
/*jshint maxlen: false*/
|
|||
|
|
|||
|
var validator = require("validator");
|
|||
|
|
|||
|
var FormatValidators = {
|
|||
|
"date": function (date) {
|
|||
|
if (typeof date !== "string") {
|
|||
|
return true;
|
|||
|
}
|
|||
|
// full-date from http://tools.ietf.org/html/rfc3339#section-5.6
|
|||
|
var matches = /^([0-9]{4})-([0-9]{2})-([0-9]{2})$/.exec(date);
|
|||
|
if (matches === null) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
// var year = matches[1];
|
|||
|
// var month = matches[2];
|
|||
|
// var day = matches[3];
|
|||
|
if (matches[2] < "01" || matches[2] > "12" || matches[3] < "01" || matches[3] > "31") {
|
|||
|
return false;
|
|||
|
}
|
|||
|
return true;
|
|||
|
},
|
|||
|
"date-time": function (dateTime) {
|
|||
|
if (typeof dateTime !== "string") {
|
|||
|
return true;
|
|||
|
}
|
|||
|
// date-time from http://tools.ietf.org/html/rfc3339#section-5.6
|
|||
|
var s = dateTime.toLowerCase().split("t");
|
|||
|
if (!FormatValidators.date(s[0])) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
var matches = /^([0-9]{2}):([0-9]{2}):([0-9]{2})(.[0-9]+)?(z|([+-][0-9]{2}:[0-9]{2}))$/.exec(s[1]);
|
|||
|
if (matches === null) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
// var hour = matches[1];
|
|||
|
// var minute = matches[2];
|
|||
|
// var second = matches[3];
|
|||
|
// var fraction = matches[4];
|
|||
|
// var timezone = matches[5];
|
|||
|
if (matches[1] > "23" || matches[2] > "59" || matches[3] > "59") {
|
|||
|
return false;
|
|||
|
}
|
|||
|
return true;
|
|||
|
},
|
|||
|
"email": function (email) {
|
|||
|
if (typeof email !== "string") {
|
|||
|
return true;
|
|||
|
}
|
|||
|
return validator.isEmail(email, { "require_tld": true });
|
|||
|
},
|
|||
|
"hostname": function (hostname) {
|
|||
|
if (typeof hostname !== "string") {
|
|||
|
return true;
|
|||
|
}
|
|||
|
/*
|
|||
|
http://json-schema.org/latest/json-schema-validation.html#anchor114
|
|||
|
A string instance is valid against this attribute if it is a valid
|
|||
|
representation for an Internet host name, as defined by RFC 1034, section 3.1 [RFC1034].
|
|||
|
|
|||
|
http://tools.ietf.org/html/rfc1034#section-3.5
|
|||
|
|
|||
|
<digit> ::= any one of the ten digits 0 through 9
|
|||
|
var digit = /[0-9]/;
|
|||
|
|
|||
|
<letter> ::= any one of the 52 alphabetic characters A through Z in upper case and a through z in lower case
|
|||
|
var letter = /[a-zA-Z]/;
|
|||
|
|
|||
|
<let-dig> ::= <letter> | <digit>
|
|||
|
var letDig = /[0-9a-zA-Z]/;
|
|||
|
|
|||
|
<let-dig-hyp> ::= <let-dig> | "-"
|
|||
|
var letDigHyp = /[-0-9a-zA-Z]/;
|
|||
|
|
|||
|
<ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
|
|||
|
var ldhStr = /[-0-9a-zA-Z]+/;
|
|||
|
|
|||
|
<label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]
|
|||
|
var label = /[a-zA-Z](([-0-9a-zA-Z]+)?[0-9a-zA-Z])?/;
|
|||
|
|
|||
|
<subdomain> ::= <label> | <subdomain> "." <label>
|
|||
|
var subdomain = /^[a-zA-Z](([-0-9a-zA-Z]+)?[0-9a-zA-Z])?(\.[a-zA-Z](([-0-9a-zA-Z]+)?[0-9a-zA-Z])?)*$/;
|
|||
|
|
|||
|
<domain> ::= <subdomain> | " "
|
|||
|
var domain = null;
|
|||
|
*/
|
|||
|
var valid = /^[a-zA-Z](([-0-9a-zA-Z]+)?[0-9a-zA-Z])?(\.[a-zA-Z](([-0-9a-zA-Z]+)?[0-9a-zA-Z])?)*$/.test(hostname);
|
|||
|
if (valid) {
|
|||
|
// the sum of all label octets and label lengths is limited to 255.
|
|||
|
if (hostname.length > 255) { return false; }
|
|||
|
// Each node has a label, which is zero to 63 octets in length
|
|||
|
var labels = hostname.split(".");
|
|||
|
for (var i = 0; i < labels.length; i++) { if (labels[i].length > 63) { return false; } }
|
|||
|
}
|
|||
|
return valid;
|
|||
|
},
|
|||
|
"host-name": function (hostname) {
|
|||
|
return FormatValidators.hostname.call(this, hostname);
|
|||
|
},
|
|||
|
"ipv4": function (ipv4) {
|
|||
|
if (typeof ipv4 !== "string") { return true; }
|
|||
|
return validator.isIP(ipv4, 4);
|
|||
|
},
|
|||
|
"ipv6": function (ipv6) {
|
|||
|
if (typeof ipv6 !== "string") { return true; }
|
|||
|
return validator.isIP(ipv6, 6);
|
|||
|
},
|
|||
|
"regex": function (str) {
|
|||
|
try {
|
|||
|
RegExp(str);
|
|||
|
return true;
|
|||
|
} catch (e) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
},
|
|||
|
"uri": function (uri) {
|
|||
|
if (this.options.strictUris) {
|
|||
|
return FormatValidators["strict-uri"].apply(this, arguments);
|
|||
|
}
|
|||
|
// https://github.com/zaggino/z-schema/issues/18
|
|||
|
// RegExp from http://tools.ietf.org/html/rfc3986#appendix-B
|
|||
|
return typeof uri !== "string" || RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?").test(uri);
|
|||
|
},
|
|||
|
"strict-uri": function (uri) {
|
|||
|
return typeof uri !== "string" || validator.isURL(uri);
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
module.exports = FormatValidators;
|
|||
|
|
|||
|
},{"validator":4}],107:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
var FormatValidators = require("./FormatValidators"),
|
|||
|
Report = require("./Report"),
|
|||
|
Utils = require("./Utils");
|
|||
|
|
|||
|
var shouldSkipValidate = function (options, errors) {
|
|||
|
return options &&
|
|||
|
Array.isArray(options.includeErrors) &&
|
|||
|
options.includeErrors.length > 0 &&
|
|||
|
!errors.some(function (err) { return options.includeErrors.includes(err);});
|
|||
|
};
|
|||
|
|
|||
|
var JsonValidators = {
|
|||
|
multipleOf: function (report, schema, json) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.1.1.2
|
|||
|
if (shouldSkipValidate(this.validateOptions, ["MULTIPLE_OF"])) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (typeof json !== "number") {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
var stringMultipleOf = String(schema.multipleOf);
|
|||
|
var scale = Math.pow(10, stringMultipleOf.length - stringMultipleOf.indexOf(".") - 1);
|
|||
|
if (Utils.whatIs((json * scale) / (schema.multipleOf * scale)) !== "integer") {
|
|||
|
report.addError("MULTIPLE_OF", [json, schema.multipleOf], null, schema);
|
|||
|
}
|
|||
|
},
|
|||
|
maximum: function (report, schema, json) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.1.2.2
|
|||
|
if (shouldSkipValidate(this.validateOptions, ["MAXIMUM", "MAXIMUM_EXCLUSIVE"])) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (typeof json !== "number") {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (schema.exclusiveMaximum !== true) {
|
|||
|
if (json > schema.maximum) {
|
|||
|
report.addError("MAXIMUM", [json, schema.maximum], null, schema);
|
|||
|
}
|
|||
|
} else {
|
|||
|
if (json >= schema.maximum) {
|
|||
|
report.addError("MAXIMUM_EXCLUSIVE", [json, schema.maximum], null, schema);
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
exclusiveMaximum: function () {
|
|||
|
// covered in maximum
|
|||
|
},
|
|||
|
minimum: function (report, schema, json) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.1.3.2
|
|||
|
if (shouldSkipValidate(this.validateOptions, ["MINIMUM", "MINIMUM_EXCLUSIVE"])) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (typeof json !== "number") {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (schema.exclusiveMinimum !== true) {
|
|||
|
if (json < schema.minimum) {
|
|||
|
report.addError("MINIMUM", [json, schema.minimum], null, schema);
|
|||
|
}
|
|||
|
} else {
|
|||
|
if (json <= schema.minimum) {
|
|||
|
report.addError("MINIMUM_EXCLUSIVE", [json, schema.minimum], null, schema);
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
exclusiveMinimum: function () {
|
|||
|
// covered in minimum
|
|||
|
},
|
|||
|
maxLength: function (report, schema, json) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.2.1.2
|
|||
|
if (shouldSkipValidate(this.validateOptions, ["MAX_LENGTH"])) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (typeof json !== "string") {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (Utils.ucs2decode(json).length > schema.maxLength) {
|
|||
|
report.addError("MAX_LENGTH", [json.length, schema.maxLength], null, schema);
|
|||
|
}
|
|||
|
},
|
|||
|
minLength: function (report, schema, json) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.2.2.2
|
|||
|
if (shouldSkipValidate(this.validateOptions, ["MIN_LENGTH"])) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (typeof json !== "string") {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (Utils.ucs2decode(json).length < schema.minLength) {
|
|||
|
report.addError("MIN_LENGTH", [json.length, schema.minLength], null, schema);
|
|||
|
}
|
|||
|
},
|
|||
|
pattern: function (report, schema, json) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.2.3.2
|
|||
|
if (shouldSkipValidate(this.validateOptions, ["PATTERN"])) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (typeof json !== "string") {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (RegExp(schema.pattern).test(json) === false) {
|
|||
|
report.addError("PATTERN", [schema.pattern, json], null, schema);
|
|||
|
}
|
|||
|
},
|
|||
|
additionalItems: function (report, schema, json) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.3.1.2
|
|||
|
if (shouldSkipValidate(this.validateOptions, ["ARRAY_ADDITIONAL_ITEMS"])) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (!Array.isArray(json)) {
|
|||
|
return;
|
|||
|
}
|
|||
|
// if the value of "additionalItems" is boolean value false and the value of "items" is an array,
|
|||
|
// the json is valid if its size is less than, or equal to, the size of "items".
|
|||
|
if (schema.additionalItems === false && Array.isArray(schema.items)) {
|
|||
|
if (json.length > schema.items.length) {
|
|||
|
report.addError("ARRAY_ADDITIONAL_ITEMS", null, null, schema);
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
items: function () { /*report, schema, json*/
|
|||
|
// covered in additionalItems
|
|||
|
},
|
|||
|
maxItems: function (report, schema, json) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.3.2.2
|
|||
|
if (shouldSkipValidate(this.validateOptions, ["ARRAY_LENGTH_LONG"])) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (!Array.isArray(json)) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (json.length > schema.maxItems) {
|
|||
|
report.addError("ARRAY_LENGTH_LONG", [json.length, schema.maxItems], null, schema);
|
|||
|
}
|
|||
|
},
|
|||
|
minItems: function (report, schema, json) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.3.3.2
|
|||
|
if (shouldSkipValidate(this.validateOptions, ["ARRAY_LENGTH_SHORT"])) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (!Array.isArray(json)) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (json.length < schema.minItems) {
|
|||
|
report.addError("ARRAY_LENGTH_SHORT", [json.length, schema.minItems], null, schema);
|
|||
|
}
|
|||
|
},
|
|||
|
uniqueItems: function (report, schema, json) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.3.4.2
|
|||
|
if (shouldSkipValidate(this.validateOptions, ["ARRAY_UNIQUE"])) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (!Array.isArray(json)) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (schema.uniqueItems === true) {
|
|||
|
var matches = [];
|
|||
|
if (Utils.isUniqueArray(json, matches) === false) {
|
|||
|
report.addError("ARRAY_UNIQUE", matches, null, schema);
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
maxProperties: function (report, schema, json) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.4.1.2
|
|||
|
if (shouldSkipValidate(this.validateOptions, ["OBJECT_PROPERTIES_MAXIMUM"])) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (Utils.whatIs(json) !== "object") {
|
|||
|
return;
|
|||
|
}
|
|||
|
var keysCount = Object.keys(json).length;
|
|||
|
if (keysCount > schema.maxProperties) {
|
|||
|
report.addError("OBJECT_PROPERTIES_MAXIMUM", [keysCount, schema.maxProperties], null, schema);
|
|||
|
}
|
|||
|
},
|
|||
|
minProperties: function (report, schema, json) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.4.2.2
|
|||
|
if (shouldSkipValidate(this.validateOptions, ["OBJECT_PROPERTIES_MINIMUM"])) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (Utils.whatIs(json) !== "object") {
|
|||
|
return;
|
|||
|
}
|
|||
|
var keysCount = Object.keys(json).length;
|
|||
|
if (keysCount < schema.minProperties) {
|
|||
|
report.addError("OBJECT_PROPERTIES_MINIMUM", [keysCount, schema.minProperties], null, schema);
|
|||
|
}
|
|||
|
},
|
|||
|
required: function (report, schema, json) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.4.3.2
|
|||
|
if (shouldSkipValidate(this.validateOptions, ["OBJECT_MISSING_REQUIRED_PROPERTY"])) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (Utils.whatIs(json) !== "object") {
|
|||
|
return;
|
|||
|
}
|
|||
|
var idx = schema.required.length;
|
|||
|
while (idx--) {
|
|||
|
var requiredPropertyName = schema.required[idx];
|
|||
|
if (json[requiredPropertyName] === undefined) {
|
|||
|
report.addError("OBJECT_MISSING_REQUIRED_PROPERTY", [requiredPropertyName], null, schema);
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
additionalProperties: function (report, schema, json) {
|
|||
|
// covered in properties and patternProperties
|
|||
|
if (schema.properties === undefined && schema.patternProperties === undefined) {
|
|||
|
return JsonValidators.properties.call(this, report, schema, json);
|
|||
|
}
|
|||
|
},
|
|||
|
patternProperties: function (report, schema, json) {
|
|||
|
// covered in properties
|
|||
|
if (schema.properties === undefined) {
|
|||
|
return JsonValidators.properties.call(this, report, schema, json);
|
|||
|
}
|
|||
|
},
|
|||
|
properties: function (report, schema, json) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.4.4.2
|
|||
|
if (shouldSkipValidate(this.validateOptions, ["OBJECT_ADDITIONAL_PROPERTIES"])) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (Utils.whatIs(json) !== "object") {
|
|||
|
return;
|
|||
|
}
|
|||
|
var properties = schema.properties !== undefined ? schema.properties : {};
|
|||
|
var patternProperties = schema.patternProperties !== undefined ? schema.patternProperties : {};
|
|||
|
if (schema.additionalProperties === false) {
|
|||
|
// The property set of the json to validate.
|
|||
|
var s = Object.keys(json);
|
|||
|
// The property set from "properties".
|
|||
|
var p = Object.keys(properties);
|
|||
|
// The property set from "patternProperties".
|
|||
|
var pp = Object.keys(patternProperties);
|
|||
|
// remove from "s" all elements of "p", if any;
|
|||
|
s = Utils.difference(s, p);
|
|||
|
// for each regex in "pp", remove all elements of "s" which this regex matches.
|
|||
|
var idx = pp.length;
|
|||
|
while (idx--) {
|
|||
|
var regExp = RegExp(pp[idx]),
|
|||
|
idx2 = s.length;
|
|||
|
while (idx2--) {
|
|||
|
if (regExp.test(s[idx2]) === true) {
|
|||
|
s.splice(idx2, 1);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
// Validation of the json succeeds if, after these two steps, set "s" is empty.
|
|||
|
if (s.length > 0) {
|
|||
|
// assumeAdditional can be an array of allowed properties
|
|||
|
var idx3 = this.options.assumeAdditional.length;
|
|||
|
if (idx3) {
|
|||
|
while (idx3--) {
|
|||
|
var io = s.indexOf(this.options.assumeAdditional[idx3]);
|
|||
|
if (io !== -1) {
|
|||
|
s.splice(io, 1);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
var idx4 = s.length;
|
|||
|
if (idx4) {
|
|||
|
while (idx4--) {
|
|||
|
report.addError("OBJECT_ADDITIONAL_PROPERTIES", [s[idx4]], null, schema);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
dependencies: function (report, schema, json) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.4.5.2
|
|||
|
if (shouldSkipValidate(this.validateOptions, ["OBJECT_DEPENDENCY_KEY"])) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (Utils.whatIs(json) !== "object") {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
var keys = Object.keys(schema.dependencies),
|
|||
|
idx = keys.length;
|
|||
|
|
|||
|
while (idx--) {
|
|||
|
// iterate all dependencies
|
|||
|
var dependencyName = keys[idx];
|
|||
|
if (json[dependencyName]) {
|
|||
|
var dependencyDefinition = schema.dependencies[dependencyName];
|
|||
|
if (Utils.whatIs(dependencyDefinition) === "object") {
|
|||
|
// if dependency is a schema, validate against this schema
|
|||
|
exports.validate.call(this, report, dependencyDefinition, json);
|
|||
|
} else { // Array
|
|||
|
// if dependency is an array, object needs to have all properties in this array
|
|||
|
var idx2 = dependencyDefinition.length;
|
|||
|
while (idx2--) {
|
|||
|
var requiredPropertyName = dependencyDefinition[idx2];
|
|||
|
if (json[requiredPropertyName] === undefined) {
|
|||
|
report.addError("OBJECT_DEPENDENCY_KEY", [requiredPropertyName, dependencyName], null, schema);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
enum: function (report, schema, json) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.5.1.2
|
|||
|
if (shouldSkipValidate(this.validateOptions, ["ENUM_CASE_MISMATCH", "ENUM_MISMATCH"])) {
|
|||
|
return;
|
|||
|
}
|
|||
|
var match = false,
|
|||
|
caseInsensitiveMatch = false,
|
|||
|
idx = schema.enum.length;
|
|||
|
while (idx--) {
|
|||
|
if (Utils.areEqual(json, schema.enum[idx])) {
|
|||
|
match = true;
|
|||
|
break;
|
|||
|
} else if (Utils.areEqual(json, schema.enum[idx]), { caseInsensitiveComparison: true }) {
|
|||
|
caseInsensitiveMatch = true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (match === false) {
|
|||
|
var error = caseInsensitiveMatch && this.options.enumCaseInsensitiveComparison ? "ENUM_CASE_MISMATCH" : "ENUM_MISMATCH";
|
|||
|
report.addError(error, [json], null, schema);
|
|||
|
}
|
|||
|
},
|
|||
|
type: function (report, schema, json) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.5.2.2
|
|||
|
if (shouldSkipValidate(this.validateOptions, ["INVALID_TYPE"])) {
|
|||
|
return;
|
|||
|
}
|
|||
|
var jsonType = Utils.whatIs(json);
|
|||
|
if (typeof schema.type === "string") {
|
|||
|
if (jsonType !== schema.type && (jsonType !== "integer" || schema.type !== "number")) {
|
|||
|
report.addError("INVALID_TYPE", [schema.type, jsonType], null, schema);
|
|||
|
}
|
|||
|
} else {
|
|||
|
if (schema.type.indexOf(jsonType) === -1 && (jsonType !== "integer" || schema.type.indexOf("number") === -1)) {
|
|||
|
report.addError("INVALID_TYPE", [schema.type, jsonType], null, schema);
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
allOf: function (report, schema, json) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.5.3.2
|
|||
|
var idx = schema.allOf.length;
|
|||
|
while (idx--) {
|
|||
|
var validateResult = exports.validate.call(this, report, schema.allOf[idx], json);
|
|||
|
if (this.options.breakOnFirstError && validateResult === false) {
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
anyOf: function (report, schema, json) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.5.4.2
|
|||
|
var subReports = [],
|
|||
|
passed = false,
|
|||
|
idx = schema.anyOf.length;
|
|||
|
|
|||
|
while (idx-- && passed === false) {
|
|||
|
var subReport = new Report(report);
|
|||
|
subReports.push(subReport);
|
|||
|
passed = exports.validate.call(this, subReport, schema.anyOf[idx], json);
|
|||
|
}
|
|||
|
|
|||
|
if (passed === false) {
|
|||
|
report.addError("ANY_OF_MISSING", undefined, subReports, schema);
|
|||
|
}
|
|||
|
},
|
|||
|
oneOf: function (report, schema, json) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.5.5.2
|
|||
|
var passes = 0,
|
|||
|
subReports = [],
|
|||
|
idx = schema.oneOf.length;
|
|||
|
|
|||
|
while (idx--) {
|
|||
|
var subReport = new Report(report, { maxErrors: 1 });
|
|||
|
subReports.push(subReport);
|
|||
|
if (exports.validate.call(this, subReport, schema.oneOf[idx], json) === true) {
|
|||
|
passes++;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (passes === 0) {
|
|||
|
report.addError("ONE_OF_MISSING", undefined, subReports, schema);
|
|||
|
} else if (passes > 1) {
|
|||
|
report.addError("ONE_OF_MULTIPLE", null, null, schema);
|
|||
|
}
|
|||
|
},
|
|||
|
not: function (report, schema, json) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.5.6.2
|
|||
|
var subReport = new Report(report);
|
|||
|
if (exports.validate.call(this, subReport, schema.not, json) === true) {
|
|||
|
report.addError("NOT_PASSED", null, null, schema);
|
|||
|
}
|
|||
|
},
|
|||
|
definitions: function () { /*report, schema, json*/
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.5.7.2
|
|||
|
// nothing to do here
|
|||
|
},
|
|||
|
format: function (report, schema, json) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.7.2
|
|||
|
var formatValidatorFn = FormatValidators[schema.format];
|
|||
|
if (typeof formatValidatorFn === "function") {
|
|||
|
if (shouldSkipValidate(this.validateOptions, ["INVALID_FORMAT"])) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (formatValidatorFn.length === 2) {
|
|||
|
// async - need to clone the path here, because it will change by the time async function reports back
|
|||
|
var pathBeforeAsync = Utils.clone(report.path);
|
|||
|
report.addAsyncTask(formatValidatorFn, [json], function (result) {
|
|||
|
if (result !== true) {
|
|||
|
var backup = report.path;
|
|||
|
report.path = pathBeforeAsync;
|
|||
|
report.addError("INVALID_FORMAT", [schema.format, json], null, schema);
|
|||
|
report.path = backup;
|
|||
|
}
|
|||
|
});
|
|||
|
} else {
|
|||
|
// sync
|
|||
|
if (formatValidatorFn.call(this, json) !== true) {
|
|||
|
report.addError("INVALID_FORMAT", [schema.format, json], null, schema);
|
|||
|
}
|
|||
|
}
|
|||
|
} else if (this.options.ignoreUnknownFormats !== true) {
|
|||
|
report.addError("UNKNOWN_FORMAT", [schema.format], null, schema);
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
var recurseArray = function (report, schema, json) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.8.2
|
|||
|
|
|||
|
var idx = json.length;
|
|||
|
|
|||
|
// If "items" is an array, this situation, the schema depends on the index:
|
|||
|
// if the index is less than, or equal to, the size of "items",
|
|||
|
// the child instance must be valid against the corresponding schema in the "items" array;
|
|||
|
// otherwise, it must be valid against the schema defined by "additionalItems".
|
|||
|
if (Array.isArray(schema.items)) {
|
|||
|
|
|||
|
while (idx--) {
|
|||
|
// equal to doesn't make sense here
|
|||
|
if (idx < schema.items.length) {
|
|||
|
report.path.push(idx);
|
|||
|
exports.validate.call(this, report, schema.items[idx], json[idx]);
|
|||
|
report.path.pop();
|
|||
|
} else {
|
|||
|
// might be boolean, so check that it's an object
|
|||
|
if (typeof schema.additionalItems === "object") {
|
|||
|
report.path.push(idx);
|
|||
|
exports.validate.call(this, report, schema.additionalItems, json[idx]);
|
|||
|
report.path.pop();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
} else if (typeof schema.items === "object") {
|
|||
|
|
|||
|
// If items is a schema, then the child instance must be valid against this schema,
|
|||
|
// regardless of its index, and regardless of the value of "additionalItems".
|
|||
|
while (idx--) {
|
|||
|
report.path.push(idx);
|
|||
|
exports.validate.call(this, report, schema.items, json[idx]);
|
|||
|
report.path.pop();
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
var recurseObject = function (report, schema, json) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.8.3
|
|||
|
|
|||
|
// If "additionalProperties" is absent, it is considered present with an empty schema as a value.
|
|||
|
// In addition, boolean value true is considered equivalent to an empty schema.
|
|||
|
var additionalProperties = schema.additionalProperties;
|
|||
|
if (additionalProperties === true || additionalProperties === undefined) {
|
|||
|
additionalProperties = {};
|
|||
|
}
|
|||
|
|
|||
|
// p - The property set from "properties".
|
|||
|
var p = schema.properties ? Object.keys(schema.properties) : [];
|
|||
|
|
|||
|
// pp - The property set from "patternProperties". Elements of this set will be called regexes for convenience.
|
|||
|
var pp = schema.patternProperties ? Object.keys(schema.patternProperties) : [];
|
|||
|
|
|||
|
// m - The property name of the child.
|
|||
|
var keys = Object.keys(json),
|
|||
|
idx = keys.length;
|
|||
|
|
|||
|
while (idx--) {
|
|||
|
var m = keys[idx],
|
|||
|
propertyValue = json[m];
|
|||
|
|
|||
|
// s - The set of schemas for the child instance.
|
|||
|
var s = [];
|
|||
|
|
|||
|
// 1. If set "p" contains value "m", then the corresponding schema in "properties" is added to "s".
|
|||
|
if (p.indexOf(m) !== -1) {
|
|||
|
s.push(schema.properties[m]);
|
|||
|
}
|
|||
|
|
|||
|
// 2. For each regex in "pp", if it matches "m" successfully, the corresponding schema in "patternProperties" is added to "s".
|
|||
|
var idx2 = pp.length;
|
|||
|
while (idx2--) {
|
|||
|
var regexString = pp[idx2];
|
|||
|
if (RegExp(regexString).test(m) === true) {
|
|||
|
s.push(schema.patternProperties[regexString]);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 3. The schema defined by "additionalProperties" is added to "s" if and only if, at this stage, "s" is empty.
|
|||
|
if (s.length === 0 && additionalProperties !== false) {
|
|||
|
s.push(additionalProperties);
|
|||
|
}
|
|||
|
|
|||
|
// we are passing tests even without this assert because this is covered by properties check
|
|||
|
// if s is empty in this stage, no additionalProperties are allowed
|
|||
|
// report.expect(s.length !== 0, 'E001', m);
|
|||
|
|
|||
|
// Instance property value must pass all schemas from s
|
|||
|
idx2 = s.length;
|
|||
|
while (idx2--) {
|
|||
|
report.path.push(m);
|
|||
|
exports.validate.call(this, report, s[idx2], propertyValue);
|
|||
|
report.path.pop();
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
exports.JsonValidators = JsonValidators;
|
|||
|
|
|||
|
/**
|
|||
|
*
|
|||
|
* @param {Report} report
|
|||
|
* @param {*} schema
|
|||
|
* @param {*} json
|
|||
|
*/
|
|||
|
exports.validate = function (report, schema, json) {
|
|||
|
|
|||
|
report.commonErrorMessage = "JSON_OBJECT_VALIDATION_FAILED";
|
|||
|
|
|||
|
// check if schema is an object
|
|||
|
var to = Utils.whatIs(schema);
|
|||
|
if (to !== "object") {
|
|||
|
report.addError("SCHEMA_NOT_AN_OBJECT", [to], null, schema);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
// check if schema is empty, everything is valid against empty schema
|
|||
|
var keys = Object.keys(schema);
|
|||
|
if (keys.length === 0) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
// this method can be called recursively, so we need to remember our root
|
|||
|
var isRoot = false;
|
|||
|
if (!report.rootSchema) {
|
|||
|
report.rootSchema = schema;
|
|||
|
isRoot = true;
|
|||
|
}
|
|||
|
|
|||
|
// follow schema.$ref keys
|
|||
|
if (schema.$ref !== undefined) {
|
|||
|
// avoid infinite loop with maxRefs
|
|||
|
var maxRefs = 99;
|
|||
|
while (schema.$ref && maxRefs > 0) {
|
|||
|
if (!schema.__$refResolved) {
|
|||
|
report.addError("REF_UNRESOLVED", [schema.$ref], null, schema);
|
|||
|
break;
|
|||
|
} else if (schema.__$refResolved === schema) {
|
|||
|
break;
|
|||
|
} else {
|
|||
|
schema = schema.__$refResolved;
|
|||
|
keys = Object.keys(schema);
|
|||
|
}
|
|||
|
maxRefs--;
|
|||
|
}
|
|||
|
if (maxRefs === 0) {
|
|||
|
throw new Error("Circular dependency by $ref references!");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// type checking first
|
|||
|
var jsonType = Utils.whatIs(json);
|
|||
|
if (schema.type) {
|
|||
|
keys.splice(keys.indexOf("type"), 1);
|
|||
|
JsonValidators.type.call(this, report, schema, json);
|
|||
|
if (report.errors.length && this.options.breakOnFirstError) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// now iterate all the keys in schema and execute validation methods
|
|||
|
var idx = keys.length;
|
|||
|
while (idx--) {
|
|||
|
if (JsonValidators[keys[idx]]) {
|
|||
|
JsonValidators[keys[idx]].call(this, report, schema, json);
|
|||
|
if (report.errors.length && this.options.breakOnFirstError) { break; }
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (report.errors.length === 0 || this.options.breakOnFirstError === false) {
|
|||
|
if (jsonType === "array") {
|
|||
|
recurseArray.call(this, report, schema, json);
|
|||
|
} else if (jsonType === "object") {
|
|||
|
recurseObject.call(this, report, schema, json);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (typeof this.options.customValidator === "function") {
|
|||
|
this.options.customValidator.call(this, report, schema, json);
|
|||
|
}
|
|||
|
|
|||
|
// we don't need the root pointer anymore
|
|||
|
if (isRoot) {
|
|||
|
report.rootSchema = undefined;
|
|||
|
}
|
|||
|
|
|||
|
// return valid just to be able to break at some code points
|
|||
|
return report.errors.length === 0;
|
|||
|
|
|||
|
};
|
|||
|
|
|||
|
},{"./FormatValidators":106,"./Report":109,"./Utils":113}],108:[function(require,module,exports){
|
|||
|
// Number.isFinite polyfill
|
|||
|
// http://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.isfinite
|
|||
|
if (typeof Number.isFinite !== "function") {
|
|||
|
Number.isFinite = function isFinite(value) {
|
|||
|
// 1. If Type(number) is not Number, return false.
|
|||
|
if (typeof value !== "number") {
|
|||
|
return false;
|
|||
|
}
|
|||
|
// 2. If number is NaN, +∞, or −∞, return false.
|
|||
|
if (value !== value || value === Infinity || value === -Infinity) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
// 3. Otherwise, return true.
|
|||
|
return true;
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
},{}],109:[function(require,module,exports){
|
|||
|
(function (process){(function (){
|
|||
|
"use strict";
|
|||
|
|
|||
|
var get = require("lodash.get");
|
|||
|
var Errors = require("./Errors");
|
|||
|
var Utils = require("./Utils");
|
|||
|
|
|||
|
/**
|
|||
|
* @class
|
|||
|
*
|
|||
|
* @param {Report|object} parentOrOptions
|
|||
|
* @param {object} [reportOptions]
|
|||
|
*/
|
|||
|
function Report(parentOrOptions, reportOptions) {
|
|||
|
this.parentReport = parentOrOptions instanceof Report ?
|
|||
|
parentOrOptions :
|
|||
|
undefined;
|
|||
|
|
|||
|
this.options = parentOrOptions instanceof Report ?
|
|||
|
parentOrOptions.options :
|
|||
|
parentOrOptions || {};
|
|||
|
|
|||
|
this.reportOptions = reportOptions || {};
|
|||
|
|
|||
|
this.errors = [];
|
|||
|
/**
|
|||
|
* @type {string[]}
|
|||
|
*/
|
|||
|
this.path = [];
|
|||
|
this.asyncTasks = [];
|
|||
|
|
|||
|
this.rootSchema = undefined;
|
|||
|
this.commonErrorMessage = undefined;
|
|||
|
this.json = undefined;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @returns {boolean}
|
|||
|
*/
|
|||
|
Report.prototype.isValid = function () {
|
|||
|
if (this.asyncTasks.length > 0) {
|
|||
|
throw new Error("Async tasks pending, can't answer isValid");
|
|||
|
}
|
|||
|
return this.errors.length === 0;
|
|||
|
};
|
|||
|
|
|||
|
/**
|
|||
|
*
|
|||
|
* @param {*} fn
|
|||
|
* @param {*} args
|
|||
|
* @param {*} asyncTaskResultProcessFn
|
|||
|
*/
|
|||
|
Report.prototype.addAsyncTask = function (fn, args, asyncTaskResultProcessFn) {
|
|||
|
this.asyncTasks.push([fn, args, asyncTaskResultProcessFn]);
|
|||
|
};
|
|||
|
|
|||
|
Report.prototype.getAncestor = function (id) {
|
|||
|
if (!this.parentReport) {
|
|||
|
return undefined;
|
|||
|
}
|
|||
|
if (this.parentReport.getSchemaId() === id) {
|
|||
|
return this.parentReport;
|
|||
|
}
|
|||
|
return this.parentReport.getAncestor(id);
|
|||
|
};
|
|||
|
|
|||
|
/**
|
|||
|
*
|
|||
|
* @param {*} timeout
|
|||
|
* @param {function(*, *)} callback
|
|||
|
*
|
|||
|
* @returns {void}
|
|||
|
*/
|
|||
|
Report.prototype.processAsyncTasks = function (timeout, callback) {
|
|||
|
|
|||
|
var validationTimeout = timeout || 2000,
|
|||
|
tasksCount = this.asyncTasks.length,
|
|||
|
idx = tasksCount,
|
|||
|
timedOut = false,
|
|||
|
self = this;
|
|||
|
|
|||
|
function finish() {
|
|||
|
process.nextTick(function () {
|
|||
|
var valid = self.errors.length === 0,
|
|||
|
err = valid ? null : self.errors;
|
|||
|
callback(err, valid);
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
function respond(asyncTaskResultProcessFn) {
|
|||
|
return function (asyncTaskResult) {
|
|||
|
if (timedOut) { return; }
|
|||
|
asyncTaskResultProcessFn(asyncTaskResult);
|
|||
|
if (--tasksCount === 0) {
|
|||
|
finish();
|
|||
|
}
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
// finish if tasks are completed or there are any errors and breaking on first error was requested
|
|||
|
if (tasksCount === 0 || (this.errors.length > 0 && this.options.breakOnFirstError)) {
|
|||
|
finish();
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
while (idx--) {
|
|||
|
var task = this.asyncTasks[idx];
|
|||
|
task[0].apply(null, task[1].concat(respond(task[2])));
|
|||
|
}
|
|||
|
|
|||
|
setTimeout(function () {
|
|||
|
if (tasksCount > 0) {
|
|||
|
timedOut = true;
|
|||
|
self.addError("ASYNC_TIMEOUT", [tasksCount, validationTimeout]);
|
|||
|
callback(self.errors, false);
|
|||
|
}
|
|||
|
}, validationTimeout);
|
|||
|
|
|||
|
};
|
|||
|
|
|||
|
/**
|
|||
|
*
|
|||
|
* @param {*} returnPathAsString
|
|||
|
*
|
|||
|
* @return {string[]|string}
|
|||
|
*/
|
|||
|
Report.prototype.getPath = function (returnPathAsString) {
|
|||
|
/**
|
|||
|
* @type {string[]|string}
|
|||
|
*/
|
|||
|
var path = [];
|
|||
|
if (this.parentReport) {
|
|||
|
path = path.concat(this.parentReport.path);
|
|||
|
}
|
|||
|
path = path.concat(this.path);
|
|||
|
|
|||
|
if (returnPathAsString !== true) {
|
|||
|
// Sanitize the path segments (http://tools.ietf.org/html/rfc6901#section-4)
|
|||
|
path = "#/" + path.map(function (segment) {
|
|||
|
segment = segment.toString();
|
|||
|
|
|||
|
if (Utils.isAbsoluteUri(segment)) {
|
|||
|
return "uri(" + segment + ")";
|
|||
|
}
|
|||
|
|
|||
|
return segment.replace(/\~/g, "~0").replace(/\//g, "~1");
|
|||
|
}).join("/");
|
|||
|
}
|
|||
|
return path;
|
|||
|
};
|
|||
|
|
|||
|
Report.prototype.getSchemaId = function () {
|
|||
|
|
|||
|
if (!this.rootSchema) {
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
// get the error path as an array
|
|||
|
var path = [];
|
|||
|
if (this.parentReport) {
|
|||
|
path = path.concat(this.parentReport.path);
|
|||
|
}
|
|||
|
path = path.concat(this.path);
|
|||
|
|
|||
|
// try to find id in the error path
|
|||
|
while (path.length > 0) {
|
|||
|
var obj = get(this.rootSchema, path);
|
|||
|
if (obj && obj.id) { return obj.id; }
|
|||
|
path.pop();
|
|||
|
}
|
|||
|
|
|||
|
// return id of the root
|
|||
|
return this.rootSchema.id;
|
|||
|
};
|
|||
|
|
|||
|
/**
|
|||
|
*
|
|||
|
* @param {*} errorCode
|
|||
|
* @param {*} params
|
|||
|
*
|
|||
|
* @return {boolean}
|
|||
|
*/
|
|||
|
Report.prototype.hasError = function (errorCode, params) {
|
|||
|
var idx = this.errors.length;
|
|||
|
while (idx--) {
|
|||
|
if (this.errors[idx].code === errorCode) {
|
|||
|
// assume match
|
|||
|
var match = true;
|
|||
|
|
|||
|
// check the params too
|
|||
|
var idx2 = this.errors[idx].params.length;
|
|||
|
while (idx2--) {
|
|||
|
if (this.errors[idx].params[idx2] !== params[idx2]) {
|
|||
|
match = false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// if match, return true
|
|||
|
if (match) { return match; }
|
|||
|
}
|
|||
|
}
|
|||
|
return false;
|
|||
|
};
|
|||
|
|
|||
|
/**
|
|||
|
*
|
|||
|
* @param {*} errorCode
|
|||
|
* @param {*} params
|
|||
|
* @param {Report[]|Report} [subReports]
|
|||
|
* @param {*} [schema]
|
|||
|
*
|
|||
|
* @return {void}
|
|||
|
*/
|
|||
|
Report.prototype.addError = function (errorCode, params, subReports, schema) {
|
|||
|
if (!errorCode) { throw new Error("No errorCode passed into addError()"); }
|
|||
|
|
|||
|
this.addCustomError(errorCode, Errors[errorCode], params, subReports, schema);
|
|||
|
};
|
|||
|
|
|||
|
Report.prototype.getJson = function () {
|
|||
|
var self = this;
|
|||
|
while (self.json === undefined) {
|
|||
|
self = self.parentReport;
|
|||
|
if (self === undefined) {
|
|||
|
return undefined;
|
|||
|
}
|
|||
|
}
|
|||
|
return self.json;
|
|||
|
};
|
|||
|
|
|||
|
/**
|
|||
|
*
|
|||
|
* @param {*} errorCode
|
|||
|
* @param {*} errorMessage
|
|||
|
* @param {*[]} params
|
|||
|
* @param {Report[]|Report} subReports
|
|||
|
* @param {*} schema
|
|||
|
*
|
|||
|
* @returns {void}
|
|||
|
*/
|
|||
|
Report.prototype.addCustomError = function (errorCode, errorMessage, params, subReports, schema) {
|
|||
|
if (this.errors.length >= this.reportOptions.maxErrors) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (!errorMessage) { throw new Error("No errorMessage known for code " + errorCode); }
|
|||
|
|
|||
|
params = params || [];
|
|||
|
|
|||
|
var idx = params.length;
|
|||
|
while (idx--) {
|
|||
|
var whatIs = Utils.whatIs(params[idx]);
|
|||
|
var param = (whatIs === "object" || whatIs === "null") ? JSON.stringify(params[idx]) : params[idx];
|
|||
|
errorMessage = errorMessage.replace("{" + idx + "}", param);
|
|||
|
}
|
|||
|
|
|||
|
var err = {
|
|||
|
code: errorCode,
|
|||
|
params: params,
|
|||
|
message: errorMessage,
|
|||
|
path: this.getPath(this.options.reportPathAsArray),
|
|||
|
schemaId: this.getSchemaId()
|
|||
|
};
|
|||
|
|
|||
|
err[Utils.schemaSymbol] = schema;
|
|||
|
err[Utils.jsonSymbol] = this.getJson();
|
|||
|
|
|||
|
if (schema && typeof schema === "string") {
|
|||
|
err.description = schema;
|
|||
|
} else if (schema && typeof schema === "object") {
|
|||
|
if (schema.title) {
|
|||
|
err.title = schema.title;
|
|||
|
}
|
|||
|
if (schema.description) {
|
|||
|
err.description = schema.description;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (subReports != null) {
|
|||
|
if (!Array.isArray(subReports)) {
|
|||
|
subReports = [subReports];
|
|||
|
}
|
|||
|
err.inner = [];
|
|||
|
idx = subReports.length;
|
|||
|
while (idx--) {
|
|||
|
var subReport = subReports[idx],
|
|||
|
idx2 = subReport.errors.length;
|
|||
|
while (idx2--) {
|
|||
|
err.inner.push(subReport.errors[idx2]);
|
|||
|
}
|
|||
|
}
|
|||
|
if (err.inner.length === 0) {
|
|||
|
err.inner = undefined;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
this.errors.push(err);
|
|||
|
};
|
|||
|
|
|||
|
module.exports = Report;
|
|||
|
|
|||
|
}).call(this)}).call(this,require('_process'))
|
|||
|
},{"./Errors":105,"./Utils":113,"_process":3,"lodash.get":1}],110:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
var isequal = require("lodash.isequal");
|
|||
|
var Report = require("./Report");
|
|||
|
var SchemaCompilation = require("./SchemaCompilation");
|
|||
|
var SchemaValidation = require("./SchemaValidation");
|
|||
|
var Utils = require("./Utils");
|
|||
|
|
|||
|
function decodeJSONPointer(str) {
|
|||
|
// http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-07#section-3
|
|||
|
return decodeURIComponent(str).replace(/~[0-1]/g, function (x) {
|
|||
|
return x === "~1" ? "/" : "~";
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
function getRemotePath(uri) {
|
|||
|
var io = uri.indexOf("#");
|
|||
|
return io === -1 ? uri : uri.slice(0, io);
|
|||
|
}
|
|||
|
|
|||
|
function getQueryPath(uri) {
|
|||
|
var io = uri.indexOf("#");
|
|||
|
var res = io === -1 ? undefined : uri.slice(io + 1);
|
|||
|
// WARN: do not slice slash, #/ means take root and go down from it
|
|||
|
// if (res && res[0] === "/") { res = res.slice(1); }
|
|||
|
return res;
|
|||
|
}
|
|||
|
|
|||
|
function findId(schema, id) {
|
|||
|
// process only arrays and objects
|
|||
|
if (typeof schema !== "object" || schema === null) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
// no id means root so return itself
|
|||
|
if (!id) {
|
|||
|
return schema;
|
|||
|
}
|
|||
|
|
|||
|
if (schema.id) {
|
|||
|
if (schema.id === id || schema.id[0] === "#" && schema.id.substring(1) === id) {
|
|||
|
return schema;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
var idx, result;
|
|||
|
if (Array.isArray(schema)) {
|
|||
|
idx = schema.length;
|
|||
|
while (idx--) {
|
|||
|
result = findId(schema[idx], id);
|
|||
|
if (result) { return result; }
|
|||
|
}
|
|||
|
} else {
|
|||
|
var keys = Object.keys(schema);
|
|||
|
idx = keys.length;
|
|||
|
while (idx--) {
|
|||
|
var k = keys[idx];
|
|||
|
if (k.indexOf("__$") === 0) {
|
|||
|
continue;
|
|||
|
}
|
|||
|
result = findId(schema[k], id);
|
|||
|
if (result) { return result; }
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
*
|
|||
|
* @param {*} uri
|
|||
|
* @param {*} schema
|
|||
|
*
|
|||
|
* @returns {void}
|
|||
|
*/
|
|||
|
exports.cacheSchemaByUri = function (uri, schema) {
|
|||
|
var remotePath = getRemotePath(uri);
|
|||
|
if (remotePath) {
|
|||
|
this.cache[remotePath] = schema;
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
/**
|
|||
|
*
|
|||
|
* @param {*} uri
|
|||
|
*
|
|||
|
* @returns {void}
|
|||
|
*/
|
|||
|
exports.removeFromCacheByUri = function (uri) {
|
|||
|
var remotePath = getRemotePath(uri);
|
|||
|
if (remotePath) {
|
|||
|
delete this.cache[remotePath];
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
/**
|
|||
|
*
|
|||
|
* @param {*} uri
|
|||
|
*
|
|||
|
* @returns {boolean}
|
|||
|
*/
|
|||
|
exports.checkCacheForUri = function (uri) {
|
|||
|
var remotePath = getRemotePath(uri);
|
|||
|
return remotePath ? this.cache[remotePath] != null : false;
|
|||
|
};
|
|||
|
|
|||
|
exports.getSchema = function (report, schema) {
|
|||
|
if (typeof schema === "object") {
|
|||
|
schema = exports.getSchemaByReference.call(this, report, schema);
|
|||
|
}
|
|||
|
if (typeof schema === "string") {
|
|||
|
schema = exports.getSchemaByUri.call(this, report, schema);
|
|||
|
}
|
|||
|
return schema;
|
|||
|
};
|
|||
|
|
|||
|
exports.getSchemaByReference = function (report, key) {
|
|||
|
var i = this.referenceCache.length;
|
|||
|
while (i--) {
|
|||
|
if (isequal(this.referenceCache[i][0], key)) {
|
|||
|
return this.referenceCache[i][1];
|
|||
|
}
|
|||
|
}
|
|||
|
// not found
|
|||
|
var schema = Utils.cloneDeep(key);
|
|||
|
this.referenceCache.push([key, schema]);
|
|||
|
return schema;
|
|||
|
};
|
|||
|
|
|||
|
exports.getSchemaByUri = function (report, uri, root) {
|
|||
|
var remotePath = getRemotePath(uri),
|
|||
|
queryPath = getQueryPath(uri),
|
|||
|
result = remotePath ? this.cache[remotePath] : root;
|
|||
|
|
|||
|
if (result && remotePath) {
|
|||
|
// we need to avoid compiling schemas in a recursive loop
|
|||
|
var compileRemote = result !== root;
|
|||
|
// now we need to compile and validate resolved schema (in case it's not already)
|
|||
|
if (compileRemote) {
|
|||
|
|
|||
|
report.path.push(remotePath);
|
|||
|
|
|||
|
var remoteReport;
|
|||
|
|
|||
|
var anscestorReport = report.getAncestor(result.id);
|
|||
|
if (anscestorReport) {
|
|||
|
remoteReport = anscestorReport;
|
|||
|
} else {
|
|||
|
remoteReport = new Report(report);
|
|||
|
if (SchemaCompilation.compileSchema.call(this, remoteReport, result)) {
|
|||
|
var savedOptions = this.options;
|
|||
|
try {
|
|||
|
// If custom validationOptions were provided to setRemoteReference(),
|
|||
|
// use them instead of the default options
|
|||
|
this.options = result.__$validationOptions || this.options;
|
|||
|
SchemaValidation.validateSchema.call(this, remoteReport, result);
|
|||
|
} finally {
|
|||
|
this.options = savedOptions;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
var remoteReportIsValid = remoteReport.isValid();
|
|||
|
if (!remoteReportIsValid) {
|
|||
|
report.addError("REMOTE_NOT_VALID", [uri], remoteReport);
|
|||
|
}
|
|||
|
|
|||
|
report.path.pop();
|
|||
|
|
|||
|
if (!remoteReportIsValid) {
|
|||
|
return undefined;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (result && queryPath) {
|
|||
|
var parts = queryPath.split("/");
|
|||
|
for (var idx = 0, lim = parts.length; result && idx < lim; idx++) {
|
|||
|
var key = decodeJSONPointer(parts[idx]);
|
|||
|
if (idx === 0) { // it's an id
|
|||
|
result = findId(result, key);
|
|||
|
} else { // it's a path behind id
|
|||
|
result = result[key];
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return result;
|
|||
|
};
|
|||
|
|
|||
|
exports.getRemotePath = getRemotePath;
|
|||
|
|
|||
|
},{"./Report":109,"./SchemaCompilation":111,"./SchemaValidation":112,"./Utils":113,"lodash.isequal":2}],111:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
var Report = require("./Report");
|
|||
|
var SchemaCache = require("./SchemaCache");
|
|||
|
var Utils = require("./Utils");
|
|||
|
|
|||
|
function mergeReference(scope, ref) {
|
|||
|
if (Utils.isAbsoluteUri(ref)) {
|
|||
|
return ref;
|
|||
|
}
|
|||
|
|
|||
|
var joinedScope = scope.join(""),
|
|||
|
isScopeAbsolute = Utils.isAbsoluteUri(joinedScope),
|
|||
|
isScopeRelative = Utils.isRelativeUri(joinedScope),
|
|||
|
isRefRelative = Utils.isRelativeUri(ref),
|
|||
|
toRemove;
|
|||
|
|
|||
|
if (isScopeAbsolute && isRefRelative) {
|
|||
|
toRemove = joinedScope.match(/\/[^\/]*$/);
|
|||
|
if (toRemove) {
|
|||
|
joinedScope = joinedScope.slice(0, toRemove.index + 1);
|
|||
|
}
|
|||
|
} else if (isScopeRelative && isRefRelative) {
|
|||
|
joinedScope = "";
|
|||
|
} else {
|
|||
|
toRemove = joinedScope.match(/[^#/]+$/);
|
|||
|
if (toRemove) {
|
|||
|
joinedScope = joinedScope.slice(0, toRemove.index);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
var res = joinedScope + ref;
|
|||
|
res = res.replace(/##/, "#");
|
|||
|
return res;
|
|||
|
}
|
|||
|
|
|||
|
function collectReferences(obj, results, scope, path) {
|
|||
|
results = results || [];
|
|||
|
scope = scope || [];
|
|||
|
path = path || [];
|
|||
|
|
|||
|
if (typeof obj !== "object" || obj === null) {
|
|||
|
return results;
|
|||
|
}
|
|||
|
|
|||
|
if (typeof obj.id === "string") {
|
|||
|
scope.push(obj.id);
|
|||
|
}
|
|||
|
|
|||
|
if (typeof obj.$ref === "string" && typeof obj.__$refResolved === "undefined") {
|
|||
|
results.push({
|
|||
|
ref: mergeReference(scope, obj.$ref),
|
|||
|
key: "$ref",
|
|||
|
obj: obj,
|
|||
|
path: path.slice(0)
|
|||
|
});
|
|||
|
}
|
|||
|
if (typeof obj.$schema === "string" && typeof obj.__$schemaResolved === "undefined") {
|
|||
|
results.push({
|
|||
|
ref: mergeReference(scope, obj.$schema),
|
|||
|
key: "$schema",
|
|||
|
obj: obj,
|
|||
|
path: path.slice(0)
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
var idx;
|
|||
|
if (Array.isArray(obj)) {
|
|||
|
idx = obj.length;
|
|||
|
while (idx--) {
|
|||
|
path.push(idx.toString());
|
|||
|
collectReferences(obj[idx], results, scope, path);
|
|||
|
path.pop();
|
|||
|
}
|
|||
|
} else {
|
|||
|
var keys = Object.keys(obj);
|
|||
|
idx = keys.length;
|
|||
|
while (idx--) {
|
|||
|
// do not recurse through resolved references and other z-schema props
|
|||
|
if (keys[idx].indexOf("__$") === 0) { continue; }
|
|||
|
path.push(keys[idx]);
|
|||
|
collectReferences(obj[keys[idx]], results, scope, path);
|
|||
|
path.pop();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (typeof obj.id === "string") {
|
|||
|
scope.pop();
|
|||
|
}
|
|||
|
|
|||
|
return results;
|
|||
|
}
|
|||
|
|
|||
|
var compileArrayOfSchemasLoop = function (mainReport, arr) {
|
|||
|
var idx = arr.length,
|
|||
|
compiledCount = 0;
|
|||
|
|
|||
|
while (idx--) {
|
|||
|
|
|||
|
// try to compile each schema separately
|
|||
|
var report = new Report(mainReport);
|
|||
|
var isValid = exports.compileSchema.call(this, report, arr[idx]);
|
|||
|
if (isValid) { compiledCount++; }
|
|||
|
|
|||
|
// copy errors to report
|
|||
|
mainReport.errors = mainReport.errors.concat(report.errors);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
return compiledCount;
|
|||
|
};
|
|||
|
|
|||
|
function findId(arr, id) {
|
|||
|
var idx = arr.length;
|
|||
|
while (idx--) {
|
|||
|
if (arr[idx].id === id) {
|
|||
|
return arr[idx];
|
|||
|
}
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
var compileArrayOfSchemas = function (report, arr) {
|
|||
|
|
|||
|
var compiled = 0,
|
|||
|
lastLoopCompiled;
|
|||
|
|
|||
|
do {
|
|||
|
|
|||
|
// remove all UNRESOLVABLE_REFERENCE errors before compiling array again
|
|||
|
var idx = report.errors.length;
|
|||
|
while (idx--) {
|
|||
|
if (report.errors[idx].code === "UNRESOLVABLE_REFERENCE") {
|
|||
|
report.errors.splice(idx, 1);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// remember how many were compiled in the last loop
|
|||
|
lastLoopCompiled = compiled;
|
|||
|
|
|||
|
// count how many are compiled now
|
|||
|
compiled = compileArrayOfSchemasLoop.call(this, report, arr);
|
|||
|
|
|||
|
// fix __$missingReferences if possible
|
|||
|
idx = arr.length;
|
|||
|
while (idx--) {
|
|||
|
var sch = arr[idx];
|
|||
|
if (sch.__$missingReferences) {
|
|||
|
var idx2 = sch.__$missingReferences.length;
|
|||
|
while (idx2--) {
|
|||
|
var refObj = sch.__$missingReferences[idx2];
|
|||
|
var response = findId(arr, refObj.ref);
|
|||
|
if (response) {
|
|||
|
// this might create circular references
|
|||
|
refObj.obj["__" + refObj.key + "Resolved"] = response;
|
|||
|
// it's resolved now so delete it
|
|||
|
sch.__$missingReferences.splice(idx2, 1);
|
|||
|
}
|
|||
|
}
|
|||
|
if (sch.__$missingReferences.length === 0) {
|
|||
|
delete sch.__$missingReferences;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// keep repeating if not all compiled and at least one more was compiled in the last loop
|
|||
|
} while (compiled !== arr.length && compiled !== lastLoopCompiled);
|
|||
|
|
|||
|
return report.isValid();
|
|||
|
|
|||
|
};
|
|||
|
|
|||
|
exports.compileSchema = function (report, schema) {
|
|||
|
|
|||
|
report.commonErrorMessage = "SCHEMA_COMPILATION_FAILED";
|
|||
|
|
|||
|
// if schema is a string, assume it's a uri
|
|||
|
if (typeof schema === "string") {
|
|||
|
var loadedSchema = SchemaCache.getSchemaByUri.call(this, report, schema);
|
|||
|
if (!loadedSchema) {
|
|||
|
report.addError("SCHEMA_NOT_REACHABLE", [schema]);
|
|||
|
return false;
|
|||
|
}
|
|||
|
schema = loadedSchema;
|
|||
|
}
|
|||
|
|
|||
|
// if schema is an array, assume it's an array of schemas
|
|||
|
if (Array.isArray(schema)) {
|
|||
|
return compileArrayOfSchemas.call(this, report, schema);
|
|||
|
}
|
|||
|
|
|||
|
// if we have an id than it should be cached already (if this instance has compiled it)
|
|||
|
if (schema.__$compiled && schema.id && SchemaCache.checkCacheForUri.call(this, schema.id) === false) {
|
|||
|
schema.__$compiled = undefined;
|
|||
|
}
|
|||
|
|
|||
|
// do not re-compile schemas
|
|||
|
if (schema.__$compiled) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
if (schema.id && typeof schema.id === "string") {
|
|||
|
// add this to our schemaCache (before compilation in case we have references including id)
|
|||
|
SchemaCache.cacheSchemaByUri.call(this, schema.id, schema);
|
|||
|
}
|
|||
|
|
|||
|
// this method can be called recursively, so we need to remember our root
|
|||
|
var isRoot = false;
|
|||
|
if (!report.rootSchema) {
|
|||
|
report.rootSchema = schema;
|
|||
|
isRoot = true;
|
|||
|
}
|
|||
|
|
|||
|
// delete all __$missingReferences from previous compilation attempts
|
|||
|
var isValidExceptReferences = report.isValid();
|
|||
|
delete schema.__$missingReferences;
|
|||
|
|
|||
|
// collect all references that need to be resolved - $ref and $schema
|
|||
|
var refs = collectReferences.call(this, schema),
|
|||
|
idx = refs.length;
|
|||
|
while (idx--) {
|
|||
|
// resolve all the collected references into __xxxResolved pointer
|
|||
|
var refObj = refs[idx];
|
|||
|
var response = SchemaCache.getSchemaByUri.call(this, report, refObj.ref, schema);
|
|||
|
|
|||
|
// we can try to use custom schemaReader if available
|
|||
|
if (!response) {
|
|||
|
var schemaReader = this.getSchemaReader();
|
|||
|
if (schemaReader) {
|
|||
|
// it's supposed to return a valid schema
|
|||
|
var s = schemaReader(refObj.ref);
|
|||
|
if (s) {
|
|||
|
// it needs to have the id
|
|||
|
s.id = refObj.ref;
|
|||
|
// try to compile the schema
|
|||
|
var subreport = new Report(report);
|
|||
|
if (!exports.compileSchema.call(this, subreport, s)) {
|
|||
|
// copy errors to report
|
|||
|
report.errors = report.errors.concat(subreport.errors);
|
|||
|
} else {
|
|||
|
response = SchemaCache.getSchemaByUri.call(this, report, refObj.ref, schema);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (!response) {
|
|||
|
|
|||
|
var hasNotValid = report.hasError("REMOTE_NOT_VALID", [refObj.ref]);
|
|||
|
var isAbsolute = Utils.isAbsoluteUri(refObj.ref);
|
|||
|
var isDownloaded = false;
|
|||
|
var ignoreUnresolvableRemotes = this.options.ignoreUnresolvableReferences === true;
|
|||
|
|
|||
|
if (isAbsolute) {
|
|||
|
// we shouldn't add UNRESOLVABLE_REFERENCE for schemas we already have downloaded
|
|||
|
// and set through setRemoteReference method
|
|||
|
isDownloaded = SchemaCache.checkCacheForUri.call(this, refObj.ref);
|
|||
|
}
|
|||
|
|
|||
|
if (hasNotValid) {
|
|||
|
// already has REMOTE_NOT_VALID error for this one
|
|||
|
} else if (ignoreUnresolvableRemotes && isAbsolute) {
|
|||
|
// ignoreUnresolvableRemotes is on and remote isAbsolute
|
|||
|
} else if (isDownloaded) {
|
|||
|
// remote is downloaded, so no UNRESOLVABLE_REFERENCE
|
|||
|
} else {
|
|||
|
Array.prototype.push.apply(report.path, refObj.path);
|
|||
|
report.addError("UNRESOLVABLE_REFERENCE", [refObj.ref]);
|
|||
|
report.path = report.path.slice(0, -refObj.path.length);
|
|||
|
|
|||
|
// pusblish unresolved references out
|
|||
|
if (isValidExceptReferences) {
|
|||
|
schema.__$missingReferences = schema.__$missingReferences || [];
|
|||
|
schema.__$missingReferences.push(refObj);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
// this might create circular references
|
|||
|
refObj.obj["__" + refObj.key + "Resolved"] = response;
|
|||
|
}
|
|||
|
|
|||
|
var isValid = report.isValid();
|
|||
|
if (isValid) {
|
|||
|
schema.__$compiled = true;
|
|||
|
} else {
|
|||
|
if (schema.id && typeof schema.id === "string") {
|
|||
|
// remove this schema from schemaCache because it failed to compile
|
|||
|
SchemaCache.removeFromCacheByUri.call(this, schema.id);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// we don't need the root pointer anymore
|
|||
|
if (isRoot) {
|
|||
|
report.rootSchema = undefined;
|
|||
|
}
|
|||
|
|
|||
|
return isValid;
|
|||
|
|
|||
|
};
|
|||
|
|
|||
|
},{"./Report":109,"./SchemaCache":110,"./Utils":113}],112:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
var FormatValidators = require("./FormatValidators"),
|
|||
|
JsonValidation = require("./JsonValidation"),
|
|||
|
Report = require("./Report"),
|
|||
|
Utils = require("./Utils");
|
|||
|
|
|||
|
var SchemaValidators = {
|
|||
|
$ref: function (report, schema) {
|
|||
|
// http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-07
|
|||
|
// http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03
|
|||
|
if (typeof schema.$ref !== "string") {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["$ref", "string"]);
|
|||
|
}
|
|||
|
},
|
|||
|
$schema: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-core.html#rfc.section.6
|
|||
|
if (typeof schema.$schema !== "string") {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["$schema", "string"]);
|
|||
|
}
|
|||
|
},
|
|||
|
multipleOf: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.1.1.1
|
|||
|
if (typeof schema.multipleOf !== "number") {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["multipleOf", "number"]);
|
|||
|
} else if (schema.multipleOf <= 0) {
|
|||
|
report.addError("KEYWORD_MUST_BE", ["multipleOf", "strictly greater than 0"]);
|
|||
|
}
|
|||
|
},
|
|||
|
maximum: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.1.2.1
|
|||
|
if (typeof schema.maximum !== "number") {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["maximum", "number"]);
|
|||
|
}
|
|||
|
},
|
|||
|
exclusiveMaximum: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.1.2.1
|
|||
|
if (typeof schema.exclusiveMaximum !== "boolean") {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["exclusiveMaximum", "boolean"]);
|
|||
|
} else if (schema.maximum === undefined) {
|
|||
|
report.addError("KEYWORD_DEPENDENCY", ["exclusiveMaximum", "maximum"]);
|
|||
|
}
|
|||
|
},
|
|||
|
minimum: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.1.3.1
|
|||
|
if (typeof schema.minimum !== "number") {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["minimum", "number"]);
|
|||
|
}
|
|||
|
},
|
|||
|
exclusiveMinimum: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.1.3.1
|
|||
|
if (typeof schema.exclusiveMinimum !== "boolean") {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["exclusiveMinimum", "boolean"]);
|
|||
|
} else if (schema.minimum === undefined) {
|
|||
|
report.addError("KEYWORD_DEPENDENCY", ["exclusiveMinimum", "minimum"]);
|
|||
|
}
|
|||
|
},
|
|||
|
maxLength: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.2.1.1
|
|||
|
if (Utils.whatIs(schema.maxLength) !== "integer") {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["maxLength", "integer"]);
|
|||
|
} else if (schema.maxLength < 0) {
|
|||
|
report.addError("KEYWORD_MUST_BE", ["maxLength", "greater than, or equal to 0"]);
|
|||
|
}
|
|||
|
},
|
|||
|
minLength: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.2.2.1
|
|||
|
if (Utils.whatIs(schema.minLength) !== "integer") {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["minLength", "integer"]);
|
|||
|
} else if (schema.minLength < 0) {
|
|||
|
report.addError("KEYWORD_MUST_BE", ["minLength", "greater than, or equal to 0"]);
|
|||
|
}
|
|||
|
},
|
|||
|
pattern: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.2.3.1
|
|||
|
if (typeof schema.pattern !== "string") {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["pattern", "string"]);
|
|||
|
} else {
|
|||
|
try {
|
|||
|
RegExp(schema.pattern);
|
|||
|
} catch (e) {
|
|||
|
report.addError("KEYWORD_PATTERN", ["pattern", schema.pattern]);
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
additionalItems: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.3.1.1
|
|||
|
var type = Utils.whatIs(schema.additionalItems);
|
|||
|
if (type !== "boolean" && type !== "object") {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["additionalItems", ["boolean", "object"]]);
|
|||
|
} else if (type === "object") {
|
|||
|
report.path.push("additionalItems");
|
|||
|
exports.validateSchema.call(this, report, schema.additionalItems);
|
|||
|
report.path.pop();
|
|||
|
}
|
|||
|
},
|
|||
|
items: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.3.1.1
|
|||
|
var type = Utils.whatIs(schema.items);
|
|||
|
|
|||
|
if (type === "object") {
|
|||
|
report.path.push("items");
|
|||
|
exports.validateSchema.call(this, report, schema.items);
|
|||
|
report.path.pop();
|
|||
|
} else if (type === "array") {
|
|||
|
var idx = schema.items.length;
|
|||
|
while (idx--) {
|
|||
|
report.path.push("items");
|
|||
|
report.path.push(idx.toString());
|
|||
|
exports.validateSchema.call(this, report, schema.items[idx]);
|
|||
|
report.path.pop();
|
|||
|
report.path.pop();
|
|||
|
}
|
|||
|
} else {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["items", ["array", "object"]]);
|
|||
|
}
|
|||
|
|
|||
|
// custom - strict mode
|
|||
|
if (this.options.forceAdditional === true && schema.additionalItems === undefined && Array.isArray(schema.items)) {
|
|||
|
report.addError("KEYWORD_UNDEFINED_STRICT", ["additionalItems"]);
|
|||
|
}
|
|||
|
// custome - assume defined false mode
|
|||
|
if (this.options.assumeAdditional && schema.additionalItems === undefined && Array.isArray(schema.items)) {
|
|||
|
schema.additionalItems = false;
|
|||
|
}
|
|||
|
},
|
|||
|
maxItems: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.3.2.1
|
|||
|
if (typeof schema.maxItems !== "number") {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["maxItems", "integer"]);
|
|||
|
} else if (schema.maxItems < 0) {
|
|||
|
report.addError("KEYWORD_MUST_BE", ["maxItems", "greater than, or equal to 0"]);
|
|||
|
}
|
|||
|
},
|
|||
|
minItems: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.3.3.1
|
|||
|
if (Utils.whatIs(schema.minItems) !== "integer") {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["minItems", "integer"]);
|
|||
|
} else if (schema.minItems < 0) {
|
|||
|
report.addError("KEYWORD_MUST_BE", ["minItems", "greater than, or equal to 0"]);
|
|||
|
}
|
|||
|
},
|
|||
|
uniqueItems: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.3.4.1
|
|||
|
if (typeof schema.uniqueItems !== "boolean") {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["uniqueItems", "boolean"]);
|
|||
|
}
|
|||
|
},
|
|||
|
maxProperties: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.4.1.1
|
|||
|
if (Utils.whatIs(schema.maxProperties) !== "integer") {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["maxProperties", "integer"]);
|
|||
|
} else if (schema.maxProperties < 0) {
|
|||
|
report.addError("KEYWORD_MUST_BE", ["maxProperties", "greater than, or equal to 0"]);
|
|||
|
}
|
|||
|
},
|
|||
|
minProperties: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.4.2.1
|
|||
|
if (Utils.whatIs(schema.minProperties) !== "integer") {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["minProperties", "integer"]);
|
|||
|
} else if (schema.minProperties < 0) {
|
|||
|
report.addError("KEYWORD_MUST_BE", ["minProperties", "greater than, or equal to 0"]);
|
|||
|
}
|
|||
|
},
|
|||
|
required: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.4.3.1
|
|||
|
if (Utils.whatIs(schema.required) !== "array") {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["required", "array"]);
|
|||
|
} else if (schema.required.length === 0) {
|
|||
|
report.addError("KEYWORD_MUST_BE", ["required", "an array with at least one element"]);
|
|||
|
} else {
|
|||
|
var idx = schema.required.length;
|
|||
|
while (idx--) {
|
|||
|
if (typeof schema.required[idx] !== "string") {
|
|||
|
report.addError("KEYWORD_VALUE_TYPE", ["required", "string"]);
|
|||
|
}
|
|||
|
}
|
|||
|
if (Utils.isUniqueArray(schema.required) === false) {
|
|||
|
report.addError("KEYWORD_MUST_BE", ["required", "an array with unique items"]);
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
additionalProperties: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.4.4.1
|
|||
|
var type = Utils.whatIs(schema.additionalProperties);
|
|||
|
if (type !== "boolean" && type !== "object") {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["additionalProperties", ["boolean", "object"]]);
|
|||
|
} else if (type === "object") {
|
|||
|
report.path.push("additionalProperties");
|
|||
|
exports.validateSchema.call(this, report, schema.additionalProperties);
|
|||
|
report.path.pop();
|
|||
|
}
|
|||
|
},
|
|||
|
properties: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.4.4.1
|
|||
|
if (Utils.whatIs(schema.properties) !== "object") {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["properties", "object"]);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
var keys = Object.keys(schema.properties),
|
|||
|
idx = keys.length;
|
|||
|
while (idx--) {
|
|||
|
var key = keys[idx],
|
|||
|
val = schema.properties[key];
|
|||
|
report.path.push("properties");
|
|||
|
report.path.push(key);
|
|||
|
exports.validateSchema.call(this, report, val);
|
|||
|
report.path.pop();
|
|||
|
report.path.pop();
|
|||
|
}
|
|||
|
|
|||
|
// custom - strict mode
|
|||
|
if (this.options.forceAdditional === true && schema.additionalProperties === undefined) {
|
|||
|
report.addError("KEYWORD_UNDEFINED_STRICT", ["additionalProperties"]);
|
|||
|
}
|
|||
|
// custome - assume defined false mode
|
|||
|
if (this.options.assumeAdditional && schema.additionalProperties === undefined) {
|
|||
|
schema.additionalProperties = false;
|
|||
|
}
|
|||
|
// custom - forceProperties
|
|||
|
if (this.options.forceProperties === true && keys.length === 0) {
|
|||
|
report.addError("CUSTOM_MODE_FORCE_PROPERTIES", ["properties"]);
|
|||
|
}
|
|||
|
},
|
|||
|
patternProperties: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.4.4.1
|
|||
|
if (Utils.whatIs(schema.patternProperties) !== "object") {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["patternProperties", "object"]);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
var keys = Object.keys(schema.patternProperties),
|
|||
|
idx = keys.length;
|
|||
|
while (idx--) {
|
|||
|
var key = keys[idx],
|
|||
|
val = schema.patternProperties[key];
|
|||
|
try {
|
|||
|
RegExp(key);
|
|||
|
} catch (e) {
|
|||
|
report.addError("KEYWORD_PATTERN", ["patternProperties", key]);
|
|||
|
}
|
|||
|
report.path.push("patternProperties");
|
|||
|
report.path.push(key.toString());
|
|||
|
exports.validateSchema.call(this, report, val);
|
|||
|
report.path.pop();
|
|||
|
report.path.pop();
|
|||
|
}
|
|||
|
|
|||
|
// custom - forceProperties
|
|||
|
if (this.options.forceProperties === true && keys.length === 0) {
|
|||
|
report.addError("CUSTOM_MODE_FORCE_PROPERTIES", ["patternProperties"]);
|
|||
|
}
|
|||
|
},
|
|||
|
dependencies: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.4.5.1
|
|||
|
if (Utils.whatIs(schema.dependencies) !== "object") {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["dependencies", "object"]);
|
|||
|
} else {
|
|||
|
var keys = Object.keys(schema.dependencies),
|
|||
|
idx = keys.length;
|
|||
|
while (idx--) {
|
|||
|
var schemaKey = keys[idx],
|
|||
|
schemaDependency = schema.dependencies[schemaKey],
|
|||
|
type = Utils.whatIs(schemaDependency);
|
|||
|
|
|||
|
if (type === "object") {
|
|||
|
report.path.push("dependencies");
|
|||
|
report.path.push(schemaKey);
|
|||
|
exports.validateSchema.call(this, report, schemaDependency);
|
|||
|
report.path.pop();
|
|||
|
report.path.pop();
|
|||
|
} else if (type === "array") {
|
|||
|
var idx2 = schemaDependency.length;
|
|||
|
if (idx2 === 0) {
|
|||
|
report.addError("KEYWORD_MUST_BE", ["dependencies", "not empty array"]);
|
|||
|
}
|
|||
|
while (idx2--) {
|
|||
|
if (typeof schemaDependency[idx2] !== "string") {
|
|||
|
report.addError("KEYWORD_VALUE_TYPE", ["dependensices", "string"]);
|
|||
|
}
|
|||
|
}
|
|||
|
if (Utils.isUniqueArray(schemaDependency) === false) {
|
|||
|
report.addError("KEYWORD_MUST_BE", ["dependencies", "an array with unique items"]);
|
|||
|
}
|
|||
|
} else {
|
|||
|
report.addError("KEYWORD_VALUE_TYPE", ["dependencies", "object or array"]);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
enum: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.5.1.1
|
|||
|
if (Array.isArray(schema.enum) === false) {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["enum", "array"]);
|
|||
|
} else if (schema.enum.length === 0) {
|
|||
|
report.addError("KEYWORD_MUST_BE", ["enum", "an array with at least one element"]);
|
|||
|
} else if (Utils.isUniqueArray(schema.enum) === false) {
|
|||
|
report.addError("KEYWORD_MUST_BE", ["enum", "an array with unique elements"]);
|
|||
|
}
|
|||
|
},
|
|||
|
type: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.5.2.1
|
|||
|
var primitiveTypes = ["array", "boolean", "integer", "number", "null", "object", "string"],
|
|||
|
primitiveTypeStr = primitiveTypes.join(","),
|
|||
|
isArray = Array.isArray(schema.type);
|
|||
|
|
|||
|
if (isArray) {
|
|||
|
var idx = schema.type.length;
|
|||
|
while (idx--) {
|
|||
|
if (primitiveTypes.indexOf(schema.type[idx]) === -1) {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["type", primitiveTypeStr]);
|
|||
|
}
|
|||
|
}
|
|||
|
if (Utils.isUniqueArray(schema.type) === false) {
|
|||
|
report.addError("KEYWORD_MUST_BE", ["type", "an object with unique properties"]);
|
|||
|
}
|
|||
|
} else if (typeof schema.type === "string") {
|
|||
|
if (primitiveTypes.indexOf(schema.type) === -1) {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["type", primitiveTypeStr]);
|
|||
|
}
|
|||
|
} else {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["type", ["string", "array"]]);
|
|||
|
}
|
|||
|
|
|||
|
if (this.options.noEmptyStrings === true) {
|
|||
|
if (schema.type === "string" || isArray && schema.type.indexOf("string") !== -1) {
|
|||
|
if (schema.minLength === undefined &&
|
|||
|
schema.enum === undefined &&
|
|||
|
schema.format === undefined) {
|
|||
|
|
|||
|
schema.minLength = 1;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if (this.options.noEmptyArrays === true) {
|
|||
|
if (schema.type === "array" || isArray && schema.type.indexOf("array") !== -1) {
|
|||
|
if (schema.minItems === undefined) {
|
|||
|
schema.minItems = 1;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if (this.options.forceProperties === true) {
|
|||
|
if (schema.type === "object" || isArray && schema.type.indexOf("object") !== -1) {
|
|||
|
if (schema.properties === undefined && schema.patternProperties === undefined) {
|
|||
|
report.addError("KEYWORD_UNDEFINED_STRICT", ["properties"]);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if (this.options.forceItems === true) {
|
|||
|
if (schema.type === "array" || isArray && schema.type.indexOf("array") !== -1) {
|
|||
|
if (schema.items === undefined) {
|
|||
|
report.addError("KEYWORD_UNDEFINED_STRICT", ["items"]);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if (this.options.forceMinItems === true) {
|
|||
|
if (schema.type === "array" || isArray && schema.type.indexOf("array") !== -1) {
|
|||
|
if (schema.minItems === undefined) {
|
|||
|
report.addError("KEYWORD_UNDEFINED_STRICT", ["minItems"]);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if (this.options.forceMaxItems === true) {
|
|||
|
if (schema.type === "array" || isArray && schema.type.indexOf("array") !== -1) {
|
|||
|
if (schema.maxItems === undefined) {
|
|||
|
report.addError("KEYWORD_UNDEFINED_STRICT", ["maxItems"]);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if (this.options.forceMinLength === true) {
|
|||
|
if (schema.type === "string" || isArray && schema.type.indexOf("string") !== -1) {
|
|||
|
if (schema.minLength === undefined &&
|
|||
|
schema.format === undefined &&
|
|||
|
schema.enum === undefined &&
|
|||
|
schema.pattern === undefined) {
|
|||
|
report.addError("KEYWORD_UNDEFINED_STRICT", ["minLength"]);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if (this.options.forceMaxLength === true) {
|
|||
|
if (schema.type === "string" || isArray && schema.type.indexOf("string") !== -1) {
|
|||
|
if (schema.maxLength === undefined &&
|
|||
|
schema.format === undefined &&
|
|||
|
schema.enum === undefined &&
|
|||
|
schema.pattern === undefined) {
|
|||
|
report.addError("KEYWORD_UNDEFINED_STRICT", ["maxLength"]);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
allOf: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.5.3.1
|
|||
|
if (Array.isArray(schema.allOf) === false) {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["allOf", "array"]);
|
|||
|
} else if (schema.allOf.length === 0) {
|
|||
|
report.addError("KEYWORD_MUST_BE", ["allOf", "an array with at least one element"]);
|
|||
|
} else {
|
|||
|
var idx = schema.allOf.length;
|
|||
|
while (idx--) {
|
|||
|
report.path.push("allOf");
|
|||
|
report.path.push(idx.toString());
|
|||
|
exports.validateSchema.call(this, report, schema.allOf[idx]);
|
|||
|
report.path.pop();
|
|||
|
report.path.pop();
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
anyOf: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.5.4.1
|
|||
|
if (Array.isArray(schema.anyOf) === false) {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["anyOf", "array"]);
|
|||
|
} else if (schema.anyOf.length === 0) {
|
|||
|
report.addError("KEYWORD_MUST_BE", ["anyOf", "an array with at least one element"]);
|
|||
|
} else {
|
|||
|
var idx = schema.anyOf.length;
|
|||
|
while (idx--) {
|
|||
|
report.path.push("anyOf");
|
|||
|
report.path.push(idx.toString());
|
|||
|
exports.validateSchema.call(this, report, schema.anyOf[idx]);
|
|||
|
report.path.pop();
|
|||
|
report.path.pop();
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
oneOf: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.5.5.1
|
|||
|
if (Array.isArray(schema.oneOf) === false) {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["oneOf", "array"]);
|
|||
|
} else if (schema.oneOf.length === 0) {
|
|||
|
report.addError("KEYWORD_MUST_BE", ["oneOf", "an array with at least one element"]);
|
|||
|
} else {
|
|||
|
var idx = schema.oneOf.length;
|
|||
|
while (idx--) {
|
|||
|
report.path.push("oneOf");
|
|||
|
report.path.push(idx.toString());
|
|||
|
exports.validateSchema.call(this, report, schema.oneOf[idx]);
|
|||
|
report.path.pop();
|
|||
|
report.path.pop();
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
not: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.5.6.1
|
|||
|
if (Utils.whatIs(schema.not) !== "object") {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["not", "object"]);
|
|||
|
} else {
|
|||
|
report.path.push("not");
|
|||
|
exports.validateSchema.call(this, report, schema.not);
|
|||
|
report.path.pop();
|
|||
|
}
|
|||
|
},
|
|||
|
definitions: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.5.7.1
|
|||
|
if (Utils.whatIs(schema.definitions) !== "object") {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["definitions", "object"]);
|
|||
|
} else {
|
|||
|
var keys = Object.keys(schema.definitions),
|
|||
|
idx = keys.length;
|
|||
|
while (idx--) {
|
|||
|
var key = keys[idx],
|
|||
|
val = schema.definitions[key];
|
|||
|
report.path.push("definitions");
|
|||
|
report.path.push(key);
|
|||
|
exports.validateSchema.call(this, report, val);
|
|||
|
report.path.pop();
|
|||
|
report.path.pop();
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
format: function (report, schema) {
|
|||
|
if (typeof schema.format !== "string") {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["format", "string"]);
|
|||
|
} else {
|
|||
|
if (FormatValidators[schema.format] === undefined && this.options.ignoreUnknownFormats !== true) {
|
|||
|
report.addError("UNKNOWN_FORMAT", [schema.format]);
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
id: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-core.html#rfc.section.7.2
|
|||
|
if (typeof schema.id !== "string") {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["id", "string"]);
|
|||
|
}
|
|||
|
},
|
|||
|
title: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.6.1
|
|||
|
if (typeof schema.title !== "string") {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["title", "string"]);
|
|||
|
}
|
|||
|
},
|
|||
|
description: function (report, schema) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.6.1
|
|||
|
if (typeof schema.description !== "string") {
|
|||
|
report.addError("KEYWORD_TYPE_EXPECTED", ["description", "string"]);
|
|||
|
}
|
|||
|
},
|
|||
|
"default": function (/* report, schema */) {
|
|||
|
// http://json-schema.org/latest/json-schema-validation.html#rfc.section.6.2
|
|||
|
// There are no restrictions placed on the value of this keyword.
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
/**
|
|||
|
*
|
|||
|
* @param {Report} report
|
|||
|
* @param {*[]} arr
|
|||
|
*
|
|||
|
* @returns {boolean}
|
|||
|
*/
|
|||
|
var validateArrayOfSchemas = function (report, arr) {
|
|||
|
var idx = arr.length;
|
|||
|
while (idx--) {
|
|||
|
exports.validateSchema.call(this, report, arr[idx]);
|
|||
|
}
|
|||
|
return report.isValid();
|
|||
|
};
|
|||
|
|
|||
|
/**
|
|||
|
*
|
|||
|
* @param {Report} report
|
|||
|
* @param {*} schema
|
|||
|
*/
|
|||
|
exports.validateSchema = function (report, schema) {
|
|||
|
|
|||
|
report.commonErrorMessage = "SCHEMA_VALIDATION_FAILED";
|
|||
|
|
|||
|
// if schema is an array, assume it's an array of schemas
|
|||
|
if (Array.isArray(schema)) {
|
|||
|
return validateArrayOfSchemas.call(this, report, schema);
|
|||
|
}
|
|||
|
|
|||
|
// do not revalidate schema that has already been validated once
|
|||
|
if (schema.__$validated) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
// if $schema is present, this schema should validate against that $schema
|
|||
|
var hasParentSchema = schema.$schema && schema.id !== schema.$schema;
|
|||
|
if (hasParentSchema) {
|
|||
|
if (schema.__$schemaResolved && schema.__$schemaResolved !== schema) {
|
|||
|
var subReport = new Report(report);
|
|||
|
var valid = JsonValidation.validate.call(this, subReport, schema.__$schemaResolved, schema);
|
|||
|
if (valid === false) {
|
|||
|
report.addError("PARENT_SCHEMA_VALIDATION_FAILED", null, subReport);
|
|||
|
}
|
|||
|
} else {
|
|||
|
if (this.options.ignoreUnresolvableReferences !== true) {
|
|||
|
report.addError("REF_UNRESOLVED", [schema.$schema]);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (this.options.noTypeless === true) {
|
|||
|
// issue #36 - inherit type to anyOf, oneOf, allOf if noTypeless is defined
|
|||
|
if (schema.type !== undefined) {
|
|||
|
var schemas = [];
|
|||
|
if (Array.isArray(schema.anyOf)) { schemas = schemas.concat(schema.anyOf); }
|
|||
|
if (Array.isArray(schema.oneOf)) { schemas = schemas.concat(schema.oneOf); }
|
|||
|
if (Array.isArray(schema.allOf)) { schemas = schemas.concat(schema.allOf); }
|
|||
|
schemas.forEach(function (sch) {
|
|||
|
if (!sch.type) { sch.type = schema.type; }
|
|||
|
});
|
|||
|
}
|
|||
|
// end issue #36
|
|||
|
if (schema.enum === undefined &&
|
|||
|
schema.type === undefined &&
|
|||
|
schema.anyOf === undefined &&
|
|||
|
schema.oneOf === undefined &&
|
|||
|
schema.not === undefined &&
|
|||
|
schema.$ref === undefined) {
|
|||
|
report.addError("KEYWORD_UNDEFINED_STRICT", ["type"]);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
var keys = Object.keys(schema),
|
|||
|
idx = keys.length;
|
|||
|
while (idx--) {
|
|||
|
var key = keys[idx];
|
|||
|
if (key.indexOf("__") === 0) { continue; }
|
|||
|
if (SchemaValidators[key] !== undefined) {
|
|||
|
SchemaValidators[key].call(this, report, schema);
|
|||
|
} else if (!hasParentSchema) {
|
|||
|
if (this.options.noExtraKeywords === true) {
|
|||
|
report.addError("KEYWORD_UNEXPECTED", [key]);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (this.options.pedanticCheck === true) {
|
|||
|
if (schema.enum) {
|
|||
|
// break recursion
|
|||
|
var tmpSchema = Utils.clone(schema);
|
|||
|
delete tmpSchema.enum;
|
|||
|
delete tmpSchema.default;
|
|||
|
|
|||
|
report.path.push("enum");
|
|||
|
idx = schema.enum.length;
|
|||
|
while (idx--) {
|
|||
|
report.path.push(idx.toString());
|
|||
|
JsonValidation.validate.call(this, report, tmpSchema, schema.enum[idx]);
|
|||
|
report.path.pop();
|
|||
|
}
|
|||
|
report.path.pop();
|
|||
|
}
|
|||
|
|
|||
|
if (schema.default) {
|
|||
|
report.path.push("default");
|
|||
|
JsonValidation.validate.call(this, report, schema, schema.default);
|
|||
|
report.path.pop();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
var isValid = report.isValid();
|
|||
|
if (isValid) {
|
|||
|
schema.__$validated = true;
|
|||
|
}
|
|||
|
return isValid;
|
|||
|
};
|
|||
|
|
|||
|
},{"./FormatValidators":106,"./JsonValidation":107,"./Report":109,"./Utils":113}],113:[function(require,module,exports){
|
|||
|
"use strict";
|
|||
|
|
|||
|
exports.jsonSymbol = Symbol.for("z-schema/json");
|
|||
|
|
|||
|
exports.schemaSymbol = Symbol.for("z-schema/schema");
|
|||
|
|
|||
|
/**
|
|||
|
* @param {object} obj
|
|||
|
*
|
|||
|
* @returns {string[]}
|
|||
|
*/
|
|||
|
var sortedKeys = exports.sortedKeys = function (obj) {
|
|||
|
return Object.keys(obj).sort();
|
|||
|
};
|
|||
|
|
|||
|
/**
|
|||
|
*
|
|||
|
* @param {string} uri
|
|||
|
*
|
|||
|
* @returns {boolean}
|
|||
|
*/
|
|||
|
exports.isAbsoluteUri = function (uri) {
|
|||
|
return /^https?:\/\//.test(uri);
|
|||
|
};
|
|||
|
|
|||
|
/**
|
|||
|
*
|
|||
|
* @param {string} uri
|
|||
|
*
|
|||
|
* @returns {boolean}
|
|||
|
*/
|
|||
|
exports.isRelativeUri = function (uri) {
|
|||
|
// relative URIs that end with a hash sign, issue #56
|
|||
|
return /.+#/.test(uri);
|
|||
|
};
|
|||
|
|
|||
|
exports.whatIs = function (what) {
|
|||
|
|
|||
|
var to = typeof what;
|
|||
|
|
|||
|
if (to === "object") {
|
|||
|
if (what === null) {
|
|||
|
return "null";
|
|||
|
}
|
|||
|
if (Array.isArray(what)) {
|
|||
|
return "array";
|
|||
|
}
|
|||
|
return "object"; // typeof what === 'object' && what === Object(what) && !Array.isArray(what);
|
|||
|
}
|
|||
|
|
|||
|
if (to === "number") {
|
|||
|
if (Number.isFinite(what)) {
|
|||
|
if (what % 1 === 0) {
|
|||
|
return "integer";
|
|||
|
} else {
|
|||
|
return "number";
|
|||
|
}
|
|||
|
}
|
|||
|
if (Number.isNaN(what)) {
|
|||
|
return "not-a-number";
|
|||
|
}
|
|||
|
return "unknown-number";
|
|||
|
}
|
|||
|
|
|||
|
return to; // undefined, boolean, string, function
|
|||
|
|
|||
|
};
|
|||
|
|
|||
|
/**
|
|||
|
*
|
|||
|
* @param {*} json1
|
|||
|
* @param {*} json2
|
|||
|
* @param {*} [options]
|
|||
|
*
|
|||
|
* @returns {boolean}
|
|||
|
*/
|
|||
|
exports.areEqual = function areEqual(json1, json2, options) {
|
|||
|
|
|||
|
options = options || {};
|
|||
|
var caseInsensitiveComparison = options.caseInsensitiveComparison || false;
|
|||
|
|
|||
|
// http://json-schema.org/latest/json-schema-core.html#rfc.section.3.6
|
|||
|
|
|||
|
// Two JSON values are said to be equal if and only if:
|
|||
|
// both are nulls; or
|
|||
|
// both are booleans, and have the same value; or
|
|||
|
// both are strings, and have the same value; or
|
|||
|
// both are numbers, and have the same mathematical value; or
|
|||
|
if (json1 === json2) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
if (
|
|||
|
caseInsensitiveComparison === true &&
|
|||
|
typeof json1 === "string" && typeof json2 === "string" &&
|
|||
|
json1.toUpperCase() === json2.toUpperCase()) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
var i, len;
|
|||
|
|
|||
|
// both are arrays, and:
|
|||
|
if (Array.isArray(json1) && Array.isArray(json2)) {
|
|||
|
// have the same number of items; and
|
|||
|
if (json1.length !== json2.length) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
// items at the same index are equal according to this definition; or
|
|||
|
len = json1.length;
|
|||
|
for (i = 0; i < len; i++) {
|
|||
|
if (!areEqual(json1[i], json2[i], { caseInsensitiveComparison: caseInsensitiveComparison })) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
// both are objects, and:
|
|||
|
if (exports.whatIs(json1) === "object" && exports.whatIs(json2) === "object") {
|
|||
|
// have the same set of property names; and
|
|||
|
var keys1 = sortedKeys(json1);
|
|||
|
var keys2 = sortedKeys(json2);
|
|||
|
if (!areEqual(keys1, keys2, { caseInsensitiveComparison: caseInsensitiveComparison })) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
// values for a same property name are equal according to this definition.
|
|||
|
len = keys1.length;
|
|||
|
for (i = 0; i < len; i++) {
|
|||
|
if (!areEqual(json1[keys1[i]], json2[keys1[i]], { caseInsensitiveComparison: caseInsensitiveComparison })) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
};
|
|||
|
|
|||
|
/**
|
|||
|
*
|
|||
|
* @param {*[]} arr
|
|||
|
* @param {number[]} [indexes]
|
|||
|
*
|
|||
|
* @returns {boolean}
|
|||
|
*/
|
|||
|
exports.isUniqueArray = function (arr, indexes) {
|
|||
|
var i, j, l = arr.length;
|
|||
|
for (i = 0; i < l; i++) {
|
|||
|
for (j = i + 1; j < l; j++) {
|
|||
|
if (exports.areEqual(arr[i], arr[j])) {
|
|||
|
if (indexes) { indexes.push(i, j); }
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return true;
|
|||
|
};
|
|||
|
|
|||
|
/**
|
|||
|
*
|
|||
|
* @param {*} bigSet
|
|||
|
* @param {*} subSet
|
|||
|
*
|
|||
|
* @returns {*[]}
|
|||
|
*/
|
|||
|
exports.difference = function (bigSet, subSet) {
|
|||
|
var arr = [],
|
|||
|
idx = bigSet.length;
|
|||
|
while (idx--) {
|
|||
|
if (subSet.indexOf(bigSet[idx]) === -1) {
|
|||
|
arr.push(bigSet[idx]);
|
|||
|
}
|
|||
|
}
|
|||
|
return arr;
|
|||
|
};
|
|||
|
|
|||
|
// NOT a deep version of clone
|
|||
|
exports.clone = function (src) {
|
|||
|
if (typeof src === "undefined") { return void 0; }
|
|||
|
if (typeof src !== "object" || src === null) { return src; }
|
|||
|
var res, idx;
|
|||
|
if (Array.isArray(src)) {
|
|||
|
res = [];
|
|||
|
idx = src.length;
|
|||
|
while (idx--) {
|
|||
|
res[idx] = src[idx];
|
|||
|
}
|
|||
|
} else {
|
|||
|
res = {};
|
|||
|
var keys = Object.keys(src);
|
|||
|
idx = keys.length;
|
|||
|
while (idx--) {
|
|||
|
var key = keys[idx];
|
|||
|
res[key] = src[key];
|
|||
|
}
|
|||
|
}
|
|||
|
return res;
|
|||
|
};
|
|||
|
|
|||
|
exports.cloneDeep = function (src) {
|
|||
|
var vidx = 0, visited = new Map(), cloned = [];
|
|||
|
function cloneDeep(src) {
|
|||
|
if (typeof src !== "object" || src === null) { return src; }
|
|||
|
var res, idx, cidx;
|
|||
|
|
|||
|
cidx = visited.get(src);
|
|||
|
if (cidx !== undefined) { return cloned[cidx]; }
|
|||
|
|
|||
|
visited.set(src, vidx++);
|
|||
|
if (Array.isArray(src)) {
|
|||
|
res = [];
|
|||
|
cloned.push(res);
|
|||
|
idx = src.length;
|
|||
|
while (idx--) {
|
|||
|
res[idx] = cloneDeep(src[idx]);
|
|||
|
}
|
|||
|
} else {
|
|||
|
res = {};
|
|||
|
cloned.push(res);
|
|||
|
var keys = Object.keys(src);
|
|||
|
idx = keys.length;
|
|||
|
while (idx--) {
|
|||
|
var key = keys[idx];
|
|||
|
res[key] = cloneDeep(src[key]);
|
|||
|
}
|
|||
|
}
|
|||
|
return res;
|
|||
|
}
|
|||
|
return cloneDeep(src);
|
|||
|
};
|
|||
|
|
|||
|
/*
|
|||
|
following function comes from punycode.js library
|
|||
|
see: https://github.com/bestiejs/punycode.js
|
|||
|
*/
|
|||
|
/*jshint -W016*/
|
|||
|
/**
|
|||
|
* Creates an array containing the numeric code points of each Unicode
|
|||
|
* character in the string. While JavaScript uses UCS-2 internally,
|
|||
|
* this function will convert a pair of surrogate halves (each of which
|
|||
|
* UCS-2 exposes as separate characters) into a single code point,
|
|||
|
* matching UTF-16.
|
|||
|
* @see `punycode.ucs2.encode`
|
|||
|
* @see <https://mathiasbynens.be/notes/javascript-encoding>
|
|||
|
* @memberOf punycode.ucs2
|
|||
|
* @name decode
|
|||
|
* @param {String} string The Unicode input string (UCS-2).
|
|||
|
* @returns {Array} The new array of code points.
|
|||
|
*/
|
|||
|
exports.ucs2decode = function (string) {
|
|||
|
var output = [],
|
|||
|
counter = 0,
|
|||
|
length = string.length,
|
|||
|
value,
|
|||
|
extra;
|
|||
|
while (counter < length) {
|
|||
|
value = string.charCodeAt(counter++);
|
|||
|
if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
|
|||
|
// high surrogate, and there is a next character
|
|||
|
extra = string.charCodeAt(counter++);
|
|||
|
if ((extra & 0xFC00) == 0xDC00) { // low surrogate
|
|||
|
output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
|
|||
|
} else {
|
|||
|
// unmatched surrogate; only append this code unit, in case the next
|
|||
|
// code unit is the high surrogate of a surrogate pair
|
|||
|
output.push(value);
|
|||
|
counter--;
|
|||
|
}
|
|||
|
} else {
|
|||
|
output.push(value);
|
|||
|
}
|
|||
|
}
|
|||
|
return output;
|
|||
|
};
|
|||
|
/*jshint +W016*/
|
|||
|
|
|||
|
},{}],114:[function(require,module,exports){
|
|||
|
(function (process){(function (){
|
|||
|
"use strict";
|
|||
|
|
|||
|
require("./Polyfills");
|
|||
|
var get = require("lodash.get");
|
|||
|
var Report = require("./Report");
|
|||
|
var FormatValidators = require("./FormatValidators");
|
|||
|
var JsonValidation = require("./JsonValidation");
|
|||
|
var SchemaCache = require("./SchemaCache");
|
|||
|
var SchemaCompilation = require("./SchemaCompilation");
|
|||
|
var SchemaValidation = require("./SchemaValidation");
|
|||
|
var Utils = require("./Utils");
|
|||
|
var Draft4Schema = require("./schemas/schema.json");
|
|||
|
var Draft4HyperSchema = require("./schemas/hyper-schema.json");
|
|||
|
|
|||
|
/**
|
|||
|
* default options
|
|||
|
*/
|
|||
|
var defaultOptions = {
|
|||
|
// default timeout for all async tasks
|
|||
|
asyncTimeout: 2000,
|
|||
|
// force additionalProperties and additionalItems to be defined on "object" and "array" types
|
|||
|
forceAdditional: false,
|
|||
|
// assume additionalProperties and additionalItems are defined as "false" where appropriate
|
|||
|
assumeAdditional: false,
|
|||
|
// do case insensitive comparison for enums
|
|||
|
enumCaseInsensitiveComparison: false,
|
|||
|
// force items to be defined on "array" types
|
|||
|
forceItems: false,
|
|||
|
// force minItems to be defined on "array" types
|
|||
|
forceMinItems: false,
|
|||
|
// force maxItems to be defined on "array" types
|
|||
|
forceMaxItems: false,
|
|||
|
// force minLength to be defined on "string" types
|
|||
|
forceMinLength: false,
|
|||
|
// force maxLength to be defined on "string" types
|
|||
|
forceMaxLength: false,
|
|||
|
// force properties or patternProperties to be defined on "object" types
|
|||
|
forceProperties: false,
|
|||
|
// ignore references that cannot be resolved (remote schemas) // TODO: make sure this is only for remote schemas, not local ones
|
|||
|
ignoreUnresolvableReferences: false,
|
|||
|
// disallow usage of keywords that this validator can't handle
|
|||
|
noExtraKeywords: false,
|
|||
|
// disallow usage of schema's without "type" defined
|
|||
|
noTypeless: false,
|
|||
|
// disallow zero length strings in validated objects
|
|||
|
noEmptyStrings: false,
|
|||
|
// disallow zero length arrays in validated objects
|
|||
|
noEmptyArrays: false,
|
|||
|
// forces "uri" format to be in fully rfc3986 compliant
|
|||
|
strictUris: false,
|
|||
|
// turn on some of the above
|
|||
|
strictMode: false,
|
|||
|
// report error paths as an array of path segments to get to the offending node
|
|||
|
reportPathAsArray: false,
|
|||
|
// stop validation as soon as an error is found
|
|||
|
breakOnFirstError: false,
|
|||
|
// check if schema follows best practices and common sense
|
|||
|
pedanticCheck: false,
|
|||
|
// ignore unknown formats (do not report them as an error)
|
|||
|
ignoreUnknownFormats: false,
|
|||
|
// function to be called on every schema
|
|||
|
customValidator: null
|
|||
|
};
|
|||
|
|
|||
|
function normalizeOptions(options) {
|
|||
|
var normalized;
|
|||
|
|
|||
|
// options
|
|||
|
if (typeof options === "object") {
|
|||
|
var keys = Object.keys(options),
|
|||
|
idx = keys.length,
|
|||
|
key;
|
|||
|
|
|||
|
// check that the options are correctly configured
|
|||
|
while (idx--) {
|
|||
|
key = keys[idx];
|
|||
|
if (defaultOptions[key] === undefined) {
|
|||
|
throw new Error("Unexpected option passed to constructor: " + key);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// copy the default options into passed options
|
|||
|
keys = Object.keys(defaultOptions);
|
|||
|
idx = keys.length;
|
|||
|
while (idx--) {
|
|||
|
key = keys[idx];
|
|||
|
if (options[key] === undefined) {
|
|||
|
options[key] = Utils.clone(defaultOptions[key]);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
normalized = options;
|
|||
|
} else {
|
|||
|
normalized = Utils.clone(defaultOptions);
|
|||
|
}
|
|||
|
|
|||
|
if (normalized.strictMode === true) {
|
|||
|
normalized.forceAdditional = true;
|
|||
|
normalized.forceItems = true;
|
|||
|
normalized.forceMaxLength = true;
|
|||
|
normalized.forceProperties = true;
|
|||
|
normalized.noExtraKeywords = true;
|
|||
|
normalized.noTypeless = true;
|
|||
|
normalized.noEmptyStrings = true;
|
|||
|
normalized.noEmptyArrays = true;
|
|||
|
}
|
|||
|
|
|||
|
return normalized;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @class
|
|||
|
*
|
|||
|
* @param {*} [options]
|
|||
|
*/
|
|||
|
function ZSchema(options) {
|
|||
|
this.cache = {};
|
|||
|
this.referenceCache = [];
|
|||
|
this.validateOptions = {};
|
|||
|
|
|||
|
this.options = normalizeOptions(options);
|
|||
|
|
|||
|
// Disable strict validation for the built-in schemas
|
|||
|
var metaschemaOptions = normalizeOptions({ });
|
|||
|
|
|||
|
this.setRemoteReference("http://json-schema.org/draft-04/schema", Draft4Schema, metaschemaOptions);
|
|||
|
this.setRemoteReference("http://json-schema.org/draft-04/hyper-schema", Draft4HyperSchema, metaschemaOptions);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* instance methods
|
|||
|
*
|
|||
|
* @param {*} schema
|
|||
|
*
|
|||
|
* @returns {boolean}
|
|||
|
*/
|
|||
|
ZSchema.prototype.compileSchema = function (schema) {
|
|||
|
var report = new Report(this.options);
|
|||
|
|
|||
|
schema = SchemaCache.getSchema.call(this, report, schema);
|
|||
|
|
|||
|
SchemaCompilation.compileSchema.call(this, report, schema);
|
|||
|
|
|||
|
this.lastReport = report;
|
|||
|
return report.isValid();
|
|||
|
};
|
|||
|
|
|||
|
/**
|
|||
|
*
|
|||
|
* @param {*} schema
|
|||
|
*
|
|||
|
* @returns {boolean}
|
|||
|
*/
|
|||
|
ZSchema.prototype.validateSchema = function (schema) {
|
|||
|
if (Array.isArray(schema) && schema.length === 0) {
|
|||
|
throw new Error(".validateSchema was called with an empty array");
|
|||
|
}
|
|||
|
|
|||
|
var report = new Report(this.options);
|
|||
|
|
|||
|
schema = SchemaCache.getSchema.call(this, report, schema);
|
|||
|
|
|||
|
var compiled = SchemaCompilation.compileSchema.call(this, report, schema);
|
|||
|
if (compiled) { SchemaValidation.validateSchema.call(this, report, schema); }
|
|||
|
|
|||
|
this.lastReport = report;
|
|||
|
return report.isValid();
|
|||
|
};
|
|||
|
|
|||
|
/**
|
|||
|
*
|
|||
|
* @param {*} json
|
|||
|
* @param {*} schema
|
|||
|
* @param {*} [options]
|
|||
|
* @param {function(*, *)} [callback]
|
|||
|
*
|
|||
|
* @returns {boolean}
|
|||
|
*/
|
|||
|
ZSchema.prototype.validate = function (json, schema, options, callback) {
|
|||
|
|
|||
|
if (Utils.whatIs(options) === "function") {
|
|||
|
callback = options;
|
|||
|
options = {};
|
|||
|
}
|
|||
|
if (!options) { options = {}; }
|
|||
|
|
|||
|
this.validateOptions = options;
|
|||
|
|
|||
|
var whatIs = Utils.whatIs(schema);
|
|||
|
if (whatIs !== "string" && whatIs !== "object") {
|
|||
|
var e = new Error("Invalid .validate call - schema must be a string or object but " + whatIs + " was passed!");
|
|||
|
if (callback) {
|
|||
|
process.nextTick(function () {
|
|||
|
callback(e, false);
|
|||
|
});
|
|||
|
return;
|
|||
|
}
|
|||
|
throw e;
|
|||
|
}
|
|||
|
|
|||
|
var foundError = false;
|
|||
|
var report = new Report(this.options);
|
|||
|
report.json = json;
|
|||
|
|
|||
|
if (typeof schema === "string") {
|
|||
|
var schemaName = schema;
|
|||
|
schema = SchemaCache.getSchema.call(this, report, schemaName);
|
|||
|
if (!schema) {
|
|||
|
throw new Error("Schema with id '" + schemaName + "' wasn't found in the validator cache!");
|
|||
|
}
|
|||
|
} else {
|
|||
|
schema = SchemaCache.getSchema.call(this, report, schema);
|
|||
|
}
|
|||
|
|
|||
|
var compiled = false;
|
|||
|
if (!foundError) {
|
|||
|
compiled = SchemaCompilation.compileSchema.call(this, report, schema);
|
|||
|
}
|
|||
|
if (!compiled) {
|
|||
|
this.lastReport = report;
|
|||
|
foundError = true;
|
|||
|
}
|
|||
|
|
|||
|
var validated = false;
|
|||
|
if (!foundError) {
|
|||
|
validated = SchemaValidation.validateSchema.call(this, report, schema);
|
|||
|
}
|
|||
|
if (!validated) {
|
|||
|
this.lastReport = report;
|
|||
|
foundError = true;
|
|||
|
}
|
|||
|
|
|||
|
if (options.schemaPath) {
|
|||
|
report.rootSchema = schema;
|
|||
|
schema = get(schema, options.schemaPath);
|
|||
|
if (!schema) {
|
|||
|
throw new Error("Schema path '" + options.schemaPath + "' wasn't found in the schema!");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (!foundError) {
|
|||
|
JsonValidation.validate.call(this, report, schema, json);
|
|||
|
}
|
|||
|
|
|||
|
if (callback) {
|
|||
|
report.processAsyncTasks(this.options.asyncTimeout, callback);
|
|||
|
return;
|
|||
|
} else if (report.asyncTasks.length > 0) {
|
|||
|
throw new Error("This validation has async tasks and cannot be done in sync mode, please provide callback argument.");
|
|||
|
}
|
|||
|
|
|||
|
// assign lastReport so errors are retrievable in sync mode
|
|||
|
this.lastReport = report;
|
|||
|
return report.isValid();
|
|||
|
};
|
|||
|
ZSchema.prototype.getLastError = function () {
|
|||
|
if (this.lastReport.errors.length === 0) {
|
|||
|
return null;
|
|||
|
}
|
|||
|
var e = new Error();
|
|||
|
e.name = "z-schema validation error";
|
|||
|
e.message = this.lastReport.commonErrorMessage;
|
|||
|
e.details = this.lastReport.errors;
|
|||
|
return e;
|
|||
|
};
|
|||
|
ZSchema.prototype.getLastErrors = function () {
|
|||
|
return this.lastReport && this.lastReport.errors.length > 0 ? this.lastReport.errors : null;
|
|||
|
};
|
|||
|
ZSchema.prototype.getMissingReferences = function (arr) {
|
|||
|
arr = arr || this.lastReport.errors;
|
|||
|
var res = [],
|
|||
|
idx = arr.length;
|
|||
|
while (idx--) {
|
|||
|
var error = arr[idx];
|
|||
|
if (error.code === "UNRESOLVABLE_REFERENCE") {
|
|||
|
var reference = error.params[0];
|
|||
|
if (res.indexOf(reference) === -1) {
|
|||
|
res.push(reference);
|
|||
|
}
|
|||
|
}
|
|||
|
if (error.inner) {
|
|||
|
res = res.concat(this.getMissingReferences(error.inner));
|
|||
|
}
|
|||
|
}
|
|||
|
return res;
|
|||
|
};
|
|||
|
ZSchema.prototype.getMissingRemoteReferences = function () {
|
|||
|
var missingReferences = this.getMissingReferences(),
|
|||
|
missingRemoteReferences = [],
|
|||
|
idx = missingReferences.length;
|
|||
|
while (idx--) {
|
|||
|
var remoteReference = SchemaCache.getRemotePath(missingReferences[idx]);
|
|||
|
if (remoteReference && missingRemoteReferences.indexOf(remoteReference) === -1) {
|
|||
|
missingRemoteReferences.push(remoteReference);
|
|||
|
}
|
|||
|
}
|
|||
|
return missingRemoteReferences;
|
|||
|
};
|
|||
|
ZSchema.prototype.setRemoteReference = function (uri, schema, validationOptions) {
|
|||
|
if (typeof schema === "string") {
|
|||
|
schema = JSON.parse(schema);
|
|||
|
} else {
|
|||
|
schema = Utils.cloneDeep(schema);
|
|||
|
}
|
|||
|
|
|||
|
if (validationOptions) {
|
|||
|
schema.__$validationOptions = normalizeOptions(validationOptions);
|
|||
|
}
|
|||
|
|
|||
|
SchemaCache.cacheSchemaByUri.call(this, uri, schema);
|
|||
|
};
|
|||
|
ZSchema.prototype.getResolvedSchema = function (schema) {
|
|||
|
var report = new Report(this.options);
|
|||
|
schema = SchemaCache.getSchema.call(this, report, schema);
|
|||
|
|
|||
|
// clone before making any modifications
|
|||
|
schema = Utils.cloneDeep(schema);
|
|||
|
|
|||
|
var visited = [];
|
|||
|
|
|||
|
// clean-up the schema and resolve references
|
|||
|
var cleanup = function (schema) {
|
|||
|
var key,
|
|||
|
typeOf = Utils.whatIs(schema);
|
|||
|
if (typeOf !== "object" && typeOf !== "array") {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (schema.___$visited) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
schema.___$visited = true;
|
|||
|
visited.push(schema);
|
|||
|
|
|||
|
if (schema.$ref && schema.__$refResolved) {
|
|||
|
var from = schema.__$refResolved;
|
|||
|
var to = schema;
|
|||
|
delete schema.$ref;
|
|||
|
delete schema.__$refResolved;
|
|||
|
for (key in from) {
|
|||
|
if (from.hasOwnProperty(key)) {
|
|||
|
to[key] = from[key];
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
for (key in schema) {
|
|||
|
if (schema.hasOwnProperty(key)) {
|
|||
|
if (key.indexOf("__$") === 0) {
|
|||
|
delete schema[key];
|
|||
|
} else {
|
|||
|
cleanup(schema[key]);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
cleanup(schema);
|
|||
|
visited.forEach(function (s) {
|
|||
|
delete s.___$visited;
|
|||
|
});
|
|||
|
|
|||
|
this.lastReport = report;
|
|||
|
if (report.isValid()) {
|
|||
|
return schema;
|
|||
|
} else {
|
|||
|
throw this.getLastError();
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
/**
|
|||
|
*
|
|||
|
* @param {*} schemaReader
|
|||
|
*
|
|||
|
* @returns {void}
|
|||
|
*/
|
|||
|
ZSchema.prototype.setSchemaReader = function (schemaReader) {
|
|||
|
return ZSchema.setSchemaReader(schemaReader);
|
|||
|
};
|
|||
|
|
|||
|
ZSchema.prototype.getSchemaReader = function () {
|
|||
|
return ZSchema.schemaReader;
|
|||
|
};
|
|||
|
|
|||
|
ZSchema.schemaReader = undefined;
|
|||
|
/*
|
|||
|
static methods
|
|||
|
*/
|
|||
|
ZSchema.setSchemaReader = function (schemaReader) {
|
|||
|
ZSchema.schemaReader = schemaReader;
|
|||
|
};
|
|||
|
ZSchema.registerFormat = function (formatName, validatorFunction) {
|
|||
|
FormatValidators[formatName] = validatorFunction;
|
|||
|
};
|
|||
|
ZSchema.unregisterFormat = function (formatName) {
|
|||
|
delete FormatValidators[formatName];
|
|||
|
};
|
|||
|
ZSchema.getRegisteredFormats = function () {
|
|||
|
return Object.keys(FormatValidators);
|
|||
|
};
|
|||
|
ZSchema.getDefaultOptions = function () {
|
|||
|
return Utils.cloneDeep(defaultOptions);
|
|||
|
};
|
|||
|
|
|||
|
ZSchema.schemaSymbol = Utils.schemaSymbol;
|
|||
|
|
|||
|
ZSchema.jsonSymbol = Utils.jsonSymbol;
|
|||
|
|
|||
|
module.exports = ZSchema;
|
|||
|
|
|||
|
}).call(this)}).call(this,require('_process'))
|
|||
|
},{"./FormatValidators":106,"./JsonValidation":107,"./Polyfills":108,"./Report":109,"./SchemaCache":110,"./SchemaCompilation":111,"./SchemaValidation":112,"./Utils":113,"./schemas/hyper-schema.json":115,"./schemas/schema.json":116,"_process":3,"lodash.get":1}],115:[function(require,module,exports){
|
|||
|
module.exports={
|
|||
|
"$schema": "http://json-schema.org/draft-04/hyper-schema#",
|
|||
|
"id": "http://json-schema.org/draft-04/hyper-schema#",
|
|||
|
"title": "JSON Hyper-Schema",
|
|||
|
"allOf": [
|
|||
|
{
|
|||
|
"$ref": "http://json-schema.org/draft-04/schema#"
|
|||
|
}
|
|||
|
],
|
|||
|
"properties": {
|
|||
|
"additionalItems": {
|
|||
|
"anyOf": [
|
|||
|
{
|
|||
|
"type": "boolean"
|
|||
|
},
|
|||
|
{
|
|||
|
"$ref": "#"
|
|||
|
}
|
|||
|
]
|
|||
|
},
|
|||
|
"additionalProperties": {
|
|||
|
"anyOf": [
|
|||
|
{
|
|||
|
"type": "boolean"
|
|||
|
},
|
|||
|
{
|
|||
|
"$ref": "#"
|
|||
|
}
|
|||
|
]
|
|||
|
},
|
|||
|
"dependencies": {
|
|||
|
"additionalProperties": {
|
|||
|
"anyOf": [
|
|||
|
{
|
|||
|
"$ref": "#"
|
|||
|
},
|
|||
|
{
|
|||
|
"type": "array"
|
|||
|
}
|
|||
|
]
|
|||
|
}
|
|||
|
},
|
|||
|
"items": {
|
|||
|
"anyOf": [
|
|||
|
{
|
|||
|
"$ref": "#"
|
|||
|
},
|
|||
|
{
|
|||
|
"$ref": "#/definitions/schemaArray"
|
|||
|
}
|
|||
|
]
|
|||
|
},
|
|||
|
"definitions": {
|
|||
|
"additionalProperties": {
|
|||
|
"$ref": "#"
|
|||
|
}
|
|||
|
},
|
|||
|
"patternProperties": {
|
|||
|
"additionalProperties": {
|
|||
|
"$ref": "#"
|
|||
|
}
|
|||
|
},
|
|||
|
"properties": {
|
|||
|
"additionalProperties": {
|
|||
|
"$ref": "#"
|
|||
|
}
|
|||
|
},
|
|||
|
"allOf": {
|
|||
|
"$ref": "#/definitions/schemaArray"
|
|||
|
},
|
|||
|
"anyOf": {
|
|||
|
"$ref": "#/definitions/schemaArray"
|
|||
|
},
|
|||
|
"oneOf": {
|
|||
|
"$ref": "#/definitions/schemaArray"
|
|||
|
},
|
|||
|
"not": {
|
|||
|
"$ref": "#"
|
|||
|
},
|
|||
|
|
|||
|
"links": {
|
|||
|
"type": "array",
|
|||
|
"items": {
|
|||
|
"$ref": "#/definitions/linkDescription"
|
|||
|
}
|
|||
|
},
|
|||
|
"fragmentResolution": {
|
|||
|
"type": "string"
|
|||
|
},
|
|||
|
"media": {
|
|||
|
"type": "object",
|
|||
|
"properties": {
|
|||
|
"type": {
|
|||
|
"description": "A media type, as described in RFC 2046",
|
|||
|
"type": "string"
|
|||
|
},
|
|||
|
"binaryEncoding": {
|
|||
|
"description": "A content encoding scheme, as described in RFC 2045",
|
|||
|
"type": "string"
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
"pathStart": {
|
|||
|
"description": "Instances' URIs must start with this value for this schema to apply to them",
|
|||
|
"type": "string",
|
|||
|
"format": "uri"
|
|||
|
}
|
|||
|
},
|
|||
|
"definitions": {
|
|||
|
"schemaArray": {
|
|||
|
"type": "array",
|
|||
|
"items": {
|
|||
|
"$ref": "#"
|
|||
|
}
|
|||
|
},
|
|||
|
"linkDescription": {
|
|||
|
"title": "Link Description Object",
|
|||
|
"type": "object",
|
|||
|
"required": [ "href", "rel" ],
|
|||
|
"properties": {
|
|||
|
"href": {
|
|||
|
"description": "a URI template, as defined by RFC 6570, with the addition of the $, ( and ) characters for pre-processing",
|
|||
|
"type": "string"
|
|||
|
},
|
|||
|
"rel": {
|
|||
|
"description": "relation to the target resource of the link",
|
|||
|
"type": "string"
|
|||
|
},
|
|||
|
"title": {
|
|||
|
"description": "a title for the link",
|
|||
|
"type": "string"
|
|||
|
},
|
|||
|
"targetSchema": {
|
|||
|
"description": "JSON Schema describing the link target",
|
|||
|
"$ref": "#"
|
|||
|
},
|
|||
|
"mediaType": {
|
|||
|
"description": "media type (as defined by RFC 2046) describing the link target",
|
|||
|
"type": "string"
|
|||
|
},
|
|||
|
"method": {
|
|||
|
"description": "method for requesting the target of the link (e.g. for HTTP this might be \"GET\" or \"DELETE\")",
|
|||
|
"type": "string"
|
|||
|
},
|
|||
|
"encType": {
|
|||
|
"description": "The media type in which to submit data along with the request",
|
|||
|
"type": "string",
|
|||
|
"default": "application/json"
|
|||
|
},
|
|||
|
"schema": {
|
|||
|
"description": "Schema describing the data to submit along with the request",
|
|||
|
"$ref": "#"
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
},{}],116:[function(require,module,exports){
|
|||
|
module.exports={
|
|||
|
"id": "http://json-schema.org/draft-04/schema#",
|
|||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|||
|
"description": "Core schema meta-schema",
|
|||
|
"definitions": {
|
|||
|
"schemaArray": {
|
|||
|
"type": "array",
|
|||
|
"minItems": 1,
|
|||
|
"items": { "$ref": "#" }
|
|||
|
},
|
|||
|
"positiveInteger": {
|
|||
|
"type": "integer",
|
|||
|
"minimum": 0
|
|||
|
},
|
|||
|
"positiveIntegerDefault0": {
|
|||
|
"allOf": [ { "$ref": "#/definitions/positiveInteger" }, { "default": 0 } ]
|
|||
|
},
|
|||
|
"simpleTypes": {
|
|||
|
"enum": [ "array", "boolean", "integer", "null", "number", "object", "string" ]
|
|||
|
},
|
|||
|
"stringArray": {
|
|||
|
"type": "array",
|
|||
|
"items": { "type": "string" },
|
|||
|
"minItems": 1,
|
|||
|
"uniqueItems": true
|
|||
|
}
|
|||
|
},
|
|||
|
"type": "object",
|
|||
|
"properties": {
|
|||
|
"id": {
|
|||
|
"type": "string",
|
|||
|
"format": "uri"
|
|||
|
},
|
|||
|
"$schema": {
|
|||
|
"type": "string",
|
|||
|
"format": "uri"
|
|||
|
},
|
|||
|
"title": {
|
|||
|
"type": "string"
|
|||
|
},
|
|||
|
"description": {
|
|||
|
"type": "string"
|
|||
|
},
|
|||
|
"default": {},
|
|||
|
"multipleOf": {
|
|||
|
"type": "number",
|
|||
|
"minimum": 0,
|
|||
|
"exclusiveMinimum": true
|
|||
|
},
|
|||
|
"maximum": {
|
|||
|
"type": "number"
|
|||
|
},
|
|||
|
"exclusiveMaximum": {
|
|||
|
"type": "boolean",
|
|||
|
"default": false
|
|||
|
},
|
|||
|
"minimum": {
|
|||
|
"type": "number"
|
|||
|
},
|
|||
|
"exclusiveMinimum": {
|
|||
|
"type": "boolean",
|
|||
|
"default": false
|
|||
|
},
|
|||
|
"maxLength": { "$ref": "#/definitions/positiveInteger" },
|
|||
|
"minLength": { "$ref": "#/definitions/positiveIntegerDefault0" },
|
|||
|
"pattern": {
|
|||
|
"type": "string",
|
|||
|
"format": "regex"
|
|||
|
},
|
|||
|
"additionalItems": {
|
|||
|
"anyOf": [
|
|||
|
{ "type": "boolean" },
|
|||
|
{ "$ref": "#" }
|
|||
|
],
|
|||
|
"default": {}
|
|||
|
},
|
|||
|
"items": {
|
|||
|
"anyOf": [
|
|||
|
{ "$ref": "#" },
|
|||
|
{ "$ref": "#/definitions/schemaArray" }
|
|||
|
],
|
|||
|
"default": {}
|
|||
|
},
|
|||
|
"maxItems": { "$ref": "#/definitions/positiveInteger" },
|
|||
|
"minItems": { "$ref": "#/definitions/positiveIntegerDefault0" },
|
|||
|
"uniqueItems": {
|
|||
|
"type": "boolean",
|
|||
|
"default": false
|
|||
|
},
|
|||
|
"maxProperties": { "$ref": "#/definitions/positiveInteger" },
|
|||
|
"minProperties": { "$ref": "#/definitions/positiveIntegerDefault0" },
|
|||
|
"required": { "$ref": "#/definitions/stringArray" },
|
|||
|
"additionalProperties": {
|
|||
|
"anyOf": [
|
|||
|
{ "type": "boolean" },
|
|||
|
{ "$ref": "#" }
|
|||
|
],
|
|||
|
"default": {}
|
|||
|
},
|
|||
|
"definitions": {
|
|||
|
"type": "object",
|
|||
|
"additionalProperties": { "$ref": "#" },
|
|||
|
"default": {}
|
|||
|
},
|
|||
|
"properties": {
|
|||
|
"type": "object",
|
|||
|
"additionalProperties": { "$ref": "#" },
|
|||
|
"default": {}
|
|||
|
},
|
|||
|
"patternProperties": {
|
|||
|
"type": "object",
|
|||
|
"additionalProperties": { "$ref": "#" },
|
|||
|
"default": {}
|
|||
|
},
|
|||
|
"dependencies": {
|
|||
|
"type": "object",
|
|||
|
"additionalProperties": {
|
|||
|
"anyOf": [
|
|||
|
{ "$ref": "#" },
|
|||
|
{ "$ref": "#/definitions/stringArray" }
|
|||
|
]
|
|||
|
}
|
|||
|
},
|
|||
|
"enum": {
|
|||
|
"type": "array",
|
|||
|
"minItems": 1,
|
|||
|
"uniqueItems": true
|
|||
|
},
|
|||
|
"type": {
|
|||
|
"anyOf": [
|
|||
|
{ "$ref": "#/definitions/simpleTypes" },
|
|||
|
{
|
|||
|
"type": "array",
|
|||
|
"items": { "$ref": "#/definitions/simpleTypes" },
|
|||
|
"minItems": 1,
|
|||
|
"uniqueItems": true
|
|||
|
}
|
|||
|
]
|
|||
|
},
|
|||
|
"format": { "type": "string" },
|
|||
|
"allOf": { "$ref": "#/definitions/schemaArray" },
|
|||
|
"anyOf": { "$ref": "#/definitions/schemaArray" },
|
|||
|
"oneOf": { "$ref": "#/definitions/schemaArray" },
|
|||
|
"not": { "$ref": "#" }
|
|||
|
},
|
|||
|
"dependencies": {
|
|||
|
"exclusiveMaximum": [ "maximum" ],
|
|||
|
"exclusiveMinimum": [ "minimum" ]
|
|||
|
},
|
|||
|
"default": {}
|
|||
|
}
|
|||
|
|
|||
|
},{}]},{},[105,106,107,108,109,110,111,112,113,114])(114)
|
|||
|
});
|