Comparing version 3.19.1 to 3.19.2
@@ -20,3 +20,3 @@ 'use strict'; | ||
var arrayFill = require('../internals/array-fill'); | ||
var arraySlice = require('../internals/array-slice'); | ||
var arraySlice = require('../internals/array-slice-simple'); | ||
var setToStringTag = require('../internals/set-to-string-tag'); | ||
@@ -23,0 +23,0 @@ var InternalStateModule = require('../internals/internal-state'); |
@@ -1,2 +0,2 @@ | ||
var arraySlice = require('../internals/array-slice'); | ||
var arraySlice = require('../internals/array-slice-simple'); | ||
@@ -3,0 +3,0 @@ var floor = Math.floor; |
var uncurryThis = require('../internals/function-uncurry-this'); | ||
var arraySlice = require('../internals/array-slice'); | ||
var arraySlice = require('../internals/array-slice-simple'); | ||
@@ -4,0 +4,0 @@ var replace = uncurryThis(''.replace); |
@@ -28,3 +28,4 @@ // IEEE754 conversions based on https://github.com/feross/ieee754 | ||
exponent = floor(log(number) / LN2); | ||
if (number * (c = pow(2, -exponent)) < 1) { | ||
c = pow(2, -exponent); | ||
if (number * c < 1) { | ||
exponent--; | ||
@@ -53,6 +54,14 @@ c *= 2; | ||
} | ||
for (; mantissaLength >= 8; buffer[index++] = mantissa & 255, mantissa /= 256, mantissaLength -= 8); | ||
while (mantissaLength >= 8) { | ||
buffer[index++] = mantissa & 255; | ||
mantissa /= 256; | ||
mantissaLength -= 8; | ||
} | ||
exponent = exponent << mantissaLength | mantissa; | ||
exponentLength += mantissaLength; | ||
for (; exponentLength > 0; buffer[index++] = exponent & 255, exponent /= 256, exponentLength -= 8); | ||
while (exponentLength > 0) { | ||
buffer[index++] = exponent & 255; | ||
exponent /= 256; | ||
exponentLength -= 8; | ||
} | ||
buffer[--index] |= sign * 128; | ||
@@ -73,7 +82,13 @@ return buffer; | ||
sign >>= 7; | ||
for (; nBits > 0; exponent = exponent * 256 + buffer[index], index--, nBits -= 8); | ||
while (nBits > 0) { | ||
exponent = exponent * 256 + buffer[index--]; | ||
nBits -= 8; | ||
} | ||
mantissa = exponent & (1 << -nBits) - 1; | ||
exponent >>= -nBits; | ||
nBits += mantissaLength; | ||
for (; nBits > 0; mantissa = mantissa * 256 + buffer[index], index--, nBits -= 8); | ||
while (nBits > 0) { | ||
mantissa = mantissa * 256 + buffer[index--]; | ||
nBits -= 8; | ||
} | ||
if (exponent === 0) { | ||
@@ -80,0 +95,0 @@ exponent = 1 - eBias; |
@@ -5,3 +5,3 @@ /* eslint-disable es/no-object-getownpropertynames -- safe */ | ||
var $getOwnPropertyNames = require('../internals/object-get-own-property-names').f; | ||
var arraySlice = require('../internals/array-slice'); | ||
var arraySlice = require('../internals/array-slice-simple'); | ||
@@ -8,0 +8,0 @@ var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames |
@@ -31,3 +31,3 @@ 'use strict'; | ||
var UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y || stickyHelpers.BROKEN_CARET; | ||
var UNSUPPORTED_Y = stickyHelpers.BROKEN_CARET; | ||
@@ -40,3 +40,2 @@ // nonparticipating capturing group, copied from es5-shim's String#split patch. | ||
if (PATCH) { | ||
// eslint-disable-next-line max-statements -- TODO | ||
patchedExec = function exec(string) { | ||
@@ -43,0 +42,0 @@ var re = this; |
@@ -7,3 +7,3 @@ var fails = require('../internals/fails'); | ||
exports.UNSUPPORTED_Y = fails(function () { | ||
var UNSUPPORTED_Y = fails(function () { | ||
var re = $RegExp('a', 'y'); | ||
@@ -14,3 +14,9 @@ re.lastIndex = 2; | ||
exports.BROKEN_CARET = fails(function () { | ||
// UC Browser bug | ||
// https://github.com/zloirock/core-js/issues/1008 | ||
var MISSED_STICKY = UNSUPPORTED_Y || fails(function () { | ||
return !$RegExp('a', 'y').sticky; | ||
}); | ||
var BROKEN_CARET = UNSUPPORTED_Y || fails(function () { | ||
// https://bugzilla.mozilla.org/show_bug.cgi?id=773687 | ||
@@ -21,1 +27,7 @@ var re = $RegExp('^r', 'gy'); | ||
}); | ||
module.exports = { | ||
BROKEN_CARET: BROKEN_CARET, | ||
MISSED_STICKY: MISSED_STICKY, | ||
UNSUPPORTED_Y: UNSUPPORTED_Y | ||
}; |
@@ -7,5 +7,5 @@ var IS_PURE = require('../internals/is-pure'); | ||
})('versions', []).push({ | ||
version: '3.19.1', | ||
version: '3.19.2', | ||
mode: IS_PURE ? 'pure' : 'global', | ||
copyright: '© 2021 Denis Pushkarev (zloirock.ru)' | ||
}); |
@@ -79,4 +79,5 @@ 'use strict'; | ||
delta += floor(delta / numPoints); | ||
for (; delta > baseMinusTMin * tMax >> 1; k += base) { | ||
while (delta > baseMinusTMin * tMax >> 1) { | ||
delta = floor(delta / baseMinusTMin); | ||
k += base; | ||
} | ||
@@ -90,3 +91,2 @@ return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); | ||
*/ | ||
// eslint-disable-next-line max-statements -- TODO | ||
var encode = function (input) { | ||
@@ -151,3 +151,4 @@ var output = []; | ||
var q = delta; | ||
for (var k = base; /* no condition */; k += base) { | ||
var k = base; | ||
while (true) { | ||
var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); | ||
@@ -159,2 +160,3 @@ if (q < t) break; | ||
q = floor(qMinusT / baseMinusT); | ||
k += base; | ||
} | ||
@@ -165,8 +167,8 @@ | ||
delta = 0; | ||
++handledCPCount; | ||
handledCPCount++; | ||
} | ||
} | ||
++delta; | ||
++n; | ||
delta++; | ||
n++; | ||
} | ||
@@ -173,0 +175,0 @@ return join(output, ''); |
@@ -8,3 +8,3 @@ var DESCRIPTORS = require('../internals/descriptors'); | ||
var functionToString = uncurryThis(FunctionPrototype.toString); | ||
var nameRE = /^\s*function ([^ (]*)/; | ||
var nameRE = /function\b(?:\s|\/\*[\S\s]*?\*\/|\/\/[^\n\r]*[\n\r]+)*([^\s(/]*)/; | ||
var regExpExec = uncurryThis(nameRE.exec); | ||
@@ -11,0 +11,0 @@ var NAME = 'name'; |
@@ -41,6 +41,7 @@ var DESCRIPTORS = require('../internals/descriptors'); | ||
var MISSED_STICKY = stickyHelpers.MISSED_STICKY; | ||
var UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y; | ||
var BASE_FORCED = DESCRIPTORS && | ||
(!CORRECT_NEW || UNSUPPORTED_Y || UNSUPPORTED_DOT_ALL || UNSUPPORTED_NCG || fails(function () { | ||
(!CORRECT_NEW || MISSED_STICKY || UNSUPPORTED_DOT_ALL || UNSUPPORTED_NCG || fails(function () { | ||
re2[MATCH] = false; | ||
@@ -150,5 +151,5 @@ // RegExp constructor can alter flags and IsRegExp works correct with @@match | ||
if (UNSUPPORTED_Y && 'sticky' in re1) { | ||
if (MISSED_STICKY && 'sticky' in re1) { | ||
sticky = !!flags && stringIndexOf(flags, 'y') > -1; | ||
if (sticky) flags = replace(flags, /y/g, ''); | ||
if (sticky && UNSUPPORTED_Y) flags = replace(flags, /y/g, ''); | ||
} | ||
@@ -155,0 +156,0 @@ |
var global = require('../internals/global'); | ||
var DESCRIPTORS = require('../internals/descriptors'); | ||
var UNSUPPORTED_Y = require('../internals/regexp-sticky-helpers').UNSUPPORTED_Y; | ||
var MISSED_STICKY = require('../internals/regexp-sticky-helpers').MISSED_STICKY; | ||
var classof = require('../internals/classof-raw'); | ||
@@ -13,3 +13,3 @@ var defineProperty = require('../internals/object-define-property').f; | ||
// https://tc39.es/ecma262/#sec-get-regexp.prototype.sticky | ||
if (DESCRIPTORS && UNSUPPORTED_Y) { | ||
if (DESCRIPTORS && MISSED_STICKY) { | ||
defineProperty(RegExpPrototype, 'sticky', { | ||
@@ -16,0 +16,0 @@ configurable: true, |
@@ -14,3 +14,3 @@ 'use strict'; | ||
var getMethod = require('../internals/get-method'); | ||
var arraySlice = require('../internals/array-slice'); | ||
var arraySlice = require('../internals/array-slice-simple'); | ||
var callRegExpExec = require('../internals/regexp-exec-abstract'); | ||
@@ -17,0 +17,0 @@ var regexpExec = require('../internals/regexp-exec'); |
@@ -102,25 +102,2 @@ 'use strict'; | ||
var parseSearchParams = function (result, query) { | ||
if (query) { | ||
var attributes = split(query, '&'); | ||
var index = 0; | ||
var attribute, entry; | ||
while (index < attributes.length) { | ||
attribute = attributes[index++]; | ||
if (attribute.length) { | ||
entry = split(attribute, '='); | ||
push(result, { | ||
key: deserialize(shift(entry)), | ||
value: deserialize(join(entry, '=')) | ||
}); | ||
} | ||
} | ||
} | ||
}; | ||
var updateSearchParams = function (query) { | ||
this.entries.length = 0; | ||
parseSearchParams(this.entries, query); | ||
}; | ||
var validateArgumentsLength = function (passed, required) { | ||
@@ -146,44 +123,83 @@ if (passed < required) throw TypeError('Not enough arguments'); | ||
// `URLSearchParams` constructor | ||
// https://url.spec.whatwg.org/#interface-urlsearchparams | ||
var URLSearchParamsConstructor = function URLSearchParams(/* init */) { | ||
anInstance(this, URLSearchParamsPrototype); | ||
var init = arguments.length > 0 ? arguments[0] : undefined; | ||
var that = this; | ||
var entries = []; | ||
var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key; | ||
var URLSearchParamsState = function (init) { | ||
this.entries = []; | ||
this.url = null; | ||
setInternalState(that, { | ||
type: URL_SEARCH_PARAMS, | ||
entries: entries, | ||
updateURL: function () { /* empty */ }, | ||
updateSearchParams: updateSearchParams | ||
}); | ||
if (init !== undefined) { | ||
if (isObject(init)) this.parseObject(init); | ||
else this.parseQuery(typeof init == 'string' ? charAt(init, 0) === '?' ? stringSlice(init, 1) : init : $toString(init)); | ||
} | ||
}; | ||
if (init !== undefined) { | ||
if (isObject(init)) { | ||
iteratorMethod = getIteratorMethod(init); | ||
if (iteratorMethod) { | ||
iterator = getIterator(init, iteratorMethod); | ||
next = iterator.next; | ||
while (!(step = call(next, iterator)).done) { | ||
entryIterator = getIterator(anObject(step.value)); | ||
entryNext = entryIterator.next; | ||
if ( | ||
(first = call(entryNext, entryIterator)).done || | ||
(second = call(entryNext, entryIterator)).done || | ||
!call(entryNext, entryIterator).done | ||
) throw TypeError('Expected sequence with length 2'); | ||
push(entries, { key: $toString(first.value), value: $toString(second.value) }); | ||
URLSearchParamsState.prototype = { | ||
type: URL_SEARCH_PARAMS, | ||
bindURL: function (url) { | ||
this.url = url; | ||
this.update(); | ||
}, | ||
parseObject: function (object) { | ||
var iteratorMethod = getIteratorMethod(object); | ||
var iterator, next, step, entryIterator, entryNext, first, second; | ||
if (iteratorMethod) { | ||
iterator = getIterator(object, iteratorMethod); | ||
next = iterator.next; | ||
while (!(step = call(next, iterator)).done) { | ||
entryIterator = getIterator(anObject(step.value)); | ||
entryNext = entryIterator.next; | ||
if ( | ||
(first = call(entryNext, entryIterator)).done || | ||
(second = call(entryNext, entryIterator)).done || | ||
!call(entryNext, entryIterator).done | ||
) throw TypeError('Expected sequence with length 2'); | ||
push(this.entries, { key: $toString(first.value), value: $toString(second.value) }); | ||
} | ||
} else for (var key in object) if (hasOwn(object, key)) { | ||
push(this.entries, { key: key, value: $toString(object[key]) }); | ||
} | ||
}, | ||
parseQuery: function (query) { | ||
if (query) { | ||
var attributes = split(query, '&'); | ||
var index = 0; | ||
var attribute, entry; | ||
while (index < attributes.length) { | ||
attribute = attributes[index++]; | ||
if (attribute.length) { | ||
entry = split(attribute, '='); | ||
push(this.entries, { | ||
key: deserialize(shift(entry)), | ||
value: deserialize(join(entry, '=')) | ||
}); | ||
} | ||
} else for (key in init) if (hasOwn(init, key)) push(entries, { key: key, value: $toString(init[key]) }); | ||
} else { | ||
parseSearchParams( | ||
entries, | ||
typeof init == 'string' ? charAt(init, 0) === '?' ? stringSlice(init, 1) : init : $toString(init) | ||
); | ||
} | ||
} | ||
}, | ||
serialize: function () { | ||
var entries = this.entries; | ||
var result = []; | ||
var index = 0; | ||
var entry; | ||
while (index < entries.length) { | ||
entry = entries[index++]; | ||
push(result, serialize(entry.key) + '=' + serialize(entry.value)); | ||
} return join(result, '&'); | ||
}, | ||
update: function () { | ||
this.entries.length = 0; | ||
this.parseQuery(this.url.query); | ||
}, | ||
updateURL: function () { | ||
if (this.url) this.url.update(); | ||
} | ||
}; | ||
// `URLSearchParams` constructor | ||
// https://url.spec.whatwg.org/#interface-urlsearchparams | ||
var URLSearchParamsConstructor = function URLSearchParams(/* init */) { | ||
anInstance(this, URLSearchParamsPrototype); | ||
var init = arguments.length > 0 ? arguments[0] : undefined; | ||
setInternalState(this, new URLSearchParamsState(init)); | ||
}; | ||
var URLSearchParamsPrototype = URLSearchParamsConstructor.prototype; | ||
@@ -315,10 +331,3 @@ | ||
redefine(URLSearchParamsPrototype, 'toString', function toString() { | ||
var entries = getInternalParamsState(this).entries; | ||
var result = []; | ||
var index = 0; | ||
var entry; | ||
while (index < entries.length) { | ||
entry = entries[index++]; | ||
push(result, serialize(entry.key) + '=' + serialize(entry.value)); | ||
} return join(result, '&'); | ||
return getInternalParamsState(this).serialize(); | ||
}, { enumerable: true }); | ||
@@ -325,0 +334,0 @@ |
@@ -9,3 +9,2 @@ 'use strict'; | ||
var bind = require('../internals/function-bind-context'); | ||
var call = require('../internals/function-call'); | ||
var uncurryThis = require('../internals/function-uncurry-this'); | ||
@@ -18,3 +17,3 @@ var defineProperties = require('../internals/object-define-properties'); | ||
var arrayFrom = require('../internals/array-from'); | ||
var arraySlice = require('../internals/array-slice'); | ||
var arraySlice = require('../internals/array-slice-simple'); | ||
var codeAt = require('../internals/string-multibyte').codeAt; | ||
@@ -71,27 +70,3 @@ var toASCII = require('../internals/string-punycode-to-ascii'); | ||
var parseHost = function (url, input) { | ||
var result, codePoints, index; | ||
if (charAt(input, 0) == '[') { | ||
if (charAt(input, input.length - 1) != ']') return INVALID_HOST; | ||
result = parseIPv6(stringSlice(input, 1, -1)); | ||
if (!result) return INVALID_HOST; | ||
url.host = result; | ||
// opaque host | ||
} else if (!isSpecial(url)) { | ||
if (exec(FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT, input)) return INVALID_HOST; | ||
result = ''; | ||
codePoints = arrayFrom(input); | ||
for (index = 0; index < codePoints.length; index++) { | ||
result += percentEncode(codePoints[index], C0ControlPercentEncodeSet); | ||
} | ||
url.host = result; | ||
} else { | ||
input = toASCII(input); | ||
if (exec(FORBIDDEN_HOST_CODE_POINT, input)) return INVALID_HOST; | ||
result = parseIPv4(input); | ||
if (result === null) return INVALID_HOST; | ||
url.host = result; | ||
} | ||
}; | ||
// https://url.spec.whatwg.org/#ipv4-number-parser | ||
var parseIPv4 = function (input) { | ||
@@ -135,2 +110,3 @@ var parts = split(input, '.'); | ||
// https://url.spec.whatwg.org/#concept-ipv6-parser | ||
// eslint-disable-next-line max-statements -- TODO | ||
@@ -239,2 +215,3 @@ var parseIPv6 = function (input) { | ||
// https://url.spec.whatwg.org/#host-serializing | ||
var serializeHost = function (host) { | ||
@@ -284,2 +261,3 @@ var result, index, compress, ignore0; | ||
// https://url.spec.whatwg.org/#special-scheme | ||
var specialSchemes = { | ||
@@ -294,14 +272,3 @@ ftp: 21, | ||
var isSpecial = function (url) { | ||
return hasOwn(specialSchemes, url.scheme); | ||
}; | ||
var includesCredentials = function (url) { | ||
return url.username != '' || url.password != ''; | ||
}; | ||
var cannotHaveUsernamePasswordPort = function (url) { | ||
return !url.host || url.cannotBeABaseURL || url.scheme == 'file'; | ||
}; | ||
// https://url.spec.whatwg.org/#windows-drive-letter | ||
var isWindowsDriveLetter = function (string, normalized) { | ||
@@ -313,2 +280,3 @@ var second; | ||
// https://url.spec.whatwg.org/#start-with-a-windows-drive-letter | ||
var startsWithWindowsDriveLetter = function (string) { | ||
@@ -322,10 +290,3 @@ var third; | ||
var shortenURLsPath = function (url) { | ||
var path = url.path; | ||
var pathSize = path.length; | ||
if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) { | ||
path.length--; | ||
} | ||
}; | ||
// https://url.spec.whatwg.org/#single-dot-path-segment | ||
var isSingleDot = function (segment) { | ||
@@ -335,2 +296,3 @@ return segment === '.' || toLowerCase(segment) === '%2e'; | ||
// https://url.spec.whatwg.org/#double-dot-path-segment | ||
var isDoubleDot = function (segment) { | ||
@@ -364,263 +326,150 @@ segment = toLowerCase(segment); | ||
// eslint-disable-next-line max-statements -- TODO | ||
var parseURL = function (url, input, stateOverride, base) { | ||
var state = stateOverride || SCHEME_START; | ||
var pointer = 0; | ||
var buffer = ''; | ||
var seenAt = false; | ||
var seenBracket = false; | ||
var seenPasswordToken = false; | ||
var codePoints, chr, bufferCodePoints, failure; | ||
if (!stateOverride) { | ||
url.scheme = ''; | ||
url.username = ''; | ||
url.password = ''; | ||
url.host = null; | ||
url.port = null; | ||
url.path = []; | ||
url.query = null; | ||
url.fragment = null; | ||
url.cannotBeABaseURL = false; | ||
input = replace(input, LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, ''); | ||
var URLState = function (url, isBase, base) { | ||
var urlString = $toString(url); | ||
var baseState, failure, searchParams; | ||
if (isBase) { | ||
failure = this.parse(urlString); | ||
if (failure) throw TypeError(failure); | ||
this.searchParams = null; | ||
} else { | ||
if (base !== undefined) baseState = new URLState(base, true); | ||
failure = this.parse(urlString, null, baseState); | ||
if (failure) throw TypeError(failure); | ||
searchParams = getInternalSearchParamsState(new URLSearchParams()); | ||
searchParams.bindURL(this); | ||
this.searchParams = searchParams; | ||
} | ||
}; | ||
input = replace(input, TAB_AND_NEW_LINE, ''); | ||
URLState.prototype = { | ||
type: 'URL', | ||
// https://url.spec.whatwg.org/#url-parsing | ||
// eslint-disable-next-line max-statements -- TODO | ||
parse: function (input, stateOverride, base) { | ||
var url = this; | ||
var state = stateOverride || SCHEME_START; | ||
var pointer = 0; | ||
var buffer = ''; | ||
var seenAt = false; | ||
var seenBracket = false; | ||
var seenPasswordToken = false; | ||
var codePoints, chr, bufferCodePoints, failure; | ||
codePoints = arrayFrom(input); | ||
input = $toString(input); | ||
while (pointer <= codePoints.length) { | ||
chr = codePoints[pointer]; | ||
switch (state) { | ||
case SCHEME_START: | ||
if (chr && exec(ALPHA, chr)) { | ||
buffer += toLowerCase(chr); | ||
state = SCHEME; | ||
} else if (!stateOverride) { | ||
state = NO_SCHEME; | ||
continue; | ||
} else return INVALID_SCHEME; | ||
break; | ||
if (!stateOverride) { | ||
url.scheme = ''; | ||
url.username = ''; | ||
url.password = ''; | ||
url.host = null; | ||
url.port = null; | ||
url.path = []; | ||
url.query = null; | ||
url.fragment = null; | ||
url.cannotBeABaseURL = false; | ||
input = replace(input, LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, ''); | ||
} | ||
case SCHEME: | ||
if (chr && (exec(ALPHANUMERIC, chr) || chr == '+' || chr == '-' || chr == '.')) { | ||
buffer += toLowerCase(chr); | ||
} else if (chr == ':') { | ||
if (stateOverride && ( | ||
(isSpecial(url) != hasOwn(specialSchemes, buffer)) || | ||
(buffer == 'file' && (includesCredentials(url) || url.port !== null)) || | ||
(url.scheme == 'file' && !url.host) | ||
)) return; | ||
url.scheme = buffer; | ||
if (stateOverride) { | ||
if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null; | ||
return; | ||
} | ||
buffer = ''; | ||
if (url.scheme == 'file') { | ||
state = FILE; | ||
} else if (isSpecial(url) && base && base.scheme == url.scheme) { | ||
state = SPECIAL_RELATIVE_OR_AUTHORITY; | ||
} else if (isSpecial(url)) { | ||
state = SPECIAL_AUTHORITY_SLASHES; | ||
} else if (codePoints[pointer + 1] == '/') { | ||
state = PATH_OR_AUTHORITY; | ||
pointer++; | ||
} else { | ||
url.cannotBeABaseURL = true; | ||
push(url.path, ''); | ||
state = CANNOT_BE_A_BASE_URL_PATH; | ||
} | ||
} else if (!stateOverride) { | ||
buffer = ''; | ||
state = NO_SCHEME; | ||
pointer = 0; | ||
continue; | ||
} else return INVALID_SCHEME; | ||
break; | ||
input = replace(input, TAB_AND_NEW_LINE, ''); | ||
case NO_SCHEME: | ||
if (!base || (base.cannotBeABaseURL && chr != '#')) return INVALID_SCHEME; | ||
if (base.cannotBeABaseURL && chr == '#') { | ||
url.scheme = base.scheme; | ||
url.path = arraySlice(base.path); | ||
url.query = base.query; | ||
url.fragment = ''; | ||
url.cannotBeABaseURL = true; | ||
state = FRAGMENT; | ||
codePoints = arrayFrom(input); | ||
while (pointer <= codePoints.length) { | ||
chr = codePoints[pointer]; | ||
switch (state) { | ||
case SCHEME_START: | ||
if (chr && exec(ALPHA, chr)) { | ||
buffer += toLowerCase(chr); | ||
state = SCHEME; | ||
} else if (!stateOverride) { | ||
state = NO_SCHEME; | ||
continue; | ||
} else return INVALID_SCHEME; | ||
break; | ||
} | ||
state = base.scheme == 'file' ? FILE : RELATIVE; | ||
continue; | ||
case SPECIAL_RELATIVE_OR_AUTHORITY: | ||
if (chr == '/' && codePoints[pointer + 1] == '/') { | ||
state = SPECIAL_AUTHORITY_IGNORE_SLASHES; | ||
pointer++; | ||
} else { | ||
state = RELATIVE; | ||
continue; | ||
} break; | ||
case PATH_OR_AUTHORITY: | ||
if (chr == '/') { | ||
state = AUTHORITY; | ||
case SCHEME: | ||
if (chr && (exec(ALPHANUMERIC, chr) || chr == '+' || chr == '-' || chr == '.')) { | ||
buffer += toLowerCase(chr); | ||
} else if (chr == ':') { | ||
if (stateOverride && ( | ||
(url.isSpecial() != hasOwn(specialSchemes, buffer)) || | ||
(buffer == 'file' && (url.includesCredentials() || url.port !== null)) || | ||
(url.scheme == 'file' && !url.host) | ||
)) return; | ||
url.scheme = buffer; | ||
if (stateOverride) { | ||
if (url.isSpecial() && specialSchemes[url.scheme] == url.port) url.port = null; | ||
return; | ||
} | ||
buffer = ''; | ||
if (url.scheme == 'file') { | ||
state = FILE; | ||
} else if (url.isSpecial() && base && base.scheme == url.scheme) { | ||
state = SPECIAL_RELATIVE_OR_AUTHORITY; | ||
} else if (url.isSpecial()) { | ||
state = SPECIAL_AUTHORITY_SLASHES; | ||
} else if (codePoints[pointer + 1] == '/') { | ||
state = PATH_OR_AUTHORITY; | ||
pointer++; | ||
} else { | ||
url.cannotBeABaseURL = true; | ||
push(url.path, ''); | ||
state = CANNOT_BE_A_BASE_URL_PATH; | ||
} | ||
} else if (!stateOverride) { | ||
buffer = ''; | ||
state = NO_SCHEME; | ||
pointer = 0; | ||
continue; | ||
} else return INVALID_SCHEME; | ||
break; | ||
} else { | ||
state = PATH; | ||
continue; | ||
} | ||
case RELATIVE: | ||
url.scheme = base.scheme; | ||
if (chr == EOF) { | ||
url.username = base.username; | ||
url.password = base.password; | ||
url.host = base.host; | ||
url.port = base.port; | ||
url.path = arraySlice(base.path); | ||
url.query = base.query; | ||
} else if (chr == '/' || (chr == '\\' && isSpecial(url))) { | ||
state = RELATIVE_SLASH; | ||
} else if (chr == '?') { | ||
url.username = base.username; | ||
url.password = base.password; | ||
url.host = base.host; | ||
url.port = base.port; | ||
url.path = arraySlice(base.path); | ||
url.query = ''; | ||
state = QUERY; | ||
} else if (chr == '#') { | ||
url.username = base.username; | ||
url.password = base.password; | ||
url.host = base.host; | ||
url.port = base.port; | ||
url.path = arraySlice(base.path); | ||
url.query = base.query; | ||
url.fragment = ''; | ||
state = FRAGMENT; | ||
} else { | ||
url.username = base.username; | ||
url.password = base.password; | ||
url.host = base.host; | ||
url.port = base.port; | ||
url.path = arraySlice(base.path); | ||
url.path.length--; | ||
state = PATH; | ||
case NO_SCHEME: | ||
if (!base || (base.cannotBeABaseURL && chr != '#')) return INVALID_SCHEME; | ||
if (base.cannotBeABaseURL && chr == '#') { | ||
url.scheme = base.scheme; | ||
url.path = arraySlice(base.path); | ||
url.query = base.query; | ||
url.fragment = ''; | ||
url.cannotBeABaseURL = true; | ||
state = FRAGMENT; | ||
break; | ||
} | ||
state = base.scheme == 'file' ? FILE : RELATIVE; | ||
continue; | ||
} break; | ||
case RELATIVE_SLASH: | ||
if (isSpecial(url) && (chr == '/' || chr == '\\')) { | ||
state = SPECIAL_AUTHORITY_IGNORE_SLASHES; | ||
} else if (chr == '/') { | ||
state = AUTHORITY; | ||
} else { | ||
url.username = base.username; | ||
url.password = base.password; | ||
url.host = base.host; | ||
url.port = base.port; | ||
state = PATH; | ||
continue; | ||
} break; | ||
case SPECIAL_RELATIVE_OR_AUTHORITY: | ||
if (chr == '/' && codePoints[pointer + 1] == '/') { | ||
state = SPECIAL_AUTHORITY_IGNORE_SLASHES; | ||
pointer++; | ||
} else { | ||
state = RELATIVE; | ||
continue; | ||
} break; | ||
case SPECIAL_AUTHORITY_SLASHES: | ||
state = SPECIAL_AUTHORITY_IGNORE_SLASHES; | ||
if (chr != '/' || charAt(buffer, pointer + 1) != '/') continue; | ||
pointer++; | ||
break; | ||
case SPECIAL_AUTHORITY_IGNORE_SLASHES: | ||
if (chr != '/' && chr != '\\') { | ||
state = AUTHORITY; | ||
continue; | ||
} break; | ||
case AUTHORITY: | ||
if (chr == '@') { | ||
if (seenAt) buffer = '%40' + buffer; | ||
seenAt = true; | ||
bufferCodePoints = arrayFrom(buffer); | ||
for (var i = 0; i < bufferCodePoints.length; i++) { | ||
var codePoint = bufferCodePoints[i]; | ||
if (codePoint == ':' && !seenPasswordToken) { | ||
seenPasswordToken = true; | ||
continue; | ||
} | ||
var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet); | ||
if (seenPasswordToken) url.password += encodedCodePoints; | ||
else url.username += encodedCodePoints; | ||
case PATH_OR_AUTHORITY: | ||
if (chr == '/') { | ||
state = AUTHORITY; | ||
break; | ||
} else { | ||
state = PATH; | ||
continue; | ||
} | ||
buffer = ''; | ||
} else if ( | ||
chr == EOF || chr == '/' || chr == '?' || chr == '#' || | ||
(chr == '\\' && isSpecial(url)) | ||
) { | ||
if (seenAt && buffer == '') return INVALID_AUTHORITY; | ||
pointer -= arrayFrom(buffer).length + 1; | ||
buffer = ''; | ||
state = HOST; | ||
} else buffer += chr; | ||
break; | ||
case HOST: | ||
case HOSTNAME: | ||
if (stateOverride && url.scheme == 'file') { | ||
state = FILE_HOST; | ||
continue; | ||
} else if (chr == ':' && !seenBracket) { | ||
if (buffer == '') return INVALID_HOST; | ||
failure = parseHost(url, buffer); | ||
if (failure) return failure; | ||
buffer = ''; | ||
state = PORT; | ||
if (stateOverride == HOSTNAME) return; | ||
} else if ( | ||
chr == EOF || chr == '/' || chr == '?' || chr == '#' || | ||
(chr == '\\' && isSpecial(url)) | ||
) { | ||
if (isSpecial(url) && buffer == '') return INVALID_HOST; | ||
if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return; | ||
failure = parseHost(url, buffer); | ||
if (failure) return failure; | ||
buffer = ''; | ||
state = PATH_START; | ||
if (stateOverride) return; | ||
continue; | ||
} else { | ||
if (chr == '[') seenBracket = true; | ||
else if (chr == ']') seenBracket = false; | ||
buffer += chr; | ||
} break; | ||
case PORT: | ||
if (exec(DIGIT, chr)) { | ||
buffer += chr; | ||
} else if ( | ||
chr == EOF || chr == '/' || chr == '?' || chr == '#' || | ||
(chr == '\\' && isSpecial(url)) || | ||
stateOverride | ||
) { | ||
if (buffer != '') { | ||
var port = parseInt(buffer, 10); | ||
if (port > 0xFFFF) return INVALID_PORT; | ||
url.port = (isSpecial(url) && port === specialSchemes[url.scheme]) ? null : port; | ||
buffer = ''; | ||
} | ||
if (stateOverride) return; | ||
state = PATH_START; | ||
continue; | ||
} else return INVALID_PORT; | ||
break; | ||
case FILE: | ||
url.scheme = 'file'; | ||
if (chr == '/' || chr == '\\') state = FILE_SLASH; | ||
else if (base && base.scheme == 'file') { | ||
case RELATIVE: | ||
url.scheme = base.scheme; | ||
if (chr == EOF) { | ||
url.username = base.username; | ||
url.password = base.password; | ||
url.host = base.host; | ||
url.port = base.port; | ||
url.path = arraySlice(base.path); | ||
url.query = base.query; | ||
} else if (chr == '/' || (chr == '\\' && url.isSpecial())) { | ||
state = RELATIVE_SLASH; | ||
} else if (chr == '?') { | ||
url.username = base.username; | ||
url.password = base.password; | ||
url.host = base.host; | ||
url.port = base.port; | ||
url.path = arraySlice(base.path); | ||
@@ -630,3 +479,6 @@ url.query = ''; | ||
} else if (chr == '#') { | ||
url.username = base.username; | ||
url.password = base.password; | ||
url.host = base.host; | ||
url.port = base.port; | ||
url.path = arraySlice(base.path); | ||
@@ -637,89 +489,234 @@ url.query = base.query; | ||
} else { | ||
if (!startsWithWindowsDriveLetter(join(arraySlice(codePoints, pointer), ''))) { | ||
url.username = base.username; | ||
url.password = base.password; | ||
url.host = base.host; | ||
url.port = base.port; | ||
url.path = arraySlice(base.path); | ||
url.path.length--; | ||
state = PATH; | ||
continue; | ||
} break; | ||
case RELATIVE_SLASH: | ||
if (url.isSpecial() && (chr == '/' || chr == '\\')) { | ||
state = SPECIAL_AUTHORITY_IGNORE_SLASHES; | ||
} else if (chr == '/') { | ||
state = AUTHORITY; | ||
} else { | ||
url.username = base.username; | ||
url.password = base.password; | ||
url.host = base.host; | ||
url.port = base.port; | ||
state = PATH; | ||
continue; | ||
} break; | ||
case SPECIAL_AUTHORITY_SLASHES: | ||
state = SPECIAL_AUTHORITY_IGNORE_SLASHES; | ||
if (chr != '/' || charAt(buffer, pointer + 1) != '/') continue; | ||
pointer++; | ||
break; | ||
case SPECIAL_AUTHORITY_IGNORE_SLASHES: | ||
if (chr != '/' && chr != '\\') { | ||
state = AUTHORITY; | ||
continue; | ||
} break; | ||
case AUTHORITY: | ||
if (chr == '@') { | ||
if (seenAt) buffer = '%40' + buffer; | ||
seenAt = true; | ||
bufferCodePoints = arrayFrom(buffer); | ||
for (var i = 0; i < bufferCodePoints.length; i++) { | ||
var codePoint = bufferCodePoints[i]; | ||
if (codePoint == ':' && !seenPasswordToken) { | ||
seenPasswordToken = true; | ||
continue; | ||
} | ||
var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet); | ||
if (seenPasswordToken) url.password += encodedCodePoints; | ||
else url.username += encodedCodePoints; | ||
} | ||
buffer = ''; | ||
} else if ( | ||
chr == EOF || chr == '/' || chr == '?' || chr == '#' || | ||
(chr == '\\' && url.isSpecial()) | ||
) { | ||
if (seenAt && buffer == '') return INVALID_AUTHORITY; | ||
pointer -= arrayFrom(buffer).length + 1; | ||
buffer = ''; | ||
state = HOST; | ||
} else buffer += chr; | ||
break; | ||
case HOST: | ||
case HOSTNAME: | ||
if (stateOverride && url.scheme == 'file') { | ||
state = FILE_HOST; | ||
continue; | ||
} else if (chr == ':' && !seenBracket) { | ||
if (buffer == '') return INVALID_HOST; | ||
failure = url.parseHost(buffer); | ||
if (failure) return failure; | ||
buffer = ''; | ||
state = PORT; | ||
if (stateOverride == HOSTNAME) return; | ||
} else if ( | ||
chr == EOF || chr == '/' || chr == '?' || chr == '#' || | ||
(chr == '\\' && url.isSpecial()) | ||
) { | ||
if (url.isSpecial() && buffer == '') return INVALID_HOST; | ||
if (stateOverride && buffer == '' && (url.includesCredentials() || url.port !== null)) return; | ||
failure = url.parseHost(buffer); | ||
if (failure) return failure; | ||
buffer = ''; | ||
state = PATH_START; | ||
if (stateOverride) return; | ||
continue; | ||
} else { | ||
if (chr == '[') seenBracket = true; | ||
else if (chr == ']') seenBracket = false; | ||
buffer += chr; | ||
} break; | ||
case PORT: | ||
if (exec(DIGIT, chr)) { | ||
buffer += chr; | ||
} else if ( | ||
chr == EOF || chr == '/' || chr == '?' || chr == '#' || | ||
(chr == '\\' && url.isSpecial()) || | ||
stateOverride | ||
) { | ||
if (buffer != '') { | ||
var port = parseInt(buffer, 10); | ||
if (port > 0xFFFF) return INVALID_PORT; | ||
url.port = (url.isSpecial() && port === specialSchemes[url.scheme]) ? null : port; | ||
buffer = ''; | ||
} | ||
if (stateOverride) return; | ||
state = PATH_START; | ||
continue; | ||
} else return INVALID_PORT; | ||
break; | ||
case FILE: | ||
url.scheme = 'file'; | ||
if (chr == '/' || chr == '\\') state = FILE_SLASH; | ||
else if (base && base.scheme == 'file') { | ||
if (chr == EOF) { | ||
url.host = base.host; | ||
url.path = arraySlice(base.path); | ||
shortenURLsPath(url); | ||
url.query = base.query; | ||
} else if (chr == '?') { | ||
url.host = base.host; | ||
url.path = arraySlice(base.path); | ||
url.query = ''; | ||
state = QUERY; | ||
} else if (chr == '#') { | ||
url.host = base.host; | ||
url.path = arraySlice(base.path); | ||
url.query = base.query; | ||
url.fragment = ''; | ||
state = FRAGMENT; | ||
} else { | ||
if (!startsWithWindowsDriveLetter(join(arraySlice(codePoints, pointer), ''))) { | ||
url.host = base.host; | ||
url.path = arraySlice(base.path); | ||
url.shortenPath(); | ||
} | ||
state = PATH; | ||
continue; | ||
} | ||
} else { | ||
state = PATH; | ||
continue; | ||
} break; | ||
case FILE_SLASH: | ||
if (chr == '/' || chr == '\\') { | ||
state = FILE_HOST; | ||
break; | ||
} | ||
} else { | ||
if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(join(arraySlice(codePoints, pointer), ''))) { | ||
if (isWindowsDriveLetter(base.path[0], true)) push(url.path, base.path[0]); | ||
else url.host = base.host; | ||
} | ||
state = PATH; | ||
continue; | ||
} break; | ||
case FILE_SLASH: | ||
if (chr == '/' || chr == '\\') { | ||
state = FILE_HOST; | ||
case FILE_HOST: | ||
if (chr == EOF || chr == '/' || chr == '\\' || chr == '?' || chr == '#') { | ||
if (!stateOverride && isWindowsDriveLetter(buffer)) { | ||
state = PATH; | ||
} else if (buffer == '') { | ||
url.host = ''; | ||
if (stateOverride) return; | ||
state = PATH_START; | ||
} else { | ||
failure = url.parseHost(buffer); | ||
if (failure) return failure; | ||
if (url.host == 'localhost') url.host = ''; | ||
if (stateOverride) return; | ||
buffer = ''; | ||
state = PATH_START; | ||
} continue; | ||
} else buffer += chr; | ||
break; | ||
} | ||
if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(join(arraySlice(codePoints, pointer), ''))) { | ||
if (isWindowsDriveLetter(base.path[0], true)) push(url.path, base.path[0]); | ||
else url.host = base.host; | ||
} | ||
state = PATH; | ||
continue; | ||
case FILE_HOST: | ||
if (chr == EOF || chr == '/' || chr == '\\' || chr == '?' || chr == '#') { | ||
if (!stateOverride && isWindowsDriveLetter(buffer)) { | ||
case PATH_START: | ||
if (url.isSpecial()) { | ||
state = PATH; | ||
} else if (buffer == '') { | ||
url.host = ''; | ||
if (stateOverride) return; | ||
state = PATH_START; | ||
} else { | ||
failure = parseHost(url, buffer); | ||
if (failure) return failure; | ||
if (url.host == 'localhost') url.host = ''; | ||
if (stateOverride) return; | ||
buffer = ''; | ||
state = PATH_START; | ||
} continue; | ||
} else buffer += chr; | ||
break; | ||
if (chr != '/' && chr != '\\') continue; | ||
} else if (!stateOverride && chr == '?') { | ||
url.query = ''; | ||
state = QUERY; | ||
} else if (!stateOverride && chr == '#') { | ||
url.fragment = ''; | ||
state = FRAGMENT; | ||
} else if (chr != EOF) { | ||
state = PATH; | ||
if (chr != '/') continue; | ||
} break; | ||
case PATH_START: | ||
if (isSpecial(url)) { | ||
state = PATH; | ||
if (chr != '/' && chr != '\\') continue; | ||
} else if (!stateOverride && chr == '?') { | ||
url.query = ''; | ||
state = QUERY; | ||
} else if (!stateOverride && chr == '#') { | ||
url.fragment = ''; | ||
state = FRAGMENT; | ||
} else if (chr != EOF) { | ||
state = PATH; | ||
if (chr != '/') continue; | ||
} break; | ||
case PATH: | ||
if ( | ||
chr == EOF || chr == '/' || | ||
(chr == '\\' && isSpecial(url)) || | ||
(!stateOverride && (chr == '?' || chr == '#')) | ||
) { | ||
if (isDoubleDot(buffer)) { | ||
shortenURLsPath(url); | ||
if (chr != '/' && !(chr == '\\' && isSpecial(url))) { | ||
push(url.path, ''); | ||
case PATH: | ||
if ( | ||
chr == EOF || chr == '/' || | ||
(chr == '\\' && url.isSpecial()) || | ||
(!stateOverride && (chr == '?' || chr == '#')) | ||
) { | ||
if (isDoubleDot(buffer)) { | ||
url.shortenPath(); | ||
if (chr != '/' && !(chr == '\\' && url.isSpecial())) { | ||
push(url.path, ''); | ||
} | ||
} else if (isSingleDot(buffer)) { | ||
if (chr != '/' && !(chr == '\\' && url.isSpecial())) { | ||
push(url.path, ''); | ||
} | ||
} else { | ||
if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) { | ||
if (url.host) url.host = ''; | ||
buffer = charAt(buffer, 0) + ':'; // normalize windows drive letter | ||
} | ||
push(url.path, buffer); | ||
} | ||
} else if (isSingleDot(buffer)) { | ||
if (chr != '/' && !(chr == '\\' && isSpecial(url))) { | ||
push(url.path, ''); | ||
buffer = ''; | ||
if (url.scheme == 'file' && (chr == EOF || chr == '?' || chr == '#')) { | ||
while (url.path.length > 1 && url.path[0] === '') { | ||
shift(url.path); | ||
} | ||
} | ||
if (chr == '?') { | ||
url.query = ''; | ||
state = QUERY; | ||
} else if (chr == '#') { | ||
url.fragment = ''; | ||
state = FRAGMENT; | ||
} | ||
} else { | ||
if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) { | ||
if (url.host) url.host = ''; | ||
buffer = charAt(buffer, 0) + ':'; // normalize windows drive letter | ||
} | ||
push(url.path, buffer); | ||
} | ||
buffer = ''; | ||
if (url.scheme == 'file' && (chr == EOF || chr == '?' || chr == '#')) { | ||
while (url.path.length > 1 && url.path[0] === '') { | ||
shift(url.path); | ||
} | ||
} | ||
buffer += percentEncode(chr, pathPercentEncodeSet); | ||
} break; | ||
case CANNOT_BE_A_BASE_URL_PATH: | ||
if (chr == '?') { | ||
@@ -731,34 +728,222 @@ url.query = ''; | ||
state = FRAGMENT; | ||
} | ||
} else { | ||
buffer += percentEncode(chr, pathPercentEncodeSet); | ||
} break; | ||
} else if (chr != EOF) { | ||
url.path[0] += percentEncode(chr, C0ControlPercentEncodeSet); | ||
} break; | ||
case CANNOT_BE_A_BASE_URL_PATH: | ||
if (chr == '?') { | ||
url.query = ''; | ||
state = QUERY; | ||
} else if (chr == '#') { | ||
url.fragment = ''; | ||
state = FRAGMENT; | ||
} else if (chr != EOF) { | ||
url.path[0] += percentEncode(chr, C0ControlPercentEncodeSet); | ||
} break; | ||
case QUERY: | ||
if (!stateOverride && chr == '#') { | ||
url.fragment = ''; | ||
state = FRAGMENT; | ||
} else if (chr != EOF) { | ||
if (chr == "'" && url.isSpecial()) url.query += '%27'; | ||
else if (chr == '#') url.query += '%23'; | ||
else url.query += percentEncode(chr, C0ControlPercentEncodeSet); | ||
} break; | ||
case QUERY: | ||
if (!stateOverride && chr == '#') { | ||
url.fragment = ''; | ||
state = FRAGMENT; | ||
} else if (chr != EOF) { | ||
if (chr == "'" && isSpecial(url)) url.query += '%27'; | ||
else if (chr == '#') url.query += '%23'; | ||
else url.query += percentEncode(chr, C0ControlPercentEncodeSet); | ||
} break; | ||
case FRAGMENT: | ||
if (chr != EOF) url.fragment += percentEncode(chr, fragmentPercentEncodeSet); | ||
break; | ||
} | ||
case FRAGMENT: | ||
if (chr != EOF) url.fragment += percentEncode(chr, fragmentPercentEncodeSet); | ||
break; | ||
pointer++; | ||
} | ||
pointer++; | ||
}, | ||
// https://url.spec.whatwg.org/#host-parsing | ||
parseHost: function (input) { | ||
var result, codePoints, index; | ||
if (charAt(input, 0) == '[') { | ||
if (charAt(input, input.length - 1) != ']') return INVALID_HOST; | ||
result = parseIPv6(stringSlice(input, 1, -1)); | ||
if (!result) return INVALID_HOST; | ||
this.host = result; | ||
// opaque host | ||
} else if (!this.isSpecial()) { | ||
if (exec(FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT, input)) return INVALID_HOST; | ||
result = ''; | ||
codePoints = arrayFrom(input); | ||
for (index = 0; index < codePoints.length; index++) { | ||
result += percentEncode(codePoints[index], C0ControlPercentEncodeSet); | ||
} | ||
this.host = result; | ||
} else { | ||
input = toASCII(input); | ||
if (exec(FORBIDDEN_HOST_CODE_POINT, input)) return INVALID_HOST; | ||
result = parseIPv4(input); | ||
if (result === null) return INVALID_HOST; | ||
this.host = result; | ||
} | ||
}, | ||
// https://url.spec.whatwg.org/#cannot-have-a-username-password-port | ||
cannotHaveUsernamePasswordPort: function () { | ||
return !this.host || this.cannotBeABaseURL || this.scheme == 'file'; | ||
}, | ||
// https://url.spec.whatwg.org/#include-credentials | ||
includesCredentials: function () { | ||
return this.username != '' || this.password != ''; | ||
}, | ||
// https://url.spec.whatwg.org/#is-special | ||
isSpecial: function () { | ||
return hasOwn(specialSchemes, this.scheme); | ||
}, | ||
// https://url.spec.whatwg.org/#shorten-a-urls-path | ||
shortenPath: function () { | ||
var path = this.path; | ||
var pathSize = path.length; | ||
if (pathSize && (this.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) { | ||
path.length--; | ||
} | ||
}, | ||
// https://url.spec.whatwg.org/#concept-url-serializer | ||
serialize: function () { | ||
var url = this; | ||
var scheme = url.scheme; | ||
var username = url.username; | ||
var password = url.password; | ||
var host = url.host; | ||
var port = url.port; | ||
var path = url.path; | ||
var query = url.query; | ||
var fragment = url.fragment; | ||
var output = scheme + ':'; | ||
if (host !== null) { | ||
output += '//'; | ||
if (url.includesCredentials()) { | ||
output += username + (password ? ':' + password : '') + '@'; | ||
} | ||
output += serializeHost(host); | ||
if (port !== null) output += ':' + port; | ||
} else if (scheme == 'file') output += '//'; | ||
output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + join(path, '/') : ''; | ||
if (query !== null) output += '?' + query; | ||
if (fragment !== null) output += '#' + fragment; | ||
return output; | ||
}, | ||
// https://url.spec.whatwg.org/#dom-url-href | ||
setHref: function (href) { | ||
var failure = this.parse(href); | ||
if (failure) throw TypeError(failure); | ||
this.searchParams.update(); | ||
}, | ||
// https://url.spec.whatwg.org/#dom-url-origin | ||
getOrigin: function () { | ||
var scheme = this.scheme; | ||
var port = this.port; | ||
if (scheme == 'blob') try { | ||
return new URLConstructor(scheme.path[0]).origin; | ||
} catch (error) { | ||
return 'null'; | ||
} | ||
if (scheme == 'file' || !this.isSpecial()) return 'null'; | ||
return scheme + '://' + serializeHost(this.host) + (port !== null ? ':' + port : ''); | ||
}, | ||
// https://url.spec.whatwg.org/#dom-url-protocol | ||
getProtocol: function () { | ||
return this.scheme + ':'; | ||
}, | ||
setProtocol: function (protocol) { | ||
this.parse($toString(protocol) + ':', SCHEME_START); | ||
}, | ||
// https://url.spec.whatwg.org/#dom-url-username | ||
getUsername: function () { | ||
return this.username; | ||
}, | ||
setUsername: function (username) { | ||
var codePoints = arrayFrom($toString(username)); | ||
if (this.cannotHaveUsernamePasswordPort()) return; | ||
this.username = ''; | ||
for (var i = 0; i < codePoints.length; i++) { | ||
this.username += percentEncode(codePoints[i], userinfoPercentEncodeSet); | ||
} | ||
}, | ||
// https://url.spec.whatwg.org/#dom-url-password | ||
getPassword: function () { | ||
return this.password; | ||
}, | ||
setPassword: function (password) { | ||
var codePoints = arrayFrom($toString(password)); | ||
if (this.cannotHaveUsernamePasswordPort()) return; | ||
this.password = ''; | ||
for (var i = 0; i < codePoints.length; i++) { | ||
this.password += percentEncode(codePoints[i], userinfoPercentEncodeSet); | ||
} | ||
}, | ||
// https://url.spec.whatwg.org/#dom-url-host | ||
getHost: function () { | ||
var host = this.host; | ||
var port = this.port; | ||
return host === null ? '' | ||
: port === null ? serializeHost(host) | ||
: serializeHost(host) + ':' + port; | ||
}, | ||
setHost: function (host) { | ||
if (this.cannotBeABaseURL) return; | ||
this.parse(host, HOST); | ||
}, | ||
// https://url.spec.whatwg.org/#dom-url-hostname | ||
getHostname: function () { | ||
var host = this.host; | ||
return host === null ? '' : serializeHost(host); | ||
}, | ||
setHostname: function (hostname) { | ||
if (this.cannotBeABaseURL) return; | ||
this.parse(hostname, HOSTNAME); | ||
}, | ||
// https://url.spec.whatwg.org/#dom-url-port | ||
getPort: function () { | ||
var port = this.port; | ||
return port === null ? '' : $toString(port); | ||
}, | ||
setPort: function (port) { | ||
if (this.cannotHaveUsernamePasswordPort()) return; | ||
port = $toString(port); | ||
if (port == '') this.port = null; | ||
else this.parse(port, PORT); | ||
}, | ||
// https://url.spec.whatwg.org/#dom-url-pathname | ||
getPathname: function () { | ||
var path = this.path; | ||
return this.cannotBeABaseURL ? path[0] : path.length ? '/' + join(path, '/') : ''; | ||
}, | ||
setPathname: function (pathname) { | ||
if (this.cannotBeABaseURL) return; | ||
this.path = []; | ||
this.parse(pathname, PATH_START); | ||
}, | ||
// https://url.spec.whatwg.org/#dom-url-search | ||
getSearch: function () { | ||
var query = this.query; | ||
return query ? '?' + query : ''; | ||
}, | ||
setSearch: function (search) { | ||
search = $toString(search); | ||
if (search == '') { | ||
this.query = null; | ||
} else { | ||
if ('?' == charAt(search, 0)) search = stringSlice(search, 1); | ||
this.query = ''; | ||
this.parse(search, QUERY); | ||
} | ||
this.searchParams.update(); | ||
}, | ||
// https://url.spec.whatwg.org/#dom-url-searchparams | ||
getSearchParams: function () { | ||
return this.searchParams.facade; | ||
}, | ||
// https://url.spec.whatwg.org/#dom-url-hash | ||
getHash: function () { | ||
var fragment = this.fragment; | ||
return fragment ? '#' + fragment : ''; | ||
}, | ||
setHash: function (hash) { | ||
hash = $toString(hash); | ||
if (hash == '') { | ||
this.fragment = null; | ||
return; | ||
} | ||
if ('#' == charAt(hash, 0)) hash = stringSlice(hash, 1); | ||
this.fragment = ''; | ||
this.parse(hash, FRAGMENT); | ||
}, | ||
update: function () { | ||
this.query = this.searchParams.serialize() || null; | ||
} | ||
@@ -772,34 +957,16 @@ }; | ||
var base = arguments.length > 1 ? arguments[1] : undefined; | ||
var urlString = $toString(url); | ||
var state = setInternalState(that, { type: 'URL' }); | ||
var baseState, failure; | ||
if (base !== undefined) { | ||
try { | ||
baseState = getInternalURLState(base); | ||
} catch (error) { | ||
failure = parseURL(baseState = {}, $toString(base)); | ||
if (failure) throw TypeError(failure); | ||
} | ||
} | ||
failure = parseURL(state, urlString, null, baseState); | ||
if (failure) throw TypeError(failure); | ||
var searchParams = state.searchParams = new URLSearchParams(); | ||
var searchParamsState = getInternalSearchParamsState(searchParams); | ||
searchParamsState.updateSearchParams(state.query); | ||
searchParamsState.updateURL = function () { | ||
state.query = $toString(searchParams) || null; | ||
}; | ||
var state = setInternalState(that, new URLState(url, false, base)); | ||
if (!DESCRIPTORS) { | ||
that.href = call(serializeURL, that); | ||
that.origin = call(getOrigin, that); | ||
that.protocol = call(getProtocol, that); | ||
that.username = call(getUsername, that); | ||
that.password = call(getPassword, that); | ||
that.host = call(getHost, that); | ||
that.hostname = call(getHostname, that); | ||
that.port = call(getPort, that); | ||
that.pathname = call(getPathname, that); | ||
that.search = call(getSearch, that); | ||
that.searchParams = call(getSearchParams, that); | ||
that.hash = call(getHash, that); | ||
that.href = state.serialize(); | ||
that.origin = state.getOrigin(); | ||
that.protocol = state.getProtocol(); | ||
that.username = state.getUsername(); | ||
that.password = state.getPassword(); | ||
that.host = state.getHost(); | ||
that.hostname = state.getHostname(); | ||
that.port = state.getPort(); | ||
that.pathname = state.getPathname(); | ||
that.search = state.getSearch(); | ||
that.searchParams = state.getSearchParams(); | ||
that.hash = state.getHash(); | ||
} | ||
@@ -810,93 +977,13 @@ }; | ||
var serializeURL = function () { | ||
var url = getInternalURLState(this); | ||
var scheme = url.scheme; | ||
var username = url.username; | ||
var password = url.password; | ||
var host = url.host; | ||
var port = url.port; | ||
var path = url.path; | ||
var query = url.query; | ||
var fragment = url.fragment; | ||
var output = scheme + ':'; | ||
if (host !== null) { | ||
output += '//'; | ||
if (includesCredentials(url)) { | ||
output += username + (password ? ':' + password : '') + '@'; | ||
} | ||
output += serializeHost(host); | ||
if (port !== null) output += ':' + port; | ||
} else if (scheme == 'file') output += '//'; | ||
output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + join(path, '/') : ''; | ||
if (query !== null) output += '?' + query; | ||
if (fragment !== null) output += '#' + fragment; | ||
return output; | ||
}; | ||
var getOrigin = function () { | ||
var url = getInternalURLState(this); | ||
var scheme = url.scheme; | ||
var port = url.port; | ||
if (scheme == 'blob') try { | ||
return new URLConstructor(scheme.path[0]).origin; | ||
} catch (error) { | ||
return 'null'; | ||
} | ||
if (scheme == 'file' || !isSpecial(url)) return 'null'; | ||
return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : ''); | ||
}; | ||
var getProtocol = function () { | ||
return getInternalURLState(this).scheme + ':'; | ||
}; | ||
var getUsername = function () { | ||
return getInternalURLState(this).username; | ||
}; | ||
var getPassword = function () { | ||
return getInternalURLState(this).password; | ||
}; | ||
var getHost = function () { | ||
var url = getInternalURLState(this); | ||
var host = url.host; | ||
var port = url.port; | ||
return host === null ? '' | ||
: port === null ? serializeHost(host) | ||
: serializeHost(host) + ':' + port; | ||
}; | ||
var getHostname = function () { | ||
var host = getInternalURLState(this).host; | ||
return host === null ? '' : serializeHost(host); | ||
}; | ||
var getPort = function () { | ||
var port = getInternalURLState(this).port; | ||
return port === null ? '' : $toString(port); | ||
}; | ||
var getPathname = function () { | ||
var url = getInternalURLState(this); | ||
var path = url.path; | ||
return url.cannotBeABaseURL ? path[0] : path.length ? '/' + join(path, '/') : ''; | ||
}; | ||
var getSearch = function () { | ||
var query = getInternalURLState(this).query; | ||
return query ? '?' + query : ''; | ||
}; | ||
var getSearchParams = function () { | ||
return getInternalURLState(this).searchParams; | ||
}; | ||
var getHash = function () { | ||
var fragment = getInternalURLState(this).fragment; | ||
return fragment ? '#' + fragment : ''; | ||
}; | ||
var accessorDescriptor = function (getter, setter) { | ||
return { get: getter, set: setter, configurable: true, enumerable: true }; | ||
return { | ||
get: function () { | ||
return getInternalURLState(this)[getter](); | ||
}, | ||
set: setter && function (value) { | ||
return getInternalURLState(this)[setter](value); | ||
}, | ||
configurable: true, | ||
enumerable: true | ||
}; | ||
}; | ||
@@ -908,101 +995,36 @@ | ||
// https://url.spec.whatwg.org/#dom-url-href | ||
href: accessorDescriptor(serializeURL, function (href) { | ||
var url = getInternalURLState(this); | ||
var urlString = $toString(href); | ||
var failure = parseURL(url, urlString); | ||
if (failure) throw TypeError(failure); | ||
getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query); | ||
}), | ||
href: accessorDescriptor('serialize', 'setHref'), | ||
// `URL.prototype.origin` getter | ||
// https://url.spec.whatwg.org/#dom-url-origin | ||
origin: accessorDescriptor(getOrigin), | ||
origin: accessorDescriptor('getOrigin'), | ||
// `URL.prototype.protocol` accessors pair | ||
// https://url.spec.whatwg.org/#dom-url-protocol | ||
protocol: accessorDescriptor(getProtocol, function (protocol) { | ||
var url = getInternalURLState(this); | ||
parseURL(url, $toString(protocol) + ':', SCHEME_START); | ||
}), | ||
protocol: accessorDescriptor('getProtocol', 'setProtocol'), | ||
// `URL.prototype.username` accessors pair | ||
// https://url.spec.whatwg.org/#dom-url-username | ||
username: accessorDescriptor(getUsername, function (username) { | ||
var url = getInternalURLState(this); | ||
var codePoints = arrayFrom($toString(username)); | ||
if (cannotHaveUsernamePasswordPort(url)) return; | ||
url.username = ''; | ||
for (var i = 0; i < codePoints.length; i++) { | ||
url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet); | ||
} | ||
}), | ||
username: accessorDescriptor('getUsername', 'setUsername'), | ||
// `URL.prototype.password` accessors pair | ||
// https://url.spec.whatwg.org/#dom-url-password | ||
password: accessorDescriptor(getPassword, function (password) { | ||
var url = getInternalURLState(this); | ||
var codePoints = arrayFrom($toString(password)); | ||
if (cannotHaveUsernamePasswordPort(url)) return; | ||
url.password = ''; | ||
for (var i = 0; i < codePoints.length; i++) { | ||
url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet); | ||
} | ||
}), | ||
password: accessorDescriptor('getPassword', 'setPassword'), | ||
// `URL.prototype.host` accessors pair | ||
// https://url.spec.whatwg.org/#dom-url-host | ||
host: accessorDescriptor(getHost, function (host) { | ||
var url = getInternalURLState(this); | ||
if (url.cannotBeABaseURL) return; | ||
parseURL(url, $toString(host), HOST); | ||
}), | ||
host: accessorDescriptor('getHost', 'setHost'), | ||
// `URL.prototype.hostname` accessors pair | ||
// https://url.spec.whatwg.org/#dom-url-hostname | ||
hostname: accessorDescriptor(getHostname, function (hostname) { | ||
var url = getInternalURLState(this); | ||
if (url.cannotBeABaseURL) return; | ||
parseURL(url, $toString(hostname), HOSTNAME); | ||
}), | ||
hostname: accessorDescriptor('getHostname', 'setHostname'), | ||
// `URL.prototype.port` accessors pair | ||
// https://url.spec.whatwg.org/#dom-url-port | ||
port: accessorDescriptor(getPort, function (port) { | ||
var url = getInternalURLState(this); | ||
if (cannotHaveUsernamePasswordPort(url)) return; | ||
port = $toString(port); | ||
if (port == '') url.port = null; | ||
else parseURL(url, port, PORT); | ||
}), | ||
port: accessorDescriptor('getPort', 'setPort'), | ||
// `URL.prototype.pathname` accessors pair | ||
// https://url.spec.whatwg.org/#dom-url-pathname | ||
pathname: accessorDescriptor(getPathname, function (pathname) { | ||
var url = getInternalURLState(this); | ||
if (url.cannotBeABaseURL) return; | ||
url.path = []; | ||
parseURL(url, $toString(pathname), PATH_START); | ||
}), | ||
pathname: accessorDescriptor('getPathname', 'setPathname'), | ||
// `URL.prototype.search` accessors pair | ||
// https://url.spec.whatwg.org/#dom-url-search | ||
search: accessorDescriptor(getSearch, function (search) { | ||
var url = getInternalURLState(this); | ||
search = $toString(search); | ||
if (search == '') { | ||
url.query = null; | ||
} else { | ||
if ('?' == charAt(search, 0)) search = stringSlice(search, 1); | ||
url.query = ''; | ||
parseURL(url, search, QUERY); | ||
} | ||
getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query); | ||
}), | ||
search: accessorDescriptor('getSearch', 'setSearch'), | ||
// `URL.prototype.searchParams` getter | ||
// https://url.spec.whatwg.org/#dom-url-searchparams | ||
searchParams: accessorDescriptor(getSearchParams), | ||
searchParams: accessorDescriptor('getSearchParams'), | ||
// `URL.prototype.hash` accessors pair | ||
// https://url.spec.whatwg.org/#dom-url-hash | ||
hash: accessorDescriptor(getHash, function (hash) { | ||
var url = getInternalURLState(this); | ||
hash = $toString(hash); | ||
if (hash == '') { | ||
url.fragment = null; | ||
return; | ||
} | ||
if ('#' == charAt(hash, 0)) hash = stringSlice(hash, 1); | ||
url.fragment = ''; | ||
parseURL(url, hash, FRAGMENT); | ||
}) | ||
hash: accessorDescriptor('getHash', 'setHash') | ||
}); | ||
@@ -1014,3 +1036,3 @@ } | ||
redefine(URLPrototype, 'toJSON', function toJSON() { | ||
return call(serializeURL, this); | ||
return getInternalURLState(this).serialize(); | ||
}, { enumerable: true }); | ||
@@ -1021,3 +1043,3 @@ | ||
redefine(URLPrototype, 'toString', function toString() { | ||
return call(serializeURL, this); | ||
return getInternalURLState(this).serialize(); | ||
}, { enumerable: true }); | ||
@@ -1024,0 +1046,0 @@ |
{ | ||
"name": "core-js", | ||
"description": "Standard library", | ||
"version": "3.19.1", | ||
"version": "3.19.2", | ||
"repository": { | ||
@@ -57,3 +57,3 @@ "type": "git", | ||
}, | ||
"gitHead": "1f16f36fa2807bbe793b9da852a110e6c6077693" | ||
"gitHead": "e49b7f34f7b3a10cc88e1210431508c7a58e069b" | ||
} |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
820932
1892
19349
13