You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
30217 lines
903 KiB
30217 lines
903 KiB
(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){
|
|
'use strict'
|
|
|
|
exports.byteLength = byteLength
|
|
exports.toByteArray = toByteArray
|
|
exports.fromByteArray = fromByteArray
|
|
|
|
var lookup = []
|
|
var revLookup = []
|
|
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array
|
|
|
|
var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
|
|
for (var i = 0, len = code.length; i < len; ++i) {
|
|
lookup[i] = code[i]
|
|
revLookup[code.charCodeAt(i)] = i
|
|
}
|
|
|
|
// Support decoding URL-safe base64 strings, as Node.js does.
|
|
// See: https://en.wikipedia.org/wiki/Base64#URL_applications
|
|
revLookup['-'.charCodeAt(0)] = 62
|
|
revLookup['_'.charCodeAt(0)] = 63
|
|
|
|
function getLens (b64) {
|
|
var len = b64.length
|
|
|
|
if (len % 4 > 0) {
|
|
throw new Error('Invalid string. Length must be a multiple of 4')
|
|
}
|
|
|
|
// Trim off extra bytes after placeholder bytes are found
|
|
// See: https://github.com/beatgammit/base64-js/issues/42
|
|
var validLen = b64.indexOf('=')
|
|
if (validLen === -1) validLen = len
|
|
|
|
var placeHoldersLen = validLen === len
|
|
? 0
|
|
: 4 - (validLen % 4)
|
|
|
|
return [validLen, placeHoldersLen]
|
|
}
|
|
|
|
// base64 is 4/3 + up to two characters of the original data
|
|
function byteLength (b64) {
|
|
var lens = getLens(b64)
|
|
var validLen = lens[0]
|
|
var placeHoldersLen = lens[1]
|
|
return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
|
|
}
|
|
|
|
function _byteLength (b64, validLen, placeHoldersLen) {
|
|
return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
|
|
}
|
|
|
|
function toByteArray (b64) {
|
|
var tmp
|
|
var lens = getLens(b64)
|
|
var validLen = lens[0]
|
|
var placeHoldersLen = lens[1]
|
|
|
|
var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))
|
|
|
|
var curByte = 0
|
|
|
|
// if there are placeholders, only get up to the last complete 4 chars
|
|
var len = placeHoldersLen > 0
|
|
? validLen - 4
|
|
: validLen
|
|
|
|
var i
|
|
for (i = 0; i < len; i += 4) {
|
|
tmp =
|
|
(revLookup[b64.charCodeAt(i)] << 18) |
|
|
(revLookup[b64.charCodeAt(i + 1)] << 12) |
|
|
(revLookup[b64.charCodeAt(i + 2)] << 6) |
|
|
revLookup[b64.charCodeAt(i + 3)]
|
|
arr[curByte++] = (tmp >> 16) & 0xFF
|
|
arr[curByte++] = (tmp >> 8) & 0xFF
|
|
arr[curByte++] = tmp & 0xFF
|
|
}
|
|
|
|
if (placeHoldersLen === 2) {
|
|
tmp =
|
|
(revLookup[b64.charCodeAt(i)] << 2) |
|
|
(revLookup[b64.charCodeAt(i + 1)] >> 4)
|
|
arr[curByte++] = tmp & 0xFF
|
|
}
|
|
|
|
if (placeHoldersLen === 1) {
|
|
tmp =
|
|
(revLookup[b64.charCodeAt(i)] << 10) |
|
|
(revLookup[b64.charCodeAt(i + 1)] << 4) |
|
|
(revLookup[b64.charCodeAt(i + 2)] >> 2)
|
|
arr[curByte++] = (tmp >> 8) & 0xFF
|
|
arr[curByte++] = tmp & 0xFF
|
|
}
|
|
|
|
return arr
|
|
}
|
|
|
|
function tripletToBase64 (num) {
|
|
return lookup[num >> 18 & 0x3F] +
|
|
lookup[num >> 12 & 0x3F] +
|
|
lookup[num >> 6 & 0x3F] +
|
|
lookup[num & 0x3F]
|
|
}
|
|
|
|
function encodeChunk (uint8, start, end) {
|
|
var tmp
|
|
var output = []
|
|
for (var i = start; i < end; i += 3) {
|
|
tmp =
|
|
((uint8[i] << 16) & 0xFF0000) +
|
|
((uint8[i + 1] << 8) & 0xFF00) +
|
|
(uint8[i + 2] & 0xFF)
|
|
output.push(tripletToBase64(tmp))
|
|
}
|
|
return output.join('')
|
|
}
|
|
|
|
function fromByteArray (uint8) {
|
|
var tmp
|
|
var len = uint8.length
|
|
var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
|
|
var parts = []
|
|
var maxChunkLength = 16383 // must be multiple of 3
|
|
|
|
// go through the array every three bytes, we'll deal with trailing stuff later
|
|
for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
|
|
parts.push(encodeChunk(
|
|
uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)
|
|
))
|
|
}
|
|
|
|
// pad the end with zeros, but make sure to not forget the extra bytes
|
|
if (extraBytes === 1) {
|
|
tmp = uint8[len - 1]
|
|
parts.push(
|
|
lookup[tmp >> 2] +
|
|
lookup[(tmp << 4) & 0x3F] +
|
|
'=='
|
|
)
|
|
} else if (extraBytes === 2) {
|
|
tmp = (uint8[len - 2] << 8) + uint8[len - 1]
|
|
parts.push(
|
|
lookup[tmp >> 10] +
|
|
lookup[(tmp >> 4) & 0x3F] +
|
|
lookup[(tmp << 2) & 0x3F] +
|
|
'='
|
|
)
|
|
}
|
|
|
|
return parts.join('')
|
|
}
|
|
|
|
},{}],2:[function(require,module,exports){
|
|
|
|
},{}],3:[function(require,module,exports){
|
|
(function (global){
|
|
/*! https://mths.be/punycode v1.4.1 by @mathias */
|
|
;(function(root) {
|
|
|
|
/** Detect free variables */
|
|
var freeExports = typeof exports == 'object' && exports &&
|
|
!exports.nodeType && exports;
|
|
var freeModule = typeof module == 'object' && module &&
|
|
!module.nodeType && module;
|
|
var freeGlobal = typeof global == 'object' && global;
|
|
if (
|
|
freeGlobal.global === freeGlobal ||
|
|
freeGlobal.window === freeGlobal ||
|
|
freeGlobal.self === freeGlobal
|
|
) {
|
|
root = freeGlobal;
|
|
}
|
|
|
|
/**
|
|
* The `punycode` object.
|
|
* @name punycode
|
|
* @type Object
|
|
*/
|
|
var punycode,
|
|
|
|
/** Highest positive signed 32-bit float value */
|
|
maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1
|
|
|
|
/** Bootstring parameters */
|
|
base = 36,
|
|
tMin = 1,
|
|
tMax = 26,
|
|
skew = 38,
|
|
damp = 700,
|
|
initialBias = 72,
|
|
initialN = 128, // 0x80
|
|
delimiter = '-', // '\x2D'
|
|
|
|
/** Regular expressions */
|
|
regexPunycode = /^xn--/,
|
|
regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars
|
|
regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators
|
|
|
|
/** Error messages */
|
|
errors = {
|
|
'overflow': 'Overflow: input needs wider integers to process',
|
|
'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
|
|
'invalid-input': 'Invalid input'
|
|
},
|
|
|
|
/** Convenience shortcuts */
|
|
baseMinusTMin = base - tMin,
|
|
floor = Math.floor,
|
|
stringFromCharCode = String.fromCharCode,
|
|
|
|
/** Temporary variable */
|
|
key;
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
* A generic error utility function.
|
|
* @private
|
|
* @param {String} type The error type.
|
|
* @returns {Error} Throws a `RangeError` with the applicable error message.
|
|
*/
|
|
function error(type) {
|
|
throw new RangeError(errors[type]);
|
|
}
|
|
|
|
/**
|
|
* A generic `Array#map` utility function.
|
|
* @private
|
|
* @param {Array} array The array to iterate over.
|
|
* @param {Function} callback The function that gets called for every array
|
|
* item.
|
|
* @returns {Array} A new array of values returned by the callback function.
|
|
*/
|
|
function map(array, fn) {
|
|
var length = array.length;
|
|
var result = [];
|
|
while (length--) {
|
|
result[length] = fn(array[length]);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* A simple `Array#map`-like wrapper to work with domain name strings or email
|
|
* addresses.
|
|
* @private
|
|
* @param {String} domain The domain name or email address.
|
|
* @param {Function} callback The function that gets called for every
|
|
* character.
|
|
* @returns {Array} A new string of characters returned by the callback
|
|
* function.
|
|
*/
|
|
function mapDomain(string, fn) {
|
|
var parts = string.split('@');
|
|
var result = '';
|
|
if (parts.length > 1) {
|
|
// In email addresses, only the domain name should be punycoded. Leave
|
|
// the local part (i.e. everything up to `@`) intact.
|
|
result = parts[0] + '@';
|
|
string = parts[1];
|
|
}
|
|
// Avoid `split(regex)` for IE8 compatibility. See #17.
|
|
string = string.replace(regexSeparators, '\x2E');
|
|
var labels = string.split('.');
|
|
var encoded = map(labels, fn).join('.');
|
|
return result + encoded;
|
|
}
|
|
|
|
/**
|
|
* 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.
|
|
*/
|
|
function ucs2decode(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;
|
|
}
|
|
|
|
/**
|
|
* Creates a string based on an array of numeric code points.
|
|
* @see `punycode.ucs2.decode`
|
|
* @memberOf punycode.ucs2
|
|
* @name encode
|
|
* @param {Array} codePoints The array of numeric code points.
|
|
* @returns {String} The new Unicode string (UCS-2).
|
|
*/
|
|
function ucs2encode(array) {
|
|
return map(array, function(value) {
|
|
var output = '';
|
|
if (value > 0xFFFF) {
|
|
value -= 0x10000;
|
|
output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
|
|
value = 0xDC00 | value & 0x3FF;
|
|
}
|
|
output += stringFromCharCode(value);
|
|
return output;
|
|
}).join('');
|
|
}
|
|
|
|
/**
|
|
* Converts a basic code point into a digit/integer.
|
|
* @see `digitToBasic()`
|
|
* @private
|
|
* @param {Number} codePoint The basic numeric code point value.
|
|
* @returns {Number} The numeric value of a basic code point (for use in
|
|
* representing integers) in the range `0` to `base - 1`, or `base` if
|
|
* the code point does not represent a value.
|
|
*/
|
|
function basicToDigit(codePoint) {
|
|
if (codePoint - 48 < 10) {
|
|
return codePoint - 22;
|
|
}
|
|
if (codePoint - 65 < 26) {
|
|
return codePoint - 65;
|
|
}
|
|
if (codePoint - 97 < 26) {
|
|
return codePoint - 97;
|
|
}
|
|
return base;
|
|
}
|
|
|
|
/**
|
|
* Converts a digit/integer into a basic code point.
|
|
* @see `basicToDigit()`
|
|
* @private
|
|
* @param {Number} digit The numeric value of a basic code point.
|
|
* @returns {Number} The basic code point whose value (when used for
|
|
* representing integers) is `digit`, which needs to be in the range
|
|
* `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
|
|
* used; else, the lowercase form is used. The behavior is undefined
|
|
* if `flag` is non-zero and `digit` has no uppercase form.
|
|
*/
|
|
function digitToBasic(digit, flag) {
|
|
// 0..25 map to ASCII a..z or A..Z
|
|
// 26..35 map to ASCII 0..9
|
|
return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
|
|
}
|
|
|
|
/**
|
|
* Bias adaptation function as per section 3.4 of RFC 3492.
|
|
* https://tools.ietf.org/html/rfc3492#section-3.4
|
|
* @private
|
|
*/
|
|
function adapt(delta, numPoints, firstTime) {
|
|
var k = 0;
|
|
delta = firstTime ? floor(delta / damp) : delta >> 1;
|
|
delta += floor(delta / numPoints);
|
|
for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {
|
|
delta = floor(delta / baseMinusTMin);
|
|
}
|
|
return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
|
|
}
|
|
|
|
/**
|
|
* Converts a Punycode string of ASCII-only symbols to a string of Unicode
|
|
* symbols.
|
|
* @memberOf punycode
|
|
* @param {String} input The Punycode string of ASCII-only symbols.
|
|
* @returns {String} The resulting string of Unicode symbols.
|
|
*/
|
|
function decode(input) {
|
|
// Don't use UCS-2
|
|
var output = [],
|
|
inputLength = input.length,
|
|
out,
|
|
i = 0,
|
|
n = initialN,
|
|
bias = initialBias,
|
|
basic,
|
|
j,
|
|
index,
|
|
oldi,
|
|
w,
|
|
k,
|
|
digit,
|
|
t,
|
|
/** Cached calculation results */
|
|
baseMinusT;
|
|
|
|
// Handle the basic code points: let `basic` be the number of input code
|
|
// points before the last delimiter, or `0` if there is none, then copy
|
|
// the first basic code points to the output.
|
|
|
|
basic = input.lastIndexOf(delimiter);
|
|
if (basic < 0) {
|
|
basic = 0;
|
|
}
|
|
|
|
for (j = 0; j < basic; ++j) {
|
|
// if it's not a basic code point
|
|
if (input.charCodeAt(j) >= 0x80) {
|
|
error('not-basic');
|
|
}
|
|
output.push(input.charCodeAt(j));
|
|
}
|
|
|
|
// Main decoding loop: start just after the last delimiter if any basic code
|
|
// points were copied; start at the beginning otherwise.
|
|
|
|
for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {
|
|
|
|
// `index` is the index of the next character to be consumed.
|
|
// Decode a generalized variable-length integer into `delta`,
|
|
// which gets added to `i`. The overflow checking is easier
|
|
// if we increase `i` as we go, then subtract off its starting
|
|
// value at the end to obtain `delta`.
|
|
for (oldi = i, w = 1, k = base; /* no condition */; k += base) {
|
|
|
|
if (index >= inputLength) {
|
|
error('invalid-input');
|
|
}
|
|
|
|
digit = basicToDigit(input.charCodeAt(index++));
|
|
|
|
if (digit >= base || digit > floor((maxInt - i) / w)) {
|
|
error('overflow');
|
|
}
|
|
|
|
i += digit * w;
|
|
t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
|
|
|
|
if (digit < t) {
|
|
break;
|
|
}
|
|
|
|
baseMinusT = base - t;
|
|
if (w > floor(maxInt / baseMinusT)) {
|
|
error('overflow');
|
|
}
|
|
|
|
w *= baseMinusT;
|
|
|
|
}
|
|
|
|
out = output.length + 1;
|
|
bias = adapt(i - oldi, out, oldi == 0);
|
|
|
|
// `i` was supposed to wrap around from `out` to `0`,
|
|
// incrementing `n` each time, so we'll fix that now:
|
|
if (floor(i / out) > maxInt - n) {
|
|
error('overflow');
|
|
}
|
|
|
|
n += floor(i / out);
|
|
i %= out;
|
|
|
|
// Insert `n` at position `i` of the output
|
|
output.splice(i++, 0, n);
|
|
|
|
}
|
|
|
|
return ucs2encode(output);
|
|
}
|
|
|
|
/**
|
|
* Converts a string of Unicode symbols (e.g. a domain name label) to a
|
|
* Punycode string of ASCII-only symbols.
|
|
* @memberOf punycode
|
|
* @param {String} input The string of Unicode symbols.
|
|
* @returns {String} The resulting Punycode string of ASCII-only symbols.
|
|
*/
|
|
function encode(input) {
|
|
var n,
|
|
delta,
|
|
handledCPCount,
|
|
basicLength,
|
|
bias,
|
|
j,
|
|
m,
|
|
q,
|
|
k,
|
|
t,
|
|
currentValue,
|
|
output = [],
|
|
/** `inputLength` will hold the number of code points in `input`. */
|
|
inputLength,
|
|
/** Cached calculation results */
|
|
handledCPCountPlusOne,
|
|
baseMinusT,
|
|
qMinusT;
|
|
|
|
// Convert the input in UCS-2 to Unicode
|
|
input = ucs2decode(input);
|
|
|
|
// Cache the length
|
|
inputLength = input.length;
|
|
|
|
// Initialize the state
|
|
n = initialN;
|
|
delta = 0;
|
|
bias = initialBias;
|
|
|
|
// Handle the basic code points
|
|
for (j = 0; j < inputLength; ++j) {
|
|
currentValue = input[j];
|
|
if (currentValue < 0x80) {
|
|
output.push(stringFromCharCode(currentValue));
|
|
}
|
|
}
|
|
|
|
handledCPCount = basicLength = output.length;
|
|
|
|
// `handledCPCount` is the number of code points that have been handled;
|
|
// `basicLength` is the number of basic code points.
|
|
|
|
// Finish the basic string - if it is not empty - with a delimiter
|
|
if (basicLength) {
|
|
output.push(delimiter);
|
|
}
|
|
|
|
// Main encoding loop:
|
|
while (handledCPCount < inputLength) {
|
|
|
|
// All non-basic code points < n have been handled already. Find the next
|
|
// larger one:
|
|
for (m = maxInt, j = 0; j < inputLength; ++j) {
|
|
currentValue = input[j];
|
|
if (currentValue >= n && currentValue < m) {
|
|
m = currentValue;
|
|
}
|
|
}
|
|
|
|
// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
|
|
// but guard against overflow
|
|
handledCPCountPlusOne = handledCPCount + 1;
|
|
if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
|
|
error('overflow');
|
|
}
|
|
|
|
delta += (m - n) * handledCPCountPlusOne;
|
|
n = m;
|
|
|
|
for (j = 0; j < inputLength; ++j) {
|
|
currentValue = input[j];
|
|
|
|
if (currentValue < n && ++delta > maxInt) {
|
|
error('overflow');
|
|
}
|
|
|
|
if (currentValue == n) {
|
|
// Represent delta as a generalized variable-length integer
|
|
for (q = delta, k = base; /* no condition */; k += base) {
|
|
t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
|
|
if (q < t) {
|
|
break;
|
|
}
|
|
qMinusT = q - t;
|
|
baseMinusT = base - t;
|
|
output.push(
|
|
stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))
|
|
);
|
|
q = floor(qMinusT / baseMinusT);
|
|
}
|
|
|
|
output.push(stringFromCharCode(digitToBasic(q, 0)));
|
|
bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
|
|
delta = 0;
|
|
++handledCPCount;
|
|
}
|
|
}
|
|
|
|
++delta;
|
|
++n;
|
|
|
|
}
|
|
return output.join('');
|
|
}
|
|
|
|
/**
|
|
* Converts a Punycode string representing a domain name or an email address
|
|
* to Unicode. Only the Punycoded parts of the input will be converted, i.e.
|
|
* it doesn't matter if you call it on a string that has already been
|
|
* converted to Unicode.
|
|
* @memberOf punycode
|
|
* @param {String} input The Punycoded domain name or email address to
|
|
* convert to Unicode.
|
|
* @returns {String} The Unicode representation of the given Punycode
|
|
* string.
|
|
*/
|
|
function toUnicode(input) {
|
|
return mapDomain(input, function(string) {
|
|
return regexPunycode.test(string)
|
|
? decode(string.slice(4).toLowerCase())
|
|
: string;
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Converts a Unicode string representing a domain name or an email address to
|
|
* Punycode. Only the non-ASCII parts of the domain name will be converted,
|
|
* i.e. it doesn't matter if you call it with a domain that's already in
|
|
* ASCII.
|
|
* @memberOf punycode
|
|
* @param {String} input The domain name or email address to convert, as a
|
|
* Unicode string.
|
|
* @returns {String} The Punycode representation of the given domain name or
|
|
* email address.
|
|
*/
|
|
function toASCII(input) {
|
|
return mapDomain(input, function(string) {
|
|
return regexNonASCII.test(string)
|
|
? 'xn--' + encode(string)
|
|
: string;
|
|
});
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
/** Define the public API */
|
|
punycode = {
|
|
/**
|
|
* A string representing the current Punycode.js version number.
|
|
* @memberOf punycode
|
|
* @type String
|
|
*/
|
|
'version': '1.4.1',
|
|
/**
|
|
* An object of methods to convert from JavaScript's internal character
|
|
* representation (UCS-2) to Unicode code points, and back.
|
|
* @see <https://mathiasbynens.be/notes/javascript-encoding>
|
|
* @memberOf punycode
|
|
* @type Object
|
|
*/
|
|
'ucs2': {
|
|
'decode': ucs2decode,
|
|
'encode': ucs2encode
|
|
},
|
|
'decode': decode,
|
|
'encode': encode,
|
|
'toASCII': toASCII,
|
|
'toUnicode': toUnicode
|
|
};
|
|
|
|
/** Expose `punycode` */
|
|
// Some AMD build optimizers, like r.js, check for specific condition patterns
|
|
// like the following:
|
|
if (
|
|
typeof define == 'function' &&
|
|
typeof define.amd == 'object' &&
|
|
define.amd
|
|
) {
|
|
define('punycode', function() {
|
|
return punycode;
|
|
});
|
|
} else if (freeExports && freeModule) {
|
|
if (module.exports == freeExports) {
|
|
// in Node.js, io.js, or RingoJS v0.8.0+
|
|
freeModule.exports = punycode;
|
|
} else {
|
|
// in Narwhal or RingoJS v0.7.0-
|
|
for (key in punycode) {
|
|
punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);
|
|
}
|
|
}
|
|
} else {
|
|
// in Rhino or a web browser
|
|
root.punycode = punycode;
|
|
}
|
|
|
|
}(this));
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
},{}],4:[function(require,module,exports){
|
|
(function (Buffer){
|
|
/*!
|
|
* The buffer module from node.js, for the browser.
|
|
*
|
|
* @author Feross Aboukhadijeh <https://feross.org>
|
|
* @license MIT
|
|
*/
|
|
/* eslint-disable no-proto */
|
|
|
|
'use strict'
|
|
|
|
var base64 = require('base64-js')
|
|
var ieee754 = require('ieee754')
|
|
|
|
exports.Buffer = Buffer
|
|
exports.SlowBuffer = SlowBuffer
|
|
exports.INSPECT_MAX_BYTES = 50
|
|
|
|
var K_MAX_LENGTH = 0x7fffffff
|
|
exports.kMaxLength = K_MAX_LENGTH
|
|
|
|
/**
|
|
* If `Buffer.TYPED_ARRAY_SUPPORT`:
|
|
* === true Use Uint8Array implementation (fastest)
|
|
* === false Print warning and recommend using `buffer` v4.x which has an Object
|
|
* implementation (most compatible, even IE6)
|
|
*
|
|
* Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
|
|
* Opera 11.6+, iOS 4.2+.
|
|
*
|
|
* We report that the browser does not support typed arrays if the are not subclassable
|
|
* using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`
|
|
* (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support
|
|
* for __proto__ and has a buggy typed array implementation.
|
|
*/
|
|
Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport()
|
|
|
|
if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&
|
|
typeof console.error === 'function') {
|
|
console.error(
|
|
'This browser lacks typed array (Uint8Array) support which is required by ' +
|
|
'`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'
|
|
)
|
|
}
|
|
|
|
function typedArraySupport () {
|
|
// Can typed array instances can be augmented?
|
|
try {
|
|
var arr = new Uint8Array(1)
|
|
arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } }
|
|
return arr.foo() === 42
|
|
} catch (e) {
|
|
return false
|
|
}
|
|
}
|
|
|
|
Object.defineProperty(Buffer.prototype, 'parent', {
|
|
enumerable: true,
|
|
get: function () {
|
|
if (!Buffer.isBuffer(this)) return undefined
|
|
return this.buffer
|
|
}
|
|
})
|
|
|
|
Object.defineProperty(Buffer.prototype, 'offset', {
|
|
enumerable: true,
|
|
get: function () {
|
|
if (!Buffer.isBuffer(this)) return undefined
|
|
return this.byteOffset
|
|
}
|
|
})
|
|
|
|
function createBuffer (length) {
|
|
if (length > K_MAX_LENGTH) {
|
|
throw new RangeError('The value "' + length + '" is invalid for option "size"')
|
|
}
|
|
// Return an augmented `Uint8Array` instance
|
|
var buf = new Uint8Array(length)
|
|
buf.__proto__ = Buffer.prototype
|
|
return buf
|
|
}
|
|
|
|
/**
|
|
* The Buffer constructor returns instances of `Uint8Array` that have their
|
|
* prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
|
|
* `Uint8Array`, so the returned instances will have all the node `Buffer` methods
|
|
* and the `Uint8Array` methods. Square bracket notation works as expected -- it
|
|
* returns a single octet.
|
|
*
|
|
* The `Uint8Array` prototype remains unmodified.
|
|
*/
|
|
|
|
function Buffer (arg, encodingOrOffset, length) {
|
|
// Common case.
|
|
if (typeof arg === 'number') {
|
|
if (typeof encodingOrOffset === 'string') {
|
|
throw new TypeError(
|
|
'The "string" argument must be of type string. Received type number'
|
|
)
|
|
}
|
|
return allocUnsafe(arg)
|
|
}
|
|
return from(arg, encodingOrOffset, length)
|
|
}
|
|
|
|
// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
|
|
if (typeof Symbol !== 'undefined' && Symbol.species != null &&
|
|
Buffer[Symbol.species] === Buffer) {
|
|
Object.defineProperty(Buffer, Symbol.species, {
|
|
value: null,
|
|
configurable: true,
|
|
enumerable: false,
|
|
writable: false
|
|
})
|
|
}
|
|
|
|
Buffer.poolSize = 8192 // not used by this implementation
|
|
|
|
function from (value, encodingOrOffset, length) {
|
|
if (typeof value === 'string') {
|
|
return fromString(value, encodingOrOffset)
|
|
}
|
|
|
|
if (ArrayBuffer.isView(value)) {
|
|
return fromArrayLike(value)
|
|
}
|
|
|
|
if (value == null) {
|
|
throw TypeError(
|
|
'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
|
|
'or Array-like Object. Received type ' + (typeof value)
|
|
)
|
|
}
|
|
|
|
if (isInstance(value, ArrayBuffer) ||
|
|
(value && isInstance(value.buffer, ArrayBuffer))) {
|
|
return fromArrayBuffer(value, encodingOrOffset, length)
|
|
}
|
|
|
|
if (typeof value === 'number') {
|
|
throw new TypeError(
|
|
'The "value" argument must not be of type number. Received type number'
|
|
)
|
|
}
|
|
|
|
var valueOf = value.valueOf && value.valueOf()
|
|
if (valueOf != null && valueOf !== value) {
|
|
return Buffer.from(valueOf, encodingOrOffset, length)
|
|
}
|
|
|
|
var b = fromObject(value)
|
|
if (b) return b
|
|
|
|
if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&
|
|
typeof value[Symbol.toPrimitive] === 'function') {
|
|
return Buffer.from(
|
|
value[Symbol.toPrimitive]('string'), encodingOrOffset, length
|
|
)
|
|
}
|
|
|
|
throw new TypeError(
|
|
'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
|
|
'or Array-like Object. Received type ' + (typeof value)
|
|
)
|
|
}
|
|
|
|
/**
|
|
* Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
|
|
* if value is a number.
|
|
* Buffer.from(str[, encoding])
|
|
* Buffer.from(array)
|
|
* Buffer.from(buffer)
|
|
* Buffer.from(arrayBuffer[, byteOffset[, length]])
|
|
**/
|
|
Buffer.from = function (value, encodingOrOffset, length) {
|
|
return from(value, encodingOrOffset, length)
|
|
}
|
|
|
|
// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:
|
|
// https://github.com/feross/buffer/pull/148
|
|
Buffer.prototype.__proto__ = Uint8Array.prototype
|
|
Buffer.__proto__ = Uint8Array
|
|
|
|
function assertSize (size) {
|
|
if (typeof size !== 'number') {
|
|
throw new TypeError('"size" argument must be of type number')
|
|
} else if (size < 0) {
|
|
throw new RangeError('The value "' + size + '" is invalid for option "size"')
|
|
}
|
|
}
|
|
|
|
function alloc (size, fill, encoding) {
|
|
assertSize(size)
|
|
if (size <= 0) {
|
|
return createBuffer(size)
|
|
}
|
|
if (fill !== undefined) {
|
|
// Only pay attention to encoding if it's a string. This
|
|
// prevents accidentally sending in a number that would
|
|
// be interpretted as a start offset.
|
|
return typeof encoding === 'string'
|
|
? createBuffer(size).fill(fill, encoding)
|
|
: createBuffer(size).fill(fill)
|
|
}
|
|
return createBuffer(size)
|
|
}
|
|
|
|
/**
|
|
* Creates a new filled Buffer instance.
|
|
* alloc(size[, fill[, encoding]])
|
|
**/
|
|
Buffer.alloc = function (size, fill, encoding) {
|
|
return alloc(size, fill, encoding)
|
|
}
|
|
|
|
function allocUnsafe (size) {
|
|
assertSize(size)
|
|
return createBuffer(size < 0 ? 0 : checked(size) | 0)
|
|
}
|
|
|
|
/**
|
|
* Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
|
|
* */
|
|
Buffer.allocUnsafe = function (size) {
|
|
return allocUnsafe(size)
|
|
}
|
|
/**
|
|
* Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
|
|
*/
|
|
Buffer.allocUnsafeSlow = function (size) {
|
|
return allocUnsafe(size)
|
|
}
|
|
|
|
function fromString (string, encoding) {
|
|
if (typeof encoding !== 'string' || encoding === '') {
|
|
encoding = 'utf8'
|
|
}
|
|
|
|
if (!Buffer.isEncoding(encoding)) {
|
|
throw new TypeError('Unknown encoding: ' + encoding)
|
|
}
|
|
|
|
var length = byteLength(string, encoding) | 0
|
|
var buf = createBuffer(length)
|
|
|
|
var actual = buf.write(string, encoding)
|
|
|
|
if (actual !== length) {
|
|
// Writing a hex string, for example, that contains invalid characters will
|
|
// cause everything after the first invalid character to be ignored. (e.g.
|
|
// 'abxxcd' will be treated as 'ab')
|
|
buf = buf.slice(0, actual)
|
|
}
|
|
|
|
return buf
|
|
}
|
|
|
|
function fromArrayLike (array) {
|
|
var length = array.length < 0 ? 0 : checked(array.length) | 0
|
|
var buf = createBuffer(length)
|
|
for (var i = 0; i < length; i += 1) {
|
|
buf[i] = array[i] & 255
|
|
}
|
|
return buf
|
|
}
|
|
|
|
function fromArrayBuffer (array, byteOffset, length) {
|
|
if (byteOffset < 0 || array.byteLength < byteOffset) {
|
|
throw new RangeError('"offset" is outside of buffer bounds')
|
|
}
|
|
|
|
if (array.byteLength < byteOffset + (length || 0)) {
|
|
throw new RangeError('"length" is outside of buffer bounds')
|
|
}
|
|
|
|
var buf
|
|
if (byteOffset === undefined && length === undefined) {
|
|
buf = new Uint8Array(array)
|
|
} else if (length === undefined) {
|
|
buf = new Uint8Array(array, byteOffset)
|
|
} else {
|
|
buf = new Uint8Array(array, byteOffset, length)
|
|
}
|
|
|
|
// Return an augmented `Uint8Array` instance
|
|
buf.__proto__ = Buffer.prototype
|
|
return buf
|
|
}
|
|
|
|
function fromObject (obj) {
|
|
if (Buffer.isBuffer(obj)) {
|
|
var len = checked(obj.length) | 0
|
|
var buf = createBuffer(len)
|
|
|
|
if (buf.length === 0) {
|
|
return buf
|
|
}
|
|
|
|
obj.copy(buf, 0, 0, len)
|
|
return buf
|
|
}
|
|
|
|
if (obj.length !== undefined) {
|
|
if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {
|
|
return createBuffer(0)
|
|
}
|
|
return fromArrayLike(obj)
|
|
}
|
|
|
|
if (obj.type === 'Buffer' && Array.isArray(obj.data)) {
|
|
return fromArrayLike(obj.data)
|
|
}
|
|
}
|
|
|
|
function checked (length) {
|
|
// Note: cannot use `length < K_MAX_LENGTH` here because that fails when
|
|
// length is NaN (which is otherwise coerced to zero.)
|
|
if (length >= K_MAX_LENGTH) {
|
|
throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
|
|
'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')
|
|
}
|
|
return length | 0
|
|
}
|
|
|
|
function SlowBuffer (length) {
|
|
if (+length != length) { // eslint-disable-line eqeqeq
|
|
length = 0
|
|
}
|
|
return Buffer.alloc(+length)
|
|
}
|
|
|
|
Buffer.isBuffer = function isBuffer (b) {
|
|
return b != null && b._isBuffer === true &&
|
|
b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false
|
|
}
|
|
|
|
Buffer.compare = function compare (a, b) {
|
|
if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)
|
|
if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)
|
|
if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
|
|
throw new TypeError(
|
|
'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array'
|
|
)
|
|
}
|
|
|
|
if (a === b) return 0
|
|
|
|
var x = a.length
|
|
var y = b.length
|
|
|
|
for (var i = 0, len = Math.min(x, y); i < len; ++i) {
|
|
if (a[i] !== b[i]) {
|
|
x = a[i]
|
|
y = b[i]
|
|
break
|
|
}
|
|
}
|
|
|
|
if (x < y) return -1
|
|
if (y < x) return 1
|
|
return 0
|
|
}
|
|
|
|
Buffer.isEncoding = function isEncoding (encoding) {
|
|
switch (String(encoding).toLowerCase()) {
|
|
case 'hex':
|
|
case 'utf8':
|
|
case 'utf-8':
|
|
case 'ascii':
|
|
case 'latin1':
|
|
case 'binary':
|
|
case 'base64':
|
|
case 'ucs2':
|
|
case 'ucs-2':
|
|
case 'utf16le':
|
|
case 'utf-16le':
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
Buffer.concat = function concat (list, length) {
|
|
if (!Array.isArray(list)) {
|
|
throw new TypeError('"list" argument must be an Array of Buffers')
|
|
}
|
|
|
|
if (list.length === 0) {
|
|
return Buffer.alloc(0)
|
|
}
|
|
|
|
var i
|
|
if (length === undefined) {
|
|
length = 0
|
|
for (i = 0; i < list.length; ++i) {
|
|
length += list[i].length
|
|
}
|
|
}
|
|
|
|
var buffer = Buffer.allocUnsafe(length)
|
|
var pos = 0
|
|
for (i = 0; i < list.length; ++i) {
|
|
var buf = list[i]
|
|
if (isInstance(buf, Uint8Array)) {
|
|
buf = Buffer.from(buf)
|
|
}
|
|
if (!Buffer.isBuffer(buf)) {
|
|
throw new TypeError('"list" argument must be an Array of Buffers')
|
|
}
|
|
buf.copy(buffer, pos)
|
|
pos += buf.length
|
|
}
|
|
return buffer
|
|
}
|
|
|
|
function byteLength (string, encoding) {
|
|
if (Buffer.isBuffer(string)) {
|
|
return string.length
|
|
}
|
|
if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {
|
|
return string.byteLength
|
|
}
|
|
if (typeof string !== 'string') {
|
|
throw new TypeError(
|
|
'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' +
|
|
'Received type ' + typeof string
|
|
)
|
|
}
|
|
|
|
var len = string.length
|
|
var mustMatch = (arguments.length > 2 && arguments[2] === true)
|
|
if (!mustMatch && len === 0) return 0
|
|
|
|
// Use a for loop to avoid recursion
|
|
var loweredCase = false
|
|
for (;;) {
|
|
switch (encoding) {
|
|
case 'ascii':
|
|
case 'latin1':
|
|
case 'binary':
|
|
return len
|
|
case 'utf8':
|
|
case 'utf-8':
|
|
return utf8ToBytes(string).length
|
|
case 'ucs2':
|
|
case 'ucs-2':
|
|
case 'utf16le':
|
|
case 'utf-16le':
|
|
return len * 2
|
|
case 'hex':
|
|
return len >>> 1
|
|
case 'base64':
|
|
return base64ToBytes(string).length
|
|
default:
|
|
if (loweredCase) {
|
|
return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8
|
|
}
|
|
encoding = ('' + encoding).toLowerCase()
|
|
loweredCase = true
|
|
}
|
|
}
|
|
}
|
|
Buffer.byteLength = byteLength
|
|
|
|
function slowToString (encoding, start, end) {
|
|
var loweredCase = false
|
|
|
|
// No need to verify that "this.length <= MAX_UINT32" since it's a read-only
|
|
// property of a typed array.
|
|
|
|
// This behaves neither like String nor Uint8Array in that we set start/end
|
|
// to their upper/lower bounds if the value passed is out of range.
|
|
// undefined is handled specially as per ECMA-262 6th Edition,
|
|
// Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
|
|
if (start === undefined || start < 0) {
|
|
start = 0
|
|
}
|
|
// Return early if start > this.length. Done here to prevent potential uint32
|
|
// coercion fail below.
|
|
if (start > this.length) {
|
|
return ''
|
|
}
|
|
|
|
if (end === undefined || end > this.length) {
|
|
end = this.length
|
|
}
|
|
|
|
if (end <= 0) {
|
|
return ''
|
|
}
|
|
|
|
// Force coersion to uint32. This will also coerce falsey/NaN values to 0.
|
|
end >>>= 0
|
|
start >>>= 0
|
|
|
|
if (end <= start) {
|
|
return ''
|
|
}
|
|
|
|
if (!encoding) encoding = 'utf8'
|
|
|
|
while (true) {
|
|
switch (encoding) {
|
|
case 'hex':
|
|
return hexSlice(this, start, end)
|
|
|
|
case 'utf8':
|
|
case 'utf-8':
|
|
return utf8Slice(this, start, end)
|
|
|
|
case 'ascii':
|
|
return asciiSlice(this, start, end)
|
|
|
|
case 'latin1':
|
|
case 'binary':
|
|
return latin1Slice(this, start, end)
|
|
|
|
case 'base64':
|
|
return base64Slice(this, start, end)
|
|
|
|
case 'ucs2':
|
|
case 'ucs-2':
|
|
case 'utf16le':
|
|
case 'utf-16le':
|
|
return utf16leSlice(this, start, end)
|
|
|
|
default:
|
|
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
|
|
encoding = (encoding + '').toLowerCase()
|
|
loweredCase = true
|
|
}
|
|
}
|
|
}
|
|
|
|
// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)
|
|
// to detect a Buffer instance. It's not possible to use `instanceof Buffer`
|
|
// reliably in a browserify context because there could be multiple different
|
|
// copies of the 'buffer' package in use. This method works even for Buffer
|
|
// instances that were created from another copy of the `buffer` package.
|
|
// See: https://github.com/feross/buffer/issues/154
|
|
Buffer.prototype._isBuffer = true
|
|
|
|
function swap (b, n, m) {
|
|
var i = b[n]
|
|
b[n] = b[m]
|
|
b[m] = i
|
|
}
|
|
|
|
Buffer.prototype.swap16 = function swap16 () {
|
|
var len = this.length
|
|
if (len % 2 !== 0) {
|
|
throw new RangeError('Buffer size must be a multiple of 16-bits')
|
|
}
|
|
for (var i = 0; i < len; i += 2) {
|
|
swap(this, i, i + 1)
|
|
}
|
|
return this
|
|
}
|
|
|
|
Buffer.prototype.swap32 = function swap32 () {
|
|
var len = this.length
|
|
if (len % 4 !== 0) {
|
|
throw new RangeError('Buffer size must be a multiple of 32-bits')
|
|
}
|
|
for (var i = 0; i < len; i += 4) {
|
|
swap(this, i, i + 3)
|
|
swap(this, i + 1, i + 2)
|
|
}
|
|
return this
|
|
}
|
|
|
|
Buffer.prototype.swap64 = function swap64 () {
|
|
var len = this.length
|
|
if (len % 8 !== 0) {
|
|
throw new RangeError('Buffer size must be a multiple of 64-bits')
|
|
}
|
|
for (var i = 0; i < len; i += 8) {
|
|
swap(this, i, i + 7)
|
|
swap(this, i + 1, i + 6)
|
|
swap(this, i + 2, i + 5)
|
|
swap(this, i + 3, i + 4)
|
|
}
|
|
return this
|
|
}
|
|
|
|
Buffer.prototype.toString = function toString () {
|
|
var length = this.length
|
|
if (length === 0) return ''
|
|
if (arguments.length === 0) return utf8Slice(this, 0, length)
|
|
return slowToString.apply(this, arguments)
|
|
}
|
|
|
|
Buffer.prototype.toLocaleString = Buffer.prototype.toString
|
|
|
|
Buffer.prototype.equals = function equals (b) {
|
|
if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
|
|
if (this === b) return true
|
|
return Buffer.compare(this, b) === 0
|
|
}
|
|
|
|
Buffer.prototype.inspect = function inspect () {
|
|
var str = ''
|
|
var max = exports.INSPECT_MAX_BYTES
|
|
str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()
|
|
if (this.length > max) str += ' ... '
|
|
return '<Buffer ' + str + '>'
|
|
}
|
|
|
|
Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
|
|
if (isInstance(target, Uint8Array)) {
|
|
target = Buffer.from(target, target.offset, target.byteLength)
|
|
}
|
|
if (!Buffer.isBuffer(target)) {
|
|
throw new TypeError(
|
|
'The "target" argument must be one of type Buffer or Uint8Array. ' +
|
|
'Received type ' + (typeof target)
|
|
)
|
|
}
|
|
|
|
if (start === undefined) {
|
|
start = 0
|
|
}
|
|
if (end === undefined) {
|
|
end = target ? target.length : 0
|
|
}
|
|
if (thisStart === undefined) {
|
|
thisStart = 0
|
|
}
|
|
if (thisEnd === undefined) {
|
|
thisEnd = this.length
|
|
}
|
|
|
|
if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
|
|
throw new RangeError('out of range index')
|
|
}
|
|
|
|
if (thisStart >= thisEnd && start >= end) {
|
|
return 0
|
|
}
|
|
if (thisStart >= thisEnd) {
|
|
return -1
|
|
}
|
|
if (start >= end) {
|
|
return 1
|
|
}
|
|
|
|
start >>>= 0
|
|
end >>>= 0
|
|
thisStart >>>= 0
|
|
thisEnd >>>= 0
|
|
|
|
if (this === target) return 0
|
|
|
|
var x = thisEnd - thisStart
|
|
var y = end - start
|
|
var len = Math.min(x, y)
|
|
|
|
var thisCopy = this.slice(thisStart, thisEnd)
|
|
var targetCopy = target.slice(start, end)
|
|
|
|
for (var i = 0; i < len; ++i) {
|
|
if (thisCopy[i] !== targetCopy[i]) {
|
|
x = thisCopy[i]
|
|
y = targetCopy[i]
|
|
break
|
|
}
|
|
}
|
|
|
|
if (x < y) return -1
|
|
if (y < x) return 1
|
|
return 0
|
|
}
|
|
|
|
// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
|
|
// OR the last index of `val` in `buffer` at offset <= `byteOffset`.
|
|
//
|
|
// Arguments:
|
|
// - buffer - a Buffer to search
|
|
// - val - a string, Buffer, or number
|
|
// - byteOffset - an index into `buffer`; will be clamped to an int32
|
|
// - encoding - an optional encoding, relevant is val is a string
|
|
// - dir - true for indexOf, false for lastIndexOf
|
|
function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
|
|
// Empty buffer means no match
|
|
if (buffer.length === 0) return -1
|
|
|
|
// Normalize byteOffset
|
|
if (typeof byteOffset === 'string') {
|
|
encoding = byteOffset
|
|
byteOffset = 0
|
|
} else if (byteOffset > 0x7fffffff) {
|
|
byteOffset = 0x7fffffff
|
|
} else if (byteOffset < -0x80000000) {
|
|
byteOffset = -0x80000000
|
|
}
|
|
byteOffset = +byteOffset // Coerce to Number.
|
|
if (numberIsNaN(byteOffset)) {
|
|
// byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
|
|
byteOffset = dir ? 0 : (buffer.length - 1)
|
|
}
|
|
|
|
// Normalize byteOffset: negative offsets start from the end of the buffer
|
|
if (byteOffset < 0) byteOffset = buffer.length + byteOffset
|
|
if (byteOffset >= buffer.length) {
|
|
if (dir) return -1
|
|
else byteOffset = buffer.length - 1
|
|
} else if (byteOffset < 0) {
|
|
if (dir) byteOffset = 0
|
|
else return -1
|
|
}
|
|
|
|
// Normalize val
|
|
if (typeof val === 'string') {
|
|
val = Buffer.from(val, encoding)
|
|
}
|
|
|
|
// Finally, search either indexOf (if dir is true) or lastIndexOf
|
|
if (Buffer.isBuffer(val)) {
|
|
// Special case: looking for empty string/buffer always fails
|
|
if (val.length === 0) {
|
|
return -1
|
|
}
|
|
return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
|
|
} else if (typeof val === 'number') {
|
|
val = val & 0xFF // Search for a byte value [0-255]
|
|
if (typeof Uint8Array.prototype.indexOf === 'function') {
|
|
if (dir) {
|
|
return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
|
|
} else {
|
|
return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
|
|
}
|
|
}
|
|
return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
|
|
}
|
|
|
|
throw new TypeError('val must be string, number or Buffer')
|
|
}
|
|
|
|
function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
|
|
var indexSize = 1
|
|
var arrLength = arr.length
|
|
var valLength = val.length
|
|
|
|
if (encoding !== undefined) {
|
|
encoding = String(encoding).toLowerCase()
|
|
if (encoding === 'ucs2' || encoding === 'ucs-2' ||
|
|
encoding === 'utf16le' || encoding === 'utf-16le') {
|
|
if (arr.length < 2 || val.length < 2) {
|
|
return -1
|
|
}
|
|
indexSize = 2
|
|
arrLength /= 2
|
|
valLength /= 2
|
|
byteOffset /= 2
|
|
}
|
|
}
|
|
|
|
function read (buf, i) {
|
|
if (indexSize === 1) {
|
|
return buf[i]
|
|
} else {
|
|
return buf.readUInt16BE(i * indexSize)
|
|
}
|
|
}
|
|
|
|
var i
|
|
if (dir) {
|
|
var foundIndex = -1
|
|
for (i = byteOffset; i < arrLength; i++) {
|
|
if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
|
|
if (foundIndex === -1) foundIndex = i
|
|
if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
|
|
} else {
|
|
if (foundIndex !== -1) i -= i - foundIndex
|
|
foundIndex = -1
|
|
}
|
|
}
|
|
} else {
|
|
if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
|
|
for (i = byteOffset; i >= 0; i--) {
|
|
var found = true
|
|
for (var j = 0; j < valLength; j++) {
|
|
if (read(arr, i + j) !== read(val, j)) {
|
|
found = false
|
|
break
|
|
}
|
|
}
|
|
if (found) return i
|
|
}
|
|
}
|
|
|
|
return -1
|
|
}
|
|
|
|
Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
|
|
return this.indexOf(val, byteOffset, encoding) !== -1
|
|
}
|
|
|
|
Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
|
|
return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
|
|
}
|
|
|
|
Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
|
|
return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
|
|
}
|
|
|
|
function hexWrite (buf, string, offset, length) {
|
|
offset = Number(offset) || 0
|
|
var remaining = buf.length - offset
|
|
if (!length) {
|
|
length = remaining
|
|
} else {
|
|
length = Number(length)
|
|
if (length > remaining) {
|
|
length = remaining
|
|
}
|
|
}
|
|
|
|
var strLen = string.length
|
|
|
|
if (length > strLen / 2) {
|
|
length = strLen / 2
|
|
}
|
|
for (var i = 0; i < length; ++i) {
|
|
var parsed = parseInt(string.substr(i * 2, 2), 16)
|
|
if (numberIsNaN(parsed)) return i
|
|
buf[offset + i] = parsed
|
|
}
|
|
return i
|
|
}
|
|
|
|
function utf8Write (buf, string, offset, length) {
|
|
return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
|
|
}
|
|
|
|
function asciiWrite (buf, string, offset, length) {
|
|
return blitBuffer(asciiToBytes(string), buf, offset, length)
|
|
}
|
|
|
|
function latin1Write (buf, string, offset, length) {
|
|
return asciiWrite(buf, string, offset, length)
|
|
}
|
|
|
|
function base64Write (buf, string, offset, length) {
|
|
return blitBuffer(base64ToBytes(string), buf, offset, length)
|
|
}
|
|
|
|
function ucs2Write (buf, string, offset, length) {
|
|
return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
|
|
}
|
|
|
|
Buffer.prototype.write = function write (string, offset, length, encoding) {
|
|
// Buffer#write(string)
|
|
if (offset === undefined) {
|
|
encoding = 'utf8'
|
|
length = this.length
|
|
offset = 0
|
|
// Buffer#write(string, encoding)
|
|
} else if (length === undefined && typeof offset === 'string') {
|
|
encoding = offset
|
|
length = this.length
|
|
offset = 0
|
|
// Buffer#write(string, offset[, length][, encoding])
|
|
} else if (isFinite(offset)) {
|
|
offset = offset >>> 0
|
|
if (isFinite(length)) {
|
|
length = length >>> 0
|
|
if (encoding === undefined) encoding = 'utf8'
|
|
} else {
|
|
encoding = length
|
|
length = undefined
|
|
}
|
|
} else {
|
|
throw new Error(
|
|
'Buffer.write(string, encoding, offset[, length]) is no longer supported'
|
|
)
|
|
}
|
|
|
|
var remaining = this.length - offset
|
|
if (length === undefined || length > remaining) length = remaining
|
|
|
|
if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
|
|
throw new RangeError('Attempt to write outside buffer bounds')
|
|
}
|
|
|
|
if (!encoding) encoding = 'utf8'
|
|
|
|
var loweredCase = false
|
|
for (;;) {
|
|
switch (encoding) {
|
|
case 'hex':
|
|
return hexWrite(this, string, offset, length)
|
|
|
|
case 'utf8':
|
|
case 'utf-8':
|
|
return utf8Write(this, string, offset, length)
|
|
|
|
case 'ascii':
|
|
return asciiWrite(this, string, offset, length)
|
|
|
|
case 'latin1':
|
|
case 'binary':
|
|
return latin1Write(this, string, offset, length)
|
|
|
|
case 'base64':
|
|
// Warning: maxLength not taken into account in base64Write
|
|
return base64Write(this, string, offset, length)
|
|
|
|
case 'ucs2':
|
|
case 'ucs-2':
|
|
case 'utf16le':
|
|
case 'utf-16le':
|
|
return ucs2Write(this, string, offset, length)
|
|
|
|
default:
|
|
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
|
|
encoding = ('' + encoding).toLowerCase()
|
|
loweredCase = true
|
|
}
|
|
}
|
|
}
|
|
|
|
Buffer.prototype.toJSON = function toJSON () {
|
|
return {
|
|
type: 'Buffer',
|
|
data: Array.prototype.slice.call(this._arr || this, 0)
|
|
}
|
|
}
|
|
|
|
function base64Slice (buf, start, end) {
|
|
if (start === 0 && end === buf.length) {
|
|
return base64.fromByteArray(buf)
|
|
} else {
|
|
return base64.fromByteArray(buf.slice(start, end))
|
|
}
|
|
}
|
|
|
|
function utf8Slice (buf, start, end) {
|
|
end = Math.min(buf.length, end)
|
|
var res = []
|
|
|
|
var i = start
|
|
while (i < end) {
|
|
var firstByte = buf[i]
|
|
var codePoint = null
|
|
var bytesPerSequence = (firstByte > 0xEF) ? 4
|
|
: (firstByte > 0xDF) ? 3
|
|
: (firstByte > 0xBF) ? 2
|
|
: 1
|
|
|
|
if (i + bytesPerSequence <= end) {
|
|
var secondByte, thirdByte, fourthByte, tempCodePoint
|
|
|
|
switch (bytesPerSequence) {
|
|
case 1:
|
|
if (firstByte < 0x80) {
|
|
codePoint = firstByte
|
|
}
|
|
break
|
|
case 2:
|
|
secondByte = buf[i + 1]
|
|
if ((secondByte & 0xC0) === 0x80) {
|
|
tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
|
|
if (tempCodePoint > 0x7F) {
|
|
codePoint = tempCodePoint
|
|
}
|
|
}
|
|
break
|
|
case 3:
|
|
secondByte = buf[i + 1]
|
|
thirdByte = buf[i + 2]
|
|
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
|
|
tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
|
|
if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
|
|
codePoint = tempCodePoint
|
|
}
|
|
}
|
|
break
|
|
case 4:
|
|
secondByte = buf[i + 1]
|
|
thirdByte = buf[i + 2]
|
|
fourthByte = buf[i + 3]
|
|
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
|
|
tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
|
|
if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
|
|
codePoint = tempCodePoint
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (codePoint === null) {
|
|
// we did not generate a valid codePoint so insert a
|
|
// replacement char (U+FFFD) and advance only 1 byte
|
|
codePoint = 0xFFFD
|
|
bytesPerSequence = 1
|
|
} else if (codePoint > 0xFFFF) {
|
|
// encode to utf16 (surrogate pair dance)
|
|
codePoint -= 0x10000
|
|
res.push(codePoint >>> 10 & 0x3FF | 0xD800)
|
|
codePoint = 0xDC00 | codePoint & 0x3FF
|
|
}
|
|
|
|
res.push(codePoint)
|
|
i += bytesPerSequence
|
|
}
|
|
|
|
return decodeCodePointsArray(res)
|
|
}
|
|
|
|
// Based on http://stackoverflow.com/a/22747272/680742, the browser with
|
|
// the lowest limit is Chrome, with 0x10000 args.
|
|
// We go 1 magnitude less, for safety
|
|
var MAX_ARGUMENTS_LENGTH = 0x1000
|
|
|
|
function decodeCodePointsArray (codePoints) {
|
|
var len = codePoints.length
|
|
if (len <= MAX_ARGUMENTS_LENGTH) {
|
|
return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
|
|
}
|
|
|
|
// Decode in chunks to avoid "call stack size exceeded".
|
|
var res = ''
|
|
var i = 0
|
|
while (i < len) {
|
|
res += String.fromCharCode.apply(
|
|
String,
|
|
codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
|
|
)
|
|
}
|
|
return res
|
|
}
|
|
|
|
function asciiSlice (buf, start, end) {
|
|
var ret = ''
|
|
end = Math.min(buf.length, end)
|
|
|
|
for (var i = start; i < end; ++i) {
|
|
ret += String.fromCharCode(buf[i] & 0x7F)
|
|
}
|
|
return ret
|
|
}
|
|
|
|
function latin1Slice (buf, start, end) {
|
|
var ret = ''
|
|
end = Math.min(buf.length, end)
|
|
|
|
for (var i = start; i < end; ++i) {
|
|
ret += String.fromCharCode(buf[i])
|
|
}
|
|
return ret
|
|
}
|
|
|
|
function hexSlice (buf, start, end) {
|
|
var len = buf.length
|
|
|
|
if (!start || start < 0) start = 0
|
|
if (!end || end < 0 || end > len) end = len
|
|
|
|
var out = ''
|
|
for (var i = start; i < end; ++i) {
|
|
out += toHex(buf[i])
|
|
}
|
|
return out
|
|
}
|
|
|
|
function utf16leSlice (buf, start, end) {
|
|
var bytes = buf.slice(start, end)
|
|
var res = ''
|
|
for (var i = 0; i < bytes.length; i += 2) {
|
|
res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))
|
|
}
|
|
return res
|
|
}
|
|
|
|
Buffer.prototype.slice = function slice (start, end) {
|
|
var len = this.length
|
|
start = ~~start
|
|
end = end === undefined ? len : ~~end
|
|
|
|
if (start < 0) {
|
|
start += len
|
|
if (start < 0) start = 0
|
|
} else if (start > len) {
|
|
start = len
|
|
}
|
|
|
|
if (end < 0) {
|
|
end += len
|
|
if (end < 0) end = 0
|
|
} else if (end > len) {
|
|
end = len
|
|
}
|
|
|
|
if (end < start) end = start
|
|
|
|
var newBuf = this.subarray(start, end)
|
|
// Return an augmented `Uint8Array` instance
|
|
newBuf.__proto__ = Buffer.prototype
|
|
return newBuf
|
|
}
|
|
|
|
/*
|
|
* Need to make sure that buffer isn't trying to write out of bounds.
|
|
*/
|
|
function checkOffset (offset, ext, length) {
|
|
if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
|
|
if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
|
|
}
|
|
|
|
Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
|
|
offset = offset >>> 0
|
|
byteLength = byteLength >>> 0
|
|
if (!noAssert) checkOffset(offset, byteLength, this.length)
|
|
|
|
var val = this[offset]
|
|
var mul = 1
|
|
var i = 0
|
|
while (++i < byteLength && (mul *= 0x100)) {
|
|
val += this[offset + i] * mul
|
|
}
|
|
|
|
return val
|
|
}
|
|
|
|
Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
|
|
offset = offset >>> 0
|
|
byteLength = byteLength >>> 0
|
|
if (!noAssert) {
|
|
checkOffset(offset, byteLength, this.length)
|
|
}
|
|
|
|
var val = this[offset + --byteLength]
|
|
var mul = 1
|
|
while (byteLength > 0 && (mul *= 0x100)) {
|
|
val += this[offset + --byteLength] * mul
|
|
}
|
|
|
|
return val
|
|
}
|
|
|
|
Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
|
|
offset = offset >>> 0
|
|
if (!noAssert) checkOffset(offset, 1, this.length)
|
|
return this[offset]
|
|
}
|
|
|
|
Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
|
|
offset = offset >>> 0
|
|
if (!noAssert) checkOffset(offset, 2, this.length)
|
|
return this[offset] | (this[offset + 1] << 8)
|
|
}
|
|
|
|
Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
|
|
offset = offset >>> 0
|
|
if (!noAssert) checkOffset(offset, 2, this.length)
|
|
return (this[offset] << 8) | this[offset + 1]
|
|
}
|
|
|
|
Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
|
|
offset = offset >>> 0
|
|
if (!noAssert) checkOffset(offset, 4, this.length)
|
|
|
|
return ((this[offset]) |
|
|
(this[offset + 1] << 8) |
|
|
(this[offset + 2] << 16)) +
|
|
(this[offset + 3] * 0x1000000)
|
|
}
|
|
|
|
Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
|
|
offset = offset >>> 0
|
|
if (!noAssert) checkOffset(offset, 4, this.length)
|
|
|
|
return (this[offset] * 0x1000000) +
|
|
((this[offset + 1] << 16) |
|
|
(this[offset + 2] << 8) |
|
|
this[offset + 3])
|
|
}
|
|
|
|
Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
|
|
offset = offset >>> 0
|
|
byteLength = byteLength >>> 0
|
|
if (!noAssert) checkOffset(offset, byteLength, this.length)
|
|
|
|
var val = this[offset]
|
|
var mul = 1
|
|
var i = 0
|
|
while (++i < byteLength && (mul *= 0x100)) {
|
|
val += this[offset + i] * mul
|
|
}
|
|
mul *= 0x80
|
|
|
|
if (val >= mul) val -= Math.pow(2, 8 * byteLength)
|
|
|
|
return val
|
|
}
|
|
|
|
Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
|
|
offset = offset >>> 0
|
|
byteLength = byteLength >>> 0
|
|
if (!noAssert) checkOffset(offset, byteLength, this.length)
|
|
|
|
var i = byteLength
|
|
var mul = 1
|
|
var val = this[offset + --i]
|
|
while (i > 0 && (mul *= 0x100)) {
|
|
val += this[offset + --i] * mul
|
|
}
|
|
mul *= 0x80
|
|
|
|
if (val >= mul) val -= Math.pow(2, 8 * byteLength)
|
|
|
|
return val
|
|
}
|
|
|
|
Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
|
|
offset = offset >>> 0
|
|
if (!noAssert) checkOffset(offset, 1, this.length)
|
|
if (!(this[offset] & 0x80)) return (this[offset])
|
|
return ((0xff - this[offset] + 1) * -1)
|
|
}
|
|
|
|
Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
|
|
offset = offset >>> 0
|
|
if (!noAssert) checkOffset(offset, 2, this.length)
|
|
var val = this[offset] | (this[offset + 1] << 8)
|
|
return (val & 0x8000) ? val | 0xFFFF0000 : val
|
|
}
|
|
|
|
Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
|
|
offset = offset >>> 0
|
|
if (!noAssert) checkOffset(offset, 2, this.length)
|
|
var val = this[offset + 1] | (this[offset] << 8)
|
|
return (val & 0x8000) ? val | 0xFFFF0000 : val
|
|
}
|
|
|
|
Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
|
|
offset = offset >>> 0
|
|
if (!noAssert) checkOffset(offset, 4, this.length)
|
|
|
|
return (this[offset]) |
|
|
(this[offset + 1] << 8) |
|
|
(this[offset + 2] << 16) |
|
|
(this[offset + 3] << 24)
|
|
}
|
|
|
|
Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
|
|
offset = offset >>> 0
|
|
if (!noAssert) checkOffset(offset, 4, this.length)
|
|
|
|
return (this[offset] << 24) |
|
|
(this[offset + 1] << 16) |
|
|
(this[offset + 2] << 8) |
|
|
(this[offset + 3])
|
|
}
|
|
|
|
Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
|
|
offset = offset >>> 0
|
|
if (!noAssert) checkOffset(offset, 4, this.length)
|
|
return ieee754.read(this, offset, true, 23, 4)
|
|
}
|
|
|
|
Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
|
|
offset = offset >>> 0
|
|
if (!noAssert) checkOffset(offset, 4, this.length)
|
|
return ieee754.read(this, offset, false, 23, 4)
|
|
}
|
|
|
|
Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
|
|
offset = offset >>> 0
|
|
if (!noAssert) checkOffset(offset, 8, this.length)
|
|
return ieee754.read(this, offset, true, 52, 8)
|
|
}
|
|
|
|
Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
|
|
offset = offset >>> 0
|
|
if (!noAssert) checkOffset(offset, 8, this.length)
|
|
return ieee754.read(this, offset, false, 52, 8)
|
|
}
|
|
|
|
function checkInt (buf, value, offset, ext, max, min) {
|
|
if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
|
|
if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
|
|
if (offset + ext > buf.length) throw new RangeError('Index out of range')
|
|
}
|
|
|
|
Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
|
|
value = +value
|
|
offset = offset >>> 0
|
|
byteLength = byteLength >>> 0
|
|
if (!noAssert) {
|
|
var maxBytes = Math.pow(2, 8 * byteLength) - 1
|
|
checkInt(this, value, offset, byteLength, maxBytes, 0)
|
|
}
|
|
|
|
var mul = 1
|
|
var i = 0
|
|
this[offset] = value & 0xFF
|
|
while (++i < byteLength && (mul *= 0x100)) {
|
|
this[offset + i] = (value / mul) & 0xFF
|
|
}
|
|
|
|
return offset + byteLength
|
|
}
|
|
|
|
Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
|
|
value = +value
|
|
offset = offset >>> 0
|
|
byteLength = byteLength >>> 0
|
|
if (!noAssert) {
|
|
var maxBytes = Math.pow(2, 8 * byteLength) - 1
|
|
checkInt(this, value, offset, byteLength, maxBytes, 0)
|
|
}
|
|
|
|
var i = byteLength - 1
|
|
var mul = 1
|
|
this[offset + i] = value & 0xFF
|
|
while (--i >= 0 && (mul *= 0x100)) {
|
|
this[offset + i] = (value / mul) & 0xFF
|
|
}
|
|
|
|
return offset + byteLength
|
|
}
|
|
|
|
Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset >>> 0
|
|
if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
|
|
this[offset] = (value & 0xff)
|
|
return offset + 1
|
|
}
|
|
|
|
Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset >>> 0
|
|
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
|
|
this[offset] = (value & 0xff)
|
|
this[offset + 1] = (value >>> 8)
|
|
return offset + 2
|
|
}
|
|
|
|
Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset >>> 0
|
|
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
|
|
this[offset] = (value >>> 8)
|
|
this[offset + 1] = (value & 0xff)
|
|
return offset + 2
|
|
}
|
|
|
|
Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset >>> 0
|
|
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
|
|
this[offset + 3] = (value >>> 24)
|
|
this[offset + 2] = (value >>> 16)
|
|
this[offset + 1] = (value >>> 8)
|
|
this[offset] = (value & 0xff)
|
|
return offset + 4
|
|
}
|
|
|
|
Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset >>> 0
|
|
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
|
|
this[offset] = (value >>> 24)
|
|
this[offset + 1] = (value >>> 16)
|
|
this[offset + 2] = (value >>> 8)
|
|
this[offset + 3] = (value & 0xff)
|
|
return offset + 4
|
|
}
|
|
|
|
Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
|
|
value = +value
|
|
offset = offset >>> 0
|
|
if (!noAssert) {
|
|
var limit = Math.pow(2, (8 * byteLength) - 1)
|
|
|
|
checkInt(this, value, offset, byteLength, limit - 1, -limit)
|
|
}
|
|
|
|
var i = 0
|
|
var mul = 1
|
|
var sub = 0
|
|
this[offset] = value & 0xFF
|
|
while (++i < byteLength && (mul *= 0x100)) {
|
|
if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
|
|
sub = 1
|
|
}
|
|
this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
|
|
}
|
|
|
|
return offset + byteLength
|
|
}
|
|
|
|
Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
|
|
value = +value
|
|
offset = offset >>> 0
|
|
if (!noAssert) {
|
|
var limit = Math.pow(2, (8 * byteLength) - 1)
|
|
|
|
checkInt(this, value, offset, byteLength, limit - 1, -limit)
|
|
}
|
|
|
|
var i = byteLength - 1
|
|
var mul = 1
|
|
var sub = 0
|
|
this[offset + i] = value & 0xFF
|
|
while (--i >= 0 && (mul *= 0x100)) {
|
|
if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
|
|
sub = 1
|
|
}
|
|
this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
|
|
}
|
|
|
|
return offset + byteLength
|
|
}
|
|
|
|
Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset >>> 0
|
|
if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
|
|
if (value < 0) value = 0xff + value + 1
|
|
this[offset] = (value & 0xff)
|
|
return offset + 1
|
|
}
|
|
|
|
Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset >>> 0
|
|
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
|
|
this[offset] = (value & 0xff)
|
|
this[offset + 1] = (value >>> 8)
|
|
return offset + 2
|
|
}
|
|
|
|
Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset >>> 0
|
|
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
|
|
this[offset] = (value >>> 8)
|
|
this[offset + 1] = (value & 0xff)
|
|
return offset + 2
|
|
}
|
|
|
|
Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset >>> 0
|
|
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
|
|
this[offset] = (value & 0xff)
|
|
this[offset + 1] = (value >>> 8)
|
|
this[offset + 2] = (value >>> 16)
|
|
this[offset + 3] = (value >>> 24)
|
|
return offset + 4
|
|
}
|
|
|
|
Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset >>> 0
|
|
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
|
|
if (value < 0) value = 0xffffffff + value + 1
|
|
this[offset] = (value >>> 24)
|
|
this[offset + 1] = (value >>> 16)
|
|
this[offset + 2] = (value >>> 8)
|
|
this[offset + 3] = (value & 0xff)
|
|
return offset + 4
|
|
}
|
|
|
|
function checkIEEE754 (buf, value, offset, ext, max, min) {
|
|
if (offset + ext > buf.length) throw new RangeError('Index out of range')
|
|
if (offset < 0) throw new RangeError('Index out of range')
|
|
}
|
|
|
|
function writeFloat (buf, value, offset, littleEndian, noAssert) {
|
|
value = +value
|
|
offset = offset >>> 0
|
|
if (!noAssert) {
|
|
checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
|
|
}
|
|
ieee754.write(buf, value, offset, littleEndian, 23, 4)
|
|
return offset + 4
|
|
}
|
|
|
|
Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
|
|
return writeFloat(this, value, offset, true, noAssert)
|
|
}
|
|
|
|
Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
|
|
return writeFloat(this, value, offset, false, noAssert)
|
|
}
|
|
|
|
function writeDouble (buf, value, offset, littleEndian, noAssert) {
|
|
value = +value
|
|
offset = offset >>> 0
|
|
if (!noAssert) {
|
|
checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
|
|
}
|
|
ieee754.write(buf, value, offset, littleEndian, 52, 8)
|
|
return offset + 8
|
|
}
|
|
|
|
Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
|
|
return writeDouble(this, value, offset, true, noAssert)
|
|
}
|
|
|
|
Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
|
|
return writeDouble(this, value, offset, false, noAssert)
|
|
}
|
|
|
|
// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
|
|
Buffer.prototype.copy = function copy (target, targetStart, start, end) {
|
|
if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')
|
|
if (!start) start = 0
|
|
if (!end && end !== 0) end = this.length
|
|
if (targetStart >= target.length) targetStart = target.length
|
|
if (!targetStart) targetStart = 0
|
|
if (end > 0 && end < start) end = start
|
|
|
|
// Copy 0 bytes; we're done
|
|
if (end === start) return 0
|
|
if (target.length === 0 || this.length === 0) return 0
|
|
|
|
// Fatal error conditions
|
|
if (targetStart < 0) {
|
|
throw new RangeError('targetStart out of bounds')
|
|
}
|
|
if (start < 0 || start >= this.length) throw new RangeError('Index out of range')
|
|
if (end < 0) throw new RangeError('sourceEnd out of bounds')
|
|
|
|
// Are we oob?
|
|
if (end > this.length) end = this.length
|
|
if (target.length - targetStart < end - start) {
|
|
end = target.length - targetStart + start
|
|
}
|
|
|
|
var len = end - start
|
|
|
|
if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {
|
|
// Use built-in when available, missing from IE11
|
|
this.copyWithin(targetStart, start, end)
|
|
} else if (this === target && start < targetStart && targetStart < end) {
|
|
// descending copy from end
|
|
for (var i = len - 1; i >= 0; --i) {
|
|
target[i + targetStart] = this[i + start]
|
|
}
|
|
} else {
|
|
Uint8Array.prototype.set.call(
|
|
target,
|
|
this.subarray(start, end),
|
|
targetStart
|
|
)
|
|
}
|
|
|
|
return len
|
|
}
|
|
|
|
// Usage:
|
|
// buffer.fill(number[, offset[, end]])
|
|
// buffer.fill(buffer[, offset[, end]])
|
|
// buffer.fill(string[, offset[, end]][, encoding])
|
|
Buffer.prototype.fill = function fill (val, start, end, encoding) {
|
|
// Handle string cases:
|
|
if (typeof val === 'string') {
|
|
if (typeof start === 'string') {
|
|
encoding = start
|
|
start = 0
|
|
end = this.length
|
|
} else if (typeof end === 'string') {
|
|
encoding = end
|
|
end = this.length
|
|
}
|
|
if (encoding !== undefined && typeof encoding !== 'string') {
|
|
throw new TypeError('encoding must be a string')
|
|
}
|
|
if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
|
|
throw new TypeError('Unknown encoding: ' + encoding)
|
|
}
|
|
if (val.length === 1) {
|
|
var code = val.charCodeAt(0)
|
|
if ((encoding === 'utf8' && code < 128) ||
|
|
encoding === 'latin1') {
|
|
// Fast path: If `val` fits into a single byte, use that numeric value.
|
|
val = code
|
|
}
|
|
}
|
|
} else if (typeof val === 'number') {
|
|
val = val & 255
|
|
}
|
|
|
|
// Invalid ranges are not set to a default, so can range check early.
|
|
if (start < 0 || this.length < start || this.length < end) {
|
|
throw new RangeError('Out of range index')
|
|
}
|
|
|
|
if (end <= start) {
|
|
return this
|
|
}
|
|
|
|
start = start >>> 0
|
|
end = end === undefined ? this.length : end >>> 0
|
|
|
|
if (!val) val = 0
|
|
|
|
var i
|
|
if (typeof val === 'number') {
|
|
for (i = start; i < end; ++i) {
|
|
this[i] = val
|
|
}
|
|
} else {
|
|
var bytes = Buffer.isBuffer(val)
|
|
? val
|
|
: Buffer.from(val, encoding)
|
|
var len = bytes.length
|
|
if (len === 0) {
|
|
throw new TypeError('The value "' + val +
|
|
'" is invalid for argument "value"')
|
|
}
|
|
for (i = 0; i < end - start; ++i) {
|
|
this[i + start] = bytes[i % len]
|
|
}
|
|
}
|
|
|
|
return this
|
|
}
|
|
|
|
// HELPER FUNCTIONS
|
|
// ================
|
|
|
|
var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g
|
|
|
|
function base64clean (str) {
|
|
// Node takes equal signs as end of the Base64 encoding
|
|
str = str.split('=')[0]
|
|
// Node strips out invalid characters like \n and \t from the string, base64-js does not
|
|
str = str.trim().replace(INVALID_BASE64_RE, '')
|
|
// Node converts strings with length < 2 to ''
|
|
if (str.length < 2) return ''
|
|
// Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
|
|
while (str.length % 4 !== 0) {
|
|
str = str + '='
|
|
}
|
|
return str
|
|
}
|
|
|
|
function toHex (n) {
|
|
if (n < 16) return '0' + n.toString(16)
|
|
return n.toString(16)
|
|
}
|
|
|
|
function utf8ToBytes (string, units) {
|
|
units = units || Infinity
|
|
var codePoint
|
|
var length = string.length
|
|
var leadSurrogate = null
|
|
var bytes = []
|
|
|
|
for (var i = 0; i < length; ++i) {
|
|
codePoint = string.charCodeAt(i)
|
|
|
|
// is surrogate component
|
|
if (codePoint > 0xD7FF && codePoint < 0xE000) {
|
|
// last char was a lead
|
|
if (!leadSurrogate) {
|
|
// no lead yet
|
|
if (codePoint > 0xDBFF) {
|
|
// unexpected trail
|
|
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
|
|
continue
|
|
} else if (i + 1 === length) {
|
|
// unpaired lead
|
|
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
|
|
continue
|
|
}
|
|
|
|
// valid lead
|
|
leadSurrogate = codePoint
|
|
|
|
continue
|
|
}
|
|
|
|
// 2 leads in a row
|
|
if (codePoint < 0xDC00) {
|
|
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
|
|
leadSurrogate = codePoint
|
|
continue
|
|
}
|
|
|
|
// valid surrogate pair
|
|
codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
|
|
} else if (leadSurrogate) {
|
|
// valid bmp char, but last char was a lead
|
|
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
|
|
}
|
|
|
|
leadSurrogate = null
|
|
|
|
// encode utf8
|
|
if (codePoint < 0x80) {
|
|
if ((units -= 1) < 0) break
|
|
bytes.push(codePoint)
|
|
} else if (codePoint < 0x800) {
|
|
if ((units -= 2) < 0) break
|
|
bytes.push(
|
|
codePoint >> 0x6 | 0xC0,
|
|
codePoint & 0x3F | 0x80
|
|
)
|
|
} else if (codePoint < 0x10000) {
|
|
if ((units -= 3) < 0) break
|
|
bytes.push(
|
|
codePoint >> 0xC | 0xE0,
|
|
codePoint >> 0x6 & 0x3F | 0x80,
|
|
codePoint & 0x3F | 0x80
|
|
)
|
|
} else if (codePoint < 0x110000) {
|
|
if ((units -= 4) < 0) break
|
|
bytes.push(
|
|
codePoint >> 0x12 | 0xF0,
|
|
codePoint >> 0xC & 0x3F | 0x80,
|
|
codePoint >> 0x6 & 0x3F | 0x80,
|
|
codePoint & 0x3F | 0x80
|
|
)
|
|
} else {
|
|
throw new Error('Invalid code point')
|
|
}
|
|
}
|
|
|
|
return bytes
|
|
}
|
|
|
|
function asciiToBytes (str) {
|
|
var byteArray = []
|
|
for (var i = 0; i < str.length; ++i) {
|
|
// Node's code seems to be doing this and not & 0x7F..
|
|
byteArray.push(str.charCodeAt(i) & 0xFF)
|
|
}
|
|
return byteArray
|
|
}
|
|
|
|
function utf16leToBytes (str, units) {
|
|
var c, hi, lo
|
|
var byteArray = []
|
|
for (var i = 0; i < str.length; ++i) {
|
|
if ((units -= 2) < 0) break
|
|
|
|
c = str.charCodeAt(i)
|
|
hi = c >> 8
|
|
lo = c % 256
|
|
byteArray.push(lo)
|
|
byteArray.push(hi)
|
|
}
|
|
|
|
return byteArray
|
|
}
|
|
|
|
function base64ToBytes (str) {
|
|
return base64.toByteArray(base64clean(str))
|
|
}
|
|
|
|
function blitBuffer (src, dst, offset, length) {
|
|
for (var i = 0; i < length; ++i) {
|
|
if ((i + offset >= dst.length) || (i >= src.length)) break
|
|
dst[i + offset] = src[i]
|
|
}
|
|
return i
|
|
}
|
|
|
|
// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass
|
|
// the `instanceof` check but they should be treated as of that type.
|
|
// See: https://github.com/feross/buffer/issues/166
|
|
function isInstance (obj, type) {
|
|
return obj instanceof type ||
|
|
(obj != null && obj.constructor != null && obj.constructor.name != null &&
|
|
obj.constructor.name === type.name)
|
|
}
|
|
function numberIsNaN (obj) {
|
|
// For IE11 support
|
|
return obj !== obj // eslint-disable-line no-self-compare
|
|
}
|
|
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"base64-js":1,"buffer":4,"ieee754":8}],5:[function(require,module,exports){
|
|
module.exports = {
|
|
"100": "Continue",
|
|
"101": "Switching Protocols",
|
|
"102": "Processing",
|
|
"200": "OK",
|
|
"201": "Created",
|
|
"202": "Accepted",
|
|
"203": "Non-Authoritative Information",
|
|
"204": "No Content",
|
|
"205": "Reset Content",
|
|
"206": "Partial Content",
|
|
"207": "Multi-Status",
|
|
"208": "Already Reported",
|
|
"226": "IM Used",
|
|
"300": "Multiple Choices",
|
|
"301": "Moved Permanently",
|
|
"302": "Found",
|
|
"303": "See Other",
|
|
"304": "Not Modified",
|
|
"305": "Use Proxy",
|
|
"307": "Temporary Redirect",
|
|
"308": "Permanent Redirect",
|
|
"400": "Bad Request",
|
|
"401": "Unauthorized",
|
|
"402": "Payment Required",
|
|
"403": "Forbidden",
|
|
"404": "Not Found",
|
|
"405": "Method Not Allowed",
|
|
"406": "Not Acceptable",
|
|
"407": "Proxy Authentication Required",
|
|
"408": "Request Timeout",
|
|
"409": "Conflict",
|
|
"410": "Gone",
|
|
"411": "Length Required",
|
|
"412": "Precondition Failed",
|
|
"413": "Payload Too Large",
|
|
"414": "URI Too Long",
|
|
"415": "Unsupported Media Type",
|
|
"416": "Range Not Satisfiable",
|
|
"417": "Expectation Failed",
|
|
"418": "I'm a teapot",
|
|
"421": "Misdirected Request",
|
|
"422": "Unprocessable Entity",
|
|
"423": "Locked",
|
|
"424": "Failed Dependency",
|
|
"425": "Unordered Collection",
|
|
"426": "Upgrade Required",
|
|
"428": "Precondition Required",
|
|
"429": "Too Many Requests",
|
|
"431": "Request Header Fields Too Large",
|
|
"451": "Unavailable For Legal Reasons",
|
|
"500": "Internal Server Error",
|
|
"501": "Not Implemented",
|
|
"502": "Bad Gateway",
|
|
"503": "Service Unavailable",
|
|
"504": "Gateway Timeout",
|
|
"505": "HTTP Version Not Supported",
|
|
"506": "Variant Also Negotiates",
|
|
"507": "Insufficient Storage",
|
|
"508": "Loop Detected",
|
|
"509": "Bandwidth Limit Exceeded",
|
|
"510": "Not Extended",
|
|
"511": "Network Authentication Required"
|
|
}
|
|
|
|
},{}],6:[function(require,module,exports){
|
|
// Copyright Joyent, Inc. and other Node contributors.
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
// copy of this software and associated documentation files (the
|
|
// "Software"), to deal in the Software without restriction, including
|
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|
// persons to whom the Software is furnished to do so, subject to the
|
|
// following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included
|
|
// in all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
var objectCreate = Object.create || objectCreatePolyfill
|
|
var objectKeys = Object.keys || objectKeysPolyfill
|
|
var bind = Function.prototype.bind || functionBindPolyfill
|
|
|
|
function EventEmitter() {
|
|
if (!this._events || !Object.prototype.hasOwnProperty.call(this, '_events')) {
|
|
this._events = objectCreate(null);
|
|
this._eventsCount = 0;
|
|
}
|
|
|
|
this._maxListeners = this._maxListeners || undefined;
|
|
}
|
|
module.exports = EventEmitter;
|
|
|
|
// Backwards-compat with node 0.10.x
|
|
EventEmitter.EventEmitter = EventEmitter;
|
|
|
|
EventEmitter.prototype._events = undefined;
|
|
EventEmitter.prototype._maxListeners = undefined;
|
|
|
|
// By default EventEmitters will print a warning if more than 10 listeners are
|
|
// added to it. This is a useful default which helps finding memory leaks.
|
|
var defaultMaxListeners = 10;
|
|
|
|
var hasDefineProperty;
|
|
try {
|
|
var o = {};
|
|
if (Object.defineProperty) Object.defineProperty(o, 'x', { value: 0 });
|
|
hasDefineProperty = o.x === 0;
|
|
} catch (err) { hasDefineProperty = false }
|
|
if (hasDefineProperty) {
|
|
Object.defineProperty(EventEmitter, 'defaultMaxListeners', {
|
|
enumerable: true,
|
|
get: function() {
|
|
return defaultMaxListeners;
|
|
},
|
|
set: function(arg) {
|
|
// check whether the input is a positive number (whose value is zero or
|
|
// greater and not a NaN).
|
|
if (typeof arg !== 'number' || arg < 0 || arg !== arg)
|
|
throw new TypeError('"defaultMaxListeners" must be a positive number');
|
|
defaultMaxListeners = arg;
|
|
}
|
|
});
|
|
} else {
|
|
EventEmitter.defaultMaxListeners = defaultMaxListeners;
|
|
}
|
|
|
|
// Obviously not all Emitters should be limited to 10. This function allows
|
|
// that to be increased. Set to zero for unlimited.
|
|
EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
|
|
if (typeof n !== 'number' || n < 0 || isNaN(n))
|
|
throw new TypeError('"n" argument must be a positive number');
|
|
this._maxListeners = n;
|
|
return this;
|
|
};
|
|
|
|
function $getMaxListeners(that) {
|
|
if (that._maxListeners === undefined)
|
|
return EventEmitter.defaultMaxListeners;
|
|
return that._maxListeners;
|
|
}
|
|
|
|
EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
|
|
return $getMaxListeners(this);
|
|
};
|
|
|
|
// These standalone emit* functions are used to optimize calling of event
|
|
// handlers for fast cases because emit() itself often has a variable number of
|
|
// arguments and can be deoptimized because of that. These functions always have
|
|
// the same number of arguments and thus do not get deoptimized, so the code
|
|
// inside them can execute faster.
|
|
function emitNone(handler, isFn, self) {
|
|
if (isFn)
|
|
handler.call(self);
|
|
else {
|
|
var len = handler.length;
|
|
var listeners = arrayClone(handler, len);
|
|
for (var i = 0; i < len; ++i)
|
|
listeners[i].call(self);
|
|
}
|
|
}
|
|
function emitOne(handler, isFn, self, arg1) {
|
|
if (isFn)
|
|
handler.call(self, arg1);
|
|
else {
|
|
var len = handler.length;
|
|
var listeners = arrayClone(handler, len);
|
|
for (var i = 0; i < len; ++i)
|
|
listeners[i].call(self, arg1);
|
|
}
|
|
}
|
|
function emitTwo(handler, isFn, self, arg1, arg2) {
|
|
if (isFn)
|
|
handler.call(self, arg1, arg2);
|
|
else {
|
|
var len = handler.length;
|
|
var listeners = arrayClone(handler, len);
|
|
for (var i = 0; i < len; ++i)
|
|
listeners[i].call(self, arg1, arg2);
|
|
}
|
|
}
|
|
function emitThree(handler, isFn, self, arg1, arg2, arg3) {
|
|
if (isFn)
|
|
handler.call(self, arg1, arg2, arg3);
|
|
else {
|
|
var len = handler.length;
|
|
var listeners = arrayClone(handler, len);
|
|
for (var i = 0; i < len; ++i)
|
|
listeners[i].call(self, arg1, arg2, arg3);
|
|
}
|
|
}
|
|
|
|
function emitMany(handler, isFn, self, args) {
|
|
if (isFn)
|
|
handler.apply(self, args);
|
|
else {
|
|
var len = handler.length;
|
|
var listeners = arrayClone(handler, len);
|
|
for (var i = 0; i < len; ++i)
|
|
listeners[i].apply(self, args);
|
|
}
|
|
}
|
|
|
|
EventEmitter.prototype.emit = function emit(type) {
|
|
var er, handler, len, args, i, events;
|
|
var doError = (type === 'error');
|
|
|
|
events = this._events;
|
|
if (events)
|
|
doError = (doError && events.error == null);
|
|
else if (!doError)
|
|
return false;
|
|
|
|
// If there is no 'error' event listener then throw.
|
|
if (doError) {
|
|
if (arguments.length > 1)
|
|
er = arguments[1];
|
|
if (er instanceof Error) {
|
|
throw er; // Unhandled 'error' event
|
|
} else {
|
|
// At least give some kind of context to the user
|
|
var err = new Error('Unhandled "error" event. (' + er + ')');
|
|
err.context = er;
|
|
throw err;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
handler = events[type];
|
|
|
|
if (!handler)
|
|
return false;
|
|
|
|
var isFn = typeof handler === 'function';
|
|
len = arguments.length;
|
|
switch (len) {
|
|
// fast cases
|
|
case 1:
|
|
emitNone(handler, isFn, this);
|
|
break;
|
|
case 2:
|
|
emitOne(handler, isFn, this, arguments[1]);
|
|
break;
|
|
case 3:
|
|
emitTwo(handler, isFn, this, arguments[1], arguments[2]);
|
|
break;
|
|
case 4:
|
|
emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]);
|
|
break;
|
|
// slower
|
|
default:
|
|
args = new Array(len - 1);
|
|
for (i = 1; i < len; i++)
|
|
args[i - 1] = arguments[i];
|
|
emitMany(handler, isFn, this, args);
|
|
}
|
|
|
|
return true;
|
|
};
|
|
|
|
function _addListener(target, type, listener, prepend) {
|
|
var m;
|
|
var events;
|
|
var existing;
|
|
|
|
if (typeof listener !== 'function')
|
|
throw new TypeError('"listener" argument must be a function');
|
|
|
|
events = target._events;
|
|
if (!events) {
|
|
events = target._events = objectCreate(null);
|
|
target._eventsCount = 0;
|
|
} else {
|
|
// To avoid recursion in the case that type === "newListener"! Before
|
|
// adding it to the listeners, first emit "newListener".
|
|
if (events.newListener) {
|
|
target.emit('newListener', type,
|
|
listener.listener ? listener.listener : listener);
|
|
|
|
// Re-assign `events` because a newListener handler could have caused the
|
|
// this._events to be assigned to a new object
|
|
events = target._events;
|
|
}
|
|
existing = events[type];
|
|
}
|
|
|
|
if (!existing) {
|
|
// Optimize the case of one listener. Don't need the extra array object.
|
|
existing = events[type] = listener;
|
|
++target._eventsCount;
|
|
} else {
|
|
if (typeof existing === 'function') {
|
|
// Adding the second element, need to change to array.
|
|
existing = events[type] =
|
|
prepend ? [listener, existing] : [existing, listener];
|
|
} else {
|
|
// If we've already got an array, just append.
|
|
if (prepend) {
|
|
existing.unshift(listener);
|
|
} else {
|
|
existing.push(listener);
|
|
}
|
|
}
|
|
|
|
// Check for listener leak
|
|
if (!existing.warned) {
|
|
m = $getMaxListeners(target);
|
|
if (m && m > 0 && existing.length > m) {
|
|
existing.warned = true;
|
|
var w = new Error('Possible EventEmitter memory leak detected. ' +
|
|
existing.length + ' "' + String(type) + '" listeners ' +
|
|
'added. Use emitter.setMaxListeners() to ' +
|
|
'increase limit.');
|
|
w.name = 'MaxListenersExceededWarning';
|
|
w.emitter = target;
|
|
w.type = type;
|
|
w.count = existing.length;
|
|
if (typeof console === 'object' && console.warn) {
|
|
console.warn('%s: %s', w.name, w.message);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return target;
|
|
}
|
|
|
|
EventEmitter.prototype.addListener = function addListener(type, listener) {
|
|
return _addListener(this, type, listener, false);
|
|
};
|
|
|
|
EventEmitter.prototype.on = EventEmitter.prototype.addListener;
|
|
|
|
EventEmitter.prototype.prependListener =
|
|
function prependListener(type, listener) {
|
|
return _addListener(this, type, listener, true);
|
|
};
|
|
|
|
function onceWrapper() {
|
|
if (!this.fired) {
|
|
this.target.removeListener(this.type, this.wrapFn);
|
|
this.fired = true;
|
|
switch (arguments.length) {
|
|
case 0:
|
|
return this.listener.call(this.target);
|
|
case 1:
|
|
return this.listener.call(this.target, arguments[0]);
|
|
case 2:
|
|
return this.listener.call(this.target, arguments[0], arguments[1]);
|
|
case 3:
|
|
return this.listener.call(this.target, arguments[0], arguments[1],
|
|
arguments[2]);
|
|
default:
|
|
var args = new Array(arguments.length);
|
|
for (var i = 0; i < args.length; ++i)
|
|
args[i] = arguments[i];
|
|
this.listener.apply(this.target, args);
|
|
}
|
|
}
|
|
}
|
|
|
|
function _onceWrap(target, type, listener) {
|
|
var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };
|
|
var wrapped = bind.call(onceWrapper, state);
|
|
wrapped.listener = listener;
|
|
state.wrapFn = wrapped;
|
|
return wrapped;
|
|
}
|
|
|
|
EventEmitter.prototype.once = function once(type, listener) {
|
|
if (typeof listener !== 'function')
|
|
throw new TypeError('"listener" argument must be a function');
|
|
this.on(type, _onceWrap(this, type, listener));
|
|
return this;
|
|
};
|
|
|
|
EventEmitter.prototype.prependOnceListener =
|
|
function prependOnceListener(type, listener) {
|
|
if (typeof listener !== 'function')
|
|
throw new TypeError('"listener" argument must be a function');
|
|
this.prependListener(type, _onceWrap(this, type, listener));
|
|
return this;
|
|
};
|
|
|
|
// Emits a 'removeListener' event if and only if the listener was removed.
|
|
EventEmitter.prototype.removeListener =
|
|
function removeListener(type, listener) {
|
|
var list, events, position, i, originalListener;
|
|
|
|
if (typeof listener !== 'function')
|
|
throw new TypeError('"listener" argument must be a function');
|
|
|
|
events = this._events;
|
|
if (!events)
|
|
return this;
|
|
|
|
list = events[type];
|
|
if (!list)
|
|
return this;
|
|
|
|
if (list === listener || list.listener === listener) {
|
|
if (--this._eventsCount === 0)
|
|
this._events = objectCreate(null);
|
|
else {
|
|
delete events[type];
|
|
if (events.removeListener)
|
|
this.emit('removeListener', type, list.listener || listener);
|
|
}
|
|
} else if (typeof list !== 'function') {
|
|
position = -1;
|
|
|
|
for (i = list.length - 1; i >= 0; i--) {
|
|
if (list[i] === listener || list[i].listener === listener) {
|
|
originalListener = list[i].listener;
|
|
position = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (position < 0)
|
|
return this;
|
|
|
|
if (position === 0)
|
|
list.shift();
|
|
else
|
|
spliceOne(list, position);
|
|
|
|
if (list.length === 1)
|
|
events[type] = list[0];
|
|
|
|
if (events.removeListener)
|
|
this.emit('removeListener', type, originalListener || listener);
|
|
}
|
|
|
|
return this;
|
|
};
|
|
|
|
EventEmitter.prototype.removeAllListeners =
|
|
function removeAllListeners(type) {
|
|
var listeners, events, i;
|
|
|
|
events = this._events;
|
|
if (!events)
|
|
return this;
|
|
|
|
// not listening for removeListener, no need to emit
|
|
if (!events.removeListener) {
|
|
if (arguments.length === 0) {
|
|
this._events = objectCreate(null);
|
|
this._eventsCount = 0;
|
|
} else if (events[type]) {
|
|
if (--this._eventsCount === 0)
|
|
this._events = objectCreate(null);
|
|
else
|
|
delete events[type];
|
|
}
|
|
return this;
|
|
}
|
|
|
|
// emit removeListener for all listeners on all events
|
|
if (arguments.length === 0) {
|
|
var keys = objectKeys(events);
|
|
var key;
|
|
for (i = 0; i < keys.length; ++i) {
|
|
key = keys[i];
|
|
if (key === 'removeListener') continue;
|
|
this.removeAllListeners(key);
|
|
}
|
|
this.removeAllListeners('removeListener');
|
|
this._events = objectCreate(null);
|
|
this._eventsCount = 0;
|
|
return this;
|
|
}
|
|
|
|
listeners = events[type];
|
|
|
|
if (typeof listeners === 'function') {
|
|
this.removeListener(type, listeners);
|
|
} else if (listeners) {
|
|
// LIFO order
|
|
for (i = listeners.length - 1; i >= 0; i--) {
|
|
this.removeListener(type, listeners[i]);
|
|
}
|
|
}
|
|
|
|
return this;
|
|
};
|
|
|
|
function _listeners(target, type, unwrap) {
|
|
var events = target._events;
|
|
|
|
if (!events)
|
|
return [];
|
|
|
|
var evlistener = events[type];
|
|
if (!evlistener)
|
|
return [];
|
|
|
|
if (typeof evlistener === 'function')
|
|
return unwrap ? [evlistener.listener || evlistener] : [evlistener];
|
|
|
|
return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);
|
|
}
|
|
|
|
EventEmitter.prototype.listeners = function listeners(type) {
|
|
return _listeners(this, type, true);
|
|
};
|
|
|
|
EventEmitter.prototype.rawListeners = function rawListeners(type) {
|
|
return _listeners(this, type, false);
|
|
};
|
|
|
|
EventEmitter.listenerCount = function(emitter, type) {
|
|
if (typeof emitter.listenerCount === 'function') {
|
|
return emitter.listenerCount(type);
|
|
} else {
|
|
return listenerCount.call(emitter, type);
|
|
}
|
|
};
|
|
|
|
EventEmitter.prototype.listenerCount = listenerCount;
|
|
function listenerCount(type) {
|
|
var events = this._events;
|
|
|
|
if (events) {
|
|
var evlistener = events[type];
|
|
|
|
if (typeof evlistener === 'function') {
|
|
return 1;
|
|
} else if (evlistener) {
|
|
return evlistener.length;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
EventEmitter.prototype.eventNames = function eventNames() {
|
|
return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : [];
|
|
};
|
|
|
|
// About 1.5x faster than the two-arg version of Array#splice().
|
|
function spliceOne(list, index) {
|
|
for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1)
|
|
list[i] = list[k];
|
|
list.pop();
|
|
}
|
|
|
|
function arrayClone(arr, n) {
|
|
var copy = new Array(n);
|
|
for (var i = 0; i < n; ++i)
|
|
copy[i] = arr[i];
|
|
return copy;
|
|
}
|
|
|
|
function unwrapListeners(arr) {
|
|
var ret = new Array(arr.length);
|
|
for (var i = 0; i < ret.length; ++i) {
|
|
ret[i] = arr[i].listener || arr[i];
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
function objectCreatePolyfill(proto) {
|
|
var F = function() {};
|
|
F.prototype = proto;
|
|
return new F;
|
|
}
|
|
function objectKeysPolyfill(obj) {
|
|
var keys = [];
|
|
for (var k in obj) if (Object.prototype.hasOwnProperty.call(obj, k)) {
|
|
keys.push(k);
|
|
}
|
|
return k;
|
|
}
|
|
function functionBindPolyfill(context) {
|
|
var fn = this;
|
|
return function () {
|
|
return fn.apply(context, arguments);
|
|
};
|
|
}
|
|
|
|
},{}],7:[function(require,module,exports){
|
|
var http = require('http')
|
|
var url = require('url')
|
|
|
|
var https = module.exports
|
|
|
|
for (var key in http) {
|
|
if (http.hasOwnProperty(key)) https[key] = http[key]
|
|
}
|
|
|
|
https.request = function (params, cb) {
|
|
params = validateParams(params)
|
|
return http.request.call(this, params, cb)
|
|
}
|
|
|
|
https.get = function (params, cb) {
|
|
params = validateParams(params)
|
|
return http.get.call(this, params, cb)
|
|
}
|
|
|
|
function validateParams (params) {
|
|
if (typeof params === 'string') {
|
|
params = url.parse(params)
|
|
}
|
|
if (!params.protocol) {
|
|
params.protocol = 'https:'
|
|
}
|
|
if (params.protocol !== 'https:') {
|
|
throw new Error('Protocol "' + params.protocol + '" not supported. Expected "https:"')
|
|
}
|
|
return params
|
|
}
|
|
|
|
},{"http":17,"url":37}],8:[function(require,module,exports){
|
|
exports.read = function (buffer, offset, isLE, mLen, nBytes) {
|
|
var e, m
|
|
var eLen = (nBytes * 8) - mLen - 1
|
|
var eMax = (1 << eLen) - 1
|
|
var eBias = eMax >> 1
|
|
var nBits = -7
|
|
var i = isLE ? (nBytes - 1) : 0
|
|
var d = isLE ? -1 : 1
|
|
var s = buffer[offset + i]
|
|
|
|
i += d
|
|
|
|
e = s & ((1 << (-nBits)) - 1)
|
|
s >>= (-nBits)
|
|
nBits += eLen
|
|
for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
|
|
|
|
m = e & ((1 << (-nBits)) - 1)
|
|
e >>= (-nBits)
|
|
nBits += mLen
|
|
for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
|
|
|
|
if (e === 0) {
|
|
e = 1 - eBias
|
|
} else if (e === eMax) {
|
|
return m ? NaN : ((s ? -1 : 1) * Infinity)
|
|
} else {
|
|
m = m + Math.pow(2, mLen)
|
|
e = e - eBias
|
|
}
|
|
return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
|
|
}
|
|
|
|
exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
|
|
var e, m, c
|
|
var eLen = (nBytes * 8) - mLen - 1
|
|
var eMax = (1 << eLen) - 1
|
|
var eBias = eMax >> 1
|
|
var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
|
|
var i = isLE ? 0 : (nBytes - 1)
|
|
var d = isLE ? 1 : -1
|
|
var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
|
|
|
|
value = Math.abs(value)
|
|
|
|
if (isNaN(value) || value === Infinity) {
|
|
m = isNaN(value) ? 1 : 0
|
|
e = eMax
|
|
} else {
|
|
e = Math.floor(Math.log(value) / Math.LN2)
|
|
if (value * (c = Math.pow(2, -e)) < 1) {
|
|
e--
|
|
c *= 2
|
|
}
|
|
if (e + eBias >= 1) {
|
|
value += rt / c
|
|
} else {
|
|
value += rt * Math.pow(2, 1 - eBias)
|
|
}
|
|
if (value * c >= 2) {
|
|
e++
|
|
c /= 2
|
|
}
|
|
|
|
if (e + eBias >= eMax) {
|
|
m = 0
|
|
e = eMax
|
|
} else if (e + eBias >= 1) {
|
|
m = ((value * c) - 1) * Math.pow(2, mLen)
|
|
e = e + eBias
|
|
} else {
|
|
m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
|
|
e = 0
|
|
}
|
|
}
|
|
|
|
for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
|
|
|
|
e = (e << mLen) | m
|
|
eLen += mLen
|
|
for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
|
|
|
|
buffer[offset + i - d] |= s * 128
|
|
}
|
|
|
|
},{}],9:[function(require,module,exports){
|
|
if (typeof Object.create === 'function') {
|
|
// implementation from standard node.js 'util' module
|
|
module.exports = function inherits(ctor, superCtor) {
|
|
if (superCtor) {
|
|
ctor.super_ = superCtor
|
|
ctor.prototype = Object.create(superCtor.prototype, {
|
|
constructor: {
|
|
value: ctor,
|
|
enumerable: false,
|
|
writable: true,
|
|
configurable: true
|
|
}
|
|
})
|
|
}
|
|
};
|
|
} else {
|
|
// old school shim for old browsers
|
|
module.exports = function inherits(ctor, superCtor) {
|
|
if (superCtor) {
|
|
ctor.super_ = superCtor
|
|
var TempCtor = function () {}
|
|
TempCtor.prototype = superCtor.prototype
|
|
ctor.prototype = new TempCtor()
|
|
ctor.prototype.constructor = ctor
|
|
}
|
|
}
|
|
}
|
|
|
|
},{}],10:[function(require,module,exports){
|
|
(function (global){
|
|
/**
|
|
* 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,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
},{}],11:[function(require,module,exports){
|
|
(function (global){
|
|
/**
|
|
* 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,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
},{}],12:[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; };
|
|
|
|
},{}],13:[function(require,module,exports){
|
|
// Copyright Joyent, Inc. and other Node contributors.
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
// copy of this software and associated documentation files (the
|
|
// "Software"), to deal in the Software without restriction, including
|
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|
// persons to whom the Software is furnished to do so, subject to the
|
|
// following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included
|
|
// in all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
'use strict';
|
|
|
|
// If obj.hasOwnProperty has been overridden, then calling
|
|
// obj.hasOwnProperty(prop) will break.
|
|
// See: https://github.com/joyent/node/issues/1707
|
|
function hasOwnProperty(obj, prop) {
|
|
return Object.prototype.hasOwnProperty.call(obj, prop);
|
|
}
|
|
|
|
module.exports = function(qs, sep, eq, options) {
|
|
sep = sep || '&';
|
|
eq = eq || '=';
|
|
var obj = {};
|
|
|
|
if (typeof qs !== 'string' || qs.length === 0) {
|
|
return obj;
|
|
}
|
|
|
|
var regexp = /\+/g;
|
|
qs = qs.split(sep);
|
|
|
|
var maxKeys = 1000;
|
|
if (options && typeof options.maxKeys === 'number') {
|
|
maxKeys = options.maxKeys;
|
|
}
|
|
|
|
var len = qs.length;
|
|
// maxKeys <= 0 means that we should not limit keys count
|
|
if (maxKeys > 0 && len > maxKeys) {
|
|
len = maxKeys;
|
|
}
|
|
|
|
for (var i = 0; i < len; ++i) {
|
|
var x = qs[i].replace(regexp, '%20'),
|
|
idx = x.indexOf(eq),
|
|
kstr, vstr, k, v;
|
|
|
|
if (idx >= 0) {
|
|
kstr = x.substr(0, idx);
|
|
vstr = x.substr(idx + 1);
|
|
} else {
|
|
kstr = x;
|
|
vstr = '';
|
|
}
|
|
|
|
k = decodeURIComponent(kstr);
|
|
v = decodeURIComponent(vstr);
|
|
|
|
if (!hasOwnProperty(obj, k)) {
|
|
obj[k] = v;
|
|
} else if (isArray(obj[k])) {
|
|
obj[k].push(v);
|
|
} else {
|
|
obj[k] = [obj[k], v];
|
|
}
|
|
}
|
|
|
|
return obj;
|
|
};
|
|
|
|
var isArray = Array.isArray || function (xs) {
|
|
return Object.prototype.toString.call(xs) === '[object Array]';
|
|
};
|
|
|
|
},{}],14:[function(require,module,exports){
|
|
// Copyright Joyent, Inc. and other Node contributors.
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
// copy of this software and associated documentation files (the
|
|
// "Software"), to deal in the Software without restriction, including
|
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|
// persons to whom the Software is furnished to do so, subject to the
|
|
// following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included
|
|
// in all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
'use strict';
|
|
|
|
var stringifyPrimitive = function(v) {
|
|
switch (typeof v) {
|
|
case 'string':
|
|
return v;
|
|
|
|
case 'boolean':
|
|
return v ? 'true' : 'false';
|
|
|
|
case 'number':
|
|
return isFinite(v) ? v : '';
|
|
|
|
default:
|
|
return '';
|
|
}
|
|
};
|
|
|
|
module.exports = function(obj, sep, eq, name) {
|
|
sep = sep || '&';
|
|
eq = eq || '=';
|
|
if (obj === null) {
|
|
obj = undefined;
|
|
}
|
|
|
|
if (typeof obj === 'object') {
|
|
return map(objectKeys(obj), function(k) {
|
|
var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
|
|
if (isArray(obj[k])) {
|
|
return map(obj[k], function(v) {
|
|
return ks + encodeURIComponent(stringifyPrimitive(v));
|
|
}).join(sep);
|
|
} else {
|
|
return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
|
|
}
|
|
}).join(sep);
|
|
|
|
}
|
|
|
|
if (!name) return '';
|
|
return encodeURIComponent(stringifyPrimitive(name)) + eq +
|
|
encodeURIComponent(stringifyPrimitive(obj));
|
|
};
|
|
|
|
var isArray = Array.isArray || function (xs) {
|
|
return Object.prototype.toString.call(xs) === '[object Array]';
|
|
};
|
|
|
|
function map (xs, f) {
|
|
if (xs.map) return xs.map(f);
|
|
var res = [];
|
|
for (var i = 0; i < xs.length; i++) {
|
|
res.push(f(xs[i], i));
|
|
}
|
|
return res;
|
|
}
|
|
|
|
var objectKeys = Object.keys || function (obj) {
|
|
var res = [];
|
|
for (var key in obj) {
|
|
if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);
|
|
}
|
|
return res;
|
|
};
|
|
|
|
},{}],15:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
exports.decode = exports.parse = require('./decode');
|
|
exports.encode = exports.stringify = require('./encode');
|
|
|
|
},{"./decode":13,"./encode":14}],16:[function(require,module,exports){
|
|
/* eslint-disable node/no-deprecated-api */
|
|
var buffer = require('buffer')
|
|
var Buffer = buffer.Buffer
|
|
|
|
// alternative to using Object.keys for old browsers
|
|
function copyProps (src, dst) {
|
|
for (var key in src) {
|
|
dst[key] = src[key]
|
|
}
|
|
}
|
|
if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
|
|
module.exports = buffer
|
|
} else {
|
|
// Copy properties from require('buffer')
|
|
copyProps(buffer, exports)
|
|
exports.Buffer = SafeBuffer
|
|
}
|
|
|
|
function SafeBuffer (arg, encodingOrOffset, length) {
|
|
return Buffer(arg, encodingOrOffset, length)
|
|
}
|
|
|
|
SafeBuffer.prototype = Object.create(Buffer.prototype)
|
|
|
|
// Copy static methods from Buffer
|
|
copyProps(Buffer, SafeBuffer)
|
|
|
|
SafeBuffer.from = function (arg, encodingOrOffset, length) {
|
|
if (typeof arg === 'number') {
|
|
throw new TypeError('Argument must not be a number')
|
|
}
|
|
return Buffer(arg, encodingOrOffset, length)
|
|
}
|
|
|
|
SafeBuffer.alloc = function (size, fill, encoding) {
|
|
if (typeof size !== 'number') {
|
|
throw new TypeError('Argument must be a number')
|
|
}
|
|
var buf = Buffer(size)
|
|
if (fill !== undefined) {
|
|
if (typeof encoding === 'string') {
|
|
buf.fill(fill, encoding)
|
|
} else {
|
|
buf.fill(fill)
|
|
}
|
|
} else {
|
|
buf.fill(0)
|
|
}
|
|
return buf
|
|
}
|
|
|
|
SafeBuffer.allocUnsafe = function (size) {
|
|
if (typeof size !== 'number') {
|
|
throw new TypeError('Argument must be a number')
|
|
}
|
|
return Buffer(size)
|
|
}
|
|
|
|
SafeBuffer.allocUnsafeSlow = function (size) {
|
|
if (typeof size !== 'number') {
|
|
throw new TypeError('Argument must be a number')
|
|
}
|
|
return buffer.SlowBuffer(size)
|
|
}
|
|
|
|
},{"buffer":4}],17:[function(require,module,exports){
|
|
(function (global){
|
|
var ClientRequest = require('./lib/request')
|
|
var response = require('./lib/response')
|
|
var extend = require('xtend')
|
|
var statusCodes = require('builtin-status-codes')
|
|
var url = require('url')
|
|
|
|
var http = exports
|
|
|
|
http.request = function (opts, cb) {
|
|
if (typeof opts === 'string')
|
|
opts = url.parse(opts)
|
|
else
|
|
opts = extend(opts)
|
|
|
|
// Normally, the page is loaded from http or https, so not specifying a protocol
|
|
// will result in a (valid) protocol-relative url. However, this won't work if
|
|
// the protocol is something else, like 'file:'
|
|
var defaultProtocol = global.location.protocol.search(/^https?:$/) === -1 ? 'http:' : ''
|
|
|
|
var protocol = opts.protocol || defaultProtocol
|
|
var host = opts.hostname || opts.host
|
|
var port = opts.port
|
|
var path = opts.path || '/'
|
|
|
|
// Necessary for IPv6 addresses
|
|
if (host && host.indexOf(':') !== -1)
|
|
host = '[' + host + ']'
|
|
|
|
// This may be a relative url. The browser should always be able to interpret it correctly.
|
|
opts.url = (host ? (protocol + '//' + host) : '') + (port ? ':' + port : '') + path
|
|
opts.method = (opts.method || 'GET').toUpperCase()
|
|
opts.headers = opts.headers || {}
|
|
|
|
// Also valid opts.auth, opts.mode
|
|
|
|
var req = new ClientRequest(opts)
|
|
if (cb)
|
|
req.on('response', cb)
|
|
return req
|
|
}
|
|
|
|
http.get = function get (opts, cb) {
|
|
var req = http.request(opts, cb)
|
|
req.end()
|
|
return req
|
|
}
|
|
|
|
http.ClientRequest = ClientRequest
|
|
http.IncomingMessage = response.IncomingMessage
|
|
|
|
http.Agent = function () {}
|
|
http.Agent.defaultMaxSockets = 4
|
|
|
|
http.globalAgent = new http.Agent()
|
|
|
|
http.STATUS_CODES = statusCodes
|
|
|
|
http.METHODS = [
|
|
'CHECKOUT',
|
|
'CONNECT',
|
|
'COPY',
|
|
'DELETE',
|
|
'GET',
|
|
'HEAD',
|
|
'LOCK',
|
|
'M-SEARCH',
|
|
'MERGE',
|
|
'MKACTIVITY',
|
|
'MKCOL',
|
|
'MOVE',
|
|
'NOTIFY',
|
|
'OPTIONS',
|
|
'PATCH',
|
|
'POST',
|
|
'PROPFIND',
|
|
'PROPPATCH',
|
|
'PURGE',
|
|
'PUT',
|
|
'REPORT',
|
|
'SEARCH',
|
|
'SUBSCRIBE',
|
|
'TRACE',
|
|
'UNLOCK',
|
|
'UNSUBSCRIBE'
|
|
]
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
},{"./lib/request":19,"./lib/response":20,"builtin-status-codes":5,"url":37,"xtend":140}],18:[function(require,module,exports){
|
|
(function (global){
|
|
exports.fetch = isFunction(global.fetch) && isFunction(global.ReadableStream)
|
|
|
|
exports.writableStream = isFunction(global.WritableStream)
|
|
|
|
exports.abortController = isFunction(global.AbortController)
|
|
|
|
// The xhr request to example.com may violate some restrictive CSP configurations,
|
|
// so if we're running in a browser that supports `fetch`, avoid calling getXHR()
|
|
// and assume support for certain features below.
|
|
var xhr
|
|
function getXHR () {
|
|
// Cache the xhr value
|
|
if (xhr !== undefined) return xhr
|
|
|
|
if (global.XMLHttpRequest) {
|
|
xhr = new global.XMLHttpRequest()
|
|
// If XDomainRequest is available (ie only, where xhr might not work
|
|
// cross domain), use the page location. Otherwise use example.com
|
|
// Note: this doesn't actually make an http request.
|
|
try {
|
|
xhr.open('GET', global.XDomainRequest ? '/' : 'https://example.com')
|
|
} catch(e) {
|
|
xhr = null
|
|
}
|
|
} else {
|
|
// Service workers don't have XHR
|
|
xhr = null
|
|
}
|
|
return xhr
|
|
}
|
|
|
|
function checkTypeSupport (type) {
|
|
var xhr = getXHR()
|
|
if (!xhr) return false
|
|
try {
|
|
xhr.responseType = type
|
|
return xhr.responseType === type
|
|
} catch (e) {}
|
|
return false
|
|
}
|
|
|
|
// If fetch is supported, then arraybuffer will be supported too. Skip calling
|
|
// checkTypeSupport(), since that calls getXHR().
|
|
exports.arraybuffer = exports.fetch || checkTypeSupport('arraybuffer')
|
|
|
|
// These next two tests unavoidably show warnings in Chrome. Since fetch will always
|
|
// be used if it's available, just return false for these to avoid the warnings.
|
|
exports.msstream = !exports.fetch && checkTypeSupport('ms-stream')
|
|
exports.mozchunkedarraybuffer = !exports.fetch && checkTypeSupport('moz-chunked-arraybuffer')
|
|
|
|
// If fetch is supported, then overrideMimeType will be supported too. Skip calling
|
|
// getXHR().
|
|
exports.overrideMimeType = exports.fetch || (getXHR() ? isFunction(getXHR().overrideMimeType) : false)
|
|
|
|
function isFunction (value) {
|
|
return typeof value === 'function'
|
|
}
|
|
|
|
xhr = null // Help gc
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
},{}],19:[function(require,module,exports){
|
|
(function (process,global,Buffer){
|
|
var capability = require('./capability')
|
|
var inherits = require('inherits')
|
|
var response = require('./response')
|
|
var stream = require('readable-stream')
|
|
|
|
var IncomingMessage = response.IncomingMessage
|
|
var rStates = response.readyStates
|
|
|
|
function decideMode (preferBinary, useFetch) {
|
|
if (capability.fetch && useFetch) {
|
|
return 'fetch'
|
|
} else if (capability.mozchunkedarraybuffer) {
|
|
return 'moz-chunked-arraybuffer'
|
|
} else if (capability.msstream) {
|
|
return 'ms-stream'
|
|
} else if (capability.arraybuffer && preferBinary) {
|
|
return 'arraybuffer'
|
|
} else {
|
|
return 'text'
|
|
}
|
|
}
|
|
|
|
var ClientRequest = module.exports = function (opts) {
|
|
var self = this
|
|
stream.Writable.call(self)
|
|
|
|
self._opts = opts
|
|
self._body = []
|
|
self._headers = {}
|
|
if (opts.auth)
|
|
self.setHeader('Authorization', 'Basic ' + Buffer.from(opts.auth).toString('base64'))
|
|
Object.keys(opts.headers).forEach(function (name) {
|
|
self.setHeader(name, opts.headers[name])
|
|
})
|
|
|
|
var preferBinary
|
|
var useFetch = true
|
|
if (opts.mode === 'disable-fetch' || ('requestTimeout' in opts && !capability.abortController)) {
|
|
// If the use of XHR should be preferred. Not typically needed.
|
|
useFetch = false
|
|
preferBinary = true
|
|
} else if (opts.mode === 'prefer-streaming') {
|
|
// If streaming is a high priority but binary compatibility and
|
|
// the accuracy of the 'content-type' header aren't
|
|
preferBinary = false
|
|
} else if (opts.mode === 'allow-wrong-content-type') {
|
|
// If streaming is more important than preserving the 'content-type' header
|
|
preferBinary = !capability.overrideMimeType
|
|
} else if (!opts.mode || opts.mode === 'default' || opts.mode === 'prefer-fast') {
|
|
// Use binary if text streaming may corrupt data or the content-type header, or for speed
|
|
preferBinary = true
|
|
} else {
|
|
throw new Error('Invalid value for opts.mode')
|
|
}
|
|
self._mode = decideMode(preferBinary, useFetch)
|
|
self._fetchTimer = null
|
|
|
|
self.on('finish', function () {
|
|
self._onFinish()
|
|
})
|
|
}
|
|
|
|
inherits(ClientRequest, stream.Writable)
|
|
|
|
ClientRequest.prototype.setHeader = function (name, value) {
|
|
var self = this
|
|
var lowerName = name.toLowerCase()
|
|
// This check is not necessary, but it prevents warnings from browsers about setting unsafe
|
|
// headers. To be honest I'm not entirely sure hiding these warnings is a good thing, but
|
|
// http-browserify did it, so I will too.
|
|
if (unsafeHeaders.indexOf(lowerName) !== -1)
|
|
return
|
|
|
|
self._headers[lowerName] = {
|
|
name: name,
|
|
value: value
|
|
}
|
|
}
|
|
|
|
ClientRequest.prototype.getHeader = function (name) {
|
|
var header = this._headers[name.toLowerCase()]
|
|
if (header)
|
|
return header.value
|
|
return null
|
|
}
|
|
|
|
ClientRequest.prototype.removeHeader = function (name) {
|
|
var self = this
|
|
delete self._headers[name.toLowerCase()]
|
|
}
|
|
|
|
ClientRequest.prototype._onFinish = function () {
|
|
var self = this
|
|
|
|
if (self._destroyed)
|
|
return
|
|
var opts = self._opts
|
|
|
|
var headersObj = self._headers
|
|
var body = null
|
|
if (opts.method !== 'GET' && opts.method !== 'HEAD') {
|
|
body = new Blob(self._body, {
|
|
type: (headersObj['content-type'] || {}).value || ''
|
|
});
|
|
}
|
|
|
|
// create flattened list of headers
|
|
var headersList = []
|
|
Object.keys(headersObj).forEach(function (keyName) {
|
|
var name = headersObj[keyName].name
|
|
var value = headersObj[keyName].value
|
|
if (Array.isArray(value)) {
|
|
value.forEach(function (v) {
|
|
headersList.push([name, v])
|
|
})
|
|
} else {
|
|
headersList.push([name, value])
|
|
}
|
|
})
|
|
|
|
if (self._mode === 'fetch') {
|
|
var signal = null
|
|
var fetchTimer = null
|
|
if (capability.abortController) {
|
|
var controller = new AbortController()
|
|
signal = controller.signal
|
|
self._fetchAbortController = controller
|
|
|
|
if ('requestTimeout' in opts && opts.requestTimeout !== 0) {
|
|
self._fetchTimer = global.setTimeout(function () {
|
|
self.emit('requestTimeout')
|
|
if (self._fetchAbortController)
|
|
self._fetchAbortController.abort()
|
|
}, opts.requestTimeout)
|
|
}
|
|
}
|
|
|
|
global.fetch(self._opts.url, {
|
|
method: self._opts.method,
|
|
headers: headersList,
|
|
body: body || undefined,
|
|
mode: 'cors',
|
|
credentials: opts.withCredentials ? 'include' : 'same-origin',
|
|
signal: signal
|
|
}).then(function (response) {
|
|
self._fetchResponse = response
|
|
self._connect()
|
|
}, function (reason) {
|
|
global.clearTimeout(self._fetchTimer)
|
|
if (!self._destroyed)
|
|
self.emit('error', reason)
|
|
})
|
|
} else {
|
|
var xhr = self._xhr = new global.XMLHttpRequest()
|
|
try {
|
|
xhr.open(self._opts.method, self._opts.url, true)
|
|
} catch (err) {
|
|
process.nextTick(function () {
|
|
self.emit('error', err)
|
|
})
|
|
return
|
|
}
|
|
|
|
// Can't set responseType on really old browsers
|
|
if ('responseType' in xhr)
|
|
xhr.responseType = self._mode
|
|
|
|
if ('withCredentials' in xhr)
|
|
xhr.withCredentials = !!opts.withCredentials
|
|
|
|
if (self._mode === 'text' && 'overrideMimeType' in xhr)
|
|
xhr.overrideMimeType('text/plain; charset=x-user-defined')
|
|
|
|
if ('requestTimeout' in opts) {
|
|
xhr.timeout = opts.requestTimeout
|
|
xhr.ontimeout = function () {
|
|
self.emit('requestTimeout')
|
|
}
|
|
}
|
|
|
|
headersList.forEach(function (header) {
|
|
xhr.setRequestHeader(header[0], header[1])
|
|
})
|
|
|
|
self._response = null
|
|
xhr.onreadystatechange = function () {
|
|
switch (xhr.readyState) {
|
|
case rStates.LOADING:
|
|
case rStates.DONE:
|
|
self._onXHRProgress()
|
|
break
|
|
}
|
|
}
|
|
// Necessary for streaming in Firefox, since xhr.response is ONLY defined
|
|
// in onprogress, not in onreadystatechange with xhr.readyState = 3
|
|
if (self._mode === 'moz-chunked-arraybuffer') {
|
|
xhr.onprogress = function () {
|
|
self._onXHRProgress()
|
|
}
|
|
}
|
|
|
|
xhr.onerror = function () {
|
|
if (self._destroyed)
|
|
return
|
|
self.emit('error', new Error('XHR error'))
|
|
}
|
|
|
|
try {
|
|
xhr.send(body)
|
|
} catch (err) {
|
|
process.nextTick(function () {
|
|
self.emit('error', err)
|
|
})
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Checks if xhr.status is readable and non-zero, indicating no error.
|
|
* Even though the spec says it should be available in readyState 3,
|
|
* accessing it throws an exception in IE8
|
|
*/
|
|
function statusValid (xhr) {
|
|
try {
|
|
var status = xhr.status
|
|
return (status !== null && status !== 0)
|
|
} catch (e) {
|
|
return false
|
|
}
|
|
}
|
|
|
|
ClientRequest.prototype._onXHRProgress = function () {
|
|
var self = this
|
|
|
|
if (!statusValid(self._xhr) || self._destroyed)
|
|
return
|
|
|
|
if (!self._response)
|
|
self._connect()
|
|
|
|
self._response._onXHRProgress()
|
|
}
|
|
|
|
ClientRequest.prototype._connect = function () {
|
|
var self = this
|
|
|
|
if (self._destroyed)
|
|
return
|
|
|
|
self._response = new IncomingMessage(self._xhr, self._fetchResponse, self._mode, self._fetchTimer)
|
|
self._response.on('error', function(err) {
|
|
self.emit('error', err)
|
|
})
|
|
|
|
self.emit('response', self._response)
|
|
}
|
|
|
|
ClientRequest.prototype._write = function (chunk, encoding, cb) {
|
|
var self = this
|
|
|
|
self._body.push(chunk)
|
|
cb()
|
|
}
|
|
|
|
ClientRequest.prototype.abort = ClientRequest.prototype.destroy = function () {
|
|
var self = this
|
|
self._destroyed = true
|
|
global.clearTimeout(self._fetchTimer)
|
|
if (self._response)
|
|
self._response._destroyed = true
|
|
if (self._xhr)
|
|
self._xhr.abort()
|
|
else if (self._fetchAbortController)
|
|
self._fetchAbortController.abort()
|
|
}
|
|
|
|
ClientRequest.prototype.end = function (data, encoding, cb) {
|
|
var self = this
|
|
if (typeof data === 'function') {
|
|
cb = data
|
|
data = undefined
|
|
}
|
|
|
|
stream.Writable.prototype.end.call(self, data, encoding, cb)
|
|
}
|
|
|
|
ClientRequest.prototype.flushHeaders = function () {}
|
|
ClientRequest.prototype.setTimeout = function () {}
|
|
ClientRequest.prototype.setNoDelay = function () {}
|
|
ClientRequest.prototype.setSocketKeepAlive = function () {}
|
|
|
|
// Taken from http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader%28%29-method
|
|
var unsafeHeaders = [
|
|
'accept-charset',
|
|
'accept-encoding',
|
|
'access-control-request-headers',
|
|
'access-control-request-method',
|
|
'connection',
|
|
'content-length',
|
|
'cookie',
|
|
'cookie2',
|
|
'date',
|
|
'dnt',
|
|
'expect',
|
|
'host',
|
|
'keep-alive',
|
|
'origin',
|
|
'referer',
|
|
'te',
|
|
'trailer',
|
|
'transfer-encoding',
|
|
'upgrade',
|
|
'via'
|
|
]
|
|
|
|
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("buffer").Buffer)
|
|
},{"./capability":18,"./response":20,"_process":12,"buffer":4,"inherits":9,"readable-stream":35}],20:[function(require,module,exports){
|
|
(function (process,global,Buffer){
|
|
var capability = require('./capability')
|
|
var inherits = require('inherits')
|
|
var stream = require('readable-stream')
|
|
|
|
var rStates = exports.readyStates = {
|
|
UNSENT: 0,
|
|
OPENED: 1,
|
|
HEADERS_RECEIVED: 2,
|
|
LOADING: 3,
|
|
DONE: 4
|
|
}
|
|
|
|
var IncomingMessage = exports.IncomingMessage = function (xhr, response, mode, fetchTimer) {
|
|
var self = this
|
|
stream.Readable.call(self)
|
|
|
|
self._mode = mode
|
|
self.headers = {}
|
|
self.rawHeaders = []
|
|
self.trailers = {}
|
|
self.rawTrailers = []
|
|
|
|
// Fake the 'close' event, but only once 'end' fires
|
|
self.on('end', function () {
|
|
// The nextTick is necessary to prevent the 'request' module from causing an infinite loop
|
|
process.nextTick(function () {
|
|
self.emit('close')
|
|
})
|
|
})
|
|
|
|
if (mode === 'fetch') {
|
|
self._fetchResponse = response
|
|
|
|
self.url = response.url
|
|
self.statusCode = response.status
|
|
self.statusMessage = response.statusText
|
|
|
|
response.headers.forEach(function (header, key){
|
|
self.headers[key.toLowerCase()] = header
|
|
self.rawHeaders.push(key, header)
|
|
})
|
|
|
|
if (capability.writableStream) {
|
|
var writable = new WritableStream({
|
|
write: function (chunk) {
|
|
return new Promise(function (resolve, reject) {
|
|
if (self._destroyed) {
|
|
reject()
|
|
} else if(self.push(Buffer.from(chunk))) {
|
|
resolve()
|
|
} else {
|
|
self._resumeFetch = resolve
|
|
}
|
|
})
|
|
},
|
|
close: function () {
|
|
global.clearTimeout(fetchTimer)
|
|
if (!self._destroyed)
|
|
self.push(null)
|
|
},
|
|
abort: function (err) {
|
|
if (!self._destroyed)
|
|
self.emit('error', err)
|
|
}
|
|
})
|
|
|
|
try {
|
|
response.body.pipeTo(writable).catch(function (err) {
|
|
global.clearTimeout(fetchTimer)
|
|
if (!self._destroyed)
|
|
self.emit('error', err)
|
|
})
|
|
return
|
|
} catch (e) {} // pipeTo method isn't defined. Can't find a better way to feature test this
|
|
}
|
|
// fallback for when writableStream or pipeTo aren't available
|
|
var reader = response.body.getReader()
|
|
function read () {
|
|
reader.read().then(function (result) {
|
|
if (self._destroyed)
|
|
return
|
|
if (result.done) {
|
|
global.clearTimeout(fetchTimer)
|
|
self.push(null)
|
|
return
|
|
}
|
|
self.push(Buffer.from(result.value))
|
|
read()
|
|
}).catch(function (err) {
|
|
global.clearTimeout(fetchTimer)
|
|
if (!self._destroyed)
|
|
self.emit('error', err)
|
|
})
|
|
}
|
|
read()
|
|
} else {
|
|
self._xhr = xhr
|
|
self._pos = 0
|
|
|
|
self.url = xhr.responseURL
|
|
self.statusCode = xhr.status
|
|
self.statusMessage = xhr.statusText
|
|
var headers = xhr.getAllResponseHeaders().split(/\r?\n/)
|
|
headers.forEach(function (header) {
|
|
var matches = header.match(/^([^:]+):\s*(.*)/)
|
|
if (matches) {
|
|
var key = matches[1].toLowerCase()
|
|
if (key === 'set-cookie') {
|
|
if (self.headers[key] === undefined) {
|
|
self.headers[key] = []
|
|
}
|
|
self.headers[key].push(matches[2])
|
|
} else if (self.headers[key] !== undefined) {
|
|
self.headers[key] += ', ' + matches[2]
|
|
} else {
|
|
self.headers[key] = matches[2]
|
|
}
|
|
self.rawHeaders.push(matches[1], matches[2])
|
|
}
|
|
})
|
|
|
|
self._charset = 'x-user-defined'
|
|
if (!capability.overrideMimeType) {
|
|
var mimeType = self.rawHeaders['mime-type']
|
|
if (mimeType) {
|
|
var charsetMatch = mimeType.match(/;\s*charset=([^;])(;|$)/)
|
|
if (charsetMatch) {
|
|
self._charset = charsetMatch[1].toLowerCase()
|
|
}
|
|
}
|
|
if (!self._charset)
|
|
self._charset = 'utf-8' // best guess
|
|
}
|
|
}
|
|
}
|
|
|
|
inherits(IncomingMessage, stream.Readable)
|
|
|
|
IncomingMessage.prototype._read = function () {
|
|
var self = this
|
|
|
|
var resolve = self._resumeFetch
|
|
if (resolve) {
|
|
self._resumeFetch = null
|
|
resolve()
|
|
}
|
|
}
|
|
|
|
IncomingMessage.prototype._onXHRProgress = function () {
|
|
var self = this
|
|
|
|
var xhr = self._xhr
|
|
|
|
var response = null
|
|
switch (self._mode) {
|
|
case 'text':
|
|
response = xhr.responseText
|
|
if (response.length > self._pos) {
|
|
var newData = response.substr(self._pos)
|
|
if (self._charset === 'x-user-defined') {
|
|
var buffer = Buffer.alloc(newData.length)
|
|
for (var i = 0; i < newData.length; i++)
|
|
buffer[i] = newData.charCodeAt(i) & 0xff
|
|
|
|
self.push(buffer)
|
|
} else {
|
|
self.push(newData, self._charset)
|
|
}
|
|
self._pos = response.length
|
|
}
|
|
break
|
|
case 'arraybuffer':
|
|
if (xhr.readyState !== rStates.DONE || !xhr.response)
|
|
break
|
|
response = xhr.response
|
|
self.push(Buffer.from(new Uint8Array(response)))
|
|
break
|
|
case 'moz-chunked-arraybuffer': // take whole
|
|
response = xhr.response
|
|
if (xhr.readyState !== rStates.LOADING || !response)
|
|
break
|
|
self.push(Buffer.from(new Uint8Array(response)))
|
|
break
|
|
case 'ms-stream':
|
|
response = xhr.response
|
|
if (xhr.readyState !== rStates.LOADING)
|
|
break
|
|
var reader = new global.MSStreamReader()
|
|
reader.onprogress = function () {
|
|
if (reader.result.byteLength > self._pos) {
|
|
self.push(Buffer.from(new Uint8Array(reader.result.slice(self._pos))))
|
|
self._pos = reader.result.byteLength
|
|
}
|
|
}
|
|
reader.onload = function () {
|
|
self.push(null)
|
|
}
|
|
// reader.onerror = ??? // TODO: this
|
|
reader.readAsArrayBuffer(response)
|
|
break
|
|
}
|
|
|
|
// The ms-stream case handles end separately in reader.onload()
|
|
if (self._xhr.readyState === rStates.DONE && self._mode !== 'ms-stream') {
|
|
self.push(null)
|
|
}
|
|
}
|
|
|
|
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("buffer").Buffer)
|
|
},{"./capability":18,"_process":12,"buffer":4,"inherits":9,"readable-stream":35}],21:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
|
|
|
|
var codes = {};
|
|
|
|
function createErrorType(code, message, Base) {
|
|
if (!Base) {
|
|
Base = Error;
|
|
}
|
|
|
|
function getMessage(arg1, arg2, arg3) {
|
|
if (typeof message === 'string') {
|
|
return message;
|
|
} else {
|
|
return message(arg1, arg2, arg3);
|
|
}
|
|
}
|
|
|
|
var NodeError =
|
|
/*#__PURE__*/
|
|
function (_Base) {
|
|
_inheritsLoose(NodeError, _Base);
|
|
|
|
function NodeError(arg1, arg2, arg3) {
|
|
return _Base.call(this, getMessage(arg1, arg2, arg3)) || this;
|
|
}
|
|
|
|
return NodeError;
|
|
}(Base);
|
|
|
|
NodeError.prototype.name = Base.name;
|
|
NodeError.prototype.code = code;
|
|
codes[code] = NodeError;
|
|
} // https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js
|
|
|
|
|
|
function oneOf(expected, thing) {
|
|
if (Array.isArray(expected)) {
|
|
var len = expected.length;
|
|
expected = expected.map(function (i) {
|
|
return String(i);
|
|
});
|
|
|
|
if (len > 2) {
|
|
return "one of ".concat(thing, " ").concat(expected.slice(0, len - 1).join(', '), ", or ") + expected[len - 1];
|
|
} else if (len === 2) {
|
|
return "one of ".concat(thing, " ").concat(expected[0], " or ").concat(expected[1]);
|
|
} else {
|
|
return "of ".concat(thing, " ").concat(expected[0]);
|
|
}
|
|
} else {
|
|
return "of ".concat(thing, " ").concat(String(expected));
|
|
}
|
|
} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
|
|
|
|
|
|
function startsWith(str, search, pos) {
|
|
return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search;
|
|
} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
|
|
|
|
|
|
function endsWith(str, search, this_len) {
|
|
if (this_len === undefined || this_len > str.length) {
|
|
this_len = str.length;
|
|
}
|
|
|
|
return str.substring(this_len - search.length, this_len) === search;
|
|
} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes
|
|
|
|
|
|
function includes(str, search, start) {
|
|
if (typeof start !== 'number') {
|
|
start = 0;
|
|
}
|
|
|
|
if (start + search.length > str.length) {
|
|
return false;
|
|
} else {
|
|
return str.indexOf(search, start) !== -1;
|
|
}
|
|
}
|
|
|
|
createErrorType('ERR_INVALID_OPT_VALUE', function (name, value) {
|
|
return 'The value "' + value + '" is invalid for option "' + name + '"';
|
|
}, TypeError);
|
|
createErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) {
|
|
// determiner: 'must be' or 'must not be'
|
|
var determiner;
|
|
|
|
if (typeof expected === 'string' && startsWith(expected, 'not ')) {
|
|
determiner = 'must not be';
|
|
expected = expected.replace(/^not /, '');
|
|
} else {
|
|
determiner = 'must be';
|
|
}
|
|
|
|
var msg;
|
|
|
|
if (endsWith(name, ' argument')) {
|
|
// For cases like 'first argument'
|
|
msg = "The ".concat(name, " ").concat(determiner, " ").concat(oneOf(expected, 'type'));
|
|
} else {
|
|
var type = includes(name, '.') ? 'property' : 'argument';
|
|
msg = "The \"".concat(name, "\" ").concat(type, " ").concat(determiner, " ").concat(oneOf(expected, 'type'));
|
|
}
|
|
|
|
msg += ". Received type ".concat(typeof actual);
|
|
return msg;
|
|
}, TypeError);
|
|
createErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF');
|
|
createErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) {
|
|
return 'The ' + name + ' method is not implemented';
|
|
});
|
|
createErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close');
|
|
createErrorType('ERR_STREAM_DESTROYED', function (name) {
|
|
return 'Cannot call ' + name + ' after a stream was destroyed';
|
|
});
|
|
createErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times');
|
|
createErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable');
|
|
createErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end');
|
|
createErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError);
|
|
createErrorType('ERR_UNKNOWN_ENCODING', function (arg) {
|
|
return 'Unknown encoding: ' + arg;
|
|
}, TypeError);
|
|
createErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event');
|
|
module.exports.codes = codes;
|
|
|
|
},{}],22:[function(require,module,exports){
|
|
(function (process){
|
|
// Copyright Joyent, Inc. and other Node contributors.
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
// copy of this software and associated documentation files (the
|
|
// "Software"), to deal in the Software without restriction, including
|
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|
// persons to whom the Software is furnished to do so, subject to the
|
|
// following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included
|
|
// in all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
// a duplex stream is just a stream that is both readable and writable.
|
|
// Since JS doesn't have multiple prototypal inheritance, this class
|
|
// prototypally inherits from Readable, and then parasitically from
|
|
// Writable.
|
|
'use strict';
|
|
/*<replacement>*/
|
|
|
|
var objectKeys = Object.keys || function (obj) {
|
|
var keys = [];
|
|
|
|
for (var key in obj) {
|
|
keys.push(key);
|
|
}
|
|
|
|
return keys;
|
|
};
|
|
/*</replacement>*/
|
|
|
|
|
|
module.exports = Duplex;
|
|
|
|
var Readable = require('./_stream_readable');
|
|
|
|
var Writable = require('./_stream_writable');
|
|
|
|
require('inherits')(Duplex, Readable);
|
|
|
|
{
|
|
// Allow the keys array to be GC'ed.
|
|
var keys = objectKeys(Writable.prototype);
|
|
|
|
for (var v = 0; v < keys.length; v++) {
|
|
var method = keys[v];
|
|
if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
|
|
}
|
|
}
|
|
|
|
function Duplex(options) {
|
|
if (!(this instanceof Duplex)) return new Duplex(options);
|
|
Readable.call(this, options);
|
|
Writable.call(this, options);
|
|
this.allowHalfOpen = true;
|
|
|
|
if (options) {
|
|
if (options.readable === false) this.readable = false;
|
|
if (options.writable === false) this.writable = false;
|
|
|
|
if (options.allowHalfOpen === false) {
|
|
this.allowHalfOpen = false;
|
|
this.once('end', onend);
|
|
}
|
|
}
|
|
}
|
|
|
|
Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', {
|
|
// making it explicit this property is not enumerable
|
|
// because otherwise some prototype manipulation in
|
|
// userland will fail
|
|
enumerable: false,
|
|
get: function get() {
|
|
return this._writableState.highWaterMark;
|
|
}
|
|
});
|
|
Object.defineProperty(Duplex.prototype, 'writableBuffer', {
|
|
// making it explicit this property is not enumerable
|
|
// because otherwise some prototype manipulation in
|
|
// userland will fail
|
|
enumerable: false,
|
|
get: function get() {
|
|
return this._writableState && this._writableState.getBuffer();
|
|
}
|
|
});
|
|
Object.defineProperty(Duplex.prototype, 'writableLength', {
|
|
// making it explicit this property is not enumerable
|
|
// because otherwise some prototype manipulation in
|
|
// userland will fail
|
|
enumerable: false,
|
|
get: function get() {
|
|
return this._writableState.length;
|
|
}
|
|
}); // the no-half-open enforcer
|
|
|
|
function onend() {
|
|
// If the writable side ended, then we're ok.
|
|
if (this._writableState.ended) return; // no more data can be written.
|
|
// But allow more writes to happen in this tick.
|
|
|
|
process.nextTick(onEndNT, this);
|
|
}
|
|
|
|
function onEndNT(self) {
|
|
self.end();
|
|
}
|
|
|
|
Object.defineProperty(Duplex.prototype, 'destroyed', {
|
|
// making it explicit this property is not enumerable
|
|
// because otherwise some prototype manipulation in
|
|
// userland will fail
|
|
enumerable: false,
|
|
get: function get() {
|
|
if (this._readableState === undefined || this._writableState === undefined) {
|
|
return false;
|
|
}
|
|
|
|
return this._readableState.destroyed && this._writableState.destroyed;
|
|
},
|
|
set: function set(value) {
|
|
// we ignore the value if the stream
|
|
// has not been initialized yet
|
|
if (this._readableState === undefined || this._writableState === undefined) {
|
|
return;
|
|
} // backward compatibility, the user is explicitly
|
|
// managing destroyed
|
|
|
|
|
|
this._readableState.destroyed = value;
|
|
this._writableState.destroyed = value;
|
|
}
|
|
});
|
|
}).call(this,require('_process'))
|
|
},{"./_stream_readable":24,"./_stream_writable":26,"_process":12,"inherits":9}],23:[function(require,module,exports){
|
|
// Copyright Joyent, Inc. and other Node contributors.
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
// copy of this software and associated documentation files (the
|
|
// "Software"), to deal in the Software without restriction, including
|
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|
// persons to whom the Software is furnished to do so, subject to the
|
|
// following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included
|
|
// in all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
// a passthrough stream.
|
|
// basically just the most minimal sort of Transform stream.
|
|
// Every written chunk gets output as-is.
|
|
'use strict';
|
|
|
|
module.exports = PassThrough;
|
|
|
|
var Transform = require('./_stream_transform');
|
|
|
|
require('inherits')(PassThrough, Transform);
|
|
|
|
function PassThrough(options) {
|
|
if (!(this instanceof PassThrough)) return new PassThrough(options);
|
|
Transform.call(this, options);
|
|
}
|
|
|
|
PassThrough.prototype._transform = function (chunk, encoding, cb) {
|
|
cb(null, chunk);
|
|
};
|
|
},{"./_stream_transform":25,"inherits":9}],24:[function(require,module,exports){
|
|
(function (process,global){
|
|
// Copyright Joyent, Inc. and other Node contributors.
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
// copy of this software and associated documentation files (the
|
|
// "Software"), to deal in the Software without restriction, including
|
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|
// persons to whom the Software is furnished to do so, subject to the
|
|
// following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included
|
|
// in all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
'use strict';
|
|
|
|
module.exports = Readable;
|
|
/*<replacement>*/
|
|
|
|
var Duplex;
|
|
/*</replacement>*/
|
|
|
|
Readable.ReadableState = ReadableState;
|
|
/*<replacement>*/
|
|
|
|
var EE = require('events').EventEmitter;
|
|
|
|
var EElistenerCount = function EElistenerCount(emitter, type) {
|
|
return emitter.listeners(type).length;
|
|
};
|
|
/*</replacement>*/
|
|
|
|
/*<replacement>*/
|
|
|
|
|
|
var Stream = require('./internal/streams/stream');
|
|
/*</replacement>*/
|
|
|
|
|
|
var Buffer = require('buffer').Buffer;
|
|
|
|
var OurUint8Array = global.Uint8Array || function () {};
|
|
|
|
function _uint8ArrayToBuffer(chunk) {
|
|
return Buffer.from(chunk);
|
|
}
|
|
|
|
function _isUint8Array(obj) {
|
|
return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
|
|
}
|
|
/*<replacement>*/
|
|
|
|
|
|
var debugUtil = require('util');
|
|
|
|
var debug;
|
|
|
|
if (debugUtil && debugUtil.debuglog) {
|
|
debug = debugUtil.debuglog('stream');
|
|
} else {
|
|
debug = function debug() {};
|
|
}
|
|
/*</replacement>*/
|
|
|
|
|
|
var BufferList = require('./internal/streams/buffer_list');
|
|
|
|
var destroyImpl = require('./internal/streams/destroy');
|
|
|
|
var _require = require('./internal/streams/state'),
|
|
getHighWaterMark = _require.getHighWaterMark;
|
|
|
|
var _require$codes = require('../errors').codes,
|
|
ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,
|
|
ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF,
|
|
ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,
|
|
ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; // Lazy loaded to improve the startup performance.
|
|
|
|
|
|
var StringDecoder;
|
|
var createReadableStreamAsyncIterator;
|
|
var from;
|
|
|
|
require('inherits')(Readable, Stream);
|
|
|
|
var errorOrDestroy = destroyImpl.errorOrDestroy;
|
|
var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];
|
|
|
|
function prependListener(emitter, event, fn) {
|
|
// Sadly this is not cacheable as some libraries bundle their own
|
|
// event emitter implementation with them.
|
|
if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); // This is a hack to make sure that our error handler is attached before any
|
|
// userland ones. NEVER DO THIS. This is here only because this code needs
|
|
// to continue to work with older versions of Node.js that do not include
|
|
// the prependListener() method. The goal is to eventually remove this hack.
|
|
|
|
if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
|
|
}
|
|
|
|
function ReadableState(options, stream, isDuplex) {
|
|
Duplex = Duplex || require('./_stream_duplex');
|
|
options = options || {}; // Duplex streams are both readable and writable, but share
|
|
// the same options object.
|
|
// However, some cases require setting options to different
|
|
// values for the readable and the writable sides of the duplex stream.
|
|
// These options can be provided separately as readableXXX and writableXXX.
|
|
|
|
if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag. Used to make read(n) ignore n and to
|
|
// make all the buffer merging and length checks go away
|
|
|
|
this.objectMode = !!options.objectMode;
|
|
if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer
|
|
// Note: 0 is a valid value, means "don't call _read preemptively ever"
|
|
|
|
this.highWaterMark = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex); // A linked list is used to store data chunks instead of an array because the
|
|
// linked list can remove elements from the beginning faster than
|
|
// array.shift()
|
|
|
|
this.buffer = new BufferList();
|
|
this.length = 0;
|
|
this.pipes = null;
|
|
this.pipesCount = 0;
|
|
this.flowing = null;
|
|
this.ended = false;
|
|
this.endEmitted = false;
|
|
this.reading = false; // a flag to be able to tell if the event 'readable'/'data' is emitted
|
|
// immediately, or on a later tick. We set this to true at first, because
|
|
// any actions that shouldn't happen until "later" should generally also
|
|
// not happen before the first read call.
|
|
|
|
this.sync = true; // whenever we return null, then we set a flag to say
|
|
// that we're awaiting a 'readable' event emission.
|
|
|
|
this.needReadable = false;
|
|
this.emittedReadable = false;
|
|
this.readableListening = false;
|
|
this.resumeScheduled = false;
|
|
this.paused = true; // Should close be emitted on destroy. Defaults to true.
|
|
|
|
this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'end' (and potentially 'finish')
|
|
|
|
this.autoDestroy = !!options.autoDestroy; // has it been destroyed
|
|
|
|
this.destroyed = false; // Crypto is kind of old and crusty. Historically, its default string
|
|
// encoding is 'binary' so we have to make this configurable.
|
|
// Everything else in the universe uses 'utf8', though.
|
|
|
|
this.defaultEncoding = options.defaultEncoding || 'utf8'; // the number of writers that are awaiting a drain event in .pipe()s
|
|
|
|
this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled
|
|
|
|
this.readingMore = false;
|
|
this.decoder = null;
|
|
this.encoding = null;
|
|
|
|
if (options.encoding) {
|
|
if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
|
|
this.decoder = new StringDecoder(options.encoding);
|
|
this.encoding = options.encoding;
|
|
}
|
|
}
|
|
|
|
function Readable(options) {
|
|
Duplex = Duplex || require('./_stream_duplex');
|
|
if (!(this instanceof Readable)) return new Readable(options); // Checking for a Stream.Duplex instance is faster here instead of inside
|
|
// the ReadableState constructor, at least with V8 6.5
|
|
|
|
var isDuplex = this instanceof Duplex;
|
|
this._readableState = new ReadableState(options, this, isDuplex); // legacy
|
|
|
|
this.readable = true;
|
|
|
|
if (options) {
|
|
if (typeof options.read === 'function') this._read = options.read;
|
|
if (typeof options.destroy === 'function') this._destroy = options.destroy;
|
|
}
|
|
|
|
Stream.call(this);
|
|
}
|
|
|
|
Object.defineProperty(Readable.prototype, 'destroyed', {
|
|
// making it explicit this property is not enumerable
|
|
// because otherwise some prototype manipulation in
|
|
// userland will fail
|
|
enumerable: false,
|
|
get: function get() {
|
|
if (this._readableState === undefined) {
|
|
return false;
|
|
}
|
|
|
|
return this._readableState.destroyed;
|
|
},
|
|
set: function set(value) {
|
|
// we ignore the value if the stream
|
|
// has not been initialized yet
|
|
if (!this._readableState) {
|
|
return;
|
|
} // backward compatibility, the user is explicitly
|
|
// managing destroyed
|
|
|
|
|
|
this._readableState.destroyed = value;
|
|
}
|
|
});
|
|
Readable.prototype.destroy = destroyImpl.destroy;
|
|
Readable.prototype._undestroy = destroyImpl.undestroy;
|
|
|
|
Readable.prototype._destroy = function (err, cb) {
|
|
cb(err);
|
|
}; // Manually shove something into the read() buffer.
|
|
// This returns true if the highWaterMark has not been hit yet,
|
|
// similar to how Writable.write() returns true if you should
|
|
// write() some more.
|
|
|
|
|
|
Readable.prototype.push = function (chunk, encoding) {
|
|
var state = this._readableState;
|
|
var skipChunkCheck;
|
|
|
|
if (!state.objectMode) {
|
|
if (typeof chunk === 'string') {
|
|
encoding = encoding || state.defaultEncoding;
|
|
|
|
if (encoding !== state.encoding) {
|
|
chunk = Buffer.from(chunk, encoding);
|
|
encoding = '';
|
|
}
|
|
|
|
skipChunkCheck = true;
|
|
}
|
|
} else {
|
|
skipChunkCheck = true;
|
|
}
|
|
|
|
return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);
|
|
}; // Unshift should *always* be something directly out of read()
|
|
|
|
|
|
Readable.prototype.unshift = function (chunk) {
|
|
return readableAddChunk(this, chunk, null, true, false);
|
|
};
|
|
|
|
function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {
|
|
debug('readableAddChunk', chunk);
|
|
var state = stream._readableState;
|
|
|
|
if (chunk === null) {
|
|
state.reading = false;
|
|
onEofChunk(stream, state);
|
|
} else {
|
|
var er;
|
|
if (!skipChunkCheck) er = chunkInvalid(state, chunk);
|
|
|
|
if (er) {
|
|
errorOrDestroy(stream, er);
|
|
} else if (state.objectMode || chunk && chunk.length > 0) {
|
|
if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {
|
|
chunk = _uint8ArrayToBuffer(chunk);
|
|
}
|
|
|
|
if (addToFront) {
|
|
if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true);
|
|
} else if (state.ended) {
|
|
errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF());
|
|
} else if (state.destroyed) {
|
|
return false;
|
|
} else {
|
|
state.reading = false;
|
|
|
|
if (state.decoder && !encoding) {
|
|
chunk = state.decoder.write(chunk);
|
|
if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);
|
|
} else {
|
|
addChunk(stream, state, chunk, false);
|
|
}
|
|
}
|
|
} else if (!addToFront) {
|
|
state.reading = false;
|
|
maybeReadMore(stream, state);
|
|
}
|
|
} // We can push more data if we are below the highWaterMark.
|
|
// Also, if we have no data yet, we can stand some more bytes.
|
|
// This is to work around cases where hwm=0, such as the repl.
|
|
|
|
|
|
return !state.ended && (state.length < state.highWaterMark || state.length === 0);
|
|
}
|
|
|
|
function addChunk(stream, state, chunk, addToFront) {
|
|
if (state.flowing && state.length === 0 && !state.sync) {
|
|
state.awaitDrain = 0;
|
|
stream.emit('data', chunk);
|
|
} else {
|
|
// update the buffer info.
|
|
state.length += state.objectMode ? 1 : chunk.length;
|
|
if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
|
|
if (state.needReadable) emitReadable(stream);
|
|
}
|
|
|
|
maybeReadMore(stream, state);
|
|
}
|
|
|
|
function chunkInvalid(state, chunk) {
|
|
var er;
|
|
|
|
if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
|
|
er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk);
|
|
}
|
|
|
|
return er;
|
|
}
|
|
|
|
Readable.prototype.isPaused = function () {
|
|
return this._readableState.flowing === false;
|
|
}; // backwards compatibility.
|
|
|
|
|
|
Readable.prototype.setEncoding = function (enc) {
|
|
if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
|
|
var decoder = new StringDecoder(enc);
|
|
this._readableState.decoder = decoder; // If setEncoding(null), decoder.encoding equals utf8
|
|
|
|
this._readableState.encoding = this._readableState.decoder.encoding; // Iterate over current buffer to convert already stored Buffers:
|
|
|
|
var p = this._readableState.buffer.head;
|
|
var content = '';
|
|
|
|
while (p !== null) {
|
|
content += decoder.write(p.data);
|
|
p = p.next;
|
|
}
|
|
|
|
this._readableState.buffer.clear();
|
|
|
|
if (content !== '') this._readableState.buffer.push(content);
|
|
this._readableState.length = content.length;
|
|
return this;
|
|
}; // Don't raise the hwm > 1GB
|
|
|
|
|
|
var MAX_HWM = 0x40000000;
|
|
|
|
function computeNewHighWaterMark(n) {
|
|
if (n >= MAX_HWM) {
|
|
// TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE.
|
|
n = MAX_HWM;
|
|
} else {
|
|
// Get the next highest power of 2 to prevent increasing hwm excessively in
|
|
// tiny amounts
|
|
n--;
|
|
n |= n >>> 1;
|
|
n |= n >>> 2;
|
|
n |= n >>> 4;
|
|
n |= n >>> 8;
|
|
n |= n >>> 16;
|
|
n++;
|
|
}
|
|
|
|
return n;
|
|
} // This function is designed to be inlinable, so please take care when making
|
|
// changes to the function body.
|
|
|
|
|
|
function howMuchToRead(n, state) {
|
|
if (n <= 0 || state.length === 0 && state.ended) return 0;
|
|
if (state.objectMode) return 1;
|
|
|
|
if (n !== n) {
|
|
// Only flow one buffer at a time
|
|
if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
|
|
} // If we're asking for more than the current hwm, then raise the hwm.
|
|
|
|
|
|
if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
|
|
if (n <= state.length) return n; // Don't have enough
|
|
|
|
if (!state.ended) {
|
|
state.needReadable = true;
|
|
return 0;
|
|
}
|
|
|
|
return state.length;
|
|
} // you can override either this method, or the async _read(n) below.
|
|
|
|
|
|
Readable.prototype.read = function (n) {
|
|
debug('read', n);
|
|
n = parseInt(n, 10);
|
|
var state = this._readableState;
|
|
var nOrig = n;
|
|
if (n !== 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we
|
|
// already have a bunch of data in the buffer, then just trigger
|
|
// the 'readable' event and move on.
|
|
|
|
if (n === 0 && state.needReadable && ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)) {
|
|
debug('read: emitReadable', state.length, state.ended);
|
|
if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
|
|
return null;
|
|
}
|
|
|
|
n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up.
|
|
|
|
if (n === 0 && state.ended) {
|
|
if (state.length === 0) endReadable(this);
|
|
return null;
|
|
} // All the actual chunk generation logic needs to be
|
|
// *below* the call to _read. The reason is that in certain
|
|
// synthetic stream cases, such as passthrough streams, _read
|
|
// may be a completely synchronous operation which may change
|
|
// the state of the read buffer, providing enough data when
|
|
// before there was *not* enough.
|
|
//
|
|
// So, the steps are:
|
|
// 1. Figure out what the state of things will be after we do
|
|
// a read from the buffer.
|
|
//
|
|
// 2. If that resulting state will trigger a _read, then call _read.
|
|
// Note that this may be asynchronous, or synchronous. Yes, it is
|
|
// deeply ugly to write APIs this way, but that still doesn't mean
|
|
// that the Readable class should behave improperly, as streams are
|
|
// designed to be sync/async agnostic.
|
|
// Take note if the _read call is sync or async (ie, if the read call
|
|
// has returned yet), so that we know whether or not it's safe to emit
|
|
// 'readable' etc.
|
|
//
|
|
// 3. Actually pull the requested chunks out of the buffer and return.
|
|
// if we need a readable event, then we need to do some reading.
|
|
|
|
|
|
var doRead = state.needReadable;
|
|
debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some
|
|
|
|
if (state.length === 0 || state.length - n < state.highWaterMark) {
|
|
doRead = true;
|
|
debug('length less than watermark', doRead);
|
|
} // however, if we've ended, then there's no point, and if we're already
|
|
// reading, then it's unnecessary.
|
|
|
|
|
|
if (state.ended || state.reading) {
|
|
doRead = false;
|
|
debug('reading or ended', doRead);
|
|
} else if (doRead) {
|
|
debug('do read');
|
|
state.reading = true;
|
|
state.sync = true; // if the length is currently zero, then we *need* a readable event.
|
|
|
|
if (state.length === 0) state.needReadable = true; // call internal read method
|
|
|
|
this._read(state.highWaterMark);
|
|
|
|
state.sync = false; // If _read pushed data synchronously, then `reading` will be false,
|
|
// and we need to re-evaluate how much data we can return to the user.
|
|
|
|
if (!state.reading) n = howMuchToRead(nOrig, state);
|
|
}
|
|
|
|
var ret;
|
|
if (n > 0) ret = fromList(n, state);else ret = null;
|
|
|
|
if (ret === null) {
|
|
state.needReadable = state.length <= state.highWaterMark;
|
|
n = 0;
|
|
} else {
|
|
state.length -= n;
|
|
state.awaitDrain = 0;
|
|
}
|
|
|
|
if (state.length === 0) {
|
|
// If we have nothing in the buffer, then we want to know
|
|
// as soon as we *do* get something into the buffer.
|
|
if (!state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick.
|
|
|
|
if (nOrig !== n && state.ended) endReadable(this);
|
|
}
|
|
|
|
if (ret !== null) this.emit('data', ret);
|
|
return ret;
|
|
};
|
|
|
|
function onEofChunk(stream, state) {
|
|
debug('onEofChunk');
|
|
if (state.ended) return;
|
|
|
|
if (state.decoder) {
|
|
var chunk = state.decoder.end();
|
|
|
|
if (chunk && chunk.length) {
|
|
state.buffer.push(chunk);
|
|
state.length += state.objectMode ? 1 : chunk.length;
|
|
}
|
|
}
|
|
|
|
state.ended = true;
|
|
|
|
if (state.sync) {
|
|
// if we are sync, wait until next tick to emit the data.
|
|
// Otherwise we risk emitting data in the flow()
|
|
// the readable code triggers during a read() call
|
|
emitReadable(stream);
|
|
} else {
|
|
// emit 'readable' now to make sure it gets picked up.
|
|
state.needReadable = false;
|
|
|
|
if (!state.emittedReadable) {
|
|
state.emittedReadable = true;
|
|
emitReadable_(stream);
|
|
}
|
|
}
|
|
} // Don't emit readable right away in sync mode, because this can trigger
|
|
// another read() call => stack overflow. This way, it might trigger
|
|
// a nextTick recursion warning, but that's not so bad.
|
|
|
|
|
|
function emitReadable(stream) {
|
|
var state = stream._readableState;
|
|
debug('emitReadable', state.needReadable, state.emittedReadable);
|
|
state.needReadable = false;
|
|
|
|
if (!state.emittedReadable) {
|
|
debug('emitReadable', state.flowing);
|
|
state.emittedReadable = true;
|
|
process.nextTick(emitReadable_, stream);
|
|
}
|
|
}
|
|
|
|
function emitReadable_(stream) {
|
|
var state = stream._readableState;
|
|
debug('emitReadable_', state.destroyed, state.length, state.ended);
|
|
|
|
if (!state.destroyed && (state.length || state.ended)) {
|
|
stream.emit('readable');
|
|
state.emittedReadable = false;
|
|
} // The stream needs another readable event if
|
|
// 1. It is not flowing, as the flow mechanism will take
|
|
// care of it.
|
|
// 2. It is not ended.
|
|
// 3. It is below the highWaterMark, so we can schedule
|
|
// another readable later.
|
|
|
|
|
|
state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark;
|
|
flow(stream);
|
|
} // at this point, the user has presumably seen the 'readable' event,
|
|
// and called read() to consume some data. that may have triggered
|
|
// in turn another _read(n) call, in which case reading = true if
|
|
// it's in progress.
|
|
// However, if we're not ended, or reading, and the length < hwm,
|
|
// then go ahead and try to read some more preemptively.
|
|
|
|
|
|
function maybeReadMore(stream, state) {
|
|
if (!state.readingMore) {
|
|
state.readingMore = true;
|
|
process.nextTick(maybeReadMore_, stream, state);
|
|
}
|
|
}
|
|
|
|
function maybeReadMore_(stream, state) {
|
|
// Attempt to read more data if we should.
|
|
//
|
|
// The conditions for reading more data are (one of):
|
|
// - Not enough data buffered (state.length < state.highWaterMark). The loop
|
|
// is responsible for filling the buffer with enough data if such data
|
|
// is available. If highWaterMark is 0 and we are not in the flowing mode
|
|
// we should _not_ attempt to buffer any extra data. We'll get more data
|
|
// when the stream consumer calls read() instead.
|
|
// - No data in the buffer, and the stream is in flowing mode. In this mode
|
|
// the loop below is responsible for ensuring read() is called. Failing to
|
|
// call read here would abort the flow and there's no other mechanism for
|
|
// continuing the flow if the stream consumer has just subscribed to the
|
|
// 'data' event.
|
|
//
|
|
// In addition to the above conditions to keep reading data, the following
|
|
// conditions prevent the data from being read:
|
|
// - The stream has ended (state.ended).
|
|
// - There is already a pending 'read' operation (state.reading). This is a
|
|
// case where the the stream has called the implementation defined _read()
|
|
// method, but they are processing the call asynchronously and have _not_
|
|
// called push() with new data. In this case we skip performing more
|
|
// read()s. The execution ends in this method again after the _read() ends
|
|
// up calling push() with more data.
|
|
while (!state.reading && !state.ended && (state.length < state.highWaterMark || state.flowing && state.length === 0)) {
|
|
var len = state.length;
|
|
debug('maybeReadMore read 0');
|
|
stream.read(0);
|
|
if (len === state.length) // didn't get any data, stop spinning.
|
|
break;
|
|
}
|
|
|
|
state.readingMore = false;
|
|
} // abstract method. to be overridden in specific implementation classes.
|
|
// call cb(er, data) where data is <= n in length.
|
|
// for virtual (non-string, non-buffer) streams, "length" is somewhat
|
|
// arbitrary, and perhaps not very meaningful.
|
|
|
|
|
|
Readable.prototype._read = function (n) {
|
|
errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED('_read()'));
|
|
};
|
|
|
|
Readable.prototype.pipe = function (dest, pipeOpts) {
|
|
var src = this;
|
|
var state = this._readableState;
|
|
|
|
switch (state.pipesCount) {
|
|
case 0:
|
|
state.pipes = dest;
|
|
break;
|
|
|
|
case 1:
|
|
state.pipes = [state.pipes, dest];
|
|
break;
|
|
|
|
default:
|
|
state.pipes.push(dest);
|
|
break;
|
|
}
|
|
|
|
state.pipesCount += 1;
|
|
debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
|
|
var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
|
|
var endFn = doEnd ? onend : unpipe;
|
|
if (state.endEmitted) process.nextTick(endFn);else src.once('end', endFn);
|
|
dest.on('unpipe', onunpipe);
|
|
|
|
function onunpipe(readable, unpipeInfo) {
|
|
debug('onunpipe');
|
|
|
|
if (readable === src) {
|
|
if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
|
|
unpipeInfo.hasUnpiped = true;
|
|
cleanup();
|
|
}
|
|
}
|
|
}
|
|
|
|
function onend() {
|
|
debug('onend');
|
|
dest.end();
|
|
} // when the dest drains, it reduces the awaitDrain counter
|
|
// on the source. This would be more elegant with a .once()
|
|
// handler in flow(), but adding and removing repeatedly is
|
|
// too slow.
|
|
|
|
|
|
var ondrain = pipeOnDrain(src);
|
|
dest.on('drain', ondrain);
|
|
var cleanedUp = false;
|
|
|
|
function cleanup() {
|
|
debug('cleanup'); // cleanup event handlers once the pipe is broken
|
|
|
|
dest.removeListener('close', onclose);
|
|
dest.removeListener('finish', onfinish);
|
|
dest.removeListener('drain', ondrain);
|
|
dest.removeListener('error', onerror);
|
|
dest.removeListener('unpipe', onunpipe);
|
|
src.removeListener('end', onend);
|
|
src.removeListener('end', unpipe);
|
|
src.removeListener('data', ondata);
|
|
cleanedUp = true; // if the reader is waiting for a drain event from this
|
|
// specific writer, then it would cause it to never start
|
|
// flowing again.
|
|
// So, if this is awaiting a drain, then we just call it now.
|
|
// If we don't know, then assume that we are waiting for one.
|
|
|
|
if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
|
|
}
|
|
|
|
src.on('data', ondata);
|
|
|
|
function ondata(chunk) {
|
|
debug('ondata');
|
|
var ret = dest.write(chunk);
|
|
debug('dest.write', ret);
|
|
|
|
if (ret === false) {
|
|
// If the user unpiped during `dest.write()`, it is possible
|
|
// to get stuck in a permanently paused state if that write
|
|
// also returned false.
|
|
// => Check whether `dest` is still a piping destination.
|
|
if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
|
|
debug('false write response, pause', state.awaitDrain);
|
|
state.awaitDrain++;
|
|
}
|
|
|
|
src.pause();
|
|
}
|
|
} // if the dest has an error, then stop piping into it.
|
|
// however, don't suppress the throwing behavior for this.
|
|
|
|
|
|
function onerror(er) {
|
|
debug('onerror', er);
|
|
unpipe();
|
|
dest.removeListener('error', onerror);
|
|
if (EElistenerCount(dest, 'error') === 0) errorOrDestroy(dest, er);
|
|
} // Make sure our error handler is attached before userland ones.
|
|
|
|
|
|
prependListener(dest, 'error', onerror); // Both close and finish should trigger unpipe, but only once.
|
|
|
|
function onclose() {
|
|
dest.removeListener('finish', onfinish);
|
|
unpipe();
|
|
}
|
|
|
|
dest.once('close', onclose);
|
|
|
|
function onfinish() {
|
|
debug('onfinish');
|
|
dest.removeListener('close', onclose);
|
|
unpipe();
|
|
}
|
|
|
|
dest.once('finish', onfinish);
|
|
|
|
function unpipe() {
|
|
debug('unpipe');
|
|
src.unpipe(dest);
|
|
} // tell the dest that it's being piped to
|
|
|
|
|
|
dest.emit('pipe', src); // start the flow if it hasn't been started already.
|
|
|
|
if (!state.flowing) {
|
|
debug('pipe resume');
|
|
src.resume();
|
|
}
|
|
|
|
return dest;
|
|
};
|
|
|
|
function pipeOnDrain(src) {
|
|
return function pipeOnDrainFunctionResult() {
|
|
var state = src._readableState;
|
|
debug('pipeOnDrain', state.awaitDrain);
|
|
if (state.awaitDrain) state.awaitDrain--;
|
|
|
|
if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
|
|
state.flowing = true;
|
|
flow(src);
|
|
}
|
|
};
|
|
}
|
|
|
|
Readable.prototype.unpipe = function (dest) {
|
|
var state = this._readableState;
|
|
var unpipeInfo = {
|
|
hasUnpiped: false
|
|
}; // if we're not piping anywhere, then do nothing.
|
|
|
|
if (state.pipesCount === 0) return this; // just one destination. most common case.
|
|
|
|
if (state.pipesCount === 1) {
|
|
// passed in one, but it's not the right one.
|
|
if (dest && dest !== state.pipes) return this;
|
|
if (!dest) dest = state.pipes; // got a match.
|
|
|
|
state.pipes = null;
|
|
state.pipesCount = 0;
|
|
state.flowing = false;
|
|
if (dest) dest.emit('unpipe', this, unpipeInfo);
|
|
return this;
|
|
} // slow case. multiple pipe destinations.
|
|
|
|
|
|
if (!dest) {
|
|
// remove all.
|
|
var dests = state.pipes;
|
|
var len = state.pipesCount;
|
|
state.pipes = null;
|
|
state.pipesCount = 0;
|
|
state.flowing = false;
|
|
|
|
for (var i = 0; i < len; i++) {
|
|
dests[i].emit('unpipe', this, {
|
|
hasUnpiped: false
|
|
});
|
|
}
|
|
|
|
return this;
|
|
} // try to find the right one.
|
|
|
|
|
|
var index = indexOf(state.pipes, dest);
|
|
if (index === -1) return this;
|
|
state.pipes.splice(index, 1);
|
|
state.pipesCount -= 1;
|
|
if (state.pipesCount === 1) state.pipes = state.pipes[0];
|
|
dest.emit('unpipe', this, unpipeInfo);
|
|
return this;
|
|
}; // set up data events if they are asked for
|
|
// Ensure readable listeners eventually get something
|
|
|
|
|
|
Readable.prototype.on = function (ev, fn) {
|
|
var res = Stream.prototype.on.call(this, ev, fn);
|
|
var state = this._readableState;
|
|
|
|
if (ev === 'data') {
|
|
// update readableListening so that resume() may be a no-op
|
|
// a few lines down. This is needed to support once('readable').
|
|
state.readableListening = this.listenerCount('readable') > 0; // Try start flowing on next tick if stream isn't explicitly paused
|
|
|
|
if (state.flowing !== false) this.resume();
|
|
} else if (ev === 'readable') {
|
|
if (!state.endEmitted && !state.readableListening) {
|
|
state.readableListening = state.needReadable = true;
|
|
state.flowing = false;
|
|
state.emittedReadable = false;
|
|
debug('on readable', state.length, state.reading);
|
|
|
|
if (state.length) {
|
|
emitReadable(this);
|
|
} else if (!state.reading) {
|
|
process.nextTick(nReadingNextTick, this);
|
|
}
|
|
}
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
Readable.prototype.addListener = Readable.prototype.on;
|
|
|
|
Readable.prototype.removeListener = function (ev, fn) {
|
|
var res = Stream.prototype.removeListener.call(this, ev, fn);
|
|
|
|
if (ev === 'readable') {
|
|
// We need to check if there is someone still listening to
|
|
// readable and reset the state. However this needs to happen
|
|
// after readable has been emitted but before I/O (nextTick) to
|
|
// support once('readable', fn) cycles. This means that calling
|
|
// resume within the same tick will have no
|
|
// effect.
|
|
process.nextTick(updateReadableListening, this);
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
Readable.prototype.removeAllListeners = function (ev) {
|
|
var res = Stream.prototype.removeAllListeners.apply(this, arguments);
|
|
|
|
if (ev === 'readable' || ev === undefined) {
|
|
// We need to check if there is someone still listening to
|
|
// readable and reset the state. However this needs to happen
|
|
// after readable has been emitted but before I/O (nextTick) to
|
|
// support once('readable', fn) cycles. This means that calling
|
|
// resume within the same tick will have no
|
|
// effect.
|
|
process.nextTick(updateReadableListening, this);
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
function updateReadableListening(self) {
|
|
var state = self._readableState;
|
|
state.readableListening = self.listenerCount('readable') > 0;
|
|
|
|
if (state.resumeScheduled && !state.paused) {
|
|
// flowing needs to be set to true now, otherwise
|
|
// the upcoming resume will not flow.
|
|
state.flowing = true; // crude way to check if we should resume
|
|
} else if (self.listenerCount('data') > 0) {
|
|
self.resume();
|
|
}
|
|
}
|
|
|
|
function nReadingNextTick(self) {
|
|
debug('readable nexttick read 0');
|
|
self.read(0);
|
|
} // pause() and resume() are remnants of the legacy readable stream API
|
|
// If the user uses them, then switch into old mode.
|
|
|
|
|
|
Readable.prototype.resume = function () {
|
|
var state = this._readableState;
|
|
|
|
if (!state.flowing) {
|
|
debug('resume'); // we flow only if there is no one listening
|
|
// for readable, but we still have to call
|
|
// resume()
|
|
|
|
state.flowing = !state.readableListening;
|
|
resume(this, state);
|
|
}
|
|
|
|
state.paused = false;
|
|
return this;
|
|
};
|
|
|
|
function resume(stream, state) {
|
|
if (!state.resumeScheduled) {
|
|
state.resumeScheduled = true;
|
|
process.nextTick(resume_, stream, state);
|
|
}
|
|
}
|
|
|
|
function resume_(stream, state) {
|
|
debug('resume', state.reading);
|
|
|
|
if (!state.reading) {
|
|
stream.read(0);
|
|
}
|
|
|
|
state.resumeScheduled = false;
|
|
stream.emit('resume');
|
|
flow(stream);
|
|
if (state.flowing && !state.reading) stream.read(0);
|
|
}
|
|
|
|
Readable.prototype.pause = function () {
|
|
debug('call pause flowing=%j', this._readableState.flowing);
|
|
|
|
if (this._readableState.flowing !== false) {
|
|
debug('pause');
|
|
this._readableState.flowing = false;
|
|
this.emit('pause');
|
|
}
|
|
|
|
this._readableState.paused = true;
|
|
return this;
|
|
};
|
|
|
|
function flow(stream) {
|
|
var state = stream._readableState;
|
|
debug('flow', state.flowing);
|
|
|
|
while (state.flowing && stream.read() !== null) {
|
|
;
|
|
}
|
|
} // wrap an old-style stream as the async data source.
|
|
// This is *not* part of the readable stream interface.
|
|
// It is an ugly unfortunate mess of history.
|
|
|
|
|
|
Readable.prototype.wrap = function (stream) {
|
|
var _this = this;
|
|
|
|
var state = this._readableState;
|
|
var paused = false;
|
|
stream.on('end', function () {
|
|
debug('wrapped end');
|
|
|
|
if (state.decoder && !state.ended) {
|
|
var chunk = state.decoder.end();
|
|
if (chunk && chunk.length) _this.push(chunk);
|
|
}
|
|
|
|
_this.push(null);
|
|
});
|
|
stream.on('data', function (chunk) {
|
|
debug('wrapped data');
|
|
if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode
|
|
|
|
if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
|
|
|
|
var ret = _this.push(chunk);
|
|
|
|
if (!ret) {
|
|
paused = true;
|
|
stream.pause();
|
|
}
|
|
}); // proxy all the other methods.
|
|
// important when wrapping filters and duplexes.
|
|
|
|
for (var i in stream) {
|
|
if (this[i] === undefined && typeof stream[i] === 'function') {
|
|
this[i] = function methodWrap(method) {
|
|
return function methodWrapReturnFunction() {
|
|
return stream[method].apply(stream, arguments);
|
|
};
|
|
}(i);
|
|
}
|
|
} // proxy certain important events.
|
|
|
|
|
|
for (var n = 0; n < kProxyEvents.length; n++) {
|
|
stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));
|
|
} // when we try to consume some more bytes, simply unpause the
|
|
// underlying stream.
|
|
|
|
|
|
this._read = function (n) {
|
|
debug('wrapped _read', n);
|
|
|
|
if (paused) {
|
|
paused = false;
|
|
stream.resume();
|
|
}
|
|
};
|
|
|
|
return this;
|
|
};
|
|
|
|
if (typeof Symbol === 'function') {
|
|
Readable.prototype[Symbol.asyncIterator] = function () {
|
|
if (createReadableStreamAsyncIterator === undefined) {
|
|
createReadableStreamAsyncIterator = require('./internal/streams/async_iterator');
|
|
}
|
|
|
|
return createReadableStreamAsyncIterator(this);
|
|
};
|
|
}
|
|
|
|
Object.defineProperty(Readable.prototype, 'readableHighWaterMark', {
|
|
// making it explicit this property is not enumerable
|
|
// because otherwise some prototype manipulation in
|
|
// userland will fail
|
|
enumerable: false,
|
|
get: function get() {
|
|
return this._readableState.highWaterMark;
|
|
}
|
|
});
|
|
Object.defineProperty(Readable.prototype, 'readableBuffer', {
|
|
// making it explicit this property is not enumerable
|
|
// because otherwise some prototype manipulation in
|
|
// userland will fail
|
|
enumerable: false,
|
|
get: function get() {
|
|
return this._readableState && this._readableState.buffer;
|
|
}
|
|
});
|
|
Object.defineProperty(Readable.prototype, 'readableFlowing', {
|
|
// making it explicit this property is not enumerable
|
|
// because otherwise some prototype manipulation in
|
|
// userland will fail
|
|
enumerable: false,
|
|
get: function get() {
|
|
return this._readableState.flowing;
|
|
},
|
|
set: function set(state) {
|
|
if (this._readableState) {
|
|
this._readableState.flowing = state;
|
|
}
|
|
}
|
|
}); // exposed for testing purposes only.
|
|
|
|
Readable._fromList = fromList;
|
|
Object.defineProperty(Readable.prototype, 'readableLength', {
|
|
// making it explicit this property is not enumerable
|
|
// because otherwise some prototype manipulation in
|
|
// userland will fail
|
|
enumerable: false,
|
|
get: function get() {
|
|
return this._readableState.length;
|
|
}
|
|
}); // Pluck off n bytes from an array of buffers.
|
|
// Length is the combined lengths of all the buffers in the list.
|
|
// This function is designed to be inlinable, so please take care when making
|
|
// changes to the function body.
|
|
|
|
function fromList(n, state) {
|
|
// nothing buffered
|
|
if (state.length === 0) return null;
|
|
var ret;
|
|
if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
|
|
// read it all, truncate the list
|
|
if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.first();else ret = state.buffer.concat(state.length);
|
|
state.buffer.clear();
|
|
} else {
|
|
// read part of list
|
|
ret = state.buffer.consume(n, state.decoder);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
function endReadable(stream) {
|
|
var state = stream._readableState;
|
|
debug('endReadable', state.endEmitted);
|
|
|
|
if (!state.endEmitted) {
|
|
state.ended = true;
|
|
process.nextTick(endReadableNT, state, stream);
|
|
}
|
|
}
|
|
|
|
function endReadableNT(state, stream) {
|
|
debug('endReadableNT', state.endEmitted, state.length); // Check that we didn't get one last unshift.
|
|
|
|
if (!state.endEmitted && state.length === 0) {
|
|
state.endEmitted = true;
|
|
stream.readable = false;
|
|
stream.emit('end');
|
|
|
|
if (state.autoDestroy) {
|
|
// In case of duplex streams we need a way to detect
|
|
// if the writable side is ready for autoDestroy as well
|
|
var wState = stream._writableState;
|
|
|
|
if (!wState || wState.autoDestroy && wState.finished) {
|
|
stream.destroy();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (typeof Symbol === 'function') {
|
|
Readable.from = function (iterable, opts) {
|
|
if (from === undefined) {
|
|
from = require('./internal/streams/from');
|
|
}
|
|
|
|
return from(Readable, iterable, opts);
|
|
};
|
|
}
|
|
|
|
function indexOf(xs, x) {
|
|
for (var i = 0, l = xs.length; i < l; i++) {
|
|
if (xs[i] === x) return i;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
},{"../errors":21,"./_stream_duplex":22,"./internal/streams/async_iterator":27,"./internal/streams/buffer_list":28,"./internal/streams/destroy":29,"./internal/streams/from":31,"./internal/streams/state":33,"./internal/streams/stream":34,"_process":12,"buffer":4,"events":6,"inherits":9,"string_decoder/":36,"util":2}],25:[function(require,module,exports){
|
|
// Copyright Joyent, Inc. and other Node contributors.
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
// copy of this software and associated documentation files (the
|
|
// "Software"), to deal in the Software without restriction, including
|
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|
// persons to whom the Software is furnished to do so, subject to the
|
|
// following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included
|
|
// in all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
// a transform stream is a readable/writable stream where you do
|
|
// something with the data. Sometimes it's called a "filter",
|
|
// but that's not a great name for it, since that implies a thing where
|
|
// some bits pass through, and others are simply ignored. (That would
|
|
// be a valid example of a transform, of course.)
|
|
//
|
|
// While the output is causally related to the input, it's not a
|
|
// necessarily symmetric or synchronous transformation. For example,
|
|
// a zlib stream might take multiple plain-text writes(), and then
|
|
// emit a single compressed chunk some time in the future.
|
|
//
|
|
// Here's how this works:
|
|
//
|
|
// The Transform stream has all the aspects of the readable and writable
|
|
// stream classes. When you write(chunk), that calls _write(chunk,cb)
|
|
// internally, and returns false if there's a lot of pending writes
|
|
// buffered up. When you call read(), that calls _read(n) until
|
|
// there's enough pending readable data buffered up.
|
|
//
|
|
// In a transform stream, the written data is placed in a buffer. When
|
|
// _read(n) is called, it transforms the queued up data, calling the
|
|
// buffered _write cb's as it consumes chunks. If consuming a single
|
|
// written chunk would result in multiple output chunks, then the first
|
|
// outputted bit calls the readcb, and subsequent chunks just go into
|
|
// the read buffer, and will cause it to emit 'readable' if necessary.
|
|
//
|
|
// This way, back-pressure is actually determined by the reading side,
|
|
// since _read has to be called to start processing a new chunk. However,
|
|
// a pathological inflate type of transform can cause excessive buffering
|
|
// here. For example, imagine a stream where every byte of input is
|
|
// interpreted as an integer from 0-255, and then results in that many
|
|
// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in
|
|
// 1kb of data being output. In this case, you could write a very small
|
|
// amount of input, and end up with a very large amount of output. In
|
|
// such a pathological inflating mechanism, there'd be no way to tell
|
|
// the system to stop doing the transform. A single 4MB write could
|
|
// cause the system to run out of memory.
|
|
//
|
|
// However, even in such a pathological case, only a single written chunk
|
|
// would be consumed, and then the rest would wait (un-transformed) until
|
|
// the results of the previous transformed chunk were consumed.
|
|
'use strict';
|
|
|
|
module.exports = Transform;
|
|
|
|
var _require$codes = require('../errors').codes,
|
|
ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,
|
|
ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK,
|
|
ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING,
|
|
ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0;
|
|
|
|
var Duplex = require('./_stream_duplex');
|
|
|
|
require('inherits')(Transform, Duplex);
|
|
|
|
function afterTransform(er, data) {
|
|
var ts = this._transformState;
|
|
ts.transforming = false;
|
|
var cb = ts.writecb;
|
|
|
|
if (cb === null) {
|
|
return this.emit('error', new ERR_MULTIPLE_CALLBACK());
|
|
}
|
|
|
|
ts.writechunk = null;
|
|
ts.writecb = null;
|
|
if (data != null) // single equals check for both `null` and `undefined`
|
|
this.push(data);
|
|
cb(er);
|
|
var rs = this._readableState;
|
|
rs.reading = false;
|
|
|
|
if (rs.needReadable || rs.length < rs.highWaterMark) {
|
|
this._read(rs.highWaterMark);
|
|
}
|
|
}
|
|
|
|
function Transform(options) {
|
|
if (!(this instanceof Transform)) return new Transform(options);
|
|
Duplex.call(this, options);
|
|
this._transformState = {
|
|
afterTransform: afterTransform.bind(this),
|
|
needTransform: false,
|
|
transforming: false,
|
|
writecb: null,
|
|
writechunk: null,
|
|
writeencoding: null
|
|
}; // start out asking for a readable event once data is transformed.
|
|
|
|
this._readableState.needReadable = true; // we have implemented the _read method, and done the other things
|
|
// that Readable wants before the first _read call, so unset the
|
|
// sync guard flag.
|
|
|
|
this._readableState.sync = false;
|
|
|
|
if (options) {
|
|
if (typeof options.transform === 'function') this._transform = options.transform;
|
|
if (typeof options.flush === 'function') this._flush = options.flush;
|
|
} // When the writable side finishes, then flush out anything remaining.
|
|
|
|
|
|
this.on('prefinish', prefinish);
|
|
}
|
|
|
|
function prefinish() {
|
|
var _this = this;
|
|
|
|
if (typeof this._flush === 'function' && !this._readableState.destroyed) {
|
|
this._flush(function (er, data) {
|
|
done(_this, er, data);
|
|
});
|
|
} else {
|
|
done(this, null, null);
|
|
}
|
|
}
|
|
|
|
Transform.prototype.push = function (chunk, encoding) {
|
|
this._transformState.needTransform = false;
|
|
return Duplex.prototype.push.call(this, chunk, encoding);
|
|
}; // This is the part where you do stuff!
|
|
// override this function in implementation classes.
|
|
// 'chunk' is an input chunk.
|
|
//
|
|
// Call `push(newChunk)` to pass along transformed output
|
|
// to the readable side. You may call 'push' zero or more times.
|
|
//
|
|
// Call `cb(err)` when you are done with this chunk. If you pass
|
|
// an error, then that'll put the hurt on the whole operation. If you
|
|
// never call cb(), then you'll never get another chunk.
|
|
|
|
|
|
Transform.prototype._transform = function (chunk, encoding, cb) {
|
|
cb(new ERR_METHOD_NOT_IMPLEMENTED('_transform()'));
|
|
};
|
|
|
|
Transform.prototype._write = function (chunk, encoding, cb) {
|
|
var ts = this._transformState;
|
|
ts.writecb = cb;
|
|
ts.writechunk = chunk;
|
|
ts.writeencoding = encoding;
|
|
|
|
if (!ts.transforming) {
|
|
var rs = this._readableState;
|
|
if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
|
|
}
|
|
}; // Doesn't matter what the args are here.
|
|
// _transform does all the work.
|
|
// That we got here means that the readable side wants more data.
|
|
|
|
|
|
Transform.prototype._read = function (n) {
|
|
var ts = this._transformState;
|
|
|
|
if (ts.writechunk !== null && !ts.transforming) {
|
|
ts.transforming = true;
|
|
|
|
this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
|
|
} else {
|
|
// mark that we need a transform, so that any data that comes in
|
|
// will get processed, now that we've asked for it.
|
|
ts.needTransform = true;
|
|
}
|
|
};
|
|
|
|
Transform.prototype._destroy = function (err, cb) {
|
|
Duplex.prototype._destroy.call(this, err, function (err2) {
|
|
cb(err2);
|
|
});
|
|
};
|
|
|
|
function done(stream, er, data) {
|
|
if (er) return stream.emit('error', er);
|
|
if (data != null) // single equals check for both `null` and `undefined`
|
|
stream.push(data); // TODO(BridgeAR): Write a test for these two error cases
|
|
// if there's nothing in the write buffer, then that means
|
|
// that nothing more will ever be provided
|
|
|
|
if (stream._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0();
|
|
if (stream._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING();
|
|
return stream.push(null);
|
|
}
|
|
},{"../errors":21,"./_stream_duplex":22,"inherits":9}],26:[function(require,module,exports){
|
|
(function (process,global){
|
|
// Copyright Joyent, Inc. and other Node contributors.
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
// copy of this software and associated documentation files (the
|
|
// "Software"), to deal in the Software without restriction, including
|
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|
// persons to whom the Software is furnished to do so, subject to the
|
|
// following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included
|
|
// in all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
// A bit simpler than readable streams.
|
|
// Implement an async ._write(chunk, encoding, cb), and it'll handle all
|
|
// the drain event emission and buffering.
|
|
'use strict';
|
|
|
|
module.exports = Writable;
|
|
/* <replacement> */
|
|
|
|
function WriteReq(chunk, encoding, cb) {
|
|
this.chunk = chunk;
|
|
this.encoding = encoding;
|
|
this.callback = cb;
|
|
this.next = null;
|
|
} // It seems a linked list but it is not
|
|
// there will be only 2 of these for each stream
|
|
|
|
|
|
function CorkedRequest(state) {
|
|
var _this = this;
|
|
|
|
this.next = null;
|
|
this.entry = null;
|
|
|
|
this.finish = function () {
|
|
onCorkedFinish(_this, state);
|
|
};
|
|
}
|
|
/* </replacement> */
|
|
|
|
/*<replacement>*/
|
|
|
|
|
|
var Duplex;
|
|
/*</replacement>*/
|
|
|
|
Writable.WritableState = WritableState;
|
|
/*<replacement>*/
|
|
|
|
var internalUtil = {
|
|
deprecate: require('util-deprecate')
|
|
};
|
|
/*</replacement>*/
|
|
|
|
/*<replacement>*/
|
|
|
|
var Stream = require('./internal/streams/stream');
|
|
/*</replacement>*/
|
|
|
|
|
|
var Buffer = require('buffer').Buffer;
|
|
|
|
var OurUint8Array = global.Uint8Array || function () {};
|
|
|
|
function _uint8ArrayToBuffer(chunk) {
|
|
return Buffer.from(chunk);
|
|
}
|
|
|
|
function _isUint8Array(obj) {
|
|
return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
|
|
}
|
|
|
|
var destroyImpl = require('./internal/streams/destroy');
|
|
|
|
var _require = require('./internal/streams/state'),
|
|
getHighWaterMark = _require.getHighWaterMark;
|
|
|
|
var _require$codes = require('../errors').codes,
|
|
ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,
|
|
ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,
|
|
ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK,
|
|
ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE,
|
|
ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED,
|
|
ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES,
|
|
ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END,
|
|
ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING;
|
|
|
|
var errorOrDestroy = destroyImpl.errorOrDestroy;
|
|
|
|
require('inherits')(Writable, Stream);
|
|
|
|
function nop() {}
|
|
|
|
function WritableState(options, stream, isDuplex) {
|
|
Duplex = Duplex || require('./_stream_duplex');
|
|
options = options || {}; // Duplex streams are both readable and writable, but share
|
|
// the same options object.
|
|
// However, some cases require setting options to different
|
|
// values for the readable and the writable sides of the duplex stream,
|
|
// e.g. options.readableObjectMode vs. options.writableObjectMode, etc.
|
|
|
|
if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag to indicate whether or not this stream
|
|
// contains buffers or objects.
|
|
|
|
this.objectMode = !!options.objectMode;
|
|
if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false
|
|
// Note: 0 is a valid value, means that we always return false if
|
|
// the entire buffer is not flushed immediately on write()
|
|
|
|
this.highWaterMark = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex); // if _final has been called
|
|
|
|
this.finalCalled = false; // drain event flag.
|
|
|
|
this.needDrain = false; // at the start of calling end()
|
|
|
|
this.ending = false; // when end() has been called, and returned
|
|
|
|
this.ended = false; // when 'finish' is emitted
|
|
|
|
this.finished = false; // has it been destroyed
|
|
|
|
this.destroyed = false; // should we decode strings into buffers before passing to _write?
|
|
// this is here so that some node-core streams can optimize string
|
|
// handling at a lower level.
|
|
|
|
var noDecode = options.decodeStrings === false;
|
|
this.decodeStrings = !noDecode; // Crypto is kind of old and crusty. Historically, its default string
|
|
// encoding is 'binary' so we have to make this configurable.
|
|
// Everything else in the universe uses 'utf8', though.
|
|
|
|
this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement
|
|
// of how much we're waiting to get pushed to some underlying
|
|
// socket or file.
|
|
|
|
this.length = 0; // a flag to see when we're in the middle of a write.
|
|
|
|
this.writing = false; // when true all writes will be buffered until .uncork() call
|
|
|
|
this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately,
|
|
// or on a later tick. We set this to true at first, because any
|
|
// actions that shouldn't happen until "later" should generally also
|
|
// not happen before the first write call.
|
|
|
|
this.sync = true; // a flag to know if we're processing previously buffered items, which
|
|
// may call the _write() callback in the same tick, so that we don't
|
|
// end up in an overlapped onwrite situation.
|
|
|
|
this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb)
|
|
|
|
this.onwrite = function (er) {
|
|
onwrite(stream, er);
|
|
}; // the callback that the user supplies to write(chunk,encoding,cb)
|
|
|
|
|
|
this.writecb = null; // the amount that is being written when _write is called.
|
|
|
|
this.writelen = 0;
|
|
this.bufferedRequest = null;
|
|
this.lastBufferedRequest = null; // number of pending user-supplied write callbacks
|
|
// this must be 0 before 'finish' can be emitted
|
|
|
|
this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs
|
|
// This is relevant for synchronous Transform streams
|
|
|
|
this.prefinished = false; // True if the error was already emitted and should not be thrown again
|
|
|
|
this.errorEmitted = false; // Should close be emitted on destroy. Defaults to true.
|
|
|
|
this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'finish' (and potentially 'end')
|
|
|
|
this.autoDestroy = !!options.autoDestroy; // count buffered requests
|
|
|
|
this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always
|
|
// one allocated and free to use, and we maintain at most two
|
|
|
|
this.corkedRequestsFree = new CorkedRequest(this);
|
|
}
|
|
|
|
WritableState.prototype.getBuffer = function getBuffer() {
|
|
var current = this.bufferedRequest;
|
|
var out = [];
|
|
|
|
while (current) {
|
|
out.push(current);
|
|
current = current.next;
|
|
}
|
|
|
|
return out;
|
|
};
|
|
|
|
(function () {
|
|
try {
|
|
Object.defineProperty(WritableState.prototype, 'buffer', {
|
|
get: internalUtil.deprecate(function writableStateBufferGetter() {
|
|
return this.getBuffer();
|
|
}, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')
|
|
});
|
|
} catch (_) {}
|
|
})(); // Test _writableState for inheritance to account for Duplex streams,
|
|
// whose prototype chain only points to Readable.
|
|
|
|
|
|
var realHasInstance;
|
|
|
|
if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {
|
|
realHasInstance = Function.prototype[Symbol.hasInstance];
|
|
Object.defineProperty(Writable, Symbol.hasInstance, {
|
|
value: function value(object) {
|
|
if (realHasInstance.call(this, object)) return true;
|
|
if (this !== Writable) return false;
|
|
return object && object._writableState instanceof WritableState;
|
|
}
|
|
});
|
|
} else {
|
|
realHasInstance = function realHasInstance(object) {
|
|
return object instanceof this;
|
|
};
|
|
}
|
|
|
|
function Writable(options) {
|
|
Duplex = Duplex || require('./_stream_duplex'); // Writable ctor is applied to Duplexes, too.
|
|
// `realHasInstance` is necessary because using plain `instanceof`
|
|
// would return false, as no `_writableState` property is attached.
|
|
// Trying to use the custom `instanceof` for Writable here will also break the
|
|
// Node.js LazyTransform implementation, which has a non-trivial getter for
|
|
// `_writableState` that would lead to infinite recursion.
|
|
// Checking for a Stream.Duplex instance is faster here instead of inside
|
|
// the WritableState constructor, at least with V8 6.5
|
|
|
|
var isDuplex = this instanceof Duplex;
|
|
if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options);
|
|
this._writableState = new WritableState(options, this, isDuplex); // legacy.
|
|
|
|
this.writable = true;
|
|
|
|
if (options) {
|
|
if (typeof options.write === 'function') this._write = options.write;
|
|
if (typeof options.writev === 'function') this._writev = options.writev;
|
|
if (typeof options.destroy === 'function') this._destroy = options.destroy;
|
|
if (typeof options.final === 'function') this._final = options.final;
|
|
}
|
|
|
|
Stream.call(this);
|
|
} // Otherwise people can pipe Writable streams, which is just wrong.
|
|
|
|
|
|
Writable.prototype.pipe = function () {
|
|
errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE());
|
|
};
|
|
|
|
function writeAfterEnd(stream, cb) {
|
|
var er = new ERR_STREAM_WRITE_AFTER_END(); // TODO: defer error events consistently everywhere, not just the cb
|
|
|
|
errorOrDestroy(stream, er);
|
|
process.nextTick(cb, er);
|
|
} // Checks that a user-supplied chunk is valid, especially for the particular
|
|
// mode the stream is in. Currently this means that `null` is never accepted
|
|
// and undefined/non-string values are only allowed in object mode.
|
|
|
|
|
|
function validChunk(stream, state, chunk, cb) {
|
|
var er;
|
|
|
|
if (chunk === null) {
|
|
er = new ERR_STREAM_NULL_VALUES();
|
|
} else if (typeof chunk !== 'string' && !state.objectMode) {
|
|
er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk);
|
|
}
|
|
|
|
if (er) {
|
|
errorOrDestroy(stream, er);
|
|
process.nextTick(cb, er);
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
Writable.prototype.write = function (chunk, encoding, cb) {
|
|
var state = this._writableState;
|
|
var ret = false;
|
|
|
|
var isBuf = !state.objectMode && _isUint8Array(chunk);
|
|
|
|
if (isBuf && !Buffer.isBuffer(chunk)) {
|
|
chunk = _uint8ArrayToBuffer(chunk);
|
|
}
|
|
|
|
if (typeof encoding === 'function') {
|
|
cb = encoding;
|
|
encoding = null;
|
|
}
|
|
|
|
if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;
|
|
if (typeof cb !== 'function') cb = nop;
|
|
if (state.ending) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {
|
|
state.pendingcb++;
|
|
ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);
|
|
}
|
|
return ret;
|
|
};
|
|
|
|
Writable.prototype.cork = function () {
|
|
this._writableState.corked++;
|
|
};
|
|
|
|
Writable.prototype.uncork = function () {
|
|
var state = this._writableState;
|
|
|
|
if (state.corked) {
|
|
state.corked--;
|
|
if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
|
|
}
|
|
};
|
|
|
|
Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
|
|
// node::ParseEncoding() requires lower case.
|
|
if (typeof encoding === 'string') encoding = encoding.toLowerCase();
|
|
if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new ERR_UNKNOWN_ENCODING(encoding);
|
|
this._writableState.defaultEncoding = encoding;
|
|
return this;
|
|
};
|
|
|
|
Object.defineProperty(Writable.prototype, 'writableBuffer', {
|
|
// making it explicit this property is not enumerable
|
|
// because otherwise some prototype manipulation in
|
|
// userland will fail
|
|
enumerable: false,
|
|
get: function get() {
|
|
return this._writableState && this._writableState.getBuffer();
|
|
}
|
|
});
|
|
|
|
function decodeChunk(state, chunk, encoding) {
|
|
if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
|
|
chunk = Buffer.from(chunk, encoding);
|
|
}
|
|
|
|
return chunk;
|
|
}
|
|
|
|
Object.defineProperty(Writable.prototype, 'writableHighWaterMark', {
|
|
// making it explicit this property is not enumerable
|
|
// because otherwise some prototype manipulation in
|
|
// userland will fail
|
|
enumerable: false,
|
|
get: function get() {
|
|
return this._writableState.highWaterMark;
|
|
}
|
|
}); // if we're already writing something, then just put this
|
|
// in the queue, and wait our turn. Otherwise, call _write
|
|
// If we return false, then we need a drain event, so set that flag.
|
|
|
|
function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {
|
|
if (!isBuf) {
|
|
var newChunk = decodeChunk(state, chunk, encoding);
|
|
|
|
if (chunk !== newChunk) {
|
|
isBuf = true;
|
|
encoding = 'buffer';
|
|
chunk = newChunk;
|
|
}
|
|
}
|
|
|
|
var len = state.objectMode ? 1 : chunk.length;
|
|
state.length += len;
|
|
var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false.
|
|
|
|
if (!ret) state.needDrain = true;
|
|
|
|
if (state.writing || state.corked) {
|
|
var last = state.lastBufferedRequest;
|
|
state.lastBufferedRequest = {
|
|
chunk: chunk,
|
|
encoding: encoding,
|
|
isBuf: isBuf,
|
|
callback: cb,
|
|
next: null
|
|
};
|
|
|
|
if (last) {
|
|
last.next = state.lastBufferedRequest;
|
|
} else {
|
|
state.bufferedRequest = state.lastBufferedRequest;
|
|
}
|
|
|
|
state.bufferedRequestCount += 1;
|
|
} else {
|
|
doWrite(stream, state, false, len, chunk, encoding, cb);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
function doWrite(stream, state, writev, len, chunk, encoding, cb) {
|
|
state.writelen = len;
|
|
state.writecb = cb;
|
|
state.writing = true;
|
|
state.sync = true;
|
|
if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED('write'));else if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
|
|
state.sync = false;
|
|
}
|
|
|
|
function onwriteError(stream, state, sync, er, cb) {
|
|
--state.pendingcb;
|
|
|
|
if (sync) {
|
|
// defer the callback if we are being called synchronously
|
|
// to avoid piling up things on the stack
|
|
process.nextTick(cb, er); // this can emit finish, and it will always happen
|
|
// after error
|
|
|
|
process.nextTick(finishMaybe, stream, state);
|
|
stream._writableState.errorEmitted = true;
|
|
errorOrDestroy(stream, er);
|
|
} else {
|
|
// the caller expect this to happen before if
|
|
// it is async
|
|
cb(er);
|
|
stream._writableState.errorEmitted = true;
|
|
errorOrDestroy(stream, er); // this can emit finish, but finish must
|
|
// always follow error
|
|
|
|
finishMaybe(stream, state);
|
|
}
|
|
}
|
|
|
|
function onwriteStateUpdate(state) {
|
|
state.writing = false;
|
|
state.writecb = null;
|
|
state.length -= state.writelen;
|
|
state.writelen = 0;
|
|
}
|
|
|
|
function onwrite(stream, er) {
|
|
var state = stream._writableState;
|
|
var sync = state.sync;
|
|
var cb = state.writecb;
|
|
if (typeof cb !== 'function') throw new ERR_MULTIPLE_CALLBACK();
|
|
onwriteStateUpdate(state);
|
|
if (er) onwriteError(stream, state, sync, er, cb);else {
|
|
// Check if we're actually ready to finish, but don't emit yet
|
|
var finished = needFinish(state) || stream.destroyed;
|
|
|
|
if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
|
|
clearBuffer(stream, state);
|
|
}
|
|
|
|
if (sync) {
|
|
process.nextTick(afterWrite, stream, state, finished, cb);
|
|
} else {
|
|
afterWrite(stream, state, finished, cb);
|
|
}
|
|
}
|
|
}
|
|
|
|
function afterWrite(stream, state, finished, cb) {
|
|
if (!finished) onwriteDrain(stream, state);
|
|
state.pendingcb--;
|
|
cb();
|
|
finishMaybe(stream, state);
|
|
} // Must force callback to be called on nextTick, so that we don't
|
|
// emit 'drain' before the write() consumer gets the 'false' return
|
|
// value, and has a chance to attach a 'drain' listener.
|
|
|
|
|
|
function onwriteDrain(stream, state) {
|
|
if (state.length === 0 && state.needDrain) {
|
|
state.needDrain = false;
|
|
stream.emit('drain');
|
|
}
|
|
} // if there's something in the buffer waiting, then process it
|
|
|
|
|
|
function clearBuffer(stream, state) {
|
|
state.bufferProcessing = true;
|
|
var entry = state.bufferedRequest;
|
|
|
|
if (stream._writev && entry && entry.next) {
|
|
// Fast case, write everything using _writev()
|
|
var l = state.bufferedRequestCount;
|
|
var buffer = new Array(l);
|
|
var holder = state.corkedRequestsFree;
|
|
holder.entry = entry;
|
|
var count = 0;
|
|
var allBuffers = true;
|
|
|
|
while (entry) {
|
|
buffer[count] = entry;
|
|
if (!entry.isBuf) allBuffers = false;
|
|
entry = entry.next;
|
|
count += 1;
|
|
}
|
|
|
|
buffer.allBuffers = allBuffers;
|
|
doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is almost always async, defer these to save a bit of time
|
|
// as the hot path ends with doWrite
|
|
|
|
state.pendingcb++;
|
|
state.lastBufferedRequest = null;
|
|
|
|
if (holder.next) {
|
|
state.corkedRequestsFree = holder.next;
|
|
holder.next = null;
|
|
} else {
|
|
state.corkedRequestsFree = new CorkedRequest(state);
|
|
}
|
|
|
|
state.bufferedRequestCount = 0;
|
|
} else {
|
|
// Slow case, write chunks one-by-one
|
|
while (entry) {
|
|
var chunk = entry.chunk;
|
|
var encoding = entry.encoding;
|
|
var cb = entry.callback;
|
|
var len = state.objectMode ? 1 : chunk.length;
|
|
doWrite(stream, state, false, len, chunk, encoding, cb);
|
|
entry = entry.next;
|
|
state.bufferedRequestCount--; // if we didn't call the onwrite immediately, then
|
|
// it means that we need to wait until it does.
|
|
// also, that means that the chunk and cb are currently
|
|
// being processed, so move the buffer counter past them.
|
|
|
|
if (state.writing) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (entry === null) state.lastBufferedRequest = null;
|
|
}
|
|
|
|
state.bufferedRequest = entry;
|
|
state.bufferProcessing = false;
|
|
}
|
|
|
|
Writable.prototype._write = function (chunk, encoding, cb) {
|
|
cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()'));
|
|
};
|
|
|
|
Writable.prototype._writev = null;
|
|
|
|
Writable.prototype.end = function (chunk, encoding, cb) {
|
|
var state = this._writableState;
|
|
|
|
if (typeof chunk === 'function') {
|
|
cb = chunk;
|
|
chunk = null;
|
|
encoding = null;
|
|
} else if (typeof encoding === 'function') {
|
|
cb = encoding;
|
|
encoding = null;
|
|
}
|
|
|
|
if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks
|
|
|
|
if (state.corked) {
|
|
state.corked = 1;
|
|
this.uncork();
|
|
} // ignore unnecessary end() calls.
|
|
|
|
|
|
if (!state.ending) endWritable(this, state, cb);
|
|
return this;
|
|
};
|
|
|
|
Object.defineProperty(Writable.prototype, 'writableLength', {
|
|
// making it explicit this property is not enumerable
|
|
// because otherwise some prototype manipulation in
|
|
// userland will fail
|
|
enumerable: false,
|
|
get: function get() {
|
|
return this._writableState.length;
|
|
}
|
|
});
|
|
|
|
function needFinish(state) {
|
|
return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
|
|
}
|
|
|
|
function callFinal(stream, state) {
|
|
stream._final(function (err) {
|
|
state.pendingcb--;
|
|
|
|
if (err) {
|
|
errorOrDestroy(stream, err);
|
|
}
|
|
|
|
state.prefinished = true;
|
|
stream.emit('prefinish');
|
|
finishMaybe(stream, state);
|
|
});
|
|
}
|
|
|
|
function prefinish(stream, state) {
|
|
if (!state.prefinished && !state.finalCalled) {
|
|
if (typeof stream._final === 'function' && !state.destroyed) {
|
|
state.pendingcb++;
|
|
state.finalCalled = true;
|
|
process.nextTick(callFinal, stream, state);
|
|
} else {
|
|
state.prefinished = true;
|
|
stream.emit('prefinish');
|
|
}
|
|
}
|
|
}
|
|
|
|
function finishMaybe(stream, state) {
|
|
var need = needFinish(state);
|
|
|
|
if (need) {
|
|
prefinish(stream, state);
|
|
|
|
if (state.pendingcb === 0) {
|
|
state.finished = true;
|
|
stream.emit('finish');
|
|
|
|
if (state.autoDestroy) {
|
|
// In case of duplex streams we need a way to detect
|
|
// if the readable side is ready for autoDestroy as well
|
|
var rState = stream._readableState;
|
|
|
|
if (!rState || rState.autoDestroy && rState.endEmitted) {
|
|
stream.destroy();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return need;
|
|
}
|
|
|
|
function endWritable(stream, state, cb) {
|
|
state.ending = true;
|
|
finishMaybe(stream, state);
|
|
|
|
if (cb) {
|
|
if (state.finished) process.nextTick(cb);else stream.once('finish', cb);
|
|
}
|
|
|
|
state.ended = true;
|
|
stream.writable = false;
|
|
}
|
|
|
|
function onCorkedFinish(corkReq, state, err) {
|
|
var entry = corkReq.entry;
|
|
corkReq.entry = null;
|
|
|
|
while (entry) {
|
|
var cb = entry.callback;
|
|
state.pendingcb--;
|
|
cb(err);
|
|
entry = entry.next;
|
|
} // reuse the free corkReq.
|
|
|
|
|
|
state.corkedRequestsFree.next = corkReq;
|
|
}
|
|
|
|
Object.defineProperty(Writable.prototype, 'destroyed', {
|
|
// making it explicit this property is not enumerable
|
|
// because otherwise some prototype manipulation in
|
|
// userland will fail
|
|
enumerable: false,
|
|
get: function get() {
|
|
if (this._writableState === undefined) {
|
|
return false;
|
|
}
|
|
|
|
return this._writableState.destroyed;
|
|
},
|
|
set: function set(value) {
|
|
// we ignore the value if the stream
|
|
// has not been initialized yet
|
|
if (!this._writableState) {
|
|
return;
|
|
} // backward compatibility, the user is explicitly
|
|
// managing destroyed
|
|
|
|
|
|
this._writableState.destroyed = value;
|
|
}
|
|
});
|
|
Writable.prototype.destroy = destroyImpl.destroy;
|
|
Writable.prototype._undestroy = destroyImpl.undestroy;
|
|
|
|
Writable.prototype._destroy = function (err, cb) {
|
|
cb(err);
|
|
};
|
|
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
},{"../errors":21,"./_stream_duplex":22,"./internal/streams/destroy":29,"./internal/streams/state":33,"./internal/streams/stream":34,"_process":12,"buffer":4,"inherits":9,"util-deprecate":39}],27:[function(require,module,exports){
|
|
(function (process){
|
|
'use strict';
|
|
|
|
var _Object$setPrototypeO;
|
|
|
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
|
|
var finished = require('./end-of-stream');
|
|
|
|
var kLastResolve = Symbol('lastResolve');
|
|
var kLastReject = Symbol('lastReject');
|
|
var kError = Symbol('error');
|
|
var kEnded = Symbol('ended');
|
|
var kLastPromise = Symbol('lastPromise');
|
|
var kHandlePromise = Symbol('handlePromise');
|
|
var kStream = Symbol('stream');
|
|
|
|
function createIterResult(value, done) {
|
|
return {
|
|
value: value,
|
|
done: done
|
|
};
|
|
}
|
|
|
|
function readAndResolve(iter) {
|
|
var resolve = iter[kLastResolve];
|
|
|
|
if (resolve !== null) {
|
|
var data = iter[kStream].read(); // we defer if data is null
|
|
// we can be expecting either 'end' or
|
|
// 'error'
|
|
|
|
if (data !== null) {
|
|
iter[kLastPromise] = null;
|
|
iter[kLastResolve] = null;
|
|
iter[kLastReject] = null;
|
|
resolve(createIterResult(data, false));
|
|
}
|
|
}
|
|
}
|
|
|
|
function onReadable(iter) {
|
|
// we wait for the next tick, because it might
|
|
// emit an error with process.nextTick
|
|
process.nextTick(readAndResolve, iter);
|
|
}
|
|
|
|
function wrapForNext(lastPromise, iter) {
|
|
return function (resolve, reject) {
|
|
lastPromise.then(function () {
|
|
if (iter[kEnded]) {
|
|
resolve(createIterResult(undefined, true));
|
|
return;
|
|
}
|
|
|
|
iter[kHandlePromise](resolve, reject);
|
|
}, reject);
|
|
};
|
|
}
|
|
|
|
var AsyncIteratorPrototype = Object.getPrototypeOf(function () {});
|
|
var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = {
|
|
get stream() {
|
|
return this[kStream];
|
|
},
|
|
|
|
next: function next() {
|
|
var _this = this;
|
|
|
|
// if we have detected an error in the meanwhile
|
|
// reject straight away
|
|
var error = this[kError];
|
|
|
|
if (error !== null) {
|
|
return Promise.reject(error);
|
|
}
|
|
|
|
if (this[kEnded]) {
|
|
return Promise.resolve(createIterResult(undefined, true));
|
|
}
|
|
|
|
if (this[kStream].destroyed) {
|
|
// We need to defer via nextTick because if .destroy(err) is
|
|
// called, the error will be emitted via nextTick, and
|
|
// we cannot guarantee that there is no error lingering around
|
|
// waiting to be emitted.
|
|
return new Promise(function (resolve, reject) {
|
|
process.nextTick(function () {
|
|
if (_this[kError]) {
|
|
reject(_this[kError]);
|
|
} else {
|
|
resolve(createIterResult(undefined, true));
|
|
}
|
|
});
|
|
});
|
|
} // if we have multiple next() calls
|
|
// we will wait for the previous Promise to finish
|
|
// this logic is optimized to support for await loops,
|
|
// where next() is only called once at a time
|
|
|
|
|
|
var lastPromise = this[kLastPromise];
|
|
var promise;
|
|
|
|
if (lastPromise) {
|
|
promise = new Promise(wrapForNext(lastPromise, this));
|
|
} else {
|
|
// fast path needed to support multiple this.push()
|
|
// without triggering the next() queue
|
|
var data = this[kStream].read();
|
|
|
|
if (data !== null) {
|
|
return Promise.resolve(createIterResult(data, false));
|
|
}
|
|
|
|
promise = new Promise(this[kHandlePromise]);
|
|
}
|
|
|
|
this[kLastPromise] = promise;
|
|
return promise;
|
|
}
|
|
}, _defineProperty(_Object$setPrototypeO, Symbol.asyncIterator, function () {
|
|
return this;
|
|
}), _defineProperty(_Object$setPrototypeO, "return", function _return() {
|
|
var _this2 = this;
|
|
|
|
// destroy(err, cb) is a private API
|
|
// we can guarantee we have that here, because we control the
|
|
// Readable class this is attached to
|
|
return new Promise(function (resolve, reject) {
|
|
_this2[kStream].destroy(null, function (err) {
|
|
if (err) {
|
|
reject(err);
|
|
return;
|
|
}
|
|
|
|
resolve(createIterResult(undefined, true));
|
|
});
|
|
});
|
|
}), _Object$setPrototypeO), AsyncIteratorPrototype);
|
|
|
|
var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) {
|
|
var _Object$create;
|
|
|
|
var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, {
|
|
value: stream,
|
|
writable: true
|
|
}), _defineProperty(_Object$create, kLastResolve, {
|
|
value: null,
|
|
writable: true
|
|
}), _defineProperty(_Object$create, kLastReject, {
|
|
value: null,
|
|
writable: true
|
|
}), _defineProperty(_Object$create, kError, {
|
|
value: null,
|
|
writable: true
|
|
}), _defineProperty(_Object$create, kEnded, {
|
|
value: stream._readableState.endEmitted,
|
|
writable: true
|
|
}), _defineProperty(_Object$create, kHandlePromise, {
|
|
value: function value(resolve, reject) {
|
|
var data = iterator[kStream].read();
|
|
|
|
if (data) {
|
|
iterator[kLastPromise] = null;
|
|
iterator[kLastResolve] = null;
|
|
iterator[kLastReject] = null;
|
|
resolve(createIterResult(data, false));
|
|
} else {
|
|
iterator[kLastResolve] = resolve;
|
|
iterator[kLastReject] = reject;
|
|
}
|
|
},
|
|
writable: true
|
|
}), _Object$create));
|
|
iterator[kLastPromise] = null;
|
|
finished(stream, function (err) {
|
|
if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') {
|
|
var reject = iterator[kLastReject]; // reject if we are waiting for data in the Promise
|
|
// returned by next() and store the error
|
|
|
|
if (reject !== null) {
|
|
iterator[kLastPromise] = null;
|
|
iterator[kLastResolve] = null;
|
|
iterator[kLastReject] = null;
|
|
reject(err);
|
|
}
|
|
|
|
iterator[kError] = err;
|
|
return;
|
|
}
|
|
|
|
var resolve = iterator[kLastResolve];
|
|
|
|
if (resolve !== null) {
|
|
iterator[kLastPromise] = null;
|
|
iterator[kLastResolve] = null;
|
|
iterator[kLastReject] = null;
|
|
resolve(createIterResult(undefined, true));
|
|
}
|
|
|
|
iterator[kEnded] = true;
|
|
});
|
|
stream.on('readable', onReadable.bind(null, iterator));
|
|
return iterator;
|
|
};
|
|
|
|
module.exports = createReadableStreamAsyncIterator;
|
|
}).call(this,require('_process'))
|
|
},{"./end-of-stream":30,"_process":12}],28:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
|
|
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
|
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
|
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
|
|
|
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
|
|
|
|
var _require = require('buffer'),
|
|
Buffer = _require.Buffer;
|
|
|
|
var _require2 = require('util'),
|
|
inspect = _require2.inspect;
|
|
|
|
var custom = inspect && inspect.custom || 'inspect';
|
|
|
|
function copyBuffer(src, target, offset) {
|
|
Buffer.prototype.copy.call(src, target, offset);
|
|
}
|
|
|
|
module.exports =
|
|
/*#__PURE__*/
|
|
function () {
|
|
function BufferList() {
|
|
_classCallCheck(this, BufferList);
|
|
|
|
this.head = null;
|
|
this.tail = null;
|
|
this.length = 0;
|
|
}
|
|
|
|
_createClass(BufferList, [{
|
|
key: "push",
|
|
value: function push(v) {
|
|
var entry = {
|
|
data: v,
|
|
next: null
|
|
};
|
|
if (this.length > 0) this.tail.next = entry;else this.head = entry;
|
|
this.tail = entry;
|
|
++this.length;
|
|
}
|
|
}, {
|
|
key: "unshift",
|
|
value: function unshift(v) {
|
|
var entry = {
|
|
data: v,
|
|
next: this.head
|
|
};
|
|
if (this.length === 0) this.tail = entry;
|
|
this.head = entry;
|
|
++this.length;
|
|
}
|
|
}, {
|
|
key: "shift",
|
|
value: function shift() {
|
|
if (this.length === 0) return;
|
|
var ret = this.head.data;
|
|
if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;
|
|
--this.length;
|
|
return ret;
|
|
}
|
|
}, {
|
|
key: "clear",
|
|
value: function clear() {
|
|
this.head = this.tail = null;
|
|
this.length = 0;
|
|
}
|
|
}, {
|
|
key: "join",
|
|
value: function join(s) {
|
|
if (this.length === 0) return '';
|
|
var p = this.head;
|
|
var ret = '' + p.data;
|
|
|
|
while (p = p.next) {
|
|
ret += s + p.data;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
}, {
|
|
key: "concat",
|
|
value: function concat(n) {
|
|
if (this.length === 0) return Buffer.alloc(0);
|
|
var ret = Buffer.allocUnsafe(n >>> 0);
|
|
var p = this.head;
|
|
var i = 0;
|
|
|
|
while (p) {
|
|
copyBuffer(p.data, ret, i);
|
|
i += p.data.length;
|
|
p = p.next;
|
|
}
|
|
|
|
return ret;
|
|
} // Consumes a specified amount of bytes or characters from the buffered data.
|
|
|
|
}, {
|
|
key: "consume",
|
|
value: function consume(n, hasStrings) {
|
|
var ret;
|
|
|
|
if (n < this.head.data.length) {
|
|
// `slice` is the same for buffers and strings.
|
|
ret = this.head.data.slice(0, n);
|
|
this.head.data = this.head.data.slice(n);
|
|
} else if (n === this.head.data.length) {
|
|
// First chunk is a perfect match.
|
|
ret = this.shift();
|
|
} else {
|
|
// Result spans more than one buffer.
|
|
ret = hasStrings ? this._getString(n) : this._getBuffer(n);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
}, {
|
|
key: "first",
|
|
value: function first() {
|
|
return this.head.data;
|
|
} // Consumes a specified amount of characters from the buffered data.
|
|
|
|
}, {
|
|
key: "_getString",
|
|
value: function _getString(n) {
|
|
var p = this.head;
|
|
var c = 1;
|
|
var ret = p.data;
|
|
n -= ret.length;
|
|
|
|
while (p = p.next) {
|
|
var str = p.data;
|
|
var nb = n > str.length ? str.length : n;
|
|
if (nb === str.length) ret += str;else ret += str.slice(0, n);
|
|
n -= nb;
|
|
|
|
if (n === 0) {
|
|
if (nb === str.length) {
|
|
++c;
|
|
if (p.next) this.head = p.next;else this.head = this.tail = null;
|
|
} else {
|
|
this.head = p;
|
|
p.data = str.slice(nb);
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
++c;
|
|
}
|
|
|
|
this.length -= c;
|
|
return ret;
|
|
} // Consumes a specified amount of bytes from the buffered data.
|
|
|
|
}, {
|
|
key: "_getBuffer",
|
|
value: function _getBuffer(n) {
|
|
var ret = Buffer.allocUnsafe(n);
|
|
var p = this.head;
|
|
var c = 1;
|
|
p.data.copy(ret);
|
|
n -= p.data.length;
|
|
|
|
while (p = p.next) {
|
|
var buf = p.data;
|
|
var nb = n > buf.length ? buf.length : n;
|
|
buf.copy(ret, ret.length - n, 0, nb);
|
|
n -= nb;
|
|
|
|
if (n === 0) {
|
|
if (nb === buf.length) {
|
|
++c;
|
|
if (p.next) this.head = p.next;else this.head = this.tail = null;
|
|
} else {
|
|
this.head = p;
|
|
p.data = buf.slice(nb);
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
++c;
|
|
}
|
|
|
|
this.length -= c;
|
|
return ret;
|
|
} // Make sure the linked list only shows the minimal necessary information.
|
|
|
|
}, {
|
|
key: custom,
|
|
value: function value(_, options) {
|
|
return inspect(this, _objectSpread({}, options, {
|
|
// Only inspect one level.
|
|
depth: 0,
|
|
// It should not recurse.
|
|
customInspect: false
|
|
}));
|
|
}
|
|
}]);
|
|
|
|
return BufferList;
|
|
}();
|
|
},{"buffer":4,"util":2}],29:[function(require,module,exports){
|
|
(function (process){
|
|
'use strict'; // undocumented cb() API, needed for core, not for public API
|
|
|
|
function destroy(err, cb) {
|
|
var _this = this;
|
|
|
|
var readableDestroyed = this._readableState && this._readableState.destroyed;
|
|
var writableDestroyed = this._writableState && this._writableState.destroyed;
|
|
|
|
if (readableDestroyed || writableDestroyed) {
|
|
if (cb) {
|
|
cb(err);
|
|
} else if (err) {
|
|
if (!this._writableState) {
|
|
process.nextTick(emitErrorNT, this, err);
|
|
} else if (!this._writableState.errorEmitted) {
|
|
this._writableState.errorEmitted = true;
|
|
process.nextTick(emitErrorNT, this, err);
|
|
}
|
|
}
|
|
|
|
return this;
|
|
} // we set destroyed to true before firing error callbacks in order
|
|
// to make it re-entrance safe in case destroy() is called within callbacks
|
|
|
|
|
|
if (this._readableState) {
|
|
this._readableState.destroyed = true;
|
|
} // if this is a duplex stream mark the writable part as destroyed as well
|
|
|
|
|
|
if (this._writableState) {
|
|
this._writableState.destroyed = true;
|
|
}
|
|
|
|
this._destroy(err || null, function (err) {
|
|
if (!cb && err) {
|
|
if (!_this._writableState) {
|
|
process.nextTick(emitErrorAndCloseNT, _this, err);
|
|
} else if (!_this._writableState.errorEmitted) {
|
|
_this._writableState.errorEmitted = true;
|
|
process.nextTick(emitErrorAndCloseNT, _this, err);
|
|
} else {
|
|
process.nextTick(emitCloseNT, _this);
|
|
}
|
|
} else if (cb) {
|
|
process.nextTick(emitCloseNT, _this);
|
|
cb(err);
|
|
} else {
|
|
process.nextTick(emitCloseNT, _this);
|
|
}
|
|
});
|
|
|
|
return this;
|
|
}
|
|
|
|
function emitErrorAndCloseNT(self, err) {
|
|
emitErrorNT(self, err);
|
|
emitCloseNT(self);
|
|
}
|
|
|
|
function emitCloseNT(self) {
|
|
if (self._writableState && !self._writableState.emitClose) return;
|
|
if (self._readableState && !self._readableState.emitClose) return;
|
|
self.emit('close');
|
|
}
|
|
|
|
function undestroy() {
|
|
if (this._readableState) {
|
|
this._readableState.destroyed = false;
|
|
this._readableState.reading = false;
|
|
this._readableState.ended = false;
|
|
this._readableState.endEmitted = false;
|
|
}
|
|
|
|
if (this._writableState) {
|
|
this._writableState.destroyed = false;
|
|
this._writableState.ended = false;
|
|
this._writableState.ending = false;
|
|
this._writableState.finalCalled = false;
|
|
this._writableState.prefinished = false;
|
|
this._writableState.finished = false;
|
|
this._writableState.errorEmitted = false;
|
|
}
|
|
}
|
|
|
|
function emitErrorNT(self, err) {
|
|
self.emit('error', err);
|
|
}
|
|
|
|
function errorOrDestroy(stream, err) {
|
|
// We have tests that rely on errors being emitted
|
|
// in the same tick, so changing this is semver major.
|
|
// For now when you opt-in to autoDestroy we allow
|
|
// the error to be emitted nextTick. In a future
|
|
// semver major update we should change the default to this.
|
|
var rState = stream._readableState;
|
|
var wState = stream._writableState;
|
|
if (rState && rState.autoDestroy || wState && wState.autoDestroy) stream.destroy(err);else stream.emit('error', err);
|
|
}
|
|
|
|
module.exports = {
|
|
destroy: destroy,
|
|
undestroy: undestroy,
|
|
errorOrDestroy: errorOrDestroy
|
|
};
|
|
}).call(this,require('_process'))
|
|
},{"_process":12}],30:[function(require,module,exports){
|
|
// Ported from https://github.com/mafintosh/end-of-stream with
|
|
// permission from the author, Mathias Buus (@mafintosh).
|
|
'use strict';
|
|
|
|
var ERR_STREAM_PREMATURE_CLOSE = require('../../../errors').codes.ERR_STREAM_PREMATURE_CLOSE;
|
|
|
|
function once(callback) {
|
|
var called = false;
|
|
return function () {
|
|
if (called) return;
|
|
called = true;
|
|
|
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
args[_key] = arguments[_key];
|
|
}
|
|
|
|
callback.apply(this, args);
|
|
};
|
|
}
|
|
|
|
function noop() {}
|
|
|
|
function isRequest(stream) {
|
|
return stream.setHeader && typeof stream.abort === 'function';
|
|
}
|
|
|
|
function eos(stream, opts, callback) {
|
|
if (typeof opts === 'function') return eos(stream, null, opts);
|
|
if (!opts) opts = {};
|
|
callback = once(callback || noop);
|
|
var readable = opts.readable || opts.readable !== false && stream.readable;
|
|
var writable = opts.writable || opts.writable !== false && stream.writable;
|
|
|
|
var onlegacyfinish = function onlegacyfinish() {
|
|
if (!stream.writable) onfinish();
|
|
};
|
|
|
|
var writableEnded = stream._writableState && stream._writableState.finished;
|
|
|
|
var onfinish = function onfinish() {
|
|
writable = false;
|
|
writableEnded = true;
|
|
if (!readable) callback.call(stream);
|
|
};
|
|
|
|
var readableEnded = stream._readableState && stream._readableState.endEmitted;
|
|
|
|
var onend = function onend() {
|
|
readable = false;
|
|
readableEnded = true;
|
|
if (!writable) callback.call(stream);
|
|
};
|
|
|
|
var onerror = function onerror(err) {
|
|
callback.call(stream, err);
|
|
};
|
|
|
|
var onclose = function onclose() {
|
|
var err;
|
|
|
|
if (readable && !readableEnded) {
|
|
if (!stream._readableState || !stream._readableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE();
|
|
return callback.call(stream, err);
|
|
}
|
|
|
|
if (writable && !writableEnded) {
|
|
if (!stream._writableState || !stream._writableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE();
|
|
return callback.call(stream, err);
|
|
}
|
|
};
|
|
|
|
var onrequest = function onrequest() {
|
|
stream.req.on('finish', onfinish);
|
|
};
|
|
|
|
if (isRequest(stream)) {
|
|
stream.on('complete', onfinish);
|
|
stream.on('abort', onclose);
|
|
if (stream.req) onrequest();else stream.on('request', onrequest);
|
|
} else if (writable && !stream._writableState) {
|
|
// legacy streams
|
|
stream.on('end', onlegacyfinish);
|
|
stream.on('close', onlegacyfinish);
|
|
}
|
|
|
|
stream.on('end', onend);
|
|
stream.on('finish', onfinish);
|
|
if (opts.error !== false) stream.on('error', onerror);
|
|
stream.on('close', onclose);
|
|
return function () {
|
|
stream.removeListener('complete', onfinish);
|
|
stream.removeListener('abort', onclose);
|
|
stream.removeListener('request', onrequest);
|
|
if (stream.req) stream.req.removeListener('finish', onfinish);
|
|
stream.removeListener('end', onlegacyfinish);
|
|
stream.removeListener('close', onlegacyfinish);
|
|
stream.removeListener('finish', onfinish);
|
|
stream.removeListener('end', onend);
|
|
stream.removeListener('error', onerror);
|
|
stream.removeListener('close', onclose);
|
|
};
|
|
}
|
|
|
|
module.exports = eos;
|
|
},{"../../../errors":21}],31:[function(require,module,exports){
|
|
module.exports = function () {
|
|
throw new Error('Readable.from is not available in the browser')
|
|
};
|
|
|
|
},{}],32:[function(require,module,exports){
|
|
// Ported from https://github.com/mafintosh/pump with
|
|
// permission from the author, Mathias Buus (@mafintosh).
|
|
'use strict';
|
|
|
|
var eos;
|
|
|
|
function once(callback) {
|
|
var called = false;
|
|
return function () {
|
|
if (called) return;
|
|
called = true;
|
|
callback.apply(void 0, arguments);
|
|
};
|
|
}
|
|
|
|
var _require$codes = require('../../../errors').codes,
|
|
ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS,
|
|
ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED;
|
|
|
|
function noop(err) {
|
|
// Rethrow the error if it exists to avoid swallowing it
|
|
if (err) throw err;
|
|
}
|
|
|
|
function isRequest(stream) {
|
|
return stream.setHeader && typeof stream.abort === 'function';
|
|
}
|
|
|
|
function destroyer(stream, reading, writing, callback) {
|
|
callback = once(callback);
|
|
var closed = false;
|
|
stream.on('close', function () {
|
|
closed = true;
|
|
});
|
|
if (eos === undefined) eos = require('./end-of-stream');
|
|
eos(stream, {
|
|
readable: reading,
|
|
writable: writing
|
|
}, function (err) {
|
|
if (err) return callback(err);
|
|
closed = true;
|
|
callback();
|
|
});
|
|
var destroyed = false;
|
|
return function (err) {
|
|
if (closed) return;
|
|
if (destroyed) return;
|
|
destroyed = true; // request.destroy just do .end - .abort is what we want
|
|
|
|
if (isRequest(stream)) return stream.abort();
|
|
if (typeof stream.destroy === 'function') return stream.destroy();
|
|
callback(err || new ERR_STREAM_DESTROYED('pipe'));
|
|
};
|
|
}
|
|
|
|
function call(fn) {
|
|
fn();
|
|
}
|
|
|
|
function pipe(from, to) {
|
|
return from.pipe(to);
|
|
}
|
|
|
|
function popCallback(streams) {
|
|
if (!streams.length) return noop;
|
|
if (typeof streams[streams.length - 1] !== 'function') return noop;
|
|
return streams.pop();
|
|
}
|
|
|
|
function pipeline() {
|
|
for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
streams[_key] = arguments[_key];
|
|
}
|
|
|
|
var callback = popCallback(streams);
|
|
if (Array.isArray(streams[0])) streams = streams[0];
|
|
|
|
if (streams.length < 2) {
|
|
throw new ERR_MISSING_ARGS('streams');
|
|
}
|
|
|
|
var error;
|
|
var destroys = streams.map(function (stream, i) {
|
|
var reading = i < streams.length - 1;
|
|
var writing = i > 0;
|
|
return destroyer(stream, reading, writing, function (err) {
|
|
if (!error) error = err;
|
|
if (err) destroys.forEach(call);
|
|
if (reading) return;
|
|
destroys.forEach(call);
|
|
callback(error);
|
|
});
|
|
});
|
|
return streams.reduce(pipe);
|
|
}
|
|
|
|
module.exports = pipeline;
|
|
},{"../../../errors":21,"./end-of-stream":30}],33:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var ERR_INVALID_OPT_VALUE = require('../../../errors').codes.ERR_INVALID_OPT_VALUE;
|
|
|
|
function highWaterMarkFrom(options, isDuplex, duplexKey) {
|
|
return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null;
|
|
}
|
|
|
|
function getHighWaterMark(state, options, duplexKey, isDuplex) {
|
|
var hwm = highWaterMarkFrom(options, isDuplex, duplexKey);
|
|
|
|
if (hwm != null) {
|
|
if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) {
|
|
var name = isDuplex ? duplexKey : 'highWaterMark';
|
|
throw new ERR_INVALID_OPT_VALUE(name, hwm);
|
|
}
|
|
|
|
return Math.floor(hwm);
|
|
} // Default value
|
|
|
|
|
|
return state.objectMode ? 16 : 16 * 1024;
|
|
}
|
|
|
|
module.exports = {
|
|
getHighWaterMark: getHighWaterMark
|
|
};
|
|
},{"../../../errors":21}],34:[function(require,module,exports){
|
|
module.exports = require('events').EventEmitter;
|
|
|
|
},{"events":6}],35:[function(require,module,exports){
|
|
exports = module.exports = require('./lib/_stream_readable.js');
|
|
exports.Stream = exports;
|
|
exports.Readable = exports;
|
|
exports.Writable = require('./lib/_stream_writable.js');
|
|
exports.Duplex = require('./lib/_stream_duplex.js');
|
|
exports.Transform = require('./lib/_stream_transform.js');
|
|
exports.PassThrough = require('./lib/_stream_passthrough.js');
|
|
exports.finished = require('./lib/internal/streams/end-of-stream.js');
|
|
exports.pipeline = require('./lib/internal/streams/pipeline.js');
|
|
|
|
},{"./lib/_stream_duplex.js":22,"./lib/_stream_passthrough.js":23,"./lib/_stream_readable.js":24,"./lib/_stream_transform.js":25,"./lib/_stream_writable.js":26,"./lib/internal/streams/end-of-stream.js":30,"./lib/internal/streams/pipeline.js":32}],36:[function(require,module,exports){
|
|
// Copyright Joyent, Inc. and other Node contributors.
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
// copy of this software and associated documentation files (the
|
|
// "Software"), to deal in the Software without restriction, including
|
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|
// persons to whom the Software is furnished to do so, subject to the
|
|
// following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included
|
|
// in all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
'use strict';
|
|
|
|
/*<replacement>*/
|
|
|
|
var Buffer = require('safe-buffer').Buffer;
|
|
/*</replacement>*/
|
|
|
|
var isEncoding = Buffer.isEncoding || function (encoding) {
|
|
encoding = '' + encoding;
|
|
switch (encoding && encoding.toLowerCase()) {
|
|
case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw':
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
};
|
|
|
|
function _normalizeEncoding(enc) {
|
|
if (!enc) return 'utf8';
|
|
var retried;
|
|
while (true) {
|
|
switch (enc) {
|
|
case 'utf8':
|
|
case 'utf-8':
|
|
return 'utf8';
|
|
case 'ucs2':
|
|
case 'ucs-2':
|
|
case 'utf16le':
|
|
case 'utf-16le':
|
|
return 'utf16le';
|
|
case 'latin1':
|
|
case 'binary':
|
|
return 'latin1';
|
|
case 'base64':
|
|
case 'ascii':
|
|
case 'hex':
|
|
return enc;
|
|
default:
|
|
if (retried) return; // undefined
|
|
enc = ('' + enc).toLowerCase();
|
|
retried = true;
|
|
}
|
|
}
|
|
};
|
|
|
|
// Do not cache `Buffer.isEncoding` when checking encoding names as some
|
|
// modules monkey-patch it to support additional encodings
|
|
function normalizeEncoding(enc) {
|
|
var nenc = _normalizeEncoding(enc);
|
|
if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);
|
|
return nenc || enc;
|
|
}
|
|
|
|
// StringDecoder provides an interface for efficiently splitting a series of
|
|
// buffers into a series of JS strings without breaking apart multi-byte
|
|
// characters.
|
|
exports.StringDecoder = StringDecoder;
|
|
function StringDecoder(encoding) {
|
|
this.encoding = normalizeEncoding(encoding);
|
|
var nb;
|
|
switch (this.encoding) {
|
|
case 'utf16le':
|
|
this.text = utf16Text;
|
|
this.end = utf16End;
|
|
nb = 4;
|
|
break;
|
|
case 'utf8':
|
|
this.fillLast = utf8FillLast;
|
|
nb = 4;
|
|
break;
|
|
case 'base64':
|
|
this.text = base64Text;
|
|
this.end = base64End;
|
|
nb = 3;
|
|
break;
|
|
default:
|
|
this.write = simpleWrite;
|
|
this.end = simpleEnd;
|
|
return;
|
|
}
|
|
this.lastNeed = 0;
|
|
this.lastTotal = 0;
|
|
this.lastChar = Buffer.allocUnsafe(nb);
|
|
}
|
|
|
|
StringDecoder.prototype.write = function (buf) {
|
|
if (buf.length === 0) return '';
|
|
var r;
|
|
var i;
|
|
if (this.lastNeed) {
|
|
r = this.fillLast(buf);
|
|
if (r === undefined) return '';
|
|
i = this.lastNeed;
|
|
this.lastNeed = 0;
|
|
} else {
|
|
i = 0;
|
|
}
|
|
if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);
|
|
return r || '';
|
|
};
|
|
|
|
StringDecoder.prototype.end = utf8End;
|
|
|
|
// Returns only complete characters in a Buffer
|
|
StringDecoder.prototype.text = utf8Text;
|
|
|
|
// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer
|
|
StringDecoder.prototype.fillLast = function (buf) {
|
|
if (this.lastNeed <= buf.length) {
|
|
buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);
|
|
return this.lastChar.toString(this.encoding, 0, this.lastTotal);
|
|
}
|
|
buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);
|
|
this.lastNeed -= buf.length;
|
|
};
|
|
|
|
// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a
|
|
// continuation byte. If an invalid byte is detected, -2 is returned.
|
|
function utf8CheckByte(byte) {
|
|
if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;
|
|
return byte >> 6 === 0x02 ? -1 : -2;
|
|
}
|
|
|
|
// Checks at most 3 bytes at the end of a Buffer in order to detect an
|
|
// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)
|
|
// needed to complete the UTF-8 character (if applicable) are returned.
|
|
function utf8CheckIncomplete(self, buf, i) {
|
|
var j = buf.length - 1;
|
|
if (j < i) return 0;
|
|
var nb = utf8CheckByte(buf[j]);
|
|
if (nb >= 0) {
|
|
if (nb > 0) self.lastNeed = nb - 1;
|
|
return nb;
|
|
}
|
|
if (--j < i || nb === -2) return 0;
|
|
nb = utf8CheckByte(buf[j]);
|
|
if (nb >= 0) {
|
|
if (nb > 0) self.lastNeed = nb - 2;
|
|
return nb;
|
|
}
|
|
if (--j < i || nb === -2) return 0;
|
|
nb = utf8CheckByte(buf[j]);
|
|
if (nb >= 0) {
|
|
if (nb > 0) {
|
|
if (nb === 2) nb = 0;else self.lastNeed = nb - 3;
|
|
}
|
|
return nb;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
// Validates as many continuation bytes for a multi-byte UTF-8 character as
|
|
// needed or are available. If we see a non-continuation byte where we expect
|
|
// one, we "replace" the validated continuation bytes we've seen so far with
|
|
// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding
|
|
// behavior. The continuation byte check is included three times in the case
|
|
// where all of the continuation bytes for a character exist in the same buffer.
|
|
// It is also done this way as a slight performance increase instead of using a
|
|
// loop.
|
|
function utf8CheckExtraBytes(self, buf, p) {
|
|
if ((buf[0] & 0xC0) !== 0x80) {
|
|
self.lastNeed = 0;
|
|
return '\ufffd';
|
|
}
|
|
if (self.lastNeed > 1 && buf.length > 1) {
|
|
if ((buf[1] & 0xC0) !== 0x80) {
|
|
self.lastNeed = 1;
|
|
return '\ufffd';
|
|
}
|
|
if (self.lastNeed > 2 && buf.length > 2) {
|
|
if ((buf[2] & 0xC0) !== 0x80) {
|
|
self.lastNeed = 2;
|
|
return '\ufffd';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.
|
|
function utf8FillLast(buf) {
|
|
var p = this.lastTotal - this.lastNeed;
|
|
var r = utf8CheckExtraBytes(this, buf, p);
|
|
if (r !== undefined) return r;
|
|
if (this.lastNeed <= buf.length) {
|
|
buf.copy(this.lastChar, p, 0, this.lastNeed);
|
|
return this.lastChar.toString(this.encoding, 0, this.lastTotal);
|
|
}
|
|
buf.copy(this.lastChar, p, 0, buf.length);
|
|
this.lastNeed -= buf.length;
|
|
}
|
|
|
|
// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a
|
|
// partial character, the character's bytes are buffered until the required
|
|
// number of bytes are available.
|
|
function utf8Text(buf, i) {
|
|
var total = utf8CheckIncomplete(this, buf, i);
|
|
if (!this.lastNeed) return buf.toString('utf8', i);
|
|
this.lastTotal = total;
|
|
var end = buf.length - (total - this.lastNeed);
|
|
buf.copy(this.lastChar, 0, end);
|
|
return buf.toString('utf8', i, end);
|
|
}
|
|
|
|
// For UTF-8, a replacement character is added when ending on a partial
|
|
// character.
|
|
function utf8End(buf) {
|
|
var r = buf && buf.length ? this.write(buf) : '';
|
|
if (this.lastNeed) return r + '\ufffd';
|
|
return r;
|
|
}
|
|
|
|
// UTF-16LE typically needs two bytes per character, but even if we have an even
|
|
// number of bytes available, we need to check if we end on a leading/high
|
|
// surrogate. In that case, we need to wait for the next two bytes in order to
|
|
// decode the last character properly.
|
|
function utf16Text(buf, i) {
|
|
if ((buf.length - i) % 2 === 0) {
|
|
var r = buf.toString('utf16le', i);
|
|
if (r) {
|
|
var c = r.charCodeAt(r.length - 1);
|
|
if (c >= 0xD800 && c <= 0xDBFF) {
|
|
this.lastNeed = 2;
|
|
this.lastTotal = 4;
|
|
this.lastChar[0] = buf[buf.length - 2];
|
|
this.lastChar[1] = buf[buf.length - 1];
|
|
return r.slice(0, -1);
|
|
}
|
|
}
|
|
return r;
|
|
}
|
|
this.lastNeed = 1;
|
|
this.lastTotal = 2;
|
|
this.lastChar[0] = buf[buf.length - 1];
|
|
return buf.toString('utf16le', i, buf.length - 1);
|
|
}
|
|
|
|
// For UTF-16LE we do not explicitly append special replacement characters if we
|
|
// end on a partial character, we simply let v8 handle that.
|
|
function utf16End(buf) {
|
|
var r = buf && buf.length ? this.write(buf) : '';
|
|
if (this.lastNeed) {
|
|
var end = this.lastTotal - this.lastNeed;
|
|
return r + this.lastChar.toString('utf16le', 0, end);
|
|
}
|
|
return r;
|
|
}
|
|
|
|
function base64Text(buf, i) {
|
|
var n = (buf.length - i) % 3;
|
|
if (n === 0) return buf.toString('base64', i);
|
|
this.lastNeed = 3 - n;
|
|
this.lastTotal = 3;
|
|
if (n === 1) {
|
|
this.lastChar[0] = buf[buf.length - 1];
|
|
} else {
|
|
this.lastChar[0] = buf[buf.length - 2];
|
|
this.lastChar[1] = buf[buf.length - 1];
|
|
}
|
|
return buf.toString('base64', i, buf.length - n);
|
|
}
|
|
|
|
function base64End(buf) {
|
|
var r = buf && buf.length ? this.write(buf) : '';
|
|
if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);
|
|
return r;
|
|
}
|
|
|
|
// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)
|
|
function simpleWrite(buf) {
|
|
return buf.toString(this.encoding);
|
|
}
|
|
|
|
function simpleEnd(buf) {
|
|
return buf && buf.length ? this.write(buf) : '';
|
|
}
|
|
},{"safe-buffer":16}],37:[function(require,module,exports){
|
|
// Copyright Joyent, Inc. and other Node contributors.
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
// copy of this software and associated documentation files (the
|
|
// "Software"), to deal in the Software without restriction, including
|
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|
// persons to whom the Software is furnished to do so, subject to the
|
|
// following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included
|
|
// in all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
'use strict';
|
|
|
|
var punycode = require('punycode');
|
|
var util = require('./util');
|
|
|
|
exports.parse = urlParse;
|
|
exports.resolve = urlResolve;
|
|
exports.resolveObject = urlResolveObject;
|
|
exports.format = urlFormat;
|
|
|
|
exports.Url = Url;
|
|
|
|
function Url() {
|
|
this.protocol = null;
|
|
this.slashes = null;
|
|
this.auth = null;
|
|
this.host = null;
|
|
this.port = null;
|
|
this.hostname = null;
|
|
this.hash = null;
|
|
this.search = null;
|
|
this.query = null;
|
|
this.pathname = null;
|
|
this.path = null;
|
|
this.href = null;
|
|
}
|
|
|
|
// Reference: RFC 3986, RFC 1808, RFC 2396
|
|
|
|
// define these here so at least they only have to be
|
|
// compiled once on the first module load.
|
|
var protocolPattern = /^([a-z0-9.+-]+:)/i,
|
|
portPattern = /:[0-9]*$/,
|
|
|
|
// Special case for a simple path URL
|
|
simplePathPattern = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,
|
|
|
|
// RFC 2396: characters reserved for delimiting URLs.
|
|
// We actually just auto-escape these.
|
|
delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t'],
|
|
|
|
// RFC 2396: characters not allowed for various reasons.
|
|
unwise = ['{', '}', '|', '\\', '^', '`'].concat(delims),
|
|
|
|
// Allowed by RFCs, but cause of XSS attacks. Always escape these.
|
|
autoEscape = ['\''].concat(unwise),
|
|
// Characters that are never ever allowed in a hostname.
|
|
// Note that any invalid chars are also handled, but these
|
|
// are the ones that are *expected* to be seen, so we fast-path
|
|
// them.
|
|
nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape),
|
|
hostEndingChars = ['/', '?', '#'],
|
|
hostnameMaxLen = 255,
|
|
hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,
|
|
hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,
|
|
// protocols that can allow "unsafe" and "unwise" chars.
|
|
unsafeProtocol = {
|
|
'javascript': true,
|
|
'javascript:': true
|
|
},
|
|
// protocols that never have a hostname.
|
|
hostlessProtocol = {
|
|
'javascript': true,
|
|
'javascript:': true
|
|
},
|
|
// protocols that always contain a // bit.
|
|
slashedProtocol = {
|
|
'http': true,
|
|
'https': true,
|
|
'ftp': true,
|
|
'gopher': true,
|
|
'file': true,
|
|
'http:': true,
|
|
'https:': true,
|
|
'ftp:': true,
|
|
'gopher:': true,
|
|
'file:': true
|
|
},
|
|
querystring = require('querystring');
|
|
|
|
function urlParse(url, parseQueryString, slashesDenoteHost) {
|
|
if (url && util.isObject(url) && url instanceof Url) return url;
|
|
|
|
var u = new Url;
|
|
u.parse(url, parseQueryString, slashesDenoteHost);
|
|
return u;
|
|
}
|
|
|
|
Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) {
|
|
if (!util.isString(url)) {
|
|
throw new TypeError("Parameter 'url' must be a string, not " + typeof url);
|
|
}
|
|
|
|
// Copy chrome, IE, opera backslash-handling behavior.
|
|
// Back slashes before the query string get converted to forward slashes
|
|
// See: https://code.google.com/p/chromium/issues/detail?id=25916
|
|
var queryIndex = url.indexOf('?'),
|
|
splitter =
|
|
(queryIndex !== -1 && queryIndex < url.indexOf('#')) ? '?' : '#',
|
|
uSplit = url.split(splitter),
|
|
slashRegex = /\\/g;
|
|
uSplit[0] = uSplit[0].replace(slashRegex, '/');
|
|
url = uSplit.join(splitter);
|
|
|
|
var rest = url;
|
|
|
|
// trim before proceeding.
|
|
// This is to support parse stuff like " http://foo.com \n"
|
|
rest = rest.trim();
|
|
|
|
if (!slashesDenoteHost && url.split('#').length === 1) {
|
|
// Try fast path regexp
|
|
var simplePath = simplePathPattern.exec(rest);
|
|
if (simplePath) {
|
|
this.path = rest;
|
|
this.href = rest;
|
|
this.pathname = simplePath[1];
|
|
if (simplePath[2]) {
|
|
this.search = simplePath[2];
|
|
if (parseQueryString) {
|
|
this.query = querystring.parse(this.search.substr(1));
|
|
} else {
|
|
this.query = this.search.substr(1);
|
|
}
|
|
} else if (parseQueryString) {
|
|
this.search = '';
|
|
this.query = {};
|
|
}
|
|
return this;
|
|
}
|
|
}
|
|
|
|
var proto = protocolPattern.exec(rest);
|
|
if (proto) {
|
|
proto = proto[0];
|
|
var lowerProto = proto.toLowerCase();
|
|
this.protocol = lowerProto;
|
|
rest = rest.substr(proto.length);
|
|
}
|
|
|
|
// figure out if it's got a host
|
|
// user@server is *always* interpreted as a hostname, and url
|
|
// resolution will treat //foo/bar as host=foo,path=bar because that's
|
|
// how the browser resolves relative URLs.
|
|
if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) {
|
|
var slashes = rest.substr(0, 2) === '//';
|
|
if (slashes && !(proto && hostlessProtocol[proto])) {
|
|
rest = rest.substr(2);
|
|
this.slashes = true;
|
|
}
|
|
}
|
|
|
|
if (!hostlessProtocol[proto] &&
|
|
(slashes || (proto && !slashedProtocol[proto]))) {
|
|
|
|
// there's a hostname.
|
|
// the first instance of /, ?, ;, or # ends the host.
|
|
//
|
|
// If there is an @ in the hostname, then non-host chars *are* allowed
|
|
// to the left of the last @ sign, unless some host-ending character
|
|
// comes *before* the @-sign.
|
|
// URLs are obnoxious.
|
|
//
|
|
// ex:
|
|
// http://a@b@c/ => user:a@b host:c
|
|
// http://a@b?@c => user:a host:c path:/?@c
|
|
|
|
// v0.12 TODO(isaacs): This is not quite how Chrome does things.
|
|
// Review our test case against browsers more comprehensively.
|
|
|
|
// find the first instance of any hostEndingChars
|
|
var hostEnd = -1;
|
|
for (var i = 0; i < hostEndingChars.length; i++) {
|
|
var hec = rest.indexOf(hostEndingChars[i]);
|
|
if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))
|
|
hostEnd = hec;
|
|
}
|
|
|
|
// at this point, either we have an explicit point where the
|
|
// auth portion cannot go past, or the last @ char is the decider.
|
|
var auth, atSign;
|
|
if (hostEnd === -1) {
|
|
// atSign can be anywhere.
|
|
atSign = rest.lastIndexOf('@');
|
|
} else {
|
|
// atSign must be in auth portion.
|
|
// http://a@b/c@d => host:b auth:a path:/c@d
|
|
atSign = rest.lastIndexOf('@', hostEnd);
|
|
}
|
|
|
|
// Now we have a portion which is definitely the auth.
|
|
// Pull that off.
|
|
if (atSign !== -1) {
|
|
auth = rest.slice(0, atSign);
|
|
rest = rest.slice(atSign + 1);
|
|
this.auth = decodeURIComponent(auth);
|
|
}
|
|
|
|
// the host is the remaining to the left of the first non-host char
|
|
hostEnd = -1;
|
|
for (var i = 0; i < nonHostChars.length; i++) {
|
|
var hec = rest.indexOf(nonHostChars[i]);
|
|
if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))
|
|
hostEnd = hec;
|
|
}
|
|
// if we still have not hit it, then the entire thing is a host.
|
|
if (hostEnd === -1)
|
|
hostEnd = rest.length;
|
|
|
|
this.host = rest.slice(0, hostEnd);
|
|
rest = rest.slice(hostEnd);
|
|
|
|
// pull out port.
|
|
this.parseHost();
|
|
|
|
// we've indicated that there is a hostname,
|
|
// so even if it's empty, it has to be present.
|
|
this.hostname = this.hostname || '';
|
|
|
|
// if hostname begins with [ and ends with ]
|
|
// assume that it's an IPv6 address.
|
|
var ipv6Hostname = this.hostname[0] === '[' &&
|
|
this.hostname[this.hostname.length - 1] === ']';
|
|
|
|
// validate a little.
|
|
if (!ipv6Hostname) {
|
|
var hostparts = this.hostname.split(/\./);
|
|
for (var i = 0, l = hostparts.length; i < l; i++) {
|
|
var part = hostparts[i];
|
|
if (!part) continue;
|
|
if (!part.match(hostnamePartPattern)) {
|
|
var newpart = '';
|
|
for (var j = 0, k = part.length; j < k; j++) {
|
|
if (part.charCodeAt(j) > 127) {
|
|
// we replace non-ASCII char with a temporary placeholder
|
|
// we need this to make sure size of hostname is not
|
|
// broken by replacing non-ASCII by nothing
|
|
newpart += 'x';
|
|
} else {
|
|
newpart += part[j];
|
|
}
|
|
}
|
|
// we test again with ASCII char only
|
|
if (!newpart.match(hostnamePartPattern)) {
|
|
var validParts = hostparts.slice(0, i);
|
|
var notHost = hostparts.slice(i + 1);
|
|
var bit = part.match(hostnamePartStart);
|
|
if (bit) {
|
|
validParts.push(bit[1]);
|
|
notHost.unshift(bit[2]);
|
|
}
|
|
if (notHost.length) {
|
|
rest = '/' + notHost.join('.') + rest;
|
|
}
|
|
this.hostname = validParts.join('.');
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (this.hostname.length > hostnameMaxLen) {
|
|
this.hostname = '';
|
|
} else {
|
|
// hostnames are always lower case.
|
|
this.hostname = this.hostname.toLowerCase();
|
|
}
|
|
|
|
if (!ipv6Hostname) {
|
|
// IDNA Support: Returns a punycoded representation of "domain".
|
|
// It only converts parts of the domain name that
|
|
// have non-ASCII characters, i.e. it doesn't matter if
|
|
// you call it with a domain that already is ASCII-only.
|
|
this.hostname = punycode.toASCII(this.hostname);
|
|
}
|
|
|
|
var p = this.port ? ':' + this.port : '';
|
|
var h = this.hostname || '';
|
|
this.host = h + p;
|
|
this.href += this.host;
|
|
|
|
// strip [ and ] from the hostname
|
|
// the host field still retains them, though
|
|
if (ipv6Hostname) {
|
|
this.hostname = this.hostname.substr(1, this.hostname.length - 2);
|
|
if (rest[0] !== '/') {
|
|
rest = '/' + rest;
|
|
}
|
|
}
|
|
}
|
|
|
|
// now rest is set to the post-host stuff.
|
|
// chop off any delim chars.
|
|
if (!unsafeProtocol[lowerProto]) {
|
|
|
|
// First, make 100% sure that any "autoEscape" chars get
|
|
// escaped, even if encodeURIComponent doesn't think they
|
|
// need to be.
|
|
for (var i = 0, l = autoEscape.length; i < l; i++) {
|
|
var ae = autoEscape[i];
|
|
if (rest.indexOf(ae) === -1)
|
|
continue;
|
|
var esc = encodeURIComponent(ae);
|
|
if (esc === ae) {
|
|
esc = escape(ae);
|
|
}
|
|
rest = rest.split(ae).join(esc);
|
|
}
|
|
}
|
|
|
|
|
|
// chop off from the tail first.
|
|
var hash = rest.indexOf('#');
|
|
if (hash !== -1) {
|
|
// got a fragment string.
|
|
this.hash = rest.substr(hash);
|
|
rest = rest.slice(0, hash);
|
|
}
|
|
var qm = rest.indexOf('?');
|
|
if (qm !== -1) {
|
|
this.search = rest.substr(qm);
|
|
this.query = rest.substr(qm + 1);
|
|
if (parseQueryString) {
|
|
this.query = querystring.parse(this.query);
|
|
}
|
|
rest = rest.slice(0, qm);
|
|
} else if (parseQueryString) {
|
|
// no query string, but parseQueryString still requested
|
|
this.search = '';
|
|
this.query = {};
|
|
}
|
|
if (rest) this.pathname = rest;
|
|
if (slashedProtocol[lowerProto] &&
|
|
this.hostname && !this.pathname) {
|
|
this.pathname = '/';
|
|
}
|
|
|
|
//to support http.request
|
|
if (this.pathname || this.search) {
|
|
var p = this.pathname || '';
|
|
var s = this.search || '';
|
|
this.path = p + s;
|
|
}
|
|
|
|
// finally, reconstruct the href based on what has been validated.
|
|
this.href = this.format();
|
|
return this;
|
|
};
|
|
|
|
// format a parsed object into a url string
|
|
function urlFormat(obj) {
|
|
// ensure it's an object, and not a string url.
|
|
// If it's an obj, this is a no-op.
|
|
// this way, you can call url_format() on strings
|
|
// to clean up potentially wonky urls.
|
|
if (util.isString(obj)) obj = urlParse(obj);
|
|
if (!(obj instanceof Url)) return Url.prototype.format.call(obj);
|
|
return obj.format();
|
|
}
|
|
|
|
Url.prototype.format = function() {
|
|
var auth = this.auth || '';
|
|
if (auth) {
|
|
auth = encodeURIComponent(auth);
|
|
auth = auth.replace(/%3A/i, ':');
|
|
auth += '@';
|
|
}
|
|
|
|
var protocol = this.protocol || '',
|
|
pathname = this.pathname || '',
|
|
hash = this.hash || '',
|
|
host = false,
|
|
query = '';
|
|
|
|
if (this.host) {
|
|
host = auth + this.host;
|
|
} else if (this.hostname) {
|
|
host = auth + (this.hostname.indexOf(':') === -1 ?
|
|
this.hostname :
|
|
'[' + this.hostname + ']');
|
|
if (this.port) {
|
|
host += ':' + this.port;
|
|
}
|
|
}
|
|
|
|
if (this.query &&
|
|
util.isObject(this.query) &&
|
|
Object.keys(this.query).length) {
|
|
query = querystring.stringify(this.query);
|
|
}
|
|
|
|
var search = this.search || (query && ('?' + query)) || '';
|
|
|
|
if (protocol && protocol.substr(-1) !== ':') protocol += ':';
|
|
|
|
// only the slashedProtocols get the //. Not mailto:, xmpp:, etc.
|
|
// unless they had them to begin with.
|
|
if (this.slashes ||
|
|
(!protocol || slashedProtocol[protocol]) && host !== false) {
|
|
host = '//' + (host || '');
|
|
if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname;
|
|
} else if (!host) {
|
|
host = '';
|
|
}
|
|
|
|
if (hash && hash.charAt(0) !== '#') hash = '#' + hash;
|
|
if (search && search.charAt(0) !== '?') search = '?' + search;
|
|
|
|
pathname = pathname.replace(/[?#]/g, function(match) {
|
|
return encodeURIComponent(match);
|
|
});
|
|
search = search.replace('#', '%23');
|
|
|
|
return protocol + host + pathname + search + hash;
|
|
};
|
|
|
|
function urlResolve(source, relative) {
|
|
return urlParse(source, false, true).resolve(relative);
|
|
}
|
|
|
|
Url.prototype.resolve = function(relative) {
|
|
return this.resolveObject(urlParse(relative, false, true)).format();
|
|
};
|
|
|
|
function urlResolveObject(source, relative) {
|
|
if (!source) return relative;
|
|
return urlParse(source, false, true).resolveObject(relative);
|
|
}
|
|
|
|
Url.prototype.resolveObject = function(relative) {
|
|
if (util.isString(relative)) {
|
|
var rel = new Url();
|
|
rel.parse(relative, false, true);
|
|
relative = rel;
|
|
}
|
|
|
|
var result = new Url();
|
|
var tkeys = Object.keys(this);
|
|
for (var tk = 0; tk < tkeys.length; tk++) {
|
|
var tkey = tkeys[tk];
|
|
result[tkey] = this[tkey];
|
|
}
|
|
|
|
// hash is always overridden, no matter what.
|
|
// even href="" will remove it.
|
|
result.hash = relative.hash;
|
|
|
|
// if the relative url is empty, then there's nothing left to do here.
|
|
if (relative.href === '') {
|
|
result.href = result.format();
|
|
return result;
|
|
}
|
|
|
|
// hrefs like //foo/bar always cut to the protocol.
|
|
if (relative.slashes && !relative.protocol) {
|
|
// take everything except the protocol from relative
|
|
var rkeys = Object.keys(relative);
|
|
for (var rk = 0; rk < rkeys.length; rk++) {
|
|
var rkey = rkeys[rk];
|
|
if (rkey !== 'protocol')
|
|
result[rkey] = relative[rkey];
|
|
}
|
|
|
|
//urlParse appends trailing / to urls like http://www.example.com
|
|
if (slashedProtocol[result.protocol] &&
|
|
result.hostname && !result.pathname) {
|
|
result.path = result.pathname = '/';
|
|
}
|
|
|
|
result.href = result.format();
|
|
return result;
|
|
}
|
|
|
|
if (relative.protocol && relative.protocol !== result.protocol) {
|
|
// if it's a known url protocol, then changing
|
|
// the protocol does weird things
|
|
// first, if it's not file:, then we MUST have a host,
|
|
// and if there was a path
|
|
// to begin with, then we MUST have a path.
|
|
// if it is file:, then the host is dropped,
|
|
// because that's known to be hostless.
|
|
// anything else is assumed to be absolute.
|
|
if (!slashedProtocol[relative.protocol]) {
|
|
var keys = Object.keys(relative);
|
|
for (var v = 0; v < keys.length; v++) {
|
|
var k = keys[v];
|
|
result[k] = relative[k];
|
|
}
|
|
result.href = result.format();
|
|
return result;
|
|
}
|
|
|
|
result.protocol = relative.protocol;
|
|
if (!relative.host && !hostlessProtocol[relative.protocol]) {
|
|
var relPath = (relative.pathname || '').split('/');
|
|
while (relPath.length && !(relative.host = relPath.shift()));
|
|
if (!relative.host) relative.host = '';
|
|
if (!relative.hostname) relative.hostname = '';
|
|
if (relPath[0] !== '') relPath.unshift('');
|
|
if (relPath.length < 2) relPath.unshift('');
|
|
result.pathname = relPath.join('/');
|
|
} else {
|
|
result.pathname = relative.pathname;
|
|
}
|
|
result.search = relative.search;
|
|
result.query = relative.query;
|
|
result.host = relative.host || '';
|
|
result.auth = relative.auth;
|
|
result.hostname = relative.hostname || relative.host;
|
|
result.port = relative.port;
|
|
// to support http.request
|
|
if (result.pathname || result.search) {
|
|
var p = result.pathname || '';
|
|
var s = result.search || '';
|
|
result.path = p + s;
|
|
}
|
|
result.slashes = result.slashes || relative.slashes;
|
|
result.href = result.format();
|
|
return result;
|
|
}
|
|
|
|
var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'),
|
|
isRelAbs = (
|
|
relative.host ||
|
|
relative.pathname && relative.pathname.charAt(0) === '/'
|
|
),
|
|
mustEndAbs = (isRelAbs || isSourceAbs ||
|
|
(result.host && relative.pathname)),
|
|
removeAllDots = mustEndAbs,
|
|
srcPath = result.pathname && result.pathname.split('/') || [],
|
|
relPath = relative.pathname && relative.pathname.split('/') || [],
|
|
psychotic = result.protocol && !slashedProtocol[result.protocol];
|
|
|
|
// if the url is a non-slashed url, then relative
|
|
// links like ../.. should be able
|
|
// to crawl up to the hostname, as well. This is strange.
|
|
// result.protocol has already been set by now.
|
|
// Later on, put the first path part into the host field.
|
|
if (psychotic) {
|
|
result.hostname = '';
|
|
result.port = null;
|
|
if (result.host) {
|
|
if (srcPath[0] === '') srcPath[0] = result.host;
|
|
else srcPath.unshift(result.host);
|
|
}
|
|
result.host = '';
|
|
if (relative.protocol) {
|
|
relative.hostname = null;
|
|
relative.port = null;
|
|
if (relative.host) {
|
|
if (relPath[0] === '') relPath[0] = relative.host;
|
|
else relPath.unshift(relative.host);
|
|
}
|
|
relative.host = null;
|
|
}
|
|
mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');
|
|
}
|
|
|
|
if (isRelAbs) {
|
|
// it's absolute.
|
|
result.host = (relative.host || relative.host === '') ?
|
|
relative.host : result.host;
|
|
result.hostname = (relative.hostname || relative.hostname === '') ?
|
|
relative.hostname : result.hostname;
|
|
result.search = relative.search;
|
|
result.query = relative.query;
|
|
srcPath = relPath;
|
|
// fall through to the dot-handling below.
|
|
} else if (relPath.length) {
|
|
// it's relative
|
|
// throw away the existing file, and take the new path instead.
|
|
if (!srcPath) srcPath = [];
|
|
srcPath.pop();
|
|
srcPath = srcPath.concat(relPath);
|
|
result.search = relative.search;
|
|
result.query = relative.query;
|
|
} else if (!util.isNullOrUndefined(relative.search)) {
|
|
// just pull out the search.
|
|
// like href='?foo'.
|
|
// Put this after the other two cases because it simplifies the booleans
|
|
if (psychotic) {
|
|
result.hostname = result.host = srcPath.shift();
|
|
//occationaly the auth can get stuck only in host
|
|
//this especially happens in cases like
|
|
//url.resolveObject('mailto:local1@domain1', 'local2@domain2')
|
|
var authInHost = result.host && result.host.indexOf('@') > 0 ?
|
|
result.host.split('@') : false;
|
|
if (authInHost) {
|
|
result.auth = authInHost.shift();
|
|
result.host = result.hostname = authInHost.shift();
|
|
}
|
|
}
|
|
result.search = relative.search;
|
|
result.query = relative.query;
|
|
//to support http.request
|
|
if (!util.isNull(result.pathname) || !util.isNull(result.search)) {
|
|
result.path = (result.pathname ? result.pathname : '') +
|
|
(result.search ? result.search : '');
|
|
}
|
|
result.href = result.format();
|
|
return result;
|
|
}
|
|
|
|
if (!srcPath.length) {
|
|
// no path at all. easy.
|
|
// we've already handled the other stuff above.
|
|
result.pathname = null;
|
|
//to support http.request
|
|
if (result.search) {
|
|
result.path = '/' + result.search;
|
|
} else {
|
|
result.path = null;
|
|
}
|
|
result.href = result.format();
|
|
return result;
|
|
}
|
|
|
|
// if a url ENDs in . or .., then it must get a trailing slash.
|
|
// however, if it ends in anything else non-slashy,
|
|
// then it must NOT get a trailing slash.
|
|
var last = srcPath.slice(-1)[0];
|
|
var hasTrailingSlash = (
|
|
(result.host || relative.host || srcPath.length > 1) &&
|
|
(last === '.' || last === '..') || last === '');
|
|
|
|
// strip single dots, resolve double dots to parent dir
|
|
// if the path tries to go above the root, `up` ends up > 0
|
|
var up = 0;
|
|
for (var i = srcPath.length; i >= 0; i--) {
|
|
last = srcPath[i];
|
|
if (last === '.') {
|
|
srcPath.splice(i, 1);
|
|
} else if (last === '..') {
|
|
srcPath.splice(i, 1);
|
|
up++;
|
|
} else if (up) {
|
|
srcPath.splice(i, 1);
|
|
up--;
|
|
}
|
|
}
|
|
|
|
// if the path is allowed to go above the root, restore leading ..s
|
|
if (!mustEndAbs && !removeAllDots) {
|
|
for (; up--; up) {
|
|
srcPath.unshift('..');
|
|
}
|
|
}
|
|
|
|
if (mustEndAbs && srcPath[0] !== '' &&
|
|
(!srcPath[0] || srcPath[0].charAt(0) !== '/')) {
|
|
srcPath.unshift('');
|
|
}
|
|
|
|
if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) {
|
|
srcPath.push('');
|
|
}
|
|
|
|
var isAbsolute = srcPath[0] === '' ||
|
|
(srcPath[0] && srcPath[0].charAt(0) === '/');
|
|
|
|
// put the host back
|
|
if (psychotic) {
|
|
result.hostname = result.host = isAbsolute ? '' :
|
|
srcPath.length ? srcPath.shift() : '';
|
|
//occationaly the auth can get stuck only in host
|
|
//this especially happens in cases like
|
|
//url.resolveObject('mailto:local1@domain1', 'local2@domain2')
|
|
var authInHost = result.host && result.host.indexOf('@') > 0 ?
|
|
result.host.split('@') : false;
|
|
if (authInHost) {
|
|
result.auth = authInHost.shift();
|
|
result.host = result.hostname = authInHost.shift();
|
|
}
|
|
}
|
|
|
|
mustEndAbs = mustEndAbs || (result.host && srcPath.length);
|
|
|
|
if (mustEndAbs && !isAbsolute) {
|
|
srcPath.unshift('');
|
|
}
|
|
|
|
if (!srcPath.length) {
|
|
result.pathname = null;
|
|
result.path = null;
|
|
} else {
|
|
result.pathname = srcPath.join('/');
|
|
}
|
|
|
|
//to support request.http
|
|
if (!util.isNull(result.pathname) || !util.isNull(result.search)) {
|
|
result.path = (result.pathname ? result.pathname : '') +
|
|
(result.search ? result.search : '');
|
|
}
|
|
result.auth = relative.auth || result.auth;
|
|
result.slashes = result.slashes || relative.slashes;
|
|
result.href = result.format();
|
|
return result;
|
|
};
|
|
|
|
Url.prototype.parseHost = function() {
|
|
var host = this.host;
|
|
var port = portPattern.exec(host);
|
|
if (port) {
|
|
port = port[0];
|
|
if (port !== ':') {
|
|
this.port = port.substr(1);
|
|
}
|
|
host = host.substr(0, host.length - port.length);
|
|
}
|
|
if (host) this.hostname = host;
|
|
};
|
|
|
|
},{"./util":38,"punycode":3,"querystring":15}],38:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
module.exports = {
|
|
isString: function(arg) {
|
|
return typeof(arg) === 'string';
|
|
},
|
|
isObject: function(arg) {
|
|
return typeof(arg) === 'object' && arg !== null;
|
|
},
|
|
isNull: function(arg) {
|
|
return arg === null;
|
|
},
|
|
isNullOrUndefined: function(arg) {
|
|
return arg == null;
|
|
}
|
|
};
|
|
|
|
},{}],39:[function(require,module,exports){
|
|
(function (global){
|
|
|
|
/**
|
|
* Module exports.
|
|
*/
|
|
|
|
module.exports = deprecate;
|
|
|
|
/**
|
|
* Mark that a method should not be used.
|
|
* Returns a modified function which warns once by default.
|
|
*
|
|
* If `localStorage.noDeprecation = true` is set, then it is a no-op.
|
|
*
|
|
* If `localStorage.throwDeprecation = true` is set, then deprecated functions
|
|
* will throw an Error when invoked.
|
|
*
|
|
* If `localStorage.traceDeprecation = true` is set, then deprecated functions
|
|
* will invoke `console.trace()` instead of `console.error()`.
|
|
*
|
|
* @param {Function} fn - the function to deprecate
|
|
* @param {String} msg - the string to print to the console when `fn` is invoked
|
|
* @returns {Function} a new "deprecated" version of `fn`
|
|
* @api public
|
|
*/
|
|
|
|
function deprecate (fn, msg) {
|
|
if (config('noDeprecation')) {
|
|
return fn;
|
|
}
|
|
|
|
var warned = false;
|
|
function deprecated() {
|
|
if (!warned) {
|
|
if (config('throwDeprecation')) {
|
|
throw new Error(msg);
|
|
} else if (config('traceDeprecation')) {
|
|
console.trace(msg);
|
|
} else {
|
|
console.warn(msg);
|
|
}
|
|
warned = true;
|
|
}
|
|
return fn.apply(this, arguments);
|
|
}
|
|
|
|
return deprecated;
|
|
}
|
|
|
|
/**
|
|
* Checks `localStorage` for boolean values for the given `name`.
|
|
*
|
|
* @param {String} name
|
|
* @returns {Boolean}
|
|
* @api private
|
|
*/
|
|
|
|
function config (name) {
|
|
// accessing global.localStorage can trigger a DOMException in sandboxed iframes
|
|
try {
|
|
if (!global.localStorage) return false;
|
|
} catch (_) {
|
|
return false;
|
|
}
|
|
var val = global.localStorage[name];
|
|
if (null == val) return false;
|
|
return String(val).toLowerCase() === 'true';
|
|
}
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
},{}],40:[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 = _interopRequireDefault(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 _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.6.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,
|
|
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
|
|
};
|
|
var _default = validator;
|
|
exports.default = _default;
|
|
module.exports = exports.default;
|
|
module.exports.default = exports.default;
|
|
},{"./lib/blacklist":42,"./lib/contains":43,"./lib/equals":44,"./lib/escape":45,"./lib/isAfter":46,"./lib/isAlpha":47,"./lib/isAlphanumeric":48,"./lib/isAscii":49,"./lib/isBIC":50,"./lib/isBase32":51,"./lib/isBase58":52,"./lib/isBase64":53,"./lib/isBefore":54,"./lib/isBoolean":55,"./lib/isBtcAddress":56,"./lib/isByteLength":57,"./lib/isCreditCard":58,"./lib/isCurrency":59,"./lib/isDataURI":60,"./lib/isDate":61,"./lib/isDecimal":62,"./lib/isDivisibleBy":63,"./lib/isEAN":64,"./lib/isEmail":65,"./lib/isEmpty":66,"./lib/isEthereumAddress":67,"./lib/isFQDN":68,"./lib/isFloat":69,"./lib/isFullWidth":70,"./lib/isHSL":71,"./lib/isHalfWidth":72,"./lib/isHash":73,"./lib/isHexColor":74,"./lib/isHexadecimal":75,"./lib/isIBAN":76,"./lib/isIMEI":77,"./lib/isIP":78,"./lib/isIPRange":79,"./lib/isISBN":80,"./lib/isISIN":81,"./lib/isISO31661Alpha2":82,"./lib/isISO31661Alpha3":83,"./lib/isISO8601":84,"./lib/isISRC":85,"./lib/isISSN":86,"./lib/isIdentityCard":87,"./lib/isIn":88,"./lib/isInt":89,"./lib/isJSON":90,"./lib/isJWT":91,"./lib/isLatLong":92,"./lib/isLength":93,"./lib/isLicensePlate":94,"./lib/isLocale":95,"./lib/isLowercase":96,"./lib/isMACAddress":97,"./lib/isMD5":98,"./lib/isMagnetURI":99,"./lib/isMimeType":100,"./lib/isMobilePhone":101,"./lib/isMongoId":102,"./lib/isMultibyte":103,"./lib/isNumeric":104,"./lib/isOctal":105,"./lib/isPassportNumber":106,"./lib/isPort":107,"./lib/isPostalCode":108,"./lib/isRFC3339":109,"./lib/isRgbColor":110,"./lib/isSemVer":111,"./lib/isSlug":112,"./lib/isStrongPassword":113,"./lib/isSurrogatePair":114,"./lib/isTaxID":115,"./lib/isURL":116,"./lib/isUUID":117,"./lib/isUppercase":118,"./lib/isVAT":119,"./lib/isVariableWidth":120,"./lib/isWhitelisted":121,"./lib/ltrim":122,"./lib/matches":123,"./lib/normalizeEmail":124,"./lib/rtrim":125,"./lib/stripLow":126,"./lib/toBoolean":127,"./lib/toDate":128,"./lib/toFloat":129,"./lib/toInt":130,"./lib/trim":131,"./lib/unescape":132,"./lib/whitelist":139}],41:[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,
|
|
'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
|
|
};
|
|
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,
|
|
'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
|
|
};
|
|
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', '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;
|
|
},{}],42:[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":134}],43:[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
|
|
};
|
|
|
|
function contains(str, elem, options) {
|
|
(0, _assertString.default)(str);
|
|
options = (0, _merge.default)(options, defaulContainsOptions);
|
|
return options.ignoreCase ? str.toLowerCase().indexOf((0, _toString.default)(elem).toLowerCase()) >= 0 : str.indexOf((0, _toString.default)(elem)) >= 0;
|
|
}
|
|
|
|
module.exports = exports.default;
|
|
module.exports.default = exports.default;
|
|
},{"./util/assertString":134,"./util/merge":136,"./util/toString":138}],44:[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":134}],45:[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":134}],46:[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":128,"./util/assertString":134}],47:[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":41,"./util/assertString":134}],48:[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":41,"./util/assertString":134}],49:[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":134}],50:[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.indexOf(str.slice(4, 6).toUpperCase()) < 0) {
|
|
return false;
|
|
}
|
|
|
|
return isBICReg.test(str);
|
|
}
|
|
|
|
module.exports = exports.default;
|
|
module.exports.default = exports.default;
|
|
},{"./isISO31661Alpha2":82,"./util/assertString":134}],51:[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":134}],52:[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":134}],53:[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":134,"./util/merge":136}],54:[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":128,"./util/assertString":134}],55:[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 }; }
|
|
|
|
function isBoolean(str) {
|
|
(0, _assertString.default)(str);
|
|
return ['true', 'false', '1', '0'].indexOf(str) >= 0;
|
|
}
|
|
|
|
module.exports = exports.default;
|
|
module.exports.default = exports.default;
|
|
},{"./util/assertString":134}],56:[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":134}],57:[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":134}],58:[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})$/;
|
|
/* 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":134}],59:[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":134,"./util/merge":136}],60:[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":134}],61:[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":136}],62:[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":41,"./util/assertString":134,"./util/includes":135,"./util/merge":136}],63:[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":129,"./util/assertString":134}],64:[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":134}],65:[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
|
|
};
|
|
/* 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 user = parts.join('@');
|
|
var lower_domain = domain.toLowerCase();
|
|
|
|
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('.', ''), {
|
|
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":57,"./isFQDN":68,"./isIP":78,"./util/assertString":134,"./util/merge":136}],66:[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":134,"./util/merge":136}],67:[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":134}],68:[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
|
|
};
|
|
|
|
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);
|
|
}
|
|
|
|
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-\uffff]{2,}|xn[a-z0-9-]{2,})$/i.test(tld)) {
|
|
return false;
|
|
} // disallow spaces && special characers
|
|
|
|
|
|
if (/[\s\u2002-\u200B\u202F\u205F\u3000\uFEFF\uDB40\uDC20\u00A9\uFFFD]/.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":134,"./util/merge":136}],69:[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":41,"./util/assertString":134}],70:[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":134}],71:[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":134}],72:[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":134}],73:[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":134}],74:[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":134}],75:[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":134}],76:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = isIBAN;
|
|
|
|
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);
|
|
}
|
|
|
|
module.exports = exports.default;
|
|
module.exports.default = exports.default;
|
|
},{"./util/assertString":134}],77:[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":134}],78:[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":134}],79:[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":78,"./util/assertString":134}],80:[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":134}],81:[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":134}],82:[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 = ['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.indexOf(str.toUpperCase()) >= 0;
|
|
}
|
|
|
|
var CountryCodes = validISO31661Alpha2CountriesCodes;
|
|
exports.CountryCodes = CountryCodes;
|
|
},{"./util/assertString":134}],83:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = isISO31661Alpha3;
|
|
|
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|
|
|
var _includes = _interopRequireDefault(require("./util/includes"));
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
// from https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3
|
|
var validISO31661Alpha3CountriesCodes = ['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 (0, _includes.default)(validISO31661Alpha3CountriesCodes, str.toUpperCase());
|
|
}
|
|
|
|
module.exports = exports.default;
|
|
module.exports.default = exports.default;
|
|
},{"./util/assertString":134,"./util/includes":135}],84:[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":134}],85:[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":134}],86:[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":134}],87:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = isIdentityCard;
|
|
|
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
var validators = {
|
|
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]);
|
|
},
|
|
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;
|
|
},
|
|
'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;
|
|
},{"./util/assertString":134}],88:[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":134,"./util/toString":138}],89:[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":134}],90:[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":134,"./util/merge":136}],91:[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":53,"./util/assertString":134}],92:[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":134,"./util/merge":136}],93:[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":134}],94:[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 = {
|
|
'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);
|
|
},
|
|
'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":134}],95:[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":134}],96:[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":134}],97:[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":134}],98:[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":134}],99:[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=urn:[a-z0-9]+:[a-z0-9]{32,40}&dn=.+&tr=.+$/i;
|
|
|
|
function isMagnetURI(url) {
|
|
(0, _assertString.default)(url);
|
|
return magnetURI.test(url.trim());
|
|
}
|
|
|
|
module.exports = exports.default;
|
|
module.exports.default = exports.default;
|
|
},{"./util/assertString":134}],100:[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":134}],101:[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-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}$/,
|
|
'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})$/,
|
|
'el-GR': /^(\+?30|0)?(69\d{8})$/,
|
|
'en-AU': /^(\+?61|0)4\d{8}$/,
|
|
'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-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-MT': /^(\+?356|0)?(99|79|77|21|27|22|25)[0-9]{6}$/,
|
|
'en-MU': /^(\+?230|0)?\d{8}$/,
|
|
'en-NG': /^(\+?234|0)?[789]\d{9}$/,
|
|
'en-NZ': /^(\+?64|0)[28]\d{7,9}$/,
|
|
'en-PK': /^((\+92)|(0092))-{0,1}\d{3}-{0,1}\d{7}$|^\d{11}$|^\d{4}-\d{7}$/,
|
|
'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}$/,
|
|
'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-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-UY': /^(\+598|0)9[1-9][\d]{6}$/,
|
|
'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-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-RE': /^(\+?262|0|00262)[67]\d{8}$/,
|
|
'he-IL': /^(\+972|0)([23489]|5[012345689]|77)[1-9]\d{6}$/,
|
|
'hu-HU': /^(\+?36)(20|30|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|5|6|7|8)( |-)?\d)\d{6}$/,
|
|
'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}$/,
|
|
'th-TH': /^(\+66|66|0)\d{9}$/,
|
|
'tr-TR': /^(\+?90|0)?5\d{9}$/,
|
|
'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([2689]))|(7([0|6-9]))|(8([1-9]))|(9([0-9])))([0-9]{7})$/,
|
|
'zh-CN': /^((\+|00)86)?1([3456789][0-9]|4[579]|6[67]|7[01235678]|9[012356789])[0-9]{8}$/,
|
|
'zh-TW': /^(\+?886\-?|0)?9\d{8}$/
|
|
};
|
|
/* 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":134}],102:[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":75,"./util/assertString":134}],103:[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":134}],104:[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":41,"./util/assertString":134}],105:[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":134}],106:[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: /^[GE]\d{8}$/,
|
|
// CHINA [G=Ordinary, E=Electronic] followed by 8-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
|
|
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
|
|
PO: /^[A-Z]{2}\d{7}$/,
|
|
// POLAND
|
|
PT: /^[A-Z]\d{6}$/,
|
|
// PORTUGAL
|
|
RO: /^\d{8,9}$/,
|
|
// ROMANIA
|
|
RU: /^\d{2}\d{2}\d{6}$/,
|
|
// 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":134}],107:[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":89}],108:[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}$/,
|
|
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":134}],109:[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":134}],110:[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":134}],111:[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":134,"./util/multilineRegex":137}],112:[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":134}],113:[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":134,"./util/merge":136}],114:[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":134}],115:[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) {
|
|
tin = tin.replace(/[^\d]+/g, '');
|
|
if (tin === '') return false;
|
|
|
|
if (tin.length === 11) {
|
|
var _sum;
|
|
|
|
var ramainder;
|
|
_sum = 0;
|
|
tin = tin.replace(/[^\d]+/g, '');
|
|
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);
|
|
}
|
|
|
|
ramainder = _sum * 10 % 11;
|
|
if (ramainder === 10 || ramainder === 11) ramainder = 0;
|
|
if (ramainder !== 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);
|
|
}
|
|
|
|
ramainder = _sum * 10 % 11;
|
|
if (ramainder === 10 || ramainder === 11) ramainder = 0;
|
|
if (ramainder !== parseInt(tin.substring(10, 11), 10)) return false;
|
|
return true;
|
|
}
|
|
|
|
if (tin.length !== 14) {
|
|
return false;
|
|
}
|
|
|
|
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,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":61,"./util/algorithms":133,"./util/assertString":134}],116:[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 }; }
|
|
|
|
/*
|
|
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,
|
|
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;
|
|
}
|
|
|
|
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] === '' || split[0].substr(0, 1) === ':') {
|
|
return false;
|
|
}
|
|
|
|
auth = split.shift();
|
|
|
|
if (auth.indexOf(':') >= 0 && auth.split(':').length > 2) {
|
|
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 = parseInt(port_str, 10);
|
|
|
|
if (!/^[0-9]+$/.test(port_str) || port <= 0 || port > 65535) {
|
|
return false;
|
|
}
|
|
} else if (options.require_port) {
|
|
return false;
|
|
}
|
|
|
|
if (!(0, _isIP.default)(host) && !(0, _isFQDN.default)(host, options) && (!ipv6 || !(0, _isIP.default)(ipv6, 6))) {
|
|
return false;
|
|
}
|
|
|
|
host = host || ipv6;
|
|
|
|
if (options.host_whitelist && !checkHost(host, options.host_whitelist)) {
|
|
return false;
|
|
}
|
|
|
|
if (options.host_blacklist && checkHost(host, options.host_blacklist)) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
module.exports = exports.default;
|
|
module.exports.default = exports.default;
|
|
},{"./isFQDN":68,"./isIP":78,"./util/assertString":134,"./util/merge":136}],117:[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 = {
|
|
3: /^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,
|
|
4: /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,
|
|
5: /^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,
|
|
all: /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i
|
|
};
|
|
|
|
function isUUID(str) {
|
|
var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'all';
|
|
(0, _assertString.default)(str);
|
|
var pattern = uuid[version];
|
|
return pattern && pattern.test(str);
|
|
}
|
|
|
|
module.exports = exports.default;
|
|
module.exports.default = exports.default;
|
|
},{"./util/assertString":134}],118:[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":134}],119:[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}$/
|
|
};
|
|
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":134}],120:[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":70,"./isHalfWidth":72,"./util/assertString":134}],121:[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":134}],122:[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":134}],123:[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":134}],124:[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":136}],125:[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); // 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":134}],126:[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":42,"./util/assertString":134}],127:[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":134}],128:[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":134}],129:[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":69}],130:[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":134}],131:[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":122,"./rtrim":125}],132:[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, '`');
|
|
}
|
|
|
|
module.exports = exports.default;
|
|
module.exports.default = exports.default;
|
|
},{"./util/assertString":134}],133:[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;
|
|
}
|
|
},{}],134:[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;
|
|
},{}],135:[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;
|
|
},{}],136:[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;
|
|
},{}],137:[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;
|
|
},{}],138:[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;
|
|
},{}],139:[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":134}],140:[function(require,module,exports){
|
|
module.exports = extend
|
|
|
|
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
|
|
function extend() {
|
|
var target = {}
|
|
|
|
for (var i = 0; i < arguments.length; i++) {
|
|
var source = arguments[i]
|
|
|
|
for (var key in source) {
|
|
if (hasOwnProperty.call(source, key)) {
|
|
target[key] = source[key]
|
|
}
|
|
}
|
|
}
|
|
|
|
return target
|
|
}
|
|
|
|
},{}],141:[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}"
|
|
|
|
};
|
|
|
|
},{}],142:[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":40}],143:[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":142,"./Report":145,"./Utils":149}],144:[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;
|
|
};
|
|
}
|
|
|
|
},{}],145:[function(require,module,exports){
|
|
(function (process){
|
|
"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,require('_process'))
|
|
},{"./Errors":141,"./Utils":149,"_process":12,"lodash.get":10}],146:[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":145,"./SchemaCompilation":147,"./SchemaValidation":148,"./Utils":149,"lodash.isequal":11}],147:[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":145,"./SchemaCache":146,"./Utils":149}],148:[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":142,"./JsonValidation":143,"./Report":145,"./Utils":149}],149:[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*/
|
|
|
|
},{}],150:[function(require,module,exports){
|
|
(function (process){
|
|
"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,
|
|
// stops validation as soon as an error is found, true by default but can be turned off
|
|
breakOnFirstError: true,
|
|
// 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 an 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,require('_process'))
|
|
},{"./FormatValidators":142,"./JsonValidation":143,"./Polyfills":144,"./Report":145,"./SchemaCache":146,"./SchemaCompilation":147,"./SchemaValidation":148,"./Utils":149,"./schemas/hyper-schema.json":151,"./schemas/schema.json":152,"_process":12,"lodash.get":10}],151:[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": "#"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
},{}],152:[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": {}
|
|
}
|
|
|
|
},{}],153:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "assumeAdditional - Assume additional properties/items in schemas are defined to false",
|
|
options: {
|
|
assumeAdditional: true
|
|
},
|
|
tests: [
|
|
{
|
|
schema: {
|
|
"type": "object",
|
|
"properties": {
|
|
"hello": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
data: {
|
|
hello: "world"
|
|
},
|
|
description: "should pass validation when only defined properties are used",
|
|
valid: true
|
|
},
|
|
{
|
|
schema: {
|
|
"type": "object",
|
|
"properties": {
|
|
"hello": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
data: {
|
|
hello: "world",
|
|
good: "morning"
|
|
},
|
|
description: "should fail validation when other than defined properties are used",
|
|
valid: false
|
|
},
|
|
{
|
|
schema: {
|
|
"type": "object",
|
|
"properties": {
|
|
"hello": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
data: {
|
|
hello: "world",
|
|
good: "morning",
|
|
night: "night"
|
|
},
|
|
description: "should fail validation with multiple errors when several other than defined properties are used",
|
|
valid: false,
|
|
after: function(errs) {
|
|
expect(errs.length).toBe(2);
|
|
expect(errs[0].message).toBe('Additional properties not allowed: good');
|
|
expect(errs[1].message).toBe('Additional properties not allowed: night');
|
|
}
|
|
},
|
|
{
|
|
schema: {
|
|
"type": "array",
|
|
"items": [
|
|
{ "type": "string" },
|
|
{ "type": "string" },
|
|
{ "type": "string" }
|
|
]
|
|
},
|
|
data: [
|
|
"aaa",
|
|
"bbb",
|
|
"ccc"
|
|
],
|
|
description: "should pass validation when only allowed items are used",
|
|
valid: true
|
|
},
|
|
{
|
|
schema: {
|
|
"type": "array",
|
|
"items": [
|
|
{ "type": "string" },
|
|
{ "type": "string" },
|
|
{ "type": "string" }
|
|
]
|
|
},
|
|
data: [
|
|
"aaa",
|
|
"bbb",
|
|
"ccc",
|
|
null
|
|
],
|
|
description: "should fail validation when other than allowed items are used",
|
|
valid: false
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],154:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "registerFormat - Custom formats support",
|
|
setup: function (validator, Class) {
|
|
Class.registerFormat("xstring", function (str) {
|
|
return str === "xxx";
|
|
});
|
|
Class.registerFormat("emptystring", function (str) {
|
|
return typeof str === "string" && str.length === 0 && str === "";
|
|
});
|
|
Class.registerFormat("fillHello", function (obj) {
|
|
obj.hello = "world";
|
|
return true;
|
|
});
|
|
},
|
|
schema: {
|
|
"type": "string",
|
|
"format": "xstring"
|
|
},
|
|
tests: [
|
|
{
|
|
description: "should pass custom format validation",
|
|
data: "xxx",
|
|
valid: true
|
|
},
|
|
{
|
|
description: "should fail custom format validation",
|
|
data: "xxxx",
|
|
valid: false
|
|
},
|
|
{
|
|
description: "should fail when using unknown format",
|
|
data: "xxx",
|
|
schema: {
|
|
"type": "string",
|
|
"format": "xstring2"
|
|
},
|
|
valid: false
|
|
},
|
|
{
|
|
description: "should pass validating empty string",
|
|
data: "",
|
|
schema: {
|
|
"type": "string",
|
|
"format": "emptystring"
|
|
},
|
|
valid: true
|
|
},
|
|
{
|
|
description: "should be able to modify object using format",
|
|
data: {},
|
|
schema: {
|
|
"type": "object",
|
|
"format": "fillHello"
|
|
},
|
|
valid: true,
|
|
after: function (err, valid, obj) {
|
|
expect(obj.hello).toBe("world");
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],155:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "registerFormat - Custom formats async support",
|
|
async: true,
|
|
options: {
|
|
asyncTimeout: 500
|
|
},
|
|
setup: function (validator, Class) {
|
|
Class.registerFormat("xstring", function (str, callback) {
|
|
setTimeout(function () {
|
|
callback(str === "xxx");
|
|
}, 1);
|
|
});
|
|
Class.registerFormat("shouldTimeout", function (str, callback) {
|
|
return typeof callback === "function";
|
|
});
|
|
},
|
|
schema: {
|
|
"type": "string",
|
|
"format": "xstring"
|
|
},
|
|
tests: [
|
|
{
|
|
description: "should pass custom format async validation",
|
|
data: "xxx",
|
|
valid: true
|
|
},
|
|
{
|
|
description: "should fail custom format async validation",
|
|
data: "xxxx",
|
|
valid: false
|
|
},
|
|
{
|
|
description: "should timeout if callback is not called in default limit",
|
|
data: "xxx",
|
|
schema: {
|
|
"type": "string",
|
|
"format": "shouldTimeout"
|
|
},
|
|
valid: false,
|
|
after: function (err, valid) {
|
|
expect(valid).toBe(false);
|
|
expect(err.length).toBe(1);
|
|
expect(err[0].code).toBe("ASYNC_TIMEOUT");
|
|
}
|
|
},
|
|
{
|
|
description: "should execute callback even if no async format is found",
|
|
data: "xxx",
|
|
schema: {
|
|
"type": "string"
|
|
},
|
|
valid: true
|
|
},
|
|
{
|
|
description: "should not call async validator if errors have been found before",
|
|
data: "xxx",
|
|
schema: {
|
|
"type": "boolean",
|
|
"format": "shouldTimeout"
|
|
},
|
|
valid: false,
|
|
after: function (err, valid) {
|
|
expect(valid).toBe(false);
|
|
expect(err.length).toBe(1);
|
|
expect(err[0].code).toBe("INVALID_TYPE");
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],156:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
//Implement new 'shouldFail' keyword
|
|
function customValidatorFn(report, schema, json) {
|
|
if (schema.shouldFail === true) {
|
|
report.addCustomError("SHOULD_FAIL", "Forced fail", [], null, schema.description);
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
description: "customValidator - Function to be called on every schema",
|
|
options: {
|
|
customValidator: customValidatorFn
|
|
},
|
|
schema: {
|
|
"type": "object",
|
|
"properties": {
|
|
"a": {
|
|
"type": "integer"
|
|
},
|
|
"b": {
|
|
shouldFail: false
|
|
}
|
|
},
|
|
"additionalProperties": {
|
|
shouldFail: true
|
|
}
|
|
},
|
|
tests: [
|
|
{
|
|
description: "should pass custom validation",
|
|
data: {
|
|
a: 0,
|
|
b: null
|
|
},
|
|
valid: true
|
|
},
|
|
{
|
|
description: "should fail on standard error",
|
|
data: {
|
|
a: "incorrect type",
|
|
b: null
|
|
},
|
|
valid: false,
|
|
after: function (err) {
|
|
expect(err[0].code).toBe("INVALID_TYPE");
|
|
}
|
|
},
|
|
{
|
|
description: "should fail on custom error",
|
|
data: {
|
|
c: null
|
|
},
|
|
valid: false,
|
|
after: function (err) {
|
|
expect(err[0].code).toBe("SHOULD_FAIL");
|
|
expect(err[0].message).toBe("Forced fail");
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],157:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "reportPathAsArray - Report error paths as an array of path segments",
|
|
options: {
|
|
reportPathAsArray: true
|
|
},
|
|
tests: [
|
|
{
|
|
description: "should fail validation and report error paths as an array of path segments",
|
|
schema: {
|
|
"type": "object",
|
|
"properties": {
|
|
"name": {
|
|
"type": "invalid"
|
|
}
|
|
}
|
|
},
|
|
valid: false,
|
|
validateSchemaOnly: true,
|
|
after: function (err) {
|
|
expect(err[0].path).toEqual(["properties", "name"]);
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],158:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Report error paths as a JSON Pointer string",
|
|
tests: [
|
|
{
|
|
description: "should fail validation and report error paths a JSON Pointer string",
|
|
schema: {
|
|
"type": "object",
|
|
"properties": {
|
|
"~name/age": {
|
|
"type": "invalid"
|
|
}
|
|
}
|
|
},
|
|
valid: false,
|
|
validateSchemaOnly: true,
|
|
after: function (err) {
|
|
expect(err[0].path).toEqual("#/properties/~0name~1age");
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],159:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Report error paths with integer array indices",
|
|
options: {
|
|
reportPathAsArray: true
|
|
},
|
|
tests: [
|
|
{
|
|
description: "should fail validation and error path should contain integer array index",
|
|
schema: {
|
|
"type": "object",
|
|
"properties": {
|
|
"list": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
data: {
|
|
"list": [
|
|
123
|
|
]
|
|
},
|
|
valid: false,
|
|
validateSchemaOnly: false,
|
|
after: function (err) {
|
|
expect(err[0].path).toEqual(["list", 0]);
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],160:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "forceAdditional - Force additional properties/items in schemas",
|
|
options: {
|
|
forceAdditional: true
|
|
},
|
|
validateSchemaOnly: true,
|
|
tests: [
|
|
{
|
|
schema: {
|
|
"type": "object",
|
|
"properties": {
|
|
"hello": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
description: "should pass schema validation when additionalProperties are defined on objects",
|
|
valid: true
|
|
},
|
|
{
|
|
schema: {
|
|
"type": "object",
|
|
"properties": {
|
|
"hello": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
description: "should fail schema validation when additionalProperties are not defined on objects",
|
|
valid: false
|
|
},
|
|
{
|
|
schema: {
|
|
"type": "array",
|
|
"items": [
|
|
{
|
|
"type": "string"
|
|
}
|
|
],
|
|
"additionalItems": false
|
|
},
|
|
description: "should pass schema validation when additionalItems are defined on arrays",
|
|
valid: true
|
|
},
|
|
{
|
|
schema: {
|
|
"type": "array",
|
|
"items": [
|
|
{
|
|
"type": "string"
|
|
}
|
|
]
|
|
},
|
|
description: "should fail schema validation when additionalItems are not defined on arrays",
|
|
valid: false
|
|
},
|
|
{
|
|
schema: {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
description: "should pass schema validation without additionalItems because they doesn't matter when items is a schema",
|
|
valid: true
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],161:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "forceItems - Force items to be defined on arrays",
|
|
options: {
|
|
forceItems: true
|
|
},
|
|
validateSchemaOnly: true,
|
|
tests: [
|
|
{
|
|
schema: {
|
|
"type": "array",
|
|
"items": {}
|
|
},
|
|
description: "should pass schema validation because items are defined",
|
|
valid: true
|
|
},
|
|
{
|
|
schema: {
|
|
"type": "array"
|
|
},
|
|
description: "should fail schema validation because items are not defined",
|
|
valid: false
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],162:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "forceMaxItems - Force maxItems to be defined on arrays",
|
|
options: {
|
|
forceMaxItems: true
|
|
},
|
|
validateSchemaOnly: true,
|
|
tests: [
|
|
{
|
|
schema: {
|
|
"type": "array",
|
|
"maxItems": 20
|
|
},
|
|
description: "should pass schema validation because maxItems is defined",
|
|
valid: true
|
|
},
|
|
{
|
|
schema: {
|
|
"type": "array"
|
|
},
|
|
description: "should fail schema validation because maxItems is not defined",
|
|
valid: false
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],163:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "forceMaxLength - Force maxLength to be defined on strings",
|
|
options: {
|
|
forceMaxLength: true
|
|
},
|
|
validateSchemaOnly: true,
|
|
tests: [
|
|
{
|
|
schema: {
|
|
"type": "string",
|
|
"maxLength": 20
|
|
},
|
|
description: "should pass schema validation because maxLength is defined",
|
|
valid: true
|
|
},
|
|
{
|
|
schema: {
|
|
"type": "string"
|
|
},
|
|
description: "should fail schema validation because maxLength is not defined",
|
|
valid: false
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],164:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "forceMinItems - Force minItems to be defined on arrays",
|
|
options: {
|
|
forceMinItems: true
|
|
},
|
|
validateSchemaOnly: true,
|
|
tests: [
|
|
{
|
|
schema: {
|
|
"type": "array",
|
|
"minItems": 20
|
|
},
|
|
description: "should pass schema validation because minItems is defined",
|
|
valid: true
|
|
},
|
|
{
|
|
schema: {
|
|
"type": "array"
|
|
},
|
|
description: "should fail schema validation because minItems is not defined",
|
|
valid: false
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],165:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "forceMinLength - Force minLength to be defined on strings",
|
|
options: {
|
|
forceMinLength: true
|
|
},
|
|
validateSchemaOnly: true,
|
|
tests: [
|
|
{
|
|
schema: {
|
|
"type": "string",
|
|
"minLength": 20
|
|
},
|
|
description: "should pass schema validation because minLength is defined",
|
|
valid: true
|
|
},
|
|
{
|
|
schema: {
|
|
"type": "string"
|
|
},
|
|
description: "should fail schema validation because minLength is not defined",
|
|
valid: false
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],166:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "forceProperties - Force properties to be defined on objects",
|
|
options: {
|
|
forceProperties: true
|
|
},
|
|
validateSchemaOnly: true,
|
|
tests: [
|
|
{
|
|
schema: {
|
|
"type": "object",
|
|
"properties": {
|
|
"test": {}
|
|
}
|
|
},
|
|
description: "should pass schema validation because properties are defined",
|
|
valid: true
|
|
},
|
|
{
|
|
schema: {
|
|
"type": "object",
|
|
"patternProperties": {
|
|
"te(s|t)": {}
|
|
}
|
|
},
|
|
description: "should pass schema validation because patternProperties are defined",
|
|
valid: true
|
|
},
|
|
{
|
|
schema: {
|
|
"type": "object"
|
|
},
|
|
description: "should fail schema validation because properties are not defined",
|
|
valid: false
|
|
},
|
|
{
|
|
schema: {
|
|
"type": "object",
|
|
"properties": {}
|
|
},
|
|
description: "should fail schema validation because properties are present but doesn't define any properties",
|
|
valid: false
|
|
},
|
|
{
|
|
schema: {
|
|
"type": "object",
|
|
"patternProperties": {}
|
|
},
|
|
description: "should fail schema validation because patternProperties are present but doesn't define any properties",
|
|
valid: false
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],167:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "ignoreUnresolvableReferences - Ignore remote references in schemas",
|
|
options: {
|
|
ignoreUnresolvableReferences: true
|
|
},
|
|
validateSchemaOnly: true,
|
|
tests: [
|
|
{
|
|
schema: {
|
|
"$schema": "http://doesnt-exists.org/draft-04/schema",
|
|
},
|
|
description: "should pass schema validation because link is to http schema",
|
|
valid: true
|
|
},
|
|
{
|
|
schema: {
|
|
"definitions": {
|
|
"a": {"type": "integer"},
|
|
"b": {"$ref": "#/definitions/a"},
|
|
"c": {"$ref": "#/definitions/b"}
|
|
},
|
|
"$ref": "#/definitions/c"
|
|
},
|
|
description: "should pass schema validation because definitions are resolvable",
|
|
valid: true
|
|
},
|
|
{
|
|
schema: {
|
|
"definitions": {
|
|
"a": {"type": "integer"},
|
|
"b": {"$ref": "#/definitions/aaa"},
|
|
"c": {"$ref": "#/definitions/b"}
|
|
},
|
|
"$ref": "#/definitions/c"
|
|
},
|
|
description: "should fail schema validation because definitions are not resolvable",
|
|
valid: false
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],168:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "includeErrors - Validate only against specified errors",
|
|
options: {
|
|
breakOnFirstError: false,
|
|
assumeAdditional: true
|
|
},
|
|
tests: [
|
|
{
|
|
schema: {
|
|
"type": "object",
|
|
"properties": {
|
|
"hello": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
},
|
|
data: {
|
|
hello: "world"
|
|
},
|
|
validateOptions: {
|
|
includeErrors: ["INVALID_TYPE"]
|
|
},
|
|
description: "should fail validation when the specified error is present",
|
|
valid: false
|
|
},
|
|
{
|
|
schema: {
|
|
"type": "object",
|
|
"properties": {
|
|
"hello": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
},
|
|
data: {
|
|
hello: "world"
|
|
},
|
|
validateOptions: {
|
|
includeErrors: ["OBJECT_ADDITIONAL_PROPERTIES"]
|
|
},
|
|
description: "should pass validation when the specified error is not present",
|
|
valid: true
|
|
},
|
|
{
|
|
schema: {
|
|
"type": "object",
|
|
"properties": {
|
|
"hello": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
},
|
|
data: {
|
|
hello: "world",
|
|
extra: "extra"
|
|
},
|
|
validateOptions: {
|
|
includeErrors: ["INVALID_TYPE"]
|
|
},
|
|
description: "should fail validation when the specified error is present only for that error",
|
|
valid: false,
|
|
after: function(errs) {
|
|
expect(errs.length).toBe(1);
|
|
expect(errs[0].code).toBe("INVALID_TYPE");
|
|
}
|
|
},
|
|
{
|
|
schema: {
|
|
"type": "object",
|
|
"properties": {
|
|
"hello": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
},
|
|
data: {
|
|
hello: "world",
|
|
extra: "extra"
|
|
},
|
|
description: "should fail validation for all errors when no `includeErrors` array is provided.",
|
|
valid: false,
|
|
after: function(errs) {
|
|
expect(errs.length).toBe(2);
|
|
}
|
|
},
|
|
{
|
|
schema: {
|
|
"type": "object",
|
|
"properties": {
|
|
"hello": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
},
|
|
data: {
|
|
hello: "world",
|
|
extra: "extra"
|
|
},
|
|
validateOptions: {
|
|
includeErrors: []
|
|
},
|
|
description: "should fail validation for all errors when empty array is provided.",
|
|
valid: false,
|
|
after: function(errs) {
|
|
expect(errs.length).toBe(2);
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],169:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "InvalidId - check if schema with invalid id can be processed",
|
|
validateSchemaOnly: true,
|
|
tests: [
|
|
{
|
|
schema: {
|
|
"id": {}
|
|
},
|
|
description: "should fail schema validation because id has incorrect value",
|
|
valid: false
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],170:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #101 - Cannot read property '__$compiled' of undefined",
|
|
async: true,
|
|
options: {
|
|
asyncTimeout: 500
|
|
},
|
|
schema: null,
|
|
tests: [
|
|
{
|
|
description: "should fail with correct error",
|
|
data: null,
|
|
valid: false,
|
|
after: function (err) {
|
|
expect(err.message).toBe("Invalid .validate call - schema must be an string or object but null was passed!");
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],171:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #102 - circular references",
|
|
tests: [
|
|
{
|
|
description: "should pass without an error",
|
|
schema: {},
|
|
data: {},
|
|
valid: true,
|
|
after: function (err, valid, data, validator) {
|
|
var resolvedSchema = validator.getResolvedSchema("http://json-schema.org/draft-04/schema#");
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],172:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #103 - Validate async fails silently",
|
|
options: {
|
|
asyncTimeout: 500
|
|
},
|
|
schema: {
|
|
required: ["recType", "luValue"],
|
|
properties: {
|
|
luValue: {
|
|
type: "string"
|
|
},
|
|
useAsIs: {
|
|
type: "integer"
|
|
},
|
|
valueText: {
|
|
type: "string"
|
|
},
|
|
sequence: {
|
|
type: "integer",
|
|
minimum: 0
|
|
},
|
|
description: {
|
|
type: "string"
|
|
},
|
|
valueInt: {
|
|
type: "integer"
|
|
},
|
|
recType: {
|
|
type: "string",
|
|
enum: []
|
|
},
|
|
recProps: {
|
|
type: "object",
|
|
properties: {},
|
|
additionalProperties: false
|
|
},
|
|
control: {
|
|
"$ref": "control"
|
|
}
|
|
},
|
|
additionalProperties: false,
|
|
type: "object",
|
|
title: "lookup schema for bankCodeType"
|
|
},
|
|
tests: [
|
|
{
|
|
async: false,
|
|
description: "should fail with correct error - sync",
|
|
validateSchemaOnly: true,
|
|
valid: false,
|
|
after: function (errs) {
|
|
expect(errs.length).toBe(1);
|
|
}
|
|
},
|
|
{
|
|
async: true,
|
|
description: "should fail with correct error - async",
|
|
validateSchemaOnly: true,
|
|
valid: false,
|
|
after: function (errs) {
|
|
expect(errs.length).toBe(1);
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],173:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #106 - validateSchema method returns true if you pass an empty array",
|
|
tests: [
|
|
{
|
|
description: "should fail with an error",
|
|
schema: [],
|
|
validateSchemaOnly: true,
|
|
failWithException: true
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],174:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #107 - add Support for Controlling Remote Schema Reading",
|
|
setup: function (validator, ZSchema) {
|
|
ZSchema.setSchemaReader(function (uri) {
|
|
return {
|
|
type: "string"
|
|
};
|
|
});
|
|
},
|
|
tests: [
|
|
{
|
|
description: "should pass validation",
|
|
schema: {
|
|
"$ref": "schema-1"
|
|
},
|
|
data: "i'm a string",
|
|
valid: true
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],175:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #12 - validation should fail when missing a reference",
|
|
tests: [
|
|
{
|
|
description: "should pass validation",
|
|
schema: {
|
|
"id": "http://my.site/myschema#",
|
|
"$ref": "#/definitions/schema2",
|
|
"definitions": {
|
|
"schema1": {
|
|
"id": "schema1",
|
|
"type": "integer"
|
|
},
|
|
"schema2": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "schema1"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
data: [1, 2, 3],
|
|
valid: true
|
|
},
|
|
{
|
|
description: "should fail validation",
|
|
schema: {
|
|
"id": "http://my.site/myschema#",
|
|
"$ref": "#/definitions/schema2",
|
|
"definitions": {
|
|
"schema1": {
|
|
"id": "schema1",
|
|
"type": "integer"
|
|
},
|
|
"schema2": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "schema1"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
data: ["1", null, 3],
|
|
valid: false
|
|
},
|
|
{
|
|
description: "should fail compilation with unresolvable reference",
|
|
schema: {
|
|
id: "schemaA",
|
|
type: "object",
|
|
properties: {
|
|
a: {
|
|
type: "integer"
|
|
},
|
|
b: {
|
|
type: "string"
|
|
},
|
|
c: {
|
|
$ref: "schemaB"
|
|
}
|
|
},
|
|
required: ["a"]
|
|
},
|
|
validateSchemaOnly: true,
|
|
valid: false,
|
|
after: function (err) {
|
|
expect(err[0].code).toBe("UNRESOLVABLE_REFERENCE");
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],176:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #121 - ignoreUnknownFormats",
|
|
options: {
|
|
ignoreUnknownFormats: true
|
|
},
|
|
tests: [
|
|
{
|
|
description: "should not fail when ignoring unknown formats",
|
|
schema: {
|
|
type: "string",
|
|
format: "unknown"
|
|
},
|
|
valid: true,
|
|
validateSchemaOnly: true
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],177:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #125 - Do not process format if type validation fails",
|
|
setup: function (validator, Class) {
|
|
Class.registerFormat("int32", function () {
|
|
return false;
|
|
});
|
|
},
|
|
schema: {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
tests: [
|
|
{
|
|
description: "should only process type validation",
|
|
data: 1.1,
|
|
valid: false,
|
|
after: function (err) {
|
|
expect(err.length).toBe(1);
|
|
expect(err[0].code).toBe("INVALID_TYPE");
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],178:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
var REF_NAME = "int.json";
|
|
|
|
module.exports = {
|
|
description: "Issue #126 - do not add UNRESOLVABLE_REFERENCE error when set through setRemoteReference",
|
|
tests: [
|
|
{
|
|
description: "should fail compilation with unresolvable reference",
|
|
setup: function (validator) {
|
|
validator.setRemoteReference(REF_NAME, {
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"id": REF_NAME,
|
|
"type": "object",
|
|
"required": [
|
|
"number"
|
|
],
|
|
"properties": {
|
|
"number": {
|
|
"$ref": "data-types.json#/definitions/number"
|
|
}
|
|
}
|
|
});
|
|
},
|
|
schema: {
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"id": "ints.json",
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": REF_NAME
|
|
}
|
|
},
|
|
validateSchemaOnly: true,
|
|
valid: false,
|
|
after: function (err, valid, data, validator) {
|
|
err.forEach(function (e) {
|
|
if (e.params.indexOf(REF_NAME) !== -1) {
|
|
expect(e.code).not.toBe("UNRESOLVABLE_REFERENCE");
|
|
}
|
|
});
|
|
expect(validator.getMissingRemoteReferences().length).toBe(1);
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],179:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #13 - compile multiple schemas tied together with an id",
|
|
tests: [
|
|
{
|
|
description: "mainSchema should fail compilation on its own",
|
|
schema: {
|
|
id: "mainSchema",
|
|
type: "object",
|
|
properties: {
|
|
a: {"$ref": "schemaA"},
|
|
b: {"$ref": "schemaB"},
|
|
c: {"enum": ["C"]}
|
|
}
|
|
},
|
|
validateSchemaOnly: true,
|
|
valid: false
|
|
},
|
|
{
|
|
description: "mainSchema should pass compilation if schemaA and schemaB were already compiled, order #1",
|
|
schema: [
|
|
{
|
|
id: "schemaA",
|
|
type: "integer"
|
|
},
|
|
{
|
|
id: "schemaB",
|
|
type: "string"
|
|
},
|
|
{
|
|
id: "mainSchema",
|
|
type: "object",
|
|
properties: {
|
|
a: {"$ref": "schemaA"},
|
|
b: {"$ref": "schemaB"},
|
|
c: {"enum": ["C"]}
|
|
}
|
|
}
|
|
],
|
|
validateSchemaOnly: true,
|
|
valid: true
|
|
},
|
|
{
|
|
description: "mainSchema should pass compilation if schemaA and schemaB were already compiled, order #2",
|
|
schema: [
|
|
{
|
|
id: "mainSchema",
|
|
type: "object",
|
|
properties: {
|
|
a: {"$ref": "schemaA"},
|
|
b: {"$ref": "schemaB"},
|
|
c: {"enum": ["C"]}
|
|
}
|
|
},
|
|
{
|
|
id: "schemaA",
|
|
type: "integer"
|
|
},
|
|
{
|
|
id: "schemaB",
|
|
type: "string"
|
|
}
|
|
],
|
|
validateSchemaOnly: true,
|
|
valid: true
|
|
},
|
|
{
|
|
description: "compilation should never end up in infinite loop #1",
|
|
schema: [
|
|
{
|
|
id: "mainSchema",
|
|
type: "object",
|
|
properties: {
|
|
a: {"$ref": "schemaA"},
|
|
b: {"$ref": "schemaB"},
|
|
c: {"enum": ["C"]}
|
|
}
|
|
},
|
|
{
|
|
id: "schemaB",
|
|
type: "string"
|
|
}
|
|
],
|
|
validateSchemaOnly: true,
|
|
valid: false
|
|
},
|
|
{
|
|
description: "compilation should never end up in infinite loop #2",
|
|
schema: [
|
|
{
|
|
id: "schemaB",
|
|
type: "string"
|
|
},
|
|
{
|
|
id: "mainSchema",
|
|
type: "object",
|
|
properties: {
|
|
a: {"$ref": "schemaA"},
|
|
b: {"$ref": "schemaB"},
|
|
c: {"enum": ["C"]}
|
|
}
|
|
}
|
|
],
|
|
validateSchemaOnly: true,
|
|
valid: false
|
|
},
|
|
{
|
|
description: "should validate object successfully",
|
|
schema: [
|
|
{
|
|
id: "schemaA",
|
|
type: "integer"
|
|
},
|
|
{
|
|
id: "schemaB",
|
|
type: "string"
|
|
},
|
|
{
|
|
id: "mainSchema",
|
|
type: "object",
|
|
properties: {
|
|
a: {"$ref": "schemaA"},
|
|
b: {"$ref": "schemaB"},
|
|
c: {"enum": ["C"]}
|
|
}
|
|
}
|
|
],
|
|
schemaIndex: 2,
|
|
data: {
|
|
a: 1,
|
|
b: "str",
|
|
c: "C"
|
|
},
|
|
valid: true
|
|
},
|
|
{
|
|
description: "should fail validating object",
|
|
schema: [
|
|
{
|
|
id: "schemaA",
|
|
type: "integer"
|
|
},
|
|
{
|
|
id: "schemaB",
|
|
type: "string"
|
|
},
|
|
{
|
|
id: "mainSchema",
|
|
type: "object",
|
|
properties: {
|
|
a: {"$ref": "schemaA"},
|
|
b: {"$ref": "schemaB"},
|
|
c: {"enum": ["C"]}
|
|
}
|
|
}
|
|
],
|
|
schemaIndex: 2,
|
|
data: {
|
|
a: "str",
|
|
b: 1,
|
|
c: "C"
|
|
},
|
|
valid: false,
|
|
after: function (err) {
|
|
expect(err[0].code).toBe("INVALID_TYPE");
|
|
expect(err[1].code).toBe("INVALID_TYPE");
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],180:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #130 - Improve escaping of slashes in path",
|
|
tests: [
|
|
{
|
|
description: "should pass",
|
|
schema: {
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"title": "Schema to test names that would otherwise conflict with the path handling",
|
|
"type": "object",
|
|
"properties": {
|
|
"this/that": {
|
|
"type": "object",
|
|
"properties": {
|
|
"t/h/e/ /o/t/h/e/r": {
|
|
"type": "object",
|
|
"properties": {
|
|
"man": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": ["man"]
|
|
}
|
|
},
|
|
"required": ["t/h/e/ /o/t/h/e/r"]
|
|
}
|
|
}
|
|
},
|
|
data: {
|
|
"this/that": {
|
|
"t/h/e/ /o/t/h/e/r": {}
|
|
}
|
|
},
|
|
valid: false,
|
|
after: function (err) {
|
|
err.forEach(function (e) {
|
|
expect(e.path).toBe("#/this~1that/t~1h~1e~1 ~1o~1t~1h~1e~1r");
|
|
});
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],181:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #131 - Top-level errors obscure deeper errors",
|
|
tests: [
|
|
{
|
|
description: "should pass",
|
|
options: {
|
|
breakOnFirstError: false
|
|
},
|
|
schema: {
|
|
"title": "Nested requirements don't work",
|
|
"type": "object",
|
|
"properties": {
|
|
"required": {
|
|
"type": "string"
|
|
},
|
|
"nested": {
|
|
"type": "object",
|
|
"properties": {
|
|
"required": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": ["required"]
|
|
}
|
|
},
|
|
"required" : ["required"]
|
|
},
|
|
data: { "nested": { } },
|
|
valid: false,
|
|
after: function (err) {
|
|
expect(err.length).toBe(2);
|
|
if (err.length === 2) {
|
|
expect(err[0].code).toBe("OBJECT_MISSING_REQUIRED_PROPERTY");
|
|
expect(err[1].code).toBe("OBJECT_MISSING_REQUIRED_PROPERTY");
|
|
}
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],182:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
var schema1 = {
|
|
"definitions": {
|
|
"thing": {
|
|
"$ref": "#/definitions/thing" // <--- circular reference to self
|
|
}
|
|
}
|
|
};
|
|
|
|
var schema2 = {
|
|
"definitions": {
|
|
"person": {
|
|
"type": "object",
|
|
"properties": {
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"spouse": {
|
|
"$ref": "#/definitions/person" // <--- circular reference to ancestor
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
var schema3 = {
|
|
"definitions": {
|
|
"parent": {
|
|
"type": "object",
|
|
"properties": {
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"children": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/child" // <--- indirect circular reference
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"child": {
|
|
"type": "object",
|
|
"properties": {
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"parents": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/parent" // <--- indirect circular reference
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = {
|
|
description: "Issue #137 - circular dependencies between schemas",
|
|
tests: [
|
|
{
|
|
description: "should pass validation #1",
|
|
schema: schema1,
|
|
validateSchemaOnly: true,
|
|
valid: true
|
|
},
|
|
{
|
|
description: "should pass validation #2",
|
|
schema: schema2,
|
|
validateSchemaOnly: true,
|
|
valid: true
|
|
},
|
|
{
|
|
description: "should pass validation #3",
|
|
schema: schema3,
|
|
validateSchemaOnly: true,
|
|
valid: true
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],183:[function(require,module,exports){
|
|
module.exports = {
|
|
description: "Issue #139 - add schema id if present to erro message via addError method",
|
|
tests: [
|
|
{
|
|
description: "should fail",
|
|
options: {
|
|
strictMode: true
|
|
},
|
|
schema: {
|
|
id: "dummy",
|
|
type: "object",
|
|
description: "This is a dummy schema",
|
|
properties: {
|
|
recType: {
|
|
type: "string"
|
|
},
|
|
startDate: {
|
|
type: ["object", "string"],
|
|
format: "date"
|
|
},
|
|
endDate: {
|
|
type: ["object", "string"],
|
|
format: "date"
|
|
},
|
|
noteList: {
|
|
type: "array",
|
|
items: {
|
|
$ref: "note"
|
|
}
|
|
},
|
|
isBlocked: {
|
|
type: "boolean"
|
|
},
|
|
roleA: {
|
|
$ref: "dbRef"
|
|
},
|
|
roleB: {
|
|
$ref: "dbRef"
|
|
},
|
|
recProps: {
|
|
type: "object"
|
|
}
|
|
},
|
|
additionalProperties: false,
|
|
required: ["recType", "roleA", "roleB"]
|
|
},
|
|
valid: false,
|
|
after: function (err) {
|
|
expect(err.length).toBe(3);
|
|
err.forEach(function (e) {
|
|
expect(e.code).toBe("UNRESOLVABLE_REFERENCE");
|
|
expect(e.schemaId).toBe("dummy");
|
|
});
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],184:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #142 - assumeAdditional complains about $ref",
|
|
tests: [
|
|
{
|
|
description: "should pass",
|
|
options: {
|
|
assumeAdditional: ["$ref"]
|
|
},
|
|
schema: "http://json-schema.org/draft-04/schema",
|
|
data: { $ref: "#" },
|
|
valid: true
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],185:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #146 - Only the first failure in an `allOf` block is returned",
|
|
tests: [
|
|
{
|
|
description: "should pass",
|
|
options: {
|
|
breakOnFirstError: false
|
|
},
|
|
schema: {
|
|
properties: {
|
|
password: {
|
|
allOf: [
|
|
{ type: "string", minLength: 8 },
|
|
{ type: "string", pattern: "[A-Z]+" }
|
|
]
|
|
}
|
|
}
|
|
},
|
|
data: { password: "short" },
|
|
valid: false,
|
|
after: function (err) {
|
|
expect(err.length).toBe(2);
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],186:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #151 - minProperties for object type doesn't work",
|
|
tests: [
|
|
{
|
|
description: "should fail",
|
|
schema: {
|
|
"type": "object",
|
|
"properties": {
|
|
"props": {
|
|
"type": "object",
|
|
"minProperties": 1
|
|
}
|
|
}
|
|
},
|
|
data: {
|
|
"props": {}
|
|
},
|
|
valid: false,
|
|
after: function (err) {
|
|
expect(err[0].code).toBe("OBJECT_PROPERTIES_MINIMUM");
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],187:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #16 - schemas should be validated by references in $schema property",
|
|
tests: [
|
|
{
|
|
description: "should pass validation",
|
|
schema: {
|
|
$schema: "http://json-schema.org/draft-04/hyper-schema#",
|
|
links: []
|
|
},
|
|
validateSchemaOnly: true,
|
|
valid: true
|
|
},
|
|
{
|
|
description: "should fail validation",
|
|
schema: {
|
|
$schema: "http://json-schema.org/draft-04/hyper-schema#",
|
|
links: null
|
|
},
|
|
validateSchemaOnly: true,
|
|
valid: false
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],188:[function(require,module,exports){
|
|
"use strict";
|
|
var ref1 = "http://www.example.org/schema1/#";
|
|
var ref2 = "http://www.example.org/schema2/#";
|
|
|
|
var schema1 = {
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"id": ref1,
|
|
"properties": {
|
|
"prop1": {
|
|
"$ref": ref2
|
|
}
|
|
}
|
|
};
|
|
|
|
var schema2 = {
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"id": ref2,
|
|
"properties": {
|
|
"prop1": {
|
|
"$ref": ref1
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = {
|
|
description: "Issue #47 - references to draft4 subschema are not working",
|
|
setup: function (validator) {
|
|
validator.setRemoteReference(ref1, schema1);
|
|
validator.setRemoteReference(ref2, schema2);
|
|
},
|
|
tests: [
|
|
{
|
|
description: "should pass validation #1",
|
|
schema: schema1,
|
|
data: {},
|
|
valid: true
|
|
}
|
|
]
|
|
};
|
|
},{}],189:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
var testAsync = true;
|
|
|
|
module.exports = {
|
|
description: "Issue #209 - async validator returns wrong path",
|
|
async: true,
|
|
options: {
|
|
asyncTimeout: 2000
|
|
},
|
|
setup: function (validator, Class) {
|
|
if (testAsync) {
|
|
// asynchronous validator
|
|
Class.registerFormat("string-length", function (str, callback) {
|
|
setTimeout(function () {
|
|
callback(str.length > 10);
|
|
}, 1);
|
|
});
|
|
} else {
|
|
// same as above but synchronous (comment out the validator above and try with this instead)
|
|
Class.registerFormat("string-length", function (str) {
|
|
return str.length > 10;
|
|
});
|
|
}
|
|
},
|
|
schema: {
|
|
description: "Some schema",
|
|
type: "object",
|
|
properties: {
|
|
userId: {
|
|
type: "string",
|
|
format: "string-length"
|
|
}
|
|
},
|
|
required: ["userId"]
|
|
},
|
|
tests: [
|
|
{
|
|
description: "Wrong path in custom format async validator",
|
|
data: { userId: "1" },
|
|
valid: false,
|
|
after: function (err) {
|
|
expect(err[0].path).toEqual("#/userId");
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],190:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #22 - recursive references",
|
|
tests: [
|
|
{
|
|
description: "should pass validation",
|
|
schema: {
|
|
type: "object",
|
|
additionalProperties: false,
|
|
properties: {
|
|
"is_and": { type: "boolean" },
|
|
"filters": {
|
|
type: "array",
|
|
additionalItems: false,
|
|
items: {
|
|
oneOf: [
|
|
{ $ref: "#" },
|
|
{ $ref: "#/definitions/last" }
|
|
]
|
|
}
|
|
}
|
|
},
|
|
definitions: {
|
|
"last": {
|
|
type: "object",
|
|
additionalProperties: false,
|
|
properties: {
|
|
"text": { type: "string" },
|
|
"is_last": { type: "boolean" },
|
|
"filters": { type: "array", additionalItems: false }
|
|
}
|
|
}
|
|
}
|
|
},
|
|
data: {
|
|
"is_and": false,
|
|
"filters": [
|
|
{
|
|
"is_and": false,
|
|
"filters": [
|
|
{
|
|
"is_and": true,
|
|
"filters": [
|
|
{
|
|
"is_and": true,
|
|
"filters": [
|
|
{
|
|
"is_and": true,
|
|
"filters": [
|
|
{
|
|
"is_and": true,
|
|
"filters": [
|
|
{
|
|
"text": "ABC",
|
|
"is_last": true,
|
|
"filters": []
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
},
|
|
valid: true
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],191:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #222 - Object.keys() does not guarantee order",
|
|
tests: [
|
|
{
|
|
description: "should pass",
|
|
schema: {
|
|
"type":"object",
|
|
"oneOf": [
|
|
{
|
|
"type": "object",
|
|
"properties": {
|
|
"code": {
|
|
"type": "string"
|
|
},
|
|
"libelle": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"enum": [
|
|
{
|
|
"code": "null",
|
|
"libelle": "null"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "object",
|
|
"properties": {
|
|
"code": {
|
|
"type": "string"
|
|
},
|
|
"libelle": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"enum": [
|
|
{
|
|
"code": "0",
|
|
"libelle": "Choice 1"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "object",
|
|
"properties": {
|
|
"code": {
|
|
"type": "string"
|
|
},
|
|
"libelle": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"enum": [
|
|
{
|
|
"code": "1",
|
|
"libelle": "Choice 2"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "object",
|
|
"properties": {
|
|
"code": {
|
|
"type": "string"
|
|
},
|
|
"libelle": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"enum": [
|
|
{
|
|
"code": "2",
|
|
"libelle": "Choice 3"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
},
|
|
data: {
|
|
"code": "2",
|
|
"libelle": "Choice 3"
|
|
},
|
|
valid: true
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],192:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #229 - Paths in errors are incorrect due to Issue #209 fix",
|
|
tests: [
|
|
{
|
|
description: "should fail with correct error path",
|
|
schema: {
|
|
"allOf": [
|
|
{
|
|
"properties": {
|
|
"setup": {
|
|
"description": "Account Research Setup",
|
|
"properties": {
|
|
"excessiveCredit": {
|
|
"properties": {
|
|
"negativeBatch": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"maximum": 999999999.99,
|
|
"title": "Negative Batch $"
|
|
},
|
|
"amountOfCreditsInBatch": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"maximum": 999999999.99,
|
|
"title": "Amount of Credits in a Batch $"
|
|
},
|
|
"numberOfCreditsInBatch": {
|
|
"type": "number",
|
|
"minimum": 1,
|
|
"maximum": 999,
|
|
"title": "Number of Credits in a Batch"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
data: {
|
|
"setup": {
|
|
"excessiveCredit": {
|
|
"amountOfCreditsInBatch": -15000.21,
|
|
"negativeBatch": 25001,
|
|
"numberOfCreditsInBatch": 155
|
|
}
|
|
}
|
|
},
|
|
valid: false,
|
|
after: function (err) {
|
|
expect(err.length).toBe(1);
|
|
expect(err[0].code).toBe('MINIMUM');
|
|
expect(err[0].path).toBe('#/setup/excessiveCredit/amountOfCreditsInBatch');
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],193:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #25 - hostname format behaviour",
|
|
tests: [
|
|
{
|
|
description: "should pass validation",
|
|
schema: {
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"type": "object",
|
|
"properties": {
|
|
"ipAddress": {
|
|
"type": "string",
|
|
"oneOf": [
|
|
{
|
|
"format": "hostname"
|
|
},
|
|
{
|
|
"format": "ipv4"
|
|
},
|
|
{
|
|
"format": "ipv6"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
data: {
|
|
"ipAddress": "127.0.0.1"
|
|
},
|
|
valid: true
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],194:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #250 - Floating point precision is lost",
|
|
tests: [
|
|
{
|
|
description: "should pass the multipleOf",
|
|
schema: {
|
|
"properties": {
|
|
"number": {
|
|
"multipleOf": 0.01
|
|
}
|
|
}
|
|
},
|
|
data: {
|
|
"number": 20.29
|
|
},
|
|
valid: true
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],195:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #26 - noTypeless behaviour",
|
|
options: {
|
|
noTypeless: true
|
|
},
|
|
tests: [
|
|
{
|
|
description: "should pass validation",
|
|
schema: {
|
|
"oneOf": [
|
|
{ $ref: "#/definitions/str" },
|
|
{ $ref: "#/definitions/num" }
|
|
],
|
|
"definitions": {
|
|
"str": {
|
|
"type": "string"
|
|
},
|
|
"num": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
},
|
|
data: "string",
|
|
valid: true
|
|
},
|
|
{
|
|
description: "should fail validation",
|
|
schema: {
|
|
"oneOf": [
|
|
{ $ref: "#/definitions/str" },
|
|
{ $ref: "#/definitions/num" }
|
|
],
|
|
"definitions": {
|
|
"str": {
|
|
"type": "string"
|
|
},
|
|
"num": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
},
|
|
data: true,
|
|
valid: false
|
|
},
|
|
{
|
|
description: "should fail validation because one of the definitions doesn't have a type",
|
|
schema: {
|
|
"oneOf": [
|
|
{ $ref: "#/definitions/str" },
|
|
{ $ref: "#/definitions/num" }
|
|
],
|
|
"definitions": {
|
|
"str": {
|
|
"type": "string"
|
|
},
|
|
"num": {
|
|
|
|
}
|
|
}
|
|
},
|
|
data: "string",
|
|
valid: false,
|
|
after: function (errors) {
|
|
expect(errors[0].code).toBe("KEYWORD_UNDEFINED_STRICT");
|
|
}
|
|
},
|
|
{
|
|
description: "should pass validation because type is defined by parent",
|
|
schema: {
|
|
type: "object",
|
|
properties: {
|
|
"prop1": { type: "string" },
|
|
"prop2": { type: "string" }
|
|
},
|
|
anyOf: [
|
|
{ required: ["prop1"] },
|
|
{ required: ["prop2"] }
|
|
]
|
|
},
|
|
data: {
|
|
prop1: "str"
|
|
},
|
|
valid: true
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],196:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #37 - pass schema as an uri to load from cache",
|
|
tests: [
|
|
{
|
|
description: "should pass validation",
|
|
schema: "http://json-schema.org/draft-04/schema",
|
|
data: {
|
|
type: "string"
|
|
},
|
|
valid: true
|
|
},
|
|
{
|
|
description: "should pass validation",
|
|
schema: "http://json-schema.org/draft-04/schema",
|
|
data: {
|
|
type: 1
|
|
},
|
|
valid: false
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],197:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #40 - validator ends up in infinite loop",
|
|
tests: [
|
|
{
|
|
description: "should pass validation",
|
|
schema: {
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"title": "Product set",
|
|
"is_start": "boolean",
|
|
"hierarchy": {
|
|
"$ref": "#/definitions/recursion"
|
|
},
|
|
"definitions": {
|
|
"recursion": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"is_and": {
|
|
"type": "boolean"
|
|
},
|
|
"filters": {
|
|
"type": "array",
|
|
"additionalItems": false,
|
|
"items": {
|
|
"$ref": "#/definitions/recursion"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
data: {
|
|
"is_start": true,
|
|
"hierarchy": {
|
|
"is_and": false,
|
|
"filters": [
|
|
{
|
|
"is_and": false,
|
|
"filters": [
|
|
{
|
|
"is_and": true,
|
|
"filters": [
|
|
{
|
|
"is_and": true,
|
|
"filters": [
|
|
{
|
|
"is_and": true,
|
|
"filters": [
|
|
{
|
|
"is_and": true,
|
|
"filters": [
|
|
{
|
|
"is_and": true,
|
|
"filters": []
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
},
|
|
valid: true
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],198:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #41 - invalid schema",
|
|
tests: [
|
|
{
|
|
description: "should fail schema validation",
|
|
schema: {
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"id": "http://jsonschema.net#",
|
|
"type": "array",
|
|
"required": false,
|
|
"items": {
|
|
"id": "http://jsonschema.net/5#",
|
|
"type": "object",
|
|
"required": false,
|
|
"properties": {
|
|
"identifiers": {
|
|
"id": "http://jsonschema.net/5/identifiers#",
|
|
"type": "array",
|
|
"required": false,
|
|
"items": {
|
|
"id": "http://jsonschema.net/5/identifiers/0#",
|
|
"type": "object",
|
|
"required": false,
|
|
"properties": {
|
|
"identifier": {
|
|
"id": "http://jsonschema.net/5/identifiers/0/identifier#",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"vital": {
|
|
"id": "http://jsonschema.net/5/vital#",
|
|
"type": "object",
|
|
"required": false,
|
|
"properties": {
|
|
"name": {
|
|
"id": "http://jsonschema.net/5/vital/name#",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
"code": {
|
|
"id": "http://jsonschema.net/5/vital/code#",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
"code_system_name": {
|
|
"id": "http://jsonschema.net/5/vital/code_system_name#",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
}
|
|
},
|
|
"status": {
|
|
"id": "http://jsonschema.net/5/status#",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
"date": {
|
|
"id": "http://jsonschema.net/5/date#",
|
|
"type": "array",
|
|
"required": false,
|
|
"items": {
|
|
"id": "http://jsonschema.net/5/date/0#",
|
|
"type": "object",
|
|
"required": false,
|
|
"properties": {
|
|
"date": {
|
|
"id": "http://jsonschema.net/5/date/0/date#",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
"precision": {
|
|
"id": "http://jsonschema.net/5/date/0/precision#",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"interpretations": {
|
|
"id": "http://jsonschema.net/5/interpretations#",
|
|
"type": "array",
|
|
"required": false,
|
|
"items": {
|
|
"id": "http://jsonschema.net/5/interpretations/0#",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
},
|
|
"value": {
|
|
"id": "http://jsonschema.net/5/value#",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
"unit": {
|
|
"id": "http://jsonschema.net/5/unit#",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
}
|
|
}
|
|
},
|
|
validateSchemaOnly: true,
|
|
valid: false
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],199:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #43 - maximum call stack size exceeded error",
|
|
tests: [
|
|
{
|
|
description: "should compile both schemas",
|
|
schema: [
|
|
{
|
|
"id": "schemaA",
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"description": "Data type fields (section 4.3.3)",
|
|
"type": "object",
|
|
"oneOf": [
|
|
{
|
|
"required": ["type"]
|
|
},
|
|
{
|
|
"required": ["$ref"]
|
|
}
|
|
],
|
|
"properties": {
|
|
"type": {
|
|
"type": "string"
|
|
},
|
|
"$ref": {
|
|
"type": "string"
|
|
},
|
|
"format": {
|
|
"type": "string"
|
|
},
|
|
"defaultValue": {
|
|
"not": {
|
|
"type": ["array", "object", "null"]
|
|
}
|
|
},
|
|
"enum": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"uniqueItems": true,
|
|
"minItems": 1
|
|
},
|
|
"minimum": {
|
|
"type": "string"
|
|
},
|
|
"maximum": {
|
|
"type": "string"
|
|
},
|
|
"items": {
|
|
"$ref": "#/definitions/itemsObject"
|
|
},
|
|
"uniqueItems": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"dependencies": {
|
|
"format": {
|
|
"oneOf": [
|
|
{
|
|
"properties": {
|
|
"type": {
|
|
"enum": ["integer"]
|
|
},
|
|
"format": {
|
|
"enum": ["int32", "int64"]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"properties": {
|
|
"type": {
|
|
"enum": ["number"]
|
|
},
|
|
"format": {
|
|
"enum": ["float", "double"]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"properties": {
|
|
"type": {
|
|
"enum": ["string"]
|
|
},
|
|
"format": {
|
|
"enum": ["byte", "date", "date-time"]
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"definitions": {
|
|
"itemsObject": {
|
|
"oneOf": [
|
|
{
|
|
"type": "object",
|
|
"required": ["$ref"],
|
|
"properties": {
|
|
"$ref": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
{
|
|
"allOf": [
|
|
{
|
|
"$ref": "#"
|
|
},
|
|
{
|
|
"required": ["type"],
|
|
"properties": {
|
|
"type": {},
|
|
"format": {}
|
|
},
|
|
"additionalProperties": false
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "schemaB",
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"type": "object",
|
|
"required": ["id", "properties"],
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"properties": {
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"$ref": "#/definitions/propertyObject"
|
|
}
|
|
},
|
|
"subTypes": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"uniqueItems": true
|
|
},
|
|
"discriminator": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"dependencies": {
|
|
"subTypes": ["discriminator"]
|
|
},
|
|
"definitions": {
|
|
"propertyObject": {
|
|
"allOf": [
|
|
{
|
|
"not": {
|
|
"$ref": "#"
|
|
}
|
|
},
|
|
{
|
|
"$ref": "schemaA"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
],
|
|
validateSchemaOnly: true,
|
|
valid: true
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],200:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #44 - unresolvable reference due to hash sign",
|
|
tests: [
|
|
{
|
|
description: "should pass validation #1",
|
|
schema: [
|
|
{
|
|
id: "schemaA",
|
|
type: "string"
|
|
},
|
|
{
|
|
id: "schemaB",
|
|
properties: {
|
|
a: {
|
|
"$ref": "schemaA"
|
|
}
|
|
}
|
|
}
|
|
],
|
|
validateSchemaOnly: true,
|
|
valid: true
|
|
},
|
|
{
|
|
description: "should pass validation #2",
|
|
schema: [
|
|
{
|
|
id: "schemaA",
|
|
type: "string"
|
|
},
|
|
{
|
|
id: "schemaB",
|
|
properties: {
|
|
a: {
|
|
"$ref": "schemaA#"
|
|
}
|
|
}
|
|
}
|
|
],
|
|
validateSchemaOnly: true,
|
|
valid: true
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],201:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
var resourceObject = {
|
|
"id": "resourceObject.json",
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"type": "object",
|
|
"required": ["path"],
|
|
"properties": {
|
|
"path": {
|
|
"type": "string",
|
|
"format": "uri"
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
};
|
|
var infoObject = {
|
|
"id": "infoObject.json",
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"description": "info object (section 5.1.3)",
|
|
"type": "object",
|
|
"required": ["title", "description"],
|
|
"properties": {
|
|
"title": {
|
|
"type": "string"
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"termsOfServiceUrl": {
|
|
"type": "string",
|
|
"format": "uri"
|
|
},
|
|
"contact": {
|
|
"type": "string",
|
|
"format": "email"
|
|
},
|
|
"license": {
|
|
"type": "string"
|
|
},
|
|
"licenseUrl": {
|
|
"type": "string",
|
|
"format": "uri"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
};
|
|
var oauth2GrantType = {
|
|
"id": "oauth2GrantType.json",
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"type": "object",
|
|
"minProperties": 1,
|
|
"properties": {
|
|
"implicit": {
|
|
"$ref": "#/definitions/implicit"
|
|
},
|
|
"authorization_code": {
|
|
"$ref": "#/definitions/authorizationCode"
|
|
}
|
|
},
|
|
"definitions": {
|
|
"implicit": {
|
|
"type": "object",
|
|
"required": ["loginEndpoint"],
|
|
"properties": {
|
|
"loginEndpoint": {
|
|
"$ref": "#/definitions/loginEndpoint"
|
|
},
|
|
"tokenName": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"authorizationCode": {
|
|
"type": "object",
|
|
"required": ["tokenEndpoint", "tokenRequestEndpoint"],
|
|
"properties": {
|
|
"tokenEndpoint": {
|
|
"$ref": "#/definitions/tokenEndpoint"
|
|
},
|
|
"tokenRequestEndpoint": {
|
|
"$ref": "#/definitions/tokenRequestEndpoint"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"loginEndpoint": {
|
|
"type": "object",
|
|
"required": ["url"],
|
|
"properties": {
|
|
"url": {
|
|
"type": "string",
|
|
"format": "uri"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"tokenEndpoint": {
|
|
"type": "object",
|
|
"required": ["url"],
|
|
"properties": {
|
|
"url": {
|
|
"type": "string",
|
|
"format": "uri"
|
|
},
|
|
"tokenName": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"tokenRequestEndpoint": {
|
|
"type": "object",
|
|
"required": ["url"],
|
|
"properties": {
|
|
"url": {
|
|
"type": "string",
|
|
"format": "uri"
|
|
},
|
|
"clientIdName": {
|
|
"type": "string"
|
|
},
|
|
"clientSecretName": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
}
|
|
}
|
|
};
|
|
var authorizationObject = {
|
|
"id": "authorizationObject.json",
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"oneOf": [
|
|
{
|
|
"$ref": "#/definitions/basicAuth"
|
|
},
|
|
{
|
|
"$ref": "#/definitions/apiKey"
|
|
},
|
|
{
|
|
"$ref": "#/definitions/oauth2"
|
|
}
|
|
]
|
|
},
|
|
"definitions": {
|
|
"basicAuth": {
|
|
"required": ["type"],
|
|
"properties": {
|
|
"type": {
|
|
"enum": ["basicAuth"]
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"apiKey": {
|
|
"required": ["type", "passAs", "keyname"],
|
|
"properties": {
|
|
"type": {
|
|
"enum": ["apiKey"]
|
|
},
|
|
"passAs": {
|
|
"enum": ["header", "query"]
|
|
},
|
|
"keyname": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"oauth2": {
|
|
"type": "object",
|
|
"required": ["type", "grantTypes"],
|
|
"properties": {
|
|
"type": {
|
|
"enum": ["oauth2"]
|
|
},
|
|
"scopes": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/oauth2Scope"
|
|
}
|
|
},
|
|
"grantTypes": {
|
|
"$ref": "oauth2GrantType.json"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"oauth2Scope": {
|
|
"type": "object",
|
|
"required": ["scope"],
|
|
"properties": {
|
|
"scope": {
|
|
"type": "string"
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
}
|
|
}
|
|
};
|
|
var resourceListing = {
|
|
"id": "resourceListing.json",
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"type": "object",
|
|
"required": ["swaggerVersion", "apis"],
|
|
"properties": {
|
|
"swaggerVersion": {
|
|
"enum": ["1.2"]
|
|
},
|
|
"apis": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "resourceObject.json"
|
|
}
|
|
},
|
|
"apiVersion": {
|
|
"type": "string"
|
|
},
|
|
"info": {
|
|
"$ref": "infoObject.json"
|
|
},
|
|
"authorizations": {
|
|
"$ref": "authorizationObject.json"
|
|
}
|
|
}
|
|
};
|
|
|
|
var schemaCombinations = {
|
|
"authorizationObject.json": [
|
|
oauth2GrantType,
|
|
authorizationObject
|
|
],
|
|
"infoObject.json": [
|
|
infoObject
|
|
],
|
|
"oauth2GrantType.json": [
|
|
oauth2GrantType
|
|
],
|
|
"resourceObject.json": [
|
|
resourceObject
|
|
],
|
|
"resourceListing.json": [
|
|
resourceObject,
|
|
infoObject,
|
|
oauth2GrantType,
|
|
authorizationObject,
|
|
resourceListing
|
|
]
|
|
};
|
|
|
|
module.exports = {
|
|
description: "Issue #45 - recompiling schemas results in 'Reference could not be resolved'",
|
|
tests: [
|
|
{
|
|
description: "should pass schema validation #1",
|
|
schema: schemaCombinations["authorizationObject.json"],
|
|
validateSchemaOnly: true,
|
|
valid: true
|
|
},
|
|
{
|
|
description: "should pass schema validation #2",
|
|
schema: schemaCombinations["infoObject.json"],
|
|
validateSchemaOnly: true,
|
|
valid: true
|
|
},
|
|
{
|
|
description: "should pass schema validation #3",
|
|
schema: schemaCombinations["oauth2GrantType.json"],
|
|
validateSchemaOnly: true,
|
|
valid: true
|
|
},
|
|
{
|
|
description: "should pass schema validation #4",
|
|
schema: schemaCombinations["resourceObject.json"],
|
|
validateSchemaOnly: true,
|
|
valid: true
|
|
},
|
|
{
|
|
description: "should pass schema validation #5",
|
|
schema: schemaCombinations["resourceListing.json"],
|
|
validateSchemaOnly: true,
|
|
valid: true
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],202:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
var draft4 = require("./files/Issue47/draft4.json");
|
|
var modifiedSchema = require("./files/Issue47/swagger_draft_modified.json");
|
|
var realSchema = require("./files/Issue47/swagger_draft.json");
|
|
var json = require("./files/Issue47/sample.json");
|
|
|
|
module.exports = {
|
|
description: "Issue #47 - references to draft4 subschema are not working",
|
|
setup: function (validator) {
|
|
validator.setRemoteReference("http://json-schema.orgx/draft-04/schema", draft4);
|
|
},
|
|
tests: [
|
|
{
|
|
description: "should pass validation #1",
|
|
schema: modifiedSchema,
|
|
data: json,
|
|
valid: true
|
|
},
|
|
{
|
|
description: "should pass validation #1",
|
|
schema: realSchema,
|
|
data: json,
|
|
valid: true
|
|
}
|
|
]
|
|
};
|
|
|
|
},{"./files/Issue47/draft4.json":226,"./files/Issue47/sample.json":227,"./files/Issue47/swagger_draft.json":228,"./files/Issue47/swagger_draft_modified.json":229}],203:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #48 - email validation too strict",
|
|
schema: {
|
|
type: "string",
|
|
format: "email"
|
|
},
|
|
tests: [
|
|
{
|
|
description: "should pass validation #1",
|
|
data: "zaggino@gmail.com",
|
|
valid: true
|
|
},
|
|
{
|
|
description: "should pass validation #2",
|
|
data: "foo@bar.baz",
|
|
valid: true
|
|
},
|
|
{
|
|
description: "should fail validation #1",
|
|
data: "foobar.baz",
|
|
valid: false
|
|
},
|
|
{
|
|
description: "should fail validation #2",
|
|
data: "foo@bar",
|
|
valid: false
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],204:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #49 - pattern validations",
|
|
tests: [
|
|
{
|
|
description: "should pass validation",
|
|
schema: {
|
|
type: "string",
|
|
pattern: "^[0-9]{1}[0-9]{3}(\\s)?[A-Za-z]{2}$"
|
|
},
|
|
data: "0000 aa",
|
|
valid: true
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],205:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #53 - Include description (if any) in errors",
|
|
tests: [
|
|
{
|
|
description: "should fail validation and return error description",
|
|
schema: {
|
|
type: "string",
|
|
pattern: "^[0-9]{1}[0-9]{3}(\\s)?[A-Za-z]{2}$",
|
|
description: "Four numbers followed by an optional space and then two letters."
|
|
},
|
|
data: "000 a",
|
|
valid: false,
|
|
after: function (err) {
|
|
expect(err[0].description).toBe("Four numbers followed by an optional space and then two letters.");
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],206:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #56 - unresolvable reference due to hash sign",
|
|
tests: [
|
|
{
|
|
description: "should pass validation #1",
|
|
schema: [
|
|
{
|
|
id: "schemaA#",
|
|
type: "string"
|
|
},
|
|
{
|
|
id: "schemaB#",
|
|
properties: {
|
|
a: {
|
|
"$ref": "schemaA#"
|
|
}
|
|
}
|
|
}
|
|
],
|
|
validateSchemaOnly: true,
|
|
valid: true
|
|
},
|
|
{
|
|
description: "should pass validation #2",
|
|
schema: [
|
|
{
|
|
id: "http://virtual/schemaA#",
|
|
type: "string"
|
|
},
|
|
{
|
|
id: "http://virtual/schemaB#",
|
|
properties: {
|
|
a: {
|
|
"$ref": "schemaA#"
|
|
}
|
|
}
|
|
}
|
|
],
|
|
validateSchemaOnly: true,
|
|
valid: true
|
|
},
|
|
{
|
|
description: "should pass validation #3",
|
|
schema: [
|
|
{
|
|
id: "http://virtual/schemaA#",
|
|
type: "string",
|
|
"definitions": {
|
|
"stringDefinition": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
id: "http://virtual/schemaB#",
|
|
properties: {
|
|
a: {
|
|
"$ref": "schemaA#/definitions/stringDefinition"
|
|
}
|
|
}
|
|
}
|
|
],
|
|
validateSchemaOnly: true,
|
|
valid: true
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],207:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
var dataTypeBaseJson = {
|
|
"id": "http://wordnik.github.io/schemas/v1.2/dataTypeBase.json#",
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"description": "Data type fields (section 4.3.3)",
|
|
"type": "object",
|
|
"oneOf": [
|
|
{
|
|
"required": [
|
|
"type"
|
|
]
|
|
},
|
|
{
|
|
"required": [
|
|
"$ref"
|
|
]
|
|
}
|
|
],
|
|
"properties": {
|
|
"type": {
|
|
"type": "string"
|
|
},
|
|
"$ref": {
|
|
"type": "string"
|
|
},
|
|
"format": {
|
|
"type": "string"
|
|
},
|
|
"defaultValue": {
|
|
"not": {
|
|
"type": [
|
|
"array",
|
|
"object",
|
|
"null"
|
|
]
|
|
}
|
|
},
|
|
"enum": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"uniqueItems": true,
|
|
"minItems": 1
|
|
},
|
|
"minimum": {
|
|
"type": "string"
|
|
},
|
|
"maximum": {
|
|
"type": "string"
|
|
},
|
|
"items": {
|
|
"$ref": "#/definitions/itemsObject"
|
|
},
|
|
"uniqueItems": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"dependencies": {
|
|
"format": {
|
|
"oneOf": [
|
|
{
|
|
"properties": {
|
|
"type": {
|
|
"enum": [
|
|
"integer"
|
|
]
|
|
},
|
|
"format": {
|
|
"enum": [
|
|
"int32",
|
|
"int64"
|
|
]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"properties": {
|
|
"type": {
|
|
"enum": [
|
|
"number"
|
|
]
|
|
},
|
|
"format": {
|
|
"enum": [
|
|
"float",
|
|
"double"
|
|
]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"properties": {
|
|
"type": {
|
|
"enum": [
|
|
"string"
|
|
]
|
|
},
|
|
"format": {
|
|
"enum": [
|
|
"byte",
|
|
"date",
|
|
"date-time"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"definitions": {
|
|
"itemsObject": {
|
|
"oneOf": [
|
|
{
|
|
"type": "object",
|
|
"required": [
|
|
"$ref"
|
|
],
|
|
"properties": {
|
|
"$ref": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
{
|
|
"allOf": [
|
|
{
|
|
"$ref": "#"
|
|
},
|
|
{
|
|
"required": [
|
|
"type"
|
|
],
|
|
"properties": {
|
|
"type": {},
|
|
"format": {}
|
|
},
|
|
"additionalProperties": false
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
}
|
|
};
|
|
var modelsObjectJson = {
|
|
"id": "http://wordnik.github.io/schemas/v1.2/modelsObject.json#",
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"type": "object",
|
|
"required": [
|
|
"id",
|
|
"properties"
|
|
],
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"properties": {
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"$ref": "#/definitions/propertyObject"
|
|
}
|
|
},
|
|
"subTypes": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"uniqueItems": true
|
|
},
|
|
"discriminator": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"dependencies": {
|
|
"subTypes": [
|
|
"discriminator"
|
|
]
|
|
},
|
|
"definitions": {
|
|
"propertyObject": {
|
|
"allOf": [
|
|
{
|
|
"not": {
|
|
"$ref": "#"
|
|
}
|
|
},
|
|
{
|
|
"$ref": "dataTypeBase.json#"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
};
|
|
var oauth2GrantTypeJson = {
|
|
"id": "http://wordnik.github.io/schemas/v1.2/oauth2GrantType.json#",
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"type": "object",
|
|
"minProperties": 1,
|
|
"properties": {
|
|
"implicit": {
|
|
"$ref": "#/definitions/implicit"
|
|
},
|
|
"authorization_code": {
|
|
"$ref": "#/definitions/authorizationCode"
|
|
}
|
|
},
|
|
"definitions": {
|
|
"implicit": {
|
|
"type": "object",
|
|
"required": [
|
|
"loginEndpoint"
|
|
],
|
|
"properties": {
|
|
"loginEndpoint": {
|
|
"$ref": "#/definitions/loginEndpoint"
|
|
},
|
|
"tokenName": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"authorizationCode": {
|
|
"type": "object",
|
|
"required": [
|
|
"tokenEndpoint",
|
|
"tokenRequestEndpoint"
|
|
],
|
|
"properties": {
|
|
"tokenEndpoint": {
|
|
"$ref": "#/definitions/tokenEndpoint"
|
|
},
|
|
"tokenRequestEndpoint": {
|
|
"$ref": "#/definitions/tokenRequestEndpoint"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"loginEndpoint": {
|
|
"type": "object",
|
|
"required": [
|
|
"url"
|
|
],
|
|
"properties": {
|
|
"url": {
|
|
"type": "string",
|
|
"format": "uri"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"tokenEndpoint": {
|
|
"type": "object",
|
|
"required": [
|
|
"url"
|
|
],
|
|
"properties": {
|
|
"url": {
|
|
"type": "string",
|
|
"format": "uri"
|
|
},
|
|
"tokenName": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"tokenRequestEndpoint": {
|
|
"type": "object",
|
|
"required": [
|
|
"url"
|
|
],
|
|
"properties": {
|
|
"url": {
|
|
"type": "string",
|
|
"format": "uri"
|
|
},
|
|
"clientIdName": {
|
|
"type": "string"
|
|
},
|
|
"clientSecretName": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
}
|
|
}
|
|
};
|
|
var authorizationObjectJson = {
|
|
"id": "http://wordnik.github.io/schemas/v1.2/authorizationObject.json#",
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"oneOf": [
|
|
{
|
|
"$ref": "#/definitions/basicAuth"
|
|
},
|
|
{
|
|
"$ref": "#/definitions/apiKey"
|
|
},
|
|
{
|
|
"$ref": "#/definitions/oauth2"
|
|
}
|
|
]
|
|
},
|
|
"definitions": {
|
|
"basicAuth": {
|
|
"required": [
|
|
"type"
|
|
],
|
|
"properties": {
|
|
"type": {
|
|
"enum": [
|
|
"basicAuth"
|
|
]
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"apiKey": {
|
|
"required": [
|
|
"type",
|
|
"passAs",
|
|
"keyname"
|
|
],
|
|
"properties": {
|
|
"type": {
|
|
"enum": [
|
|
"apiKey"
|
|
]
|
|
},
|
|
"passAs": {
|
|
"enum": [
|
|
"header",
|
|
"query"
|
|
]
|
|
},
|
|
"keyname": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"oauth2": {
|
|
"type": "object",
|
|
"required": [
|
|
"type",
|
|
"grantTypes"
|
|
],
|
|
"properties": {
|
|
"type": {
|
|
"enum": [
|
|
"oauth2"
|
|
]
|
|
},
|
|
"scopes": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/oauth2Scope"
|
|
}
|
|
},
|
|
"grantTypes": {
|
|
"$ref": "oauth2GrantType.json#"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"oauth2Scope": {
|
|
"type": "object",
|
|
"required": [
|
|
"scope"
|
|
],
|
|
"properties": {
|
|
"scope": {
|
|
"type": "string"
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
}
|
|
}
|
|
};
|
|
var parameterObjectJson = {
|
|
"id": "http://wordnik.github.io/schemas/v1.2/parameterObject.json#",
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"type": "object",
|
|
"allOf": [
|
|
{
|
|
"$ref": "dataTypeBase.json#"
|
|
},
|
|
{
|
|
"required": [
|
|
"paramType",
|
|
"name"
|
|
],
|
|
"properties": {
|
|
"paramType": {
|
|
"enum": [
|
|
"path",
|
|
"query",
|
|
"body",
|
|
"header",
|
|
"form"
|
|
]
|
|
},
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"required": {
|
|
"type": "boolean"
|
|
},
|
|
"allowMultiple": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"description": "type File requires special paramType and consumes",
|
|
"oneOf": [
|
|
{
|
|
"properties": {
|
|
"type": {
|
|
"not": {
|
|
"enum": [
|
|
"File"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"properties": {
|
|
"type": {
|
|
"enum": [
|
|
"File"
|
|
]
|
|
},
|
|
"paramType": {
|
|
"enum": [
|
|
"form"
|
|
]
|
|
},
|
|
"consumes": {
|
|
"enum": [
|
|
"multipart/form-data"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
]
|
|
};
|
|
var operationObjectJson = {
|
|
"id": "http://wordnik.github.io/schemas/v1.2/operationObject.json#",
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"type": "object",
|
|
"allOf": [
|
|
{
|
|
"$ref": "dataTypeBase.json#"
|
|
},
|
|
{
|
|
"required": [
|
|
"method",
|
|
"nickname",
|
|
"parameters"
|
|
],
|
|
"properties": {
|
|
"method": {
|
|
"enum": [
|
|
"GET",
|
|
"POST",
|
|
"PUT",
|
|
"PATCH",
|
|
"DELETE",
|
|
"OPTIONS"
|
|
]
|
|
},
|
|
"summary": {
|
|
"type": "string",
|
|
"maxLength": 120
|
|
},
|
|
"notes": {
|
|
"type": "string"
|
|
},
|
|
"nickname": {
|
|
"type": "string",
|
|
"pattern": "^[a-zA-Z0-9_]+$"
|
|
},
|
|
"authorizations": {
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "authorizationObject.json#/definitions/oauth2Scope"
|
|
}
|
|
}
|
|
},
|
|
"parameters": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "parameterObject.json#"
|
|
}
|
|
},
|
|
"responseMessages": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/responseMessageObject"
|
|
}
|
|
},
|
|
"produces": {
|
|
"$ref": "#/definitions/mimeTypeArray"
|
|
},
|
|
"consumes": {
|
|
"$ref": "#/definitions/mimeTypeArray"
|
|
},
|
|
"deprecated": {
|
|
"enum": [
|
|
"true",
|
|
"false"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
],
|
|
"definitions": {
|
|
"responseMessageObject": {
|
|
"type": "object",
|
|
"required": [
|
|
"code",
|
|
"message"
|
|
],
|
|
"properties": {
|
|
"code": {
|
|
"$ref": "#/definitions/rfc2616section10"
|
|
},
|
|
"message": {
|
|
"type": "string"
|
|
},
|
|
"responseModel": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"rfc2616section10": {
|
|
"type": "integer",
|
|
"minimum": 100,
|
|
"maximum": 600,
|
|
"exclusiveMaximum": true
|
|
},
|
|
"mimeTypeArray": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"format": "mime-type"
|
|
}
|
|
}
|
|
}
|
|
};
|
|
var apiDeclarationJson = {
|
|
"id": "http://wordnik.github.io/schemas/v1.2/apiDeclaration.json#",
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"type": "object",
|
|
"required": [
|
|
"swaggerVersion",
|
|
"basePath",
|
|
"apis"
|
|
],
|
|
"properties": {
|
|
"swaggerVersion": {
|
|
"enum": [
|
|
"1.2"
|
|
]
|
|
},
|
|
"apiVersion": {
|
|
"type": "string"
|
|
},
|
|
"basePath": {
|
|
"type": "string",
|
|
"format": "uri",
|
|
"pattern": "^https?://"
|
|
},
|
|
"resourcePath": {
|
|
"type": "string",
|
|
"format": "uri",
|
|
"pattern": "^/"
|
|
},
|
|
"apis": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/apiObject"
|
|
}
|
|
},
|
|
"models": {
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"$ref": "modelsObject.json#"
|
|
}
|
|
},
|
|
"produces": {
|
|
"$ref": "#/definitions/mimeTypeArray"
|
|
},
|
|
"consumes": {
|
|
"$ref": "#/definitions/mimeTypeArray"
|
|
},
|
|
"authorizations": {
|
|
"$ref": "authorizationObject.json#"
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"definitions": {
|
|
"apiObject": {
|
|
"type": "object",
|
|
"required": [
|
|
"path",
|
|
"operations"
|
|
],
|
|
"properties": {
|
|
"path": {
|
|
"type": "string",
|
|
"format": "uri-template",
|
|
"pattern": "^/"
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"operations": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "operationObject.json#"
|
|
}
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"mimeTypeArray": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"format": "mime-type"
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = {
|
|
description: "Issue #57 - maximum call stack exceeded error",
|
|
setup: function (validator, Class) {
|
|
Class.registerFormat("mime-type", function () {
|
|
return true;
|
|
});
|
|
Class.registerFormat("uri-template", function () {
|
|
return true;
|
|
});
|
|
},
|
|
tests: [
|
|
{
|
|
description: "should pass validation #1",
|
|
schema: [
|
|
dataTypeBaseJson,
|
|
modelsObjectJson,
|
|
oauth2GrantTypeJson,
|
|
authorizationObjectJson,
|
|
parameterObjectJson,
|
|
operationObjectJson,
|
|
apiDeclarationJson
|
|
],
|
|
validateSchemaOnly: true,
|
|
valid: true
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],208:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #58 - getMissingReferences should return all missing references",
|
|
tests: [
|
|
{
|
|
description: "should fail validation",
|
|
schema: {
|
|
"id": "root.json",
|
|
"person": {
|
|
"id": "personDetails",
|
|
"type": "object",
|
|
"properties": {
|
|
"firstName": {
|
|
"type": "string"
|
|
},
|
|
"lastName": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": ["firstName", "lastName"]
|
|
},
|
|
"addr": {
|
|
"id": "addressDetails",
|
|
"type": "object",
|
|
"properties": {
|
|
"street": {
|
|
"type": "string"
|
|
},
|
|
"city": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": ["street", "city"]
|
|
},
|
|
"peraddr": {
|
|
"id": "personWithAddress",
|
|
"allOf": [{
|
|
"$ref": "#personDetails"
|
|
}, {
|
|
"$ref": "#addressDetails"
|
|
}, {
|
|
"$ref": "#/yy"
|
|
}, {
|
|
"$ref": "#xx"
|
|
}]
|
|
}
|
|
},
|
|
validateSchemaOnly: true,
|
|
valid: false,
|
|
after: function (err, valid, data, validator) {
|
|
var missingReferences = validator.getMissingReferences();
|
|
expect(missingReferences.length).toBe(2);
|
|
expect(missingReferences.indexOf("#xx")).not.toBe(-1);
|
|
expect(missingReferences.indexOf("#/yy")).not.toBe(-1);
|
|
var missingRemoteReferences = validator.getMissingRemoteReferences();
|
|
expect(missingRemoteReferences.length).toBe(0);
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],209:[function(require,module,exports){
|
|
/*jshint -W101*/
|
|
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #63 - unresolvable reference due to hash sign in id",
|
|
tests: [
|
|
{
|
|
description: "should pass validation #1",
|
|
schema: {
|
|
"properties": {
|
|
"statementpost": {
|
|
"id": "#statementpost",
|
|
"type": [
|
|
"object"
|
|
]
|
|
},
|
|
"statement": {
|
|
"id": "#statement",
|
|
"type": "object",
|
|
}
|
|
}
|
|
},
|
|
validateSchemaOnly: true,
|
|
valid: true
|
|
},
|
|
{
|
|
description: "should pass validation #2",
|
|
schema: {
|
|
"properties": {
|
|
"uuid": {
|
|
"id": "#uuid",
|
|
"type": "string",
|
|
"pattern": "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{8}"
|
|
},
|
|
"mbox": {
|
|
"id": "#mbox",
|
|
"type": "object",
|
|
"properties": {
|
|
"mbox": {
|
|
"required": true,
|
|
"type": "string",
|
|
"format": "uri",
|
|
"pattern": "^mailto:"
|
|
}
|
|
},
|
|
"patternProperties": {
|
|
"^(mbox_sha1sum|account|openid)$": {
|
|
"type": "null"
|
|
}
|
|
}
|
|
},
|
|
"mbox_sha1sum": {
|
|
"id": "#mbox_sha1sum",
|
|
"type": "object",
|
|
"properties": {
|
|
"mbox_sha1sum": {
|
|
"required": true,
|
|
"type": "string"
|
|
}
|
|
},
|
|
"patternProperties": {
|
|
"^(mbox|account|openid)$": {
|
|
"type": "null"
|
|
}
|
|
}
|
|
},
|
|
"account": {
|
|
"id": "#account",
|
|
"type": "object",
|
|
"properties": {
|
|
"account": {
|
|
"required": true,
|
|
"type": "object",
|
|
"properties": {
|
|
"homePage": {
|
|
"type": "string",
|
|
"format": "uri",
|
|
"required": true
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"required": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
}
|
|
},
|
|
"patternProperties": {
|
|
"^(mbox_sha1sum|mbox|openid)$": {
|
|
"type": "null"
|
|
}
|
|
}
|
|
},
|
|
"openid": {
|
|
"id": "#openid",
|
|
"type": "object",
|
|
"properties": {
|
|
"openid": {
|
|
"required": true,
|
|
"type": "string",
|
|
"format": "uri"
|
|
}
|
|
},
|
|
"patternProperties": {
|
|
"^(mbox_sha1sum|account|mbox)$": {
|
|
"type": "null"
|
|
}
|
|
}
|
|
},
|
|
"inversefunctional": {
|
|
"id": "#inversefunctional",
|
|
"type": [
|
|
{
|
|
"$ref": "#mbox"
|
|
},
|
|
{
|
|
"$ref": "#mbox_sha1sum"
|
|
},
|
|
{
|
|
"$ref": "#account"
|
|
},
|
|
{
|
|
"$ref": "#openid"
|
|
}
|
|
]
|
|
},
|
|
"agent": {
|
|
"id": "#agent",
|
|
"type": [
|
|
{
|
|
"$ref": "#inversefunctional"
|
|
}
|
|
],
|
|
"properties": {
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"objectType": {
|
|
"enum": ["Agent"]
|
|
},
|
|
"mbox": {},
|
|
"mbox_sha1sum": {},
|
|
"account": {},
|
|
"openid": {}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"groupBasics": {
|
|
"id": "#groupBasics",
|
|
"type": "object",
|
|
"properties": {
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"objectType": {
|
|
"enum": ["Group"],
|
|
"required": true
|
|
},
|
|
"member": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#agent"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"anonymousgroup": {
|
|
"id": "#anonymousgroup",
|
|
"properties": {
|
|
"member": {
|
|
"required": true
|
|
},
|
|
"name": {},
|
|
"objectType": {}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"identifiedgroup": {
|
|
"id": "#identifiedgroup",
|
|
"extends": {
|
|
"$ref": "#inversefunctional"
|
|
},
|
|
"properties": {
|
|
"name": {},
|
|
"objectType": {},
|
|
"member": {},
|
|
"mbox": {},
|
|
"mbox_sha1sum": {},
|
|
"account": {},
|
|
"openid": {}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"group": {
|
|
"id": "#group",
|
|
"extends": {
|
|
"$ref": "#groupBasics"
|
|
},
|
|
"type": [
|
|
{
|
|
"$ref": "#anonymousgroup"
|
|
},
|
|
{
|
|
"$ref": "#identifiedgroup"
|
|
}
|
|
]
|
|
},
|
|
"languagemap": {
|
|
"id": "#languagemap",
|
|
"type": "object",
|
|
"patternProperties": {
|
|
"^(([a-zA-Z]{2,8}((-[a-zA-Z]{3}){0,3})(-[a-zA-Z]{4})?((-[a-zA-Z]{2})|(-\\d{3}))?(-[a-zA-Z\\d]{4,8})*(-[a-zA-Z\\d](-[a-zA-Z\\d]{1,8})+)*)|x(-[a-zA-Z\\d]{1,8})+|en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tsu|i-tay|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE)$": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"extensions": {
|
|
"id": "#extensions",
|
|
"patternProperties": {
|
|
"^[a-zA-Z][a-zA-Z+.-]*:": {
|
|
"type": "any"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"activity": {
|
|
"id": "#activity",
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string",
|
|
"format": "uri",
|
|
"required": true
|
|
},
|
|
"objectType": {
|
|
"enum": ["Activity"]
|
|
},
|
|
"definition": {
|
|
"type": "object",
|
|
"properties": {
|
|
"name": {
|
|
"$ref": "#languagemap"
|
|
},
|
|
"description": {
|
|
"$ref": "#languagemap"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"format": "uri"
|
|
},
|
|
"interactionType": {
|
|
"enum": [
|
|
"true-false",
|
|
"choice",
|
|
"fill-in",
|
|
"long-fill-in",
|
|
"matching",
|
|
"performance",
|
|
"sequencing",
|
|
"likert",
|
|
"numeric",
|
|
"other"
|
|
]
|
|
},
|
|
"correctResponsesPattern": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"extensions": {
|
|
"$ref": "#extensions"
|
|
}
|
|
},
|
|
"patternProperties": {
|
|
"^(choices|scale|source|target|steps)$": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string",
|
|
"required": true
|
|
},
|
|
"description": {
|
|
"$ref": "#languagemap"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"objectagent": {
|
|
"id": "#objectagent",
|
|
"type": [
|
|
{
|
|
"$ref": "#agent"
|
|
}
|
|
],
|
|
"properties": {
|
|
"objectType": {
|
|
"required": true
|
|
}
|
|
}
|
|
},
|
|
"statementref": {
|
|
"id": "#statementref",
|
|
"type": "object",
|
|
"properties": {
|
|
"objectType": {
|
|
"enum": ["StatementRef"],
|
|
"required": true
|
|
},
|
|
"id": {
|
|
"type": [
|
|
{
|
|
"$ref": "#uuid"
|
|
}
|
|
],
|
|
"required": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"substatement": {
|
|
"id": "#substatement",
|
|
"type": [
|
|
{
|
|
"$ref": "#statement"
|
|
}
|
|
],
|
|
"properties": {
|
|
"objectType": {
|
|
"enum": ["SubStatement"],
|
|
"required": true
|
|
},
|
|
"object": {
|
|
"disallow": [
|
|
{
|
|
"properties": {
|
|
"objectType": {
|
|
"enum": ["SubStatement"]
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"patternProperties": {
|
|
"^(id|stored|authority|voided)$": {
|
|
"type": "null"
|
|
}
|
|
}
|
|
},
|
|
"statement": {
|
|
"id": "#statement",
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"$ref": "#uuid"
|
|
},
|
|
"actor": {
|
|
"type": [
|
|
{
|
|
"$ref": "#agent"
|
|
},
|
|
{
|
|
"$ref": "#group"
|
|
}
|
|
],
|
|
"required": true
|
|
},
|
|
"verb": {
|
|
"required": true,
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"required": true,
|
|
"type": "string",
|
|
"format": "uri"
|
|
},
|
|
"display": {
|
|
"$ref": "#languagemap"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"object": {
|
|
"type": [
|
|
{
|
|
"$ref": "#activity"
|
|
},
|
|
{
|
|
"$ref": "#objectagent"
|
|
},
|
|
{
|
|
"$ref": "#group"
|
|
},
|
|
{
|
|
"$ref": "#statementref"
|
|
},
|
|
{
|
|
"$ref": "#substatement"
|
|
}
|
|
],
|
|
"required": true
|
|
},
|
|
"objectType": {},
|
|
"result": {
|
|
"type": "object",
|
|
"properties": {
|
|
"score": {
|
|
"type": "object",
|
|
"properties": {
|
|
"scaled": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"maximum": 1
|
|
},
|
|
"raw": {
|
|
"type": "number"
|
|
},
|
|
"min": {
|
|
"type": "number"
|
|
},
|
|
"max": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
},
|
|
"success": {
|
|
"type": "boolean"
|
|
},
|
|
"completion": {
|
|
"type": "boolean"
|
|
},
|
|
"response": {
|
|
"type": "string"
|
|
},
|
|
"duration": {
|
|
"type": "string"
|
|
},
|
|
"extensions": {
|
|
"$ref": "#extensions"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"context": {
|
|
"type": "object",
|
|
"properties": {
|
|
"registration": {
|
|
"$ref": "#uuid"
|
|
},
|
|
"instructor": {
|
|
"type": [
|
|
{
|
|
"$ref": "#agent"
|
|
},
|
|
{
|
|
"$ref": "#group"
|
|
}
|
|
]
|
|
},
|
|
"team": {
|
|
"type": [
|
|
{
|
|
"$ref": "#agent"
|
|
},
|
|
{
|
|
"$ref": "#group"
|
|
}
|
|
]
|
|
},
|
|
"contextActivities": {
|
|
"type": "object",
|
|
"properties": {
|
|
"parent": {
|
|
"$ref": "#activity"
|
|
},
|
|
"grouping": {
|
|
"$ref": "#activity"
|
|
},
|
|
"other": {
|
|
"$ref": "#activity"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"revision": {
|
|
"type": "string"
|
|
},
|
|
"platform": {
|
|
"type": "string"
|
|
},
|
|
"language": {
|
|
"type": "string"
|
|
},
|
|
"statement": {
|
|
"$ref": "#statementref"
|
|
},
|
|
"extensions": {
|
|
"$ref": "#extensions"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"timestamp": {
|
|
"type": "string"
|
|
},
|
|
"stored": {
|
|
"type": "string"
|
|
},
|
|
"authority": {
|
|
"type": [
|
|
{
|
|
"$ref": "#agent"
|
|
},
|
|
{
|
|
"type": [
|
|
{
|
|
"$ref": "#anonymousgroup"
|
|
}
|
|
],
|
|
"properties": {
|
|
"member": {
|
|
"type": "array",
|
|
"minItems": 2,
|
|
"maxItems": 2
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"voided": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
}
|
|
}
|
|
},
|
|
data: {
|
|
"id": "fd41c918-b88b-4b20-a0a5-a4c32391aaa0",
|
|
"actor": {
|
|
"objectType": "Blowup",
|
|
"name": "Project Tin Can API",
|
|
"mbox": "mailto:user@example.com"
|
|
},
|
|
"verb": {
|
|
"id": "http://adlnet.gov/expapi/verbs/created",
|
|
"display": {
|
|
"en-US": "created"
|
|
}
|
|
},
|
|
"object": {
|
|
"id": "http://example.adlnet.gov/xapi/example/simplestatement",
|
|
"definition": {
|
|
"name": {
|
|
"en-US": "simple statement"
|
|
},
|
|
"description": {
|
|
"en-US": "A simple Experience API statement. Note that the LRS does not need to have any prior information about the Actor (learner), the verb, or the Activity/object."
|
|
}
|
|
}
|
|
}
|
|
},
|
|
valid: false
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],210:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #64 - fix inconsistent error paths for missing reference errors",
|
|
tests: [
|
|
{
|
|
description: "should fail validation and report correct error path",
|
|
schema: {
|
|
type: "object",
|
|
properties: {
|
|
name: {
|
|
type: "string"
|
|
},
|
|
friends: {
|
|
type: "array",
|
|
items: {
|
|
$ref: "Person.json"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
valid: false,
|
|
validateSchemaOnly: true,
|
|
after: function (err) {
|
|
expect(err[0].path).toEqual("#/properties/friends/items");
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],211:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #67 - references problem",
|
|
tests: [
|
|
{
|
|
description: "should pass validation #1",
|
|
setup: function (validator, Class) {
|
|
Class.registerFormat("not-blank", function () {
|
|
return true;
|
|
});
|
|
},
|
|
schema: [
|
|
{
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"id": "NaturalNumber",
|
|
"type": "integer",
|
|
"minimum": 1
|
|
},
|
|
{
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"id": "WholeNumber",
|
|
"type": "integer"
|
|
},
|
|
{
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"id": "NotEmptyString",
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
{
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"id": "NotBlankString",
|
|
"allOf": [
|
|
{
|
|
"$ref": "NotEmptyString"
|
|
},
|
|
{
|
|
"type": "string",
|
|
"format": "not-blank"
|
|
}
|
|
]
|
|
}
|
|
],
|
|
validateSchemaOnly: true,
|
|
valid: true
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],212:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #71 - additionalProperties problem",
|
|
tests: [
|
|
{
|
|
description: "should have one error #1",
|
|
|
|
schema: {
|
|
type: "object",
|
|
minProperties: 1,
|
|
additionalProperties: false,
|
|
properties: {
|
|
foo: {
|
|
type: "object",
|
|
minProperties: 1
|
|
}
|
|
}
|
|
},
|
|
|
|
data: { foo: {}, bar: 1 },
|
|
|
|
valid: false,
|
|
|
|
after: function (errors) {
|
|
expect(errors.length).toBe(1);
|
|
}
|
|
},
|
|
|
|
{
|
|
description: "should have one error #2",
|
|
|
|
schema: {
|
|
type: "object",
|
|
minProperties: 1,
|
|
additionalProperties: false,
|
|
properties: {
|
|
foo: {
|
|
type: "object",
|
|
minProperties: 1,
|
|
additionalProperties: false,
|
|
properties: {
|
|
foo: {}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
data: { foo: {}, bar: 1 },
|
|
|
|
valid: false,
|
|
|
|
after: function (errors) {
|
|
expect(errors.length).toBe(1);
|
|
}
|
|
},
|
|
|
|
{
|
|
description: "should have more than one error with breakOnFirstError false #1",
|
|
|
|
options: {
|
|
breakOnFirstError: false
|
|
},
|
|
|
|
schema: {
|
|
type: "object",
|
|
minProperties: 1,
|
|
additionalProperties: false,
|
|
properties: {
|
|
foo: {
|
|
type: "object",
|
|
minProperties: 1
|
|
}
|
|
}
|
|
},
|
|
|
|
data: { foo: {}, bar: 1 },
|
|
|
|
valid: false,
|
|
|
|
after: function (errors) {
|
|
expect(errors.length).toBeGreaterThan(1);
|
|
}
|
|
},
|
|
|
|
{
|
|
description: "should have more than one error with breakOnFirstError false #2",
|
|
|
|
options: {
|
|
breakOnFirstError: false
|
|
},
|
|
|
|
schema: {
|
|
type: "object",
|
|
minProperties: 1,
|
|
additionalProperties: false,
|
|
properties: {
|
|
foo: {
|
|
type: "object",
|
|
minProperties: 1,
|
|
additionalProperties: false,
|
|
properties: {
|
|
foo: {}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
data: { foo: {}, bar: 1 },
|
|
|
|
valid: false,
|
|
|
|
after: function (errors) {
|
|
expect(errors.length).toBeGreaterThan(1);
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],213:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #73 - getLastError method should return an instance of native Error",
|
|
tests: [
|
|
{
|
|
description: "should pass the basic test",
|
|
schema: {
|
|
id: "schemaA",
|
|
type: "object",
|
|
properties: {
|
|
a: {
|
|
type: "integer"
|
|
},
|
|
b: {
|
|
type: "string"
|
|
},
|
|
c: {
|
|
$ref: "schemaB"
|
|
}
|
|
},
|
|
required: ["a"]
|
|
},
|
|
validateSchemaOnly: true,
|
|
valid: false,
|
|
after: function (err, valid, data, validator) {
|
|
var e = validator.getLastError();
|
|
expect(e instanceof Error).toBe(true);
|
|
expect(e.message).toBe("SCHEMA_COMPILATION_FAILED");
|
|
}
|
|
},
|
|
{
|
|
description: "should pass the basic test",
|
|
data: { "b": true },
|
|
schema: {
|
|
id: "schemaA",
|
|
type: "object",
|
|
properties: {
|
|
a: {
|
|
type: "integer"
|
|
},
|
|
b: {
|
|
type: "string"
|
|
}
|
|
},
|
|
required: ["a"]
|
|
},
|
|
valid: false,
|
|
after: function (err, valid, data, validator) {
|
|
var e = validator.getLastError();
|
|
expect(e instanceof Error).toBe(true);
|
|
expect(e.message).toBe("JSON_OBJECT_VALIDATION_FAILED");
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],214:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #76 - circular dependencies between schemas",
|
|
tests: [
|
|
{
|
|
description: "should pass validation",
|
|
schema: [
|
|
{
|
|
id: "id",
|
|
type: "number"
|
|
},
|
|
{
|
|
id: "user",
|
|
type: "object",
|
|
properties: {
|
|
id: {
|
|
$ref: "id"
|
|
},
|
|
posts: {
|
|
type: "array",
|
|
items: {
|
|
$ref: "post"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
id: "post",
|
|
type: "object",
|
|
properties: {
|
|
id: {
|
|
$ref: "id"
|
|
},
|
|
author: {
|
|
$ref: "user"
|
|
}
|
|
}
|
|
}
|
|
],
|
|
schemaIndex: 2,
|
|
data: {
|
|
id: 11,
|
|
author: {
|
|
id: 1,
|
|
posts: [
|
|
{
|
|
id: 11,
|
|
author: {
|
|
id: 1
|
|
}
|
|
},
|
|
{
|
|
id: 12,
|
|
author: {
|
|
id: 1
|
|
}
|
|
},
|
|
{
|
|
id: 13,
|
|
author: {
|
|
id: 1
|
|
}
|
|
}
|
|
]
|
|
}
|
|
},
|
|
valid: true
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],215:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
var innerSchema = {
|
|
type: "integer"
|
|
};
|
|
|
|
var originalSchema = {
|
|
type: "object",
|
|
properties: {
|
|
inner: innerSchema
|
|
}
|
|
};
|
|
|
|
var getKeys = function (obj) {
|
|
var arr = [];
|
|
for (var key in obj) {
|
|
if (obj.hasOwnProperty(key)) {
|
|
arr.push(key);
|
|
}
|
|
}
|
|
return arr;
|
|
};
|
|
|
|
var originalSchemaKeys = getKeys(originalSchema);
|
|
var innerSchemaKeys = getKeys(innerSchema);
|
|
|
|
module.exports = {
|
|
description: "Issue #85 - zschema shouldn't have side effects on the schema object",
|
|
tests: [
|
|
{
|
|
description: "should pass validation",
|
|
schema: originalSchema,
|
|
data: {
|
|
inner: 5
|
|
},
|
|
valid: true,
|
|
after: function () {
|
|
expect(getKeys(originalSchema).length).toBe(originalSchemaKeys.length);
|
|
expect(getKeys(innerSchemaKeys).length).toBe(innerSchemaKeys.length);
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],216:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
var schema1 = {
|
|
"id": "long-string",
|
|
"type": "string",
|
|
"maxLength": 4096
|
|
};
|
|
var schema2 = {
|
|
"id": "person-object",
|
|
"type": "object",
|
|
"properties": {
|
|
"name": {
|
|
"$ref": "long-string"
|
|
}
|
|
}
|
|
};
|
|
var expectedResult = {
|
|
"id": "person-object",
|
|
"type": "object",
|
|
"properties": {
|
|
"name": {
|
|
"id": "long-string",
|
|
"type": "string",
|
|
"maxLength": 4096
|
|
}
|
|
}
|
|
};
|
|
module.exports = {
|
|
description: "Issue #94 - get a resolved schema for documentation purposes",
|
|
tests: [
|
|
{
|
|
description: "should pass validation",
|
|
schema: [schema1, schema2],
|
|
validateSchemaOnly: true,
|
|
valid: true,
|
|
after: function (err, valid, data, validator) {
|
|
var newSch = validator.getResolvedSchema("person-object");
|
|
expect(JSON.stringify(newSch)).toBe(JSON.stringify(expectedResult));
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],217:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #96 - email format validation false negatives",
|
|
schema: {
|
|
type: "string",
|
|
format: "email"
|
|
},
|
|
tests: [
|
|
{
|
|
description: "should pass validation #1",
|
|
data: "my_email@gmail.com",
|
|
valid: true
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],218:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "Issue #98 - oneOf",
|
|
tests: [
|
|
{
|
|
description: "should return only one error for each branch",
|
|
schema: {
|
|
"type": "object",
|
|
"oneOf": [
|
|
{
|
|
"type": "object",
|
|
"required": ["a", "b"]
|
|
},
|
|
{
|
|
"type": "object",
|
|
"required": ["c", "d"]
|
|
}
|
|
]
|
|
},
|
|
data: {},
|
|
valid: false,
|
|
after: function (err, valid, data, validator) {
|
|
expect(err.length).toBe(1);
|
|
expect(err[0].code).toBe("ONE_OF_MISSING");
|
|
expect(err[0].inner.length).toBe(2);
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],219:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "compile a schema array and validate against one of the schemas - README sample",
|
|
tests: [
|
|
{
|
|
description: "should validate object successfully",
|
|
schema: [
|
|
{
|
|
id: "personDetails",
|
|
type: "object",
|
|
properties: {
|
|
firstName: {
|
|
type: "string"
|
|
},
|
|
lastName: {
|
|
type: "string"
|
|
}
|
|
},
|
|
required: ["firstName", "lastName"]
|
|
},
|
|
{
|
|
id: "addressDetails",
|
|
type: "object",
|
|
properties: {
|
|
street: {
|
|
type: "string"
|
|
},
|
|
city: {
|
|
type: "string"
|
|
}
|
|
},
|
|
required: ["street", "city"]
|
|
},
|
|
{
|
|
id: "personWithAddress",
|
|
allOf: [
|
|
{
|
|
$ref: "personDetails"
|
|
},
|
|
{
|
|
$ref: "addressDetails"
|
|
}
|
|
]
|
|
}
|
|
],
|
|
schemaIndex: 2,
|
|
data: {
|
|
firstName: "Martin",
|
|
lastName: "Zagora",
|
|
street: "George St",
|
|
city: "Sydney"
|
|
},
|
|
valid: true
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],220:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "noEmptyArrays - Don't allow empty arrays to validate as arrays",
|
|
options: {
|
|
noEmptyArrays: true
|
|
},
|
|
schema: {
|
|
"type": "array"
|
|
},
|
|
tests: [
|
|
{
|
|
description: "should pass validation when having one item array",
|
|
data: ["item"],
|
|
valid: true
|
|
},
|
|
{
|
|
description: "should fail validation when having empty array",
|
|
data: [],
|
|
valid: false
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],221:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "noEmptyStrings - Don't allow empty strings to validate as strings",
|
|
options: {
|
|
noEmptyStrings: true
|
|
},
|
|
schema: {
|
|
"type": "string"
|
|
},
|
|
tests: [
|
|
{
|
|
description: "should pass validation when using a proper string",
|
|
data: "hello",
|
|
valid: true
|
|
},
|
|
{
|
|
description: "should fail validation when using an empty string",
|
|
data: "",
|
|
valid: false
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],222:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "noExtraKeywords - Forbid unrecognized keywords to be defined in schemas",
|
|
options: {
|
|
noExtraKeywords: true
|
|
},
|
|
validateSchemaOnly: true,
|
|
tests: [
|
|
{
|
|
schema: {},
|
|
description: "should pass schema validation",
|
|
valid: true
|
|
},
|
|
{
|
|
schema: {
|
|
"random_keyword": "string"
|
|
},
|
|
description: "should fail schema validation, because 'random_keyword' is not known keyword",
|
|
valid: false
|
|
},
|
|
{
|
|
schema: {
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"random_keyword": "string"
|
|
},
|
|
description: "should pass schema validation, because schema is validated by $schema, even though it has 'random_keyword'",
|
|
valid: true
|
|
},
|
|
{
|
|
schema: {
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"title": 1
|
|
},
|
|
description: "should fail schema validation, because schema is validated by $schema and number is not valid for title",
|
|
valid: false,
|
|
after: function (err, valid) {
|
|
expect(valid).toBe(false);
|
|
expect(err[0].code).toBe("PARENT_SCHEMA_VALIDATION_FAILED");
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],223:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "noTypeless - Don't allow schemas without type specified",
|
|
validateSchemaOnly: true,
|
|
options: {
|
|
noTypeless: true
|
|
},
|
|
tests: [
|
|
{
|
|
description: "should pass validation when using a type in schema",
|
|
schema: {
|
|
"type": "string"
|
|
},
|
|
valid: true
|
|
},
|
|
{
|
|
description: "should fail validation when not using a type in schema",
|
|
schema: {},
|
|
valid: false
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],224:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "pedanticCheck - check if schema follow best practices and common sense",
|
|
options: {
|
|
pedanticCheck: true,
|
|
breakOnFirstError: false
|
|
},
|
|
validateSchemaOnly: true,
|
|
tests: [
|
|
{
|
|
schema: {
|
|
"type": "string",
|
|
"default": true
|
|
},
|
|
description: "should fail schema validation because default has incorrect value",
|
|
valid: false
|
|
},
|
|
{
|
|
schema: {
|
|
"type": "string",
|
|
"enum": ["OK", false]
|
|
},
|
|
description: "should fail schema validation because enum has incorrect value",
|
|
valid: false
|
|
},
|
|
{
|
|
schema: {
|
|
"type": "string",
|
|
"enum": ["OK", false],
|
|
"default": true
|
|
},
|
|
description: "should fail schema validation because both enum and default has incorrect values",
|
|
valid: false
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],225:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
module.exports = {
|
|
description: "strictUris - validates URIs as absolute and disallow URI references",
|
|
options: {
|
|
strictUris: true
|
|
},
|
|
tests: [
|
|
{
|
|
schema: {
|
|
"type": "string",
|
|
"format": "uri"
|
|
},
|
|
data: "http://json-schema.org/draft-04/schema",
|
|
description: "should pass validation because it is an absolute URI",
|
|
valid: true
|
|
},
|
|
{
|
|
schema: {
|
|
"type": "string",
|
|
"format": "uri"
|
|
},
|
|
data: "schemaA",
|
|
description: "should fail validation because it is only a valid URI reference",
|
|
valid: false
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],226:[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
|
|
}
|
|
]
|
|
},
|
|
"allOf": { "$ref": "#/definitions/schemaArray" },
|
|
"anyOf": { "$ref": "#/definitions/schemaArray" },
|
|
"oneOf": { "$ref": "#/definitions/schemaArray" },
|
|
"not": { "$ref": "#" }
|
|
},
|
|
"dependencies": {
|
|
"exclusiveMaximum": [ "maximum" ],
|
|
"exclusiveMinimum": [ "minimum" ]
|
|
},
|
|
"default": {}
|
|
}
|
|
|
|
},{}],227:[function(require,module,exports){
|
|
module.exports={
|
|
"swagger": 2,
|
|
"info": {
|
|
"version": "1.0.0",
|
|
"title": "Swagger Petstore",
|
|
"contact": {
|
|
"name": "wordnik api team",
|
|
"url": "http://developer.wordnik.com"
|
|
},
|
|
"license": {
|
|
"name": "Creative Commons 4.0 International",
|
|
"url": "http://creativecommons.org/licenses/by/4.0/"
|
|
}
|
|
},
|
|
"host": "http://petstore.swagger.wordnik.com",
|
|
"basePath": "/api",
|
|
"schemes": [
|
|
"http"
|
|
],
|
|
"paths": {
|
|
"/pets": {
|
|
"get": {
|
|
"tags": [
|
|
"Pet Operations"
|
|
],
|
|
"summary": "finds pets in the system",
|
|
"responses": {
|
|
"200": {
|
|
"description": "pet response",
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/models/Pet"
|
|
}
|
|
},
|
|
"headers": [
|
|
{
|
|
"x-expires": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"default": {
|
|
"description": "unexpected error",
|
|
"schema": {
|
|
"$ref": "#/models/Error"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"schemas": {
|
|
"Pet": {
|
|
"required": [
|
|
"id",
|
|
"name"
|
|
],
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
},
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"tag": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"Error": {
|
|
"required": [
|
|
"code",
|
|
"message"
|
|
],
|
|
"properties": {
|
|
"code": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"message": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
},{}],228:[function(require,module,exports){
|
|
module.exports={
|
|
"title": "A JSON Schema for Swagger 2.0 API.",
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
|
|
"type": "object",
|
|
"required": [ "swagger", "info", "paths" ],
|
|
|
|
"definitions": {
|
|
"info": {
|
|
"type": "object",
|
|
"description": "General information about the API.",
|
|
"required": [ "version", "title" ],
|
|
"additionalProperties": false,
|
|
"patternProperties": {
|
|
"^x-": {
|
|
"$ref": "#/definitions/vendorExtension"
|
|
}
|
|
},
|
|
"properties": {
|
|
"version": {
|
|
"type": "string",
|
|
"description": "A semantic version number of the API."
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"description": "A unique and precise title of the API."
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"description": "A longer description of the API. Should be different from the title."
|
|
},
|
|
"termsOfService": {
|
|
"type": "string",
|
|
"description": "The terms of service for the API."
|
|
},
|
|
"contact": {
|
|
"type": "object",
|
|
"description": "Contact information for the owners of the API.",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"description": "The identifying name of the contact person/organization."
|
|
},
|
|
"url": {
|
|
"type": "string",
|
|
"description": "The URL pointing to the contact information.",
|
|
"format": "uri"
|
|
},
|
|
"email": {
|
|
"type": "string",
|
|
"description": "The email address of the contact person/organization.",
|
|
"format": "email"
|
|
}
|
|
}
|
|
},
|
|
"license": {
|
|
"type": "object",
|
|
"required": [ "name" ],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"description": "The name of the license type. It's encouraged to use an OSI compatible license."
|
|
},
|
|
"url": {
|
|
"type": "string",
|
|
"description": "The URL pointing to the license.",
|
|
"format": "uri"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"example": {
|
|
"type": "object",
|
|
"patternProperties": {
|
|
"^[a-z0-9-]+/[a-z0-9-+]+$": {}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"mimeType": {
|
|
"type": "string",
|
|
"pattern": "^[a-z0-9-]+/[a-z0-9-+]+$",
|
|
"description": "The MIME type of the HTTP message."
|
|
},
|
|
"operation": {
|
|
"type": "object",
|
|
"required": [ "responses" ],
|
|
"additionalProperties": false,
|
|
"patternProperties": {
|
|
"^x-": {
|
|
"$ref": "#/definitions/vendorExtension"
|
|
}
|
|
},
|
|
"properties": {
|
|
"tags": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"summary": {
|
|
"type": "string",
|
|
"description": "A brief summary of the operation."
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"description": "A longer description of the operation."
|
|
},
|
|
"operationId": {
|
|
"type": "string",
|
|
"description": "A friendly name of the operation"
|
|
},
|
|
"produces": {
|
|
"type": "array",
|
|
"description": "A list of MIME types the API can produce.",
|
|
"additionalItems": false,
|
|
"items": {
|
|
"$ref": "#/definitions/mimeType"
|
|
}
|
|
},
|
|
"parameters": {
|
|
"type": "array",
|
|
"description": "The parameters needed to send a valid API call.",
|
|
"minItems": 1,
|
|
"additionalItems": false,
|
|
"items": {
|
|
"$ref": "#/definitions/parameter"
|
|
}
|
|
},
|
|
"responses": {
|
|
"$ref": "#/definitions/responses"
|
|
},
|
|
"schemes": {
|
|
"type": "array",
|
|
"description": "The transfer protocol of the API.",
|
|
"items": {
|
|
"type": "string",
|
|
"enum": [ "http", "https", "ws", "wss" ]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"type": "object",
|
|
"description": "Response objects names can either be any valid HTTP status code or 'default'.",
|
|
"minProperties": 1,
|
|
"additionalProperties": false,
|
|
"patternProperties": {
|
|
"^([0-9]+)$|^(default)$": {
|
|
"$ref": "#/definitions/response"
|
|
},
|
|
"^x-": {
|
|
"$ref": "#/definitions/vendorExtension"
|
|
}
|
|
}
|
|
},
|
|
"response": {
|
|
"type": "object",
|
|
"required": [ "description" ],
|
|
"properties": {
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"schema": {
|
|
"$ref": "#/definitions/schema"
|
|
},
|
|
"headers": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/schema"
|
|
}
|
|
},
|
|
"examples": {
|
|
"$ref": "#/definitions/example"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"vendorExtension": {
|
|
"description": "Any property starting with x- is valid.",
|
|
"additionalProperties": true,
|
|
"additionalItems": true
|
|
},
|
|
"parameter": {
|
|
"type": "object",
|
|
"required": [ "name", "in"],
|
|
"patternProperties": {
|
|
"^x-": {
|
|
"$ref": "#/definitions/vendorExtension"
|
|
}
|
|
},
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"description": "The name of the parameter."
|
|
},
|
|
"in": {
|
|
"type": "string",
|
|
"description": "Determines the location of the parameter.",
|
|
"enum": [ "query", "header", "path", "formData", "body" ],
|
|
"default": "query"
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"description": "A brief description of the parameter. This could contain examples of use."
|
|
},
|
|
"required": {
|
|
"type": "boolean",
|
|
"description": "Determines whether or not this parameter is required or optional."
|
|
},
|
|
"schema": {
|
|
"$ref": "#/definitions/schema"
|
|
}
|
|
}
|
|
},
|
|
"schema": {
|
|
"type": "object",
|
|
"description": "A deterministic version of a JSON Schema object.",
|
|
"patternProperties": {
|
|
"^x-": {
|
|
"$ref": "#/definitions/vendorExtension"
|
|
}
|
|
},
|
|
"properties": {
|
|
"$ref": { "type": "string" },
|
|
"format": { "type": "string" },
|
|
"title": { "$ref": "http://json-schema.org/draft-04/schema#/properties/title" },
|
|
"description": { "$ref": "http://json-schema.org/draft-04/schema#/properties/description" },
|
|
"default": { "$ref": "http://json-schema.org/draft-04/schema#/properties/default" },
|
|
"multipleOf": { "$ref": "http://json-schema.org/draft-04/schema#/properties/multipleOf" },
|
|
"maximum": { "$ref": "http://json-schema.org/draft-04/schema#/properties/maximum" },
|
|
"exclusiveMaximum": { "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMaximum" },
|
|
"minimum": { "$ref": "http://json-schema.org/draft-04/schema#/properties/minimum" },
|
|
"exclusiveMinimum": { "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMinimum" },
|
|
"maxLength": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" },
|
|
"minLength": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" },
|
|
"pattern": { "$ref": "http://json-schema.org/draft-04/schema#/properties/pattern" },
|
|
"discriminator": { "type": "string" },
|
|
"xml": { "$ref": "#/definitions/xml"},
|
|
"items": {
|
|
"anyOf": [
|
|
{ "$ref": "#/definitions/schema" },
|
|
{
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"items": { "$ref": "#/definitions/schema" }
|
|
}
|
|
],
|
|
"default": { }
|
|
},
|
|
"maxItems": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" },
|
|
"minItems": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" },
|
|
"uniqueItems": { "$ref": "http://json-schema.org/draft-04/schema#/properties/uniqueItems" },
|
|
"maxProperties": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" },
|
|
"minProperties": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" },
|
|
"required": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray" },
|
|
"definitions": {
|
|
"type": "object",
|
|
"additionalProperties": { "$ref": "#/definitions/schema" },
|
|
"default": { }
|
|
},
|
|
"properties": {
|
|
"type": "object",
|
|
"additionalProperties": { "$ref": "#/definitions/schema" },
|
|
"default": { }
|
|
},
|
|
"enum": { "$ref": "http://json-schema.org/draft-04/schema#/properties/enum" },
|
|
"type": { "$ref": "http://json-schema.org/draft-04/schema#/properties/type" },
|
|
"allOf": {
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"items": { "$ref": "#/definitions/schema" }
|
|
}
|
|
}
|
|
},
|
|
"xml": {
|
|
"properties": {
|
|
"namespace": { "type": "string" },
|
|
"prefix": { "type": "string" },
|
|
"attribute": { "type": "boolean" },
|
|
"wrapped": { "type": "boolean" }
|
|
},
|
|
"additionalProperties": false
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"patternProperties": {
|
|
"^x-": {
|
|
"$ref": "#/definitions/vendorExtension"
|
|
}
|
|
},
|
|
"properties": {
|
|
"swagger": {
|
|
"type": "number",
|
|
"enum": [ 2.0 ],
|
|
"description": "The Swagger version of this document."
|
|
},
|
|
"info": {
|
|
"$ref": "#/definitions/info"
|
|
},
|
|
"host": {
|
|
"type": "string",
|
|
"format": "uri",
|
|
"description": "The fully qualified URI to the host of the API."
|
|
},
|
|
"basePath": {
|
|
"type": "string",
|
|
"pattern": "^/",
|
|
"description": "The base path to the API. Example: '/api'."
|
|
},
|
|
"schemes": {
|
|
"type": "array",
|
|
"description": "The transfer protocol of the API.",
|
|
"items": {
|
|
"type": "string",
|
|
"enum": [ "http", "https", "ws", "wss" ]
|
|
}
|
|
},
|
|
"consumes": {
|
|
"type": "array",
|
|
"description": "A list of MIME types accepted by the API.",
|
|
"items": {
|
|
"$ref": "#/definitions/mimeType"
|
|
}
|
|
},
|
|
"produces": {
|
|
"type": "array",
|
|
"description": "A list of MIME types the API can produce.",
|
|
"items": {
|
|
"$ref": "#/definitions/mimeType"
|
|
}
|
|
},
|
|
"paths": {
|
|
"type": "object",
|
|
"description": "Relative paths to the individual endpoints. They should be relative to the 'basePath'.",
|
|
|
|
"patternProperties": {
|
|
"^x-": {
|
|
"$ref": "#/definitions/vendorExtension"
|
|
}
|
|
},
|
|
|
|
"additionalProperties": {
|
|
"type": "object",
|
|
"minProperties": 1,
|
|
"additionalProperties": false,
|
|
"patternProperties": {
|
|
"^x-": {
|
|
"$ref": "#/definitions/vendorExtension"
|
|
}
|
|
},
|
|
"properties": {
|
|
"get": {
|
|
"$ref": "#/definitions/operation"
|
|
},
|
|
"put": {
|
|
"$ref": "#/definitions/operation"
|
|
},
|
|
"post": {
|
|
"$ref": "#/definitions/operation"
|
|
},
|
|
"delete": {
|
|
"$ref": "#/definitions/operation"
|
|
},
|
|
"options": {
|
|
"$ref": "#/definitions/operation"
|
|
},
|
|
"head": {
|
|
"$ref": "#/definitions/operation"
|
|
},
|
|
"patch": {
|
|
"$ref": "#/definitions/operation"
|
|
},
|
|
"parameters": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/parameter"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"schemas": {
|
|
"type": "object",
|
|
"description": "One or more JSON objects describing the schemas being consumed and produced by the API.",
|
|
"additionalProperties": {
|
|
"$ref": "#/definitions/schema"
|
|
}
|
|
},
|
|
"security": {
|
|
"type": "array"
|
|
}
|
|
}
|
|
}
|
|
|
|
},{}],229:[function(require,module,exports){
|
|
module.exports={
|
|
"title": "A JSON Schema for Swagger 2.0 API.",
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
|
|
"type": "object",
|
|
"required": [ "swagger", "info", "paths" ],
|
|
|
|
"definitions": {
|
|
"info": {
|
|
"type": "object",
|
|
"description": "General information about the API.",
|
|
"required": [ "version", "title" ],
|
|
"additionalProperties": false,
|
|
"patternProperties": {
|
|
"^x-": {
|
|
"$ref": "#/definitions/vendorExtension"
|
|
}
|
|
},
|
|
"properties": {
|
|
"version": {
|
|
"type": "string",
|
|
"description": "A semantic version number of the API."
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"description": "A unique and precise title of the API."
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"description": "A longer description of the API. Should be different from the title."
|
|
},
|
|
"termsOfService": {
|
|
"type": "string",
|
|
"description": "The terms of service for the API."
|
|
},
|
|
"contact": {
|
|
"type": "object",
|
|
"description": "Contact information for the owners of the API.",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"description": "The identifying name of the contact person/organization."
|
|
},
|
|
"url": {
|
|
"type": "string",
|
|
"description": "The URL pointing to the contact information.",
|
|
"format": "uri"
|
|
},
|
|
"email": {
|
|
"type": "string",
|
|
"description": "The email address of the contact person/organization.",
|
|
"format": "email"
|
|
}
|
|
}
|
|
},
|
|
"license": {
|
|
"type": "object",
|
|
"required": [ "name" ],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"description": "The name of the license type. It's encouraged to use an OSI compatible license."
|
|
},
|
|
"url": {
|
|
"type": "string",
|
|
"description": "The URL pointing to the license.",
|
|
"format": "uri"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"example": {
|
|
"type": "object",
|
|
"patternProperties": {
|
|
"^[a-z0-9-]+/[a-z0-9-+]+$": {}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"mimeType": {
|
|
"type": "string",
|
|
"pattern": "^[a-z0-9-]+/[a-z0-9-+]+$",
|
|
"description": "The MIME type of the HTTP message."
|
|
},
|
|
"operation": {
|
|
"type": "object",
|
|
"required": [ "responses" ],
|
|
"additionalProperties": false,
|
|
"patternProperties": {
|
|
"^x-": {
|
|
"$ref": "#/definitions/vendorExtension"
|
|
}
|
|
},
|
|
"properties": {
|
|
"tags": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"summary": {
|
|
"type": "string",
|
|
"description": "A brief summary of the operation."
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"description": "A longer description of the operation."
|
|
},
|
|
"operationId": {
|
|
"type": "string",
|
|
"description": "A friendly name of the operation"
|
|
},
|
|
"produces": {
|
|
"type": "array",
|
|
"description": "A list of MIME types the API can produce.",
|
|
"additionalItems": false,
|
|
"items": {
|
|
"$ref": "#/definitions/mimeType"
|
|
}
|
|
},
|
|
"parameters": {
|
|
"type": "array",
|
|
"description": "The parameters needed to send a valid API call.",
|
|
"minItems": 1,
|
|
"additionalItems": false,
|
|
"items": {
|
|
"$ref": "#/definitions/parameter"
|
|
}
|
|
},
|
|
"responses": {
|
|
"$ref": "#/definitions/responses"
|
|
},
|
|
"schemes": {
|
|
"type": "array",
|
|
"description": "The transfer protocol of the API.",
|
|
"items": {
|
|
"type": "string",
|
|
"enum": [ "http", "https", "ws", "wss" ]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"type": "object",
|
|
"description": "Response objects names can either be any valid HTTP status code or 'default'.",
|
|
"minProperties": 1,
|
|
"additionalProperties": false,
|
|
"patternProperties": {
|
|
"^([0-9]+)$|^(default)$": {
|
|
"$ref": "#/definitions/response"
|
|
},
|
|
"^x-": {
|
|
"$ref": "#/definitions/vendorExtension"
|
|
}
|
|
}
|
|
},
|
|
"response": {
|
|
"type": "object",
|
|
"required": [ "description" ],
|
|
"properties": {
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"schema": {
|
|
"$ref": "#/definitions/schema"
|
|
},
|
|
"headers": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/schema"
|
|
}
|
|
},
|
|
"examples": {
|
|
"$ref": "#/definitions/example"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"vendorExtension": {
|
|
"description": "Any property starting with x- is valid.",
|
|
"additionalProperties": true,
|
|
"additionalItems": true
|
|
},
|
|
"parameter": {
|
|
"type": "object",
|
|
"required": [ "name", "in"],
|
|
"patternProperties": {
|
|
"^x-": {
|
|
"$ref": "#/definitions/vendorExtension"
|
|
}
|
|
},
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"description": "The name of the parameter."
|
|
},
|
|
"in": {
|
|
"type": "string",
|
|
"description": "Determines the location of the parameter.",
|
|
"enum": [ "query", "header", "path", "formData", "body" ],
|
|
"default": "query"
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"description": "A brief description of the parameter. This could contain examples of use."
|
|
},
|
|
"required": {
|
|
"type": "boolean",
|
|
"description": "Determines whether or not this parameter is required or optional."
|
|
},
|
|
"schema": {
|
|
"$ref": "#/definitions/schema"
|
|
}
|
|
}
|
|
},
|
|
"schema": {
|
|
"type": "object",
|
|
"description": "A deterministic version of a JSON Schema object.",
|
|
"patternProperties": {
|
|
"^x-": {
|
|
"$ref": "#/definitions/vendorExtension"
|
|
}
|
|
},
|
|
"properties": {
|
|
"$ref": { "type": "string" },
|
|
"format": { "type": "string" },
|
|
"title": { "$ref": "http://json-schema.orgx/draft-04/schema#/properties/title" },
|
|
"description": { "$ref": "http://json-schema.orgx/draft-04/schema#/properties/description" },
|
|
"default": { "$ref": "http://json-schema.orgx/draft-04/schema#/properties/default" },
|
|
"multipleOf": { "$ref": "http://json-schema.orgx/draft-04/schema#/properties/multipleOf" },
|
|
"maximum": { "$ref": "http://json-schema.orgx/draft-04/schema#/properties/maximum" },
|
|
"exclusiveMaximum": { "$ref": "http://json-schema.orgx/draft-04/schema#/properties/exclusiveMaximum" },
|
|
"minimum": { "$ref": "http://json-schema.orgx/draft-04/schema#/properties/minimum" },
|
|
"exclusiveMinimum": { "$ref": "http://json-schema.orgx/draft-04/schema#/properties/exclusiveMinimum" },
|
|
"maxLength": { "$ref": "http://json-schema.orgx/draft-04/schema#/definitions/positiveInteger" },
|
|
"minLength": { "$ref": "http://json-schema.orgx/draft-04/schema#/definitions/positiveIntegerDefault0" },
|
|
"pattern": { "$ref": "http://json-schema.orgx/draft-04/schema#/properties/pattern" },
|
|
"discriminator": { "type": "string" },
|
|
"xml": { "$ref": "#/definitions/xml"},
|
|
"items": {
|
|
"anyOf": [
|
|
{ "$ref": "#/definitions/schema" },
|
|
{
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"items": { "$ref": "#/definitions/schema" }
|
|
}
|
|
],
|
|
"default": { }
|
|
},
|
|
"maxItems": { "$ref": "http://json-schema.orgx/draft-04/schema#/definitions/positiveInteger" },
|
|
"minItems": { "$ref": "http://json-schema.orgx/draft-04/schema#/definitions/positiveIntegerDefault0" },
|
|
"uniqueItems": { "$ref": "http://json-schema.orgx/draft-04/schema#/properties/uniqueItems" },
|
|
"maxProperties": { "$ref": "http://json-schema.orgx/draft-04/schema#/definitions/positiveInteger" },
|
|
"minProperties": { "$ref": "http://json-schema.orgx/draft-04/schema#/definitions/positiveIntegerDefault0" },
|
|
"required": { "$ref": "http://json-schema.orgx/draft-04/schema#/definitions/stringArray" },
|
|
"definitions": {
|
|
"type": "object",
|
|
"additionalProperties": { "$ref": "#/definitions/schema" },
|
|
"default": { }
|
|
},
|
|
"properties": {
|
|
"type": "object",
|
|
"additionalProperties": { "$ref": "#/definitions/schema" },
|
|
"default": { }
|
|
},
|
|
"enum": { "$ref": "http://json-schema.orgx/draft-04/schema#/properties/enum" },
|
|
"type": { "$ref": "http://json-schema.orgx/draft-04/schema#/properties/type" },
|
|
"allOf": {
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"items": { "$ref": "#/definitions/schema" }
|
|
}
|
|
}
|
|
},
|
|
"xml": {
|
|
"properties": {
|
|
"namespace": { "type": "string" },
|
|
"prefix": { "type": "string" },
|
|
"attribute": { "type": "boolean" },
|
|
"wrapped": { "type": "boolean" }
|
|
},
|
|
"additionalProperties": false
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"patternProperties": {
|
|
"^x-": {
|
|
"$ref": "#/definitions/vendorExtension"
|
|
}
|
|
},
|
|
"properties": {
|
|
"swagger": {
|
|
"type": "number",
|
|
"enum": [ 2.0 ],
|
|
"description": "The Swagger version of this document."
|
|
},
|
|
"info": {
|
|
"$ref": "#/definitions/info"
|
|
},
|
|
"host": {
|
|
"type": "string",
|
|
"format": "uri",
|
|
"description": "The fully qualified URI to the host of the API."
|
|
},
|
|
"basePath": {
|
|
"type": "string",
|
|
"pattern": "^/",
|
|
"description": "The base path to the API. Example: '/api'."
|
|
},
|
|
"schemes": {
|
|
"type": "array",
|
|
"description": "The transfer protocol of the API.",
|
|
"items": {
|
|
"type": "string",
|
|
"enum": [ "http", "https", "ws", "wss" ]
|
|
}
|
|
},
|
|
"consumes": {
|
|
"type": "array",
|
|
"description": "A list of MIME types accepted by the API.",
|
|
"items": {
|
|
"$ref": "#/definitions/mimeType"
|
|
}
|
|
},
|
|
"produces": {
|
|
"type": "array",
|
|
"description": "A list of MIME types the API can produce.",
|
|
"items": {
|
|
"$ref": "#/definitions/mimeType"
|
|
}
|
|
},
|
|
"paths": {
|
|
"type": "object",
|
|
"description": "Relative paths to the individual endpoints. They should be relative to the 'basePath'.",
|
|
|
|
"patternProperties": {
|
|
"^x-": {
|
|
"$ref": "#/definitions/vendorExtension"
|
|
}
|
|
},
|
|
|
|
"additionalProperties": {
|
|
"type": "object",
|
|
"minProperties": 1,
|
|
"additionalProperties": false,
|
|
"patternProperties": {
|
|
"^x-": {
|
|
"$ref": "#/definitions/vendorExtension"
|
|
}
|
|
},
|
|
"properties": {
|
|
"get": {
|
|
"$ref": "#/definitions/operation"
|
|
},
|
|
"put": {
|
|
"$ref": "#/definitions/operation"
|
|
},
|
|
"post": {
|
|
"$ref": "#/definitions/operation"
|
|
},
|
|
"delete": {
|
|
"$ref": "#/definitions/operation"
|
|
},
|
|
"options": {
|
|
"$ref": "#/definitions/operation"
|
|
},
|
|
"head": {
|
|
"$ref": "#/definitions/operation"
|
|
},
|
|
"patch": {
|
|
"$ref": "#/definitions/operation"
|
|
},
|
|
"parameters": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/parameter"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"schemas": {
|
|
"type": "object",
|
|
"description": "One or more JSON objects describing the schemas being consumed and produced by the API.",
|
|
"additionalProperties": {
|
|
"$ref": "#/definitions/schema"
|
|
}
|
|
},
|
|
"security": {
|
|
"type": "array"
|
|
}
|
|
}
|
|
}
|
|
|
|
},{}],230:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
module.exports = {
|
|
description: "getRegisteredFormats - return an array of format names",
|
|
setup: function (validator, Class) {
|
|
Class.registerFormat('phone', function (str) {
|
|
return true;
|
|
});
|
|
|
|
},
|
|
|
|
tests: [
|
|
{
|
|
description: "should pass validation for new format",
|
|
valid: true,
|
|
data: '01234567',
|
|
schema: {
|
|
"type": "string",
|
|
"format": "phone"
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
},{}],231:[function(require,module,exports){
|
|
arguments[4][226][0].apply(exports,arguments)
|
|
},{"dup":226}],232:[function(require,module,exports){
|
|
module.exports={
|
|
"type": "integer"
|
|
}
|
|
},{}],233:[function(require,module,exports){
|
|
arguments[4][232][0].apply(exports,arguments)
|
|
},{"dup":232}],234:[function(require,module,exports){
|
|
module.exports={
|
|
"integer": {
|
|
"type": "integer"
|
|
},
|
|
"refToInteger": {
|
|
"$ref": "#/integer"
|
|
}
|
|
}
|
|
},{}],235:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description": "additionalItems as schema",
|
|
"schema": {
|
|
"items": [{}],
|
|
"additionalItems": {"type": "integer"}
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "additional items match schema",
|
|
"data": [ null, 2, 3, 4 ],
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "additional items do not match schema",
|
|
"data": [ null, 2, 3, "foo" ],
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "items is schema, no additionalItems",
|
|
"schema": {
|
|
"items": {},
|
|
"additionalItems": false
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "all items match schema",
|
|
"data": [ 1, 2, 3, 4, 5 ],
|
|
"valid": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "array of items with no additionalItems",
|
|
"schema": {
|
|
"items": [{}, {}, {}],
|
|
"additionalItems": false
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "no additional items present",
|
|
"data": [ 1, 2, 3 ],
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "additional items are not permitted",
|
|
"data": [ 1, 2, 3, 4 ],
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "additionalItems as false without items",
|
|
"schema": {"additionalItems": false},
|
|
"tests": [
|
|
{
|
|
"description":
|
|
"items defaults to empty schema so everything is valid",
|
|
"data": [ 1, 2, 3, 4, 5 ],
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "ignores non-arrays",
|
|
"data": {"foo" : "bar"},
|
|
"valid": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "additionalItems are allowed by default",
|
|
"schema": {"items": [{"type": "integer"}]},
|
|
"tests": [
|
|
{
|
|
"description": "only the first item is validated",
|
|
"data": [1, "foo", false],
|
|
"valid": true
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],236:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description":
|
|
"additionalProperties being false does not allow other properties",
|
|
"schema": {
|
|
"properties": {"foo": {}, "bar": {}},
|
|
"patternProperties": { "^v": {} },
|
|
"additionalProperties": false
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "no additional properties is valid",
|
|
"data": {"foo": 1},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "an additional property is invalid",
|
|
"data": {"foo" : 1, "bar" : 2, "quux" : "boom"},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "ignores non-objects",
|
|
"data": [1, 2, 3],
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "patternProperties are not additional properties",
|
|
"data": {"foo":1, "vroom": 2},
|
|
"valid": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description":
|
|
"additionalProperties allows a schema which should validate",
|
|
"schema": {
|
|
"properties": {"foo": {}, "bar": {}},
|
|
"additionalProperties": {"type": "boolean"}
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "no additional properties is valid",
|
|
"data": {"foo": 1},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "an additional valid property is valid",
|
|
"data": {"foo" : 1, "bar" : 2, "quux" : true},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "an additional invalid property is invalid",
|
|
"data": {"foo" : 1, "bar" : 2, "quux" : 12},
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description":
|
|
"additionalProperties can exist by itself",
|
|
"schema": {
|
|
"additionalProperties": {"type": "boolean"}
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "an additional valid property is valid",
|
|
"data": {"foo" : true},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "an additional invalid property is invalid",
|
|
"data": {"foo" : 1},
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "additionalProperties are allowed by default",
|
|
"schema": {"properties": {"foo": {}, "bar": {}}},
|
|
"tests": [
|
|
{
|
|
"description": "additional properties are allowed",
|
|
"data": {"foo": 1, "bar": 2, "quux": true},
|
|
"valid": true
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],237:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description": "allOf",
|
|
"schema": {
|
|
"allOf": [
|
|
{
|
|
"properties": {
|
|
"bar": {"type": "integer"}
|
|
},
|
|
"required": ["bar"]
|
|
},
|
|
{
|
|
"properties": {
|
|
"foo": {"type": "string"}
|
|
},
|
|
"required": ["foo"]
|
|
}
|
|
]
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "allOf",
|
|
"data": {"foo": "baz", "bar": 2},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "mismatch second",
|
|
"data": {"foo": "baz"},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "mismatch first",
|
|
"data": {"bar": 2},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "wrong type",
|
|
"data": {"foo": "baz", "bar": "quux"},
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "allOf with base schema",
|
|
"schema": {
|
|
"properties": {"bar": {"type": "integer"}},
|
|
"required": ["bar"],
|
|
"allOf" : [
|
|
{
|
|
"properties": {
|
|
"foo": {"type": "string"}
|
|
},
|
|
"required": ["foo"]
|
|
},
|
|
{
|
|
"properties": {
|
|
"baz": {"type": "null"}
|
|
},
|
|
"required": ["baz"]
|
|
}
|
|
]
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "valid",
|
|
"data": {"foo": "quux", "bar": 2, "baz": null},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "mismatch base schema",
|
|
"data": {"foo": "quux", "baz": null},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "mismatch first allOf",
|
|
"data": {"bar": 2, "baz": null},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "mismatch second allOf",
|
|
"data": {"foo": "quux", "bar": 2},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "mismatch both",
|
|
"data": {"bar": 2},
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "allOf simple types",
|
|
"schema": {
|
|
"allOf": [
|
|
{"maximum": 30},
|
|
{"minimum": 20}
|
|
]
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "valid",
|
|
"data": 25,
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "mismatch one",
|
|
"data": 35,
|
|
"valid": false
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],238:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description": "anyOf",
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "integer"
|
|
},
|
|
{
|
|
"minimum": 2
|
|
}
|
|
]
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "first anyOf valid",
|
|
"data": 1,
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "second anyOf valid",
|
|
"data": 2.5,
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "both anyOf valid",
|
|
"data": 3,
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "neither anyOf valid",
|
|
"data": 1.5,
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "anyOf with base schema",
|
|
"schema": {
|
|
"type": "string",
|
|
"anyOf" : [
|
|
{
|
|
"maxLength": 2
|
|
},
|
|
{
|
|
"minLength": 4
|
|
}
|
|
]
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "mismatch base schema",
|
|
"data": 3,
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "one anyOf valid",
|
|
"data": "foobar",
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "both anyOf invalid",
|
|
"data": "foo",
|
|
"valid": false
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],239:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description": "invalid type for default",
|
|
"schema": {
|
|
"properties": {
|
|
"foo": {
|
|
"type": "integer",
|
|
"default": []
|
|
}
|
|
}
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "valid when property is specified",
|
|
"data": {"foo": 13},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "still valid when the invalid default is used",
|
|
"data": {},
|
|
"valid": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "invalid string value for default",
|
|
"schema": {
|
|
"properties": {
|
|
"bar": {
|
|
"type": "string",
|
|
"minLength": 4,
|
|
"default": "bad"
|
|
}
|
|
}
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "valid when property is specified",
|
|
"data": {"bar": "good"},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "still valid when the invalid default is used",
|
|
"data": {},
|
|
"valid": true
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],240:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description": "valid definition",
|
|
"schema": {"$ref": "http://json-schema.org/draft-04/schema#"},
|
|
"tests": [
|
|
{
|
|
"description": "valid definition schema",
|
|
"data": {
|
|
"definitions": {
|
|
"foo": {"type": "integer"}
|
|
}
|
|
},
|
|
"valid": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "invalid definition",
|
|
"schema": {"$ref": "http://json-schema.org/draft-04/schema#"},
|
|
"tests": [
|
|
{
|
|
"description": "invalid definition schema",
|
|
"data": {
|
|
"definitions": {
|
|
"foo": {"type": 1}
|
|
}
|
|
},
|
|
"valid": false
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],241:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description": "dependencies",
|
|
"schema": {
|
|
"dependencies": {"bar": ["foo"]}
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "neither",
|
|
"data": {},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "nondependant",
|
|
"data": {"foo": 1},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "with dependency",
|
|
"data": {"foo": 1, "bar": 2},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "missing dependency",
|
|
"data": {"bar": 2},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "ignores non-objects",
|
|
"data": "foo",
|
|
"valid": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "multiple dependencies",
|
|
"schema": {
|
|
"dependencies": {"quux": ["foo", "bar"]}
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "neither",
|
|
"data": {},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "nondependants",
|
|
"data": {"foo": 1, "bar": 2},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "with dependencies",
|
|
"data": {"foo": 1, "bar": 2, "quux": 3},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "missing dependency",
|
|
"data": {"foo": 1, "quux": 2},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "missing other dependency",
|
|
"data": {"bar": 1, "quux": 2},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "missing both dependencies",
|
|
"data": {"quux": 1},
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "multiple dependencies subschema",
|
|
"schema": {
|
|
"dependencies": {
|
|
"bar": {
|
|
"properties": {
|
|
"foo": {"type": "integer"},
|
|
"bar": {"type": "integer"}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "valid",
|
|
"data": {"foo": 1, "bar": 2},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "no dependency",
|
|
"data": {"foo": "quux"},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "wrong type",
|
|
"data": {"foo": "quux", "bar": 2},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "wrong type other",
|
|
"data": {"foo": 2, "bar": "quux"},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "wrong type both",
|
|
"data": {"foo": "quux", "bar": "quux"},
|
|
"valid": false
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],242:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description": "simple enum validation",
|
|
"schema": {"enum": [1, 2, 3]},
|
|
"tests": [
|
|
{
|
|
"description": "one of the enum is valid",
|
|
"data": 1,
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "something else is invalid",
|
|
"data": 4,
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "heterogeneous enum validation",
|
|
"schema": {"enum": [6, "foo", [], true, {"foo": 12}]},
|
|
"tests": [
|
|
{
|
|
"description": "one of the enum is valid",
|
|
"data": [],
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "something else is invalid",
|
|
"data": null,
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "objects are deep compared",
|
|
"data": {"foo": false},
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "enums in properties",
|
|
"schema": {
|
|
"type":"object",
|
|
"properties": {
|
|
"foo": {"enum":["foo"]},
|
|
"bar": {"enum":["bar"]}
|
|
},
|
|
"required": ["bar"]
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "both properties are valid",
|
|
"data": {"foo":"foo", "bar":"bar"},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "missing optional property is valid",
|
|
"data": {"bar":"bar"},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "missing required property is invalid",
|
|
"data": {"foo":"foo"},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "missing all properties is invalid",
|
|
"data": {},
|
|
"valid": false
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],243:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description": "a schema given for items",
|
|
"schema": {
|
|
"items": {"type": "integer"}
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "valid items",
|
|
"data": [ 1, 2, 3 ],
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "wrong type of items",
|
|
"data": [1, "x"],
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "ignores non-arrays",
|
|
"data": {"foo" : "bar"},
|
|
"valid": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "an array of schemas for items",
|
|
"schema": {
|
|
"items": [
|
|
{"type": "integer"},
|
|
{"type": "string"}
|
|
]
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "correct types",
|
|
"data": [ 1, "foo" ],
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "wrong types",
|
|
"data": [ "foo", 1 ],
|
|
"valid": false
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],244:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description": "maxItems validation",
|
|
"schema": {"maxItems": 2},
|
|
"tests": [
|
|
{
|
|
"description": "shorter is valid",
|
|
"data": [1],
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "exact length is valid",
|
|
"data": [1, 2],
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "too long is invalid",
|
|
"data": [1, 2, 3],
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "ignores non-arrays",
|
|
"data": "foobar",
|
|
"valid": true
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],245:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description": "maxLength validation",
|
|
"schema": {"maxLength": 2},
|
|
"tests": [
|
|
{
|
|
"description": "shorter is valid",
|
|
"data": "f",
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "exact length is valid",
|
|
"data": "fo",
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "too long is invalid",
|
|
"data": "foo",
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "ignores non-strings",
|
|
"data": 100,
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "two supplementary Unicode code points is long enough",
|
|
"data": "\uD83D\uDCA9\uD83D\uDCA9",
|
|
"valid": true
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],246:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description": "maxProperties validation",
|
|
"schema": {"maxProperties": 2},
|
|
"tests": [
|
|
{
|
|
"description": "shorter is valid",
|
|
"data": {"foo": 1},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "exact length is valid",
|
|
"data": {"foo": 1, "bar": 2},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "too long is invalid",
|
|
"data": {"foo": 1, "bar": 2, "baz": 3},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "ignores non-objects",
|
|
"data": "foobar",
|
|
"valid": true
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],247:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description": "maximum validation",
|
|
"schema": {"maximum": 3.0},
|
|
"tests": [
|
|
{
|
|
"description": "below the maximum is valid",
|
|
"data": 2.6,
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "above the maximum is invalid",
|
|
"data": 3.5,
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "ignores non-numbers",
|
|
"data": "x",
|
|
"valid": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "exclusiveMaximum validation",
|
|
"schema": {
|
|
"maximum": 3.0,
|
|
"exclusiveMaximum": true
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "below the maximum is still valid",
|
|
"data": 2.2,
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "boundary point is invalid",
|
|
"data": 3.0,
|
|
"valid": false
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],248:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description": "minItems validation",
|
|
"schema": {"minItems": 1},
|
|
"tests": [
|
|
{
|
|
"description": "longer is valid",
|
|
"data": [1, 2],
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "exact length is valid",
|
|
"data": [1],
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "too short is invalid",
|
|
"data": [],
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "ignores non-arrays",
|
|
"data": "",
|
|
"valid": true
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],249:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description": "minLength validation",
|
|
"schema": {"minLength": 2},
|
|
"tests": [
|
|
{
|
|
"description": "longer is valid",
|
|
"data": "foo",
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "exact length is valid",
|
|
"data": "fo",
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "too short is invalid",
|
|
"data": "f",
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "ignores non-strings",
|
|
"data": 1,
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "one supplementary Unicode code point is not long enough",
|
|
"data": "\uD83D\uDCA9",
|
|
"valid": false
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],250:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description": "minProperties validation",
|
|
"schema": {"minProperties": 1},
|
|
"tests": [
|
|
{
|
|
"description": "longer is valid",
|
|
"data": {"foo": 1, "bar": 2},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "exact length is valid",
|
|
"data": {"foo": 1},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "too short is invalid",
|
|
"data": {},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "ignores non-objects",
|
|
"data": "",
|
|
"valid": true
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],251:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description": "minimum validation",
|
|
"schema": {"minimum": 1.1},
|
|
"tests": [
|
|
{
|
|
"description": "above the minimum is valid",
|
|
"data": 2.6,
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "below the minimum is invalid",
|
|
"data": 0.6,
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "ignores non-numbers",
|
|
"data": "x",
|
|
"valid": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "exclusiveMinimum validation",
|
|
"schema": {
|
|
"minimum": 1.1,
|
|
"exclusiveMinimum": true
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "above the minimum is still valid",
|
|
"data": 1.2,
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "boundary point is invalid",
|
|
"data": 1.1,
|
|
"valid": false
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],252:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description": "by int",
|
|
"schema": {"multipleOf": 2},
|
|
"tests": [
|
|
{
|
|
"description": "int by int",
|
|
"data": 10,
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "int by int fail",
|
|
"data": 7,
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "ignores non-numbers",
|
|
"data": "foo",
|
|
"valid": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "by number",
|
|
"schema": {"multipleOf": 1.5},
|
|
"tests": [
|
|
{
|
|
"description": "zero is multiple of anything",
|
|
"data": 0,
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "4.5 is multiple of 1.5",
|
|
"data": 4.5,
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "35 is not multiple of 1.5",
|
|
"data": 35,
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "by small number",
|
|
"schema": {"multipleOf": 0.0001},
|
|
"tests": [
|
|
{
|
|
"description": "0.0075 is multiple of 0.0001",
|
|
"data": 0.0075,
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "0.00751 is not multiple of 0.0001",
|
|
"data": 0.00751,
|
|
"valid": false
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],253:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description": "not",
|
|
"schema": {
|
|
"not": {"type": "integer"}
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "allowed",
|
|
"data": "foo",
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "disallowed",
|
|
"data": 1,
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "not multiple types",
|
|
"schema": {
|
|
"not": {"type": ["integer", "boolean"]}
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "valid",
|
|
"data": "foo",
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "mismatch",
|
|
"data": 1,
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "other mismatch",
|
|
"data": true,
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "not more complex schema",
|
|
"schema": {
|
|
"not": {
|
|
"type": "object",
|
|
"properties": {
|
|
"foo": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "match",
|
|
"data": 1,
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "other match",
|
|
"data": {"foo": 1},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "mismatch",
|
|
"data": {"foo": "bar"},
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "forbidden property",
|
|
"schema": {
|
|
"properties": {
|
|
"foo": {
|
|
"not": {}
|
|
}
|
|
}
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "property present",
|
|
"data": {"foo": 1, "bar": 2},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "property absent",
|
|
"data": {"bar": 1, "baz": 2},
|
|
"valid": true
|
|
}
|
|
]
|
|
}
|
|
|
|
]
|
|
|
|
},{}],254:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description": "oneOf",
|
|
"schema": {
|
|
"oneOf": [
|
|
{
|
|
"type": "integer"
|
|
},
|
|
{
|
|
"minimum": 2
|
|
}
|
|
]
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "first oneOf valid",
|
|
"data": 1,
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "second oneOf valid",
|
|
"data": 2.5,
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "both oneOf valid",
|
|
"data": 3,
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "neither oneOf valid",
|
|
"data": 1.5,
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "oneOf with base schema",
|
|
"schema": {
|
|
"type": "string",
|
|
"oneOf" : [
|
|
{
|
|
"minLength": 2
|
|
},
|
|
{
|
|
"maxLength": 4
|
|
}
|
|
]
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "mismatch base schema",
|
|
"data": 3,
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "one oneOf valid",
|
|
"data": "foobar",
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "both oneOf valid",
|
|
"data": "foo",
|
|
"valid": false
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],255:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description": "integer",
|
|
"schema": {"type": "integer"},
|
|
"tests": [
|
|
{
|
|
"description": "a bignum is an integer",
|
|
"data": 12345678910111213141516171819202122232425262728293031,
|
|
"valid": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "number",
|
|
"schema": {"type": "number"},
|
|
"tests": [
|
|
{
|
|
"description": "a bignum is a number",
|
|
"data": 98249283749234923498293171823948729348710298301928331,
|
|
"valid": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "integer",
|
|
"schema": {"type": "integer"},
|
|
"tests": [
|
|
{
|
|
"description": "a negative bignum is an integer",
|
|
"data": -12345678910111213141516171819202122232425262728293031,
|
|
"valid": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "number",
|
|
"schema": {"type": "number"},
|
|
"tests": [
|
|
{
|
|
"description": "a negative bignum is a number",
|
|
"data": -98249283749234923498293171823948729348710298301928331,
|
|
"valid": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "string",
|
|
"schema": {"type": "string"},
|
|
"tests": [
|
|
{
|
|
"description": "a bignum is not a string",
|
|
"data": 98249283749234923498293171823948729348710298301928331,
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "integer comparison",
|
|
"schema": {"maximum": 18446744073709551615},
|
|
"tests": [
|
|
{
|
|
"description": "comparison works for high numbers",
|
|
"data": 18446744073709551600,
|
|
"valid": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "float comparison with high precision",
|
|
"schema": {
|
|
"maximum": 972783798187987123879878123.18878137,
|
|
"exclusiveMaximum": true
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "comparison works for high numbers",
|
|
"data": 972783798187987123879878123.188781371,
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "integer comparison",
|
|
"schema": {"minimum": -18446744073709551615},
|
|
"tests": [
|
|
{
|
|
"description": "comparison works for very negative numbers",
|
|
"data": -18446744073709551600,
|
|
"valid": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "float comparison with high precision on negative numbers",
|
|
"schema": {
|
|
"minimum": -972783798187987123879878123.18878137,
|
|
"exclusiveMinimum": true
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "comparison works for very negative numbers",
|
|
"data": -972783798187987123879878123.188781371,
|
|
"valid": false
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],256:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description": "validation of date-time strings",
|
|
"schema": {"format": "date-time"},
|
|
"tests": [
|
|
{
|
|
"description": "a valid date-time string",
|
|
"data": "1963-06-19T08:30:06.283185Z",
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "an invalid date-time string",
|
|
"data": "06/19/1963 08:30:06 PST",
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "only RFC3339 not all of ISO 8601 are valid",
|
|
"data": "2013-350T01:01:01",
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "validation of URIs",
|
|
"schema": {"format": "uri"},
|
|
"tests": [
|
|
{
|
|
"description": "a valid URI",
|
|
"data": "http://foo.bar/?baz=qux#quux",
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "an invalid URI",
|
|
"data": "\\\\WINDOWS\\fileshare",
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "an invalid URI though valid URI reference",
|
|
"data": "abc",
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "validation of e-mail addresses",
|
|
"schema": {"format": "email"},
|
|
"tests": [
|
|
{
|
|
"description": "a valid e-mail address",
|
|
"data": "joe.bloggs@example.com",
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "an invalid e-mail address",
|
|
"data": "2962",
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "validation of IP addresses",
|
|
"schema": {"format": "ipv4"},
|
|
"tests": [
|
|
{
|
|
"description": "a valid IP address",
|
|
"data": "192.168.0.1",
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "an IP address with too many components",
|
|
"data": "127.0.0.0.1",
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "an IP address with out-of-range values",
|
|
"data": "256.256.256.256",
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "an IP address without 4 components",
|
|
"data": "127.0",
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "an IP address as an integer",
|
|
"data": "0x7f000001",
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "validation of IPv6 addresses",
|
|
"schema": {"format": "ipv6"},
|
|
"tests": [
|
|
{
|
|
"description": "a valid IPv6 address",
|
|
"data": "::1",
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "an IPv6 address with out-of-range values",
|
|
"data": "12345::",
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "an IPv6 address with too many components",
|
|
"data": "1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1",
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "an IPv6 address containing illegal characters",
|
|
"data": "::laptop",
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "validation of host names",
|
|
"schema": {"format": "hostname"},
|
|
"tests": [
|
|
{
|
|
"description": "a valid host name",
|
|
"data": "www.example.com",
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "a host name starting with an illegal character",
|
|
"data": "-a-host-name-that-starts-with--",
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "a host name containing illegal characters",
|
|
"data": "not_a_valid_host_name",
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "a host name with a component too long",
|
|
"data": "a-vvvvvvvvvvvvvvvveeeeeeeeeeeeeeeerrrrrrrrrrrrrrrryyyyyyyyyyyyyyyy-long-host-name-component",
|
|
"valid": false
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],257:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description": "pattern validation",
|
|
"schema": {"pattern": "^a*$"},
|
|
"tests": [
|
|
{
|
|
"description": "a matching pattern is valid",
|
|
"data": "aaa",
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "a non-matching pattern is invalid",
|
|
"data": "abc",
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "ignores non-strings",
|
|
"data": true,
|
|
"valid": true
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],258:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description":
|
|
"patternProperties validates properties matching a regex",
|
|
"schema": {
|
|
"patternProperties": {
|
|
"f.*o": {"type": "integer"}
|
|
}
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "a single valid match is valid",
|
|
"data": {"foo": 1},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "multiple valid matches is valid",
|
|
"data": {"foo": 1, "foooooo" : 2},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "a single invalid match is invalid",
|
|
"data": {"foo": "bar", "fooooo": 2},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "multiple invalid matches is invalid",
|
|
"data": {"foo": "bar", "foooooo" : "baz"},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "ignores non-objects",
|
|
"data": 12,
|
|
"valid": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "multiple simultaneous patternProperties are validated",
|
|
"schema": {
|
|
"patternProperties": {
|
|
"a*": {"type": "integer"},
|
|
"aaa*": {"maximum": 20}
|
|
}
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "a single valid match is valid",
|
|
"data": {"a": 21},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "a simultaneous match is valid",
|
|
"data": {"aaaa": 18},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "multiple matches is valid",
|
|
"data": {"a": 21, "aaaa": 18},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "an invalid due to one is invalid",
|
|
"data": {"a": "bar"},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "an invalid due to the other is invalid",
|
|
"data": {"aaaa": 31},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "an invalid due to both is invalid",
|
|
"data": {"aaa": "foo", "aaaa": 31},
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "regexes are not anchored by default and are case sensitive",
|
|
"schema": {
|
|
"patternProperties": {
|
|
"[0-9]{2,}": { "type": "boolean" },
|
|
"X_": { "type": "string" }
|
|
}
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "non recognized members are ignored",
|
|
"data": { "answer 1": "42" },
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "recognized members are accounted for",
|
|
"data": { "a31b": null },
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "regexes are case sensitive",
|
|
"data": { "a_x_3": 3 },
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "regexes are case sensitive, 2",
|
|
"data": { "a_X_3": 3 },
|
|
"valid": false
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],259:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description": "object properties validation",
|
|
"schema": {
|
|
"properties": {
|
|
"foo": {"type": "integer"},
|
|
"bar": {"type": "string"}
|
|
}
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "both properties present and valid is valid",
|
|
"data": {"foo": 1, "bar": "baz"},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "one property invalid is invalid",
|
|
"data": {"foo": 1, "bar": {}},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "both properties invalid is invalid",
|
|
"data": {"foo": [], "bar": {}},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "doesn't invalidate other properties",
|
|
"data": {"quux": []},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "ignores non-objects",
|
|
"data": [],
|
|
"valid": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description":
|
|
"properties, patternProperties, additionalProperties interaction",
|
|
"schema": {
|
|
"properties": {
|
|
"foo": {"type": "array", "maxItems": 3},
|
|
"bar": {"type": "array"}
|
|
},
|
|
"patternProperties": {"f.o": {"minItems": 2}},
|
|
"additionalProperties": {"type": "integer"}
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "property validates property",
|
|
"data": {"foo": [1, 2]},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "property invalidates property",
|
|
"data": {"foo": [1, 2, 3, 4]},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "patternProperty invalidates property",
|
|
"data": {"foo": []},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "patternProperty validates nonproperty",
|
|
"data": {"fxo": [1, 2]},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "patternProperty invalidates nonproperty",
|
|
"data": {"fxo": []},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "additionalProperty ignores property",
|
|
"data": {"bar": []},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "additionalProperty validates others",
|
|
"data": {"quux": 3},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "additionalProperty invalidates others",
|
|
"data": {"quux": "foo"},
|
|
"valid": false
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],260:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description": "root pointer ref",
|
|
"schema": {
|
|
"properties": {
|
|
"foo": {"$ref": "#"}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "match",
|
|
"data": {"foo": false},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "recursive match",
|
|
"data": {"foo": {"foo": false}},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "mismatch",
|
|
"data": {"bar": false},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "recursive mismatch",
|
|
"data": {"foo": {"bar": false}},
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "relative pointer ref to object",
|
|
"schema": {
|
|
"properties": {
|
|
"foo": {"type": "integer"},
|
|
"bar": {"$ref": "#/properties/foo"}
|
|
}
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "match",
|
|
"data": {"bar": 3},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "mismatch",
|
|
"data": {"bar": true},
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "relative pointer ref to array",
|
|
"schema": {
|
|
"items": [
|
|
{"type": "integer"},
|
|
{"$ref": "#/items/0"}
|
|
]
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "match array",
|
|
"data": [1, 2],
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "mismatch array",
|
|
"data": [1, "foo"],
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "escaped pointer ref",
|
|
"schema": {
|
|
"tilda~field": {"type": "integer"},
|
|
"slash/field": {"type": "integer"},
|
|
"percent%field": {"type": "integer"},
|
|
"properties": {
|
|
"tilda": {"$ref": "#/tilda~0field"},
|
|
"slash": {"$ref": "#/slash~1field"},
|
|
"percent": {"$ref": "#/percent%25field"}
|
|
}
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "slash",
|
|
"data": {"slash": "aoeu"},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "tilda",
|
|
"data": {"tilda": "aoeu"},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "percent",
|
|
"data": {"percent": "aoeu"},
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "nested refs",
|
|
"schema": {
|
|
"definitions": {
|
|
"a": {"type": "integer"},
|
|
"b": {"$ref": "#/definitions/a"},
|
|
"c": {"$ref": "#/definitions/b"}
|
|
},
|
|
"$ref": "#/definitions/c"
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "nested ref valid",
|
|
"data": 5,
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "nested ref invalid",
|
|
"data": "a",
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "remote ref, containing refs itself",
|
|
"schema": {"$ref": "http://json-schema.org/draft-04/schema#"},
|
|
"tests": [
|
|
{
|
|
"description": "remote ref valid",
|
|
"data": {"minLength": 1},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "remote ref invalid",
|
|
"data": {"minLength": -1},
|
|
"valid": false
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],261:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description": "remote ref",
|
|
"schema": {"$ref": "http://localhost:1234/integer.json"},
|
|
"tests": [
|
|
{
|
|
"description": "remote ref valid",
|
|
"data": 1,
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "remote ref invalid",
|
|
"data": "a",
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "fragment within remote ref",
|
|
"schema": {"$ref": "http://localhost:1234/subSchemas.json#/integer"},
|
|
"tests": [
|
|
{
|
|
"description": "remote fragment valid",
|
|
"data": 1,
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "remote fragment invalid",
|
|
"data": "a",
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "ref within remote ref",
|
|
"schema": {
|
|
"$ref": "http://localhost:1234/subSchemas.json#/refToInteger"
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "ref within ref valid",
|
|
"data": 1,
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "ref within ref invalid",
|
|
"data": "a",
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "change resolution scope",
|
|
"schema": {
|
|
"id": "http://localhost:1234/",
|
|
"items": {
|
|
"id": "folder/",
|
|
"items": {"$ref": "folderInteger.json"}
|
|
}
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "changed scope ref valid",
|
|
"data": [[1]],
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "changed scope ref invalid",
|
|
"data": [["a"]],
|
|
"valid": false
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],262:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description": "required validation",
|
|
"schema": {
|
|
"properties": {
|
|
"foo": {},
|
|
"bar": {}
|
|
},
|
|
"required": ["foo"]
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "present required property is valid",
|
|
"data": {"foo": 1},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "non-present required property is invalid",
|
|
"data": {"bar": 1},
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "required default validation",
|
|
"schema": {
|
|
"properties": {
|
|
"foo": {}
|
|
}
|
|
},
|
|
"tests": [
|
|
{
|
|
"description": "not required by default",
|
|
"data": {},
|
|
"valid": true
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],263:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description": "integer type matches integers",
|
|
"schema": {"type": "integer"},
|
|
"tests": [
|
|
{
|
|
"description": "an integer is an integer",
|
|
"data": 1,
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "a float is not an integer",
|
|
"data": 1.1,
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "a string is not an integer",
|
|
"data": "foo",
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "an object is not an integer",
|
|
"data": {},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "an array is not an integer",
|
|
"data": [],
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "a boolean is not an integer",
|
|
"data": true,
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "null is not an integer",
|
|
"data": null,
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "number type matches numbers",
|
|
"schema": {"type": "number"},
|
|
"tests": [
|
|
{
|
|
"description": "an integer is a number",
|
|
"data": 1,
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "a float is a number",
|
|
"data": 1.1,
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "a string is not a number",
|
|
"data": "foo",
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "an object is not a number",
|
|
"data": {},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "an array is not a number",
|
|
"data": [],
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "a boolean is not a number",
|
|
"data": true,
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "null is not a number",
|
|
"data": null,
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "string type matches strings",
|
|
"schema": {"type": "string"},
|
|
"tests": [
|
|
{
|
|
"description": "1 is not a string",
|
|
"data": 1,
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "a float is not a string",
|
|
"data": 1.1,
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "a string is a string",
|
|
"data": "foo",
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "an object is not a string",
|
|
"data": {},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "an array is not a string",
|
|
"data": [],
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "a boolean is not a string",
|
|
"data": true,
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "null is not a string",
|
|
"data": null,
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "object type matches objects",
|
|
"schema": {"type": "object"},
|
|
"tests": [
|
|
{
|
|
"description": "an integer is not an object",
|
|
"data": 1,
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "a float is not an object",
|
|
"data": 1.1,
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "a string is not an object",
|
|
"data": "foo",
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "an object is an object",
|
|
"data": {},
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "an array is not an object",
|
|
"data": [],
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "a boolean is not an object",
|
|
"data": true,
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "null is not an object",
|
|
"data": null,
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "array type matches arrays",
|
|
"schema": {"type": "array"},
|
|
"tests": [
|
|
{
|
|
"description": "an integer is not an array",
|
|
"data": 1,
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "a float is not an array",
|
|
"data": 1.1,
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "a string is not an array",
|
|
"data": "foo",
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "an object is not an array",
|
|
"data": {},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "an array is not an array",
|
|
"data": [],
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "a boolean is not an array",
|
|
"data": true,
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "null is not an array",
|
|
"data": null,
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "boolean type matches booleans",
|
|
"schema": {"type": "boolean"},
|
|
"tests": [
|
|
{
|
|
"description": "an integer is not a boolean",
|
|
"data": 1,
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "a float is not a boolean",
|
|
"data": 1.1,
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "a string is not a boolean",
|
|
"data": "foo",
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "an object is not a boolean",
|
|
"data": {},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "an array is not a boolean",
|
|
"data": [],
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "a boolean is not a boolean",
|
|
"data": true,
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "null is not a boolean",
|
|
"data": null,
|
|
"valid": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "null type matches only the null object",
|
|
"schema": {"type": "null"},
|
|
"tests": [
|
|
{
|
|
"description": "an integer is not null",
|
|
"data": 1,
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "a float is not null",
|
|
"data": 1.1,
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "a string is not null",
|
|
"data": "foo",
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "an object is not null",
|
|
"data": {},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "an array is not null",
|
|
"data": [],
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "a boolean is not null",
|
|
"data": true,
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "null is null",
|
|
"data": null,
|
|
"valid": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"description": "multiple types can be specified in an array",
|
|
"schema": {"type": ["integer", "string"]},
|
|
"tests": [
|
|
{
|
|
"description": "an integer is valid",
|
|
"data": 1,
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "a string is valid",
|
|
"data": "foo",
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "a float is invalid",
|
|
"data": 1.1,
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "an object is invalid",
|
|
"data": {},
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "an array is invalid",
|
|
"data": [],
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "a boolean is invalid",
|
|
"data": true,
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "null is invalid",
|
|
"data": null,
|
|
"valid": false
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],264:[function(require,module,exports){
|
|
module.exports=[
|
|
{
|
|
"description": "uniqueItems validation",
|
|
"schema": {"uniqueItems": true},
|
|
"tests": [
|
|
{
|
|
"description": "unique array of integers is valid",
|
|
"data": [1, 2],
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "non-unique array of integers is invalid",
|
|
"data": [1, 1],
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "numbers are unique if mathematically unequal",
|
|
"data": [1.0, 1.00, 1],
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "unique array of objects is valid",
|
|
"data": [{"foo": "bar"}, {"foo": "baz"}],
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "non-unique array of objects is invalid",
|
|
"data": [{"foo": "bar"}, {"foo": "bar"}],
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "unique array of nested objects is valid",
|
|
"data": [
|
|
{"foo": {"bar" : {"baz" : true}}},
|
|
{"foo": {"bar" : {"baz" : false}}}
|
|
],
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "non-unique array of nested objects is invalid",
|
|
"data": [
|
|
{"foo": {"bar" : {"baz" : true}}},
|
|
{"foo": {"bar" : {"baz" : true}}}
|
|
],
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "unique array of arrays is valid",
|
|
"data": [["foo"], ["bar"]],
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "non-unique array of arrays is invalid",
|
|
"data": [["foo"], ["foo"]],
|
|
"valid": false
|
|
},
|
|
{
|
|
"description": "1 and true are unique",
|
|
"data": [1, true],
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "0 and false are unique",
|
|
"data": [0, false],
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "unique heterogeneous types are valid",
|
|
"data": [{}, [1], true, null, 1],
|
|
"valid": true
|
|
},
|
|
{
|
|
"description": "non-unique heterogeneous types are invalid",
|
|
"data": [{}, [1], true, null, {}, 1],
|
|
"valid": false
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
},{}],265:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
var isBrowser = typeof window !== "undefined";
|
|
var ZSchema = require("../../src/ZSchema");
|
|
if (!isBrowser) {
|
|
var request = require("https").request;
|
|
}
|
|
|
|
function validateWithAutomaticDownloads(validator, data, schema, callback) {
|
|
|
|
var lastResult;
|
|
|
|
function finish() {
|
|
callback(validator.getLastErrors(), lastResult);
|
|
}
|
|
|
|
function validate() {
|
|
|
|
lastResult = validator.validate(data, schema);
|
|
|
|
var missingReferences = validator.getMissingRemoteReferences();
|
|
if (missingReferences.length > 0) {
|
|
var finished = 0;
|
|
missingReferences.forEach(function (url) {
|
|
request(url, function (response) {
|
|
var body = "";
|
|
response.on("data", function (chunk) { data += chunk; });
|
|
response.on("end", function () {
|
|
validator.setRemoteReference(url, JSON.parse(body));
|
|
finished++;
|
|
if (finished === missingReferences.length) {
|
|
validate();
|
|
}
|
|
});
|
|
});
|
|
});
|
|
} else {
|
|
finish();
|
|
}
|
|
|
|
}
|
|
|
|
validate();
|
|
|
|
}
|
|
|
|
describe("Automatic schema loading", function () {
|
|
|
|
it("should download schemas and validate successfully", function (done) {
|
|
|
|
if (isBrowser) {
|
|
// skip this test in browsers
|
|
expect(1).toBe(1);
|
|
done();
|
|
return;
|
|
}
|
|
|
|
var validator = new ZSchema();
|
|
var schema = { "$ref": "http://json-schema.org/draft-04/schema#" };
|
|
var data = { "minLength": 1 };
|
|
|
|
validateWithAutomaticDownloads(validator, data, schema, function (err, valid) {
|
|
expect(valid).toBe(true);
|
|
expect(err).toBe(null);
|
|
done();
|
|
});
|
|
|
|
});
|
|
|
|
it("should download schemas and fail validating", function (done) {
|
|
|
|
if (typeof window !== "undefined") {
|
|
// skip this test in browsers
|
|
expect(1).toBe(1);
|
|
done();
|
|
return;
|
|
}
|
|
|
|
var validator = new ZSchema();
|
|
var schema = { "$ref": "http://json-schema.org/draft-04/schema#" };
|
|
var data = { "minLength": -1 };
|
|
|
|
validateWithAutomaticDownloads(validator, data, schema, function (err, valid) {
|
|
expect(valid).toBe(false);
|
|
expect(err[0].code).toBe("MINIMUM");
|
|
done();
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
},{"../../src/ZSchema":150,"https":7}],266:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
var ZSchema = require("../../src/ZSchema");
|
|
|
|
function setRemoteReferences(validator) {
|
|
validator.setRemoteReference("http://json-schema.org/draft-04/schema",
|
|
require("../files/draft-04-schema.json"));
|
|
validator.setRemoteReference("http://localhost:1234/integer.json",
|
|
require("../jsonSchemaTestSuite/remotes/integer.json"));
|
|
validator.setRemoteReference("http://localhost:1234/subSchemas.json",
|
|
require("../jsonSchemaTestSuite/remotes/subSchemas.json"));
|
|
validator.setRemoteReference("http://localhost:1234/folder/folderInteger.json",
|
|
require("../jsonSchemaTestSuite/remotes/folder/folderInteger.json"));
|
|
}
|
|
|
|
describe("Basic", function () {
|
|
|
|
it("ZSchema constructor should take one argument - options", function () {
|
|
expect(ZSchema.length).toBe(1);
|
|
});
|
|
|
|
it("Work in progress test...", function () {
|
|
var validator = new ZSchema();
|
|
setRemoteReferences(validator);
|
|
|
|
var schema = [
|
|
{
|
|
id: "schemaA",
|
|
type: "integer"
|
|
},
|
|
{
|
|
id: "schemaB",
|
|
type: "string"
|
|
},
|
|
{
|
|
id: "mainSchema",
|
|
type: "object",
|
|
properties: {
|
|
a: { "$ref": "schemaA" },
|
|
b: { "$ref": "schemaB" },
|
|
c: { "enum": ["C"] }
|
|
}
|
|
}
|
|
];
|
|
|
|
var data = {
|
|
a: 1,
|
|
b: "str",
|
|
c: "C"
|
|
};
|
|
|
|
var validSchema = validator.validateSchema(schema);
|
|
expect(validSchema).toBe(true);
|
|
|
|
if (!validSchema) {
|
|
console.log(validator.getLastErrors());
|
|
return;
|
|
}
|
|
|
|
var valid = validator.validate(data, schema[2]);
|
|
expect(valid).toBe(true);
|
|
|
|
if (!valid) {
|
|
console.log(validator.getLastErrors());
|
|
return;
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
},{"../../src/ZSchema":150,"../files/draft-04-schema.json":231,"../jsonSchemaTestSuite/remotes/folder/folderInteger.json":232,"../jsonSchemaTestSuite/remotes/integer.json":233,"../jsonSchemaTestSuite/remotes/subSchemas.json":234}],267:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
var ZSchema = require("../../src/ZSchema");
|
|
|
|
function setRemoteReferences(validator) {
|
|
validator.setRemoteReference("http://json-schema.org/draft-04/schema",
|
|
require("../files/draft-04-schema.json"));
|
|
validator.setRemoteReference("http://localhost:1234/integer.json",
|
|
require("../jsonSchemaTestSuite/remotes/integer.json"));
|
|
validator.setRemoteReference("http://localhost:1234/subSchemas.json",
|
|
require("../jsonSchemaTestSuite/remotes/subSchemas.json"));
|
|
validator.setRemoteReference("http://localhost:1234/folder/folderInteger.json",
|
|
require("../jsonSchemaTestSuite/remotes/folder/folderInteger.json"));
|
|
}
|
|
|
|
var jsonSchemaTestSuiteFiles = [
|
|
require("../jsonSchemaTestSuite/tests/draft4/additionalItems.json"),
|
|
require("../jsonSchemaTestSuite/tests/draft4/additionalProperties.json"),
|
|
require("../jsonSchemaTestSuite/tests/draft4/allOf.json"),
|
|
require("../jsonSchemaTestSuite/tests/draft4/anyOf.json"),
|
|
require("../jsonSchemaTestSuite/tests/draft4/default.json"),
|
|
require("../jsonSchemaTestSuite/tests/draft4/definitions.json"),
|
|
require("../jsonSchemaTestSuite/tests/draft4/dependencies.json"),
|
|
require("../jsonSchemaTestSuite/tests/draft4/enum.json"),
|
|
require("../jsonSchemaTestSuite/tests/draft4/items.json"),
|
|
require("../jsonSchemaTestSuite/tests/draft4/maximum.json"),
|
|
require("../jsonSchemaTestSuite/tests/draft4/maxItems.json"),
|
|
require("../jsonSchemaTestSuite/tests/draft4/maxLength.json"),
|
|
require("../jsonSchemaTestSuite/tests/draft4/maxProperties.json"),
|
|
require("../jsonSchemaTestSuite/tests/draft4/minimum.json"),
|
|
require("../jsonSchemaTestSuite/tests/draft4/minItems.json"),
|
|
require("../jsonSchemaTestSuite/tests/draft4/minLength.json"),
|
|
require("../jsonSchemaTestSuite/tests/draft4/minProperties.json"),
|
|
require("../jsonSchemaTestSuite/tests/draft4/multipleOf.json"),
|
|
require("../jsonSchemaTestSuite/tests/draft4/not.json"),
|
|
require("../jsonSchemaTestSuite/tests/draft4/oneOf.json"),
|
|
require("../jsonSchemaTestSuite/tests/draft4/pattern.json"),
|
|
require("../jsonSchemaTestSuite/tests/draft4/patternProperties.json"),
|
|
require("../jsonSchemaTestSuite/tests/draft4/properties.json"),
|
|
require("../jsonSchemaTestSuite/tests/draft4/ref.json"),
|
|
require("../jsonSchemaTestSuite/tests/draft4/refRemote.json"),
|
|
require("../jsonSchemaTestSuite/tests/draft4/required.json"),
|
|
require("../jsonSchemaTestSuite/tests/draft4/type.json"),
|
|
require("../jsonSchemaTestSuite/tests/draft4/uniqueItems.json"),
|
|
// optional
|
|
require("../jsonSchemaTestSuite/tests/draft4/optional/bignum.json"),
|
|
require("../jsonSchemaTestSuite/tests/draft4/optional/format.json")
|
|
// zeroTerminatedFloats.json is excluded because JavaScript doesn't distinguish between different types of numeric values
|
|
// require("../jsonSchemaTestSuite/tests/draft4/optional/zeroTerminatedFloats.json")
|
|
];
|
|
|
|
var testExcludes = [
|
|
"an invalid URI",
|
|
"an invalid URI though valid URI reference"
|
|
];
|
|
|
|
describe("JsonSchemaTestSuite", function () {
|
|
|
|
it("should contain 30 files", function () {
|
|
expect(jsonSchemaTestSuiteFiles.length).toBe(30);
|
|
});
|
|
|
|
jsonSchemaTestSuiteFiles.forEach(function (testDefinitions, fileIndex) {
|
|
|
|
testDefinitions.forEach(function (testDefinition) {
|
|
|
|
testDefinition.tests.forEach(function (test) {
|
|
|
|
if (testExcludes.indexOf(test.description) !== -1) { return; }
|
|
|
|
it("[" + fileIndex + "]" + testDefinition.description + " - " + test.description + ": " + JSON.stringify(test.data), function () {
|
|
|
|
var validator = new ZSchema();
|
|
setRemoteReferences(validator);
|
|
|
|
var valid = validator.validate(test.data, testDefinition.schema);
|
|
expect(valid).toBe(test.valid);
|
|
|
|
if (valid !== test.valid) {
|
|
if (!valid) {
|
|
var errors = validator.getLastErrors();
|
|
expect(errors).toBe(null);
|
|
}
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
},{"../../src/ZSchema":150,"../files/draft-04-schema.json":231,"../jsonSchemaTestSuite/remotes/folder/folderInteger.json":232,"../jsonSchemaTestSuite/remotes/integer.json":233,"../jsonSchemaTestSuite/remotes/subSchemas.json":234,"../jsonSchemaTestSuite/tests/draft4/additionalItems.json":235,"../jsonSchemaTestSuite/tests/draft4/additionalProperties.json":236,"../jsonSchemaTestSuite/tests/draft4/allOf.json":237,"../jsonSchemaTestSuite/tests/draft4/anyOf.json":238,"../jsonSchemaTestSuite/tests/draft4/default.json":239,"../jsonSchemaTestSuite/tests/draft4/definitions.json":240,"../jsonSchemaTestSuite/tests/draft4/dependencies.json":241,"../jsonSchemaTestSuite/tests/draft4/enum.json":242,"../jsonSchemaTestSuite/tests/draft4/items.json":243,"../jsonSchemaTestSuite/tests/draft4/maxItems.json":244,"../jsonSchemaTestSuite/tests/draft4/maxLength.json":245,"../jsonSchemaTestSuite/tests/draft4/maxProperties.json":246,"../jsonSchemaTestSuite/tests/draft4/maximum.json":247,"../jsonSchemaTestSuite/tests/draft4/minItems.json":248,"../jsonSchemaTestSuite/tests/draft4/minLength.json":249,"../jsonSchemaTestSuite/tests/draft4/minProperties.json":250,"../jsonSchemaTestSuite/tests/draft4/minimum.json":251,"../jsonSchemaTestSuite/tests/draft4/multipleOf.json":252,"../jsonSchemaTestSuite/tests/draft4/not.json":253,"../jsonSchemaTestSuite/tests/draft4/oneOf.json":254,"../jsonSchemaTestSuite/tests/draft4/optional/bignum.json":255,"../jsonSchemaTestSuite/tests/draft4/optional/format.json":256,"../jsonSchemaTestSuite/tests/draft4/pattern.json":257,"../jsonSchemaTestSuite/tests/draft4/patternProperties.json":258,"../jsonSchemaTestSuite/tests/draft4/properties.json":259,"../jsonSchemaTestSuite/tests/draft4/ref.json":260,"../jsonSchemaTestSuite/tests/draft4/refRemote.json":261,"../jsonSchemaTestSuite/tests/draft4/required.json":262,"../jsonSchemaTestSuite/tests/draft4/type.json":263,"../jsonSchemaTestSuite/tests/draft4/uniqueItems.json":264}],268:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
var ZSchema = require("../../src/ZSchema");
|
|
|
|
describe("Using multiple instances of Z-Schema", function () {
|
|
|
|
it("Should pass all tests", function () {
|
|
|
|
var schema = {
|
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
"type": "object",
|
|
"properties": {
|
|
"options": {
|
|
"enum": ["a", "b", "c"]
|
|
}
|
|
}
|
|
};
|
|
|
|
var v;
|
|
v = new ZSchema({ strictMode: true });
|
|
// Should fail because "additionalProperties" is missing
|
|
expect(v.validateSchema(schema)).toBe(false, "1st");
|
|
|
|
v = new ZSchema();
|
|
expect(v.validateSchema(schema)).toBe(true, "2nd");
|
|
|
|
v = new ZSchema({ strictMode: true });
|
|
expect(v.validateSchema(schema)).toBe(false, "3rd");
|
|
|
|
});
|
|
|
|
});
|
|
|
|
},{"../../src/ZSchema":150}],269:[function(require,module,exports){
|
|
/*jshint -W030 */
|
|
|
|
"use strict";
|
|
|
|
var ZSchema = require("../../src/ZSchema");
|
|
|
|
var testSuiteFiles = [
|
|
require("../ZSchemaTestSuite/CustomFormats.js"),
|
|
require("../ZSchemaTestSuite/CustomFormatsAsync.js"),
|
|
require("../ZSchemaTestSuite/ForceAdditional.js"),
|
|
require("../ZSchemaTestSuite/ForceItems.js"),
|
|
require("../ZSchemaTestSuite/ForceMinLength.js"),
|
|
require("../ZSchemaTestSuite/ForceMaxLength.js"),
|
|
require("../ZSchemaTestSuite/ForceMinItems.js"),
|
|
require("../ZSchemaTestSuite/ForceMaxItems.js"),
|
|
require("../ZSchemaTestSuite/ForceProperties.js"),
|
|
require("../ZSchemaTestSuite/IgnoreUnresolvableReferences.js"),
|
|
require("../ZSchemaTestSuite/AssumeAdditional.js"),
|
|
require("../ZSchemaTestSuite/NoEmptyArrays.js"),
|
|
require("../ZSchemaTestSuite/NoEmptyStrings.js"),
|
|
require("../ZSchemaTestSuite/NoTypeless.js"),
|
|
require("../ZSchemaTestSuite/NoExtraKeywords.js"),
|
|
require("../ZSchemaTestSuite/StrictUris.js"),
|
|
require("../ZSchemaTestSuite/MultipleSchemas.js"),
|
|
require("../ZSchemaTestSuite/ErrorPathAsArray.js"),
|
|
require("../ZSchemaTestSuite/ErrorPathAsJSONPointer.js"),
|
|
require("../ZSchemaTestSuite/ErrorPathContainsIntegerIndex.js"),
|
|
require("../ZSchemaTestSuite/PedanticCheck.js"),
|
|
require("../ZSchemaTestSuite/getRegisteredFormats.js"),
|
|
require("../ZSchemaTestSuite/InvalidId.js"),
|
|
require("../ZSchemaTestSuite/IncludeErrors.js"),
|
|
require("../ZSchemaTestSuite/CustomValidator.js"),
|
|
// issues
|
|
require("../ZSchemaTestSuite/Issue12.js"),
|
|
require("../ZSchemaTestSuite/Issue13.js"),
|
|
require("../ZSchemaTestSuite/Issue16.js"),
|
|
require("../ZSchemaTestSuite/Issue22.js"),
|
|
require("../ZSchemaTestSuite/Issue25.js"),
|
|
require("../ZSchemaTestSuite/Issue26.js"),
|
|
require("../ZSchemaTestSuite/Issue37.js"),
|
|
require("../ZSchemaTestSuite/Issue40.js"),
|
|
require("../ZSchemaTestSuite/Issue41.js"),
|
|
require("../ZSchemaTestSuite/Issue43.js"),
|
|
require("../ZSchemaTestSuite/Issue44.js"),
|
|
require("../ZSchemaTestSuite/Issue45.js"),
|
|
require("../ZSchemaTestSuite/Issue47.js"),
|
|
require("../ZSchemaTestSuite/Issue48.js"),
|
|
require("../ZSchemaTestSuite/Issue49.js"),
|
|
require("../ZSchemaTestSuite/Issue53.js"),
|
|
require("../ZSchemaTestSuite/Issue56.js"),
|
|
require("../ZSchemaTestSuite/Issue57.js"),
|
|
require("../ZSchemaTestSuite/Issue58.js"),
|
|
require("../ZSchemaTestSuite/Issue63.js"),
|
|
require("../ZSchemaTestSuite/Issue64.js"),
|
|
require("../ZSchemaTestSuite/Issue67.js"),
|
|
require("../ZSchemaTestSuite/Issue71.js"),
|
|
require("../ZSchemaTestSuite/Issue73.js"),
|
|
require("../ZSchemaTestSuite/Issue76.js"),
|
|
require("../ZSchemaTestSuite/Issue85.js"),
|
|
require("../ZSchemaTestSuite/Issue94.js"),
|
|
require("../ZSchemaTestSuite/Issue96.js"),
|
|
require("../ZSchemaTestSuite/Issue98.js"),
|
|
require("../ZSchemaTestSuite/Issue101.js"),
|
|
require("../ZSchemaTestSuite/Issue102.js"),
|
|
require("../ZSchemaTestSuite/Issue103.js"),
|
|
require("../ZSchemaTestSuite/Issue106.js"),
|
|
require("../ZSchemaTestSuite/Issue107.js"),
|
|
require("../ZSchemaTestSuite/Issue121.js"),
|
|
require("../ZSchemaTestSuite/Issue125.js"),
|
|
require("../ZSchemaTestSuite/Issue126.js"),
|
|
require("../ZSchemaTestSuite/Issue130.js"),
|
|
require("../ZSchemaTestSuite/Issue131.js"),
|
|
require("../ZSchemaTestSuite/Issue137.js"),
|
|
require("../ZSchemaTestSuite/Issue139.js"),
|
|
require("../ZSchemaTestSuite/Issue142.js"),
|
|
require("../ZSchemaTestSuite/Issue146.js"),
|
|
require("../ZSchemaTestSuite/Issue151.js"),
|
|
require("../ZSchemaTestSuite/Issue199.js"),
|
|
require("../ZSchemaTestSuite/Issue209.js"),
|
|
require("../ZSchemaTestSuite/Issue222.js"),
|
|
require("../ZSchemaTestSuite/Issue229.js"),
|
|
require("../ZSchemaTestSuite/Issue250.js"),
|
|
|
|
undefined
|
|
];
|
|
|
|
describe("ZSchemaTestSuite", function () {
|
|
|
|
var idx = testSuiteFiles.length;
|
|
while (idx--) {
|
|
if (testSuiteFiles[idx] == null) {
|
|
testSuiteFiles.splice(idx, 1);
|
|
}
|
|
}
|
|
|
|
it("should contain 74 files", function () {
|
|
expect(testSuiteFiles.length).toBe(74);
|
|
});
|
|
|
|
testSuiteFiles.forEach(function (testSuite) {
|
|
|
|
testSuite.tests.forEach(function (test) {
|
|
|
|
var data = test.data;
|
|
if (typeof data === "undefined") {
|
|
data = testSuite.data;
|
|
}
|
|
|
|
var validateOptions = test.validateOptions;
|
|
if (typeof validateOptions === "undefined") {
|
|
validateOptions = testSuite.validateOptions;
|
|
}
|
|
|
|
var async = test.async || testSuite.async || false,
|
|
options = test.options || testSuite.options || undefined,
|
|
setup = test.setup || testSuite.setup,
|
|
schema = test.schema || testSuite.schema,
|
|
schemaIndex = test.schemaIndex || testSuite.schemaIndex || 0,
|
|
after = test.after || testSuite.after,
|
|
validateSchemaOnly = test.validateSchemaOnly || testSuite.validateSchemaOnly,
|
|
failWithException = test.failWithException || testSuite.failWithException;
|
|
|
|
!async && it(testSuite.description + ", " + test.description, function () {
|
|
|
|
ZSchema.setSchemaReader(null);
|
|
|
|
var validator = new ZSchema(options);
|
|
var caughtErr;
|
|
|
|
if (setup) { setup(validator, ZSchema); }
|
|
|
|
var valid;
|
|
try {
|
|
valid = validator.validateSchema(schema);
|
|
} catch (err) {
|
|
if (!failWithException) {
|
|
throw err;
|
|
}
|
|
caughtErr = err;
|
|
}
|
|
|
|
if (valid && !validateSchemaOnly) {
|
|
if (Array.isArray(schema)) {
|
|
schema = schema[schemaIndex];
|
|
}
|
|
try {
|
|
valid = validator.validate(data, schema, validateOptions);
|
|
} catch (err) {
|
|
if (!failWithException) {
|
|
throw err;
|
|
}
|
|
caughtErr = err;
|
|
}
|
|
}
|
|
|
|
var err = caughtErr || validator.getLastErrors();
|
|
|
|
if (failWithException) {
|
|
expect(caughtErr).toBeTruthy();
|
|
} else {
|
|
expect(typeof valid).toBe("boolean", "returned response is not a boolean");
|
|
expect(valid).toBe(test.valid, "test result doesn't match expected test result");
|
|
}
|
|
|
|
if (test.valid === true) {
|
|
expect(err).toBe(null, "errors are not undefined when test is valid");
|
|
}
|
|
|
|
if (after) {
|
|
after(err, valid, data, validator);
|
|
}
|
|
|
|
});
|
|
|
|
async && it(testSuite.description + ", " + test.description, function (done) {
|
|
|
|
var validator = new ZSchema(options);
|
|
if (setup) { setup(validator, ZSchema); }
|
|
|
|
// see http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony
|
|
var zalgo = false;
|
|
|
|
var result = validator.validate(data, schema, function (err, valid) {
|
|
// make sure callback wasn't called synchronously
|
|
expect(zalgo).toBe(true, "callback was fired in synchronous way");
|
|
expect(typeof valid).toBe("boolean", "returned response is not a boolean");
|
|
expect(valid).toBe(test.valid, "test result doesn't match expected test result");
|
|
if (test.valid === true) {
|
|
expect(err).toBe(null, "errors are not undefined when test is valid");
|
|
}
|
|
if (after) {
|
|
after(err, valid, data);
|
|
}
|
|
done();
|
|
|
|
});
|
|
|
|
// never return anything when callback is specified
|
|
expect(result).toBe(undefined, "validator returned something else than undefined in callback mode");
|
|
zalgo = true;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
},{"../../src/ZSchema":150,"../ZSchemaTestSuite/AssumeAdditional.js":153,"../ZSchemaTestSuite/CustomFormats.js":154,"../ZSchemaTestSuite/CustomFormatsAsync.js":155,"../ZSchemaTestSuite/CustomValidator.js":156,"../ZSchemaTestSuite/ErrorPathAsArray.js":157,"../ZSchemaTestSuite/ErrorPathAsJSONPointer.js":158,"../ZSchemaTestSuite/ErrorPathContainsIntegerIndex.js":159,"../ZSchemaTestSuite/ForceAdditional.js":160,"../ZSchemaTestSuite/ForceItems.js":161,"../ZSchemaTestSuite/ForceMaxItems.js":162,"../ZSchemaTestSuite/ForceMaxLength.js":163,"../ZSchemaTestSuite/ForceMinItems.js":164,"../ZSchemaTestSuite/ForceMinLength.js":165,"../ZSchemaTestSuite/ForceProperties.js":166,"../ZSchemaTestSuite/IgnoreUnresolvableReferences.js":167,"../ZSchemaTestSuite/IncludeErrors.js":168,"../ZSchemaTestSuite/InvalidId.js":169,"../ZSchemaTestSuite/Issue101.js":170,"../ZSchemaTestSuite/Issue102.js":171,"../ZSchemaTestSuite/Issue103.js":172,"../ZSchemaTestSuite/Issue106.js":173,"../ZSchemaTestSuite/Issue107.js":174,"../ZSchemaTestSuite/Issue12.js":175,"../ZSchemaTestSuite/Issue121.js":176,"../ZSchemaTestSuite/Issue125.js":177,"../ZSchemaTestSuite/Issue126.js":178,"../ZSchemaTestSuite/Issue13.js":179,"../ZSchemaTestSuite/Issue130.js":180,"../ZSchemaTestSuite/Issue131.js":181,"../ZSchemaTestSuite/Issue137.js":182,"../ZSchemaTestSuite/Issue139.js":183,"../ZSchemaTestSuite/Issue142.js":184,"../ZSchemaTestSuite/Issue146.js":185,"../ZSchemaTestSuite/Issue151.js":186,"../ZSchemaTestSuite/Issue16.js":187,"../ZSchemaTestSuite/Issue199.js":188,"../ZSchemaTestSuite/Issue209.js":189,"../ZSchemaTestSuite/Issue22.js":190,"../ZSchemaTestSuite/Issue222.js":191,"../ZSchemaTestSuite/Issue229.js":192,"../ZSchemaTestSuite/Issue25.js":193,"../ZSchemaTestSuite/Issue250.js":194,"../ZSchemaTestSuite/Issue26.js":195,"../ZSchemaTestSuite/Issue37.js":196,"../ZSchemaTestSuite/Issue40.js":197,"../ZSchemaTestSuite/Issue41.js":198,"../ZSchemaTestSuite/Issue43.js":199,"../ZSchemaTestSuite/Issue44.js":200,"../ZSchemaTestSuite/Issue45.js":201,"../ZSchemaTestSuite/Issue47.js":202,"../ZSchemaTestSuite/Issue48.js":203,"../ZSchemaTestSuite/Issue49.js":204,"../ZSchemaTestSuite/Issue53.js":205,"../ZSchemaTestSuite/Issue56.js":206,"../ZSchemaTestSuite/Issue57.js":207,"../ZSchemaTestSuite/Issue58.js":208,"../ZSchemaTestSuite/Issue63.js":209,"../ZSchemaTestSuite/Issue64.js":210,"../ZSchemaTestSuite/Issue67.js":211,"../ZSchemaTestSuite/Issue71.js":212,"../ZSchemaTestSuite/Issue73.js":213,"../ZSchemaTestSuite/Issue76.js":214,"../ZSchemaTestSuite/Issue85.js":215,"../ZSchemaTestSuite/Issue94.js":216,"../ZSchemaTestSuite/Issue96.js":217,"../ZSchemaTestSuite/Issue98.js":218,"../ZSchemaTestSuite/MultipleSchemas.js":219,"../ZSchemaTestSuite/NoEmptyArrays.js":220,"../ZSchemaTestSuite/NoEmptyStrings.js":221,"../ZSchemaTestSuite/NoExtraKeywords.js":222,"../ZSchemaTestSuite/NoTypeless.js":223,"../ZSchemaTestSuite/PedanticCheck.js":224,"../ZSchemaTestSuite/StrictUris.js":225,"../ZSchemaTestSuite/getRegisteredFormats.js":230}],270:[function(require,module,exports){
|
|
"use strict";
|
|
|
|
var ZSchema = require("../../src/ZSchema");
|
|
var validator = new ZSchema();
|
|
var schema = {
|
|
"type": [
|
|
"object"
|
|
],
|
|
"definitions": {
|
|
"car": {
|
|
"title": "Car",
|
|
"description": "It's a car",
|
|
"stability": "prototype",
|
|
"strictProperties": true,
|
|
"type": [
|
|
"object"
|
|
],
|
|
"definitions": {
|
|
"id": {
|
|
"description": "unique identifier of car",
|
|
"readOnly": true,
|
|
"type": [
|
|
"string"
|
|
]
|
|
},
|
|
"car": {
|
|
"description": "Car object",
|
|
"type": [
|
|
"object"
|
|
],
|
|
"properties": {
|
|
"brand": {
|
|
"description": "Car brand",
|
|
"type": [
|
|
"string"
|
|
]
|
|
},
|
|
"engine": {
|
|
"description": "Car engine",
|
|
"type": [
|
|
"string"
|
|
]
|
|
}
|
|
}
|
|
},
|
|
"cars": {
|
|
"description": "Collection of cars",
|
|
"type": [
|
|
"array"
|
|
],
|
|
"items": {
|
|
"$ref": "#/definitions/car/definitions/car"
|
|
}
|
|
},
|
|
"identity": {
|
|
"$ref": "#/definitions/car/definitions/id"
|
|
}
|
|
},
|
|
"links": [],
|
|
"properties": {
|
|
"id": {
|
|
"$ref": "#/definitions/car/definitions/id"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"properties": {
|
|
"car": {
|
|
"$ref": "#/definitions/car"
|
|
}
|
|
},
|
|
"description": "Car API",
|
|
"id": "cars",
|
|
"links": [{
|
|
"href": "https://example.com/schema",
|
|
"rel": "self"
|
|
}],
|
|
"title": "Car API"
|
|
};
|
|
|
|
describe("Using path to schema as a third argument", function () {
|
|
|
|
it("Should pass the test", function () {
|
|
|
|
var cars = [
|
|
{
|
|
"brand": "Lexus",
|
|
"engine": "big"
|
|
}
|
|
];
|
|
var valid = validator.validate(cars, schema, { schemaPath: "definitions.car.definitions.cars" });
|
|
expect(valid).toBe(true);
|
|
expect(validator.getLastError()).toBe(null);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
},{"../../src/ZSchema":150}]},{},[265,266,267,268,270,269]);
|
|
|