| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444 | 'use strict';/** Highest positive signed 32-bit float value */const maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1/** Bootstring parameters */const base = 36;const tMin = 1;const tMax = 26;const skew = 38;const damp = 700;const initialBias = 72;const initialN = 128; // 0x80const delimiter = '-'; // '\x2D'/** Regular expressions */const regexPunycode = /^xn--/;const regexNonASCII = /[^\0-\x7F]/; // Note: U+007F DEL is excluded too.const regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g; // RFC 3490 separators/** Error messages */const 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 */const baseMinusTMin = base - tMin;const floor = Math.floor;const stringFromCharCode = String.fromCharCode;/*--------------------------------------------------------------------------*//** * 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, callback) {	const result = [];	let length = array.length;	while (length--) {		result[length] = callback(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 {String} A new string of characters returned by the callback * function. */function mapDomain(domain, callback) {	const parts = domain.split('@');	let 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] + '@';		domain = parts[1];	}	// Avoid `split(regex)` for IE8 compatibility. See #17.	domain = domain.replace(regexSeparators, '\x2E');	const labels = domain.split('.');	const encoded = map(labels, callback).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) {	const output = [];	let counter = 0;	const length = string.length;	while (counter < length) {		const value = string.charCodeAt(counter++);		if (value >= 0xD800 && value <= 0xDBFF && counter < length) {			// It's a high surrogate, and there is a next character.			const extra = string.charCodeAt(counter++);			if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.				output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);			} else {				// It's an 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). */const ucs2encode = codePoints => String.fromCodePoint(...codePoints);/** * 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. */const basicToDigit = function(codePoint) {	if (codePoint >= 0x30 && codePoint < 0x3A) {		return 26 + (codePoint - 0x30);	}	if (codePoint >= 0x41 && codePoint < 0x5B) {		return codePoint - 0x41;	}	if (codePoint >= 0x61 && codePoint < 0x7B) {		return codePoint - 0x61;	}	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. */const digitToBasic = function(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 */const adapt = function(delta, numPoints, firstTime) {	let 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. */const decode = function(input) {	// Don't use UCS-2.	const output = [];	const inputLength = input.length;	let i = 0;	let n = initialN;	let bias = initialBias;	// 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.	let basic = input.lastIndexOf(delimiter);	if (basic < 0) {		basic = 0;	}	for (let 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 (let 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`.		const oldi = i;		for (let w = 1, k = base; /* no condition */; k += base) {			if (index >= inputLength) {				error('invalid-input');			}			const digit = basicToDigit(input.charCodeAt(index++));			if (digit >= base) {				error('invalid-input');			}			if (digit > floor((maxInt - i) / w)) {				error('overflow');			}			i += digit * w;			const t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);			if (digit < t) {				break;			}			const baseMinusT = base - t;			if (w > floor(maxInt / baseMinusT)) {				error('overflow');			}			w *= baseMinusT;		}		const 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 String.fromCodePoint(...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. */const encode = function(input) {	const output = [];	// Convert the input in UCS-2 to an array of Unicode code points.	input = ucs2decode(input);	// Cache the length.	const inputLength = input.length;	// Initialize the state.	let n = initialN;	let delta = 0;	let bias = initialBias;	// Handle the basic code points.	for (const currentValue of input) {		if (currentValue < 0x80) {			output.push(stringFromCharCode(currentValue));		}	}	const basicLength = output.length;	let handledCPCount = basicLength;	// `handledCPCount` is the number of code points that have been handled;	// `basicLength` is the number of basic code points.	// Finish the basic string with a delimiter unless it's empty.	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:		let m = maxInt;		for (const currentValue of input) {			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.		const handledCPCountPlusOne = handledCPCount + 1;		if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {			error('overflow');		}		delta += (m - n) * handledCPCountPlusOne;		n = m;		for (const currentValue of input) {			if (currentValue < n && ++delta > maxInt) {				error('overflow');			}			if (currentValue === n) {				// Represent delta as a generalized variable-length integer.				let q = delta;				for (let k = base; /* no condition */; k += base) {					const t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);					if (q < t) {						break;					}					const qMinusT = q - t;					const 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. */const toUnicode = function(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. */const toASCII = function(input) {	return mapDomain(input, function(string) {		return regexNonASCII.test(string)			? 'xn--' + encode(string)			: string;	});};/*--------------------------------------------------------------------------*//** Define the public API */const punycode = {	/**	 * A string representing the current Punycode.js version number.	 * @memberOf punycode	 * @type String	 */	'version': '2.3.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};export { ucs2decode, ucs2encode, decode, encode, toASCII, toUnicode };export default punycode;
 |