// -> /+ if (!this.preserveMultipleSlashes) { + for (let i = 1; i < parts.length - 1; i++) { + const p = parts[i]; + // don't squeeze out UNC patterns + if (i === 1 && p === '' && parts[0] === '') + continue; + if (p === '.' || p === '') { + didSomething = true; + parts.splice(i, 1); + i--; + } + } + if (parts[0] === '.' && + parts.length === 2 && + (parts[1] === '.' || parts[1] === '')) { + didSomething = true; + parts.pop(); + } + } + // //../
-> /+ let dd = 0; + while (-1 !== (dd = parts.indexOf('..', dd + 1))) { + const p = parts[dd - 1]; + if (p && + p !== '.' && + p !== '..' && + p !== '**' && + !(this.isWindows && /^[a-z]:$/i.test(p))) { + didSomething = true; + parts.splice(dd - 1, 2); + dd -= 2; + } + } + } while (didSomething); + return parts.length === 0 ? [''] : parts; + } + // First phase: single-pattern processing + // is 1 or more portions + //is 1 or more portions + // is any portion other than ., .., '', or ** + //
is . or '' + // + // **/.. is *brutal* for filesystem walking performance, because + // it effectively resets the recursive walk each time it occurs, + // and ** cannot be reduced out by a .. pattern part like a regexp + // or most strings (other than .., ., and '') can be. + // + // /**/..//
/
-> { /..//
/
, /**//
/
} + // // -> /+ // //../
-> /+ // **/**/ -> **/ + // + // **/*/ -> */**/ <== not valid because ** doesn't follow + // this WOULD be allowed if ** did follow symlinks, or * didn't + firstPhasePreProcess(globParts) { + let didSomething = false; + do { + didSomething = false; + // /**/..//
/
-> { /..//
/
, /**//
/
} + for (let parts of globParts) { + let gs = -1; + while (-1 !== (gs = parts.indexOf('**', gs + 1))) { + let gss = gs; + while (parts[gss + 1] === '**') { + // /**/**/-> /**/+ gss++; + } + // eg, if gs is 2 and gss is 4, that means we have 3 ** + // parts, and can remove 2 of them. + if (gss > gs) { + parts.splice(gs + 1, gss - gs); + } + let next = parts[gs + 1]; + const p = parts[gs + 2]; + const p2 = parts[gs + 3]; + if (next !== '..') + continue; + if (!p || + p === '.' || + p === '..' || + !p2 || + p2 === '.' || + p2 === '..') { + continue; + } + didSomething = true; + // edit parts in place, and push the new one + parts.splice(gs, 1); + const other = parts.slice(0); + other[gs] = '**'; + globParts.push(other); + gs--; + } + // // -> /+ if (!this.preserveMultipleSlashes) { + for (let i = 1; i < parts.length - 1; i++) { + const p = parts[i]; + // don't squeeze out UNC patterns + if (i === 1 && p === '' && parts[0] === '') + continue; + if (p === '.' || p === '') { + didSomething = true; + parts.splice(i, 1); + i--; + } + } + if (parts[0] === '.' && + parts.length === 2 && + (parts[1] === '.' || parts[1] === '')) { + didSomething = true; + parts.pop(); + } + } + // //../
-> /+ let dd = 0; + while (-1 !== (dd = parts.indexOf('..', dd + 1))) { + const p = parts[dd - 1]; + if (p && p !== '.' && p !== '..' && p !== '**') { + didSomething = true; + const needDot = dd === 1 && parts[dd + 1] === '**'; + const splin = needDot ? ['.'] : []; + parts.splice(dd - 1, 2, ...splin); + if (parts.length === 0) + parts.push(''); + dd -= 2; + } + } + } + } while (didSomething); + return globParts; + } + // second phase: multi-pattern dedupes + // { /*/, //
} -> /*/+ // { /, /} -> /+ // { /**/, /} -> /**/+ // + // { /**/, /**//
} -> /**/+ // ^-- not valid because ** doens't follow symlinks + secondPhasePreProcess(globParts) { + for (let i = 0; i < globParts.length - 1; i++) { + for (let j = i + 1; j < globParts.length; j++) { + const matched = this.partsMatch(globParts[i], globParts[j], !this.preserveMultipleSlashes); + if (matched) { + globParts[i] = []; + globParts[j] = matched; + break; + } + } + } + return globParts.filter(gs => gs.length); + } + partsMatch(a, b, emptyGSMatch = false) { + let ai = 0; + let bi = 0; + let result = []; + let which = ''; + while (ai < a.length && bi < b.length) { + if (a[ai] === b[bi]) { + result.push(which === 'b' ? b[bi] : a[ai]); + ai++; + bi++; + } + else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) { + result.push(a[ai]); + ai++; + } + else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) { + result.push(b[bi]); + bi++; + } + else if (a[ai] === '*' && + b[bi] && + (this.options.dot || !b[bi].startsWith('.')) && + b[bi] !== '**') { + if (which === 'b') + return false; + which = 'a'; + result.push(a[ai]); + ai++; + bi++; + } + else if (b[bi] === '*' && + a[ai] && + (this.options.dot || !a[ai].startsWith('.')) && + a[ai] !== '**') { + if (which === 'a') + return false; + which = 'b'; + result.push(b[bi]); + ai++; + bi++; + } + else { + return false; + } + } + // if we fall out of the loop, it means they two are identical + // as long as their lengths match + return a.length === b.length && result; + } + parseNegate() { + if (this.nonegate) + return; + const pattern = this.pattern; + let negate = false; + let negateOffset = 0; + for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) { + negate = !negate; + negateOffset++; + } + if (negateOffset) + this.pattern = pattern.slice(negateOffset); + this.negate = negate; + } + // set partial to true to test if, for example, + // "/a/b" matches the start of "/*/b/*/d" + // Partial means, if you run out of file before you run + // out of pattern, then that's fine, as long as all + // the parts match. + matchOne(file, pattern, partial = false) { + let fileStartIndex = 0; + let patternStartIndex = 0; + // UNC paths like //?/X:/... can match X:/... and vice versa + // Drive letters in absolute drive or unc paths are always compared + // case-insensitively. + if (this.isWindows) { + const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0]); + const fileUNC = !fileDrive && + file[0] === '' && + file[1] === '' && + file[2] === '?' && + /^[a-z]:$/i.test(file[3]); + const patternDrive = typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0]); + const patternUNC = !patternDrive && + pattern[0] === '' && + pattern[1] === '' && + pattern[2] === '?' && + typeof pattern[3] === 'string' && + /^[a-z]:$/i.test(pattern[3]); + const fdi = fileUNC ? 3 + : fileDrive ? 0 + : undefined; + const pdi = patternUNC ? 3 + : patternDrive ? 0 + : undefined; + if (typeof fdi === 'number' && typeof pdi === 'number') { + const [fd, pd] = [ + file[fdi], + pattern[pdi], + ]; + // start matching at the drive letter index of each + if (fd.toLowerCase() === pd.toLowerCase()) { + pattern[pdi] = fd; + patternStartIndex = pdi; + fileStartIndex = fdi; + } + } + } + // resolve and reduce . and .. portions in the file as well. + // don't need to do the second phase, because it's only one string[] + const { optimizationLevel = 1 } = this.options; + if (optimizationLevel >= 2) { + file = this.levelTwoFileOptimize(file); + } + if (pattern.includes(GLOBSTAR)) { + return this.#matchGlobstar(file, pattern, partial, fileStartIndex, patternStartIndex); + } + return this.#matchOne(file, pattern, partial, fileStartIndex, patternStartIndex); + } + #matchGlobstar(file, pattern, partial, fileIndex, patternIndex) { + // split the pattern into head, tail, and middle of ** delimited parts + const firstgs = pattern.indexOf(GLOBSTAR, patternIndex); + const lastgs = pattern.lastIndexOf(GLOBSTAR); + // split the pattern up into globstar-delimited sections + // the tail has to be at the end, and the others just have + // to be found in order from the head. + const [head, body, tail] = partial ? + [ + pattern.slice(patternIndex, firstgs), + pattern.slice(firstgs + 1), + [], + ] + : [ + pattern.slice(patternIndex, firstgs), + pattern.slice(firstgs + 1, lastgs), + pattern.slice(lastgs + 1), + ]; + // check the head, from the current file/pattern index. + if (head.length) { + const fileHead = file.slice(fileIndex, fileIndex + head.length); + if (!this.#matchOne(fileHead, head, partial, 0, 0)) { + return false; + } + fileIndex += head.length; + patternIndex += head.length; + } + // now we know the head matches! + // if the last portion is not empty, it MUST match the end + // check the tail + let fileTailMatch = 0; + if (tail.length) { + // if head + tail > file, then we cannot possibly match + if (tail.length + fileIndex > file.length) + return false; + // try to match the tail + let tailStart = file.length - tail.length; + if (this.#matchOne(file, tail, partial, tailStart, 0)) { + fileTailMatch = tail.length; + } + else { + // affordance for stuff like a/**/* matching a/b/ + // if the last file portion is '', and there's more to the pattern + // then try without the '' bit. + if (file[file.length - 1] !== '' || + fileIndex + tail.length === file.length) { + return false; + } + tailStart--; + if (!this.#matchOne(file, tail, partial, tailStart, 0)) { + return false; + } + fileTailMatch = tail.length + 1; + } + } + // now we know the tail matches! + // the middle is zero or more portions wrapped in **, possibly + // containing more ** sections. + // so a/**/b/**/c/**/d has become **/b/**/c/** + // if it's empty, it means a/**/b, just verify we have no bad dots + // if there's no tail, so it ends on /**, then we must have *something* + // after the head, or it's not a matc + if (!body.length) { + let sawSome = !!fileTailMatch; + for (let i = fileIndex; i < file.length - fileTailMatch; i++) { + const f = String(file[i]); + sawSome = true; + if (f === '.' || + f === '..' || + (!this.options.dot && f.startsWith('.'))) { + return false; + } + } + // in partial mode, we just need to get past all file parts + return partial || sawSome; + } + // now we know that there's one or more body sections, which can + // be matched anywhere from the 0 index (because the head was pruned) + // through to the length-fileTailMatch index. + // split the body up into sections, and note the minimum index it can + // be found at (start with the length of all previous segments) + // [section, before, after] + const bodySegments = [[[], 0]]; + let currentBody = bodySegments[0]; + let nonGsParts = 0; + const nonGsPartsSums = [0]; + for (const b of body) { + if (b === GLOBSTAR) { + nonGsPartsSums.push(nonGsParts); + currentBody = [[], 0]; + bodySegments.push(currentBody); + } + else { + currentBody[0].push(b); + nonGsParts++; + } + } + let i = bodySegments.length - 1; + const fileLength = file.length - fileTailMatch; + for (const b of bodySegments) { + b[1] = fileLength - (nonGsPartsSums[i--] + b[0].length); + } + return !!this.#matchGlobStarBodySections(file, bodySegments, fileIndex, 0, partial, 0, !!fileTailMatch); + } + // return false for "nope, not matching" + // return null for "not matching, cannot keep trying" + #matchGlobStarBodySections(file, + // pattern section, last possible position for it + bodySegments, fileIndex, bodyIndex, partial, globStarDepth, sawTail) { + // take the first body segment, and walk from fileIndex to its "after" + // value at the end + // If it doesn't match at that position, we increment, until we hit + // that final possible position, and give up. + // If it does match, then advance and try to rest. + // If any of them fail we keep walking forward. + // this is still a bit recursively painful, but it's more constrained + // than previous implementations, because we never test something that + // can't possibly be a valid matching condition. + const bs = bodySegments[bodyIndex]; + if (!bs) { + // just make sure that there's no bad dots + for (let i = fileIndex; i < file.length; i++) { + sawTail = true; + const f = file[i]; + if (f === '.' || + f === '..' || + (!this.options.dot && f.startsWith('.'))) { + return false; + } + } + return sawTail; + } + // have a non-globstar body section to test + const [body, after] = bs; + while (fileIndex <= after) { + const m = this.#matchOne(file.slice(0, fileIndex + body.length), body, partial, fileIndex, 0); + // if limit exceeded, no match. intentional false negative, + // acceptable break in correctness for security. + if (m && globStarDepth < this.maxGlobstarRecursion) { + // match! see if the rest match. if so, we're done! + const sub = this.#matchGlobStarBodySections(file, bodySegments, fileIndex + body.length, bodyIndex + 1, partial, globStarDepth + 1, sawTail); + if (sub !== false) { + return sub; + } + } + const f = file[fileIndex]; + if (f === '.' || + f === '..' || + (!this.options.dot && f.startsWith('.'))) { + return false; + } + fileIndex++; + } + // walked off. no point continuing + return partial || null; + } + #matchOne(file, pattern, partial, fileIndex, patternIndex) { + let fi; + let pi; + let pl; + let fl; + for (fi = fileIndex, + pi = patternIndex, + fl = file.length, + pl = pattern.length; fi < fl && pi < pl; fi++, pi++) { + this.debug('matchOne loop'); + let p = pattern[pi]; + let f = file[fi]; + this.debug(pattern, p, f); + // should be impossible. + // some invalid regexp stuff in the set. + /* c8 ignore start */ + if (p === false || p === GLOBSTAR) { + return false; + } + /* c8 ignore stop */ + // something other than ** + // non-magic patterns just have to match exactly + // patterns with magic have been turned into regexps. + let hit; + if (typeof p === 'string') { + hit = f === p; + this.debug('string match', p, f, hit); + } + else { + hit = p.test(f); + this.debug('pattern match', p, f, hit); + } + if (!hit) + return false; + } + // Note: ending in / means that we'll get a final "" + // at the end of the pattern. This can only match a + // corresponding "" at the end of the file. + // If the file ends in /, then it can only match a + // a pattern that ends in /, unless the pattern just + // doesn't have any more for it. But, a/b/ should *not* + // match "a/b/*", even though "" matches against the + // [^/]*? pattern, except in partial mode, where it might + // simply not be reached yet. + // However, a/b/ should still satisfy a/* + // now either we fell off the end of the pattern, or we're done. + if (fi === fl && pi === pl) { + // ran out of pattern and filename at the same time. + // an exact hit! + return true; + } + else if (fi === fl) { + // ran out of file, but still had pattern left. + // this is ok if we're doing the match as part of + // a glob fs traversal. + return partial; + } + else if (pi === pl) { + // ran out of pattern, still have file left. + // this is only acceptable if we're on the very last + // empty segment of a file with a trailing slash. + // a/* should match a/b/ + return fi === fl - 1 && file[fi] === ''; + /* c8 ignore start */ + } + else { + // should be unreachable. + throw new Error('wtf?'); + } + /* c8 ignore stop */ + } + braceExpand() { + return braceExpand(this.pattern, this.options); + } + parse(pattern) { + assertValidPattern(pattern); + const options = this.options; + // shortcuts + if (pattern === '**') + return GLOBSTAR; + if (pattern === '') + return ''; + // far and away, the most common glob pattern parts are + // *, *.*, and *. Add a fast check method for those. + let m; + let fastTest = null; + if ((m = pattern.match(starRE))) { + fastTest = options.dot ? starTestDot : starTest; + } + else if ((m = pattern.match(starDotExtRE))) { + fastTest = (options.nocase ? + options.dot ? + starDotExtTestNocaseDot + : starDotExtTestNocase + : options.dot ? starDotExtTestDot + : starDotExtTest)(m[1]); + } + else if ((m = pattern.match(qmarksRE))) { + fastTest = (options.nocase ? + options.dot ? + qmarksTestNocaseDot + : qmarksTestNocase + : options.dot ? qmarksTestDot + : qmarksTest)(m); + } + else if ((m = pattern.match(starDotStarRE))) { + fastTest = options.dot ? starDotStarTestDot : starDotStarTest; + } + else if ((m = pattern.match(dotStarRE))) { + fastTest = dotStarTest; + } + const re = AST.fromGlob(pattern, this.options).toMMPattern(); + if (fastTest && typeof re === 'object') { + // Avoids overriding in frozen environments + Reflect.defineProperty(re, 'test', { value: fastTest }); + } + return re; + } + makeRe() { + if (this.regexp || this.regexp === false) + return this.regexp; + // at this point, this.set is a 2d array of partial + // pattern strings, or "**". + // + // It's better to use .match(). This function shouldn't + // be used, really, but it's pretty convenient sometimes, + // when you just want to work with a regex. + const set = this.set; + if (!set.length) { + this.regexp = false; + return this.regexp; + } + const options = this.options; + const twoStar = options.noglobstar ? esm_star + : options.dot ? twoStarDot + : twoStarNoDot; + const flags = new Set(options.nocase ? ['i'] : []); + // regexpify non-globstar patterns + // if ** is only item, then we just do one twoStar + // if ** is first, and there are more, prepend (\/|twoStar\/)? to next + // if ** is last, append (\/twoStar|) to previous + // if ** is in the middle, append (\/|\/twoStar\/) to previous + // then filter out GLOBSTAR symbols + let re = set + .map(pattern => { + const pp = pattern.map(p => { + if (p instanceof RegExp) { + for (const f of p.flags.split('')) + flags.add(f); + } + return (typeof p === 'string' ? esm_regExpEscape(p) + : p === GLOBSTAR ? GLOBSTAR + : p._src); + }); + pp.forEach((p, i) => { + const next = pp[i + 1]; + const prev = pp[i - 1]; + if (p !== GLOBSTAR || prev === GLOBSTAR) { + return; + } + if (prev === undefined) { + if (next !== undefined && next !== GLOBSTAR) { + pp[i + 1] = '(?:\\/|' + twoStar + '\\/)?' + next; + } + else { + pp[i] = twoStar; + } + } + else if (next === undefined) { + pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + ')?'; + } + else if (next !== GLOBSTAR) { + pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + '\\/)' + next; + pp[i + 1] = GLOBSTAR; + } + }); + const filtered = pp.filter(p => p !== GLOBSTAR); + // For partial matches, we need to make the pattern match + // any prefix of the full path. We do this by generating + // alternative patterns that match progressively longer prefixes. + if (this.partial && filtered.length >= 1) { + const prefixes = []; + for (let i = 1; i <= filtered.length; i++) { + prefixes.push(filtered.slice(0, i).join('/')); + } + return '(?:' + prefixes.join('|') + ')'; + } + return filtered.join('/'); + }) + .join('|'); + // need to wrap in parens if we had more than one thing with |, + // otherwise only the first will be anchored to ^ and the last to $ + const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', '']; + // must match entire pattern + // ending in a * or ** will make it less strict. + re = '^' + open + re + close + '$'; + // In partial mode, '/' should always match as it's a valid prefix for any pattern + if (this.partial) { + re = '^(?:\\/|' + open + re.slice(1, -1) + close + ')$'; + } + // can match anything, as long as it's not this. + if (this.negate) + re = '^(?!' + re + ').+$'; + try { + this.regexp = new RegExp(re, [...flags].join('')); + /* c8 ignore start */ + } + catch { + // should be impossible + this.regexp = false; + } + /* c8 ignore stop */ + return this.regexp; + } + slashSplit(p) { + // if p starts with // on windows, we preserve that + // so that UNC paths aren't broken. Otherwise, any number of + // / characters are coalesced into one, unless + // preserveMultipleSlashes is set to true. + if (this.preserveMultipleSlashes) { + return p.split('/'); + } + else if (this.isWindows && /^\/\/[^/]+/.test(p)) { + // add an extra '' for the one we lose + return ['', ...p.split(/\/+/)]; + } + else { + return p.split(/\/+/); + } + } + match(f, partial = this.partial) { + this.debug('match', f, this.pattern); + // short-circuit in the case of busted things. + // comments, etc. + if (this.comment) { + return false; + } + if (this.empty) { + return f === ''; + } + if (f === '/' && partial) { + return true; + } + const options = this.options; + // windows: need to use /, not \ + if (this.isWindows) { + f = f.split('\\').join('/'); + } + // treat the test path as a set of pathparts. + const ff = this.slashSplit(f); + this.debug(this.pattern, 'split', ff); + // just ONE of the pattern sets in this.set needs to match + // in order for it to be valid. If negating, then just one + // match means that we have failed. + // Either way, return on the first hit. + const set = this.set; + this.debug(this.pattern, 'set', set); + // Find the basename of the path by looking for the last non-empty segment + let filename = ff[ff.length - 1]; + if (!filename) { + for (let i = ff.length - 2; !filename && i >= 0; i--) { + filename = ff[i]; + } + } + for (const pattern of set) { + let file = ff; + if (options.matchBase && pattern.length === 1) { + file = [filename]; + } + const hit = this.matchOne(file, pattern, partial); + if (hit) { + if (options.flipNegate) { + return true; + } + return !this.negate; + } + } + // didn't get any hits. this is success if it's a negative + // pattern, failure otherwise. + if (options.flipNegate) { + return false; + } + return this.negate; + } + static defaults(def) { + return minimatch.defaults(def).Minimatch; + } +} +/* c8 ignore start */ + + + +/* c8 ignore stop */ +minimatch.AST = AST; +minimatch.Minimatch = Minimatch; +minimatch.escape = escape_escape; +minimatch.unescape = unescape_unescape; +//# sourceMappingURL=index.js.map +;// CONCATENATED MODULE: ./node_modules/@actions/glob/lib/internal-path.js + + + +const internal_path_IS_WINDOWS = process.platform === 'win32'; +/** + * Helper class for parsing paths into segments + */ +class Path { + /** + * Constructs a Path + * @param itemPath Path or array of segments + */ + constructor(itemPath) { + this.segments = []; + // String + if (typeof itemPath === 'string') { + external_assert_(itemPath, `Parameter 'itemPath' must not be empty`); + // Normalize slashes and trim unnecessary trailing slash + itemPath = safeTrimTrailingSeparator(itemPath); + // Not rooted + if (!hasRoot(itemPath)) { + this.segments = itemPath.split(external_path_.sep); + } + // Rooted + else { + // Add all segments, while not at the root + let remaining = itemPath; + let dir = dirname(remaining); + while (dir !== remaining) { + // Add the segment + const basename = external_path_.basename(remaining); + this.segments.unshift(basename); + // Truncate the last segment + remaining = dir; + dir = dirname(remaining); + } + // Remainder is the root + this.segments.unshift(remaining); + } + } + // Array + else { + // Must not be empty + external_assert_(itemPath.length > 0, `Parameter 'itemPath' must not be an empty array`); + // Each segment + for (let i = 0; i < itemPath.length; i++) { + let segment = itemPath[i]; + // Must not be empty + external_assert_(segment, `Parameter 'itemPath' must not contain any empty segments`); + // Normalize slashes + segment = normalizeSeparators(itemPath[i]); + // Root segment + if (i === 0 && hasRoot(segment)) { + segment = safeTrimTrailingSeparator(segment); + external_assert_(segment === dirname(segment), `Parameter 'itemPath' root segment contains information for multiple segments`); + this.segments.push(segment); + } + // All other segments + else { + // Must not contain slash + external_assert_(!segment.includes(external_path_.sep), `Parameter 'itemPath' contains unexpected path separators`); + this.segments.push(segment); + } + } + } + } + /** + * Converts the path to it's string representation + */ + toString() { + // First segment + let result = this.segments[0]; + // All others + let skipSlash = result.endsWith(external_path_.sep) || (internal_path_IS_WINDOWS && /^[A-Z]:$/i.test(result)); + for (let i = 1; i < this.segments.length; i++) { + if (skipSlash) { + skipSlash = false; + } + else { + result += external_path_.sep; + } + result += this.segments[i]; + } + return result; + } +} +//# sourceMappingURL=internal-path.js.map +;// CONCATENATED MODULE: ./node_modules/@actions/glob/lib/internal-pattern.js + + + + + + + +const internal_pattern_IS_WINDOWS = process.platform === 'win32'; +class Pattern { + constructor(patternOrNegate, isImplicitPattern = false, segments, homedir) { + /** + * Indicates whether matches should be excluded from the result set + */ + this.negate = false; + // Pattern overload + let pattern; + if (typeof patternOrNegate === 'string') { + pattern = patternOrNegate.trim(); + } + // Segments overload + else { + // Convert to pattern + segments = segments || []; + external_assert_(segments.length, `Parameter 'segments' must not empty`); + const root = Pattern.getLiteral(segments[0]); + external_assert_(root && hasAbsoluteRoot(root), `Parameter 'segments' first element must be a root path`); + pattern = new Path(segments).toString().trim(); + if (patternOrNegate) { + pattern = `!${pattern}`; + } + } + // Negate + while (pattern.startsWith('!')) { + this.negate = !this.negate; + pattern = pattern.substr(1).trim(); + } + // Normalize slashes and ensures absolute root + pattern = Pattern.fixupPattern(pattern, homedir); + // Segments + this.segments = new Path(pattern).segments; + // Trailing slash indicates the pattern should only match directories, not regular files + this.trailingSeparator = normalizeSeparators(pattern) + .endsWith(external_path_.sep); + pattern = safeTrimTrailingSeparator(pattern); + // Search path (literal path prior to the first glob segment) + let foundGlob = false; + const searchSegments = this.segments + .map(x => Pattern.getLiteral(x)) + .filter(x => !foundGlob && !(foundGlob = x === '')); + this.searchPath = new Path(searchSegments).toString(); + // Root RegExp (required when determining partial match) + this.rootRegExp = new RegExp(Pattern.regExpEscape(searchSegments[0]), internal_pattern_IS_WINDOWS ? 'i' : ''); + this.isImplicitPattern = isImplicitPattern; + // Create minimatch + const minimatchOptions = { + dot: true, + nobrace: true, + nocase: internal_pattern_IS_WINDOWS, + nocomment: true, + noext: true, + nonegate: true + }; + pattern = internal_pattern_IS_WINDOWS ? pattern.replace(/\\/g, '/') : pattern; + this.minimatch = new Minimatch(pattern, minimatchOptions); + } + /** + * Matches the pattern against the specified path + */ + match(itemPath) { + // Last segment is globstar? + if (this.segments[this.segments.length - 1] === '**') { + // Normalize slashes + itemPath = normalizeSeparators(itemPath); + // Append a trailing slash. Otherwise Minimatch will not match the directory immediately + // preceding the globstar. For example, given the pattern `/foo/**`, Minimatch returns + // false for `/foo` but returns true for `/foo/`. Append a trailing slash to handle that quirk. + if (!itemPath.endsWith(external_path_.sep) && this.isImplicitPattern === false) { + // Note, this is safe because the constructor ensures the pattern has an absolute root. + // For example, formats like C: and C:foo on Windows are resolved to an absolute root. + itemPath = `${itemPath}${external_path_.sep}`; + } + } + else { + // Normalize slashes and trim unnecessary trailing slash + itemPath = safeTrimTrailingSeparator(itemPath); + } + // Match + if (this.minimatch.match(itemPath)) { + return this.trailingSeparator ? MatchKind.Directory : MatchKind.All; + } + return MatchKind.None; + } + /** + * Indicates whether the pattern may match descendants of the specified path + */ + partialMatch(itemPath) { + // Normalize slashes and trim unnecessary trailing slash + itemPath = safeTrimTrailingSeparator(itemPath); + // matchOne does not handle root path correctly + if (dirname(itemPath) === itemPath) { + return this.rootRegExp.test(itemPath); + } + return this.minimatch.matchOne(itemPath.split(internal_pattern_IS_WINDOWS ? /\\+/ : /\/+/), this.minimatch.set[0], true); + } + /** + * Escapes glob patterns within a path + */ + static globEscape(s) { + return (internal_pattern_IS_WINDOWS ? s : s.replace(/\\/g, '\\\\')) // escape '\' on Linux/macOS + .replace(/(\[)(?=[^/]+\])/g, '[[]') // escape '[' when ']' follows within the path segment + .replace(/\?/g, '[?]') // escape '?' + .replace(/\*/g, '[*]'); // escape '*' + } + /** + * Normalizes slashes and ensures absolute root + */ + static fixupPattern(pattern, homedir) { + // Empty + external_assert_(pattern, 'pattern cannot be empty'); + // Must not contain `.` segment, unless first segment + // Must not contain `..` segment + const literalSegments = new Path(pattern).segments.map(x => Pattern.getLiteral(x)); + external_assert_(literalSegments.every((x, i) => (x !== '.' || i === 0) && x !== '..'), `Invalid pattern '${pattern}'. Relative pathing '.' and '..' is not allowed.`); + // Must not contain globs in root, e.g. Windows UNC path \\foo\b*r + external_assert_(!hasRoot(pattern) || literalSegments[0], `Invalid pattern '${pattern}'. Root segment must not contain globs.`); + // Normalize slashes + pattern = normalizeSeparators(pattern); + // Replace leading `.` segment + if (pattern === '.' || pattern.startsWith(`.${external_path_.sep}`)) { + pattern = Pattern.globEscape(process.cwd()) + pattern.substr(1); + } + // Replace leading `~` segment + else if (pattern === '~' || pattern.startsWith(`~${external_path_.sep}`)) { + homedir = homedir || external_os_.homedir(); + external_assert_(homedir, 'Unable to determine HOME directory'); + external_assert_(hasAbsoluteRoot(homedir), `Expected HOME directory to be a rooted path. Actual '${homedir}'`); + pattern = Pattern.globEscape(homedir) + pattern.substr(1); + } + // Replace relative drive root, e.g. pattern is C: or C:foo + else if (internal_pattern_IS_WINDOWS && + (pattern.match(/^[A-Z]:$/i) || pattern.match(/^[A-Z]:[^\\]/i))) { + let root = ensureAbsoluteRoot('C:\\dummy-root', pattern.substr(0, 2)); + if (pattern.length > 2 && !root.endsWith('\\')) { + root += '\\'; + } + pattern = Pattern.globEscape(root) + pattern.substr(2); + } + // Replace relative root, e.g. pattern is \ or \foo + else if (internal_pattern_IS_WINDOWS && (pattern === '\\' || pattern.match(/^\\[^\\]/))) { + let root = ensureAbsoluteRoot('C:\\dummy-root', '\\'); + if (!root.endsWith('\\')) { + root += '\\'; + } + pattern = Pattern.globEscape(root) + pattern.substr(1); + } + // Otherwise ensure absolute root + else { + pattern = ensureAbsoluteRoot(Pattern.globEscape(process.cwd()), pattern); + } + return normalizeSeparators(pattern); + } + /** + * Attempts to unescape a pattern segment to create a literal path segment. + * Otherwise returns empty string. + */ + static getLiteral(segment) { + let literal = ''; + for (let i = 0; i < segment.length; i++) { + const c = segment[i]; + // Escape + if (c === '\\' && !internal_pattern_IS_WINDOWS && i + 1 < segment.length) { + literal += segment[++i]; + continue; + } + // Wildcard + else if (c === '*' || c === '?') { + return ''; + } + // Character set + else if (c === '[' && i + 1 < segment.length) { + let set = ''; + let closed = -1; + for (let i2 = i + 1; i2 < segment.length; i2++) { + const c2 = segment[i2]; + // Escape + if (c2 === '\\' && !internal_pattern_IS_WINDOWS && i2 + 1 < segment.length) { + set += segment[++i2]; + continue; + } + // Closed + else if (c2 === ']') { + closed = i2; + break; + } + // Otherwise + else { + set += c2; + } + } + // Closed? + if (closed >= 0) { + // Cannot convert + if (set.length > 1) { + return ''; + } + // Convert to literal + if (set) { + literal += set; + i = closed; + continue; + } + } + // Otherwise fall thru + } + // Append + literal += c; + } + return literal; + } + /** + * Escapes regexp special characters + * https://javascript.info/regexp-escaping + */ + static regExpEscape(s) { + return s.replace(/[[\\^$.|?*+()]/g, '\\$&'); + } +} +//# sourceMappingURL=internal-pattern.js.map +;// CONCATENATED MODULE: ./node_modules/@actions/glob/lib/internal-search-state.js +class SearchState { + constructor(path, level) { + this.path = path; + this.level = level; + } +} +//# sourceMappingURL=internal-search-state.js.map +;// CONCATENATED MODULE: ./node_modules/@actions/glob/lib/internal-globber.js +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __asyncValues = (undefined && undefined.__asyncValues) || function (o) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var m = o[Symbol.asyncIterator], i; + return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); + function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } + function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } +}; +var __await = (undefined && undefined.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); } +var __asyncGenerator = (undefined && undefined.__asyncGenerator) || function (thisArg, _arguments, generator) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var g = generator.apply(thisArg, _arguments || []), i, q = []; + return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i; + function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; } + function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } } + function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } + function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } + function fulfill(value) { resume("next", value); } + function reject(value) { resume("throw", value); } + function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } +}; + + + + + + + + +const internal_globber_IS_WINDOWS = process.platform === 'win32'; +class DefaultGlobber { + constructor(options) { + this.patterns = []; + this.searchPaths = []; + this.options = getOptions(options); + } + getSearchPaths() { + // Return a copy + return this.searchPaths.slice(); + } + glob() { + return __awaiter(this, void 0, void 0, function* () { + var _a, e_1, _b, _c; + const result = []; + try { + for (var _d = true, _e = __asyncValues(this.globGenerator()), _f; _f = yield _e.next(), _a = _f.done, !_a; _d = true) { + _c = _f.value; + _d = false; + const itemPath = _c; + result.push(itemPath); + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (!_d && !_a && (_b = _e.return)) yield _b.call(_e); + } + finally { if (e_1) throw e_1.error; } + } + return result; + }); + } + globGenerator() { + return __asyncGenerator(this, arguments, function* globGenerator_1() { + // Fill in defaults options + const options = getOptions(this.options); + // Implicit descendants? + const patterns = []; + for (const pattern of this.patterns) { + patterns.push(pattern); + if (options.implicitDescendants && + (pattern.trailingSeparator || + pattern.segments[pattern.segments.length - 1] !== '**')) { + patterns.push(new Pattern(pattern.negate, true, pattern.segments.concat('**'))); + } + } + // Push the search paths + const stack = []; + for (const searchPath of getSearchPaths(patterns)) { + core/* debug */.Yz(`Search path '${searchPath}'`); + // Exists? + try { + // Intentionally using lstat. Detection for broken symlink + // will be performed later (if following symlinks). + yield __await(external_fs_.promises.lstat(searchPath)); + } + catch (err) { + if (err.code === 'ENOENT') { + continue; + } + throw err; + } + stack.unshift(new SearchState(searchPath, 1)); + } + // Search + const traversalChain = []; // used to detect cycles + while (stack.length) { + // Pop + const item = stack.pop(); + // Match? + const match = internal_pattern_helper_match(patterns, item.path); + const partialMatch = !!match || internal_pattern_helper_partialMatch(patterns, item.path); + if (!match && !partialMatch) { + continue; + } + // Stat + const stats = yield __await(DefaultGlobber.stat(item, options, traversalChain) + // Broken symlink, or symlink cycle detected, or no longer exists + ); + // Broken symlink, or symlink cycle detected, or no longer exists + if (!stats) { + continue; + } + // Hidden file or directory? + if (options.excludeHiddenFiles && external_path_.basename(item.path).match(/^\./)) { + continue; + } + // Directory + if (stats.isDirectory()) { + // Matched + if (match & MatchKind.Directory && options.matchDirectories) { + yield yield __await(item.path); + } + // Descend? + else if (!partialMatch) { + continue; + } + // Push the child items in reverse + const childLevel = item.level + 1; + const childItems = (yield __await(external_fs_.promises.readdir(item.path))).map(x => new SearchState(external_path_.join(item.path, x), childLevel)); + stack.push(...childItems.reverse()); + } + // File + else if (match & MatchKind.File) { + yield yield __await(item.path); + } + } + }); + } + /** + * Constructs a DefaultGlobber + */ + static create(patterns, options) { + return __awaiter(this, void 0, void 0, function* () { + const result = new DefaultGlobber(options); + if (internal_globber_IS_WINDOWS) { + patterns = patterns.replace(/\r\n/g, '\n'); + patterns = patterns.replace(/\r/g, '\n'); + } + const lines = patterns.split('\n').map(x => x.trim()); + for (const line of lines) { + // Empty or comment + if (!line || line.startsWith('#')) { + continue; + } + // Pattern + else { + result.patterns.push(new Pattern(line)); + } + } + result.searchPaths.push(...getSearchPaths(result.patterns)); + return result; + }); + } + static stat(item, options, traversalChain) { + return __awaiter(this, void 0, void 0, function* () { + // Note: + // `stat` returns info about the target of a symlink (or symlink chain) + // `lstat` returns info about a symlink itself + let stats; + if (options.followSymbolicLinks) { + try { + // Use `stat` (following symlinks) + stats = yield external_fs_.promises.stat(item.path); + } + catch (err) { + if (err.code === 'ENOENT') { + if (options.omitBrokenSymbolicLinks) { + core/* debug */.Yz(`Broken symlink '${item.path}'`); + return undefined; + } + throw new Error(`No information found for the path '${item.path}'. This may indicate a broken symbolic link.`); + } + throw err; + } + } + else { + // Use `lstat` (not following symlinks) + stats = yield external_fs_.promises.lstat(item.path); + } + // Note, isDirectory() returns false for the lstat of a symlink + if (stats.isDirectory() && options.followSymbolicLinks) { + // Get the realpath + const realPath = yield external_fs_.promises.realpath(item.path); + // Fixup the traversal chain to match the item level + while (traversalChain.length >= item.level) { + traversalChain.pop(); + } + // Test for a cycle + if (traversalChain.some((x) => x === realPath)) { + core/* debug */.Yz(`Symlink cycle detected for path '${item.path}' and realpath '${realPath}'`); + return undefined; + } + // Update the traversal chain + traversalChain.push(realPath); + } + return stats; + }); + } +} +//# sourceMappingURL=internal-globber.js.map +// EXTERNAL MODULE: external "crypto" +var external_crypto_ = __webpack_require__(6982); +// EXTERNAL MODULE: external "stream" +var external_stream_ = __webpack_require__(2203); +// EXTERNAL MODULE: external "util" +var external_util_ = __webpack_require__(9023); +;// CONCATENATED MODULE: ./node_modules/@actions/glob/lib/internal-hash-files.js +var internal_hash_files_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var internal_hash_files_asyncValues = (undefined && undefined.__asyncValues) || function (o) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var m = o[Symbol.asyncIterator], i; + return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); + function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } + function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } +}; + + + + + + +function hashFiles(globber_1, currentWorkspace_1) { + return internal_hash_files_awaiter(this, arguments, void 0, function* (globber, currentWorkspace, verbose = false) { + var _a, e_1, _b, _c; + var _d; + const writeDelegate = verbose ? core/* info */.pq : core/* debug */.Yz; + let hasMatch = false; + const githubWorkspace = currentWorkspace + ? currentWorkspace + : ((_d = process.env['GITHUB_WORKSPACE']) !== null && _d !== void 0 ? _d : process.cwd()); + const result = external_crypto_.createHash('sha256'); + let count = 0; + try { + for (var _e = true, _f = internal_hash_files_asyncValues(globber.globGenerator()), _g; _g = yield _f.next(), _a = _g.done, !_a; _e = true) { + _c = _g.value; + _e = false; + const file = _c; + writeDelegate(file); + if (!file.startsWith(`${githubWorkspace}${external_path_.sep}`)) { + writeDelegate(`Ignore '${file}' since it is not under GITHUB_WORKSPACE.`); + continue; + } + if (external_fs_.statSync(file).isDirectory()) { + writeDelegate(`Skip directory '${file}'.`); + continue; + } + const hash = external_crypto_.createHash('sha256'); + const pipeline = external_util_.promisify(external_stream_.pipeline); + yield pipeline(external_fs_.createReadStream(file), hash); + result.write(hash.digest()); + count++; + if (!hasMatch) { + hasMatch = true; + } + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (!_e && !_a && (_b = _f.return)) yield _b.call(_f); + } + finally { if (e_1) throw e_1.error; } + } + result.end(); + if (hasMatch) { + writeDelegate(`Found ${count} files to hash.`); + return result.digest('hex'); + } + else { + writeDelegate(`No matches found for glob`); + return ''; + } + }); +} +//# sourceMappingURL=internal-hash-files.js.map +;// CONCATENATED MODULE: ./node_modules/@actions/glob/lib/glob.js +var glob_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; + + +/** + * Constructs a globber + * + * @param patterns Patterns separated by newlines + * @param options Glob options + */ +function create(patterns, options) { + return glob_awaiter(this, void 0, void 0, function* () { + return yield DefaultGlobber.create(patterns, options); + }); +} +/** + * Computes the sha256 hash of a glob + * + * @param patterns Patterns separated by newlines + * @param currentWorkspace Workspace used when matching files + * @param options Glob options + * @param verbose Enables verbose logging + */ +function glob_hashFiles(patterns_1) { + return glob_awaiter(this, arguments, void 0, function* (patterns, currentWorkspace = '', options, verbose = false) { + let followSymbolicLinks = true; + if (options && typeof options.followSymbolicLinks === 'boolean') { + followSymbolicLinks = options.followSymbolicLinks; + } + const globber = yield create(patterns, { followSymbolicLinks }); + return hashFiles(globber, currentWorkspace, verbose); + }); +} +//# sourceMappingURL=glob.js.map + +/***/ }), + +/***/ 4012: +/***/ ((module) => { + +module.exports = /*#__PURE__*/JSON.parse('{"name":"@actions/cache","version":"6.2.0","description":"Actions cache lib","keywords":["github","actions","cache"],"homepage":"https://github.com/actions/toolkit/tree/main/packages/cache","license":"MIT","type":"module","main":"lib/cache.js","types":"lib/cache.d.ts","exports":{".":{"types":"./lib/cache.d.ts","import":"./lib/cache.js"}},"directories":{"lib":"lib","test":"__tests__"},"files":["lib","!.DS_Store"],"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/actions/toolkit.git","directory":"packages/cache"},"scripts":{"audit-moderate":"npm install && npm audit --json --audit-level=moderate > audit.json","test":"echo \\"Error: run tests from root\\" && exit 1","tsc":"tsc && cp src/internal/shared/package-version.cjs lib/internal/shared/"},"bugs":{"url":"https://github.com/actions/toolkit/issues"},"dependencies":{"@actions/core":"^3.0.1","@actions/exec":"^3.0.0","@actions/glob":"^0.6.1","@actions/http-client":"^4.0.1","@actions/io":"^3.0.2","@azure/core-rest-pipeline":"^1.23.0","@azure/storage-blob":"^12.31.0","@protobuf-ts/runtime-rpc":"^2.11.1","semver":"^7.7.4"},"devDependencies":{"@protobuf-ts/plugin":"^2.11.1","@types/node":"^25.6.0","@types/semver":"^7.7.1","typescript":"^5.9.3"},"overrides":{"uri-js":"npm:uri-js-replace@^1.0.1","node-fetch":"^3.3.2"}}'); + +/***/ }) + +}; diff --git a/dist/setup/index.js b/dist/setup/index.js index 9f4be9b9d..3b8ef45cf 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -1,46952 +1,19731 @@ import { createRequire as __WEBPACK_EXTERNAL_createRequire } from "module"; /******/ var __webpack_modules__ = ({ -/***/ 5878: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - +/***/ 9379: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.abort_add = abort_add; -exports.abort_remove = abort_remove; -exports.abort_signalAbort = abort_signalAbort; -const EventAlgorithm_1 = __nccwpck_require__(8012); -/** - * Adds an algorithm to the given abort signal. - * - * @param algorithm - an algorithm - * @param signal - abort signal - */ -function abort_add(algorithm, signal) { - /** - * 1. If signal’s aborted flag is set, then return. - * 2. Append algorithm to signal’s abort algorithms. - */ - if (signal._abortedFlag) - return; - signal._abortAlgorithms.add(algorithm); -} -/** - * Removes an algorithm from the given abort signal. - * - * @param algorithm - an algorithm - * @param signal - abort signal - */ -function abort_remove(algorithm, signal) { - /** - * To remove an algorithm algorithm from an AbortSignal signal, remove - * algorithm from signal’s abort algorithms. - */ - signal._abortAlgorithms.delete(algorithm); -} -/** - * Signals abort on the given abort signal. - * - * @param signal - abort signal - */ -function abort_signalAbort(signal) { - /** - * 1. If signal’s aborted flag is set, then return. - * 2. Set signal’s aborted flag. - * 3. For each algorithm in signal’s abort algorithms: run algorithm. - * 4. Empty signal’s abort algorithms. - * 5. Fire an event named abort at signal. - */ - if (signal._abortedFlag) - return; - signal._abortedFlag = true; - for (const algorithm of signal._abortAlgorithms) { - algorithm.call(signal); - } - signal._abortAlgorithms.clear(); - (0, EventAlgorithm_1.event_fireAnEvent)("abort", signal); -} -//# sourceMappingURL=AbortAlgorithm.js.map -/***/ }), -/***/ 8365: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +const ANY = Symbol('SemVer ANY') +// hoisted class for cyclic dependency +class Comparator { + static get ANY () { + return ANY + } + constructor (comp, options) { + options = parseOptions(options) -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.attr_setAnExistingAttributeValue = attr_setAnExistingAttributeValue; -const ElementAlgorithm_1 = __nccwpck_require__(2720); -/** - * Changes the value of an existing attribute. - * - * @param attribute - an attribute node - * @param value - attribute value - */ -function attr_setAnExistingAttributeValue(attribute, value) { - /** - * 1. If attribute’s element is null, then set attribute’s value to value. - * 2. Otherwise, change attribute from attribute’s element to value. - */ - if (attribute._element === null) { - attribute._value = value; + if (comp instanceof Comparator) { + if (comp.loose === !!options.loose) { + return comp + } else { + comp = comp.value + } } - else { - (0, ElementAlgorithm_1.element_change)(attribute, attribute._element, value); + + comp = comp.trim().split(/\s+/).join(' ') + debug('comparator', comp, options) + this.options = options + this.loose = !!options.loose + this.parse(comp) + + if (this.semver === ANY) { + this.value = '' + } else { + this.value = this.operator + this.semver.version } -} -//# sourceMappingURL=AttrAlgorithm.js.map -/***/ }), + debug('comp', this) + } -/***/ 8652: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + parse (comp) { + const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] + const m = comp.match(r) + if (!m) { + throw new TypeError(`Invalid comparator: ${comp}`) + } -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.boundaryPoint_position = boundaryPoint_position; -const interfaces_1 = __nccwpck_require__(9454); -const TreeAlgorithm_1 = __nccwpck_require__(3532); -/** - * Defines the position of a boundary point relative to another. - * - * @param bp - a boundary point - * @param relativeTo - a boundary point to compare to - */ -function boundaryPoint_position(bp, relativeTo) { - const nodeA = bp[0]; - const offsetA = bp[1]; - const nodeB = relativeTo[0]; - const offsetB = relativeTo[1]; - /** - * 1. Assert: nodeA and nodeB have the same root. - */ - console.assert((0, TreeAlgorithm_1.tree_rootNode)(nodeA) === (0, TreeAlgorithm_1.tree_rootNode)(nodeB), "Boundary points must share the same root node."); - /** - * 2. If nodeA is nodeB, then return equal if offsetA is offsetB, before - * if offsetA is less than offsetB, and after if offsetA is greater than - * offsetB. - */ - if (nodeA === nodeB) { - if (offsetA === offsetB) { - return interfaces_1.BoundaryPosition.Equal; - } - else if (offsetA < offsetB) { - return interfaces_1.BoundaryPosition.Before; - } - else { - return interfaces_1.BoundaryPosition.After; - } + this.operator = m[1] !== undefined ? m[1] : '' + if (this.operator === '=') { + this.operator = '' } - /** - * 3. If nodeA is following nodeB, then if the position of (nodeB, offsetB) - * relative to (nodeA, offsetA) is before, return after, and if it is after, - * return before. - */ - if ((0, TreeAlgorithm_1.tree_isFollowing)(nodeB, nodeA)) { - const pos = boundaryPoint_position([nodeB, offsetB], [nodeA, offsetA]); - if (pos === interfaces_1.BoundaryPosition.Before) { - return interfaces_1.BoundaryPosition.After; - } - else if (pos === interfaces_1.BoundaryPosition.After) { - return interfaces_1.BoundaryPosition.Before; - } + + // if it literally is just '>' or '' then allow anything. + if (!m[2]) { + this.semver = ANY + } else { + this.semver = new SemVer(m[2], this.options.loose) } - /** - * 4. If nodeA is an ancestor of nodeB: - */ - if ((0, TreeAlgorithm_1.tree_isAncestorOf)(nodeB, nodeA)) { - /** - * 4.1. Let child be nodeB. - * 4.2. While child is not a child of nodeA, set child to its parent. - * 4.3. If child’s index is less than offsetA, then return after. - */ - let child = nodeB; - while (!(0, TreeAlgorithm_1.tree_isChildOf)(nodeA, child)) { - /* istanbul ignore else */ - if (child._parent !== null) { - child = child._parent; - } - } - if ((0, TreeAlgorithm_1.tree_index)(child) < offsetA) { - return interfaces_1.BoundaryPosition.After; - } + } + + toString () { + return this.value + } + + test (version) { + debug('Comparator.test', version, this.options.loose) + + if (this.semver === ANY || version === ANY) { + return true } - /** - * 5. Return before. - */ - return interfaces_1.BoundaryPosition.Before; -} -//# sourceMappingURL=BoundaryPointAlgorithm.js.map -/***/ }), + if (typeof version === 'string') { + try { + version = new SemVer(version, this.options) + } catch (er) { + return false + } + } -/***/ 7785: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + return cmp(version, this.operator, this.semver, this.options) + } + intersects (comp, options) { + if (!(comp instanceof Comparator)) { + throw new TypeError('a Comparator is required') + } -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.characterData_replaceData = characterData_replaceData; -exports.characterData_substringData = characterData_substringData; -const DOMImpl_1 = __nccwpck_require__(698); -const util_1 = __nccwpck_require__(8247); -const DOMException_1 = __nccwpck_require__(7175); -const TreeAlgorithm_1 = __nccwpck_require__(3532); -const MutationObserverAlgorithm_1 = __nccwpck_require__(3243); -const DOMAlgorithm_1 = __nccwpck_require__(9484); -/** - * Replaces character data. - * - * @param node - a character data node - * @param offset - start offset - * @param count - count of characters to replace - * @param data - new data - */ -function characterData_replaceData(node, offset, count, data) { - /** - * 1. Let length be node’s length. - * 2. If offset is greater than length, then throw an "IndexSizeError" - * DOMException. - * 3. If offset plus count is greater than length, then set count to length - * minus offset. - */ - const length = (0, TreeAlgorithm_1.tree_nodeLength)(node); - if (offset > length) { - throw new DOMException_1.IndexSizeError(`Offset exceeds character data length. Offset: ${offset}, Length: ${length}, Node is ${node.nodeName}.`); + if (this.operator === '') { + if (this.value === '') { + return true + } + return new Range(comp.value, options).test(this.value) + } else if (comp.operator === '') { + if (comp.value === '') { + return true + } + return new Range(this.value, options).test(comp.semver) } - if (offset + count > length) { - count = length - offset; + + options = parseOptions(options) + + // Special cases where nothing can possibly be lower + if (options.includePrerelease && + (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) { + return false } - /** - * 4. Queue a mutation record of "characterData" for node with null, null, - * node’s data, « », « », null, and null. - */ - if (DOMImpl_1.dom.features.mutationObservers) { - (0, MutationObserverAlgorithm_1.observer_queueMutationRecord)("characterData", node, null, null, node._data, [], [], null, null); + if (!options.includePrerelease && + (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) { + return false } - /** - * 5. Insert data into node’s data after offset code units. - * 6. Let delete offset be offset + data’s length. - * 7. Starting from delete offset code units, remove count code units from - * node’s data. - */ - const newData = node._data.substring(0, offset) + data + - node._data.substring(offset + count); - node._data = newData; - /** - * 8. For each live range whose start node is node and start offset is - * greater than offset but less than or equal to offset plus count, set its - * start offset to offset. - * 9. For each live range whose end node is node and end offset is greater - * than offset but less than or equal to offset plus count, set its end - * offset to offset. - * 10. For each live range whose start node is node and start offset is - * greater than offset plus count, increase its start offset by data’s - * length and decrease it by count. - * 11. For each live range whose end node is node and end offset is greater - * than offset plus count, increase its end offset by data’s length and - * decrease it by count. - */ - for (const range of DOMImpl_1.dom.rangeList) { - if (range._start[0] === node && range._start[1] > offset && range._start[1] <= offset + count) { - range._start[1] = offset; - } - if (range._end[0] === node && range._end[1] > offset && range._end[1] <= offset + count) { - range._end[1] = offset; - } - if (range._start[0] === node && range._start[1] > offset + count) { - range._start[1] += data.length - count; - } - if (range._end[0] === node && range._end[1] > offset + count) { - range._end[1] += data.length - count; - } + + // Same direction increasing (> or >=) + if (this.operator.startsWith('>') && comp.operator.startsWith('>')) { + return true } - /** - * 12. If node is a Text node and its parent is not null, run the child - * text content change steps for node’s parent. - */ - if (DOMImpl_1.dom.features.steps) { - if (util_1.Guard.isTextNode(node) && node._parent !== null) { - (0, DOMAlgorithm_1.dom_runChildTextContentChangeSteps)(node._parent); - } + // Same direction decreasing (< or <=) + if (this.operator.startsWith('<') && comp.operator.startsWith('<')) { + return true } -} -/** - * Returns `count` number of characters from `node`'s data starting at - * the given `offset`. - * - * @param node - a character data node - * @param offset - start offset - * @param count - count of characters to return - */ -function characterData_substringData(node, offset, count) { - /** - * 1. Let length be node’s length. - * 2. If offset is greater than length, then throw an "IndexSizeError" - * DOMException. - * 3. If offset plus count is greater than length, return a string whose - * value is the code units from the offsetth code unit to the end of node’s - * data, and then return. - * 4. Return a string whose value is the code units from the offsetth code - * unit to the offset+countth code unit in node’s data. - */ - const length = (0, TreeAlgorithm_1.tree_nodeLength)(node); - if (offset > length) { - throw new DOMException_1.IndexSizeError(`Offset exceeds character data length. Offset: ${offset}, Length: ${length}, Node is ${node.nodeName}.`); + // same SemVer and both sides are inclusive (<= or >=) + if ( + (this.semver.version === comp.semver.version) && + this.operator.includes('=') && comp.operator.includes('=')) { + return true } - if (offset + count > length) { - return node._data.substr(offset); + // opposite directions less than + if (cmp(this.semver, '<', comp.semver, options) && + this.operator.startsWith('>') && comp.operator.startsWith('<')) { + return true } - else { - return node._data.substr(offset, count); + // opposite directions greater than + if (cmp(this.semver, '>', comp.semver, options) && + this.operator.startsWith('<') && comp.operator.startsWith('>')) { + return true } + return false + } } -//# sourceMappingURL=CharacterDataAlgorithm.js.map - -/***/ }), -/***/ 8308: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +module.exports = Comparator +const parseOptions = __nccwpck_require__(356) +const { safeRe: re, t } = __nccwpck_require__(5471) +const cmp = __nccwpck_require__(8646) +const debug = __nccwpck_require__(1159) +const SemVer = __nccwpck_require__(7163) +const Range = __nccwpck_require__(6782) -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.create_domImplementation = create_domImplementation; -exports.create_window = create_window; -exports.create_xmlDocument = create_xmlDocument; -exports.create_document = create_document; -exports.create_abortController = create_abortController; -exports.create_abortSignal = create_abortSignal; -exports.create_documentType = create_documentType; -exports.create_element = create_element; -exports.create_htmlElement = create_htmlElement; -exports.create_htmlUnknownElement = create_htmlUnknownElement; -exports.create_documentFragment = create_documentFragment; -exports.create_shadowRoot = create_shadowRoot; -exports.create_attr = create_attr; -exports.create_text = create_text; -exports.create_cdataSection = create_cdataSection; -exports.create_comment = create_comment; -exports.create_processingInstruction = create_processingInstruction; -exports.create_htmlCollection = create_htmlCollection; -exports.create_nodeList = create_nodeList; -exports.create_nodeListStatic = create_nodeListStatic; -exports.create_namedNodeMap = create_namedNodeMap; -exports.create_range = create_range; -exports.create_nodeIterator = create_nodeIterator; -exports.create_treeWalker = create_treeWalker; -exports.create_nodeFilter = create_nodeFilter; -exports.create_mutationRecord = create_mutationRecord; -exports.create_domTokenList = create_domTokenList; -const DOMImplementationImpl_1 = __nccwpck_require__(6348); -const WindowImpl_1 = __nccwpck_require__(1448); -const XMLDocumentImpl_1 = __nccwpck_require__(4602); -const DocumentImpl_1 = __nccwpck_require__(2113); -const AbortControllerImpl_1 = __nccwpck_require__(7528); -const AbortSignalImpl_1 = __nccwpck_require__(4560); -const DocumentTypeImpl_1 = __nccwpck_require__(1401); -const ElementImpl_1 = __nccwpck_require__(1342); -const DocumentFragmentImpl_1 = __nccwpck_require__(9793); -const ShadowRootImpl_1 = __nccwpck_require__(6092); -const AttrImpl_1 = __nccwpck_require__(2875); -const TextImpl_1 = __nccwpck_require__(4063); -const CDATASectionImpl_1 = __nccwpck_require__(4104); -const CommentImpl_1 = __nccwpck_require__(8223); -const ProcessingInstructionImpl_1 = __nccwpck_require__(2755); -const HTMLCollectionImpl_1 = __nccwpck_require__(9065); -const NodeListImpl_1 = __nccwpck_require__(5788); -const NodeListStaticImpl_1 = __nccwpck_require__(7654); -const NamedNodeMapImpl_1 = __nccwpck_require__(3145); -const RangeImpl_1 = __nccwpck_require__(3691); -const NodeIteratorImpl_1 = __nccwpck_require__(4142); -const TreeWalkerImpl_1 = __nccwpck_require__(6254); -const NodeFilterImpl_1 = __nccwpck_require__(4649); -const MutationRecordImpl_1 = __nccwpck_require__(33); -const DOMTokenListImpl_1 = __nccwpck_require__(6629); -/** - * Creates a `DOMImplementation`. - * - * @param document - associated document - */ -function create_domImplementation(document) { - return DOMImplementationImpl_1.DOMImplementationImpl._create(document); -} -/** - * Creates a `Window` node. - */ -function create_window() { - return WindowImpl_1.WindowImpl._create(); -} -/** - * Creates an `XMLDocument` node. - */ -function create_xmlDocument() { - return new XMLDocumentImpl_1.XMLDocumentImpl(); -} -/** - * Creates a `Document` node. - */ -function create_document() { - return new DocumentImpl_1.DocumentImpl(); -} -/** - * Creates an `AbortController`. - */ -function create_abortController() { - return new AbortControllerImpl_1.AbortControllerImpl(); -} -/** - * Creates an `AbortSignal`. - */ -function create_abortSignal() { - return AbortSignalImpl_1.AbortSignalImpl._create(); -} -/** - * Creates a `DocumentType` node. - * - * @param document - owner document - * @param name - name of the node - * @param publicId - `PUBLIC` identifier - * @param systemId - `SYSTEM` identifier - */ -function create_documentType(document, name, publicId, systemId) { - return DocumentTypeImpl_1.DocumentTypeImpl._create(document, name, publicId, systemId); -} -/** - * Creates a new `Element` node. - * - * @param document - owner document - * @param localName - local name - * @param namespace - namespace - * @param prefix - namespace prefix - */ -function create_element(document, localName, namespace, prefix) { - return ElementImpl_1.ElementImpl._create(document, localName, namespace, prefix); -} -/** - * Creates a new `HTMLElement` node. - * - * @param document - owner document - * @param localName - local name - * @param namespace - namespace - * @param prefix - namespace prefix - */ -function create_htmlElement(document, localName, namespace, prefix) { - // TODO: Implement in HTML DOM - return ElementImpl_1.ElementImpl._create(document, localName, namespace, prefix); -} -/** - * Creates a new `HTMLUnknownElement` node. - * - * @param document - owner document - * @param localName - local name - * @param namespace - namespace - * @param prefix - namespace prefix - */ -function create_htmlUnknownElement(document, localName, namespace, prefix) { - // TODO: Implement in HTML DOM - return ElementImpl_1.ElementImpl._create(document, localName, namespace, prefix); -} -/** - * Creates a new `DocumentFragment` node. - * - * @param document - owner document - */ -function create_documentFragment(document) { - return DocumentFragmentImpl_1.DocumentFragmentImpl._create(document); -} -/** - * Creates a new `ShadowRoot` node. - * - * @param document - owner document - * @param host - shadow root's host element node - */ -function create_shadowRoot(document, host) { - return ShadowRootImpl_1.ShadowRootImpl._create(document, host); -} -/** - * Creates a new `Attr` node. - * - * @param document - owner document - * @param localName - local name - */ -function create_attr(document, localName) { - return AttrImpl_1.AttrImpl._create(document, localName); -} -/** - * Creates a new `Text` node. - * - * @param document - owner document - * @param data - node contents - */ -function create_text(document, data) { - return TextImpl_1.TextImpl._create(document, data); -} -/** - * Creates a new `CDATASection` node. - * - * @param document - owner document - * @param data - node contents - */ -function create_cdataSection(document, data) { - return CDATASectionImpl_1.CDATASectionImpl._create(document, data); -} -/** - * Creates a new `Comment` node. - * - * @param document - owner document - * @param data - node contents - */ -function create_comment(document, data) { - return CommentImpl_1.CommentImpl._create(document, data); -} -/** - * Creates a new `ProcessingInstruction` node. - * - * @param document - owner document - * @param target - instruction target - * @param data - node contents - */ -function create_processingInstruction(document, target, data) { - return ProcessingInstructionImpl_1.ProcessingInstructionImpl._create(document, target, data); -} -/** - * Creates a new `HTMLCollection`. - * - * @param root - root node - * @param filter - node filter - */ -function create_htmlCollection(root, filter = (() => true)) { - return HTMLCollectionImpl_1.HTMLCollectionImpl._create(root, filter); -} -/** - * Creates a new live `NodeList`. - * - * @param root - root node - */ -function create_nodeList(root) { - return NodeListImpl_1.NodeListImpl._create(root); -} -/** - * Creates a new static `NodeList`. - * - * @param root - root node - * @param items - a list of items to initialize the list - */ -function create_nodeListStatic(root, items) { - return NodeListStaticImpl_1.NodeListStaticImpl._create(root, items); -} -/** - * Creates a new `NamedNodeMap`. - * - * @param element - parent element - */ -function create_namedNodeMap(element) { - return NamedNodeMapImpl_1.NamedNodeMapImpl._create(element); -} -/** - * Creates a new `Range`. - * - * @param start - start point - * @param end - end point - */ -function create_range(start, end) { - return RangeImpl_1.RangeImpl._create(start, end); -} -/** - * Creates a new `NodeIterator`. - * - * @param root - iterator's root node - * @param reference - reference node - * @param pointerBeforeReference - whether the iterator is before or after the - * reference node - */ -function create_nodeIterator(root, reference, pointerBeforeReference) { - return NodeIteratorImpl_1.NodeIteratorImpl._create(root, reference, pointerBeforeReference); -} -/** - * Creates a new `TreeWalker`. - * - * @param root - iterator's root node - * @param current - current node - */ -function create_treeWalker(root, current) { - return TreeWalkerImpl_1.TreeWalkerImpl._create(root, current); -} -/** - * Creates a new `NodeFilter`. - */ -function create_nodeFilter() { - return NodeFilterImpl_1.NodeFilterImpl._create(); -} -/** - * Creates a new `MutationRecord`. - * - * @param type - type of mutation: `"attributes"` for an attribute - * mutation, `"characterData"` for a mutation to a CharacterData node - * and `"childList"` for a mutation to the tree of nodes. - * @param target - node affected by the mutation. - * @param addedNodes - list of added nodes. - * @param removedNodes - list of removed nodes. - * @param previousSibling - previous sibling of added or removed nodes. - * @param nextSibling - next sibling of added or removed nodes. - * @param attributeName - local name of the changed attribute, - * and `null` otherwise. - * @param attributeNamespace - namespace of the changed attribute, - * and `null` otherwise. - * @param oldValue - value before mutation: attribute value for an attribute - * mutation, node `data` for a mutation to a CharacterData node and `null` - * for a mutation to the tree of nodes. - */ -function create_mutationRecord(type, target, addedNodes, removedNodes, previousSibling, nextSibling, attributeName, attributeNamespace, oldValue) { - return MutationRecordImpl_1.MutationRecordImpl._create(type, target, addedNodes, removedNodes, previousSibling, nextSibling, attributeName, attributeNamespace, oldValue); -} -/** - * Creates a new `DOMTokenList`. - * - * @param element - associated element - * @param attribute - associated attribute - */ -function create_domTokenList(element, attribute) { - return DOMTokenListImpl_1.DOMTokenListImpl._create(element, attribute); -} -//# sourceMappingURL=CreateAlgorithm.js.map /***/ }), -/***/ 5075: -/***/ ((__unused_webpack_module, exports) => { - +/***/ 6782: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.customElement_isValidCustomElementName = customElement_isValidCustomElementName; -exports.customElement_isValidElementName = customElement_isValidElementName; -exports.customElement_isVoidElementName = customElement_isVoidElementName; -exports.customElement_isValidShadowHostName = customElement_isValidShadowHostName; -exports.customElement_enqueueACustomElementUpgradeReaction = customElement_enqueueACustomElementUpgradeReaction; -exports.customElement_enqueueACustomElementCallbackReaction = customElement_enqueueACustomElementCallbackReaction; -exports.customElement_upgrade = customElement_upgrade; -exports.customElement_tryToUpgrade = customElement_tryToUpgrade; -exports.customElement_lookUpACustomElementDefinition = customElement_lookUpACustomElementDefinition; -const PotentialCustomElementName = /[a-z]([\0-\t\x2D\._a-z\xB7\xC0-\xD6\xD8-\xF6\xF8-\u037D\u037F-\u1FFF\u200C\u200D\u203F\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|[\uD800-\uDB7F][\uDC00-\uDFFF])*-([\0-\t\x2D\._a-z\xB7\xC0-\xD6\xD8-\xF6\xF8-\u037D\u037F-\u1FFF\u200C\u200D\u203F\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|[\uD800-\uDB7F][\uDC00-\uDFFF])*/; -const NamesWithHyphen = new Set(['annotation-xml', 'color-profile', - 'font-face', 'font-face-src', 'font-face-uri', 'font-face-format', - 'font-face-name', 'missing-glyph']); -const ElementNames = new Set(['article', 'aside', 'blockquote', - 'body', 'div', 'footer', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', - 'header', 'main', 'nav', 'p', 'section', 'span']); -const VoidElementNames = new Set(['area', 'base', 'basefont', - 'bgsound', 'br', 'col', 'embed', 'frame', 'hr', 'img', 'input', 'keygen', - 'link', 'menuitem', 'meta', 'param', 'source', 'track', 'wbr']); -const ShadowHostNames = new Set(['article', 'aside', 'blockquote', 'body', - 'div', 'footer', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header', 'main', - 'nav', 'p', 'section', 'span']); -/** - * Determines if the given string is a valid custom element name. - * - * @param name - a name string - */ -function customElement_isValidCustomElementName(name) { - if (!PotentialCustomElementName.test(name)) - return false; - if (NamesWithHyphen.has(name)) - return false; - return true; -} -/** - * Determines if the given string is a valid element name. - * - * @param name - a name string - */ -function customElement_isValidElementName(name) { - return (ElementNames.has(name)); -} -/** - * Determines if the given string is a void element name. - * - * @param name - a name string - */ -function customElement_isVoidElementName(name) { - return (VoidElementNames.has(name)); -} -/** - * Determines if the given string is a valid shadow host element name. - * - * @param name - a name string - */ -function customElement_isValidShadowHostName(name) { - return (ShadowHostNames.has(name)); -} -/** - * Enqueues an upgrade reaction for a custom element. - * - * @param element - a custom element - * @param definition - a custom element definition - */ -function customElement_enqueueACustomElementUpgradeReaction(element, definition) { - // TODO: Implement in HTML DOM -} -/** - * Enqueues a callback reaction for a custom element. - * - * @param element - a custom element - * @param callbackName - name of the callback - * @param args - callback arguments - */ -function customElement_enqueueACustomElementCallbackReaction(element, callbackName, args) { - // TODO: Implement in HTML DOM -} -/** - * Upgrade a custom element. - * - * @param element - a custom element - */ -function customElement_upgrade(definition, element) { - // TODO: Implement in HTML DOM -} -/** - * Tries to upgrade a custom element. - * - * @param element - a custom element - */ -function customElement_tryToUpgrade(element) { - // TODO: Implement in HTML DOM -} -/** - * Looks up a custom element definition. - * - * @param document - a document - * @param namespace - element namespace - * @param localName - element local name - * @param is - an `is` value - */ -function customElement_lookUpACustomElementDefinition(document, namespace, localName, is) { - // TODO: Implement in HTML DOM - return null; -} -//# sourceMappingURL=CustomElementAlgorithm.js.map -/***/ }), -/***/ 9484: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +const SPACE_CHARACTERS = /\s+/g +// hoisted class for cyclic dependency +class Range { + constructor (range, options) { + options = parseOptions(options) -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.dom_runRemovingSteps = dom_runRemovingSteps; -exports.dom_runCloningSteps = dom_runCloningSteps; -exports.dom_runAdoptingSteps = dom_runAdoptingSteps; -exports.dom_runAttributeChangeSteps = dom_runAttributeChangeSteps; -exports.dom_runInsertionSteps = dom_runInsertionSteps; -exports.dom_runNodeIteratorPreRemovingSteps = dom_runNodeIteratorPreRemovingSteps; -exports.dom_hasSupportedTokens = dom_hasSupportedTokens; -exports.dom_getSupportedTokens = dom_getSupportedTokens; -exports.dom_runEventConstructingSteps = dom_runEventConstructingSteps; -exports.dom_runChildTextContentChangeSteps = dom_runChildTextContentChangeSteps; -const DOMImpl_1 = __nccwpck_require__(698); -const TreeAlgorithm_1 = __nccwpck_require__(3532); -const util_1 = __nccwpck_require__(8247); -const ShadowTreeAlgorithm_1 = __nccwpck_require__(708); -const supportedTokens = new Map(); -/** - * Runs removing steps for node. - * - * @param removedNode - removed node - * @param oldParent - old parent node - */ -function dom_runRemovingSteps(removedNode, oldParent) { - // No steps defined -} -/** - * Runs cloning steps for node. - * - * @param copy - node clone - * @param node - node - * @param document - document to own the cloned node - * @param cloneChildrenFlag - whether child nodes are cloned - */ -function dom_runCloningSteps(copy, node, document, cloneChildrenFlag) { - // No steps defined -} -/** - * Runs adopting steps for node. - * - * @param node - node - * @param oldDocument - old document - */ -function dom_runAdoptingSteps(node, oldDocument) { - // No steps defined -} -/** - * Runs attribute change steps for an element node. - * - * @param element - element node owning the attribute - * @param localName - attribute's local name - * @param oldValue - attribute's old value - * @param value - attribute's new value - * @param namespace - attribute's namespace - */ -function dom_runAttributeChangeSteps(element, localName, oldValue, value, namespace) { - // run default steps - if (DOMImpl_1.dom.features.slots) { - updateASlotablesName.call(element, element, localName, oldValue, value, namespace); - updateASlotsName.call(element, element, localName, oldValue, value, namespace); - } - updateAnElementID.call(element, element, localName, value, namespace); - // run custom steps - for (const step of element._attributeChangeSteps) { - step.call(element, element, localName, oldValue, value, namespace); - } -} -/** - * Runs insertion steps for a node. - * - * @param insertedNode - inserted node - */ -function dom_runInsertionSteps(insertedNode) { - // No steps defined -} -/** - * Runs pre-removing steps for a node iterator and node. - * - * @param nodeIterator - a node iterator - * @param toBeRemoved - node to be removed - */ -function dom_runNodeIteratorPreRemovingSteps(nodeIterator, toBeRemoved) { - removeNodeIterator.call(nodeIterator, nodeIterator, toBeRemoved); -} -/** - * Determines if there are any supported tokens defined for the given - * attribute name. - * - * @param attributeName - an attribute name - */ -function dom_hasSupportedTokens(attributeName) { - return supportedTokens.has(attributeName); -} -/** - * Returns the set of supported tokens defined for the given attribute name. - * - * @param attributeName - an attribute name - */ -function dom_getSupportedTokens(attributeName) { - return supportedTokens.get(attributeName) || new Set(); -} -/** - * Runs event construction steps. - * - * @param event - an event - */ -function dom_runEventConstructingSteps(event) { - // No steps defined -} -/** - * Runs child text content change steps for a parent node. - * - * @param parent - parent node with text node child nodes - */ -function dom_runChildTextContentChangeSteps(parent) { - // No steps defined -} -/** - * Defines pre-removing steps for a node iterator. - */ -function removeNodeIterator(nodeIterator, toBeRemovedNode) { - /** - * 1. If toBeRemovedNode is not an inclusive ancestor of nodeIterator’s - * reference, or toBeRemovedNode is nodeIterator’s root, then return. - */ - if (toBeRemovedNode === nodeIterator._root || - !(0, TreeAlgorithm_1.tree_isAncestorOf)(nodeIterator._reference, toBeRemovedNode, true)) { - return; - } - /** - * 2. If nodeIterator’s pointer before reference is true, then: - */ - if (nodeIterator._pointerBeforeReference) { - /** - * 2.1. Let next be toBeRemovedNode’s first following node that is an - * inclusive descendant of nodeIterator’s root and is not an inclusive - * descendant of toBeRemovedNode, and null if there is no such node. - */ - while (true) { - const nextNode = (0, TreeAlgorithm_1.tree_getFollowingNode)(nodeIterator._root, toBeRemovedNode); - if (nextNode !== null && - (0, TreeAlgorithm_1.tree_isDescendantOf)(nodeIterator._root, nextNode, true) && - !(0, TreeAlgorithm_1.tree_isDescendantOf)(toBeRemovedNode, nextNode, true)) { - /** - * 2.2. If next is non-null, then set nodeIterator’s reference to next - * and return. - */ - nodeIterator._reference = nextNode; - return; - } - else if (nextNode === null) { - /** - * 2.3. Otherwise, set nodeIterator’s pointer before reference to false. - */ - nodeIterator._pointerBeforeReference = false; - return; - } - } - } - /** - * 3. Set nodeIterator’s reference to toBeRemovedNode’s parent, if - * toBeRemovedNode’s previous sibling is null, and to the inclusive - * descendant of toBeRemovedNode’s previous sibling that appears last in - * tree order otherwise. - */ - if (toBeRemovedNode._previousSibling === null) { - if (toBeRemovedNode._parent !== null) { - nodeIterator._reference = toBeRemovedNode._parent; - } - } - else { - let referenceNode = toBeRemovedNode._previousSibling; - let childNode = (0, TreeAlgorithm_1.tree_getFirstDescendantNode)(toBeRemovedNode._previousSibling, true, false); - while (childNode !== null) { - if (childNode !== null) { - referenceNode = childNode; - } - // loop through to get the last descendant node - childNode = (0, TreeAlgorithm_1.tree_getNextDescendantNode)(toBeRemovedNode._previousSibling, childNode, true, false); - } - nodeIterator._reference = referenceNode; - } -} -/** - * Defines attribute change steps to update a slot’s name. - */ -function updateASlotsName(element, localName, oldValue, value, namespace) { - /** - * 1. If element is a slot, localName is name, and namespace is null, then: - * 1.1. If value is oldValue, then return. - * 1.2. If value is null and oldValue is the empty string, then return. - * 1.3. If value is the empty string and oldValue is null, then return. - * 1.4. If value is null or the empty string, then set element’s name to the - * empty string. - * 1.5. Otherwise, set element’s name to value. - * 1.6. Run assign slotables for a tree with element’s root. - */ - if (util_1.Guard.isSlot(element) && localName === "name" && namespace === null) { - if (value === oldValue) - return; - if (value === null && oldValue === '') - return; - if (value === '' && oldValue === null) - return; - if ((value === null || value === '')) { - element._name = ''; - } - else { - element._name = value; - } - (0, ShadowTreeAlgorithm_1.shadowTree_assignSlotablesForATree)((0, TreeAlgorithm_1.tree_rootNode)(element)); - } -} -/** - * Defines attribute change steps to update a slotable’s name. - */ -function updateASlotablesName(element, localName, oldValue, value, namespace) { - /** - * 1. If localName is slot and namespace is null, then: - * 1.1. If value is oldValue, then return. - * 1.2. If value is null and oldValue is the empty string, then return. - * 1.3. If value is the empty string and oldValue is null, then return. - * 1.4. If value is null or the empty string, then set element’s name to - * the empty string. - * 1.5. Otherwise, set element’s name to value. - * 1.6. If element is assigned, then run assign slotables for element’s - * assigned slot. - * 1.7. Run assign a slot for element. - */ - if (util_1.Guard.isSlotable(element) && localName === "slot" && namespace === null) { - if (value === oldValue) - return; - if (value === null && oldValue === '') - return; - if (value === '' && oldValue === null) - return; - if ((value === null || value === '')) { - element._name = ''; - } - else { - element._name = value; - } - if ((0, ShadowTreeAlgorithm_1.shadowTree_isAssigned)(element)) { - (0, ShadowTreeAlgorithm_1.shadowTree_assignSlotables)(element._assignedSlot); - } - (0, ShadowTreeAlgorithm_1.shadowTree_assignASlot)(element); + if (range instanceof Range) { + if ( + range.loose === !!options.loose && + range.includePrerelease === !!options.includePrerelease + ) { + return range + } else { + return new Range(range.raw, options) + } } -} -/** - * Defines attribute change steps to update an element's ID. - */ -function updateAnElementID(element, localName, value, namespace) { - /** - * 1. If localName is id, namespace is null, and value is null or the empty - * string, then unset element’s ID. - * 2. Otherwise, if localName is id, namespace is null, then set element’s - * ID to value. - */ - if (localName === "id" && namespace === null) { - if (!value) - element._uniqueIdentifier = undefined; - else - element._uniqueIdentifier = value; + + if (range instanceof Comparator) { + // just put it in the set and return + this.raw = range.value + this.set = [[range]] + this.formatted = undefined + return this } -} -//# sourceMappingURL=DOMAlgorithm.js.map -/***/ }), + this.options = options + this.loose = !!options.loose + this.includePrerelease = !!options.includePrerelease -/***/ 6827: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + // First reduce all whitespace as much as possible so we do not have to rely + // on potentially slow regexes like \s*. This is then stored and used for + // future error messages as well. + this.raw = range.trim().replace(SPACE_CHARACTERS, ' ') + // First, split on || + this.set = this.raw + .split('||') + // map the range to a 2d array of comparators + .map(r => this.parseRange(r.trim())) + // throw out any comparator lists that are empty + // this generally means that it was not a valid range, which is allowed + // in loose mode, but will still throw if the WHOLE range is invalid. + .filter(c => c.length) -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.tokenList_validationSteps = tokenList_validationSteps; -exports.tokenList_updateSteps = tokenList_updateSteps; -exports.tokenList_serializeSteps = tokenList_serializeSteps; -const OrderedSetAlgorithm_1 = __nccwpck_require__(8421); -const DOMAlgorithm_1 = __nccwpck_require__(9484); -const ElementAlgorithm_1 = __nccwpck_require__(2720); -/** - * Validates a given token against the supported tokens defined for the given - * token lists' associated attribute. - * - * @param tokenList - a token list - * @param token - a token - */ -function tokenList_validationSteps(tokenList, token) { - /** - * 1. If the associated attribute’s local name does not define supported - * tokens, throw a TypeError. - * 2. Let lowercase token be a copy of token, in ASCII lowercase. - * 3. If lowercase token is present in supported tokens, return true. - * 4. Return false. - */ - if (!(0, DOMAlgorithm_1.dom_hasSupportedTokens)(tokenList._attribute._localName)) { - throw new TypeError(`There are no supported tokens defined for attribute name: '${tokenList._attribute._localName}'.`); - } - return (0, DOMAlgorithm_1.dom_getSupportedTokens)(tokenList._attribute._localName).has(token.toLowerCase()); -} -/** - * Updates the value of the token lists' associated attribute. - * - * @param tokenList - a token list - */ -function tokenList_updateSteps(tokenList) { - /** - * 1. If the associated element does not have an associated attribute and - * token set is empty, then return. - * 2. Set an attribute value for the associated element using associated - * attribute’s local name and the result of running the ordered set - * serializer for token set. - */ - if (!tokenList._element.hasAttribute(tokenList._attribute._localName) && - tokenList._tokenSet.size === 0) { - return; + if (!this.set.length) { + throw new TypeError(`Invalid SemVer Range: ${this.raw}`) } - (0, ElementAlgorithm_1.element_setAnAttributeValue)(tokenList._element, tokenList._attribute._localName, (0, OrderedSetAlgorithm_1.orderedSet_serialize)(tokenList._tokenSet)); -} -/** - * Gets the value of the token lists' associated attribute. - * - * @param tokenList - a token list - */ -function tokenList_serializeSteps(tokenList) { - /** - * A DOMTokenList object’s serialize steps are to return the result of - * running get an attribute value given the associated element and the - * associated attribute’s local name. - */ - return (0, ElementAlgorithm_1.element_getAnAttributeValue)(tokenList._element, tokenList._attribute._localName); -} -//# sourceMappingURL=DOMTokenListAlgorithm.js.map -/***/ }), - -/***/ 1327: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + // if we have any that are not the null set, throw out null sets. + if (this.set.length > 1) { + // keep the first one, in case they're all null sets + const first = this.set[0] + this.set = this.set.filter(c => !isNullSet(c[0])) + if (this.set.length === 0) { + this.set = [first] + } else if (this.set.length > 1) { + // if we have any that are *, then the range is just * + for (const c of this.set) { + if (c.length === 1 && isAny(c[0])) { + this.set = [c] + break + } + } + } + } + this.formatted = undefined + } -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.document_elementInterface = document_elementInterface; -exports.document_internalCreateElementNS = document_internalCreateElementNS; -exports.document_adopt = document_adopt; -const DOMImpl_1 = __nccwpck_require__(698); -const util_1 = __nccwpck_require__(8247); -const util_2 = __nccwpck_require__(7061); -const ElementImpl_1 = __nccwpck_require__(1342); -const CustomElementAlgorithm_1 = __nccwpck_require__(5075); -const TreeAlgorithm_1 = __nccwpck_require__(3532); -const NamespaceAlgorithm_1 = __nccwpck_require__(9733); -const DOMAlgorithm_1 = __nccwpck_require__(9484); -const ElementAlgorithm_1 = __nccwpck_require__(2720); -const MutationAlgorithm_1 = __nccwpck_require__(45); -/** - * Returns an element interface for the given name and namespace. - * - * @param name - element name - * @param namespace - namespace - */ -function document_elementInterface(name, namespace) { - return ElementImpl_1.ElementImpl; -} -/** - * Creates a new element node. - * See: https://dom.spec.whatwg.org/#internal-createelementns-steps - * - * @param document - owner document - * @param namespace - element namespace - * @param qualifiedName - qualified name - * @param options - element options - */ -function document_internalCreateElementNS(document, namespace, qualifiedName, options) { - /** - * 1. Let namespace, prefix, and localName be the result of passing - * namespace and qualifiedName to validate and extract. - * 2. Let is be null. - * 3. If options is a dictionary and options’s is is present, then set - * is to it. - * 4. Return the result of creating an element given document, localName, - * namespace, prefix, is, and with the synchronous custom elements flag set. - */ - const [ns, prefix, localName] = (0, NamespaceAlgorithm_1.namespace_validateAndExtract)(namespace, qualifiedName); - let is = null; - if (options !== undefined) { - if ((0, util_2.isString)(options)) { - is = options; - } - else { - is = options.is; + get range () { + if (this.formatted === undefined) { + this.formatted = '' + for (let i = 0; i < this.set.length; i++) { + if (i > 0) { + this.formatted += '||' } - } - return (0, ElementAlgorithm_1.element_createAnElement)(document, localName, ns, prefix, is, true); -} -/** - * Removes `node` and its subtree from its document and changes - * its owner document to `document` so that it can be inserted - * into `document`. - * - * @param node - the node to move - * @param document - document to receive the node and its subtree - */ -function document_adopt(node, document) { - // Optimize for common case of inserting a fresh node - if (node._nodeDocument === document && node._parent === null) { - return; - } - /** - * 1. Let oldDocument be node’s node document. - * 2. If node’s parent is not null, remove node from its parent. - */ - const oldDocument = node._nodeDocument; - if (node._parent) - (0, MutationAlgorithm_1.mutation_remove)(node, node._parent); - /** - * 3. If document is not oldDocument, then: - */ - if (document !== oldDocument) { - /** - * 3.1. For each inclusiveDescendant in node’s shadow-including inclusive - * descendants: - */ - let inclusiveDescendant = (0, TreeAlgorithm_1.tree_getFirstDescendantNode)(node, true, true); - while (inclusiveDescendant !== null) { - /** - * 3.1.1. Set inclusiveDescendant’s node document to document. - * 3.1.2. If inclusiveDescendant is an element, then set the node - * document of each attribute in inclusiveDescendant’s attribute list - * to document. - */ - inclusiveDescendant._nodeDocument = document; - if (util_1.Guard.isElementNode(inclusiveDescendant)) { - for (const attr of inclusiveDescendant._attributeList._asArray()) { - attr._nodeDocument = document; - } - } - /** - * 3.2. For each inclusiveDescendant in node's shadow-including - * inclusive descendants that is custom, enqueue a custom - * element callback reaction with inclusiveDescendant, - * callback name "adoptedCallback", and an argument list - * containing oldDocument and document. - */ - if (DOMImpl_1.dom.features.customElements) { - if (util_1.Guard.isElementNode(inclusiveDescendant) && - inclusiveDescendant._customElementState === "custom") { - (0, CustomElementAlgorithm_1.customElement_enqueueACustomElementCallbackReaction)(inclusiveDescendant, "adoptedCallback", [oldDocument, document]); - } - } - /** - * 3.3. For each inclusiveDescendant in node’s shadow-including - * inclusive descendants, in shadow-including tree order, run the - * adopting steps with inclusiveDescendant and oldDocument. - */ - if (DOMImpl_1.dom.features.steps) { - (0, DOMAlgorithm_1.dom_runAdoptingSteps)(inclusiveDescendant, oldDocument); - } - inclusiveDescendant = (0, TreeAlgorithm_1.tree_getNextDescendantNode)(node, inclusiveDescendant, true, true); + const comps = this.set[i] + for (let k = 0; k < comps.length; k++) { + if (k > 0) { + this.formatted += ' ' + } + this.formatted += comps[k].toString().trim() } + } } -} -//# sourceMappingURL=DocumentAlgorithm.js.map + return this.formatted + } -/***/ }), + format () { + return this.range + } -/***/ 2720: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + toString () { + return this.range + } + parseRange (range) { + // strip build metadata so it can't bleed into the version + range = range.replace(BUILDSTRIPRE, '') -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.element_has = element_has; -exports.element_change = element_change; -exports.element_append = element_append; -exports.element_remove = element_remove; -exports.element_replace = element_replace; -exports.element_getAnAttributeByName = element_getAnAttributeByName; -exports.element_getAnAttributeByNamespaceAndLocalName = element_getAnAttributeByNamespaceAndLocalName; -exports.element_getAnAttributeValue = element_getAnAttributeValue; -exports.element_setAnAttribute = element_setAnAttribute; -exports.element_setAnAttributeValue = element_setAnAttributeValue; -exports.element_removeAnAttributeByName = element_removeAnAttributeByName; -exports.element_removeAnAttributeByNamespaceAndLocalName = element_removeAnAttributeByNamespaceAndLocalName; -exports.element_createAnElement = element_createAnElement; -exports.element_insertAdjacent = element_insertAdjacent; -const DOMImpl_1 = __nccwpck_require__(698); -const infra_1 = __nccwpck_require__(4737); -const util_1 = __nccwpck_require__(8247); -const DOMException_1 = __nccwpck_require__(7175); -const CreateAlgorithm_1 = __nccwpck_require__(8308); -const CustomElementAlgorithm_1 = __nccwpck_require__(5075); -const MutationObserverAlgorithm_1 = __nccwpck_require__(3243); -const DOMAlgorithm_1 = __nccwpck_require__(9484); -const MutationAlgorithm_1 = __nccwpck_require__(45); -const DocumentAlgorithm_1 = __nccwpck_require__(1327); -/** - * Determines whether the element's attribute list contains the given - * attribute. - * - * @param attribute - an attribute node - * @param element - an element node - */ -function element_has(attribute, element) { - /** - * An element has an attribute A if its attribute list contains A. - */ - return element._attributeList._asArray().indexOf(attribute) !== -1; -} -/** - * Changes the value of an attribute node. - * - * @param attribute - an attribute node - * @param element - an element node - * @param value - attribute value - */ -function element_change(attribute, element, value) { - /** - * 1. Queue an attribute mutation record for element with attribute’s - * local name, attribute’s namespace, and attribute’s value. - */ - if (DOMImpl_1.dom.features.mutationObservers) { - (0, MutationObserverAlgorithm_1.observer_queueAttributeMutationRecord)(element, attribute._localName, attribute._namespace, attribute._value); - } - /** - * 2. If element is custom, then enqueue a custom element callback reaction - * with element, callback name "attributeChangedCallback", and an argument - * list containing attribute’s local name, attribute’s value, value, and - * attribute’s namespace. - */ - if (DOMImpl_1.dom.features.customElements) { - if (util_1.Guard.isCustomElementNode(element)) { - (0, CustomElementAlgorithm_1.customElement_enqueueACustomElementCallbackReaction)(element, "attributeChangedCallback", [attribute._localName, attribute._value, value, attribute._namespace]); - } - } - /** - * 3. Run the attribute change steps with element, attribute’s local name, - * attribute’s value, value, and attribute’s namespace. - * 4. Set attribute’s value to value. - */ - if (DOMImpl_1.dom.features.steps) { - (0, DOMAlgorithm_1.dom_runAttributeChangeSteps)(element, attribute._localName, attribute._value, value, attribute._namespace); - } - attribute._value = value; -} -/** - * Appends an attribute to an element node. - * - * @param attribute - an attribute - * @param element - an element to receive the attribute - */ -function element_append(attribute, element) { - /** - * 1. Queue an attribute mutation record for element with attribute’s - * local name, attribute’s namespace, and null. - */ - if (DOMImpl_1.dom.features.mutationObservers) { - (0, MutationObserverAlgorithm_1.observer_queueAttributeMutationRecord)(element, attribute._localName, attribute._namespace, null); - } - /** - * 2. If element is custom, then enqueue a custom element callback reaction - * with element, callback name "attributeChangedCallback", and an argument - * list containing attribute’s local name, null, attribute’s value, and - * attribute’s namespace. - */ - if (DOMImpl_1.dom.features.customElements) { - if (util_1.Guard.isCustomElementNode(element)) { - (0, CustomElementAlgorithm_1.customElement_enqueueACustomElementCallbackReaction)(element, "attributeChangedCallback", [attribute._localName, null, attribute._value, attribute._namespace]); - } - } - /** - * 3. Run the attribute change steps with element, attribute’s local name, - * null, attribute’s value, and attribute’s namespace. - */ - if (DOMImpl_1.dom.features.steps) { - (0, DOMAlgorithm_1.dom_runAttributeChangeSteps)(element, attribute._localName, null, attribute._value, attribute._namespace); - } - /** - * 4. Append attribute to element’s attribute list. - * 5. Set attribute’s element to element. - */ - element._attributeList._asArray().push(attribute); - attribute._element = element; - // mark that the document has namespaces - if (!element._nodeDocument._hasNamespaces && (attribute._namespace !== null || - attribute._namespacePrefix !== null || attribute._localName === "xmlns")) { - element._nodeDocument._hasNamespaces = true; - } -} -/** - * Removes an attribute from an element node. - * - * @param attribute - an attribute - * @param element - an element to receive the attribute - */ -function element_remove(attribute, element) { - /** - * 1. Queue an attribute mutation record for element with attribute’s - * local name, attribute’s namespace, and attribute’s value. - */ - if (DOMImpl_1.dom.features.mutationObservers) { - (0, MutationObserverAlgorithm_1.observer_queueAttributeMutationRecord)(element, attribute._localName, attribute._namespace, attribute._value); - } - /** - * 2. If element is custom, then enqueue a custom element callback reaction - * with element, callback name "attributeChangedCallback", and an argument - * list containing attribute’s local name, attribute’s value, null, - * and attribute’s namespace. - */ - if (DOMImpl_1.dom.features.customElements) { - if (util_1.Guard.isCustomElementNode(element)) { - (0, CustomElementAlgorithm_1.customElement_enqueueACustomElementCallbackReaction)(element, "attributeChangedCallback", [attribute._localName, attribute._value, null, attribute._namespace]); - } + // memoize range parsing for performance. + // this is a very hot path, and fully deterministic. + const memoOpts = + (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) | + (this.options.loose && FLAG_LOOSE) + const memoKey = memoOpts + ':' + range + const cached = cache.get(memoKey) + if (cached) { + return cached } - /** - * 3. Run the attribute change steps with element, attribute’s local name, - * attribute’s value, null, and attribute’s namespace. - */ - if (DOMImpl_1.dom.features.steps) { - (0, DOMAlgorithm_1.dom_runAttributeChangeSteps)(element, attribute._localName, attribute._value, null, attribute._namespace); + + const loose = this.options.loose + // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` + const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE] + range = range.replace(hr, hyphenReplace(this.options.includePrerelease)) + debug('hyphen replace', range) + + // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` + range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace) + debug('comparator trim', range) + + // `~ 1.2.3` => `~1.2.3` + range = range.replace(re[t.TILDETRIM], tildeTrimReplace) + debug('tilde trim', range) + + // `^ 1.2.3` => `^1.2.3` + range = range.replace(re[t.CARETTRIM], caretTrimReplace) + debug('caret trim', range) + + // At this point, the range is completely trimmed and + // ready to be split into comparators. + + let rangeList = range + .split(' ') + .map(comp => parseComparator(comp, this.options)) + .join(' ') + .split(/\s+/) + // >=0.0.0 is equivalent to * + .map(comp => replaceGTE0(comp, this.options)) + + if (loose) { + // in loose mode, throw out any that are not valid comparators + rangeList = rangeList.filter(comp => { + debug('loose invalid filter', comp, this.options) + return !!comp.match(re[t.COMPARATORLOOSE]) + }) } - /** - * 3. Remove attribute from element’s attribute list. - * 5. Set attribute’s element to null. - */ - const index = element._attributeList._asArray().indexOf(attribute); - element._attributeList._asArray().splice(index, 1); - attribute._element = null; -} -/** - * Replaces an attribute with another of an element node. - * - * @param oldAttr - old attribute - * @param newAttr - new attribute - * @param element - an element to receive the attribute - */ -function element_replace(oldAttr, newAttr, element) { - /** - * 1. Queue an attribute mutation record for element with oldAttr’s - * local name, oldAttr’s namespace, and oldAttr’s value. - */ - if (DOMImpl_1.dom.features.mutationObservers) { - (0, MutationObserverAlgorithm_1.observer_queueAttributeMutationRecord)(element, oldAttr._localName, oldAttr._namespace, oldAttr._value); + debug('range list', rangeList) + + // if any comparators are the null set, then replace with JUST null set + // if more than one comparator, remove any * comparators + // also, don't include the same comparator more than once + const rangeMap = new Map() + const comparators = rangeList.map(comp => new Comparator(comp, this.options)) + for (const comp of comparators) { + if (isNullSet(comp)) { + return [comp] + } + rangeMap.set(comp.value, comp) } - /** - * 2. If element is custom, then enqueue a custom element callback reaction - * with element, callback name "attributeChangedCallback", and an argument - * list containing oldAttr’s local name, oldAttr’s value, newAttr’s value, - * and oldAttr’s namespace. - */ - if (DOMImpl_1.dom.features.customElements) { - if (util_1.Guard.isCustomElementNode(element)) { - (0, CustomElementAlgorithm_1.customElement_enqueueACustomElementCallbackReaction)(element, "attributeChangedCallback", [oldAttr._localName, oldAttr._value, newAttr._value, oldAttr._namespace]); - } + if (rangeMap.size > 1 && rangeMap.has('')) { + rangeMap.delete('') } - /** - * 3. Run the attribute change steps with element, oldAttr’s local name, - * oldAttr’s value, newAttr’s value, and oldAttr’s namespace. - */ - if (DOMImpl_1.dom.features.steps) { - (0, DOMAlgorithm_1.dom_runAttributeChangeSteps)(element, oldAttr._localName, oldAttr._value, newAttr._value, oldAttr._namespace); + + const result = [...rangeMap.values()] + cache.set(memoKey, result) + return result + } + + intersects (range, options) { + if (!(range instanceof Range)) { + throw new TypeError('a Range is required') } - /** - * 4. Replace oldAttr by newAttr in element’s attribute list. - * 5. Set oldAttr’s element to null. - * 6. Set newAttr’s element to element. - */ - const index = element._attributeList._asArray().indexOf(oldAttr); - if (index !== -1) { - element._attributeList._asArray()[index] = newAttr; + + return this.set.some((thisComparators) => { + return ( + isSatisfiable(thisComparators, options) && + range.set.some((rangeComparators) => { + return ( + isSatisfiable(rangeComparators, options) && + thisComparators.every((thisComparator) => { + return rangeComparators.every((rangeComparator) => { + return thisComparator.intersects(rangeComparator, options) + }) + }) + ) + }) + ) + }) + } + + // if ANY of the sets match ALL of its comparators, then pass + test (version) { + if (!version) { + return false } - oldAttr._element = null; - newAttr._element = element; - // mark that the document has namespaces - if (!element._nodeDocument._hasNamespaces && (newAttr._namespace !== null || - newAttr._namespacePrefix !== null || newAttr._localName === "xmlns")) { - element._nodeDocument._hasNamespaces = true; + + if (typeof version === 'string') { + try { + version = new SemVer(version, this.options) + } catch (er) { + return false + } } -} -/** - * Retrieves an attribute with the given name from an element node. - * - * @param qualifiedName - an attribute name - * @param element - an element to receive the attribute - */ -function element_getAnAttributeByName(qualifiedName, element) { - /** - * 1. If element is in the HTML namespace and its node document is an HTML - * document, then set qualifiedName to qualifiedName in ASCII lowercase. - * 2. Return the first attribute in element’s attribute list whose qualified - * name is qualifiedName, and null otherwise. - */ - if (element._namespace === infra_1.namespace.HTML && element._nodeDocument._type === "html") { - qualifiedName = qualifiedName.toLowerCase(); + + for (let i = 0; i < this.set.length; i++) { + if (testSet(this.set[i], version, this.options)) { + return true + } } - return element._attributeList._asArray().find(attr => attr._qualifiedName === qualifiedName) || null; -} -/** - * Retrieves an attribute with the given namespace and local name from an - * element node. - * - * @param namespace - an attribute namespace - * @param localName - an attribute local name - * @param element - an element to receive the attribute - */ -function element_getAnAttributeByNamespaceAndLocalName(namespace, localName, element) { - /** - * 1. If namespace is the empty string, set it to null. - * 2. Return the attribute in element’s attribute list whose namespace is - * namespace and local name is localName, if any, and null otherwise. - */ - const ns = namespace || null; - return element._attributeList._asArray().find(attr => attr._namespace === ns && attr._localName === localName) || null; + return false + } } -/** - * Retrieves an attribute's value with the given name namespace and local - * name from an element node. - * - * @param element - an element to receive the attribute - * @param localName - an attribute local name - * @param namespace - an attribute namespace - */ -function element_getAnAttributeValue(element, localName, namespace = '') { - /** - * 1. Let attr be the result of getting an attribute given namespace, - * localName, and element. - * 2. If attr is null, then return the empty string. - * 3. Return attr’s value. - */ - const attr = element_getAnAttributeByNamespaceAndLocalName(namespace, localName, element); - if (attr === null) - return ''; - else - return attr._value; + +module.exports = Range + +const LRU = __nccwpck_require__(1383) +const cache = new LRU() + +const parseOptions = __nccwpck_require__(356) +const Comparator = __nccwpck_require__(9379) +const debug = __nccwpck_require__(1159) +const SemVer = __nccwpck_require__(7163) +const { + safeRe: re, + src, + t, + comparatorTrimReplace, + tildeTrimReplace, + caretTrimReplace, +} = __nccwpck_require__(5471) +const { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = __nccwpck_require__(5101) + +// unbounded global build-metadata stripper used by parseRange +const BUILDSTRIPRE = new RegExp(src[t.BUILD], 'g') + +const isNullSet = c => c.value === '<0.0.0-0' +const isAny = c => c.value === '' + +// take a set of comparators and determine whether there +// exists a version which can satisfy it +const isSatisfiable = (comparators, options) => { + let result = true + const remainingComparators = comparators.slice() + let testComparator = remainingComparators.pop() + + while (result && remainingComparators.length) { + result = remainingComparators.every((otherComparator) => { + return testComparator.intersects(otherComparator, options) + }) + + testComparator = remainingComparators.pop() + } + + return result } -/** - * Sets an attribute of an element node. - * - * @param attr - an attribute - * @param element - an element to receive the attribute - */ -function element_setAnAttribute(attr, element) { - /** - * 1. If attr’s element is neither null nor element, throw an - * "InUseAttributeError" DOMException. - * 2. Let oldAttr be the result of getting an attribute given attr’s - * namespace, attr’s local name, and element. - * 3. If oldAttr is attr, return attr. - * 4. If oldAttr is non-null, replace it by attr in element. - * 5. Otherwise, append attr to element. - * 6. Return oldAttr. - */ - if (attr._element !== null && attr._element !== element) - throw new DOMException_1.InUseAttributeError(`This attribute already exists in the document: ${attr._qualifiedName} as a child of ${attr._element._qualifiedName}.`); - const oldAttr = element_getAnAttributeByNamespaceAndLocalName(attr._namespace || '', attr._localName, element); - if (oldAttr === attr) - return attr; - if (oldAttr !== null) { - element_replace(oldAttr, attr, element); - } - else { - element_append(attr, element); - } - return oldAttr; + +// comprised of xranges, tildes, stars, and gtlt's at this point. +// already replaced the hyphen ranges +// turn into a set of JUST comparators. +const parseComparator = (comp, options) => { + comp = comp.replace(re[t.BUILD], '') + debug('comp', comp, options) + comp = replaceCarets(comp, options) + debug('caret', comp) + comp = replaceTildes(comp, options) + debug('tildes', comp) + comp = replaceXRanges(comp, options) + debug('xrange', comp) + comp = replaceStars(comp, options) + debug('stars', comp) + return comp } -/** - * Sets an attribute's value of an element node. - * - * @param element - an element to receive the attribute - * @param localName - an attribute local name - * @param value - an attribute value - * @param prefix - an attribute prefix - * @param namespace - an attribute namespace - */ -function element_setAnAttributeValue(element, localName, value, prefix = null, namespace = null) { - /** - * 1. If prefix is not given, set it to null. - * 2. If namespace is not given, set it to null. - * 3. Let attribute be the result of getting an attribute given namespace, - * localName, and element. - * 4. If attribute is null, create an attribute whose namespace is - * namespace, namespace prefix is prefix, local name is localName, value - * is value, and node document is element’s node document, then append this - * attribute to element, and then return. - * 5. Change attribute from element to value. - */ - const attribute = element_getAnAttributeByNamespaceAndLocalName(namespace || '', localName, element); - if (attribute === null) { - const newAttr = (0, CreateAlgorithm_1.create_attr)(element._nodeDocument, localName); - newAttr._namespace = namespace; - newAttr._namespacePrefix = prefix; - newAttr._value = value; - element_append(newAttr, element); - return; - } - element_change(attribute, element, value); + +const isX = id => !id || id.toLowerCase() === 'x' || id === '*' + +const invalidXRangeOrder = (M, m, p) => ( + (isX(M) && !isX(m)) || + (isX(m) && p && !isX(p)) +) + +// ~, ~> --> * (any, kinda silly) +// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0 +// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0 +// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0 +// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0 +// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0 +// ~0.0.1 --> >=0.0.1 <0.1.0-0 +const replaceTildes = (comp, options) => { + return comp + .trim() + .split(/\s+/) + .map((c) => replaceTilde(c, options)) + .join(' ') } -/** - * Removes an attribute with the given name from an element node. - * - * @param qualifiedName - an attribute name - * @param element - an element to receive the attribute - */ -function element_removeAnAttributeByName(qualifiedName, element) { - /** - * 1. Let attr be the result of getting an attribute given qualifiedName - * and element. - * 2. If attr is non-null, remove it from element. - * 3. Return attr. - */ - const attr = element_getAnAttributeByName(qualifiedName, element); - if (attr !== null) { - element_remove(attr, element); + +const replaceTilde = (comp, options) => { + const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE] + // if we're including prereleases in the match, then the lower bound is + // -0, the lowest possible prerelease value, just like x-ranges and carets. + // this keeps `~1.2` equivalent to the `1.2.x` x-range it's documented as. + const z = options.includePrerelease ? '-0' : '' + return comp.replace(r, (_, M, m, p, pr) => { + debug('tilde', comp, _, M, m, p, pr) + let ret + + if (isX(M)) { + ret = '' + } else if (isX(m)) { + ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0` + } else if (isX(p)) { + // ~1.2 == >=1.2.0 <1.3.0-0 + ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0` + } else if (pr) { + debug('replaceTilde pr', pr) + ret = `>=${M}.${m}.${p}-${pr + } <${M}.${+m + 1}.0-0` + } else { + // ~1.2.3 == >=1.2.3 <1.3.0-0 + ret = `>=${M}.${m}.${p + } <${M}.${+m + 1}.0-0` } - return attr; + + debug('tilde return', ret) + return ret + }) } -/** - * Removes an attribute with the given namespace and local name from an - * element node. - * - * @param namespace - an attribute namespace - * @param localName - an attribute local name - * @param element - an element to receive the attribute - */ -function element_removeAnAttributeByNamespaceAndLocalName(namespace, localName, element) { - /** - * 1. Let attr be the result of getting an attribute given namespace, localName, and element. - * 2. If attr is non-null, remove it from element. - * 3. Return attr. - */ - const attr = element_getAnAttributeByNamespaceAndLocalName(namespace, localName, element); - if (attr !== null) { - element_remove(attr, element); - } - return attr; + +// ^ --> * (any, kinda silly) +// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0 +// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0 +// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0 +// ^1.2.3 --> >=1.2.3 <2.0.0-0 +// ^1.2.0 --> >=1.2.0 <2.0.0-0 +// ^0.0.1 --> >=0.0.1 <0.0.2-0 +// ^0.1.0 --> >=0.1.0 <0.2.0-0 +const replaceCarets = (comp, options) => { + return comp + .trim() + .split(/\s+/) + .map((c) => replaceCaret(c, options)) + .join(' ') } -/** - * Creates an element node. - * See: https://dom.spec.whatwg.org/#concept-create-element. - * - * @param document - the document owning the element - * @param localName - local name - * @param namespace - element namespace - * @param prefix - namespace prefix - * @param is - the "is" value - * @param synchronousCustomElementsFlag - synchronous custom elements flag - */ -function element_createAnElement(document, localName, namespace, prefix = null, is = null, synchronousCustomElementsFlag = false) { - /** - * 1. If prefix was not given, let prefix be null. - * 2. If is was not given, let is be null. - * 3. Let result be null. - */ - let result = null; - if (!DOMImpl_1.dom.features.customElements) { - result = (0, CreateAlgorithm_1.create_element)(document, localName, namespace, prefix); - result._customElementState = "uncustomized"; - result._customElementDefinition = null; - result._is = is; - return result; - } - /** - * 4. Let definition be the result of looking up a custom element definition - * given document, namespace, localName, and is. - */ - const definition = (0, CustomElementAlgorithm_1.customElement_lookUpACustomElementDefinition)(document, namespace, localName, is); - if (definition !== null && definition.name !== definition.localName) { - /** - * 5. If definition is non-null, and definition’s name is not equal to - * its local name (i.e., definition represents a customized built-in - * element), then: - * 5.1. Let interface be the element interface for localName and the HTML - * namespace. - * 5.2. Set result to a new element that implements interface, with no - * attributes, namespace set to the HTML namespace, namespace prefix - * set to prefix, local name set to localName, custom element state set - * to "undefined", custom element definition set to null, is value set - * to is, and node document set to document. - * 5.3. If the synchronous custom elements flag is set, upgrade element - * using definition. - * 5.4. Otherwise, enqueue a custom element upgrade reaction given result - * and definition. - */ - const elemenInterface = (0, DocumentAlgorithm_1.document_elementInterface)(localName, infra_1.namespace.HTML); - result = new elemenInterface(); - result._localName = localName; - result._namespace = infra_1.namespace.HTML; - result._namespacePrefix = prefix; - result._customElementState = "undefined"; - result._customElementDefinition = null; - result._is = is; - result._nodeDocument = document; - if (synchronousCustomElementsFlag) { - (0, CustomElementAlgorithm_1.customElement_upgrade)(definition, result); - } - else { - (0, CustomElementAlgorithm_1.customElement_enqueueACustomElementUpgradeReaction)(result, definition); - } - } - else if (definition !== null) { - /** - * 6. Otherwise, if definition is non-null, then: - */ - if (synchronousCustomElementsFlag) { - /** - * 6.1. If the synchronous custom elements flag is set, then run these - * steps while catching any exceptions: - */ - try { - /** - * 6.1.1. Let C be definition’s constructor. - * 6.1.2. Set result to the result of constructing C, with no arguments. - * 6.1.3. Assert: result’s custom element state and custom element definition - * are initialized. - * 6.1.4. Assert: result’s namespace is the HTML namespace. - * _Note:_ IDL enforces that result is an HTMLElement object, which all - * use the HTML namespace. - */ - const C = definition.constructor; - const result = new C(); - console.assert(result._customElementState !== undefined); - console.assert(result._customElementDefinition !== undefined); - console.assert(result._namespace === infra_1.namespace.HTML); - /** - * 6.1.5. If result’s attribute list is not empty, then throw a - * "NotSupportedError" DOMException. - * 6.1.6. If result has children, then throw a "NotSupportedError" - * DOMException. - * 6.1.7. If result’s parent is not null, then throw a - * "NotSupportedError" DOMException. - * 6.1.8. If result’s node document is not document, then throw a - * "NotSupportedError" DOMException. - * 6.1.9. If result’s local name is not equal to localName, then throw - * a "NotSupportedError" DOMException. - */ - if (result._attributeList.length !== 0) - throw new DOMException_1.NotSupportedError("Custom element already has attributes."); - if (result._children.size !== 0) - throw new DOMException_1.NotSupportedError("Custom element already has child nodes."); - if (result._parent !== null) - throw new DOMException_1.NotSupportedError("Custom element already has a parent node."); - if (result._nodeDocument !== document) - throw new DOMException_1.NotSupportedError("Custom element is already in a document."); - if (result._localName !== localName) - throw new DOMException_1.NotSupportedError("Custom element has a different local name."); - /** - * 6.1.10. Set result’s namespace prefix to prefix. - * 6.1.11. Set result’s is value to null. - */ - result._namespacePrefix = prefix; - result._is = null; - } - catch (e) { - /** - * If any of these steps threw an exception, then: - * - Report the exception. - * - Set result to a new element that implements the HTMLUnknownElement - * interface, with no attributes, namespace set to the HTML namespace, - * namespace prefix set to prefix, local name set to localName, custom - * element state set to "failed", custom element definition set to null, - * is value set to null, and node document set to document. - */ - // TODO: Report the exception - result = (0, CreateAlgorithm_1.create_htmlUnknownElement)(document, localName, infra_1.namespace.HTML, prefix); - result._customElementState = "failed"; - result._customElementDefinition = null; - result._is = null; - } - } - else { - /** - * 6.2. Otherwise: - * 6.2.1. Set result to a new element that implements the HTMLElement - * interface, with no attributes, namespace set to the HTML namespace, - * namespace prefix set to prefix, local name set to localName, custom - * element state set to "undefined", custom element definition set to - * null, is value set to null, and node document set to document. - * 6.2.2. Enqueue a custom element upgrade reaction given result and - * definition. - */ - result = (0, CreateAlgorithm_1.create_htmlElement)(document, localName, infra_1.namespace.HTML, prefix); - result._customElementState = "undefined"; - result._customElementDefinition = null; - result._is = null; - (0, CustomElementAlgorithm_1.customElement_enqueueACustomElementUpgradeReaction)(result, definition); + +const replaceCaret = (comp, options) => { + debug('caret', comp, options) + const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET] + const z = options.includePrerelease ? '-0' : '' + return comp.replace(r, (_, M, m, p, pr) => { + debug('caret', comp, _, M, m, p, pr) + let ret + + if (isX(M)) { + ret = '' + } else if (isX(m)) { + ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0` + } else if (isX(p)) { + if (M === '0') { + ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0` + } else { + ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0` + } + } else if (pr) { + debug('replaceCaret pr', pr) + if (M === '0') { + if (m === '0') { + ret = `>=${M}.${m}.${p}-${pr + } <${M}.${m}.${+p + 1}-0` + } else { + ret = `>=${M}.${m}.${p}-${pr + } <${M}.${+m + 1}.0-0` } - } - else { - /** - * 7. Otherwise: - * 7.1. Let interface be the element interface for localName and - * namespace. - * 7.2. Set result to a new element that implements interface, with no - * attributes, namespace set to namespace, namespace prefix set to prefix, - * local name set to localName, custom element state set to - * "uncustomized", custom element definition set to null, is value set to - * is, and node document set to document. - */ - const elementInterface = (0, DocumentAlgorithm_1.document_elementInterface)(localName, namespace); - result = new elementInterface(); - result._localName = localName; - result._namespace = namespace; - result._namespacePrefix = prefix; - result._customElementState = "uncustomized"; - result._customElementDefinition = null; - result._is = is; - result._nodeDocument = document; - /** - * 7.3. If namespace is the HTML namespace, and either localName is a - * valid custom element name or is is non-null, then set result’s - * custom element state to "undefined". - */ - if (namespace === infra_1.namespace.HTML && (is !== null || - (0, CustomElementAlgorithm_1.customElement_isValidCustomElementName)(localName))) { - result._customElementState = "undefined"; + } else { + ret = `>=${M}.${m}.${p}-${pr + } <${+M + 1}.0.0-0` + } + } else { + debug('no pr') + if (M === '0') { + if (m === '0') { + ret = `>=${M}.${m}.${p + } <${M}.${m}.${+p + 1}-0` + } else { + ret = `>=${M}.${m}.${p + } <${M}.${+m + 1}.0-0` } + } else { + ret = `>=${M}.${m}.${p + } <${+M + 1}.0.0-0` + } } - /* istanbul ignore next */ - if (result === null) { - throw new Error("Unable to create element."); - } - /** - * 8. Returns result - */ - return result; -} -/** - * Inserts a new node adjacent to this element. - * - * @param element - a reference element - * @param where - a string defining where to insert the element node. - * - `beforebegin` before this element itself. - * - `afterbegin` before the first child. - * - `beforeend` after the last child. - * - `afterend` after this element itself. - * @param node - node to insert - */ -function element_insertAdjacent(element, where, node) { - /** - * - "beforebegin" - * If element’s parent is null, return null. - * Return the result of pre-inserting node into element’s parent before - * element. - * - "afterbegin" - * Return the result of pre-inserting node into element before element’s - * first child. - * - "beforeend" - * Return the result of pre-inserting node into element before null. - * - "afterend" - * If element’s parent is null, return null. - * Return the result of pre-inserting node into element’s parent before element’s next sibling. - * - Otherwise - * Throw a "SyntaxError" DOMException. - */ - switch (where.toLowerCase()) { - case 'beforebegin': - if (element._parent === null) - return null; - return (0, MutationAlgorithm_1.mutation_preInsert)(node, element._parent, element); - case 'afterbegin': - return (0, MutationAlgorithm_1.mutation_preInsert)(node, element, element._firstChild); - case 'beforeend': - return (0, MutationAlgorithm_1.mutation_preInsert)(node, element, null); - case 'afterend': - if (element._parent === null) - return null; - return (0, MutationAlgorithm_1.mutation_preInsert)(node, element._parent, element._nextSibling); - default: - throw new DOMException_1.SyntaxError(`Invalid 'where' argument. "beforebegin", "afterbegin", "beforeend" or "afterend" expected`); - } -} -//# sourceMappingURL=ElementAlgorithm.js.map -/***/ }), + debug('caret return', ret) + return ret + }) +} -/***/ 8012: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +const replaceXRanges = (comp, options) => { + debug('replaceXRanges', comp, options) + return comp + .split(/\s+/) + .map((c) => replaceXRange(c, options)) + .join(' ') +} +const replaceXRange = (comp, options) => { + comp = comp.trim() + const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE] + return comp.replace(r, (ret, gtlt, M, m, p, pr) => { + debug('xRange', comp, ret, gtlt, M, m, p, pr) + if (invalidXRangeOrder(M, m, p)) { + return comp + } -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.event_setTheCanceledFlag = event_setTheCanceledFlag; -exports.event_initialize = event_initialize; -exports.event_createAnEvent = event_createAnEvent; -exports.event_innerEventCreationSteps = event_innerEventCreationSteps; -exports.event_dispatch = event_dispatch; -exports.event_appendToAnEventPath = event_appendToAnEventPath; -exports.event_invoke = event_invoke; -exports.event_innerInvoke = event_innerInvoke; -exports.event_fireAnEvent = event_fireAnEvent; -exports.event_createLegacyEvent = event_createLegacyEvent; -exports.event_getterEventHandlerIDLAttribute = event_getterEventHandlerIDLAttribute; -exports.event_setterEventHandlerIDLAttribute = event_setterEventHandlerIDLAttribute; -exports.event_determineTheTargetOfAnEventHandler = event_determineTheTargetOfAnEventHandler; -exports.event_getTheCurrentValueOfAnEventHandler = event_getTheCurrentValueOfAnEventHandler; -exports.event_activateAnEventHandler = event_activateAnEventHandler; -exports.event_deactivateAnEventHandler = event_deactivateAnEventHandler; -const DOMImpl_1 = __nccwpck_require__(698); -const interfaces_1 = __nccwpck_require__(9454); -const util_1 = __nccwpck_require__(8247); -const CustomEventImpl_1 = __nccwpck_require__(3171); -const EventImpl_1 = __nccwpck_require__(2390); -const DOMException_1 = __nccwpck_require__(7175); -const TreeAlgorithm_1 = __nccwpck_require__(3532); -const ShadowTreeAlgorithm_1 = __nccwpck_require__(708); -const DOMAlgorithm_1 = __nccwpck_require__(9484); -/** - * Sets the canceled flag of an event. - * - * @param event - an event - */ -function event_setTheCanceledFlag(event) { - if (event._cancelable && !event._inPassiveListenerFlag) { - event._canceledFlag = true; - } -} -/** - * Initializes the value of an event. - * - * @param event - an event to initialize - * @param type - the type of event - * @param bubbles - whether the event propagates in reverse - * @param cancelable - whether the event can be cancelled - */ -function event_initialize(event, type, bubbles, cancelable) { - event._initializedFlag = true; - event._stopPropagationFlag = false; - event._stopImmediatePropagationFlag = false; - event._canceledFlag = false; - event._isTrusted = false; - event._target = null; - event._type = type; - event._bubbles = bubbles; - event._cancelable = cancelable; -} -/** - * Creates a new event. - * - * @param eventInterface - event interface - * @param realm - realm - */ -function event_createAnEvent(eventInterface, realm = undefined) { - /** - * 1. If realm is not given, then set it to null. - * 2. Let dictionary be the result of converting the JavaScript value - * undefined to the dictionary type accepted by eventInterface’s - * constructor. (This dictionary type will either be EventInit or a - * dictionary that inherits from it.) - * 3. Let event be the result of running the inner event creation steps with - * eventInterface, realm, the time of the occurrence that the event is - * signaling, and dictionary. - * 4. Initialize event’s isTrusted attribute to true. - * 5. Return event. - */ - if (realm === undefined) - realm = null; - const dictionary = {}; - const event = event_innerEventCreationSteps(eventInterface, realm, new Date(), dictionary); - event._isTrusted = true; - return event; -} -/** - * Performs event creation steps. - * - * @param eventInterface - event interface - * @param realm - realm - * @param time - time of occurrance - * @param dictionary - event attributes - * - */ -function event_innerEventCreationSteps(eventInterface, realm, time, dictionary) { - /** - * 1. Let event be the result of creating a new object using eventInterface. - * TODO: Implement realms - * If realm is non-null, then use that Realm; otherwise, use the default - * behavior defined in Web IDL. - */ - const event = new eventInterface(""); - /** - * 2. Set event’s initialized flag. - * 3. Initialize event’s timeStamp attribute to a DOMHighResTimeStamp - * representing the high resolution time from the time origin to time. - * 4. For each member → value in dictionary, if event has an attribute - * whose identifier is member, then initialize that attribute to value. - * 5. Run the event constructing steps with event. - * 6. Return event. - */ - event._initializedFlag = true; - event._timeStamp = time.getTime(); - Object.assign(event, dictionary); - if (DOMImpl_1.dom.features.steps) { - (0, DOMAlgorithm_1.dom_runEventConstructingSteps)(event); - } - return event; -} -/** - * Dispatches an event to an event target. - * - * @param event - the event to dispatch - * @param target - event target - * @param legacyTargetOverrideFlag - legacy target override flag - * @param legacyOutputDidListenersThrowFlag - legacy output flag that returns - * whether the event listener's callback threw an exception - */ -function event_dispatch(event, target, legacyTargetOverrideFlag = false, legacyOutputDidListenersThrowFlag = { value: false }) { - let clearTargets = false; - /** - * 1. Set event's dispatch flag. - */ - event._dispatchFlag = true; - /** - * 2. Let targetOverride be target, if legacy target override flag is not - * given, and target's associated Document otherwise. - * - * _Note:_ legacy target override flag is only used by HTML and only when - * target is a Window object. - */ - let targetOverride = target; - if (legacyTargetOverrideFlag) { - const doc = target._associatedDocument; - if (util_1.Guard.isDocumentNode(doc)) { - targetOverride = doc; - } - } - /** - * 3. Let activationTarget be null. - * 4. Let relatedTarget be the result of retargeting event's relatedTarget - * against target. - * 5. If target is not relatedTarget or target is event's relatedTarget, - * then: - */ - let activationTarget = null; - let relatedTarget = (0, TreeAlgorithm_1.tree_retarget)(event._relatedTarget, target); - if (target !== relatedTarget || target === event._relatedTarget) { - /** - * 5.1. Let touchTargets be a new list. - * 5.2. For each touchTarget of event's touch target list, append the - * result of retargeting touchTarget against target to touchTargets. - * 5.3. Append to an event path with event, target, targetOverride, - * relatedTarget, touchTargets, and false. - * 5.4. Let isActivationEvent be true, if event is a MouseEvent object - * and event's type attribute is "click", and false otherwise. - * 5.5. If isActivationEvent is true and target has activation behavior, - * then set activationTarget to target. - * 5.6. Let slotable be target, if target is a slotable and is assigned, - * and null otherwise. - * 5.7. Let slot-in-closed-tree be false. - * 5.8. Let parent be the result of invoking target's get the parent with - * event. - */ - let touchTargets = []; - for (const touchTarget of event._touchTargetList) { - touchTargets.push((0, TreeAlgorithm_1.tree_retarget)(touchTarget, target)); - } - event_appendToAnEventPath(event, target, targetOverride, relatedTarget, touchTargets, false); - const isActivationEvent = (util_1.Guard.isMouseEvent(event) && event._type === "click"); - if (isActivationEvent && target._activationBehavior !== undefined) { - activationTarget = target; - } - let slotable = (util_1.Guard.isSlotable(target) && (0, ShadowTreeAlgorithm_1.shadowTree_isAssigned)(target)) ? - target : null; - let slotInClosedTree = false; - let parent = target._getTheParent(event); - /** - * 5.9. While parent is non-null: - */ - while (parent !== null && util_1.Guard.isNode(parent)) { - /** - * 5.9.1 If slotable is non-null: - * 5.9.1.1. Assert: parent is a slot. - * 5.9.1.2. Set slotable to null. - * 5.9.1.3. If parent's root is a shadow root whose mode is "closed", - * then set slot-in-closed-tree to true. - */ - if (slotable !== null) { - if (!util_1.Guard.isSlot(parent)) { - throw new Error("Parent node of a slotable should be a slot."); - } - slotable = null; - const root = (0, TreeAlgorithm_1.tree_rootNode)(parent, true); - if (util_1.Guard.isShadowRoot(root) && root._mode === "closed") { - slotInClosedTree = true; - } - } - /** - * 5.9.2 If parent is a slotable and is assigned, then set slotable to - * parent. - * 5.9.3. Let relatedTarget be the result of retargeting event's - * relatedTarget against parent. - * 5.9.4. Let touchTargets be a new list. - * 5.9.4. For each touchTarget of event's touch target list, append the - * result of retargeting touchTarget against parent to touchTargets. - */ - if (util_1.Guard.isSlotable(parent) && (0, ShadowTreeAlgorithm_1.shadowTree_isAssigned)(parent)) { - slotable = parent; - } - relatedTarget = (0, TreeAlgorithm_1.tree_retarget)(event._relatedTarget, parent); - touchTargets = []; - for (const touchTarget of event._touchTargetList) { - touchTargets.push((0, TreeAlgorithm_1.tree_retarget)(touchTarget, parent)); - } - /** - * 5.9.6. If parent is a Window object, or parent is a node and target's - * root is a shadow-including inclusive ancestor of parent, then: - */ - if (util_1.Guard.isWindow(parent) || (util_1.Guard.isNode(parent) && util_1.Guard.isNode(target) && - (0, TreeAlgorithm_1.tree_isAncestorOf)((0, TreeAlgorithm_1.tree_rootNode)(target, true), parent, true, true))) { - /** - * 5.9.6.1. If isActivationEvent is true, event's bubbles attribute - * is true, activationTarget is null, and parent has activation - * behavior, then set activationTarget to parent. - * 5.9.6.2. Append to an event path with event, parent, null, - * relatedTarget, touchTargets, and slot-in-closed-tree. - */ - if (isActivationEvent && event._bubbles && activationTarget === null && - parent._activationBehavior) { - activationTarget = parent; - } - event_appendToAnEventPath(event, parent, null, relatedTarget, touchTargets, slotInClosedTree); - } - else if (parent === relatedTarget) { - /** - * 5.9.7. Otherwise, if parent is relatedTarget, - * then set parent to null. - */ - parent = null; - } - else { - /** - * 5.9.8. Otherwise, set target to parent and then: - * 5.9.8.1. If isActivationEvent is true, activationTarget is null, - * and target has activation behavior, then set activationTarget - * to target. - * 5.9.8.2. Append to an event path with event, parent, target, - * relatedTarget, touchTargets, and slot-in-closed-tree. - */ - target = parent; - if (isActivationEvent && activationTarget === null && - target._activationBehavior) { - activationTarget = target; - } - event_appendToAnEventPath(event, parent, target, relatedTarget, touchTargets, slotInClosedTree); - } - /** - * 5.9.9. If parent is non-null, then set parent to the result of - * invoking parent's get the parent with event. - * 5.9.10. Set slot-in-closed-tree to false. - */ - if (parent !== null) { - parent = parent._getTheParent(event); - } - slotInClosedTree = false; - } - /** - * 5.10. Let clearTargetsStruct be the last struct in event's path whose - * shadow-adjusted target is non-null. - */ - let clearTargetsStruct = null; - const path = event._path; - for (let i = path.length - 1; i >= 0; i--) { - const struct = path[i]; - if (struct.shadowAdjustedTarget !== null) { - clearTargetsStruct = struct; - break; - } - } - /** - * 5.11. Let clearTargets be true if clearTargetsStruct's shadow-adjusted - * target, clearTargetsStruct's relatedTarget, or an EventTarget object - * in clearTargetsStruct's touch target list is a node and its root is - * a shadow root, and false otherwise. - */ - if (clearTargetsStruct !== null) { - if (util_1.Guard.isNode(clearTargetsStruct.shadowAdjustedTarget) && - util_1.Guard.isShadowRoot((0, TreeAlgorithm_1.tree_rootNode)(clearTargetsStruct.shadowAdjustedTarget, true))) { - clearTargets = true; - } - else if (util_1.Guard.isNode(clearTargetsStruct.relatedTarget) && - util_1.Guard.isShadowRoot((0, TreeAlgorithm_1.tree_rootNode)(clearTargetsStruct.relatedTarget, true))) { - clearTargets = true; - } - else { - for (let j = 0; j < clearTargetsStruct.touchTargetList.length; j++) { - const struct = clearTargetsStruct.touchTargetList[j]; - if (util_1.Guard.isNode(struct) && - util_1.Guard.isShadowRoot((0, TreeAlgorithm_1.tree_rootNode)(struct, true))) { - clearTargets = true; - break; - } - } - } - } - /** - * 5.12. If activationTarget is non-null and activationTarget has - * legacy-pre-activation behavior, then run activationTarget's - * legacy-pre-activation behavior. - */ - if (activationTarget !== null && - activationTarget._legacyPreActivationBehavior !== undefined) { - activationTarget._legacyPreActivationBehavior(event); - } - /** - * 5.13. For each struct in event's path, in reverse order: - */ - for (let i = path.length - 1; i >= 0; i--) { - const struct = path[i]; - /** - * 5.13.1. If struct's shadow-adjusted target is non-null, then set - * event's eventPhase attribute to AT_TARGET. - * 5.13.2. Otherwise, set event's eventPhase attribute to - * CAPTURING_PHASE. - * 5.13.3. Invoke with struct, event, "capturing", and - * legacyOutputDidListenersThrowFlag if given. - */ - if (struct.shadowAdjustedTarget !== null) { - event._eventPhase = interfaces_1.EventPhase.AtTarget; - } - else { - event._eventPhase = interfaces_1.EventPhase.Capturing; - } - event_invoke(struct, event, "capturing", legacyOutputDidListenersThrowFlag); - } - /** - * 5.14. For each struct in event's path - */ - for (let i = 0; i < path.length; i++) { - const struct = path[i]; - /** - * 5.14.1. If struct's shadow-adjusted target is non-null, then set - * event's eventPhase attribute to AT_TARGET. - * 5.14.2. Otherwise: - * 5.14.2.1. If event's bubbles attribute is false, then continue. - * 5.14.2.2. Set event's eventPhase attribute to BUBBLING_PHASE. - * 5.14.3. Invoke with struct, event, "bubbling", and - * legacyOutputDidListenersThrowFlag if given. - */ - if (struct.shadowAdjustedTarget !== null) { - event._eventPhase = interfaces_1.EventPhase.AtTarget; - } - else { - if (!event._bubbles) - continue; - event._eventPhase = interfaces_1.EventPhase.Bubbling; - } - event_invoke(struct, event, "bubbling", legacyOutputDidListenersThrowFlag); - } - } - /** - * 6. Set event's eventPhase attribute to NONE. - * 7. Set event's currentTarget attribute to null. - * 8. Set event's path to the empty list. - * 9. Unset event's dispatch flag, stop propagation flag, and stop - * immediate propagation flag. - */ - event._eventPhase = interfaces_1.EventPhase.None; - event._currentTarget = null; - event._path = []; - event._dispatchFlag = false; - event._stopPropagationFlag = false; - event._stopImmediatePropagationFlag = false; - /** - * 10. If clearTargets, then: - * 10.1. Set event's target to null. - * 10.2. Set event's relatedTarget to null. - * 10.3. Set event's touch target list to the empty list. - */ - if (clearTargets) { - event._target = null; - event._relatedTarget = null; - event._touchTargetList = []; + const xM = isX(M) + const xm = xM || isX(m) + const xp = xm || isX(p) + const anyX = xp + + if (gtlt === '=' && anyX) { + gtlt = '' } - /** - * 11. If activationTarget is non-null, then: - * 11.1. If event's canceled flag is unset, then run activationTarget's - * activation behavior with event. - * 11.2. Otherwise, if activationTarget has legacy-canceled-activation - * behavior, then run activationTarget's legacy-canceled-activation - * behavior. - */ - if (activationTarget !== null) { - if (!event._canceledFlag && activationTarget._activationBehavior !== undefined) { - activationTarget._activationBehavior(event); + + // if we're including prereleases in the match, then we need + // to fix this to -0, the lowest possible prerelease value + pr = options.includePrerelease ? '-0' : '' + + if (xM) { + if (gtlt === '>' || gtlt === '<') { + // nothing is allowed + ret = '<0.0.0-0' + } else { + // nothing is forbidden + ret = '*' + } + } else if (gtlt && anyX) { + // we know patch is an x, because we have any x at all. + // replace X with 0 + if (xm) { + m = 0 + } + p = 0 + + if (gtlt === '>') { + // >1 => >=2.0.0 + // >1.2 => >=1.3.0 + gtlt = '>=' + if (xm) { + M = +M + 1 + m = 0 + p = 0 + } else { + m = +m + 1 + p = 0 } - else if (activationTarget._legacyCanceledActivationBehavior !== undefined) { - activationTarget._legacyCanceledActivationBehavior(event); + } else if (gtlt === '<=') { + // <=0.7.x is actually <0.8.0, since any 0.7.x should + // pass. Similarly, <=7.x is actually <8.0.0, etc. + gtlt = '<' + if (xm) { + M = +M + 1 + } else { + m = +m + 1 } + } + + if (gtlt === '<') { + pr = '-0' + } + + ret = `${gtlt + M}.${m}.${p}${pr}` + } else if (xm) { + ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0` + } else if (xp) { + ret = `>=${M}.${m}.0${pr + } <${M}.${+m + 1}.0-0` } - /** - * 12. Return false if event's canceled flag is set, and true otherwise. - */ - return !event._canceledFlag; + + debug('xRange return', ret) + + return ret + }) } -/** - * Appends a new struct to an event's path. - * - * @param event - an event - * @param invocationTarget - the target of the invocation - * @param shadowAdjustedTarget - shadow-root adjusted event target - * @param relatedTarget - related event target - * @param touchTargets - a list of touch targets - * @param slotInClosedTree - if the target's parent is a closed shadow root - */ -function event_appendToAnEventPath(event, invocationTarget, shadowAdjustedTarget, relatedTarget, touchTargets, slotInClosedTree) { - /** - * 1. Let invocationTargetInShadowTree be false. - * 2. If invocationTarget is a node and its root is a shadow root, then - * set invocationTargetInShadowTree to true. - */ - let invocationTargetInShadowTree = false; - if (util_1.Guard.isNode(invocationTarget) && - util_1.Guard.isShadowRoot((0, TreeAlgorithm_1.tree_rootNode)(invocationTarget))) { - invocationTargetInShadowTree = true; - } - /** - * 3. Let root-of-closed-tree be false. - * 4. If invocationTarget is a shadow root whose mode is "closed", then - * set root-of-closed-tree to true. - */ - let rootOfClosedTree = false; - if (util_1.Guard.isShadowRoot(invocationTarget) && - invocationTarget._mode === "closed") { - rootOfClosedTree = true; - } - /** - * 5. Append a new struct to event's path whose invocation target is - * invocationTarget, invocation-target-in-shadow-tree is - * invocationTargetInShadowTree, shadow-adjusted target is - * shadowAdjustedTarget, relatedTarget is relatedTarget, - * touch target list is touchTargets, root-of-closed-tree is - * root-of-closed-tree, and slot-in-closed-tree is slot-in-closed-tree. - */ - event._path.push({ - invocationTarget: invocationTarget, - invocationTargetInShadowTree: invocationTargetInShadowTree, - shadowAdjustedTarget: shadowAdjustedTarget, - relatedTarget: relatedTarget, - touchTargetList: touchTargets, - rootOfClosedTree: rootOfClosedTree, - slotInClosedTree: slotInClosedTree - }); + +// Because * is AND-ed with everything else in the comparator, +// and '' means "any version", just remove the *s entirely. +const replaceStars = (comp, options) => { + debug('replaceStars', comp, options) + // Looseness is ignored here. star is always as loose as it gets! + return comp + .trim() + .replace(re[t.STAR], '') } -/** - * Invokes an event. - * - * @param struct - a struct defining event's path - * @param event - the event to invoke - * @param phase - event phase - * @param legacyOutputDidListenersThrowFlag - legacy output flag that returns - * whether the event listener's callback threw an exception - */ -function event_invoke(struct, event, phase, legacyOutputDidListenersThrowFlag = { value: false }) { - /** - * 1. Set event's target to the shadow-adjusted target of the last struct - * in event's path, that is either struct or preceding struct, whose - * shadow-adjusted target is non-null. - */ - const path = event._path; - let index = -1; - for (let i = 0; i < path.length; i++) { - if (path[i] === struct) { - index = i; - break; - } - } - if (index !== -1) { - let item = path[index]; - if (item.shadowAdjustedTarget !== null) { - event._target = item.shadowAdjustedTarget; - } - else if (index > 0) { - item = path[index - 1]; - if (item.shadowAdjustedTarget !== null) { - event._target = item.shadowAdjustedTarget; - } - } - } - /** - * 2. Set event's relatedTarget to struct's relatedTarget. - * 3. Set event's touch target list to struct's touch target list. - * 4. If event's stop propagation flag is set, then return. - * 5. Initialize event's currentTarget attribute to struct's invocation - * target. - * 6. Let listeners be a clone of event's currentTarget attribute value's - * event listener list. - * - * _Note:_ This avoids event listeners added after this point from being - * run. Note that removal still has an effect due to the removed field. - */ - event._relatedTarget = struct.relatedTarget; - event._touchTargetList = struct.touchTargetList; - if (event._stopPropagationFlag) - return; - event._currentTarget = struct.invocationTarget; - const currentTarget = event._currentTarget; - const targetListeners = currentTarget._eventListenerList; - let listeners = new Array(...targetListeners); - /** - * 7. Let found be the result of running inner invoke with event, listeners, - * phase, and legacyOutputDidListenersThrowFlag if given. - */ - const found = event_innerInvoke(event, listeners, phase, struct, legacyOutputDidListenersThrowFlag); - /** - * 8. If found is false and event's isTrusted attribute is true, then: - */ - if (!found && event._isTrusted) { - /** - * 8.1. Let originalEventType be event's type attribute value. - * 8.2. If event's type attribute value is a match for any of the strings - * in the first column in the following table, set event's type attribute - * value to the string in the second column on the same row as the matching - * string, and return otherwise. - * - * Event type | Legacy event type - * ------------------------------------------------- - * "animationend" | "webkitAnimationEnd" - * "animationiteration" | "webkitAnimationIteration" - * "animationstart" | "webkitAnimationStart" - * "transitionend" | "webkitTransitionEnd" - */ - const originalEventType = event._type; - if (originalEventType === "animationend") { - event._type = "webkitAnimationEnd"; - } - else if (originalEventType === "animationiteration") { - event._type = "webkitAnimationIteration"; - } - else if (originalEventType === "animationstart") { - event._type = "webkitAnimationStart"; - } - else if (originalEventType === "transitionend") { - event._type = "webkitTransitionEnd"; - } - /** - * 8.3. Inner invoke with event, listeners, phase, and - * legacyOutputDidListenersThrowFlag if given. - * 8.4. Set event's type attribute value to originalEventType. - */ - event_innerInvoke(event, listeners, phase, struct, legacyOutputDidListenersThrowFlag); - event._type = originalEventType; - } + +const replaceGTE0 = (comp, options) => { + debug('replaceGTE0', comp, options) + return comp + .trim() + .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '') } -/** - * Invokes an event. - * - * @param event - the event to invoke - * @param listeners - event listeners - * @param phase - event phase - * @param struct - a struct defining event's path - * @param legacyOutputDidListenersThrowFlag - legacy output flag that returns - * whether the event listener's callback threw an exception - */ -function event_innerInvoke(event, listeners, phase, struct, legacyOutputDidListenersThrowFlag = { value: false }) { - /** - * 1. Let found be false. - * 2. For each listener in listeners, whose removed is false: - */ - let found = false; - for (let i = 0; i < listeners.length; i++) { - const listener = listeners[i]; - if (!listener.removed) { - /** - * 2.1. If event's type attribute value is not listener's type, then - * continue. - * 2.2. Set found to true. - * 2.3. If phase is "capturing" and listener's capture is false, then - * continue. - * 2.4. If phase is "bubbling" and listener's capture is true, then - * continue. - */ - if (event._type !== listener.type) - continue; - found = true; - if (phase === "capturing" && !listener.capture) - continue; - if (phase === "bubbling" && listener.capture) - continue; - /** - * 2.5. If listener's once is true, then remove listener from event's - * currentTarget attribute value's event listener list. - */ - if (listener.once && event._currentTarget !== null) { - const impl = event._currentTarget; - let index = -1; - for (let i = 0; i < impl._eventListenerList.length; i++) { - if (impl._eventListenerList[i] === listener) { - index = i; - break; - } - } - if (index !== -1) { - impl._eventListenerList.splice(index, 1); - } - } - /** - * TODO: Implement realms - * - * 2.6. Let global be listener callback's associated Realm's global - * object. - */ - const globalObject = undefined; - /** - * 2.7. Let currentEvent be undefined. - * 2.8. If global is a Window object, then: - * 2.8.1. Set currentEvent to global's current event. - * 2.8.2. If struct's invocation-target-in-shadow-tree is false, then - * set global's current event to event. - */ - let currentEvent = undefined; - if (util_1.Guard.isWindow(globalObject)) { - currentEvent = globalObject._currentEvent; - if (struct.invocationTargetInShadowTree === false) { - globalObject._currentEvent = event; - } - } - /** - * 2.9. If listener's passive is true, then set event's in passive - * listener flag. - * 2.10. Call a user object's operation with listener's callback, - * "handleEvent", « event », and event's currentTarget attribute value. - */ - if (listener.passive) - event._inPassiveListenerFlag = true; - try { - listener.callback.handleEvent.call(event._currentTarget, event); - } - catch (err) { - /** - * If this throws an exception, then: - * 2.10.1. Report the exception. - * 2.10.2. Set legacyOutputDidListenersThrowFlag if given. - * - * _Note:_ The legacyOutputDidListenersThrowFlag is only used by - * Indexed Database API. - * TODO: Report the exception - * See: https://html.spec.whatwg.org/multipage/webappapis.html#runtime-script-errors-in-documents - */ - legacyOutputDidListenersThrowFlag.value = true; - } - /** - * 2.11. Unset event's in passive listener flag. - */ - if (listener.passive) - event._inPassiveListenerFlag = false; - /** - * 2.12. If global is a Window object, then set global's current event - * to currentEvent. - */ - if (util_1.Guard.isWindow(globalObject)) { - globalObject._currentEvent = currentEvent; - } - /** - * 2.13. If event's stop immediate propagation flag is set, then return - * found. - */ - if (event._stopImmediatePropagationFlag) - return found; - } - } - /** - * 3. Return found. - */ - return found; + +// This function is passed to string.replace(re[t.HYPHENRANGE]) +// M, m, patch, prerelease, build +// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 +// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do +// 1.2 - 3.4 => >=1.2.0 <3.5.0-0 +// TODO build? +const hyphenReplace = incPr => ($0, + from, fM, fm, fp, fpr, fb, + to, tM, tm, tp, tpr) => { + if (isX(fM)) { + from = '' + } else if (isX(fm)) { + from = `>=${fM}.0.0${incPr ? '-0' : ''}` + } else if (isX(fp)) { + from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}` + } else if (fpr) { + from = `>=${from}` + } else { + from = `>=${from}${incPr ? '-0' : ''}` + } + + if (isX(tM)) { + to = '' + } else if (isX(tm)) { + to = `<${+tM + 1}.0.0-0` + } else if (isX(tp)) { + to = `<${tM}.${+tm + 1}.0-0` + } else if (tpr) { + to = `<=${tM}.${tm}.${tp}-${tpr}` + } else if (incPr) { + to = `<${tM}.${tm}.${+tp + 1}-0` + } else { + to = `<=${to}` + } + + return `${from} ${to}`.trim() } -/** - * Fires an event at target. - * @param e - event name - * @param target - event target - * @param eventConstructor - an event constructor, with a description of how - * IDL attributes are to be initialized - * @param idlAttributes - a dictionary describing how IDL attributes are - * to be initialized - * @param legacyTargetOverrideFlag - legacy target override flag - */ -function event_fireAnEvent(e, target, eventConstructor, idlAttributes, legacyTargetOverrideFlag) { - /** - * 1. If eventConstructor is not given, then let eventConstructor be Event. - */ - if (eventConstructor === undefined) { - eventConstructor = EventImpl_1.EventImpl; + +const testSet = (set, version, options) => { + for (let i = 0; i < set.length; i++) { + if (!set[i].test(version)) { + return false } - /** - * 2. Let event be the result of creating an event given eventConstructor, - * in the relevant Realm of target. - */ - const event = event_createAnEvent(eventConstructor); - /** - * 3. Initialize event’s type attribute to e. - */ - event._type = e; - /** - * 4. Initialize any other IDL attributes of event as described in the - * invocation of this algorithm. - * _Note:_ This also allows for the isTrusted attribute to be set to false. - */ - if (idlAttributes) { - for (const key in idlAttributes) { - const idlObj = event; - idlObj[key] = idlAttributes[key]; + } + + if (version.prerelease.length && !options.includePrerelease) { + // Find the set of versions that are allowed to have prereleases + // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 + // That should allow `1.2.3-pr.2` to pass. + // However, `1.2.4-alpha.notready` should NOT be allowed, + // even though it's within the range set by the comparators. + for (let i = 0; i < set.length; i++) { + debug(set[i].semver) + if (set[i].semver === Comparator.ANY) { + continue + } + + if (set[i].semver.prerelease.length > 0) { + const allowed = set[i].semver + if (allowed.major === version.major && + allowed.minor === version.minor && + allowed.patch === version.patch) { + return true } + } } - /** - * 5. Return the result of dispatching event at target, with legacy target - * override flag set if set. - */ - return event_dispatch(event, target, legacyTargetOverrideFlag); + + // Version has a -pre, but it's not one of the ones we like. + return false + } + + return true } -/** - * Creates an event. - * - * @param eventInterface - the name of the event interface - */ -function event_createLegacyEvent(eventInterface) { - /** - * 1. Let constructor be null. - */ - let constructor = null; - /** - * TODO: Implement in HTML DOM - * 2. If interface is an ASCII case-insensitive match for any of the strings - * in the first column in the following table, then set constructor to the - * interface in the second column on the same row as the matching string: - * - * String | Interface - * -------|---------- - * "beforeunloadevent" | BeforeUnloadEvent - * "compositionevent" | CompositionEvent - * "customevent" | CustomEvent - * "devicemotionevent" | DeviceMotionEvent - * "deviceorientationevent" | DeviceOrientationEvent - * "dragevent" | DragEvent - * "event" | Event - * "events" | Event - * "focusevent" | FocusEvent - * "hashchangeevent" | HashChangeEvent - * "htmlevents" | Event - * "keyboardevent" | KeyboardEvent - * "messageevent" | MessageEvent - * "mouseevent" | MouseEvent - * "mouseevents" | - * "storageevent" | StorageEvent - * "svgevents" | Event - * "textevent" | CompositionEvent - * "touchevent" | TouchEvent - * "uievent" | UIEvent - * "uievents" | UIEvent - */ - switch (eventInterface.toLowerCase()) { - case "beforeunloadevent": - break; - case "compositionevent": - break; - case "customevent": - constructor = CustomEventImpl_1.CustomEventImpl; - break; - case "devicemotionevent": - break; - case "deviceorientationevent": - break; - case "dragevent": - break; - case "event": - case "events": - constructor = EventImpl_1.EventImpl; - break; - case "focusevent": - break; - case "hashchangeevent": - break; - case "htmlevents": - break; - case "keyboardevent": - break; - case "messageevent": - break; - case "mouseevent": - break; - case "mouseevents": - break; - case "storageevent": - break; - case "svgevents": - break; - case "textevent": - break; - case "touchevent": - break; - case "uievent": - break; - case "uievents": - break; - } - /** - * 3. If constructor is null, then throw a "NotSupportedError" DOMException. - */ - if (constructor === null) { - throw new DOMException_1.NotSupportedError(`Event constructor not found for interface ${eventInterface}.`); + + +/***/ }), + +/***/ 7163: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + + + +const debug = __nccwpck_require__(1159) +const { MAX_LENGTH, MAX_SAFE_INTEGER } = __nccwpck_require__(5101) +const { safeRe: re, t } = __nccwpck_require__(5471) + +const parseOptions = __nccwpck_require__(356) +const { compareIdentifiers } = __nccwpck_require__(3348) + +const isPrereleaseIdentifier = (prerelease, identifier) => { + const identifiers = identifier.split('.') + if (identifiers.length > prerelease.length) { + return false + } + + for (let i = 0; i < identifiers.length; i++) { + if (compareIdentifiers(prerelease[i], identifiers[i]) !== 0) { + return false } - /** - * 4. If the interface indicated by constructor is not exposed on the - * relevant global object of the context object, then throw a - * "NotSupportedError" DOMException. - * _Note:_ Typically user agents disable support for touch events in some - * configurations, in which case this clause would be triggered for the - * interface TouchEvent. - */ - // TODO: Implement realms - /** - * 5. Let event be the result of creating an event given constructor. - * 6. Initialize event’s type attribute to the empty string. - * 7. Initialize event’s timeStamp attribute to a DOMHighResTimeStamp - * representing the high resolution time from the time origin to now. - * 8. Initialize event’s isTrusted attribute to false. - * 9. Unset event’s initialized flag. - */ - const event = new constructor(""); - event._type = ""; - event._timeStamp = new Date().getTime(); - event._isTrusted = false; - event._initializedFlag = false; - /** - * 10. Return event. - */ - return event; -} -/** - * Getter of an event handler IDL attribute. - * - * @param eventTarget - event target - * @param name - event name - */ -function event_getterEventHandlerIDLAttribute(thisObj, name) { - /** - * 1. Let eventTarget be the result of determining the target of an event - * handler given this object and name. - * 2. If eventTarget is null, then return null. - * 3. Return the result of getting the current value of the event handler - * given eventTarget and name. - */ - const eventTarget = event_determineTheTargetOfAnEventHandler(thisObj, name); - if (eventTarget === null) - return null; - return event_getTheCurrentValueOfAnEventHandler(eventTarget, name); + } + + return true } -/** - * Setter of an event handler IDL attribute. - * - * @param eventTarget - event target - * @param name - event name - * @param value - event handler - */ -function event_setterEventHandlerIDLAttribute(thisObj, name, value) { - /** - * 1. Let eventTarget be the result of determining the target of an event - * handler given this object and name. - * 2. If eventTarget is null, then return. - * 3. If the given value is null, then deactivate an event handler given - * eventTarget and name. - * 4. Otherwise: - * 4.1. Let handlerMap be eventTarget's event handler map. - * 4.2. Let eventHandler be handlerMap[name]. - * 4.3. Set eventHandler's value to the given value. - * 4.4. Activate an event handler given eventTarget and name. - */ - const eventTarget = event_determineTheTargetOfAnEventHandler(thisObj, name); - if (eventTarget === null) - return; - if (value === null) { - event_deactivateAnEventHandler(eventTarget, name); + +class SemVer { + constructor (version, options) { + options = parseOptions(options) + + if (version instanceof SemVer) { + if (version.loose === !!options.loose && + version.includePrerelease === !!options.includePrerelease) { + return version + } else { + version = version.version + } + } else if (typeof version !== 'string') { + throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version}".`) } - else { - const handlerMap = eventTarget._eventHandlerMap; - const eventHandler = handlerMap["onabort"]; - if (eventHandler !== undefined) { - eventHandler.value = value; - } - event_activateAnEventHandler(eventTarget, name); + + if (version.length > MAX_LENGTH) { + throw new TypeError( + `version is longer than ${MAX_LENGTH} characters` + ) } -} -/** - * Determines the target of an event handler. - * - * @param eventTarget - event target - * @param name - event name - */ -function event_determineTheTargetOfAnEventHandler(eventTarget, name) { - // TODO: Implement in HTML DOM - return null; -} -/** - * Gets the current value of an event handler. - * - * @param eventTarget - event target - * @param name - event name - */ -function event_getTheCurrentValueOfAnEventHandler(eventTarget, name) { - // TODO: Implement in HTML DOM - return null; -} -/** - * Activates an event handler. - * - * @param eventTarget - event target - * @param name - event name - */ -function event_activateAnEventHandler(eventTarget, name) { - // TODO: Implement in HTML DOM -} -/** - * Deactivates an event handler. - * - * @param eventTarget - event target - * @param name - event name - */ -function event_deactivateAnEventHandler(eventTarget, name) { - // TODO: Implement in HTML DOM -} -//# sourceMappingURL=EventAlgorithm.js.map -/***/ }), + debug('SemVer', version, options) + this.options = options + this.loose = !!options.loose + // this isn't actually relevant for versions, but keep it so that we + // don't run into trouble passing this.options around. + this.includePrerelease = !!options.includePrerelease -/***/ 9807: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]) + if (!m) { + throw new TypeError(`Invalid Version: ${version}`) + } -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.eventTarget_flatten = eventTarget_flatten; -exports.eventTarget_flattenMore = eventTarget_flattenMore; -exports.eventTarget_addEventListener = eventTarget_addEventListener; -exports.eventTarget_removeEventListener = eventTarget_removeEventListener; -exports.eventTarget_removeAllEventListeners = eventTarget_removeAllEventListeners; -const util_1 = __nccwpck_require__(7061); -/** - * Flattens the given options argument. - * - * @param options - options argument - */ -function eventTarget_flatten(options) { - /** - * 1. If options is a boolean, then return options. - * 2. Return options’s capture. - */ - if ((0, util_1.isBoolean)(options)) { - return options; + this.raw = version + + // these are actually numbers + this.major = +m[1] + this.minor = +m[2] + this.patch = +m[3] + + if (this.major > MAX_SAFE_INTEGER || this.major < 0) { + throw new TypeError('Invalid major version') } - else { - return options.capture || false; + + if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { + throw new TypeError('Invalid minor version') } -} -/** - * Flattens the given options argument. - * - * @param options - options argument - */ -function eventTarget_flattenMore(options) { - /** - * 1. Let capture be the result of flattening options. - * 2. Let once and passive be false. - * 3. If options is a dictionary, then set passive to options’s passive and - * once to options’s once. - * 4. Return capture, passive, and once. - */ - const capture = eventTarget_flatten(options); - let once = false; - let passive = false; - if (!(0, util_1.isBoolean)(options)) { - once = options.once || false; - passive = options.passive || false; + + if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { + throw new TypeError('Invalid patch version') } - return [capture, passive, once]; -} -/** - * Adds a new event listener. - * - * @param eventTarget - event target - * @param listener - event listener - */ -function eventTarget_addEventListener(eventTarget, listener) { - /** - * 1. If eventTarget is a ServiceWorkerGlobalScope object, its service - * worker’s script resource’s has ever been evaluated flag is set, and - * listener’s type matches the type attribute value of any of the service - * worker events, then report a warning to the console that this might not - * give the expected results. [SERVICE-WORKERS] - */ - // TODO: service worker - /** - * 2. If listener’s callback is null, then return. - */ - if (listener.callback === null) - return; - /** - * 3. If eventTarget’s event listener list does not contain an event listener - * whose type is listener’s type, callback is listener’s callback, and capture - * is listener’s capture, then append listener to eventTarget’s event listener - * list. - */ - for (let i = 0; i < eventTarget._eventListenerList.length; i++) { - const entry = eventTarget._eventListenerList[i]; - if (entry.type === listener.type && entry.callback.handleEvent === listener.callback.handleEvent - && entry.capture === listener.capture) { - return; + + // numberify any prerelease numeric ids + if (!m[4]) { + this.prerelease = [] + } else { + this.prerelease = m[4].split('.').map((id) => { + if (/^[0-9]+$/.test(id)) { + const num = +id + if (num >= 0 && num < MAX_SAFE_INTEGER) { + return num + } } + return id + }) } - eventTarget._eventListenerList.push(listener); -} -/** - * Removes an event listener. - * - * @param eventTarget - event target - * @param listener - event listener - */ -function eventTarget_removeEventListener(eventTarget, listener, index) { - /** - * 1. If eventTarget is a ServiceWorkerGlobalScope object and its service - * worker’s set of event types to handle contains type, then report a - * warning to the console that this might not give the expected results. - * [SERVICE-WORKERS] - */ - // TODO: service worker - /** - * 2. Set listener’s removed to true and remove listener from eventTarget’s - * event listener list. - */ - listener.removed = true; - eventTarget._eventListenerList.splice(index, 1); -} -/** - * Removes all event listeners. - * - * @param eventTarget - event target - */ -function eventTarget_removeAllEventListeners(eventTarget) { - /** - * To remove all event listeners, given an EventTarget object eventTarget, - * for each listener of eventTarget’s event listener list, remove an event - * listener with eventTarget and listener. - */ - for (const e of eventTarget._eventListenerList) { - e.removed = true; - } - eventTarget._eventListenerList.length = 0; -} -//# sourceMappingURL=EventTargetAlgorithm.js.map - -/***/ }), -/***/ 45: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + this.build = m[5] ? m[5].split('.') : [] + this.format() + } + format () { + this.version = `${this.major}.${this.minor}.${this.patch}` + if (this.prerelease.length) { + this.version += `-${this.prerelease.join('.')}` + } + return this.version + } -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.mutation_ensurePreInsertionValidity = mutation_ensurePreInsertionValidity; -exports.mutation_preInsert = mutation_preInsert; -exports.mutation_insert = mutation_insert; -exports.mutation_append = mutation_append; -exports.mutation_replace = mutation_replace; -exports.mutation_replaceAll = mutation_replaceAll; -exports.mutation_preRemove = mutation_preRemove; -exports.mutation_remove = mutation_remove; -const DOMImpl_1 = __nccwpck_require__(698); -const DOMException_1 = __nccwpck_require__(7175); -const interfaces_1 = __nccwpck_require__(9454); -const util_1 = __nccwpck_require__(8247); -const util_2 = __nccwpck_require__(7061); -const infra_1 = __nccwpck_require__(4737); -const CustomElementAlgorithm_1 = __nccwpck_require__(5075); -const TreeAlgorithm_1 = __nccwpck_require__(3532); -const NodeIteratorAlgorithm_1 = __nccwpck_require__(9670); -const ShadowTreeAlgorithm_1 = __nccwpck_require__(708); -const MutationObserverAlgorithm_1 = __nccwpck_require__(3243); -const DOMAlgorithm_1 = __nccwpck_require__(9484); -const DocumentAlgorithm_1 = __nccwpck_require__(1327); -/** - * Ensures pre-insertion validity of a node into a parent before a - * child. - * - * @param node - node to insert - * @param parent - parent node to receive node - * @param child - child node to insert node before - */ -function mutation_ensurePreInsertionValidity(node, parent, child) { - const parentNodeType = parent._nodeType; - const nodeNodeType = node._nodeType; - const childNodeType = child ? child._nodeType : null; - /** - * 1. If parent is not a Document, DocumentFragment, or Element node, - * throw a "HierarchyRequestError" DOMException. - */ - if (parentNodeType !== interfaces_1.NodeType.Document && - parentNodeType !== interfaces_1.NodeType.DocumentFragment && - parentNodeType !== interfaces_1.NodeType.Element) - throw new DOMException_1.HierarchyRequestError(`Only document, document fragment and element nodes can contain child nodes. Parent node is ${parent.nodeName}.`); - /** - * 2. If node is a host-including inclusive ancestor of parent, throw a - * "HierarchyRequestError" DOMException. - */ - if ((0, TreeAlgorithm_1.tree_isHostIncludingAncestorOf)(parent, node, true)) - throw new DOMException_1.HierarchyRequestError(`The node to be inserted cannot be an inclusive ancestor of parent node. Node is ${node.nodeName}, parent node is ${parent.nodeName}.`); - /** - * 3. If child is not null and its parent is not parent, then throw a - * "NotFoundError" DOMException. - */ - if (child !== null && child._parent !== parent) - throw new DOMException_1.NotFoundError(`The reference child node cannot be found under parent node. Child node is ${child.nodeName}, parent node is ${parent.nodeName}.`); - /** - * 4. If node is not a DocumentFragment, DocumentType, Element, Text, - * ProcessingInstruction, or Comment node, throw a "HierarchyRequestError" - * DOMException. - */ - if (nodeNodeType !== interfaces_1.NodeType.DocumentFragment && - nodeNodeType !== interfaces_1.NodeType.DocumentType && - nodeNodeType !== interfaces_1.NodeType.Element && - nodeNodeType !== interfaces_1.NodeType.Text && - nodeNodeType !== interfaces_1.NodeType.ProcessingInstruction && - nodeNodeType !== interfaces_1.NodeType.CData && - nodeNodeType !== interfaces_1.NodeType.Comment) - throw new DOMException_1.HierarchyRequestError(`Only document fragment, document type, element, text, processing instruction, cdata section or comment nodes can be inserted. Node is ${node.nodeName}.`); - /** - * 5. If either node is a Text node and parent is a document, or node is a - * doctype and parent is not a document, throw a "HierarchyRequestError" - * DOMException. - */ - if (nodeNodeType === interfaces_1.NodeType.Text && - parentNodeType === interfaces_1.NodeType.Document) - throw new DOMException_1.HierarchyRequestError(`Cannot insert a text node as a child of a document node. Node is ${node.nodeName}.`); - if (nodeNodeType === interfaces_1.NodeType.DocumentType && - parentNodeType !== interfaces_1.NodeType.Document) - throw new DOMException_1.HierarchyRequestError(`A document type node can only be inserted under a document node. Parent node is ${parent.nodeName}.`); - /** - * 6. If parent is a document, and any of the statements below, switched on - * node, are true, throw a "HierarchyRequestError" DOMException. - * - DocumentFragment node - * If node has more than one element child or has a Text node child. - * Otherwise, if node has one element child and either parent has an element - * child, child is a doctype, or child is not null and a doctype is - * following child. - * - element - * parent has an element child, child is a doctype, or child is not null and - * a doctype is following child. - * - doctype - * parent has a doctype child, child is non-null and an element is preceding - * child, or child is null and parent has an element child. - */ - if (parentNodeType === interfaces_1.NodeType.Document) { - if (nodeNodeType === interfaces_1.NodeType.DocumentFragment) { - let eleCount = 0; - for (const childNode of node._children) { - if (childNode._nodeType === interfaces_1.NodeType.Element) - eleCount++; - else if (childNode._nodeType === interfaces_1.NodeType.Text) - throw new DOMException_1.HierarchyRequestError(`Cannot insert text a node as a child of a document node. Node is ${childNode.nodeName}.`); - } - if (eleCount > 1) { - throw new DOMException_1.HierarchyRequestError(`A document node can only have one document element node. Document fragment to be inserted has ${eleCount} element nodes.`); - } - else if (eleCount === 1) { - for (const ele of parent._children) { - if (ele._nodeType === interfaces_1.NodeType.Element) - throw new DOMException_1.HierarchyRequestError(`The document node already has a document element node.`); - } - if (child) { - if (childNodeType === interfaces_1.NodeType.DocumentType) - throw new DOMException_1.HierarchyRequestError(`Cannot insert an element node before a document type node.`); - let doctypeChild = child._nextSibling; - while (doctypeChild) { - if (doctypeChild._nodeType === interfaces_1.NodeType.DocumentType) - throw new DOMException_1.HierarchyRequestError(`Cannot insert an element node before a document type node.`); - doctypeChild = doctypeChild._nextSibling; - } - } - } - } - else if (nodeNodeType === interfaces_1.NodeType.Element) { - for (const ele of parent._children) { - if (ele._nodeType === interfaces_1.NodeType.Element) - throw new DOMException_1.HierarchyRequestError(`Document already has a document element node. Node is ${node.nodeName}.`); - } - if (child) { - if (childNodeType === interfaces_1.NodeType.DocumentType) - throw new DOMException_1.HierarchyRequestError(`Cannot insert an element node before a document type node. Node is ${node.nodeName}.`); - let doctypeChild = child._nextSibling; - while (doctypeChild) { - if (doctypeChild._nodeType === interfaces_1.NodeType.DocumentType) - throw new DOMException_1.HierarchyRequestError(`Cannot insert an element node before a document type node. Node is ${node.nodeName}.`); - doctypeChild = doctypeChild._nextSibling; - } - } - } - else if (nodeNodeType === interfaces_1.NodeType.DocumentType) { - for (const ele of parent._children) { - if (ele._nodeType === interfaces_1.NodeType.DocumentType) - throw new DOMException_1.HierarchyRequestError(`Document already has a document type node. Node is ${node.nodeName}.`); - } - if (child) { - let elementChild = child._previousSibling; - while (elementChild) { - if (elementChild._nodeType === interfaces_1.NodeType.Element) - throw new DOMException_1.HierarchyRequestError(`Cannot insert a document type node before an element node. Node is ${node.nodeName}.`); - elementChild = elementChild._previousSibling; - } - } - else { - let elementChild = parent._firstChild; - while (elementChild) { - if (elementChild._nodeType === interfaces_1.NodeType.Element) - throw new DOMException_1.HierarchyRequestError(`Cannot insert a document type node before an element node. Node is ${node.nodeName}.`); - elementChild = elementChild._nextSibling; - } - } - } - } -} -/** - * Ensures pre-insertion validity of a node into a parent before a - * child, then adopts the node to the tree and inserts it. - * - * @param node - node to insert - * @param parent - parent node to receive node - * @param child - child node to insert node before - */ -function mutation_preInsert(node, parent, child) { - /** - * 1. Ensure pre-insertion validity of node into parent before child. - * 2. Let reference child be child. - * 3. If reference child is node, set it to node’s next sibling. - * 4. Adopt node into parent’s node document. - * 5. Insert node into parent before reference child. - * 6. Return node. - */ - mutation_ensurePreInsertionValidity(node, parent, child); - let referenceChild = child; - if (referenceChild === node) - referenceChild = node._nextSibling; - (0, DocumentAlgorithm_1.document_adopt)(node, parent._nodeDocument); - mutation_insert(node, parent, referenceChild); - return node; -} -/** - * Inserts a node into a parent node before the given child node. - * - * @param node - node to insert - * @param parent - parent node to receive node - * @param child - child node to insert node before - * @param suppressObservers - whether to notify observers - */ -function mutation_insert(node, parent, child, suppressObservers) { - // Optimized common case - if (child === null && node._nodeType !== interfaces_1.NodeType.DocumentFragment) { - mutation_insert_single(node, parent, suppressObservers); - return; - } - /** - * 1. Let count be the number of children of node if it is a - * DocumentFragment node, and one otherwise. - */ - const count = (node._nodeType === interfaces_1.NodeType.DocumentFragment ? - node._children.size : 1); - /** - * 2. If child is non-null, then: - */ - if (child !== null) { - /** - * 2.1. For each live range whose start node is parent and start - * offset is greater than child's index, increase its start - * offset by count. - * 2.2. For each live range whose end node is parent and end - * offset is greater than child's index, increase its end - * offset by count. - */ - if (DOMImpl_1.dom.rangeList.size !== 0) { - const index = (0, TreeAlgorithm_1.tree_index)(child); - for (const range of DOMImpl_1.dom.rangeList) { - if (range._start[0] === parent && range._start[1] > index) { - range._start[1] += count; - } - if (range._end[0] === parent && range._end[1] > index) { - range._end[1] += count; - } - } - } - } - /** - * 3. Let nodes be node’s children, if node is a DocumentFragment node; - * otherwise « node ». - */ - const nodes = node._nodeType === interfaces_1.NodeType.DocumentFragment ? - new Array(...node._children) : [node]; - /** - * 4. If node is a DocumentFragment node, remove its children with the - * suppress observers flag set. - */ - if (node._nodeType === interfaces_1.NodeType.DocumentFragment) { - while (node._firstChild) { - mutation_remove(node._firstChild, node, true); - } + toString () { + return this.version + } + + compare (other) { + debug('SemVer.compare', this.version, this.options, other) + if (!(other instanceof SemVer)) { + if (typeof other === 'string' && other === this.version) { + return 0 + } + other = new SemVer(other, this.options) } - /** - * 5. If node is a DocumentFragment node, then queue a tree mutation record - * for node with « », nodes, null, and null. - */ - if (DOMImpl_1.dom.features.mutationObservers) { - if (node._nodeType === interfaces_1.NodeType.DocumentFragment) { - (0, MutationObserverAlgorithm_1.observer_queueTreeMutationRecord)(node, [], nodes, null, null); - } + + if (other.version === this.version) { + return 0 } - /** - * 6. Let previousSibling be child’s previous sibling or parent’s last - * child if child is null. - */ - const previousSibling = (child ? child._previousSibling : parent._lastChild); - let index = child === null ? -1 : (0, TreeAlgorithm_1.tree_index)(child); - /** - * 7. For each node in nodes, in tree order: - */ - for (let i = 0; i < nodes.length; i++) { - const node = nodes[i]; - if (util_1.Guard.isElementNode(node)) { - // set document element node - if (util_1.Guard.isDocumentNode(parent)) { - parent._documentElement = node; - } - // mark that the document has namespaces - if (!node._nodeDocument._hasNamespaces && (node._namespace !== null || - node._namespacePrefix !== null)) { - node._nodeDocument._hasNamespaces = true; - } - } - /** - * 7.1. If child is null, then append node to parent’s children. - * 7.2. Otherwise, insert node into parent’s children before child’s - * index. - */ - node._parent = parent; - if (child === null) { - infra_1.set.append(parent._children, node); - } - else { - infra_1.set.insert(parent._children, node, index); - index++; - } - // assign siblings and children for quick lookups - if (parent._firstChild === null) { - node._previousSibling = null; - node._nextSibling = null; - parent._firstChild = node; - parent._lastChild = node; - } - else { - const prev = (child ? child._previousSibling : parent._lastChild); - const next = (child ? child : null); - node._previousSibling = prev; - node._nextSibling = next; - if (prev) - prev._nextSibling = node; - if (next) - next._previousSibling = node; - if (!prev) - parent._firstChild = node; - if (!next) - parent._lastChild = node; - } - /** - * 7.3. If parent is a shadow host and node is a slotable, then - * assign a slot for node. - */ - if (DOMImpl_1.dom.features.slots) { - if (parent._shadowRoot !== null && util_1.Guard.isSlotable(node)) { - (0, ShadowTreeAlgorithm_1.shadowTree_assignASlot)(node); - } - } - /** - * 7.4. If node is a Text node, run the child text content change - * steps for parent. - */ - if (DOMImpl_1.dom.features.steps) { - if (util_1.Guard.isTextNode(node)) { - (0, DOMAlgorithm_1.dom_runChildTextContentChangeSteps)(parent); - } - } - /** - * 7.5. If parent's root is a shadow root, and parent is a slot - * whose assigned nodes is the empty list, then run signal - * a slot change for parent. - */ - if (DOMImpl_1.dom.features.slots) { - if (util_1.Guard.isShadowRoot((0, TreeAlgorithm_1.tree_rootNode)(parent)) && - util_1.Guard.isSlot(parent) && (0, util_2.isEmpty)(parent._assignedNodes)) { - (0, ShadowTreeAlgorithm_1.shadowTree_signalASlotChange)(parent); - } - } - /** - * 7.6. Run assign slotables for a tree with node's root. - */ - if (DOMImpl_1.dom.features.slots) { - (0, ShadowTreeAlgorithm_1.shadowTree_assignSlotablesForATree)((0, TreeAlgorithm_1.tree_rootNode)(node)); - } - /** - * 7.7. For each shadow-including inclusive descendant - * inclusiveDescendant of node, in shadow-including tree - * order: - */ - let inclusiveDescendant = (0, TreeAlgorithm_1.tree_getFirstDescendantNode)(node, true, true); - while (inclusiveDescendant !== null) { - /** - * 7.7.1. Run the insertion steps with inclusiveDescendant. - */ - if (DOMImpl_1.dom.features.steps) { - (0, DOMAlgorithm_1.dom_runInsertionSteps)(inclusiveDescendant); - } - if (DOMImpl_1.dom.features.customElements) { - /** - * 7.7.2. If inclusiveDescendant is connected, then: - */ - if (util_1.Guard.isElementNode(inclusiveDescendant) && - (0, ShadowTreeAlgorithm_1.shadowTree_isConnected)(inclusiveDescendant)) { - if (util_1.Guard.isCustomElementNode(inclusiveDescendant)) { - /** - * 7.7.2.1. If inclusiveDescendant is custom, then enqueue a custom - * element callback reaction with inclusiveDescendant, callback name - * "connectedCallback", and an empty argument list. - */ - (0, CustomElementAlgorithm_1.customElement_enqueueACustomElementCallbackReaction)(inclusiveDescendant, "connectedCallback", []); - } - else { - /** - * 7.7.2.2. Otherwise, try to upgrade inclusiveDescendant. - */ - (0, CustomElementAlgorithm_1.customElement_tryToUpgrade)(inclusiveDescendant); - } - } - } - inclusiveDescendant = (0, TreeAlgorithm_1.tree_getNextDescendantNode)(node, inclusiveDescendant, true, true); - } + + return this.compareMain(other) || this.comparePre(other) + } + + compareMain (other) { + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) } - /** - * 8. If suppress observers flag is unset, then queue a tree mutation record - * for parent with nodes, « », previousSibling, and child. - */ - if (DOMImpl_1.dom.features.mutationObservers) { - if (!suppressObservers) { - (0, MutationObserverAlgorithm_1.observer_queueTreeMutationRecord)(parent, nodes, [], previousSibling, child); - } + + if (this.major < other.major) { + return -1 } -} -/** - * Inserts a node into a parent node. Optimized routine for the common case where - * node is not a document fragment node and it has no child nodes. - * - * @param node - node to insert - * @param parent - parent node to receive node - * @param suppressObservers - whether to notify observers - */ -function mutation_insert_single(node, parent, suppressObservers) { - /** - * 1. Let count be the number of children of node if it is a - * DocumentFragment node, and one otherwise. - * 2. If child is non-null, then: - * 2.1. For each live range whose start node is parent and start - * offset is greater than child's index, increase its start - * offset by count. - * 2.2. For each live range whose end node is parent and end - * offset is greater than child's index, increase its end - * offset by count. - * 3. Let nodes be node’s children, if node is a DocumentFragment node; - * otherwise « node ». - * 4. If node is a DocumentFragment node, remove its children with the - * suppress observers flag set. - * 5. If node is a DocumentFragment node, then queue a tree mutation record - * for node with « », nodes, null, and null. - */ - /** - * 6. Let previousSibling be child’s previous sibling or parent’s last - * child if child is null. - */ - const previousSibling = parent._lastChild; - // set document element node - if (util_1.Guard.isElementNode(node)) { - // set document element node - if (util_1.Guard.isDocumentNode(parent)) { - parent._documentElement = node; - } - // mark that the document has namespaces - if (!node._nodeDocument._hasNamespaces && (node._namespace !== null || - node._namespacePrefix !== null)) { - node._nodeDocument._hasNamespaces = true; - } + if (this.major > other.major) { + return 1 } - /** - * 7. For each node in nodes, in tree order: - * 7.1. If child is null, then append node to parent’s children. - * 7.2. Otherwise, insert node into parent’s children before child’s - * index. - */ - node._parent = parent; - parent._children.add(node); - // assign siblings and children for quick lookups - if (parent._firstChild === null) { - node._previousSibling = null; - node._nextSibling = null; - parent._firstChild = node; - parent._lastChild = node; + if (this.minor < other.minor) { + return -1 } - else { - const prev = parent._lastChild; - node._previousSibling = prev; - node._nextSibling = null; - if (prev) - prev._nextSibling = node; - if (!prev) - parent._firstChild = node; - parent._lastChild = node; + if (this.minor > other.minor) { + return 1 } - /** - * 7.3. If parent is a shadow host and node is a slotable, then - * assign a slot for node. - */ - if (DOMImpl_1.dom.features.slots) { - if (parent._shadowRoot !== null && util_1.Guard.isSlotable(node)) { - (0, ShadowTreeAlgorithm_1.shadowTree_assignASlot)(node); - } + if (this.patch < other.patch) { + return -1 } - /** - * 7.4. If node is a Text node, run the child text content change - * steps for parent. - */ - if (DOMImpl_1.dom.features.steps) { - if (util_1.Guard.isTextNode(node)) { - (0, DOMAlgorithm_1.dom_runChildTextContentChangeSteps)(parent); - } + if (this.patch > other.patch) { + return 1 } - /** - * 7.5. If parent's root is a shadow root, and parent is a slot - * whose assigned nodes is the empty list, then run signal - * a slot change for parent. - */ - if (DOMImpl_1.dom.features.slots) { - if (util_1.Guard.isShadowRoot((0, TreeAlgorithm_1.tree_rootNode)(parent)) && - util_1.Guard.isSlot(parent) && (0, util_2.isEmpty)(parent._assignedNodes)) { - (0, ShadowTreeAlgorithm_1.shadowTree_signalASlotChange)(parent); - } + return 0 + } + + comparePre (other) { + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) } - /** - * 7.6. Run assign slotables for a tree with node's root. - */ - if (DOMImpl_1.dom.features.slots) { - (0, ShadowTreeAlgorithm_1.shadowTree_assignSlotablesForATree)((0, TreeAlgorithm_1.tree_rootNode)(node)); + + // NOT having a prerelease is > having one + if (this.prerelease.length && !other.prerelease.length) { + return -1 + } else if (!this.prerelease.length && other.prerelease.length) { + return 1 + } else if (!this.prerelease.length && !other.prerelease.length) { + return 0 } - /** - * 7.7. For each shadow-including inclusive descendant - * inclusiveDescendant of node, in shadow-including tree - * order: - * 7.7.1. Run the insertion steps with inclusiveDescendant. - */ - if (DOMImpl_1.dom.features.steps) { - (0, DOMAlgorithm_1.dom_runInsertionSteps)(node); - } - if (DOMImpl_1.dom.features.customElements) { - /** - * 7.7.2. If inclusiveDescendant is connected, then: - */ - if (util_1.Guard.isElementNode(node) && - (0, ShadowTreeAlgorithm_1.shadowTree_isConnected)(node)) { - if (util_1.Guard.isCustomElementNode(node)) { - /** - * 7.7.2.1. If inclusiveDescendant is custom, then enqueue a custom - * element callback reaction with inclusiveDescendant, callback name - * "connectedCallback", and an empty argument list. - */ - (0, CustomElementAlgorithm_1.customElement_enqueueACustomElementCallbackReaction)(node, "connectedCallback", []); - } - else { - /** - * 7.7.2.2. Otherwise, try to upgrade inclusiveDescendant. - */ - (0, CustomElementAlgorithm_1.customElement_tryToUpgrade)(node); - } - } + + let i = 0 + do { + const a = this.prerelease[i] + const b = other.prerelease[i] + debug('prerelease compare', i, a, b) + if (a === undefined && b === undefined) { + return 0 + } else if (b === undefined) { + return 1 + } else if (a === undefined) { + return -1 + } else if (a === b) { + continue + } else { + return compareIdentifiers(a, b) + } + } while (++i) + } + + compareBuild (other) { + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) } - /** - * 8. If suppress observers flag is unset, then queue a tree mutation record - * for parent with nodes, « », previousSibling, and child. - */ - if (DOMImpl_1.dom.features.mutationObservers) { - if (!suppressObservers) { - (0, MutationObserverAlgorithm_1.observer_queueTreeMutationRecord)(parent, [node], [], previousSibling, null); + + let i = 0 + do { + const a = this.build[i] + const b = other.build[i] + debug('build compare', i, a, b) + if (a === undefined && b === undefined) { + return 0 + } else if (b === undefined) { + return 1 + } else if (a === undefined) { + return -1 + } else if (a === b) { + continue + } else { + return compareIdentifiers(a, b) + } + } while (++i) + } + + // preminor will bump the version up to the next minor release, and immediately + // down to pre-release. premajor and prepatch work the same way. + inc (release, identifier, identifierBase) { + if (release.startsWith('pre')) { + if (!identifier && identifierBase === false) { + throw new Error('invalid increment argument: identifier is empty') + } + // Avoid an invalid semver results + if (identifier) { + const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE]) + if (!match || match[1] !== identifier) { + throw new Error(`invalid identifier: ${identifier}`) } + } } -} -/** - * Appends a node to the children of a parent node. - * - * @param node - a node - * @param parent - the parent to receive node - */ -function mutation_append(node, parent) { - /** - * To append a node to a parent, pre-insert node into parent before null. - */ - return mutation_preInsert(node, parent, null); -} -/** - * Replaces a node with another node. - * - * @param child - child node to remove - * @param node - node to insert - * @param parent - parent node to receive node - */ -function mutation_replace(child, node, parent) { - /** - * 1. If parent is not a Document, DocumentFragment, or Element node, - * throw a "HierarchyRequestError" DOMException. - */ - if (parent._nodeType !== interfaces_1.NodeType.Document && - parent._nodeType !== interfaces_1.NodeType.DocumentFragment && - parent._nodeType !== interfaces_1.NodeType.Element) - throw new DOMException_1.HierarchyRequestError(`Only document, document fragment and element nodes can contain child nodes. Parent node is ${parent.nodeName}.`); - /** - * 2. If node is a host-including inclusive ancestor of parent, throw a - * "HierarchyRequestError" DOMException. - */ - if ((0, TreeAlgorithm_1.tree_isHostIncludingAncestorOf)(parent, node, true)) - throw new DOMException_1.HierarchyRequestError(`The node to be inserted cannot be an ancestor of parent node. Node is ${node.nodeName}, parent node is ${parent.nodeName}.`); - /** - * 3. If child’s parent is not parent, then throw a "NotFoundError" - * DOMException. - */ - if (child._parent !== parent) - throw new DOMException_1.NotFoundError(`The reference child node cannot be found under parent node. Child node is ${child.nodeName}, parent node is ${parent.nodeName}.`); - /** - * 4. If node is not a DocumentFragment, DocumentType, Element, Text, - * ProcessingInstruction, or Comment node, throw a "HierarchyRequestError" - * DOMException. - */ - if (node._nodeType !== interfaces_1.NodeType.DocumentFragment && - node._nodeType !== interfaces_1.NodeType.DocumentType && - node._nodeType !== interfaces_1.NodeType.Element && - node._nodeType !== interfaces_1.NodeType.Text && - node._nodeType !== interfaces_1.NodeType.ProcessingInstruction && - node._nodeType !== interfaces_1.NodeType.CData && - node._nodeType !== interfaces_1.NodeType.Comment) - throw new DOMException_1.HierarchyRequestError(`Only document fragment, document type, element, text, processing instruction, cdata section or comment nodes can be inserted. Node is ${node.nodeName}.`); - /** - * 5. If either node is a Text node and parent is a document, or node is a - * doctype and parent is not a document, throw a "HierarchyRequestError" - * DOMException. - */ - if (node._nodeType === interfaces_1.NodeType.Text && - parent._nodeType === interfaces_1.NodeType.Document) - throw new DOMException_1.HierarchyRequestError(`Cannot insert a text node as a child of a document node. Node is ${node.nodeName}.`); - if (node._nodeType === interfaces_1.NodeType.DocumentType && - parent._nodeType !== interfaces_1.NodeType.Document) - throw new DOMException_1.HierarchyRequestError(`A document type node can only be inserted under a document node. Parent node is ${parent.nodeName}.`); - /** - * 6. If parent is a document, and any of the statements below, switched on - * node, are true, throw a "HierarchyRequestError" DOMException. - * - DocumentFragment node - * If node has more than one element child or has a Text node child. - * Otherwise, if node has one element child and either parent has an element - * child that is not child or a doctype is following child. - * - element - * parent has an element child that is not child or a doctype is - * following child. - * - doctype - * parent has a doctype child that is not child, or an element is - * preceding child. - */ - if (parent._nodeType === interfaces_1.NodeType.Document) { - if (node._nodeType === interfaces_1.NodeType.DocumentFragment) { - let eleCount = 0; - for (const childNode of node._children) { - if (childNode._nodeType === interfaces_1.NodeType.Element) - eleCount++; - else if (childNode._nodeType === interfaces_1.NodeType.Text) - throw new DOMException_1.HierarchyRequestError(`Cannot insert text a node as a child of a document node. Node is ${childNode.nodeName}.`); - } - if (eleCount > 1) { - throw new DOMException_1.HierarchyRequestError(`A document node can only have one document element node. Document fragment to be inserted has ${eleCount} element nodes.`); - } - else if (eleCount === 1) { - for (const ele of parent._children) { - if (ele._nodeType === interfaces_1.NodeType.Element && ele !== child) - throw new DOMException_1.HierarchyRequestError(`The document node already has a document element node.`); - } - let doctypeChild = child._nextSibling; - while (doctypeChild) { - if (doctypeChild._nodeType === interfaces_1.NodeType.DocumentType) - throw new DOMException_1.HierarchyRequestError(`Cannot insert an element node before a document type node.`); - doctypeChild = doctypeChild._nextSibling; - } - } + + switch (release) { + case 'premajor': + this.prerelease.length = 0 + this.patch = 0 + this.minor = 0 + this.major++ + this.inc('pre', identifier, identifierBase) + break + case 'preminor': + this.prerelease.length = 0 + this.patch = 0 + this.minor++ + this.inc('pre', identifier, identifierBase) + break + case 'prepatch': + // If this is already a prerelease, it will bump to the next version + // drop any prereleases that might already exist, since they are not + // relevant at this point. + this.prerelease.length = 0 + this.inc('patch', identifier, identifierBase) + this.inc('pre', identifier, identifierBase) + break + // If the input is a non-prerelease version, this acts the same as + // prepatch. + case 'prerelease': + if (this.prerelease.length === 0) { + this.inc('patch', identifier, identifierBase) } - else if (node._nodeType === interfaces_1.NodeType.Element) { - for (const ele of parent._children) { - if (ele._nodeType === interfaces_1.NodeType.Element && ele !== child) - throw new DOMException_1.HierarchyRequestError(`Document already has a document element node. Node is ${node.nodeName}.`); - } - let doctypeChild = child._nextSibling; - while (doctypeChild) { - if (doctypeChild._nodeType === interfaces_1.NodeType.DocumentType) - throw new DOMException_1.HierarchyRequestError(`Cannot insert an element node before a document type node. Node is ${node.nodeName}.`); - doctypeChild = doctypeChild._nextSibling; - } + this.inc('pre', identifier, identifierBase) + break + case 'release': + if (this.prerelease.length === 0) { + throw new Error(`version ${this.raw} is not a prerelease`) } - else if (node._nodeType === interfaces_1.NodeType.DocumentType) { - for (const ele of parent._children) { - if (ele._nodeType === interfaces_1.NodeType.DocumentType && ele !== child) - throw new DOMException_1.HierarchyRequestError(`Document already has a document type node. Node is ${node.nodeName}.`); - } - let elementChild = child._previousSibling; - while (elementChild) { - if (elementChild._nodeType === interfaces_1.NodeType.Element) - throw new DOMException_1.HierarchyRequestError(`Cannot insert a document type node before an element node. Node is ${node.nodeName}.`); - elementChild = elementChild._previousSibling; - } + this.prerelease.length = 0 + break + + case 'major': + // If this is a pre-major version, bump up to the same major version. + // Otherwise increment major. + // 1.0.0-5 bumps to 1.0.0 + // 1.1.0 bumps to 2.0.0 + if ( + this.minor !== 0 || + this.patch !== 0 || + this.prerelease.length === 0 + ) { + this.major++ } - } - /** - * 7. Let reference child be child’s next sibling. - * 8. If reference child is node, set it to node’s next sibling. - * 8. Let previousSibling be child’s previous sibling. - */ - let referenceChild = child._nextSibling; - if (referenceChild === node) - referenceChild = node._nextSibling; - let previousSibling = child._previousSibling; - /** - * 10. Adopt node into parent’s node document. - * 11. Let removedNodes be the empty list. - */ - (0, DocumentAlgorithm_1.document_adopt)(node, parent._nodeDocument); - const removedNodes = []; - /** - * 12. If child’s parent is not null, then: - */ - if (child._parent !== null) { - /** - * 12.1. Set removedNodes to [child]. - * 12.2. Remove child from its parent with the suppress observers flag - * set. - */ - removedNodes.push(child); - mutation_remove(child, child._parent, true); - } - /** - * 13. Let nodes be node’s children if node is a DocumentFragment node; - * otherwise [node]. - */ - let nodes = []; - if (node._nodeType === interfaces_1.NodeType.DocumentFragment) { - nodes = Array.from(node._children); - } - else { - nodes.push(node); - } - /** - * 14. Insert node into parent before reference child with the suppress - * observers flag set. - */ - mutation_insert(node, parent, referenceChild, true); - /** - * 15. Queue a tree mutation record for parent with nodes, removedNodes, - * previousSibling, and reference child. - */ - if (DOMImpl_1.dom.features.mutationObservers) { - (0, MutationObserverAlgorithm_1.observer_queueTreeMutationRecord)(parent, nodes, removedNodes, previousSibling, referenceChild); - } - /** - * 16. Return child. - */ - return child; -} -/** - * Replaces all nodes of a parent with the given node. - * - * @param node - node to insert - * @param parent - parent node to receive node - */ -function mutation_replaceAll(node, parent) { - /** - * 1. If node is not null, adopt node into parent’s node document. - */ - if (node !== null) { - (0, DocumentAlgorithm_1.document_adopt)(node, parent._nodeDocument); - } - /** - * 2. Let removedNodes be parent’s children. - */ - const removedNodes = Array.from(parent._children); - /** - * 3. Let addedNodes be the empty list. - * 4. If node is DocumentFragment node, then set addedNodes to node’s - * children. - * 5. Otherwise, if node is non-null, set addedNodes to [node]. - */ - let addedNodes = []; - if (node && node._nodeType === interfaces_1.NodeType.DocumentFragment) { - addedNodes = Array.from(node._children); - } - else if (node !== null) { - addedNodes.push(node); - } - /** - * 6. Remove all parent’s children, in tree order, with the suppress - * observers flag set. - */ - for (const childNode of removedNodes) { - mutation_remove(childNode, parent, true); - } - /** - * 7. If node is not null, then insert node into parent before null with the - * suppress observers flag set. - */ - if (node !== null) { - mutation_insert(node, parent, null, true); - } - /** - * 8. Queue a tree mutation record for parent with addedNodes, removedNodes, - * null, and null. - */ - if (DOMImpl_1.dom.features.mutationObservers) { - (0, MutationObserverAlgorithm_1.observer_queueTreeMutationRecord)(parent, addedNodes, removedNodes, null, null); - } -} -/** - * Ensures pre-removal validity of a child node from a parent, then - * removes it. - * - * @param child - child node to remove - * @param parent - parent node - */ -function mutation_preRemove(child, parent) { - /** - * 1. If child’s parent is not parent, then throw a "NotFoundError" - * DOMException. - * 2. Remove child from parent. - * 3. Return child. - */ - if (child._parent !== parent) - throw new DOMException_1.NotFoundError(`The child node cannot be found under parent node. Child node is ${child.nodeName}, parent node is ${parent.nodeName}.`); - mutation_remove(child, parent); - return child; -} -/** - * Removes a child node from its parent. - * - * @param node - node to remove - * @param parent - parent node - * @param suppressObservers - whether to notify observers - */ -function mutation_remove(node, parent, suppressObservers) { - if (DOMImpl_1.dom.rangeList.size !== 0) { - /** - * 1. Let index be node’s index. - */ - const index = (0, TreeAlgorithm_1.tree_index)(node); - /** - * 2. For each live range whose start node is an inclusive descendant of - * node, set its start to (parent, index). - * 3. For each live range whose end node is an inclusive descendant of - * node, set its end to (parent, index). - */ - for (const range of DOMImpl_1.dom.rangeList) { - if ((0, TreeAlgorithm_1.tree_isDescendantOf)(node, range._start[0], true)) { - range._start = [parent, index]; - } - if ((0, TreeAlgorithm_1.tree_isDescendantOf)(node, range._end[0], true)) { - range._end = [parent, index]; - } - if (range._start[0] === parent && range._start[1] > index) { - range._start[1]--; - } - if (range._end[0] === parent && range._end[1] > index) { - range._end[1]--; - } + this.minor = 0 + this.patch = 0 + this.prerelease = [] + break + case 'minor': + // If this is a pre-minor version, bump up to the same minor version. + // Otherwise increment minor. + // 1.2.0-5 bumps to 1.2.0 + // 1.2.1 bumps to 1.3.0 + if (this.patch !== 0 || this.prerelease.length === 0) { + this.minor++ } - /** - * 4. For each live range whose start node is parent and start offset is - * greater than index, decrease its start offset by 1. - * 5. For each live range whose end node is parent and end offset is greater - * than index, decrease its end offset by 1. - */ - for (const range of DOMImpl_1.dom.rangeList) { - if (range._start[0] === parent && range._start[1] > index) { - range._start[1] -= 1; - } - if (range._end[0] === parent && range._end[1] > index) { - range._end[1] -= 1; - } + this.patch = 0 + this.prerelease = [] + break + case 'patch': + // If this is not a pre-release version, it will increment the patch. + // If it is a pre-release it will bump up to the same patch version. + // 1.2.0-5 patches to 1.2.0 + // 1.2.0 patches to 1.2.1 + if (this.prerelease.length === 0) { + this.patch++ } - } - /** - * 6. For each NodeIterator object iterator whose root’s node document is - * node’s node document, run the NodeIterator pre-removing steps given node - * and iterator. - */ - if (DOMImpl_1.dom.features.steps) { - for (const iterator of (0, NodeIteratorAlgorithm_1.nodeIterator_iteratorList)()) { - if (iterator._root._nodeDocument === node._nodeDocument) { - (0, DOMAlgorithm_1.dom_runNodeIteratorPreRemovingSteps)(iterator, node); + this.prerelease = [] + break + // This probably shouldn't be used publicly. + // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction. + case 'pre': { + const base = Number(identifierBase) ? 1 : 0 + + if (this.prerelease.length === 0) { + this.prerelease = [base] + } else { + let i = this.prerelease.length + while (--i >= 0) { + if (typeof this.prerelease[i] === 'number') { + this.prerelease[i]++ + i = -2 } - } - } - /** - * 7. Let oldPreviousSibling be node’s previous sibling. - * 8. Let oldNextSibling be node’s next sibling. - */ - const oldPreviousSibling = node._previousSibling; - const oldNextSibling = node._nextSibling; - // set document element node - if (util_1.Guard.isDocumentNode(parent) && util_1.Guard.isElementNode(node)) { - parent._documentElement = null; - } - /** - * 9. Remove node from its parent’s children. - */ - node._parent = null; - parent._children.delete(node); - // assign siblings and children for quick lookups - const prev = node._previousSibling; - const next = node._nextSibling; - node._previousSibling = null; - node._nextSibling = null; - if (prev) - prev._nextSibling = next; - if (next) - next._previousSibling = prev; - if (!prev) - parent._firstChild = next; - if (!next) - parent._lastChild = prev; - /** - * 10. If node is assigned, then run assign slotables for node’s assigned - * slot. - */ - if (DOMImpl_1.dom.features.slots) { - if (util_1.Guard.isSlotable(node) && node._assignedSlot !== null && (0, ShadowTreeAlgorithm_1.shadowTree_isAssigned)(node)) { - (0, ShadowTreeAlgorithm_1.shadowTree_assignSlotables)(node._assignedSlot); - } - } - /** - * 11. If parent’s root is a shadow root, and parent is a slot whose - * assigned nodes is the empty list, then run signal a slot change for - * parent. - */ - if (DOMImpl_1.dom.features.slots) { - if (util_1.Guard.isShadowRoot((0, TreeAlgorithm_1.tree_rootNode)(parent)) && - util_1.Guard.isSlot(parent) && (0, util_2.isEmpty)(parent._assignedNodes)) { - (0, ShadowTreeAlgorithm_1.shadowTree_signalASlotChange)(parent); - } - } - /** - * 12. If node has an inclusive descendant that is a slot, then: - * 12.1. Run assign slotables for a tree with parent's root. - * 12.2. Run assign slotables for a tree with node. - */ - if (DOMImpl_1.dom.features.slots) { - const descendant = (0, TreeAlgorithm_1.tree_getFirstDescendantNode)(node, true, false, (e) => util_1.Guard.isSlot(e)); - if (descendant !== null) { - (0, ShadowTreeAlgorithm_1.shadowTree_assignSlotablesForATree)((0, TreeAlgorithm_1.tree_rootNode)(parent)); - (0, ShadowTreeAlgorithm_1.shadowTree_assignSlotablesForATree)(node); - } - } - /** - * 13. Run the removing steps with node and parent. - */ - if (DOMImpl_1.dom.features.steps) { - (0, DOMAlgorithm_1.dom_runRemovingSteps)(node, parent); - } - /** - * 14. If node is custom, then enqueue a custom element callback - * reaction with node, callback name "disconnectedCallback", - * and an empty argument list. - */ - if (DOMImpl_1.dom.features.customElements) { - if (util_1.Guard.isCustomElementNode(node)) { - (0, CustomElementAlgorithm_1.customElement_enqueueACustomElementCallbackReaction)(node, "disconnectedCallback", []); - } - } - /** - * 15. For each shadow-including descendant descendant of node, - * in shadow-including tree order, then: - */ - let descendant = (0, TreeAlgorithm_1.tree_getFirstDescendantNode)(node, false, true); - while (descendant !== null) { - /** - * 15.1. Run the removing steps with descendant. - */ - if (DOMImpl_1.dom.features.steps) { - (0, DOMAlgorithm_1.dom_runRemovingSteps)(descendant, node); - } - /** - * 15.2. If descendant is custom, then enqueue a custom element - * callback reaction with descendant, callback name - * "disconnectedCallback", and an empty argument list. - */ - if (DOMImpl_1.dom.features.customElements) { - if (util_1.Guard.isCustomElementNode(descendant)) { - (0, CustomElementAlgorithm_1.customElement_enqueueACustomElementCallbackReaction)(descendant, "disconnectedCallback", []); + } + if (i === -1) { + // didn't increment anything + if (identifier === this.prerelease.join('.') && identifierBase === false) { + throw new Error('invalid increment argument: identifier already exists') } + this.prerelease.push(base) + } } - descendant = (0, TreeAlgorithm_1.tree_getNextDescendantNode)(node, descendant, false, true); - } - /** - * 16. For each inclusive ancestor inclusiveAncestor of parent, and - * then for each registered of inclusiveAncestor's registered - * observer list, if registered's options's subtree is true, - * then append a new transient registered observer whose - * observer is registered's observer, options is registered's - * options, and source is registered to node's registered - * observer list. - */ - if (DOMImpl_1.dom.features.mutationObservers) { - let inclusiveAncestor = (0, TreeAlgorithm_1.tree_getFirstAncestorNode)(parent, true); - while (inclusiveAncestor !== null) { - for (const registered of inclusiveAncestor._registeredObserverList) { - if (registered.options.subtree) { - node._registeredObserverList.push({ - observer: registered.observer, - options: registered.options, - source: registered - }); - } + if (identifier) { + // 1.2.0-beta.1 bumps to 1.2.0-beta.2, + // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 + let prerelease = [identifier, base] + if (identifierBase === false) { + prerelease = [identifier] + } + if (isPrereleaseIdentifier(this.prerelease, identifier)) { + const prereleaseBase = this.prerelease[identifier.split('.').length] + if (isNaN(prereleaseBase)) { + this.prerelease = prerelease } - inclusiveAncestor = (0, TreeAlgorithm_1.tree_getNextAncestorNode)(parent, inclusiveAncestor, true); - } - } - /** - * 17. If suppress observers flag is unset, then queue a tree mutation - * record for parent with « », « node », oldPreviousSibling, and - * oldNextSibling. - */ - if (DOMImpl_1.dom.features.mutationObservers) { - if (!suppressObservers) { - (0, MutationObserverAlgorithm_1.observer_queueTreeMutationRecord)(parent, [], [node], oldPreviousSibling, oldNextSibling); + } else { + this.prerelease = prerelease + } } + break + } + default: + throw new Error(`invalid increment argument: ${release}`) } - /** - * 18. If node is a Text node, then run the child text content change steps - * for parent. - */ - if (DOMImpl_1.dom.features.steps) { - if (util_1.Guard.isTextNode(node)) { - (0, DOMAlgorithm_1.dom_runChildTextContentChangeSteps)(parent); - } + this.raw = this.format() + if (this.build.length) { + this.raw += `+${this.build.join('.')}` } + return this + } } -//# sourceMappingURL=MutationAlgorithm.js.map + +module.exports = SemVer + /***/ }), -/***/ 3243: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 1799: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.observer_queueAMutationObserverMicrotask = observer_queueAMutationObserverMicrotask; -exports.observer_notifyMutationObservers = observer_notifyMutationObservers; -exports.observer_queueMutationRecord = observer_queueMutationRecord; -exports.observer_queueTreeMutationRecord = observer_queueTreeMutationRecord; -exports.observer_queueAttributeMutationRecord = observer_queueAttributeMutationRecord; -const DOMImpl_1 = __nccwpck_require__(698); -const util_1 = __nccwpck_require__(8247); -const infra_1 = __nccwpck_require__(4737); -const CreateAlgorithm_1 = __nccwpck_require__(8308); -const TreeAlgorithm_1 = __nccwpck_require__(3532); -const EventAlgorithm_1 = __nccwpck_require__(8012); -/** - * Queues a mutation observer microtask to the surrounding agent’s mutation - * observers. - */ -function observer_queueAMutationObserverMicrotask() { - /** - * 1. If the surrounding agent’s mutation observer microtask queued is true, - * then return. - * 2. Set the surrounding agent’s mutation observer microtask queued to true. - * 3. Queue a microtask to notify mutation observers. - */ - const window = DOMImpl_1.dom.window; - if (window._mutationObserverMicrotaskQueued) - return; - window._mutationObserverMicrotaskQueued = true; - Promise.resolve().then(() => { observer_notifyMutationObservers(); }); -} -/** - * Notifies the surrounding agent’s mutation observers. - */ -function observer_notifyMutationObservers() { - /** - * 1. Set the surrounding agent’s mutation observer microtask queued to false. - * 2. Let notifySet be a clone of the surrounding agent’s mutation observers. - * 3. Let signalSet be a clone of the surrounding agent’s signal slots. - * 4. Empty the surrounding agent’s signal slots. - */ - const window = DOMImpl_1.dom.window; - window._mutationObserverMicrotaskQueued = false; - const notifySet = infra_1.set.clone(window._mutationObservers); - const signalSet = infra_1.set.clone(window._signalSlots); - infra_1.set.empty(window._signalSlots); - /** - * 5. For each mo of notifySet: - */ - for (const mo of notifySet) { - /** - * 5.1. Let records be a clone of mo’s record queue. - * 5.2. Empty mo’s record queue. - */ - const records = infra_1.list.clone(mo._recordQueue); - infra_1.list.empty(mo._recordQueue); - /** - * 5.3. For each node of mo’s node list, remove all transient registered - * observers whose observer is mo from node’s registered observer list. - */ - for (let i = 0; i < mo._nodeList.length; i++) { - const node = mo._nodeList[i]; - infra_1.list.remove(node._registeredObserverList, (observer) => { - return util_1.Guard.isTransientRegisteredObserver(observer) && observer.observer === mo; - }); - } - /** - * 5.4. If records is not empty, then invoke mo’s callback with « records, - * mo », and mo. If this throws an exception, then report the exception. - */ - if (!infra_1.list.isEmpty(records)) { - try { - mo._callback.call(mo, records, mo); - } - catch (err) { - // TODO: Report the exception - } - } - } - /** - * 6. For each slot of signalSet, fire an event named slotchange, with its - * bubbles attribute set to true, at slot. - */ - if (DOMImpl_1.dom.features.slots) { - for (const slot of signalSet) { - (0, EventAlgorithm_1.event_fireAnEvent)("slotchange", slot, undefined, { bubbles: true }); - } - } + +const parse = __nccwpck_require__(6353) +const clean = (version, options) => { + const s = parse(version.trim().replace(/^[=v]+/, ''), options) + return s ? s.version : null } -/** - * Queues a mutation record of the given type for target. - * - * @param type - mutation record type - * @param target - target node - * @param name - name before mutation - * @param namespace - namespace before mutation - * @param oldValue - attribute value before mutation - * @param addedNodes - a list od added nodes - * @param removedNodes - a list of removed nodes - * @param previousSibling - previous sibling of target before mutation - * @param nextSibling - next sibling of target before mutation - */ -function observer_queueMutationRecord(type, target, name, namespace, oldValue, addedNodes, removedNodes, previousSibling, nextSibling) { - /** - * 1. Let interestedObservers be an empty map. - * 2. Let nodes be the inclusive ancestors of target. - * 3. For each node in nodes, and then for each registered of node’s - * registered observer list: - */ - const interestedObservers = new Map(); - let node = (0, TreeAlgorithm_1.tree_getFirstAncestorNode)(target, true); - while (node !== null) { - for (let i = 0; i < node._registeredObserverList.length; i++) { - const registered = node._registeredObserverList[i]; - /** - * 3.1. Let options be registered’s options. - * 3.2. If none of the following are true - * - node is not target and options’s subtree is false - * - type is "attributes" and options’s attributes is not true - * - type is "attributes", options’s attributeFilter is present, and - * options’s attributeFilter does not contain name or namespace is - * non-null - * - type is "characterData" and options’s characterData is not true - * - type is "childList" and options’s childList is false - */ - const options = registered.options; - if (node !== target && !options.subtree) - continue; - if (type === "attributes" && !options.attributes) - continue; - if (type === "attributes" && options.attributeFilter && - (!options.attributeFilter.indexOf(name || '') || namespace !== null)) - continue; - if (type === "characterData" && !options.characterData) - continue; - if (type === "childList" && !options.childList) - continue; - /** - * then: - * 3.2.1. Let mo be registered’s observer. - * 3.2.2. If interestedObservers[mo] does not exist, then set - * interestedObservers[mo] to null. - * 3.2.3. If either type is "attributes" and options’s attributeOldValue - * is true, or type is "characterData" and options’s - * characterDataOldValue is true, then set interestedObservers[mo] - * to oldValue. - */ - const mo = registered.observer; - if (!interestedObservers.has(mo)) { - interestedObservers.set(mo, null); - } - if ((type === "attributes" && options.attributeOldValue) || - (type === "characterData" && options.characterDataOldValue)) { - interestedObservers.set(mo, oldValue); - } - } - node = (0, TreeAlgorithm_1.tree_getNextAncestorNode)(target, node, true); - } - /** - * 4. For each observer → mappedOldValue of interestedObservers: - */ - for (const [observer, mappedOldValue] of interestedObservers) { - /** - * 4.1. Let record be a new MutationRecord object with its type set to - * type, target set to target, attributeName set to name, - * attributeNamespace set to namespace, oldValue set to mappedOldValue, - * addedNodes set to addedNodes, removedNodes set to removedNodes, - * previousSibling set to previousSibling, and nextSibling set to - * nextSibling. - * 4.2. Enqueue record to observer’s record queue. - */ - const record = (0, CreateAlgorithm_1.create_mutationRecord)(type, target, (0, CreateAlgorithm_1.create_nodeListStatic)(target, addedNodes), (0, CreateAlgorithm_1.create_nodeListStatic)(target, removedNodes), previousSibling, nextSibling, name, namespace, mappedOldValue); - const queue = observer._recordQueue; - queue.push(record); - } - /** - * 5. Queue a mutation observer microtask. - */ - observer_queueAMutationObserverMicrotask(); -} -/** - * Queues a tree mutation record for target. - * - * @param target - target node - * @param addedNodes - a list od added nodes - * @param removedNodes - a list of removed nodes - * @param previousSibling - previous sibling of target before mutation - * @param nextSibling - next sibling of target before mutation - */ -function observer_queueTreeMutationRecord(target, addedNodes, removedNodes, previousSibling, nextSibling) { - /** - * To queue a tree mutation record for target with addedNodes, removedNodes, - * previousSibling, and nextSibling, queue a mutation record of "childList" - * for target with null, null, null, addedNodes, removedNodes, - * previousSibling, and nextSibling. - */ - observer_queueMutationRecord("childList", target, null, null, null, addedNodes, removedNodes, previousSibling, nextSibling); -} -/** - * Queues an attribute mutation record for target. - * - * @param target - target node - * @param name - name before mutation - * @param namespace - namespace before mutation - * @param oldValue - attribute value before mutation - */ -function observer_queueAttributeMutationRecord(target, name, namespace, oldValue) { - /** - * To queue an attribute mutation record for target with name, namespace, - * and oldValue, queue a mutation record of "attributes" for target with - * name, namespace, oldValue, « », « », null, and null. - */ - observer_queueMutationRecord("attributes", target, name, namespace, oldValue, [], [], null, null); -} -//# sourceMappingURL=MutationObserverAlgorithm.js.map +module.exports = clean + /***/ }), -/***/ 9733: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 8646: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.namespace_validate = namespace_validate; -exports.namespace_validateAndExtract = namespace_validateAndExtract; -exports.namespace_extractQName = namespace_extractQName; -const DOMException_1 = __nccwpck_require__(7175); -const infra_1 = __nccwpck_require__(4737); -const XMLAlgorithm_1 = __nccwpck_require__(6879); -/** - * Validates the given qualified name. - * - * @param qualifiedName - qualified name - */ -function namespace_validate(qualifiedName) { - /** - * To validate a qualifiedName, throw an "InvalidCharacterError" - * DOMException if qualifiedName does not match the Name or QName - * production. - */ - if (!(0, XMLAlgorithm_1.xml_isName)(qualifiedName)) - throw new DOMException_1.InvalidCharacterError(`Invalid XML name: ${qualifiedName}`); - if (!(0, XMLAlgorithm_1.xml_isQName)(qualifiedName)) - throw new DOMException_1.InvalidCharacterError(`Invalid XML qualified name: ${qualifiedName}.`); -} -/** - * Validates and extracts a namespace, prefix and localName from the - * given namespace and qualified name. - * See: https://dom.spec.whatwg.org/#validate-and-extract. - * - * @param namespace - namespace - * @param qualifiedName - qualified name - * - * @returns a tuple with `namespace`, `prefix` and `localName`. - */ -function namespace_validateAndExtract(namespace, qualifiedName) { - /** - * 1. If namespace is the empty string, set it to null. - * 2. Validate qualifiedName. - * 3. Let prefix be null. - * 4. Let localName be qualifiedName. - * 5. If qualifiedName contains a ":" (U+003E), then split the string on it - * and set prefix to the part before and localName to the part after. - * 6. If prefix is non-null and namespace is null, then throw a - * "NamespaceError" DOMException. - * 7. If prefix is "xml" and namespace is not the XML namespace, then throw - * a "NamespaceError" DOMException. - * 8. If either qualifiedName or prefix is "xmlns" and namespace is not the - * XMLNS namespace, then throw a "NamespaceError" DOMException. - * 9. If namespace is the XMLNS namespace and neither qualifiedName nor - * prefix is "xmlns", then throw a "NamespaceError" DOMException. - * 10. Return namespace, prefix, and localName. - */ - if (!namespace) - namespace = null; - namespace_validate(qualifiedName); - const parts = qualifiedName.split(':'); - const prefix = (parts.length === 2 ? parts[0] : null); - const localName = (parts.length === 2 ? parts[1] : qualifiedName); - if (prefix && namespace === null) - throw new DOMException_1.NamespaceError("Qualified name includes a prefix but the namespace is null."); - if (prefix === "xml" && namespace !== infra_1.namespace.XML) - throw new DOMException_1.NamespaceError(`Qualified name includes the "xml" prefix but the namespace is not the XML namespace.`); - if (namespace !== infra_1.namespace.XMLNS && - (prefix === "xmlns" || qualifiedName === "xmlns")) - throw new DOMException_1.NamespaceError(`Qualified name includes the "xmlns" prefix but the namespace is not the XMLNS namespace.`); - if (namespace === infra_1.namespace.XMLNS && - (prefix !== "xmlns" && qualifiedName !== "xmlns")) - throw new DOMException_1.NamespaceError(`Qualified name does not include the "xmlns" prefix but the namespace is the XMLNS namespace.`); - return [namespace, prefix, localName]; -} -/** - * Extracts a prefix and localName from the given qualified name. - * - * @param qualifiedName - qualified name - * - * @returns an tuple with `prefix` and `localName`. - */ -function namespace_extractQName(qualifiedName) { - namespace_validate(qualifiedName); - const parts = qualifiedName.split(':'); - const prefix = (parts.length === 2 ? parts[0] : null); - const localName = (parts.length === 2 ? parts[1] : qualifiedName); - return [prefix, localName]; + +const eq = __nccwpck_require__(5082) +const neq = __nccwpck_require__(4974) +const gt = __nccwpck_require__(6599) +const gte = __nccwpck_require__(1236) +const lt = __nccwpck_require__(3872) +const lte = __nccwpck_require__(6717) + +const cmp = (a, op, b, loose) => { + switch (op) { + case '===': + if (typeof a === 'object') { + a = a.version + } + if (typeof b === 'object') { + b = b.version + } + return a === b + + case '!==': + if (typeof a === 'object') { + a = a.version + } + if (typeof b === 'object') { + b = b.version + } + return a !== b + + case '': + case '=': + case '==': + return eq(a, b, loose) + + case '!=': + return neq(a, b, loose) + + case '>': + return gt(a, b, loose) + + case '>=': + return gte(a, b, loose) + + case '<': + return lt(a, b, loose) + + case '<=': + return lte(a, b, loose) + + default: + throw new TypeError(`Invalid operator: ${op}`) + } } -//# sourceMappingURL=NamespaceAlgorithm.js.map +module.exports = cmp + /***/ }), -/***/ 1228: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 5385: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.node_stringReplaceAll = node_stringReplaceAll; -exports.node_clone = node_clone; -exports.node_equals = node_equals; -exports.node_listOfElementsWithQualifiedName = node_listOfElementsWithQualifiedName; -exports.node_listOfElementsWithNamespace = node_listOfElementsWithNamespace; -exports.node_listOfElementsWithClassNames = node_listOfElementsWithClassNames; -exports.node_locateANamespacePrefix = node_locateANamespacePrefix; -exports.node_locateANamespace = node_locateANamespace; -const DOMImpl_1 = __nccwpck_require__(698); -const util_1 = __nccwpck_require__(8247); -const infra_1 = __nccwpck_require__(4737); -const CreateAlgorithm_1 = __nccwpck_require__(8308); -const OrderedSetAlgorithm_1 = __nccwpck_require__(8421); -const DOMAlgorithm_1 = __nccwpck_require__(9484); -const MutationAlgorithm_1 = __nccwpck_require__(45); -const ElementAlgorithm_1 = __nccwpck_require__(2720); -/** - * Replaces the contents of the given node with a single text node. - * - * @param string - node contents - * @param parent - a node - */ -function node_stringReplaceAll(str, parent) { - /** - * 1. Let node be null. - * 2. If string is not the empty string, then set node to a new Text node - * whose data is string and node document is parent’s node document. - * 3. Replace all with node within parent. - */ - let node = null; - if (str !== '') { - node = (0, CreateAlgorithm_1.create_text)(parent._nodeDocument, str); - } - (0, MutationAlgorithm_1.mutation_replaceAll)(node, parent); -} -/** - * Clones a node. - * - * @param node - a node to clone - * @param document - the document to own the cloned node - * @param cloneChildrenFlag - whether to clone node's children - */ -function node_clone(node, document = null, cloneChildrenFlag = false) { - /** - * 1. If document is not given, let document be node’s node document. - */ - if (document === null) - document = node._nodeDocument; - let copy; - if (util_1.Guard.isElementNode(node)) { - /** - * 2. If node is an element, then: - * 2.1. Let copy be the result of creating an element, given document, - * node’s local name, node’s namespace, node’s namespace prefix, - * and node’s is value, with the synchronous custom elements flag unset. - * 2.2. For each attribute in node’s attribute list: - * 2.2.1. Let copyAttribute be a clone of attribute. - * 2.2.2. Append copyAttribute to copy. - */ - copy = (0, ElementAlgorithm_1.element_createAnElement)(document, node._localName, node._namespace, node._namespacePrefix, node._is, false); - for (const attribute of node._attributeList) { - const copyAttribute = node_clone(attribute, document); - (0, ElementAlgorithm_1.element_append)(copyAttribute, copy); - } - } - else { - /** - * 3. Otherwise, let copy be a node that implements the same interfaces as - * node, and fulfills these additional requirements, switching on node: - * - Document - * Set copy’s encoding, content type, URL, origin, type, and mode, to those - * of node. - * - DocumentType - * Set copy’s name, public ID, and system ID, to those of node. - * - Attr - * Set copy’s namespace, namespace prefix, local name, and value, to - * those of node. - * - Text - * - Comment - * Set copy’s data, to that of node. - * - ProcessingInstruction - * Set copy’s target and data to those of node. - * - Any other node - */ - if (util_1.Guard.isDocumentNode(node)) { - const doc = (0, CreateAlgorithm_1.create_document)(); - doc._encoding = node._encoding; - doc._contentType = node._contentType; - doc._URL = node._URL; - doc._origin = node._origin; - doc._type = node._type; - doc._mode = node._mode; - copy = doc; - } - else if (util_1.Guard.isDocumentTypeNode(node)) { - const doctype = (0, CreateAlgorithm_1.create_documentType)(document, node._name, node._publicId, node._systemId); - copy = doctype; - } - else if (util_1.Guard.isAttrNode(node)) { - const attr = (0, CreateAlgorithm_1.create_attr)(document, node.localName); - attr._namespace = node._namespace; - attr._namespacePrefix = node._namespacePrefix; - attr._value = node._value; - copy = attr; - } - else if (util_1.Guard.isExclusiveTextNode(node)) { - copy = (0, CreateAlgorithm_1.create_text)(document, node._data); - } - else if (util_1.Guard.isCDATASectionNode(node)) { - copy = (0, CreateAlgorithm_1.create_cdataSection)(document, node._data); - } - else if (util_1.Guard.isCommentNode(node)) { - copy = (0, CreateAlgorithm_1.create_comment)(document, node._data); - } - else if (util_1.Guard.isProcessingInstructionNode(node)) { - copy = (0, CreateAlgorithm_1.create_processingInstruction)(document, node._target, node._data); - } - else if (util_1.Guard.isDocumentFragmentNode(node)) { - copy = (0, CreateAlgorithm_1.create_documentFragment)(document); - } - else { - copy = Object.create(node); - } - } - /** - * 4. Set copy’s node document and document to copy, if copy is a document, - * and set copy’s node document to document otherwise. - */ - if (util_1.Guard.isDocumentNode(copy)) { - copy._nodeDocument = copy; - document = copy; - } - else { - copy._nodeDocument = document; - } - /** - * 5. Run any cloning steps defined for node in other applicable - * specifications and pass copy, node, document and the clone children flag - * if set, as parameters. - */ - if (DOMImpl_1.dom.features.steps) { - (0, DOMAlgorithm_1.dom_runCloningSteps)(copy, node, document, cloneChildrenFlag); - } - /** - * 6. If the clone children flag is set, clone all the children of node and - * append them to copy, with document as specified and the clone children - * flag being set. - */ - if (cloneChildrenFlag) { - for (const child of node._children) { - const childCopy = node_clone(child, document, true); - (0, MutationAlgorithm_1.mutation_append)(childCopy, copy); - } - } - /** - * 7. Return copy. - */ - return copy; -} -/** - * Determines if two nodes can be considered equal. - * - * @param a - node to compare - * @param b - node to compare - */ -function node_equals(a, b) { - /** - * 1. A and B’s nodeType attribute value is identical. - */ - if (a._nodeType !== b._nodeType) - return false; - /** - * 2. The following are also equal, depending on A: - * - DocumentType - * Its name, public ID, and system ID. - * - Element - * Its namespace, namespace prefix, local name, and its attribute list’s size. - * - Attr - * Its namespace, local name, and value. - * - ProcessingInstruction - * Its target and data. - * - Text - * - Comment - * Its data. - */ - if (util_1.Guard.isDocumentTypeNode(a) && util_1.Guard.isDocumentTypeNode(b)) { - if (a._name !== b._name || a._publicId !== b._publicId || - a._systemId !== b._systemId) - return false; - } - else if (util_1.Guard.isElementNode(a) && util_1.Guard.isElementNode(b)) { - if (a._namespace !== b._namespace || a._namespacePrefix !== b._namespacePrefix || - a._localName !== b._localName || - a._attributeList.length !== b._attributeList.length) - return false; - } - else if (util_1.Guard.isAttrNode(a) && util_1.Guard.isAttrNode(b)) { - if (a._namespace !== b._namespace || a._localName !== b._localName || - a._value !== b._value) - return false; - } - else if (util_1.Guard.isProcessingInstructionNode(a) && util_1.Guard.isProcessingInstructionNode(b)) { - if (a._target !== b._target || a._data !== b._data) - return false; - } - else if (util_1.Guard.isCharacterDataNode(a) && util_1.Guard.isCharacterDataNode(b)) { - if (a._data !== b._data) - return false; - } - /** - * 3. If A is an element, each attribute in its attribute list has an attribute - * that equals an attribute in B’s attribute list. - */ - if (util_1.Guard.isElementNode(a) && util_1.Guard.isElementNode(b)) { - const attrMap = {}; - for (const attrA of a._attributeList) { - attrMap[attrA._localName] = attrA; - } - for (const attrB of b._attributeList) { - const attrA = attrMap[attrB._localName]; - if (!attrA) - return false; - if (!node_equals(attrA, attrB)) - return false; - } - } - /** - * 4. A and B have the same number of children. - * 5. Each child of A equals the child of B at the identical index. - */ - if (a._children.size !== b._children.size) - return false; - const itA = a._children[Symbol.iterator](); - const itB = b._children[Symbol.iterator](); - let resultA = itA.next(); - let resultB = itB.next(); - while (!resultA.done && !resultB.done) { - const child1 = resultA.value; - const child2 = resultB.value; - if (!node_equals(child1, child2)) - return false; - resultA = itA.next(); - resultB = itB.next(); - } - return true; -} -/** - * Returns a collection of elements with the given qualified name which are - * descendants of the given root node. - * See: https://dom.spec.whatwg.org/#concept-getelementsbytagname - * - * @param qualifiedName - qualified name - * @param root - root node - */ -function node_listOfElementsWithQualifiedName(qualifiedName, root) { - /** - * 1. If qualifiedName is "*" (U+002A), return a HTMLCollection rooted at - * root, whose filter matches only descendant elements. - * 2. Otherwise, if root’s node document is an HTML document, return a - * HTMLCollection rooted at root, whose filter matches the following - * descendant elements: - * 2.1. Whose namespace is the HTML namespace and whose qualified name is - * qualifiedName, in ASCII lowercase. - * 2.2. Whose namespace is not the HTML namespace and whose qualified name - * is qualifiedName. - * 3. Otherwise, return a HTMLCollection rooted at root, whose filter - * matches descendant elements whose qualified name is qualifiedName. - */ - if (qualifiedName === "*") { - return (0, CreateAlgorithm_1.create_htmlCollection)(root); - } - else if (root._nodeDocument._type === "html") { - return (0, CreateAlgorithm_1.create_htmlCollection)(root, function (ele) { - if (ele._namespace === infra_1.namespace.HTML && - ele._qualifiedName === qualifiedName.toLowerCase()) { - return true; - } - else if (ele._namespace !== infra_1.namespace.HTML && - ele._qualifiedName === qualifiedName) { - return true; - } - else { - return false; - } - }); - } - else { - return (0, CreateAlgorithm_1.create_htmlCollection)(root, function (ele) { - return (ele._qualifiedName === qualifiedName); - }); - } -} -/** - * Returns a collection of elements with the given namespace which are - * descendants of the given root node. - * See: https://dom.spec.whatwg.org/#concept-getelementsbytagnamens - * - * @param namespace - element namespace - * @param localName - local name - * @param root - root node - */ -function node_listOfElementsWithNamespace(namespace, localName, root) { - /** - * 1. If namespace is the empty string, set it to null. - * 2. If both namespace and localName are "*" (U+002A), return a - * HTMLCollection rooted at root, whose filter matches descendant elements. - * 3. Otherwise, if namespace is "*" (U+002A), return a HTMLCollection - * rooted at root, whose filter matches descendant elements whose local - * name is localName. - * 4. Otherwise, if localName is "*" (U+002A), return a HTMLCollection - * rooted at root, whose filter matches descendant elements whose - * namespace is namespace. - * 5. Otherwise, return a HTMLCollection rooted at root, whose filter - * matches descendant elements whose namespace is namespace and local - * name is localName. - */ - if (namespace === '') - namespace = null; - if (namespace === "*" && localName === "*") { - return (0, CreateAlgorithm_1.create_htmlCollection)(root); - } - else if (namespace === "*") { - return (0, CreateAlgorithm_1.create_htmlCollection)(root, function (ele) { - return (ele._localName === localName); - }); - } - else if (localName === "*") { - return (0, CreateAlgorithm_1.create_htmlCollection)(root, function (ele) { - return (ele._namespace === namespace); - }); - } - else { - return (0, CreateAlgorithm_1.create_htmlCollection)(root, function (ele) { - return (ele._localName === localName && ele._namespace === namespace); - }); - } -} -/** - * Returns a collection of elements with the given class names which are - * descendants of the given root node. - * See: https://dom.spec.whatwg.org/#concept-getelementsbyclassname - * - * @param namespace - element namespace - * @param localName - local name - * @param root - root node - */ -function node_listOfElementsWithClassNames(classNames, root) { - /** - * 1. Let classes be the result of running the ordered set parser - * on classNames. - * 2. If classes is the empty set, return an empty HTMLCollection. - * 3. Return a HTMLCollection rooted at root, whose filter matches - * descendant elements that have all their classes in classes. - * The comparisons for the classes must be done in an ASCII case-insensitive - * manner if root’s node document’s mode is "quirks", and in a - * case-sensitive manner otherwise. - */ - const classes = (0, OrderedSetAlgorithm_1.orderedSet_parse)(classNames); - if (classes.size === 0) { - return (0, CreateAlgorithm_1.create_htmlCollection)(root, () => false); - } - const caseSensitive = (root._nodeDocument._mode !== "quirks"); - return (0, CreateAlgorithm_1.create_htmlCollection)(root, function (ele) { - const eleClasses = ele.classList; - return (0, OrderedSetAlgorithm_1.orderedSet_contains)(eleClasses._tokenSet, classes, caseSensitive); - }); -} -/** - * Searches for a namespace prefix associated with the given namespace - * starting from the given element through its ancestors. - * - * @param element - an element node to start searching at - * @param namespace - namespace to search for - */ -function node_locateANamespacePrefix(element, namespace) { - /** - * 1. If element’s namespace is namespace and its namespace prefix is not - * null, then return its namespace prefix. - */ - if (element._namespace === namespace && element._namespacePrefix !== null) { - return element._namespacePrefix; - } - /** - * 2. If element has an attribute whose namespace prefix is "xmlns" and - * value is namespace, then return element’s first such attribute’s - * local name. - */ - for (let i = 0; i < element._attributeList.length; i++) { - const attr = element._attributeList[i]; - if (attr._namespacePrefix === "xmlns" && attr._value === namespace) { - return attr._localName; - } - } - /** - * 3. If element’s parent element is not null, then return the result of - * running locate a namespace prefix on that element using namespace. - */ - if (element._parent && util_1.Guard.isElementNode(element._parent)) { - return node_locateANamespacePrefix(element._parent, namespace); - } - /** - * 4. Return null. - */ - return null; -} -/** - * Searches for a namespace associated with the given namespace prefix - * starting from the given node through its ancestors. - * - * @param node - a node to start searching at - * @param prefix - namespace prefix to search for - */ -function node_locateANamespace(node, prefix) { - if (util_1.Guard.isElementNode(node)) { - /** - * 1. If its namespace is not null and its namespace prefix is prefix, - * then return namespace. - */ - if (node._namespace !== null && node._namespacePrefix === prefix) { - return node._namespace; - } - /** - * 2. If it has an attribute whose namespace is the XMLNS namespace, - * namespace prefix is "xmlns", and local name is prefix, or if prefix - * is null and it has an attribute whose namespace is the XMLNS namespace, - * namespace prefix is null, and local name is "xmlns", then return its - * value if it is not the empty string, and null otherwise. - */ - for (let i = 0; i < node._attributeList.length; i++) { - const attr = node._attributeList[i]; - if (attr._namespace === infra_1.namespace.XMLNS && - attr._namespacePrefix === "xmlns" && - attr._localName === prefix) { - return attr._value || null; - } - if (prefix === null && attr._namespace === infra_1.namespace.XMLNS && - attr._namespacePrefix === null && attr._localName === "xmlns") { - return attr._value || null; - } - } - /** - * 3. If its parent element is null, then return null. - */ - if (node.parentElement === null) - return null; - /** - * 4. Return the result of running locate a namespace on its parent - * element using prefix. - */ - return node_locateANamespace(node.parentElement, prefix); - } - else if (util_1.Guard.isDocumentNode(node)) { - /** - * 1. If its document element is null, then return null. - * 2. Return the result of running locate a namespace on its document - * element using prefix. - */ - if (node.documentElement === null) - return null; - return node_locateANamespace(node.documentElement, prefix); - } - else if (util_1.Guard.isDocumentTypeNode(node) || util_1.Guard.isDocumentFragmentNode(node)) { - return null; - } - else if (util_1.Guard.isAttrNode(node)) { - /** - * 1. If its element is null, then return null. - * 2. Return the result of running locate a namespace on its element - * using prefix. - */ - if (node._element === null) - return null; - return node_locateANamespace(node._element, prefix); - } - else { - /** - * 1. If its parent element is null, then return null. - * 2. Return the result of running locate a namespace on its parent - * element using prefix. - */ - if (!node._parent || !util_1.Guard.isElementNode(node._parent)) - return null; - return node_locateANamespace(node._parent, prefix); + +const SemVer = __nccwpck_require__(7163) +const parse = __nccwpck_require__(6353) +const { safeRe: re, t } = __nccwpck_require__(5471) + +const coerce = (version, options) => { + if (version instanceof SemVer) { + return version + } + + if (typeof version === 'number') { + version = String(version) + } + + if (typeof version !== 'string') { + return null + } + + options = options || {} + + let match = null + if (!options.rtl) { + match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE]) + } else { + // Find the right-most coercible string that does not share + // a terminus with a more left-ward coercible string. + // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4' + // With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4' + // + // Walk through the string checking with a /g regexp + // Manually set the index so as to pick up overlapping matches. + // Stop when we get a match that ends at the string end, since no + // coercible string can be more right-ward without the same terminus. + const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL] + let next + while ((next = coerceRtlRegex.exec(version)) && + (!match || match.index + match[0].length !== version.length) + ) { + if (!match || + next.index + next[0].length !== match.index + match[0].length) { + match = next + } + coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length } + // leave it in a clean state + coerceRtlRegex.lastIndex = -1 + } + + if (match === null) { + return null + } + + const major = match[2] + const minor = match[3] || '0' + const patch = match[4] || '0' + const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : '' + const build = options.includePrerelease && match[6] ? `+${match[6]}` : '' + + return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options) } -//# sourceMappingURL=NodeAlgorithm.js.map +module.exports = coerce + /***/ }), -/***/ 9670: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 7648: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.nodeIterator_traverse = nodeIterator_traverse; -exports.nodeIterator_iteratorList = nodeIterator_iteratorList; -const DOMImpl_1 = __nccwpck_require__(698); -const interfaces_1 = __nccwpck_require__(9454); -const TraversalAlgorithm_1 = __nccwpck_require__(6746); -const TreeAlgorithm_1 = __nccwpck_require__(3532); -/** - * Returns the next or previous node in the subtree, or `null` if - * there are none. - * - * @param iterator - the `NodeIterator` instance - * @param forward- `true` to return the next node, or `false` to - * return the previous node. - */ -function nodeIterator_traverse(iterator, forward) { - /** - * 1. Let node be iterator’s reference. - * 2. Let beforeNode be iterator’s pointer before reference. - */ - let node = iterator._reference; - let beforeNode = iterator._pointerBeforeReference; - /** - * 3. While true: - */ - while (true) { - /** - * 3.1. Branch on direction: - */ - if (forward) { - /** - * - next - */ - if (!beforeNode) { - /** - * If beforeNode is false, then set node to the first node following - * node in iterator’s iterator collection. If there is no such node, - * then return null. - */ - const nextNode = (0, TreeAlgorithm_1.tree_getFollowingNode)(iterator._root, node); - if (nextNode) { - node = nextNode; - } - else { - return null; - } - } - else { - /** - * If beforeNode is true, then set it to false. - */ - beforeNode = false; - } - } - else { - /** - * - previous - */ - if (beforeNode) { - /** - * If beforeNode is true, then set node to the first node preceding - * node in iterator’s iterator collection. If there is no such node, - * then return null. - */ - const prevNode = (0, TreeAlgorithm_1.tree_getPrecedingNode)(iterator.root, node); - if (prevNode) { - node = prevNode; - } - else { - return null; - } - } - else { - /** - * If beforeNode is false, then set it to true. - */ - beforeNode = true; - } - } - /** - * 3.2. Let result be the result of filtering node within iterator. - * 3.3. If result is FILTER_ACCEPT, then break. - */ - const result = (0, TraversalAlgorithm_1.traversal_filter)(iterator, node); - if (result === interfaces_1.FilterResult.Accept) { - break; - } - } - /** - * 4. Set iterator’s reference to node. - * 5. Set iterator’s pointer before reference to beforeNode. - * 6. Return node. - */ - iterator._reference = node; - iterator._pointerBeforeReference = beforeNode; - return node; -} -/** - * Gets the global iterator list. - */ -function nodeIterator_iteratorList() { - return DOMImpl_1.dom.window._iteratorList; + +const SemVer = __nccwpck_require__(7163) +const compareBuild = (a, b, loose) => { + const versionA = new SemVer(a, loose) + const versionB = new SemVer(b, loose) + return versionA.compare(versionB) || versionA.compareBuild(versionB) } -//# sourceMappingURL=NodeIteratorAlgorithm.js.map +module.exports = compareBuild + /***/ }), -/***/ 8421: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 6874: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.orderedSet_parse = orderedSet_parse; -exports.orderedSet_serialize = orderedSet_serialize; -exports.orderedSet_sanitize = orderedSet_sanitize; -exports.orderedSet_contains = orderedSet_contains; -const infra_1 = __nccwpck_require__(4737); -/** - * Converts a whitespace separated string into an array of tokens. - * - * @param value - a string of whitespace separated tokens - */ -function orderedSet_parse(value) { - /** - * 1. Let inputTokens be the result of splitting input on ASCII whitespace. - * 2. Let tokens be a new ordered set. - * 3. For each token in inputTokens, append token to tokens. - * 4. Return tokens. - */ - const inputTokens = infra_1.string.splitAStringOnASCIIWhitespace(value); - return new Set(inputTokens); -} -/** - * Converts an array of tokens into a space separated string. - * - * @param tokens - an array of token strings - */ -function orderedSet_serialize(tokens) { - /** - * The ordered set serializer takes a set and returns the concatenation of - * set using U+0020 SPACE. - */ - return [...tokens].join(' '); -} -/** - * Removes duplicate tokens and convert all whitespace characters - * to space. - * - * @param value - a string of whitespace separated tokens - */ -function orderedSet_sanitize(value) { - return orderedSet_serialize(orderedSet_parse(value)); -} -/** - * Determines whether a set contains the other. - * - * @param set1 - a set - * @param set1 - a set that is contained in set1 - * @param caseSensitive - whether matches are case-sensitive - */ -function orderedSet_contains(set1, set2, caseSensitive) { - for (const val2 of set2) { - let found = false; - for (const val1 of set1) { - if (caseSensitive) { - if (val1 === val2) { - found = true; - break; - } - } - else { - if (val1.toUpperCase() === val2.toUpperCase()) { - found = true; - break; - } - } - } - if (!found) - return false; - } - return true; -} -//# sourceMappingURL=OrderedSetAlgorithm.js.map + +const compare = __nccwpck_require__(8469) +const compareLoose = (a, b) => compare(a, b, true) +module.exports = compareLoose + /***/ }), -/***/ 9892: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 8469: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.parentNode_convertNodesIntoANode = parentNode_convertNodesIntoANode; -const util_1 = __nccwpck_require__(7061); -const CreateAlgorithm_1 = __nccwpck_require__(8308); -/** - * Converts the given nodes or strings into a node (if `nodes` has - * only one element) or a document fragment. - * - * @param nodes - the array of nodes or strings, - * @param document - owner document - */ -function parentNode_convertNodesIntoANode(nodes, document) { - /** - * 1. Let node be null. - * 2. Replace each string in nodes with a new Text node whose data is the - * string and node document is document. - */ - let node = null; - for (let i = 0; i < nodes.length; i++) { - const item = nodes[i]; - if ((0, util_1.isString)(item)) { - const text = (0, CreateAlgorithm_1.create_text)(document, item); - nodes[i] = text; - } - } - /** - * 3. If nodes contains one node, set node to that node. - * 4. Otherwise, set node to a new DocumentFragment whose node document is - * document, and then append each node in nodes, if any, to it. - */ - if (nodes.length === 1) { - node = nodes[0]; - } - else { - node = (0, CreateAlgorithm_1.create_documentFragment)(document); - const ns = node; - for (const item of nodes) { - ns.appendChild(item); - } - } - /** - * 5. Return node. - */ - return node; -} -//# sourceMappingURL=ParentNodeAlgorithm.js.map + +const SemVer = __nccwpck_require__(7163) +const compare = (a, b, loose) => + new SemVer(a, loose).compare(new SemVer(b, loose)) + +module.exports = compare + /***/ }), -/***/ 6687: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 711: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.range_collapsed = range_collapsed; -exports.range_root = range_root; -exports.range_isContained = range_isContained; -exports.range_isPartiallyContained = range_isPartiallyContained; -exports.range_setTheStart = range_setTheStart; -exports.range_setTheEnd = range_setTheEnd; -exports.range_select = range_select; -exports.range_extract = range_extract; -exports.range_cloneTheContents = range_cloneTheContents; -exports.range_insert = range_insert; -exports.range_getContainedNodes = range_getContainedNodes; -exports.range_getPartiallyContainedNodes = range_getPartiallyContainedNodes; -const interfaces_1 = __nccwpck_require__(9454); -const DOMException_1 = __nccwpck_require__(7175); -const util_1 = __nccwpck_require__(8247); -const CreateAlgorithm_1 = __nccwpck_require__(8308); -const TreeAlgorithm_1 = __nccwpck_require__(3532); -const BoundaryPointAlgorithm_1 = __nccwpck_require__(8652); -const CharacterDataAlgorithm_1 = __nccwpck_require__(7785); -const NodeAlgorithm_1 = __nccwpck_require__(1228); -const MutationAlgorithm_1 = __nccwpck_require__(45); -const TextAlgorithm_1 = __nccwpck_require__(3813); -/** - * Determines if the node's start boundary point is at its end boundary - * point. - * - * @param range - a range - */ -function range_collapsed(range) { - /** - * A range is collapsed if its start node is its end node and its start offset is its end offset. - */ - return (range._startNode === range._endNode && range._startOffset === range._endOffset); -} -/** - * Gets the root node of a range. - * - * @param range - a range - */ -function range_root(range) { - /** - * The root of a live range is the root of its start node. - */ - return (0, TreeAlgorithm_1.tree_rootNode)(range._startNode); -} -/** - * Determines if a node is fully contained in a range. - * - * @param node - a node - * @param range - a range - */ -function range_isContained(node, range) { - /** - * A node node is contained in a live range range if node’s root is range’s - * root, and (node, 0) is after range’s start, and (node, node’s length) is - * before range’s end. - */ - return ((0, TreeAlgorithm_1.tree_rootNode)(node) === range_root(range) && - (0, BoundaryPointAlgorithm_1.boundaryPoint_position)([node, 0], range._start) === interfaces_1.BoundaryPosition.After && - (0, BoundaryPointAlgorithm_1.boundaryPoint_position)([node, (0, TreeAlgorithm_1.tree_nodeLength)(node)], range._end) === interfaces_1.BoundaryPosition.Before); -} -/** - * Determines if a node is partially contained in a range. - * - * @param node - a node - * @param range - a range - */ -function range_isPartiallyContained(node, range) { - /** - * A node is partially contained in a live range if it’s an inclusive - * ancestor of the live range’s start node but not its end node, - * or vice versa. - */ - const startCheck = (0, TreeAlgorithm_1.tree_isAncestorOf)(range._startNode, node, true); - const endCheck = (0, TreeAlgorithm_1.tree_isAncestorOf)(range._endNode, node, true); - return (startCheck && !endCheck) || (!startCheck && endCheck); -} -/** - * Sets the start boundary point of a range. - * - * @param range - a range - * @param node - a node - * @param offset - an offset into node - */ -function range_setTheStart(range, node, offset) { - /** - * 1. If node is a doctype, then throw an "InvalidNodeTypeError" DOMException. - * 2. If offset is greater than node’s length, then throw an "IndexSizeError" - * DOMException. - * 3. Let bp be the boundary point (node, offset). - * 4. If these steps were invoked as "set the start" - * 4.1. If bp is after the range’s end, or if range’s root is not equal to - * node’s root, set range’s end to bp. - * 4.2. Set range’s start to bp. - */ - if (util_1.Guard.isDocumentTypeNode(node)) { - throw new DOMException_1.InvalidNodeTypeError(); - } - if (offset > (0, TreeAlgorithm_1.tree_nodeLength)(node)) { - throw new DOMException_1.IndexSizeError(); - } - const bp = [node, offset]; - if (range_root(range) !== (0, TreeAlgorithm_1.tree_rootNode)(node) || - (0, BoundaryPointAlgorithm_1.boundaryPoint_position)(bp, range._end) === interfaces_1.BoundaryPosition.After) { - range._end = bp; - } - range._start = bp; -} -/** - * Sets the end boundary point of a range. - * - * @param range - a range - * @param node - a node - * @param offset - an offset into node - */ -function range_setTheEnd(range, node, offset) { - /** - * 1. If node is a doctype, then throw an "InvalidNodeTypeError" DOMException. - * 2. If offset is greater than node’s length, then throw an "IndexSizeError" - * DOMException. - * 3. Let bp be the boundary point (node, offset). - * 4. If these steps were invoked as "set the end" - * 4.1. If bp is before the range’s start, or if range’s root is not equal - * to node’s root, set range’s start to bp. - * 4.2. Set range’s end to bp. - */ - if (util_1.Guard.isDocumentTypeNode(node)) { - throw new DOMException_1.InvalidNodeTypeError(); - } - if (offset > (0, TreeAlgorithm_1.tree_nodeLength)(node)) { - throw new DOMException_1.IndexSizeError(); + +const parse = __nccwpck_require__(6353) + +const diff = (version1, version2) => { + const v1 = parse(version1, null, true) + const v2 = parse(version2, null, true) + const comparison = v1.compare(v2) + + if (comparison === 0) { + return null + } + + const v1Higher = comparison > 0 + const highVersion = v1Higher ? v1 : v2 + const lowVersion = v1Higher ? v2 : v1 + const highHasPre = !!highVersion.prerelease.length + const lowHasPre = !!lowVersion.prerelease.length + + if (lowHasPre && !highHasPre) { + // Going from prerelease -> no prerelease requires some special casing + + // If the low version has only a major, then it will always be a major + // Some examples: + // 1.0.0-1 -> 1.0.0 + // 1.0.0-1 -> 1.1.1 + // 1.0.0-1 -> 2.0.0 + if (!lowVersion.patch && !lowVersion.minor) { + return 'major' } - const bp = [node, offset]; - if (range_root(range) !== (0, TreeAlgorithm_1.tree_rootNode)(node) || - (0, BoundaryPointAlgorithm_1.boundaryPoint_position)(bp, range._start) === interfaces_1.BoundaryPosition.Before) { - range._start = bp; + + // If the main part has no difference + if (lowVersion.compareMain(highVersion) === 0) { + if (lowVersion.minor && !lowVersion.patch) { + return 'minor' + } + return 'patch' } - range._end = bp; -} -/** - * Selects a node. - * - * @param range - a range - * @param node - a node - */ -function range_select(node, range) { - /** - * 1. Let parent be node’s parent. - * 2. If parent is null, then throw an "InvalidNodeTypeError" DOMException. - */ - const parent = node._parent; - if (parent === null) - throw new DOMException_1.InvalidNodeTypeError(); - /** - * 3. Let index be node’s index. - * 4. Set range’s start to boundary point (parent, index). - * 5. Set range’s end to boundary point (parent, index plus 1). - */ - const index = (0, TreeAlgorithm_1.tree_index)(node); - range._start = [parent, index]; - range._end = [parent, index + 1]; + } + + // add the `pre` prefix if we are going to a prerelease version + const prefix = highHasPre ? 'pre' : '' + + if (v1.major !== v2.major) { + return prefix + 'major' + } + + if (v1.minor !== v2.minor) { + return prefix + 'minor' + } + + if (v1.patch !== v2.patch) { + return prefix + 'patch' + } + + // high and low are prereleases + return 'prerelease' } -/** - * EXtracts the contents of range as a document fragment. - * - * @param range - a range - */ -function range_extract(range) { - /** - * 1. Let fragment be a new DocumentFragment node whose node document is - * range’s start node’s node document. - * 2. If range is collapsed, then return fragment. - */ - const fragment = (0, CreateAlgorithm_1.create_documentFragment)(range._startNode._nodeDocument); - if (range_collapsed(range)) - return fragment; - /** - * 3. Let original start node, original start offset, original end node, - * and original end offset be range’s start node, start offset, end node, - * and end offset, respectively. - */ - const originalStartNode = range._startNode; - const originalStartOffset = range._startOffset; - const originalEndNode = range._endNode; - const originalEndOffset = range._endOffset; - /** - * 4. If original start node is original end node, and they are a Text, - * ProcessingInstruction, or Comment node: - * 4.1. Let clone be a clone of original start node. - * 4.2. Set the data of clone to the result of substringing data with node - * original start node, offset original start offset, and count original end - * offset minus original start offset. - * 4.3. Append clone to fragment. - * 4.4. Replace data with node original start node, offset original start - * offset, count original end offset minus original start offset, and data - * the empty string. - * 4.5. Return fragment. - */ - if (originalStartNode === originalEndNode && - util_1.Guard.isCharacterDataNode(originalStartNode)) { - const clone = (0, NodeAlgorithm_1.node_clone)(originalStartNode); - clone._data = (0, CharacterDataAlgorithm_1.characterData_substringData)(originalStartNode, originalStartOffset, originalEndOffset - originalStartOffset); - (0, MutationAlgorithm_1.mutation_append)(clone, fragment); - (0, CharacterDataAlgorithm_1.characterData_replaceData)(originalStartNode, originalStartOffset, originalEndOffset - originalStartOffset, ''); - return fragment; - } - /** - * 5. Let common ancestor be original start node. - * 6. While common ancestor is not an inclusive ancestor of original end - * node, set common ancestor to its own parent. - */ - let commonAncestor = originalStartNode; - while (!(0, TreeAlgorithm_1.tree_isAncestorOf)(originalEndNode, commonAncestor, true)) { - if (commonAncestor._parent === null) { - throw new Error("Parent node is null."); - } - commonAncestor = commonAncestor._parent; - } - /** - * 7. Let first partially contained child be null. - * 8. If original start node is not an inclusive ancestor of original end - * node, set first partially contained child to the first child of common - * ancestor that is partially contained in range. - */ - let firstPartiallyContainedChild = null; - if (!(0, TreeAlgorithm_1.tree_isAncestorOf)(originalEndNode, originalStartNode, true)) { - for (const node of commonAncestor._children) { - if (range_isPartiallyContained(node, range)) { - firstPartiallyContainedChild = node; - break; - } - } - } - /** - * 9. Let last partially contained child be null. - * 10. If original end node is not an inclusive ancestor of original start - * node, set last partially contained child to the last child of common - * ancestor that is partially contained in range. - */ - let lastPartiallyContainedChild = null; - if (!(0, TreeAlgorithm_1.tree_isAncestorOf)(originalStartNode, originalEndNode, true)) { - const children = [...commonAncestor._children]; - for (let i = children.length - 1; i > 0; i--) { - const node = children[i]; - if (range_isPartiallyContained(node, range)) { - lastPartiallyContainedChild = node; - break; - } - } - } - /** - * 11. Let contained children be a list of all children of common ancestor - * that are contained in range, in tree order. - * 12. If any member of contained children is a doctype, then throw a - * "HierarchyRequestError" DOMException. - */ - const containedChildren = []; - for (const child of commonAncestor._children) { - if (range_isContained(child, range)) { - if (util_1.Guard.isDocumentTypeNode(child)) { - throw new DOMException_1.HierarchyRequestError(); - } - containedChildren.push(child); - } - } - let newNode; - let newOffset; - if ((0, TreeAlgorithm_1.tree_isAncestorOf)(originalEndNode, originalStartNode, true)) { - /** - * 13. If original start node is an inclusive ancestor of original end node, - * set new node to original start node and new offset to original start - * offset. - */ - newNode = originalStartNode; - newOffset = originalStartOffset; - } - else { - /** - * 14. Otherwise: - * 14.1. Let reference node equal original start node. - * 14.2. While reference node’s parent is not null and is not an inclusive - * ancestor of original end node, set reference node to its parent. - * 14.3. Set new node to the parent of reference node, and new offset to - * one plus reference node’s index. - */ - let referenceNode = originalStartNode; - while (referenceNode._parent !== null && - !(0, TreeAlgorithm_1.tree_isAncestorOf)(originalEndNode, referenceNode._parent)) { - referenceNode = referenceNode._parent; - } - /* istanbul ignore next */ - if (referenceNode._parent === null) { - /** - * If reference node’s parent is null, it would be the root of range, - * so would be an inclusive ancestor of original end node, and we could - * not reach this point. - */ - throw new Error("Parent node is null."); - } - newNode = referenceNode._parent; - newOffset = 1 + (0, TreeAlgorithm_1.tree_index)(referenceNode); - } - if (util_1.Guard.isCharacterDataNode(firstPartiallyContainedChild)) { - /** - * 15. If first partially contained child is a Text, ProcessingInstruction, - * or Comment node: - * 15.1. Let clone be a clone of original start node. - * 15.2. Set the data of clone to the result of substringing data with - * node original start node, offset original start offset, and count - * original start node’s length minus original start offset. - * 15.3. Append clone to fragment. - * 15.4. Replace data with node original start node, offset original - * start offset, count original start node’s length minus original start - * offset, and data the empty string. - */ - const clone = (0, NodeAlgorithm_1.node_clone)(originalStartNode); - clone._data = (0, CharacterDataAlgorithm_1.characterData_substringData)(originalStartNode, originalStartOffset, (0, TreeAlgorithm_1.tree_nodeLength)(originalStartNode) - originalStartOffset); - (0, MutationAlgorithm_1.mutation_append)(clone, fragment); - (0, CharacterDataAlgorithm_1.characterData_replaceData)(originalStartNode, originalStartOffset, (0, TreeAlgorithm_1.tree_nodeLength)(originalStartNode) - originalStartOffset, ''); - } - else if (firstPartiallyContainedChild !== null) { - /** - * 16. Otherwise, if first partially contained child is not null: - * 16.1. Let clone be a clone of first partially contained child. - * 16.2. Append clone to fragment. - * 16.3. Let subrange be a new live range whose start is (original start - * node, original start offset) and whose end is (first partially - * contained child, first partially contained child’s length). - * 16.4. Let subfragment be the result of extracting subrange. - * 16.5. Append subfragment to clone. - */ - const clone = (0, NodeAlgorithm_1.node_clone)(firstPartiallyContainedChild); - (0, MutationAlgorithm_1.mutation_append)(clone, fragment); - const subrange = (0, CreateAlgorithm_1.create_range)([originalStartNode, originalStartOffset], [firstPartiallyContainedChild, (0, TreeAlgorithm_1.tree_nodeLength)(firstPartiallyContainedChild)]); - const subfragment = range_extract(subrange); - (0, MutationAlgorithm_1.mutation_append)(subfragment, clone); - } - /** - * 17. For each contained child in contained children, append contained - * child to fragment. - */ - for (const child of containedChildren) { - (0, MutationAlgorithm_1.mutation_append)(child, fragment); - } - if (util_1.Guard.isCharacterDataNode(lastPartiallyContainedChild)) { - /** - * 18. If last partially contained child is a Text, ProcessingInstruction, - * or Comment node: - * 18.1. Let clone be a clone of original end node. - * 18.2. Set the data of clone to the result of substringing data with - * node original end node, offset 0, and count original end offset. - * 18.3. Append clone to fragment. - * 18.4. Replace data with node original end node, offset 0, count - * original end offset, and data the empty string. - */ - const clone = (0, NodeAlgorithm_1.node_clone)(originalEndNode); - clone._data = (0, CharacterDataAlgorithm_1.characterData_substringData)(originalEndNode, 0, originalEndOffset); - (0, MutationAlgorithm_1.mutation_append)(clone, fragment); - (0, CharacterDataAlgorithm_1.characterData_replaceData)(originalEndNode, 0, originalEndOffset, ''); - } - else if (lastPartiallyContainedChild !== null) { - /** - * 19. Otherwise, if last partially contained child is not null: - * 19.1. Let clone be a clone of last partially contained child. - * 19.2. Append clone to fragment. - * 19.3. Let subrange be a new live range whose start is (last partially - * contained child, 0) and whose end is (original end node, original - * end offset). - * 19.4. Let subfragment be the result of extracting subrange. - * 19.5. Append subfragment to clone. - */ - const clone = (0, NodeAlgorithm_1.node_clone)(lastPartiallyContainedChild); - (0, MutationAlgorithm_1.mutation_append)(clone, fragment); - const subrange = (0, CreateAlgorithm_1.create_range)([lastPartiallyContainedChild, 0], [originalEndNode, originalEndOffset]); - const subfragment = range_extract(subrange); - (0, MutationAlgorithm_1.mutation_append)(subfragment, clone); - } - /** - * 20. Set range’s start and end to (new node, new offset). - */ - range._start = [newNode, newOffset]; - range._end = [newNode, newOffset]; - /** - * 21. Return fragment. - */ - return fragment; -} -/** - * Clones the contents of range as a document fragment. - * - * @param range - a range - */ -function range_cloneTheContents(range) { - /** - * 1. Let fragment be a new DocumentFragment node whose node document - * is range’s start node’s node document. - * 2. If range is collapsed, then return fragment. - */ - const fragment = (0, CreateAlgorithm_1.create_documentFragment)(range._startNode._nodeDocument); - if (range_collapsed(range)) - return fragment; - /** - * 3. Let original start node, original start offset, original end node, - * and original end offset be range’s start node, start offset, end node, - * and end offset, respectively. - * 4. If original start node is original end node, and they are a Text, - * ProcessingInstruction, or Comment node: - * 4.1. Let clone be a clone of original start node. - * 4.2. Set the data of clone to the result of substringing data with node - * original start node, offset original start offset, and count original end - * offset minus original start offset. - * 4.3. Append clone to fragment. - * 4.5. Return fragment. - */ - const originalStartNode = range._startNode; - const originalStartOffset = range._startOffset; - const originalEndNode = range._endNode; - const originalEndOffset = range._endOffset; - if (originalStartNode === originalEndNode && - util_1.Guard.isCharacterDataNode(originalStartNode)) { - const clone = (0, NodeAlgorithm_1.node_clone)(originalStartNode); - clone._data = (0, CharacterDataAlgorithm_1.characterData_substringData)(originalStartNode, originalStartOffset, originalEndOffset - originalStartOffset); - (0, MutationAlgorithm_1.mutation_append)(clone, fragment); - } - /** - * 5. Let common ancestor be original start node. - * 6. While common ancestor is not an inclusive ancestor of original end - * node, set common ancestor to its own parent. - */ - let commonAncestor = originalStartNode; - while (!(0, TreeAlgorithm_1.tree_isAncestorOf)(originalEndNode, commonAncestor, true)) { - if (commonAncestor._parent === null) { - throw new Error("Parent node is null."); - } - commonAncestor = commonAncestor._parent; - } - /** - * 7. Let first partially contained child be null. - * 8. If original start node is not an inclusive ancestor of original end - * node, set first partially contained child to the first child of common - * ancestor that is partially contained in range. - */ - let firstPartiallyContainedChild = null; - if (!(0, TreeAlgorithm_1.tree_isAncestorOf)(originalEndNode, originalStartNode, true)) { - for (const node of commonAncestor._children) { - if (range_isPartiallyContained(node, range)) { - firstPartiallyContainedChild = node; - break; - } - } - } - /** - * 9. Let last partially contained child be null. - * 10. If original end node is not an inclusive ancestor of original start - * node, set last partially contained child to the last child of common - * ancestor that is partially contained in range. - */ - let lastPartiallyContainedChild = null; - if (!(0, TreeAlgorithm_1.tree_isAncestorOf)(originalStartNode, originalEndNode, true)) { - const children = [...commonAncestor._children]; - for (let i = children.length - 1; i > 0; i--) { - const node = children[i]; - if (range_isPartiallyContained(node, range)) { - lastPartiallyContainedChild = node; - break; - } - } - } - /** - * 11. Let contained children be a list of all children of common ancestor - * that are contained in range, in tree order. - * 12. If any member of contained children is a doctype, then throw a - * "HierarchyRequestError" DOMException. - */ - const containedChildren = []; - for (const child of commonAncestor._children) { - if (range_isContained(child, range)) { - if (util_1.Guard.isDocumentTypeNode(child)) { - throw new DOMException_1.HierarchyRequestError(); - } - containedChildren.push(child); - } - } - if (util_1.Guard.isCharacterDataNode(firstPartiallyContainedChild)) { - /** - * 13. If first partially contained child is a Text, ProcessingInstruction, - * or Comment node: - * 13.1. Let clone be a clone of original start node. - * 13.2. Set the data of clone to the result of substringing data with - * node original start node, offset original start offset, and count - * original start node’s length minus original start offset. - * 13.3. Append clone to fragment. - */ - const clone = (0, NodeAlgorithm_1.node_clone)(originalStartNode); - clone._data = (0, CharacterDataAlgorithm_1.characterData_substringData)(originalStartNode, originalStartOffset, (0, TreeAlgorithm_1.tree_nodeLength)(originalStartNode) - originalStartOffset); - (0, MutationAlgorithm_1.mutation_append)(clone, fragment); - } - else if (firstPartiallyContainedChild !== null) { - /** - * 14. Otherwise, if first partially contained child is not null: - * 14.1. Let clone be a clone of first partially contained child. - * 14.2. Append clone to fragment. - * 14.3. Let subrange be a new live range whose start is (original start - * node, original start offset) and whose end is (first partially - * contained child, first partially contained child’s length). - * 14.4. Let subfragment be the result of cloning the contents of - * subrange. - * 14.5. Append subfragment to clone. - */ - const clone = (0, NodeAlgorithm_1.node_clone)(firstPartiallyContainedChild); - (0, MutationAlgorithm_1.mutation_append)(clone, fragment); - const subrange = (0, CreateAlgorithm_1.create_range)([originalStartNode, originalStartOffset], [firstPartiallyContainedChild, (0, TreeAlgorithm_1.tree_nodeLength)(firstPartiallyContainedChild)]); - const subfragment = range_cloneTheContents(subrange); - (0, MutationAlgorithm_1.mutation_append)(subfragment, clone); - } - /** - * 15. For each contained child in contained children, append contained - * child to fragment. - * 15.1. Let clone be a clone of contained child with the clone children - * flag set. - * 15.2. Append clone to fragment. - */ - for (const child of containedChildren) { - const clone = (0, NodeAlgorithm_1.node_clone)(child); - (0, MutationAlgorithm_1.mutation_append)(clone, fragment); - } - if (util_1.Guard.isCharacterDataNode(lastPartiallyContainedChild)) { - /** - * 16. If last partially contained child is a Text, ProcessingInstruction, - * or Comment node: - * 16.1. Let clone be a clone of original end node. - * 16.2. Set the data of clone to the result of substringing data with - * node original end node, offset 0, and count original end offset. - * 16.3. Append clone to fragment. - */ - const clone = (0, NodeAlgorithm_1.node_clone)(originalEndNode); - clone._data = (0, CharacterDataAlgorithm_1.characterData_substringData)(originalEndNode, 0, originalEndOffset); - (0, MutationAlgorithm_1.mutation_append)(clone, fragment); - } - else if (lastPartiallyContainedChild !== null) { - /** - * 17. Otherwise, if last partially contained child is not null: - * 17.1. Let clone be a clone of last partially contained child. - * 17.2. Append clone to fragment. - * 17.3. Let subrange be a new live range whose start is (last partially - * contained child, 0) and whose end is (original end node, original - * end offset). - * 17.4. Let subfragment be the result of cloning the contents of subrange. - * 17.5. Append subfragment to clone. - */ - const clone = (0, NodeAlgorithm_1.node_clone)(lastPartiallyContainedChild); - fragment.append(clone); - const subrange = (0, CreateAlgorithm_1.create_range)([lastPartiallyContainedChild, 0], [originalEndNode, originalEndOffset]); - const subfragment = range_extract(subrange); - (0, MutationAlgorithm_1.mutation_append)(subfragment, clone); - } - /** - * 18. Return fragment. - */ - return fragment; -} -/** - * Inserts a node into a range at the start boundary point. - * - * @param node - node to insert - * @param range - a range - */ -function range_insert(node, range) { - /** - * 1. If range’s start node is a ProcessingInstruction or Comment node, is a - * Text node whose parent is null, or is node, then throw a - * "HierarchyRequestError" DOMException. - */ - if (util_1.Guard.isProcessingInstructionNode(range._startNode) || - util_1.Guard.isCommentNode(range._startNode) || - (util_1.Guard.isTextNode(range._startNode) && range._startNode._parent === null) || - range._startNode === node) { - throw new DOMException_1.HierarchyRequestError(); - } - /** - * 2. Let referenceNode be null. - * 3. If range’s start node is a Text node, set referenceNode to that Text - * node. - * 4. Otherwise, set referenceNode to the child of start node whose index is - * start offset, and null if there is no such child. - */ - let referenceNode = null; - if (util_1.Guard.isTextNode(range._startNode)) { - referenceNode = range._startNode; - } - else { - let index = 0; - for (const child of range._startNode._children) { - if (index === range._startOffset) { - referenceNode = child; - break; - } - index++; - } - } - /** - * 5. Let parent be range’s start node if referenceNode is null, and - * referenceNode’s parent otherwise. - */ - let parent; - if (referenceNode === null) { - parent = range._startNode; - } - else { - if (referenceNode._parent === null) { - throw new Error("Parent node is null."); - } - parent = referenceNode._parent; - } - /** - * 6. Ensure pre-insertion validity of node into parent before referenceNode. - */ - (0, MutationAlgorithm_1.mutation_ensurePreInsertionValidity)(node, parent, referenceNode); - /** - * 7. If range’s start node is a Text node, set referenceNode to the result - * of splitting it with offset range’s start offset. - */ - if (util_1.Guard.isTextNode(range._startNode)) { - referenceNode = (0, TextAlgorithm_1.text_split)(range._startNode, range._startOffset); - } - /** - * 8. If node is referenceNode, set referenceNode to its next sibling. - */ - if (node === referenceNode) { - referenceNode = node._nextSibling; - } - /** - * 9. If node’s parent is not null, remove node from its parent. - */ - if (node._parent !== null) { - (0, MutationAlgorithm_1.mutation_remove)(node, node._parent); - } - /** - * 10. Let newOffset be parent’s length if referenceNode is null, and - * referenceNode’s index otherwise. - */ - let newOffset = (referenceNode === null ? - (0, TreeAlgorithm_1.tree_nodeLength)(parent) : (0, TreeAlgorithm_1.tree_index)(referenceNode)); - /** - * 11. Increase newOffset by node’s length if node is a DocumentFragment - * node, and one otherwise. - */ - if (util_1.Guard.isDocumentFragmentNode(node)) { - newOffset += (0, TreeAlgorithm_1.tree_nodeLength)(node); - } - else { - newOffset++; - } - /** - * 12. Pre-insert node into parent before referenceNode. - */ - (0, MutationAlgorithm_1.mutation_preInsert)(node, parent, referenceNode); - /** - * 13. If range is collapsed, then set range’s end to (parent, newOffset). - */ - if (range_collapsed(range)) { - range._end = [parent, newOffset]; - } -} -/** - * Traverses through all contained nodes of a range. - * - * @param range - a range - */ -function range_getContainedNodes(range) { - return { - [Symbol.iterator]: () => { - const container = range.commonAncestorContainer; - let currentNode = (0, TreeAlgorithm_1.tree_getFirstDescendantNode)(container); - return { - next: () => { - while (currentNode && !range_isContained(currentNode, range)) { - currentNode = (0, TreeAlgorithm_1.tree_getNextDescendantNode)(container, currentNode); - } - if (currentNode === null) { - return { done: true, value: null }; - } - else { - const result = { done: false, value: currentNode }; - currentNode = (0, TreeAlgorithm_1.tree_getNextDescendantNode)(container, currentNode); - return result; - } - } - }; - } - }; -} -/** - * Traverses through all partially contained nodes of a range. - * - * @param range - a range - */ -function range_getPartiallyContainedNodes(range) { - return { - [Symbol.iterator]: () => { - const container = range.commonAncestorContainer; - let currentNode = (0, TreeAlgorithm_1.tree_getFirstDescendantNode)(container); - return { - next: () => { - while (currentNode && !range_isPartiallyContained(currentNode, range)) { - currentNode = (0, TreeAlgorithm_1.tree_getNextDescendantNode)(container, currentNode); - } - if (currentNode === null) { - return { done: true, value: null }; - } - else { - const result = { done: false, value: currentNode }; - currentNode = (0, TreeAlgorithm_1.tree_getNextDescendantNode)(container, currentNode); - return result; - } - } - }; - } - }; -} -//# sourceMappingURL=RangeAlgorithm.js.map + +module.exports = diff + /***/ }), -/***/ 3886: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 5082: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.selectors_scopeMatchASelectorsString = selectors_scopeMatchASelectorsString; -const DOMException_1 = __nccwpck_require__(7175); -/** - * Matches elements with the given selectors. - * - * @param selectors - selectors - * @param node - the node to match against - */ -function selectors_scopeMatchASelectorsString(selectors, node) { - /** - * TODO: Selectors - * 1. Let s be the result of parse a selector selectors. [SELECTORS4] - * 2. If s is failure, then throw a "SyntaxError" DOMException. - * 3. Return the result of match a selector against a tree with s and node’s - * root using scoping root node. [SELECTORS4]. - */ - throw new DOMException_1.NotSupportedError(); -} -//# sourceMappingURL=SelectorsAlgorithm.js.map + +const compare = __nccwpck_require__(8469) +const eq = (a, b, loose) => compare(a, b, loose) === 0 +module.exports = eq + /***/ }), -/***/ 708: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 6599: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.shadowTree_signalASlotChange = shadowTree_signalASlotChange; -exports.shadowTree_isConnected = shadowTree_isConnected; -exports.shadowTree_isAssigned = shadowTree_isAssigned; -exports.shadowTree_findASlot = shadowTree_findASlot; -exports.shadowTree_findSlotables = shadowTree_findSlotables; -exports.shadowTree_findFlattenedSlotables = shadowTree_findFlattenedSlotables; -exports.shadowTree_assignSlotables = shadowTree_assignSlotables; -exports.shadowTree_assignSlotablesForATree = shadowTree_assignSlotablesForATree; -exports.shadowTree_assignASlot = shadowTree_assignASlot; -const DOMImpl_1 = __nccwpck_require__(698); -const util_1 = __nccwpck_require__(8247); -const util_2 = __nccwpck_require__(7061); -const TreeAlgorithm_1 = __nccwpck_require__(3532); -const MutationObserverAlgorithm_1 = __nccwpck_require__(3243); -/** - * Signals a slot change to the given slot. - * - * @param slot - a slot - */ -function shadowTree_signalASlotChange(slot) { - /** - * 1. Append slot to slot’s relevant agent’s signal slots. - * 2. Queue a mutation observer microtask. - */ - const window = DOMImpl_1.dom.window; - window._signalSlots.add(slot); - (0, MutationObserverAlgorithm_1.observer_queueAMutationObserverMicrotask)(); -} -/** - * Determines whether a the shadow tree of the given element node is - * connected to a document node. - * - * @param element - an element node of the shadow tree - */ -function shadowTree_isConnected(element) { - /** - * An element is connected if its shadow-including root is a document. - */ - return util_1.Guard.isDocumentNode((0, TreeAlgorithm_1.tree_rootNode)(element, true)); -} -/** - * Determines whether a slotable is assigned. - * - * @param slotable - a slotable - */ -function shadowTree_isAssigned(slotable) { - /** - * A slotable is assigned if its assigned slot is non-null. - */ - return (slotable._assignedSlot !== null); -} -/** - * Finds a slot for the given slotable. - * - * @param slotable - a slotable - * @param openFlag - `true` to search open shadow tree's only - */ -function shadowTree_findASlot(slotable, openFlag = false) { - /** - * 1. If slotable’s parent is null, then return null. - * 2. Let shadow be slotable’s parent’s shadow root. - * 3. If shadow is null, then return null. - * 4. If the open flag is set and shadow’s mode is not "open", then - * return null. - * 5. Return the first slot in tree order in shadow’s descendants whose name - * is slotable’s name, if any, and null otherwise. - */ - const node = util_1.Cast.asNode(slotable); - const parent = node._parent; - if (parent === null) - return null; - const shadow = parent._shadowRoot || null; - if (shadow === null) - return null; - if (openFlag && shadow._mode !== "open") - return null; - let child = (0, TreeAlgorithm_1.tree_getFirstDescendantNode)(shadow, false, true, (e) => util_1.Guard.isSlot(e)); - while (child !== null) { - if (child._name === slotable._name) - return child; - child = (0, TreeAlgorithm_1.tree_getNextDescendantNode)(shadow, child, false, true, (e) => util_1.Guard.isSlot(e)); - } - return null; -} -/** - * Finds slotables for the given slot. - * - * @param slot - a slot - */ -function shadowTree_findSlotables(slot) { - /** - * 1. Let result be an empty list. - * 2. If slot’s root is not a shadow root, then return result. - */ - const result = []; - const root = (0, TreeAlgorithm_1.tree_rootNode)(slot); - if (!util_1.Guard.isShadowRoot(root)) - return result; - /** - * 3. Let host be slot’s root’s host. - * 4. For each slotable child of host, slotable, in tree order: - */ - const host = root._host; - for (const slotable of host._children) { - if (util_1.Guard.isSlotable(slotable)) { - /** - * 4.1. Let foundSlot be the result of finding a slot given slotable. - * 4.2. If foundSlot is slot, then append slotable to result. - */ - const foundSlot = shadowTree_findASlot(slotable); - if (foundSlot === slot) { - result.push(slotable); - } - } - } - /** - * 5. Return result. - */ - return result; -} -/** - * Finds slotables for the given slot. - * - * @param slot - a slot - */ -function shadowTree_findFlattenedSlotables(slot) { - /** - * 1. Let result be an empty list. - * 2. If slot’s root is not a shadow root, then return result. - */ - const result = []; - const root = (0, TreeAlgorithm_1.tree_rootNode)(slot); - if (!util_1.Guard.isShadowRoot(root)) - return result; - /** - * 3. Let slotables be the result of finding slotables given slot. - * 4. If slotables is the empty list, then append each slotable child of - * slot, in tree order, to slotables. - */ - const slotables = shadowTree_findSlotables(slot); - if ((0, util_2.isEmpty)(slotables)) { - for (const slotable of slot._children) { - if (util_1.Guard.isSlotable(slotable)) { - slotables.push(slotable); - } - } - } - /** - * 5. For each node in slotables: - */ - for (const node of slotables) { - /** - * 5.1. If node is a slot whose root is a shadow root, then: - */ - if (util_1.Guard.isSlot(node) && util_1.Guard.isShadowRoot((0, TreeAlgorithm_1.tree_rootNode)(node))) { - /** - * 5.1.1. Let temporaryResult be the result of finding flattened slotables given node. - * 5.1.2. Append each slotable in temporaryResult, in order, to result. - */ - const temporaryResult = shadowTree_findFlattenedSlotables(node); - result.push(...temporaryResult); - } - else { - /** - * 5.2. Otherwise, append node to result. - */ - result.push(node); - } - } - /** - * 6. Return result. - */ - return result; -} -/** - * Assigns slotables to the given slot. - * - * @param slot - a slot - */ -function shadowTree_assignSlotables(slot) { - /** - * 1. Let slotables be the result of finding slotables for slot. - * 2. If slotables and slot’s assigned nodes are not identical, then run - * signal a slot change for slot. - */ - const slotables = shadowTree_findSlotables(slot); - if (slotables.length === slot._assignedNodes.length) { - let nodesIdentical = true; - for (let i = 0; i < slotables.length; i++) { - if (slotables[i] !== slot._assignedNodes[i]) { - nodesIdentical = false; - break; - } - } - if (!nodesIdentical) { - shadowTree_signalASlotChange(slot); - } - } - /** - * 3. Set slot’s assigned nodes to slotables. - * 4. For each slotable in slotables, set slotable’s assigned slot to slot. - */ - slot._assignedNodes = slotables; - for (const slotable of slotables) { - slotable._assignedSlot = slot; - } -} -/** - * Assigns slotables to all nodes of a tree. - * - * @param root - root node - */ -function shadowTree_assignSlotablesForATree(root) { - /** - * To assign slotables for a tree, given a node root, run assign slotables - * for each slot slot in root’s inclusive descendants, in tree order. - */ - let descendant = (0, TreeAlgorithm_1.tree_getFirstDescendantNode)(root, true, false, (e) => util_1.Guard.isSlot(e)); - while (descendant !== null) { - shadowTree_assignSlotables(descendant); - descendant = (0, TreeAlgorithm_1.tree_getNextDescendantNode)(root, descendant, true, false, (e) => util_1.Guard.isSlot(e)); - } -} -/** - * Assigns a slot to a slotables. - * - * @param slotable - a slotable - */ -function shadowTree_assignASlot(slotable) { - /** - * 1. Let slot be the result of finding a slot with slotable. - * 2. If slot is non-null, then run assign slotables for slot. - */ - const slot = shadowTree_findASlot(slotable); - if (slot !== null) { - shadowTree_assignSlotables(slot); - } -} -//# sourceMappingURL=ShadowTreeAlgorithm.js.map + +const compare = __nccwpck_require__(8469) +const gt = (a, b, loose) => compare(a, b, loose) > 0 +module.exports = gt + /***/ }), -/***/ 3813: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 1236: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.text_contiguousTextNodes = text_contiguousTextNodes; -exports.text_contiguousExclusiveTextNodes = text_contiguousExclusiveTextNodes; -exports.text_descendantTextContent = text_descendantTextContent; -exports.text_split = text_split; -const DOMImpl_1 = __nccwpck_require__(698); -const util_1 = __nccwpck_require__(8247); -const DOMException_1 = __nccwpck_require__(7175); -const CreateAlgorithm_1 = __nccwpck_require__(8308); -const TreeAlgorithm_1 = __nccwpck_require__(3532); -const CharacterDataAlgorithm_1 = __nccwpck_require__(7785); -const MutationAlgorithm_1 = __nccwpck_require__(45); -/** - * Returns node with its adjacent text and cdata node siblings. - * - * @param node - a node - * @param self - whether to include node itself - */ -function text_contiguousTextNodes(node, self = false) { - /** - * The contiguous Text nodes of a node node are node, node’s previous - * sibling Text node, if any, and its contiguous Text nodes, and node’s next - * sibling Text node, if any, and its contiguous Text nodes, avoiding any - * duplicates. - */ - return { - [Symbol.iterator]() { - let currentNode = node; - while (currentNode && util_1.Guard.isTextNode(currentNode._previousSibling)) { - currentNode = currentNode._previousSibling; - } - return { - next() { - if (currentNode && (!self && currentNode === node)) { - if (util_1.Guard.isTextNode(currentNode._nextSibling)) { - currentNode = currentNode._nextSibling; - } - else { - currentNode = null; - } - } - if (currentNode === null) { - return { done: true, value: null }; - } - else { - const result = { done: false, value: currentNode }; - if (util_1.Guard.isTextNode(currentNode._nextSibling)) { - currentNode = currentNode._nextSibling; - } - else { - currentNode = null; - } - return result; - } - } - }; - } - }; -} -/** - * Returns node with its adjacent text node siblings. - * - * @param node - a node - * @param self - whether to include node itself - */ -function text_contiguousExclusiveTextNodes(node, self = false) { - /** - * The contiguous exclusive Text nodes of a node node are node, node’s - * previous sibling exclusive Text node, if any, and its contiguous - * exclusive Text nodes, and node’s next sibling exclusive Text node, - * if any, and its contiguous exclusive Text nodes, avoiding any duplicates. - */ - return { - [Symbol.iterator]() { - let currentNode = node; - while (currentNode && util_1.Guard.isExclusiveTextNode(currentNode._previousSibling)) { - currentNode = currentNode._previousSibling; - } - return { - next() { - if (currentNode && (!self && currentNode === node)) { - if (util_1.Guard.isExclusiveTextNode(currentNode._nextSibling)) { - currentNode = currentNode._nextSibling; - } - else { - currentNode = null; - } - } - if (currentNode === null) { - return { done: true, value: null }; - } - else { - const result = { done: false, value: currentNode }; - if (util_1.Guard.isExclusiveTextNode(currentNode._nextSibling)) { - currentNode = currentNode._nextSibling; - } - else { - currentNode = null; - } - return result; - } - } - }; - } - }; -} -/** - * Returns the concatenation of the data of all the Text node descendants of - * node, in tree order. - * - * @param node - a node - */ -function text_descendantTextContent(node) { - /** - * The descendant text content of a node node is the concatenation of the - * data of all the Text node descendants of node, in tree order. - */ - let contents = ''; - let text = (0, TreeAlgorithm_1.tree_getFirstDescendantNode)(node, false, false, (e) => util_1.Guard.isTextNode(e)); - while (text !== null) { - contents += text._data; - text = (0, TreeAlgorithm_1.tree_getNextDescendantNode)(node, text, false, false, (e) => util_1.Guard.isTextNode(e)); - } - return contents; -} -/** - * Splits data at the given offset and returns the remainder as a text - * node. - * - * @param node - a text node - * @param offset - the offset at which to split the nodes. - */ -function text_split(node, offset) { - /** - * 1. Let length be node’s length. - * 2. If offset is greater than length, then throw an "IndexSizeError" - * DOMException. - */ - const length = node._data.length; - if (offset > length) { - throw new DOMException_1.IndexSizeError(); - } - /** - * 3. Let count be length minus offset. - * 4. Let new data be the result of substringing data with node node, - * offset offset, and count count. - * 5. Let new node be a new Text node, with the same node document as node. - * Set new node’s data to new data. - * 6. Let parent be node’s parent. - * 7. If parent is not null, then: - */ - const count = length - offset; - const newData = (0, CharacterDataAlgorithm_1.characterData_substringData)(node, offset, count); - const newNode = (0, CreateAlgorithm_1.create_text)(node._nodeDocument, newData); - const parent = node._parent; - if (parent !== null) { - /** - * 7.1. Insert new node into parent before node’s next sibling. - */ - (0, MutationAlgorithm_1.mutation_insert)(newNode, parent, node._nextSibling); - /** - * 7.2. For each live range whose start node is node and start offset is - * greater than offset, set its start node to new node and decrease its - * start offset by offset. - * 7.3. For each live range whose end node is node and end offset is greater - * than offset, set its end node to new node and decrease its end offset - * by offset. - * 7.4. For each live range whose start node is parent and start offset is - * equal to the index of node plus 1, increase its start offset by 1. - * 7.5. For each live range whose end node is parent and end offset is equal - * to the index of node plus 1, increase its end offset by 1. - */ - for (const range of DOMImpl_1.dom.rangeList) { - if (range._start[0] === node && range._start[1] > offset) { - range._start[0] = newNode; - range._start[1] -= offset; - } - if (range._end[0] === node && range._end[1] > offset) { - range._end[0] = newNode; - range._end[1] -= offset; - } - const index = (0, TreeAlgorithm_1.tree_index)(node); - if (range._start[0] === parent && range._start[1] === index + 1) { - range._start[1]++; - } - if (range._end[0] === parent && range._end[1] === index + 1) { - range._end[1]++; - } - } - } - /** - * 8. Replace data with node node, offset offset, count count, and data - * the empty string. - * 9. Return new node. - */ - (0, CharacterDataAlgorithm_1.characterData_replaceData)(node, offset, count, ''); - return newNode; -} -//# sourceMappingURL=TextAlgorithm.js.map + +const compare = __nccwpck_require__(8469) +const gte = (a, b, loose) => compare(a, b, loose) >= 0 +module.exports = gte + /***/ }), -/***/ 6746: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 2338: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.traversal_filter = traversal_filter; -const interfaces_1 = __nccwpck_require__(9454); -const DOMException_1 = __nccwpck_require__(7175); -/** - * Applies the filter to the given node and returns the result. - * - * @param traverser - the `NodeIterator` or `TreeWalker` instance - * @param node - the node to filter - */ -function traversal_filter(traverser, node) { - /** - * 1. If traverser’s active flag is set, then throw an "InvalidStateError" - * DOMException. - */ - if (traverser._activeFlag) { - throw new DOMException_1.InvalidStateError(); - } - /** - * 2. Let n be node’s nodeType attribute value − 1. - */ - const n = node._nodeType - 1; - /** - * 3. If the nth bit (where 0 is the least significant bit) of traverser’s - * whatToShow is not set, then return FILTER_SKIP. - */ - const mask = 1 << n; - if ((traverser.whatToShow & mask) === 0) { - return interfaces_1.FilterResult.Skip; - } - /** - * 4. If traverser’s filter is null, then return FILTER_ACCEPT. - */ - if (!traverser.filter) { - return interfaces_1.FilterResult.Accept; - } - /** - * 5. Set traverser’s active flag. - */ - traverser._activeFlag = true; - /** - * 6. Let result be the return value of call a user object’s operation with - * traverser’s filter, "acceptNode", and « node ». If this throws an - * exception, then unset traverser’s active flag and rethrow the exception. - */ - let result = interfaces_1.FilterResult.Reject; - try { - result = traverser.filter.acceptNode(node); - } - catch (err) { - traverser._activeFlag = false; - throw err; - } - /** - * 7. Unset traverser’s active flag. - * 8. Return result. - */ - traverser._activeFlag = false; - return result; + +const SemVer = __nccwpck_require__(7163) + +const inc = (version, release, options, identifier, identifierBase) => { + if (typeof (options) === 'string') { + identifierBase = identifier + identifier = options + options = undefined + } + + try { + return new SemVer( + version instanceof SemVer ? version.version : version, + options + ).inc(release, identifier, identifierBase).version + } catch (er) { + return null + } } -//# sourceMappingURL=TraversalAlgorithm.js.map +module.exports = inc + /***/ }), -/***/ 3532: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 3872: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.tree_getFirstDescendantNode = tree_getFirstDescendantNode; -exports.tree_getNextDescendantNode = tree_getNextDescendantNode; -exports.tree_getDescendantNodes = tree_getDescendantNodes; -exports.tree_getDescendantElements = tree_getDescendantElements; -exports.tree_getSiblingNodes = tree_getSiblingNodes; -exports.tree_getFirstAncestorNode = tree_getFirstAncestorNode; -exports.tree_getNextAncestorNode = tree_getNextAncestorNode; -exports.tree_getAncestorNodes = tree_getAncestorNodes; -exports.tree_getCommonAncestor = tree_getCommonAncestor; -exports.tree_getFollowingNode = tree_getFollowingNode; -exports.tree_getPrecedingNode = tree_getPrecedingNode; -exports.tree_isConstrained = tree_isConstrained; -exports.tree_nodeLength = tree_nodeLength; -exports.tree_isEmpty = tree_isEmpty; -exports.tree_rootNode = tree_rootNode; -exports.tree_isDescendantOf = tree_isDescendantOf; -exports.tree_isAncestorOf = tree_isAncestorOf; -exports.tree_isHostIncludingAncestorOf = tree_isHostIncludingAncestorOf; -exports.tree_isSiblingOf = tree_isSiblingOf; -exports.tree_isPreceding = tree_isPreceding; -exports.tree_isFollowing = tree_isFollowing; -exports.tree_isParentOf = tree_isParentOf; -exports.tree_isChildOf = tree_isChildOf; -exports.tree_previousSibling = tree_previousSibling; -exports.tree_nextSibling = tree_nextSibling; -exports.tree_firstChild = tree_firstChild; -exports.tree_lastChild = tree_lastChild; -exports.tree_treePosition = tree_treePosition; -exports.tree_index = tree_index; -exports.tree_retarget = tree_retarget; -const util_1 = __nccwpck_require__(8247); -const interfaces_1 = __nccwpck_require__(9454); -/** - * Gets the next descendant of the given node of the tree rooted at `root` - * in depth-first pre-order. - * - * @param root - root node of the tree - * @param node - a node - * @param shadow - whether to visit shadow tree nodes - */ -function _getNextDescendantNode(root, node, shadow = false) { - // traverse shadow tree - if (shadow && util_1.Guard.isElementNode(node) && util_1.Guard.isShadowRoot(node.shadowRoot)) { - if (node.shadowRoot._firstChild) - return node.shadowRoot._firstChild; - } - // traverse child nodes - if (node._firstChild) - return node._firstChild; - if (node === root) - return null; - // traverse siblings - if (node._nextSibling) - return node._nextSibling; - // traverse parent's next sibling - let parent = node._parent; - while (parent && parent !== root) { - if (parent._nextSibling) - return parent._nextSibling; - parent = parent._parent; + +const compare = __nccwpck_require__(8469) +const lt = (a, b, loose) => compare(a, b, loose) < 0 +module.exports = lt + + +/***/ }), + +/***/ 6717: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + + + +const compare = __nccwpck_require__(8469) +const lte = (a, b, loose) => compare(a, b, loose) <= 0 +module.exports = lte + + +/***/ }), + +/***/ 8511: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + + + +const SemVer = __nccwpck_require__(7163) +const major = (a, loose) => new SemVer(a, loose).major +module.exports = major + + +/***/ }), + +/***/ 2603: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + + + +const SemVer = __nccwpck_require__(7163) +const minor = (a, loose) => new SemVer(a, loose).minor +module.exports = minor + + +/***/ }), + +/***/ 4974: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + + + +const compare = __nccwpck_require__(8469) +const neq = (a, b, loose) => compare(a, b, loose) !== 0 +module.exports = neq + + +/***/ }), + +/***/ 6353: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + + + +const SemVer = __nccwpck_require__(7163) +const parse = (version, options, throwErrors = false) => { + if (version instanceof SemVer) { + return version + } + try { + return new SemVer(version, options) + } catch (er) { + if (!throwErrors) { + return null } - return null; -} -function _emptyIterator() { - return { - [Symbol.iterator]: () => { - return { - next: () => { - return { done: true, value: null }; - } - }; - } - }; + throw er + } } -/** - * Returns the first descendant node of the tree rooted at `node` in - * depth-first pre-order. - * - * @param node - root node of the tree - * @param self - whether to include `node` in traversal - * @param shadow - whether to visit shadow tree nodes - * @param filter - a function to filter nodes - */ -function tree_getFirstDescendantNode(node, self = false, shadow = false, filter) { - let firstNode = (self ? node : _getNextDescendantNode(node, node, shadow)); - while (firstNode && filter && !filter(firstNode)) { - firstNode = _getNextDescendantNode(node, firstNode, shadow); - } - return firstNode; + +module.exports = parse + + +/***/ }), + +/***/ 8756: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + + + +const SemVer = __nccwpck_require__(7163) +const patch = (a, loose) => new SemVer(a, loose).patch +module.exports = patch + + +/***/ }), + +/***/ 5714: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + + + +const parse = __nccwpck_require__(6353) +const prerelease = (version, options) => { + const parsed = parse(version, options) + return (parsed && parsed.prerelease.length) ? parsed.prerelease : null } -/** - * Returns the next descendant node of the tree rooted at `node` in - * depth-first pre-order. - * - * @param node - root node of the tree - * @param currentNode - current descendant node - * @param self - whether to include `node` in traversal - * @param shadow - whether to visit shadow tree nodes - * @param filter - a function to filter nodes - */ -function tree_getNextDescendantNode(node, currentNode, self = false, shadow = false, filter) { - let nextNode = _getNextDescendantNode(node, currentNode, shadow); - while (nextNode && filter && !filter(nextNode)) { - nextNode = _getNextDescendantNode(node, nextNode, shadow); - } - return nextNode; -} -/** - * Traverses through all descendant nodes of the tree rooted at - * `node` in depth-first pre-order. - * - * @param node - root node of the tree - * @param self - whether to include `node` in traversal - * @param shadow - whether to visit shadow tree nodes - * @param filter - a function to filter nodes - */ -function tree_getDescendantNodes(node, self = false, shadow = false, filter) { - if (!self && node._children.size === 0) { - return _emptyIterator(); - } - return { - [Symbol.iterator]: () => { - let currentNode = (self ? node : _getNextDescendantNode(node, node, shadow)); - return { - next: () => { - while (currentNode && filter && !filter(currentNode)) { - currentNode = _getNextDescendantNode(node, currentNode, shadow); - } - if (currentNode === null) { - return { done: true, value: null }; - } - else { - const result = { done: false, value: currentNode }; - currentNode = _getNextDescendantNode(node, currentNode, shadow); - return result; - } - } - }; - } - }; -} -/** - * Traverses through all descendant element nodes of the tree rooted at - * `node` in depth-first preorder. - * - * @param node - root node of the tree - * @param self - whether to include `node` in traversal - * @param shadow - whether to visit shadow tree nodes - * @param filter - a function to filter nodes - */ -function tree_getDescendantElements(node, self = false, shadow = false, filter) { - if (!self && node._children.size === 0) { - return _emptyIterator(); - } - return { - [Symbol.iterator]: () => { - const it = tree_getDescendantNodes(node, self, shadow, (e) => util_1.Guard.isElementNode(e))[Symbol.iterator](); - let currentNode = it.next().value; - return { - next() { - while (currentNode && filter && !filter(currentNode)) { - currentNode = it.next().value; - } - if (currentNode === null) { - return { done: true, value: null }; - } - else { - const result = { done: false, value: currentNode }; - currentNode = it.next().value; - return result; - } - } - }; - } - }; -} -/** - * Traverses through all sibling nodes of `node`. - * - * @param node - root node of the tree - * @param self - whether to include `node` in traversal - * @param filter - a function to filter nodes - */ -function tree_getSiblingNodes(node, self = false, filter) { - if (!node._parent || node._parent._children.size === 0) { - return _emptyIterator(); - } - return { - [Symbol.iterator]() { - let currentNode = node._parent ? node._parent._firstChild : null; - return { - next() { - while (currentNode && (filter && !filter(currentNode) || (!self && currentNode === node))) { - currentNode = currentNode._nextSibling; - } - if (currentNode === null) { - return { done: true, value: null }; - } - else { - const result = { done: false, value: currentNode }; - currentNode = currentNode._nextSibling; - return result; - } - } - }; - } - }; -} -/** - * Gets the first ancestor of `node` in reverse tree order. - * - * @param node - root node of the tree - * @param self - whether to include `node` in traversal - * @param filter - a function to filter nodes - */ -function tree_getFirstAncestorNode(node, self = false, filter) { - let firstNode = self ? node : node._parent; - while (firstNode && filter && !filter(firstNode)) { - firstNode = firstNode._parent; - } - return firstNode; -} -/** - * Gets the first ancestor of `node` in reverse tree order. - * - * @param node - root node of the tree - * @param self - whether to include `node` in traversal - * @param filter - a function to filter nodes - */ -function tree_getNextAncestorNode(node, currentNode, self = false, filter) { - let nextNode = currentNode._parent; - while (nextNode && filter && !filter(nextNode)) { - nextNode = nextNode._parent; - } - return nextNode; -} -/** - * Traverses through all ancestor nodes `node` in reverse tree order. - * - * @param node - root node of the tree - * @param self - whether to include `node` in traversal - * @param filter - a function to filter nodes - */ -function tree_getAncestorNodes(node, self = false, filter) { - if (!self && !node._parent) { - return _emptyIterator(); - } - return { - [Symbol.iterator]() { - let currentNode = tree_getFirstAncestorNode(node, self, filter); - return { - next() { - if (currentNode === null) { - return { done: true, value: null }; - } - else { - const result = { done: false, value: currentNode }; - currentNode = tree_getNextAncestorNode(node, currentNode, self, filter); - return result; - } - } - }; - } - }; -} -/** - * Returns the common ancestor of the given nodes. - * - * @param nodeA - a node - * @param nodeB - a node - */ -function tree_getCommonAncestor(nodeA, nodeB) { - if (nodeA === nodeB) { - return nodeA._parent; - } - // lists of parent nodes - const parentsA = []; - const parentsB = []; - let pA = tree_getFirstAncestorNode(nodeA, true); - while (pA !== null) { - parentsA.push(pA); - pA = tree_getNextAncestorNode(nodeA, pA, true); - } - let pB = tree_getFirstAncestorNode(nodeB, true); - while (pB !== null) { - parentsB.push(pB); - pB = tree_getNextAncestorNode(nodeB, pB, true); - } - // walk through parents backwards until they differ - let pos1 = parentsA.length; - let pos2 = parentsB.length; - let parent = null; - for (let i = Math.min(pos1, pos2); i > 0; i--) { - const parent1 = parentsA[--pos1]; - const parent2 = parentsB[--pos2]; - if (parent1 !== parent2) { - break; - } - parent = parent1; - } - return parent; -} -/** - * Returns the node following `node` in depth-first preorder. - * - * @param root - root of the subtree - * @param node - a node - */ -function tree_getFollowingNode(root, node) { - if (node._firstChild) { - return node._firstChild; - } - else if (node._nextSibling) { - return node._nextSibling; - } - else { - while (true) { - const parent = node._parent; - if (parent === null || parent === root) { - return null; - } - else if (parent._nextSibling) { - return parent._nextSibling; - } - else { - node = parent; - } - } - } -} -/** - * Returns the node preceding `node` in depth-first preorder. - * - * @param root - root of the subtree - * @param node - a node - */ -function tree_getPrecedingNode(root, node) { - if (node === root) { - return null; - } - if (node._previousSibling) { - node = node._previousSibling; - if (node._lastChild) { - return node._lastChild; - } - else { - return node; - } - } - else { - return node._parent; - } -} -/** - * Determines if the node tree is constrained. A node tree is - * constrained as follows, expressed as a relationship between the - * type of node and its allowed children: - * - Document (In tree order) - * * Zero or more nodes each of which is ProcessingInstruction - * or Comment. - * * Optionally one DocumentType node. - * * Zero or more nodes each of which is ProcessingInstruction - * or Comment. - * * Optionally one Element node. - * * Zero or more nodes each of which is ProcessingInstruction - * or Comment. - * - DocumentFragment, Element - * * Zero or more nodes each of which is Element, Text, - * ProcessingInstruction, or Comment. - * - DocumentType, Text, ProcessingInstruction, Comment - * * None. - * - * @param node - the root of the tree - */ -function tree_isConstrained(node) { - switch (node._nodeType) { - case interfaces_1.NodeType.Document: - let hasDocType = false; - let hasElement = false; - for (const childNode of node._children) { - switch (childNode._nodeType) { - case interfaces_1.NodeType.ProcessingInstruction: - case interfaces_1.NodeType.Comment: - break; - case interfaces_1.NodeType.DocumentType: - if (hasDocType || hasElement) - return false; - hasDocType = true; - break; - case interfaces_1.NodeType.Element: - if (hasElement) - return false; - hasElement = true; - break; - default: - return false; - } - } - break; - case interfaces_1.NodeType.DocumentFragment: - case interfaces_1.NodeType.Element: - for (const childNode of node._children) { - switch (childNode._nodeType) { - case interfaces_1.NodeType.Element: - case interfaces_1.NodeType.Text: - case interfaces_1.NodeType.ProcessingInstruction: - case interfaces_1.NodeType.CData: - case interfaces_1.NodeType.Comment: - break; - default: - return false; - } - } - break; - case interfaces_1.NodeType.DocumentType: - case interfaces_1.NodeType.Text: - case interfaces_1.NodeType.ProcessingInstruction: - case interfaces_1.NodeType.CData: - case interfaces_1.NodeType.Comment: - return (!node.hasChildNodes()); - } - for (const childNode of node._children) { - // recursively check child nodes - if (!tree_isConstrained(childNode)) - return false; - } - return true; -} -/** - * Returns the length of a node. - * - * @param node - a node to check - */ -function tree_nodeLength(node) { - /** - * To determine the length of a node node, switch on node: - * - DocumentType - * Zero. - * - Text - * - ProcessingInstruction - * - Comment - * Its data’s length. - * - Any other node - * Its number of children. - */ - if (util_1.Guard.isDocumentTypeNode(node)) { - return 0; - } - else if (util_1.Guard.isCharacterDataNode(node)) { - return node._data.length; - } - else { - return node._children.size; - } -} -/** - * Determines if a node is empty. - * - * @param node - a node to check - */ -function tree_isEmpty(node) { - /** - * A node is considered empty if its length is zero. - */ - return (tree_nodeLength(node) === 0); -} -/** - * Returns the root node of a tree. The root of an object is itself, - * if its parent is `null`, or else it is the root of its parent. - * The root of a tree is any object participating in that tree - * whose parent is `null`. - * - * @param node - a node of the tree - * @param shadow - `true` to return shadow-including root, otherwise - * `false` - */ -function tree_rootNode(node, shadow = false) { - /** - * The root of an object is itself, if its parent is null, or else it is the - * root of its parent. The root of a tree is any object participating in - * that tree whose parent is null. - */ - if (shadow) { - const root = tree_rootNode(node, false); - if (util_1.Guard.isShadowRoot(root)) - return tree_rootNode(root._host, true); - else - return root; - } - else { - if (!node._parent) - return node; - else - return tree_rootNode(node._parent); - } -} -/** - * Determines whether `other` is a descendant of `node`. An object - * A is called a descendant of an object B, if either A is a child - * of B or A is a child of an object C that is a descendant of B. - * - * @param node - a node - * @param other - the node to check - * @param self - if `true`, traversal includes `node` itself - * @param shadow - if `true`, traversal includes the - * node's and its descendant's shadow trees as well. - */ -function tree_isDescendantOf(node, other, self = false, shadow = false) { - /** - * An object A is called a descendant of an object B, if either A is a - * child of B or A is a child of an object C that is a descendant of B. - * - * An inclusive descendant is an object or one of its descendants. - */ - let child = tree_getFirstDescendantNode(node, self, shadow); - while (child !== null) { - if (child === other) { - return true; - } - child = tree_getNextDescendantNode(node, child, self, shadow); - } - return false; -} -/** - * Determines whether `other` is an ancestor of `node`. An object A - * is called an ancestor of an object B if and only if B is a - * descendant of A. - * - * @param node - a node - * @param other - the node to check - * @param self - if `true`, traversal includes `node` itself - * @param shadow - if `true`, traversal includes the - * node's and its descendant's shadow trees as well. - */ -function tree_isAncestorOf(node, other, self = false, shadow = false) { - let ancestor = self ? node : shadow && util_1.Guard.isShadowRoot(node) ? - node._host : node._parent; - while (ancestor !== null) { - if (ancestor === other) - return true; - ancestor = shadow && util_1.Guard.isShadowRoot(ancestor) ? - ancestor._host : ancestor._parent; - } - return false; -} -/** - * Determines whether `other` is a host-including ancestor of `node`. An - * object A is a host-including inclusive ancestor of an object B, if either - * A is an inclusive ancestor of B, or if B’s root has a non-null host and - * A is a host-including inclusive ancestor of B’s root’s host. - * - * @param node - a node - * @param other - the node to check - * @param self - if `true`, traversal includes `node` itself - */ -function tree_isHostIncludingAncestorOf(node, other, self = false) { - if (tree_isAncestorOf(node, other, self)) - return true; - const root = tree_rootNode(node); - if (util_1.Guard.isDocumentFragmentNode(root) && root._host !== null && - tree_isHostIncludingAncestorOf(root._host, other, self)) - return true; - return false; -} -/** - * Determines whether `other` is a sibling of `node`. An object A is - * called a sibling of an object B, if and only if B and A share - * the same non-null parent. - * - * @param node - a node - * @param other - the node to check - * @param self - if `true`, traversal includes `node` itself - */ -function tree_isSiblingOf(node, other, self = false) { - /** - * An object A is called a sibling of an object B, if and only if B and A - * share the same non-null parent. - * - * An inclusive sibling is an object or one of its siblings. - */ - if (node === other) { - if (self) - return true; - } - else { - return (node._parent !== null && node._parent === other._parent); - } - return false; -} -/** - * Determines whether `other` is preceding `node`. An object A is - * preceding an object B if A and B are in the same tree and A comes - * before B in tree order. - * - * @param node - a node - * @param other - the node to check - */ -function tree_isPreceding(node, other) { - /** - * An object A is preceding an object B if A and B are in the same tree and - * A comes before B in tree order. - */ - const nodePos = tree_treePosition(node); - const otherPos = tree_treePosition(other); - if (nodePos === -1 || otherPos === -1) - return false; - else if (tree_rootNode(node) !== tree_rootNode(other)) - return false; - else - return otherPos < nodePos; -} -/** - * Determines whether `other` is following `node`. An object A is - * following an object B if A and B are in the same tree and A comes - * after B in tree order. - * - * @param node - a node - * @param other - the node to check - */ -function tree_isFollowing(node, other) { - /** - * An object A is following an object B if A and B are in the same tree and - * A comes after B in tree order. - */ - const nodePos = tree_treePosition(node); - const otherPos = tree_treePosition(other); - if (nodePos === -1 || otherPos === -1) - return false; - else if (tree_rootNode(node) !== tree_rootNode(other)) - return false; - else - return otherPos > nodePos; -} -/** - * Determines whether `other` is the parent node of `node`. - * - * @param node - a node - * @param other - the node to check - */ -function tree_isParentOf(node, other) { - /** - * An object that participates in a tree has a parent, which is either - * null or an object, and has children, which is an ordered set of objects. - * An object A whose parent is object B is a child of B. - */ - return (node._parent === other); -} -/** - * Determines whether `other` is a child node of `node`. - * - * @param node - a node - * @param other - the node to check - */ -function tree_isChildOf(node, other) { - /** - * An object that participates in a tree has a parent, which is either - * null or an object, and has children, which is an ordered set of objects. - * An object A whose parent is object B is a child of B. - */ - return (other._parent === node); -} -/** - * Returns the previous sibling node of `node` or null if it has no - * preceding sibling. - * - * @param node - */ -function tree_previousSibling(node) { - /** - * The previous sibling of an object is its first preceding sibling or null - * if it has no preceding sibling. - */ - return node._previousSibling; -} -/** - * Returns the next sibling node of `node` or null if it has no - * following sibling. - * - * @param node - */ -function tree_nextSibling(node) { - /** - * The next sibling of an object is its first following sibling or null - * if it has no following sibling. - */ - return node._nextSibling; -} -/** - * Returns the first child node of `node` or null if it has no - * children. - * - * @param node - */ -function tree_firstChild(node) { - /** - * The first child of an object is its first child or null if it has no - * children. - */ - return node._firstChild; -} -/** - * Returns the last child node of `node` or null if it has no - * children. - * - * @param node - */ -function tree_lastChild(node) { - /** - * The last child of an object is its last child or null if it has no - * children. - */ - return node._lastChild; -} -/** - * Returns the zero-based index of `node` when counted preorder in - * the tree rooted at `root`. Returns `-1` if `node` is not in - * the tree. - * - * @param node - the node to get the index of - */ -function tree_treePosition(node) { - const root = tree_rootNode(node); - let pos = 0; - let childNode = tree_getFirstDescendantNode(root); - while (childNode !== null) { - pos++; - if (childNode === node) - return pos; - childNode = tree_getNextDescendantNode(root, childNode); - } - return -1; -} -/** - * Determines the index of `node`. The index of an object is its number of - * preceding siblings, or 0 if it has none. - * - * @param node - a node - * @param other - the node to check - */ -function tree_index(node) { - /** - * The index of an object is its number of preceding siblings, or 0 if it - * has none. - */ - let n = 0; - while (node._previousSibling !== null) { - n++; - node = node._previousSibling; - } - return n; -} -/** - * Retargets an object against another object. - * - * @param a - an object to retarget - * @param b - an object to retarget against - */ -function tree_retarget(a, b) { - /** - * To retarget an object A against an object B, repeat these steps until - * they return an object: - * 1. If one of the following is true - * - A is not a node - * - A's root is not a shadow root - * - B is a node and A's root is a shadow-including inclusive ancestor - * of B - * then return A. - * 2. Set A to A's root's host. - */ - while (true) { - if (!a || !util_1.Guard.isNode(a)) { - return a; - } - const rootOfA = tree_rootNode(a); - if (!util_1.Guard.isShadowRoot(rootOfA)) { - return a; - } - if (b && util_1.Guard.isNode(b) && tree_isAncestorOf(rootOfA, b, true, true)) { - return a; - } - a = rootOfA.host; - } -} -//# sourceMappingURL=TreeAlgorithm.js.map +module.exports = prerelease + /***/ }), -/***/ 6094: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 2173: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.treeWalker_traverseChildren = treeWalker_traverseChildren; -exports.treeWalker_traverseSiblings = treeWalker_traverseSiblings; -const interfaces_1 = __nccwpck_require__(9454); -const TraversalAlgorithm_1 = __nccwpck_require__(6746); -/** - * Returns the first or last child node, or `null` if there are none. - * - * @param walker - the `TreeWalker` instance - * @param first - `true` to return the first child node, or `false` to - * return the last child node. - */ -function treeWalker_traverseChildren(walker, first) { - /** - * 1. Let node be walker’s current. - * 2. Set node to node’s first child if type is first, and node’s last child - * if type is last. - * 3. While node is non-null: - */ - let node = (first ? walker._current._firstChild : walker._current._lastChild); - while (node !== null) { - /** - * 3.1. Let result be the result of filtering node within walker. - */ - const result = (0, TraversalAlgorithm_1.traversal_filter)(walker, node); - if (result === interfaces_1.FilterResult.Accept) { - /** - * 3.2. If result is FILTER_ACCEPT, then set walker’s current to node and - * return node. - */ - walker._current = node; - return node; - } - else if (result === interfaces_1.FilterResult.Skip) { - /** - * 3.3. If result is FILTER_SKIP, then: - * 3.3.1. Let child be node’s first child if type is first, and node’s - * last child if type is last. - * 3.3.2. If child is non-null, then set node to child and continue. - */ - const child = (first ? node._firstChild : node._lastChild); - if (child !== null) { - node = child; - continue; - } - } - /** - * 3.4. While node is non-null: - */ - while (node !== null) { - /** - * 3.4.1. Let sibling be node’s next sibling if type is first, and - * node’s previous sibling if type is last. - * 3.4.2. If sibling is non-null, then set node to sibling and break. - */ - const sibling = (first ? node._nextSibling : node._previousSibling); - if (sibling !== null) { - node = sibling; - break; - } - /** - * 3.4.3. Let parent be node’s parent. - * 3.4.4. If parent is null, walker’s root, or walker’s current, then - * return null. - */ - const parent = node._parent; - if (parent === null || parent === walker._root || parent === walker._current) { - return null; - } - /** - * 3.4.5. Set node to parent. - */ - node = parent; - } - } - /** - * 5. Return null - */ - return null; -} -/** - * Returns the next or previous sibling node, or `null` if there are none. - * - * @param walker - the `TreeWalker` instance - * @param next - `true` to return the next sibling node, or `false` to - * return the previous sibling node. - */ -function treeWalker_traverseSiblings(walker, next) { - /** - * 1. Let node be walker’s current. - * 2. If node is root, then return null. - * 3. While node is non-null: - */ - let node = walker._current; - if (node === walker._root) - return null; - while (true) { - /** - * 3.1. Let sibling be node’s next sibling if type is next, and node’s - * previous sibling if type is previous. - * 3.2. While sibling is non-null: - */ - let sibling = (next ? node._nextSibling : node._previousSibling); - while (sibling !== null) { - /** - * 3.2.1. Set node to sibling. - * 3.2.2. Let result be the result of filtering node within walker. - * 3.2.3. If result is FILTER_ACCEPT, then set walker’s current to node - * and return node. - */ - node = sibling; - const result = (0, TraversalAlgorithm_1.traversal_filter)(walker, node); - if (result === interfaces_1.FilterResult.Accept) { - walker._current = node; - return node; - } - /** - * 3.2.4. Set sibling to node’s first child if type is next, and node’s - * last child if type is previous. - * 3.2.5. If result is FILTER_REJECT or sibling is null, then set - * sibling to node’s next sibling if type is next, and node’s previous - * sibling if type is previous. - */ - sibling = (next ? node._firstChild : node._lastChild); - if (result === interfaces_1.FilterResult.Reject || sibling === null) { - sibling = (next ? node._nextSibling : node._previousSibling); - } - } - /** - * 3.3. Set node to node’s parent. - * 3.4. If node is null or walker’s root, then return null. - */ - node = node._parent; - if (node === null || node === walker._root) { - return null; - } - /** - * 3.5. If the return value of filtering node within walker is FILTER_ACCEPT, - * then return null. - */ - if ((0, TraversalAlgorithm_1.traversal_filter)(walker, node) === interfaces_1.FilterResult.Accept) { - return null; - } - } -} -//# sourceMappingURL=TreeWalkerAlgorithm.js.map -/***/ }), +const compare = __nccwpck_require__(8469) +const rcompare = (a, b, loose) => compare(b, a, loose) +module.exports = rcompare -/***/ 4239: -/***/ ((__unused_webpack_module, exports) => { +/***/ }), -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.idl_defineConst = idl_defineConst; -/** - * Defines a WebIDL `Const` property on the given object. - * - * @param o - object on which to add the property - * @param name - property name - * @param value - property value - */ -function idl_defineConst(o, name, value) { - Object.defineProperty(o, name, { writable: false, enumerable: true, configurable: false, value: value }); -} -//# sourceMappingURL=WebIDLAlgorithm.js.map +/***/ 7192: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -/***/ }), -/***/ 6879: -/***/ ((__unused_webpack_module, exports) => { +const compareBuild = __nccwpck_require__(7648) +const rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose)) +module.exports = rsort -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.xml_isName = xml_isName; -exports.xml_isQName = xml_isQName; -exports.xml_isLegalChar = xml_isLegalChar; -exports.xml_isPubidChar = xml_isPubidChar; -/** - * Determines if the given string is valid for a `"Name"` construct. - * - * @param name - name string to test - */ -function xml_isName(name) { - for (let i = 0; i < name.length; i++) { - let n = name.charCodeAt(i); - // NameStartChar - if ((n >= 97 && n <= 122) || // [a-z] - (n >= 65 && n <= 90) || // [A-Z] - n === 58 || n === 95 || // ':' or '_' - (n >= 0xC0 && n <= 0xD6) || - (n >= 0xD8 && n <= 0xF6) || - (n >= 0xF8 && n <= 0x2FF) || - (n >= 0x370 && n <= 0x37D) || - (n >= 0x37F && n <= 0x1FFF) || - (n >= 0x200C && n <= 0x200D) || - (n >= 0x2070 && n <= 0x218F) || - (n >= 0x2C00 && n <= 0x2FEF) || - (n >= 0x3001 && n <= 0xD7FF) || - (n >= 0xF900 && n <= 0xFDCF) || - (n >= 0xFDF0 && n <= 0xFFFD)) { - continue; - } - else if (i !== 0 && - (n === 45 || n === 46 || // '-' or '.' - (n >= 48 && n <= 57) || // [0-9] - (n === 0xB7) || - (n >= 0x0300 && n <= 0x036F) || - (n >= 0x203F && n <= 0x2040))) { - continue; - } - if (n >= 0xD800 && n <= 0xDBFF && i < name.length - 1) { - const n2 = name.charCodeAt(i + 1); - if (n2 >= 0xDC00 && n2 <= 0xDFFF) { - n = (n - 0xD800) * 0x400 + n2 - 0xDC00 + 0x10000; - i++; - if (n >= 0x10000 && n <= 0xEFFFF) { - continue; - } - } - } - return false; - } - return true; -} -/** - * Determines if the given string is valid for a `"QName"` construct. - * - * @param name - name string to test - */ -function xml_isQName(name) { - let colonFound = false; - for (let i = 0; i < name.length; i++) { - let n = name.charCodeAt(i); - // NameStartChar - if ((n >= 97 && n <= 122) || // [a-z] - (n >= 65 && n <= 90) || // [A-Z] - n === 95 || // '_' - (n >= 0xC0 && n <= 0xD6) || - (n >= 0xD8 && n <= 0xF6) || - (n >= 0xF8 && n <= 0x2FF) || - (n >= 0x370 && n <= 0x37D) || - (n >= 0x37F && n <= 0x1FFF) || - (n >= 0x200C && n <= 0x200D) || - (n >= 0x2070 && n <= 0x218F) || - (n >= 0x2C00 && n <= 0x2FEF) || - (n >= 0x3001 && n <= 0xD7FF) || - (n >= 0xF900 && n <= 0xFDCF) || - (n >= 0xFDF0 && n <= 0xFFFD)) { - continue; - } - else if (i !== 0 && - (n === 45 || n === 46 || // '-' or '.' - (n >= 48 && n <= 57) || // [0-9] - (n === 0xB7) || - (n >= 0x0300 && n <= 0x036F) || - (n >= 0x203F && n <= 0x2040))) { - continue; - } - else if (i !== 0 && n === 58) { // : - if (colonFound) - return false; // multiple colons in qname - if (i === name.length - 1) - return false; // colon at the end of qname - colonFound = true; - continue; - } - if (n >= 0xD800 && n <= 0xDBFF && i < name.length - 1) { - const n2 = name.charCodeAt(i + 1); - if (n2 >= 0xDC00 && n2 <= 0xDFFF) { - n = (n - 0xD800) * 0x400 + n2 - 0xDC00 + 0x10000; - i++; - if (n >= 0x10000 && n <= 0xEFFFF) { - continue; - } - } - } - return false; - } - return true; -} -/** - * Determines if the given string contains legal characters. - * - * @param chars - sequence of characters to test - */ -function xml_isLegalChar(chars) { - for (let i = 0; i < chars.length; i++) { - let n = chars.charCodeAt(i); - // #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] - if (n === 0x9 || n === 0xA || n === 0xD || - (n >= 0x20 && n <= 0xD7FF) || - (n >= 0xE000 && n <= 0xFFFD)) { - continue; - } - if (n >= 0xD800 && n <= 0xDBFF && i < chars.length - 1) { - const n2 = chars.charCodeAt(i + 1); - if (n2 >= 0xDC00 && n2 <= 0xDFFF) { - n = (n - 0xD800) * 0x400 + n2 - 0xDC00 + 0x10000; - i++; - if (n >= 0x10000 && n <= 0x10FFFF) { - continue; - } - } - } - return false; - } - return true; -} -/** - * Determines if the given string contains legal characters for a public - * identifier. - * - * @param chars - sequence of characters to test - */ -function xml_isPubidChar(chars) { - for (let i = 0; i < chars.length; i++) { - // PubId chars are all in the ASCII range, no need to check surrogates - const n = chars.charCodeAt(i); - // #x20 | #xD | #xA | [a-zA-Z0-9] | [-'()+,./:=?;!*#@$_%] - if ((n >= 97 && n <= 122) || // [a-z] - (n >= 65 && n <= 90) || // [A-Z] - (n >= 39 && n <= 59) || // ['()*+,-./] | [0-9] | [:;] - n === 0x20 || n === 0xD || n === 0xA || // #x20 | #xD | #xA - (n >= 35 && n <= 37) || // [#$%] - n === 33 || // ! - n === 61 || n === 63 || n === 64 || n === 95) { // [=?@_] - continue; - } - else { - return false; - } - } - return true; -} -//# sourceMappingURL=XMLAlgorithm.js.map /***/ }), -/***/ 6573: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { +/***/ 8011: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __exportStar = (this && this.__exportStar) || function(m, exports) { - for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -__exportStar(__nccwpck_require__(5878), exports); -__exportStar(__nccwpck_require__(8365), exports); -__exportStar(__nccwpck_require__(8652), exports); -__exportStar(__nccwpck_require__(7785), exports); -__exportStar(__nccwpck_require__(8308), exports); -__exportStar(__nccwpck_require__(5075), exports); -__exportStar(__nccwpck_require__(1327), exports); -__exportStar(__nccwpck_require__(9484), exports); -__exportStar(__nccwpck_require__(6827), exports); -__exportStar(__nccwpck_require__(2720), exports); -__exportStar(__nccwpck_require__(8012), exports); -__exportStar(__nccwpck_require__(9807), exports); -__exportStar(__nccwpck_require__(45), exports); -__exportStar(__nccwpck_require__(3243), exports); -__exportStar(__nccwpck_require__(9733), exports); -__exportStar(__nccwpck_require__(1228), exports); -__exportStar(__nccwpck_require__(9670), exports); -__exportStar(__nccwpck_require__(8421), exports); -__exportStar(__nccwpck_require__(9892), exports); -__exportStar(__nccwpck_require__(6687), exports); -__exportStar(__nccwpck_require__(3886), exports); -__exportStar(__nccwpck_require__(708), exports); -__exportStar(__nccwpck_require__(3813), exports); -__exportStar(__nccwpck_require__(6746), exports); -__exportStar(__nccwpck_require__(3532), exports); -__exportStar(__nccwpck_require__(6094), exports); -__exportStar(__nccwpck_require__(4239), exports); -__exportStar(__nccwpck_require__(6879), exports); -//# sourceMappingURL=index.js.map -/***/ }), +const Range = __nccwpck_require__(6782) +const satisfies = (version, range, options) => { + try { + range = new Range(range, options) + } catch (er) { + return false + } + return range.test(version) +} +module.exports = satisfies -/***/ 7528: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ }), -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.AbortControllerImpl = void 0; -const algorithm_1 = __nccwpck_require__(6573); -/** - * Represents a controller that allows to abort DOM requests. - */ -class AbortControllerImpl { - _signal; - /** - * Initializes a new instance of `AbortController`. - */ - constructor() { - /** - * 1. Let signal be a new AbortSignal object. - * 2. Let controller be a new AbortController object whose signal is signal. - * 3. Return controller. - */ - this._signal = (0, algorithm_1.create_abortSignal)(); - } - /** @inheritdoc */ - get signal() { return this._signal; } - /** @inheritdoc */ - abort() { - (0, algorithm_1.abort_signalAbort)(this._signal); - } -} -exports.AbortControllerImpl = AbortControllerImpl; -//# sourceMappingURL=AbortControllerImpl.js.map +/***/ 9872: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -/***/ }), -/***/ 4560: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +const compareBuild = __nccwpck_require__(7648) +const sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose)) +module.exports = sort -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.AbortSignalImpl = void 0; -const EventTargetImpl_1 = __nccwpck_require__(3611); -const algorithm_1 = __nccwpck_require__(6573); -/** - * Represents a signal object that communicates with a DOM request and abort - * it through an AbortController. - */ -class AbortSignalImpl extends EventTargetImpl_1.EventTargetImpl { - _abortedFlag = false; - _abortAlgorithms = new Set(); - /** - * Initializes a new instance of `AbortSignal`. - */ - constructor() { - super(); - } - /** @inheritdoc */ - get aborted() { return this._abortedFlag; } - /** @inheritdoc */ - get onabort() { - return (0, algorithm_1.event_getterEventHandlerIDLAttribute)(this, "onabort"); - } - set onabort(val) { - (0, algorithm_1.event_setterEventHandlerIDLAttribute)(this, "onabort", val); - } - /** - * Creates a new `AbortSignal`. - */ - static _create() { - return new AbortSignalImpl(); - } -} -exports.AbortSignalImpl = AbortSignalImpl; -//# sourceMappingURL=AbortSignalImpl.js.map /***/ }), -/***/ 3773: -/***/ ((__unused_webpack_module, exports) => { +/***/ 6114: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.AbstractRangeImpl = void 0; -/** - * Represents an abstract range with a start and end boundary point. - */ -class AbstractRangeImpl { - get _startNode() { return this._start[0]; } - get _startOffset() { return this._start[1]; } - get _endNode() { return this._end[0]; } - get _endOffset() { return this._end[1]; } - get _collapsed() { - return (this._start[0] === this._end[0] && - this._start[1] === this._end[1]); - } - /** @inheritdoc */ - get startContainer() { return this._startNode; } - /** @inheritdoc */ - get startOffset() { return this._startOffset; } - /** @inheritdoc */ - get endContainer() { return this._endNode; } - /** @inheritdoc */ - get endOffset() { return this._endOffset; } - /** @inheritdoc */ - get collapsed() { return this._collapsed; } -} -exports.AbstractRangeImpl = AbstractRangeImpl; -//# sourceMappingURL=AbstractRangeImpl.js.map -/***/ }), +const parse = __nccwpck_require__(6353) +const constants = __nccwpck_require__(5101) +const SemVer = __nccwpck_require__(7163) -/***/ 2875: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +const truncate = (version, truncation, options) => { + if (!constants.RELEASE_TYPES.includes(truncation)) { + return null + } + const clonedVersion = cloneInputVersion(version, options) + return clonedVersion && doTruncation(clonedVersion, truncation) +} -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.AttrImpl = void 0; -const interfaces_1 = __nccwpck_require__(9454); -const NodeImpl_1 = __nccwpck_require__(2280); -const algorithm_1 = __nccwpck_require__(6573); -const WebIDLAlgorithm_1 = __nccwpck_require__(4239); -/** - * Represents an attribute of an element node. - */ -class AttrImpl extends NodeImpl_1.NodeImpl { - _nodeType = interfaces_1.NodeType.Attribute; - _localName; - _namespace = null; - _namespacePrefix = null; - _element = null; - _value = ''; - /** - * Initializes a new instance of `Attr`. - * - * @param localName - local name - */ - constructor(localName) { - super(); - this._localName = localName; - } - /** @inheritdoc */ - specified; - /** @inheritdoc */ - get ownerElement() { return this._element; } - /** @inheritdoc */ - get namespaceURI() { return this._namespace; } - /** @inheritdoc */ - get prefix() { return this._namespacePrefix; } - /** @inheritdoc */ - get localName() { return this._localName; } - /** @inheritdoc */ - get name() { return this._qualifiedName; } - /** @inheritdoc */ - get value() { return this._value; } - set value(value) { - /** - * The value attribute’s setter must set an existing attribute value with - * context object and the given value. - */ - (0, algorithm_1.attr_setAnExistingAttributeValue)(this, value); - } - /** - * Returns the qualified name. - */ - get _qualifiedName() { - /** - * An attribute’s qualified name is its local name if its namespace prefix - * is null, and its namespace prefix, followed by ":", followed by its - * local name, otherwise. - */ - return (this._namespacePrefix !== null ? - this._namespacePrefix + ':' + this._localName : - this._localName); - } - /** - * Creates an `Attr`. - * - * @param document - owner document - * @param localName - local name - */ - static _create(document, localName) { - const node = new AttrImpl(localName); - node._nodeDocument = document; - return node; - } +const cloneInputVersion = (version, options) => { + const versionStringToParse = ( + version instanceof SemVer ? version.version : version + ) + + return parse(versionStringToParse, options) } -exports.AttrImpl = AttrImpl; -/** - * Initialize prototype properties - */ -(0, WebIDLAlgorithm_1.idl_defineConst)(AttrImpl.prototype, "_nodeType", interfaces_1.NodeType.Attribute); -(0, WebIDLAlgorithm_1.idl_defineConst)(AttrImpl.prototype, "specified", true); -//# sourceMappingURL=AttrImpl.js.map -/***/ }), +const doTruncation = (version, truncation) => { + if (isPrerelease(truncation)) { + return version.version + } -/***/ 4104: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + version.prerelease = [] + switch (truncation) { + case 'major': + version.minor = 0 + version.patch = 0 + break + case 'minor': + version.patch = 0 + break + } -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.CDATASectionImpl = void 0; -const TextImpl_1 = __nccwpck_require__(4063); -const interfaces_1 = __nccwpck_require__(9454); -const WebIDLAlgorithm_1 = __nccwpck_require__(4239); -/** - * Represents a CDATA node. - */ -class CDATASectionImpl extends TextImpl_1.TextImpl { - _nodeType = interfaces_1.NodeType.CData; - /** - * Initializes a new instance of `CDATASection`. - * - * @param data - node contents - */ - constructor(data) { - super(data); - } - /** - * Creates a new `CDATASection`. - * - * @param document - owner document - * @param data - node contents - */ - static _create(document, data = '') { - const node = new CDATASectionImpl(data); - node._nodeDocument = document; - return node; - } + return version.format() } -exports.CDATASectionImpl = CDATASectionImpl; -/** - * Initialize prototype properties - */ -(0, WebIDLAlgorithm_1.idl_defineConst)(CDATASectionImpl.prototype, "_nodeType", interfaces_1.NodeType.CData); -//# sourceMappingURL=CDATASectionImpl.js.map + +const isPrerelease = (type) => { + return type.startsWith('pre') +} + +module.exports = truncate + /***/ }), -/***/ 765: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 8780: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.CharacterDataImpl = void 0; -const NodeImpl_1 = __nccwpck_require__(2280); -const algorithm_1 = __nccwpck_require__(6573); -/** - * Represents a generic text node. - */ -class CharacterDataImpl extends NodeImpl_1.NodeImpl { - _data; - /** - * Initializes a new instance of `CharacterData`. - * - * @param data - the text content - */ - constructor(data) { - super(); - this._data = data; - } - /** @inheritdoc */ - get data() { return this._data; } - set data(value) { - (0, algorithm_1.characterData_replaceData)(this, 0, this._data.length, value); - } - /** @inheritdoc */ - get length() { return this._data.length; } - /** @inheritdoc */ - substringData(offset, count) { - /** - * The substringData(offset, count) method, when invoked, must return the - * result of running substring data with node context object, offset offset, and count count. - */ - return (0, algorithm_1.characterData_substringData)(this, offset, count); - } - /** @inheritdoc */ - appendData(data) { - /** - * The appendData(data) method, when invoked, must replace data with node - * context object, offset context object’s length, count 0, and data data. - */ - return (0, algorithm_1.characterData_replaceData)(this, this._data.length, 0, data); - } - /** @inheritdoc */ - insertData(offset, data) { - /** - * The insertData(offset, data) method, when invoked, must replace data with - * node context object, offset offset, count 0, and data data. - */ - (0, algorithm_1.characterData_replaceData)(this, offset, 0, data); - } - /** @inheritdoc */ - deleteData(offset, count) { - /** - * The deleteData(offset, count) method, when invoked, must replace data - * with node context object, offset offset, count count, and data the - * empty string. - */ - (0, algorithm_1.characterData_replaceData)(this, offset, count, ''); - } - /** @inheritdoc */ - replaceData(offset, count, data) { - /** - * The replaceData(offset, count, data) method, when invoked, must replace - * data with node context object, offset offset, count count, and data data. - */ - (0, algorithm_1.characterData_replaceData)(this, offset, count, data); - } - // MIXIN: NonDocumentTypeChildNode - /* istanbul ignore next */ - get previousElementSibling() { throw new Error("Mixin: NonDocumentTypeChildNode not implemented."); } - /* istanbul ignore next */ - get nextElementSibling() { throw new Error("Mixin: NonDocumentTypeChildNode not implemented."); } - // MIXIN: ChildNode - /* istanbul ignore next */ - before(...nodes) { throw new Error("Mixin: ChildNode not implemented."); } - /* istanbul ignore next */ - after(...nodes) { throw new Error("Mixin: ChildNode not implemented."); } - /* istanbul ignore next */ - replaceWith(...nodes) { throw new Error("Mixin: ChildNode not implemented."); } - /* istanbul ignore next */ - remove() { throw new Error("Mixin: ChildNode not implemented."); } + +const parse = __nccwpck_require__(6353) +const valid = (version, options) => { + const v = parse(version, options) + return v ? v.version : null } -exports.CharacterDataImpl = CharacterDataImpl; -//# sourceMappingURL=CharacterDataImpl.js.map +module.exports = valid + /***/ }), -/***/ 3728: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 2088: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.ChildNodeImpl = void 0; -const util_1 = __nccwpck_require__(8247); -const algorithm_1 = __nccwpck_require__(6573); -/** - * Represents a mixin that extends child nodes that can have siblings - * including doctypes. This mixin is implemented by {@link Element}, - * {@link CharacterData} and {@link DocumentType}. - */ -class ChildNodeImpl { - /** @inheritdoc */ - before(...nodes) { - /** - * 1. Let parent be context object’s parent. - * 2. If parent is null, then return. - */ - const context = util_1.Cast.asNode(this); - const parent = context._parent; - if (parent === null) - return; - /** - * 3. Let viablePreviousSibling be context object’s first preceding - * sibling not in nodes, and null otherwise. - */ - let viablePreviousSibling = context._previousSibling; - let flag = true; - while (flag && viablePreviousSibling) { - flag = false; - for (let i = 0; i < nodes.length; i++) { - const child = nodes[i]; - if (child === viablePreviousSibling) { - viablePreviousSibling = viablePreviousSibling._previousSibling; - flag = true; - break; - } - } - } - /** - * 4. Let node be the result of converting nodes into a node, given nodes - * and context object’s node document. - */ - const node = (0, algorithm_1.parentNode_convertNodesIntoANode)(nodes, context._nodeDocument); - /** - * 5. If viablePreviousSibling is null, set it to parent’s first child, - * and to viablePreviousSibling’s next sibling otherwise. - */ - if (viablePreviousSibling === null) - viablePreviousSibling = parent._firstChild; - else - viablePreviousSibling = viablePreviousSibling._nextSibling; - /** - * 6. Pre-insert node into parent before viablePreviousSibling. - */ - (0, algorithm_1.mutation_preInsert)(node, parent, viablePreviousSibling); - } - /** @inheritdoc */ - after(...nodes) { - /** - * 1. Let parent be context object’s parent. - * 2. If parent is null, then return. - */ - const context = util_1.Cast.asNode(this); - const parent = context._parent; - if (!parent) - return; - /** - * 3. Let viableNextSibling be context object’s first following sibling not - * in nodes, and null otherwise. - */ - let viableNextSibling = context._nextSibling; - let flag = true; - while (flag && viableNextSibling) { - flag = false; - for (let i = 0; i < nodes.length; i++) { - const child = nodes[i]; - if (child === viableNextSibling) { - viableNextSibling = viableNextSibling._nextSibling; - flag = true; - break; - } - } - } - /** - * 4. Let node be the result of converting nodes into a node, given nodes - * and context object’s node document. - */ - const node = (0, algorithm_1.parentNode_convertNodesIntoANode)(nodes, context._nodeDocument); - /** - * 5. Pre-insert node into parent before viableNextSibling. - */ - (0, algorithm_1.mutation_preInsert)(node, parent, viableNextSibling); - } - /** @inheritdoc */ - replaceWith(...nodes) { - /** - * 1. Let parent be context object’s parent. - * 2. If parent is null, then return. - */ - const context = util_1.Cast.asNode(this); - const parent = context._parent; - if (!parent) - return; - /** - * 3. Let viableNextSibling be context object’s first following sibling not - * in nodes, and null otherwise. - */ - let viableNextSibling = context._nextSibling; - let flag = true; - while (flag && viableNextSibling) { - flag = false; - for (let i = 0; i < nodes.length; i++) { - const child = nodes[i]; - if (child === viableNextSibling) { - viableNextSibling = viableNextSibling._nextSibling; - flag = true; - break; - } - } - } - /** - * 4. Let node be the result of converting nodes into a node, given nodes - * and context object’s node document. - */ - const node = (0, algorithm_1.parentNode_convertNodesIntoANode)(nodes, context._nodeDocument); - /** - * 5. If context object’s parent is parent, replace the context object with - * node within parent. - * _Note:_ Context object could have been inserted into node. - * 6. Otherwise, pre-insert node into parent before viableNextSibling. - */ - if (context._parent === parent) - (0, algorithm_1.mutation_replace)(context, node, parent); - else - (0, algorithm_1.mutation_preInsert)(node, parent, viableNextSibling); - } - /** @inheritdoc */ - remove() { - /** - * 1. If context object’s parent is null, then return. - * 2. Remove the context object from context object’s parent. - */ - const context = util_1.Cast.asNode(this); - const parent = context._parent; - if (!parent) - return; - (0, algorithm_1.mutation_remove)(context, parent); - } + +// just pre-load all the stuff that index.js lazily exports +const internalRe = __nccwpck_require__(5471) +const constants = __nccwpck_require__(5101) +const SemVer = __nccwpck_require__(7163) +const identifiers = __nccwpck_require__(3348) +const parse = __nccwpck_require__(6353) +const valid = __nccwpck_require__(8780) +const clean = __nccwpck_require__(1799) +const inc = __nccwpck_require__(2338) +const diff = __nccwpck_require__(711) +const major = __nccwpck_require__(8511) +const minor = __nccwpck_require__(2603) +const patch = __nccwpck_require__(8756) +const prerelease = __nccwpck_require__(5714) +const compare = __nccwpck_require__(8469) +const rcompare = __nccwpck_require__(2173) +const compareLoose = __nccwpck_require__(6874) +const compareBuild = __nccwpck_require__(7648) +const sort = __nccwpck_require__(9872) +const rsort = __nccwpck_require__(7192) +const gt = __nccwpck_require__(6599) +const lt = __nccwpck_require__(3872) +const eq = __nccwpck_require__(5082) +const neq = __nccwpck_require__(4974) +const gte = __nccwpck_require__(1236) +const lte = __nccwpck_require__(6717) +const cmp = __nccwpck_require__(8646) +const coerce = __nccwpck_require__(5385) +const truncate = __nccwpck_require__(6114) +const Comparator = __nccwpck_require__(9379) +const Range = __nccwpck_require__(6782) +const satisfies = __nccwpck_require__(8011) +const toComparators = __nccwpck_require__(4750) +const maxSatisfying = __nccwpck_require__(5574) +const minSatisfying = __nccwpck_require__(8595) +const minVersion = __nccwpck_require__(1866) +const validRange = __nccwpck_require__(4737) +const outside = __nccwpck_require__(280) +const gtr = __nccwpck_require__(2276) +const ltr = __nccwpck_require__(5213) +const intersects = __nccwpck_require__(3465) +const simplifyRange = __nccwpck_require__(2028) +const subset = __nccwpck_require__(1489) +module.exports = { + parse, + valid, + clean, + inc, + diff, + major, + minor, + patch, + prerelease, + compare, + rcompare, + compareLoose, + compareBuild, + sort, + rsort, + gt, + lt, + eq, + neq, + gte, + lte, + cmp, + coerce, + truncate, + Comparator, + Range, + satisfies, + toComparators, + maxSatisfying, + minSatisfying, + minVersion, + validRange, + outside, + gtr, + ltr, + intersects, + simplifyRange, + subset, + SemVer, + re: internalRe.re, + src: internalRe.src, + tokens: internalRe.t, + SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION, + RELEASE_TYPES: constants.RELEASE_TYPES, + compareIdentifiers: identifiers.compareIdentifiers, + rcompareIdentifiers: identifiers.rcompareIdentifiers, } -exports.ChildNodeImpl = ChildNodeImpl; -//# sourceMappingURL=ChildNodeImpl.js.map + /***/ }), -/***/ 8223: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 5101: +/***/ ((module) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.CommentImpl = void 0; -const interfaces_1 = __nccwpck_require__(9454); -const CharacterDataImpl_1 = __nccwpck_require__(765); -const WebIDLAlgorithm_1 = __nccwpck_require__(4239); -/** - * Represents a comment node. - */ -class CommentImpl extends CharacterDataImpl_1.CharacterDataImpl { - _nodeType = interfaces_1.NodeType.Comment; - /** - * Initializes a new instance of `Comment`. - * - * @param data - the text content - */ - constructor(data = '') { - super(data); - } - /** - * Creates a new `Comment`. - * - * @param document - owner document - * @param data - node contents - */ - static _create(document, data = '') { - const node = new CommentImpl(data); - node._nodeDocument = document; - return node; - } -} -exports.CommentImpl = CommentImpl; -/** - * Initialize prototype properties - */ -(0, WebIDLAlgorithm_1.idl_defineConst)(CommentImpl.prototype, "_nodeType", interfaces_1.NodeType.Comment); -//# sourceMappingURL=CommentImpl.js.map -/***/ }), +// Note: this is the semver.org version of the spec that it implements +// Not necessarily the package version of this code. +const SEMVER_SPEC_VERSION = '2.0.0' -/***/ 3171: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +const MAX_LENGTH = 256 +const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || +/* istanbul ignore next */ 9007199254740991 +// Max safe segment length for coercion. +const MAX_SAFE_COMPONENT_LENGTH = 16 -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.CustomEventImpl = void 0; -const EventImpl_1 = __nccwpck_require__(2390); -const algorithm_1 = __nccwpck_require__(6573); -/** - * Represents and event that carries custom data. - */ -class CustomEventImpl extends EventImpl_1.EventImpl { - _detail = null; - /** - * Initializes a new instance of `CustomEvent`. - */ - constructor(type, eventInit) { - super(type, eventInit); - this._detail = (eventInit && eventInit.detail) || null; - } - /** @inheritdoc */ - get detail() { return this._detail; } - /** @inheritdoc */ - initCustomEvent(type, bubbles = false, cancelable = false, detail = null) { - /** - * 1. If the context object’s dispatch flag is set, then return. - */ - if (this._dispatchFlag) - return; - /** - * 2. Initialize the context object with type, bubbles, and cancelable. - */ - (0, algorithm_1.event_initialize)(this, type, bubbles, cancelable); - /** - * 3. Set the context object’s detail attribute to detail. - */ - this._detail = detail; - } +// Max safe length for a build identifier. The max length minus 6 characters for +// the shortest version with a build 0.0.0+BUILD. +const MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6 + +const RELEASE_TYPES = [ + 'major', + 'premajor', + 'minor', + 'preminor', + 'patch', + 'prepatch', + 'prerelease', +] + +module.exports = { + MAX_LENGTH, + MAX_SAFE_COMPONENT_LENGTH, + MAX_SAFE_BUILD_LENGTH, + MAX_SAFE_INTEGER, + RELEASE_TYPES, + SEMVER_SPEC_VERSION, + FLAG_INCLUDE_PRERELEASE: 0b001, + FLAG_LOOSE: 0b010, } -exports.CustomEventImpl = CustomEventImpl; -//# sourceMappingURL=CustomEventImpl.js.map -/***/ }), -/***/ 7175: -/***/ ((__unused_webpack_module, exports) => { +/***/ }), +/***/ 1159: +/***/ ((module) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.InvalidCharacterError = exports.SyntaxError = exports.IndexSizeError = exports.NotFoundError = exports.HierarchyRequestError = exports.NotImplementedError = exports.DataCloneError = exports.InvalidNodeTypeError = exports.TimeoutError = exports.QuotaExceededError = exports.URLMismatchError = exports.AbortError = exports.NetworkError = exports.SecurityError = exports.TypeMismatchError = exports.ValidationError = exports.InvalidAccessError = exports.NamespaceError = exports.InvalidModificationError = exports.InvalidStateError = exports.InUseAttributeError = exports.NotSupportedError = exports.NoModificationAllowedError = exports.NoDataAllowedError = exports.WrongDocumentError = exports.DOMStringSizeError = exports.DOMException = void 0; -/** - * Represents the base class of `Error` objects used by this module. - */ -class DOMException extends Error { - /** - * Returns the name of the error message. - */ - name; - /** - * - * @param name - message name - * @param message - error message - */ - constructor(name, message = "") { - super(message); - this.name = name; - } -} -exports.DOMException = DOMException; -class DOMStringSizeError extends DOMException { - /** - * @param message - error message - */ - constructor(message = "") { - super("DOMStringSizeError", message); - } -} -exports.DOMStringSizeError = DOMStringSizeError; -class WrongDocumentError extends DOMException { - /** - * @param message - error message - */ - constructor(message = "") { - super("WrongDocumentError", "The object is in the wrong document. " + message); - } -} -exports.WrongDocumentError = WrongDocumentError; -class NoDataAllowedError extends DOMException { - /** - * @param message - error message - */ - constructor(message = "") { - super("NoDataAllowedError", message); - } -} -exports.NoDataAllowedError = NoDataAllowedError; -class NoModificationAllowedError extends DOMException { - /** - * @param message - error message - */ - constructor(message = "") { - super("NoModificationAllowedError", "The object can not be modified. " + message); - } -} -exports.NoModificationAllowedError = NoModificationAllowedError; -class NotSupportedError extends DOMException { - /** - * @param message - error message - */ - constructor(message = "") { - super("NotSupportedError", "The operation is not supported. " + message); - } -} -exports.NotSupportedError = NotSupportedError; -class InUseAttributeError extends DOMException { - /** - * @param message - error message - */ - constructor(message = "") { - super("InUseAttributeError", message); - } -} -exports.InUseAttributeError = InUseAttributeError; -class InvalidStateError extends DOMException { - /** - * @param message - error message - */ - constructor(message = "") { - super("InvalidStateError", "The object is in an invalid state. " + message); - } -} -exports.InvalidStateError = InvalidStateError; -class InvalidModificationError extends DOMException { - /** - * @param message - error message - */ - constructor(message = "") { - super("InvalidModificationError", "The object can not be modified in this way. " + message); - } -} -exports.InvalidModificationError = InvalidModificationError; -class NamespaceError extends DOMException { - /** - * @param message - error message - */ - constructor(message = "") { - super("NamespaceError", "The operation is not allowed by Namespaces in XML. [XMLNS] " + message); - } -} -exports.NamespaceError = NamespaceError; -class InvalidAccessError extends DOMException { - /** - * @param message - error message - */ - constructor(message = "") { - super("InvalidAccessError", "The object does not support the operation or argument. " + message); - } -} -exports.InvalidAccessError = InvalidAccessError; -class ValidationError extends DOMException { - /** - * @param message - error message - */ - constructor(message = "") { - super("ValidationError", message); - } -} -exports.ValidationError = ValidationError; -class TypeMismatchError extends DOMException { - /** - * @param message - error message - */ - constructor(message = "") { - super("TypeMismatchError", message); - } -} -exports.TypeMismatchError = TypeMismatchError; -class SecurityError extends DOMException { - /** - * @param message - error message - */ - constructor(message = "") { - super("SecurityError", "The operation is insecure. " + message); - } -} -exports.SecurityError = SecurityError; -class NetworkError extends DOMException { - /** - * @param message - error message - */ - constructor(message = "") { - super("NetworkError", "A network error occurred. " + message); - } -} -exports.NetworkError = NetworkError; -class AbortError extends DOMException { - /** - * @param message - error message - */ - constructor(message = "") { - super("AbortError", "The operation was aborted. " + message); - } -} -exports.AbortError = AbortError; -class URLMismatchError extends DOMException { - /** - * @param message - error message - */ - constructor(message = "") { - super("URLMismatchError", "The given URL does not match another URL. " + message); - } -} -exports.URLMismatchError = URLMismatchError; -class QuotaExceededError extends DOMException { - /** - * @param message - error message - */ - constructor(message = "") { - super("QuotaExceededError", "The quota has been exceeded. " + message); - } -} -exports.QuotaExceededError = QuotaExceededError; -class TimeoutError extends DOMException { - /** - * @param message - error message - */ - constructor(message = "") { - super("TimeoutError", "The operation timed out. " + message); - } -} -exports.TimeoutError = TimeoutError; -class InvalidNodeTypeError extends DOMException { - /** - * @param message - error message - */ - constructor(message = "") { - super("InvalidNodeTypeError", "The supplied node is incorrect or has an incorrect ancestor for this operation. " + message); - } -} -exports.InvalidNodeTypeError = InvalidNodeTypeError; -class DataCloneError extends DOMException { - /** - * @param message - error message - */ - constructor(message = "") { - super("DataCloneError", "The object can not be cloned. " + message); - } -} -exports.DataCloneError = DataCloneError; -class NotImplementedError extends DOMException { - /** - * @param message - error message - */ - constructor(message = "") { - super("NotImplementedError", "The DOM method is not implemented by this module. " + message); - } -} -exports.NotImplementedError = NotImplementedError; -class HierarchyRequestError extends DOMException { - /** - * @param message - error message - */ - constructor(message = "") { - super("HierarchyRequestError", "The operation would yield an incorrect node tree. " + message); - } -} -exports.HierarchyRequestError = HierarchyRequestError; -class NotFoundError extends DOMException { - /** - * @param message - error message - */ - constructor(message = "") { - super("NotFoundError", "The object can not be found here. " + message); - } -} -exports.NotFoundError = NotFoundError; -class IndexSizeError extends DOMException { - /** - * @param message - error message - */ - constructor(message = "") { - super("IndexSizeError", "The index is not in the allowed range. " + message); - } -} -exports.IndexSizeError = IndexSizeError; -class SyntaxError extends DOMException { - /** - * @param message - error message - */ - constructor(message = "") { - super("SyntaxError", "The string did not match the expected pattern. " + message); - } -} -exports.SyntaxError = SyntaxError; -class InvalidCharacterError extends DOMException { - /** - * @param message - error message - */ - constructor(message = "") { - super("InvalidCharacterError", "The string contains invalid characters. " + message); - } -} -exports.InvalidCharacterError = InvalidCharacterError; -//# sourceMappingURL=DOMException.js.map -/***/ }), -/***/ 698: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +const debug = ( + typeof process === 'object' && + process.env && + process.env.NODE_DEBUG && + /\bsemver\b/i.test(process.env.NODE_DEBUG) +) ? (...args) => console.error('SEMVER', ...args) + : () => {} +module.exports = debug -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.dom = void 0; -const util_1 = __nccwpck_require__(7061); -const CreateAlgorithm_1 = __nccwpck_require__(8308); -/** - * Represents an object implementing DOM algorithms. - */ -class DOMImpl { - static _instance; - _features = { - mutationObservers: true, - customElements: true, - slots: true, - steps: true - }; - _window = null; - _compareCache; - _rangeList; - /** - * Initializes a new instance of `DOM`. - */ - constructor() { - this._compareCache = new util_1.CompareCache(); - this._rangeList = new util_1.FixedSizeSet(); - } - /** - * Sets DOM algorithm features. - * - * @param features - DOM features supported by algorithms. All features are - * enabled by default unless explicity disabled. - */ - setFeatures(features) { - if (features === undefined) - features = true; - if ((0, util_1.isObject)(features)) { - for (const key in features) { - this._features[key] = features[key] || false; - } - } - else { - // enable/disable all features - for (const key in this._features) { - this._features[key] = features; - } - } - } - /** - * Gets DOM algorithm features. - */ - get features() { return this._features; } - /** - * Gets the DOM window. - */ - get window() { - if (this._window === null) { - this._window = (0, CreateAlgorithm_1.create_window)(); - } - return this._window; - } - /** - * Gets the global node compare cache. - */ - get compareCache() { return this._compareCache; } - /** - * Gets the global range list. - */ - get rangeList() { return this._rangeList; } - /** - * Returns the instance of `DOM`. - */ - static get instance() { - if (!DOMImpl._instance) { - DOMImpl._instance = new DOMImpl(); - } - return DOMImpl._instance; - } -} -/** - * Represents an object implementing DOM algorithms. - */ -exports.dom = DOMImpl.instance; -//# sourceMappingURL=DOMImpl.js.map /***/ }), -/***/ 6348: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 3348: +/***/ ((module) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.DOMImplementationImpl = void 0; -const DOMImpl_1 = __nccwpck_require__(698); -const infra_1 = __nccwpck_require__(4737); -const algorithm_1 = __nccwpck_require__(6573); -const WebIDLAlgorithm_1 = __nccwpck_require__(4239); -/** - * Represents an object providing methods which are not dependent on - * any particular document. - */ -class DOMImplementationImpl { - _ID = "@oozcitak/dom"; - _associatedDocument; - /** - * Initializes a new instance of `DOMImplementation`. - * - * @param document - the associated document - */ - constructor(document) { - this._associatedDocument = document || DOMImpl_1.dom.window.document; - } - /** @inheritdoc */ - createDocumentType(qualifiedName, publicId, systemId) { - /** - * 1. Validate qualifiedName. - * 2. Return a new doctype, with qualifiedName as its name, publicId as its - * public ID, and systemId as its system ID, and with its node document set - * to the associated document of the context object. - */ - (0, algorithm_1.namespace_validate)(qualifiedName); - return (0, algorithm_1.create_documentType)(this._associatedDocument, qualifiedName, publicId, systemId); - } - /** @inheritdoc */ - createDocument(namespace, qualifiedName, doctype = null) { - /** - * 1. Let document be a new XMLDocument. - */ - const document = (0, algorithm_1.create_xmlDocument)(); - /** - * 2. Let element be null. - * 3. If qualifiedName is not the empty string, then set element to - * the result of running the internal createElementNS steps, given document, - * namespace, qualifiedName, and an empty dictionary. - */ - let element = null; - if (qualifiedName) { - element = (0, algorithm_1.document_internalCreateElementNS)(document, namespace, qualifiedName); - } - /** - * 4. If doctype is non-null, append doctype to document. - * 5. If element is non-null, append element to document. - */ - if (doctype) - document.appendChild(doctype); - if (element) - document.appendChild(element); - /** - * 6. document’s origin is context object’s associated document’s origin. - */ - document._origin = this._associatedDocument._origin; - /** - * 7. document’s content type is determined by namespace: - * - HTML namespace - * application/xhtml+xml - * - SVG namespace - * image/svg+xml - * - Any other namespace - * application/xml - */ - if (namespace === infra_1.namespace.HTML) - document._contentType = "application/xhtml+xml"; - else if (namespace === infra_1.namespace.SVG) - document._contentType = "image/svg+xml"; - else - document._contentType = "application/xml"; - /** - * 8. Return document. - */ - return document; - } - /** @inheritdoc */ - createHTMLDocument(title) { - /** - * 1. Let doc be a new document that is an HTML document. - * 2. Set doc’s content type to "text/html". - */ - const doc = (0, algorithm_1.create_document)(); - doc._type = "html"; - doc._contentType = "text/html"; - /** - * 3. Append a new doctype, with "html" as its name and with its node - * document set to doc, to doc. - */ - doc.appendChild((0, algorithm_1.create_documentType)(doc, "html", "", "")); - /** - * 4. Append the result of creating an element given doc, html, and the - * HTML namespace, to doc. - */ - const htmlElement = (0, algorithm_1.element_createAnElement)(doc, "html", infra_1.namespace.HTML); - doc.appendChild(htmlElement); - /** - * 5. Append the result of creating an element given doc, head, and the - * HTML namespace, to the html element created earlier. - */ - const headElement = (0, algorithm_1.element_createAnElement)(doc, "head", infra_1.namespace.HTML); - htmlElement.appendChild(headElement); - /** - * 6. If title is given: - * 6.1. Append the result of creating an element given doc, title, and - * the HTML namespace, to the head element created earlier. - * 6.2. Append a new Text node, with its data set to title (which could - * be the empty string) and its node document set to doc, to the title - * element created earlier. - */ - if (title !== undefined) { - const titleElement = (0, algorithm_1.element_createAnElement)(doc, "title", infra_1.namespace.HTML); - headElement.appendChild(titleElement); - const textElement = (0, algorithm_1.create_text)(doc, title); - titleElement.appendChild(textElement); - } - /** - * 7. Append the result of creating an element given doc, body, and the - * HTML namespace, to the html element created earlier. - */ - const bodyElement = (0, algorithm_1.element_createAnElement)(doc, "body", infra_1.namespace.HTML); - htmlElement.appendChild(bodyElement); - /** - * 8. doc’s origin is context object’s associated document’s origin. - */ - doc._origin = this._associatedDocument._origin; - /** - * 9. Return doc. - */ - return doc; - } - /** @inheritdoc */ - hasFeature() { return true; } - /** - * Creates a new `DOMImplementation`. - * - * @param document - owner document - */ - static _create(document) { - return new DOMImplementationImpl(document); - } -} -exports.DOMImplementationImpl = DOMImplementationImpl; -(0, WebIDLAlgorithm_1.idl_defineConst)(DOMImplementationImpl.prototype, "_ID", "@oozcitak/dom"); -//# sourceMappingURL=DOMImplementationImpl.js.map -/***/ }), +const numeric = /^[0-9]+$/ +const compareIdentifiers = (a, b) => { + if (typeof a === 'number' && typeof b === 'number') { + return a === b ? 0 : a < b ? -1 : 1 + } -/***/ 6629: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + const anum = numeric.test(a) + const bnum = numeric.test(b) + if (anum && bnum) { + a = +a + b = +b + } -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.DOMTokenListImpl = void 0; -const DOMImpl_1 = __nccwpck_require__(698); -const DOMException_1 = __nccwpck_require__(7175); -const infra_1 = __nccwpck_require__(4737); -const algorithm_1 = __nccwpck_require__(6573); -/** - * Represents a token set. - */ -class DOMTokenListImpl { - _element; - _attribute; - _tokenSet; - /** - * Initializes a new instance of `DOMTokenList`. - * - * @param element - associated element - * @param attribute - associated attribute - */ - constructor(element, attribute) { - /** - * 1. Let element be associated element. - * 2. Let localName be associated attribute’s local name. - * 3. Let value be the result of getting an attribute value given element - * and localName. - * 4. Run the attribute change steps for element, localName, value, value, - * and null. - */ - this._element = element; - this._attribute = attribute; - this._tokenSet = new Set(); - const localName = attribute._localName; - const value = (0, algorithm_1.element_getAnAttributeValue)(element, localName); - // define a closure to be called when the associated attribute's value changes - const thisObj = this; - function updateTokenSet(element, localName, oldValue, value, namespace) { - /** - * 1. If localName is associated attribute’s local name, namespace is null, - * and value is null, then empty token set. - * 2. Otherwise, if localName is associated attribute’s local name, - * namespace is null, then set token set to value, parsed. - */ - if (localName === thisObj._attribute._localName && namespace === null) { - if (!value) - thisObj._tokenSet.clear(); - else - thisObj._tokenSet = (0, algorithm_1.orderedSet_parse)(value); - } - } - // add the closure to the associated element's attribute change steps - this._element._attributeChangeSteps.push(updateTokenSet); - if (DOMImpl_1.dom.features.steps) { - (0, algorithm_1.dom_runAttributeChangeSteps)(element, localName, value, value, null); - } - } - /** @inheritdoc */ - get length() { - /** - * The length attribute' getter must return context object’s token set’s - * size. - */ - return this._tokenSet.size; - } - /** @inheritdoc */ - item(index) { - /** - * 1. If index is equal to or greater than context object’s token set’s - * size, then return null. - * 2. Return context object’s token set[index]. - */ - let i = 0; - for (const token of this._tokenSet) { - if (i === index) - return token; - i++; - } - return null; - } - /** @inheritdoc */ - contains(token) { - /** - * The contains(token) method, when invoked, must return true if context - * object’s token set[token] exists, and false otherwise. - */ - return this._tokenSet.has(token); - } - /** @inheritdoc */ - add(...tokens) { - /** - * 1. For each token in tokens: - * 1.1. If token is the empty string, then throw a "SyntaxError" - * DOMException. - * 1.2. If token contains any ASCII whitespace, then throw an - * "InvalidCharacterError" DOMException. - * 2. For each token in tokens, append token to context object’s token set. - * 3. Run the update steps. - */ - for (const token of tokens) { - if (token === '') { - throw new DOMException_1.SyntaxError("Cannot add an empty token."); - } - else if (infra_1.codePoint.ASCIIWhiteSpace.test(token)) { - throw new DOMException_1.InvalidCharacterError("Token cannot contain whitespace."); - } - else { - this._tokenSet.add(token); - } - } - (0, algorithm_1.tokenList_updateSteps)(this); - } - /** @inheritdoc */ - remove(...tokens) { - /** - * 1. For each token in tokens: - * 1.1. If token is the empty string, then throw a "SyntaxError" - * DOMException. - * 1.2. If token contains any ASCII whitespace, then throw an - * "InvalidCharacterError" DOMException. - * 2. For each token in tokens, remove token from context object’s token set. - * 3. Run the update steps. - */ - for (const token of tokens) { - if (token === '') { - throw new DOMException_1.SyntaxError("Cannot remove an empty token."); - } - else if (infra_1.codePoint.ASCIIWhiteSpace.test(token)) { - throw new DOMException_1.InvalidCharacterError("Token cannot contain whitespace."); - } - else { - this._tokenSet.delete(token); - } - } - (0, algorithm_1.tokenList_updateSteps)(this); - } - /** @inheritdoc */ - toggle(token, force = undefined) { - /** - * 1. If token is the empty string, then throw a "SyntaxError" DOMException. - * 2. If token contains any ASCII whitespace, then throw an - * "InvalidCharacterError" DOMException. - */ - if (token === '') { - throw new DOMException_1.SyntaxError("Cannot toggle an empty token."); - } - else if (infra_1.codePoint.ASCIIWhiteSpace.test(token)) { - throw new DOMException_1.InvalidCharacterError("Token cannot contain whitespace."); - } - /** - * 3. If context object’s token set[token] exists, then: - */ - if (this._tokenSet.has(token)) { - /** - * 3.1. If force is either not given or is false, then remove token from - * context object’s token set, run the update steps and return false. - * 3.2. Return true. - */ - if (force === undefined || force === false) { - this._tokenSet.delete(token); - (0, algorithm_1.tokenList_updateSteps)(this); - return false; - } - return true; - } - /** - * 4. Otherwise, if force not given or is true, append token to context - * object’s token set, run the update steps, and return true. - */ - if (force === undefined || force === true) { - this._tokenSet.add(token); - (0, algorithm_1.tokenList_updateSteps)(this); - return true; - } - /** - * 5. Return false. - */ - return false; - } - /** @inheritdoc */ - replace(token, newToken) { - /** - * 1. If either token or newToken is the empty string, then throw a - * "SyntaxError" DOMException. - * 2. If either token or newToken contains any ASCII whitespace, then throw - * an "InvalidCharacterError" DOMException. - */ - if (token === '' || newToken === '') { - throw new DOMException_1.SyntaxError("Cannot replace an empty token."); - } - else if (infra_1.codePoint.ASCIIWhiteSpace.test(token) || infra_1.codePoint.ASCIIWhiteSpace.test(newToken)) { - throw new DOMException_1.InvalidCharacterError("Token cannot contain whitespace."); - } - /** - * 3. If context object’s token set does not contain token, then return - * false. - */ - if (!this._tokenSet.has(token)) - return false; - /** - * 4. Replace token in context object’s token set with newToken. - * 5. Run the update steps. - * 6. Return true. - */ - infra_1.set.replace(this._tokenSet, token, newToken); - (0, algorithm_1.tokenList_updateSteps)(this); - return true; - } - /** @inheritdoc */ - supports(token) { - /** - * 1. Let result be the return value of validation steps called with token. - * 2. Return result. - */ - return (0, algorithm_1.tokenList_validationSteps)(this, token); - } - /** @inheritdoc */ - get value() { - /** - * The value attribute must return the result of running context object’s - * serialize steps. - */ - return (0, algorithm_1.tokenList_serializeSteps)(this); - } - set value(value) { - /** - * Setting the value attribute must set an attribute value for the - * associated element using associated attribute’s local name and the given - * value. - */ - (0, algorithm_1.element_setAnAttributeValue)(this._element, this._attribute._localName, value); - } - /** - * Returns an iterator for the token set. - */ - [Symbol.iterator]() { - const it = this._tokenSet[Symbol.iterator](); - return { - next() { - return it.next(); - } - }; - } - /** - * Creates a new `DOMTokenList`. - * - * @param element - associated element - * @param attribute - associated attribute - */ - static _create(element, attribute) { - return new DOMTokenListImpl(element, attribute); - } + return a === b ? 0 + : (anum && !bnum) ? -1 + : (bnum && !anum) ? 1 + : a < b ? -1 + : 1 } -exports.DOMTokenListImpl = DOMTokenListImpl; -//# sourceMappingURL=DOMTokenListImpl.js.map - -/***/ }), - -/***/ 9793: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a) -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.DocumentFragmentImpl = void 0; -const interfaces_1 = __nccwpck_require__(9454); -const NodeImpl_1 = __nccwpck_require__(2280); -const WebIDLAlgorithm_1 = __nccwpck_require__(4239); -/** - * Represents a document fragment in the XML tree. - */ -class DocumentFragmentImpl extends NodeImpl_1.NodeImpl { - _nodeType = interfaces_1.NodeType.DocumentFragment; - _children = new Set(); - _host; - /** - * Initializes a new instance of `DocumentFragment`. - * - * @param host - shadow root's host element - */ - constructor(host = null) { - super(); - this._host = host; - } - // MIXIN: NonElementParentNode - /* istanbul ignore next */ - getElementById(elementId) { throw new Error("Mixin: NonElementParentNode not implemented."); } - // MIXIN: ParentNode - /* istanbul ignore next */ - get children() { throw new Error("Mixin: ParentNode not implemented."); } - /* istanbul ignore next */ - get firstElementChild() { throw new Error("Mixin: ParentNode not implemented."); } - /* istanbul ignore next */ - get lastElementChild() { throw new Error("Mixin: ParentNode not implemented."); } - /* istanbul ignore next */ - get childElementCount() { throw new Error("Mixin: ParentNode not implemented."); } - /* istanbul ignore next */ - prepend(...nodes) { throw new Error("Mixin: ParentNode not implemented."); } - /* istanbul ignore next */ - append(...nodes) { throw new Error("Mixin: ParentNode not implemented."); } - /* istanbul ignore next */ - querySelector(selectors) { throw new Error("Mixin: ParentNode not implemented."); } - /* istanbul ignore next */ - querySelectorAll(selectors) { throw new Error("Mixin: ParentNode not implemented."); } - /** - * Creates a new `DocumentFragment`. - * - * @param document - owner document - * @param host - shadow root's host element - */ - static _create(document, host = null) { - const node = new DocumentFragmentImpl(host); - node._nodeDocument = document; - return node; - } +module.exports = { + compareIdentifiers, + rcompareIdentifiers, } -exports.DocumentFragmentImpl = DocumentFragmentImpl; -/** - * Initialize prototype properties - */ -(0, WebIDLAlgorithm_1.idl_defineConst)(DocumentFragmentImpl.prototype, "_nodeType", interfaces_1.NodeType.DocumentFragment); -//# sourceMappingURL=DocumentFragmentImpl.js.map + /***/ }), -/***/ 2113: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 1383: +/***/ ((module) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.DocumentImpl = void 0; -const DOMImpl_1 = __nccwpck_require__(698); -const interfaces_1 = __nccwpck_require__(9454); -const DOMException_1 = __nccwpck_require__(7175); -const NodeImpl_1 = __nccwpck_require__(2280); -const util_1 = __nccwpck_require__(8247); -const util_2 = __nccwpck_require__(7061); -const infra_1 = __nccwpck_require__(4737); -const URLAlgorithm_1 = __nccwpck_require__(3650); -const algorithm_1 = __nccwpck_require__(6573); -const WebIDLAlgorithm_1 = __nccwpck_require__(4239); -/** - * Represents a document node. - */ -class DocumentImpl extends NodeImpl_1.NodeImpl { - _nodeType = interfaces_1.NodeType.Document; - _children = new Set(); - _encoding = { - name: "UTF-8", - labels: ["unicode-1-1-utf-8", "utf-8", "utf8"] - }; - _contentType = 'application/xml'; - _URL = { - scheme: "about", - username: "", - password: "", - host: null, - port: null, - path: ["blank"], - query: null, - fragment: null, - _cannotBeABaseURLFlag: true, - _blobURLEntry: null - }; - _origin = null; - _type = "xml"; - _mode = "no-quirks"; - _implementation; - _documentElement = null; - _hasNamespaces = false; - _nodeDocumentOverwrite = null; - get _nodeDocument() { return this._nodeDocumentOverwrite || this; } - set _nodeDocument(val) { this._nodeDocumentOverwrite = val; } - /** - * Initializes a new instance of `Document`. - */ - constructor() { - super(); - } - /** @inheritdoc */ - get implementation() { - /** - * The implementation attribute’s getter must return the DOMImplementation - * object that is associated with the document. - */ - return this._implementation || (this._implementation = (0, algorithm_1.create_domImplementation)(this)); - } - /** @inheritdoc */ - get URL() { - /** - * The URL attribute’s getter and documentURI attribute’s getter must return - * the URL, serialized. - * See: https://url.spec.whatwg.org/#concept-url-serializer - */ - return (0, URLAlgorithm_1.urlSerializer)(this._URL); - } - /** @inheritdoc */ - get documentURI() { return this.URL; } - /** @inheritdoc */ - get origin() { - return "null"; - } - /** @inheritdoc */ - get compatMode() { - /** - * The compatMode attribute’s getter must return "BackCompat" if context - * object’s mode is "quirks", and "CSS1Compat" otherwise. - */ - return this._mode === "quirks" ? "BackCompat" : "CSS1Compat"; - } - /** @inheritdoc */ - get characterSet() { - /** - * The characterSet attribute’s getter, charset attribute’s getter, and - * inputEncoding attribute’s getter, must return context object’s - * encoding’s name. - */ - return this._encoding.name; - } - /** @inheritdoc */ - get charset() { return this._encoding.name; } - /** @inheritdoc */ - get inputEncoding() { return this._encoding.name; } - /** @inheritdoc */ - get contentType() { - /** - * The contentType attribute’s getter must return the content type. - */ - return this._contentType; - } - /** @inheritdoc */ - get doctype() { - /** - * The doctype attribute’s getter must return the child of the document - * that is a doctype, and null otherwise. - */ - for (const child of this._children) { - if (util_1.Guard.isDocumentTypeNode(child)) - return child; - } - return null; - } - /** @inheritdoc */ - get documentElement() { - /** - * The documentElement attribute’s getter must return the document element. - */ - return this._documentElement; - } - /** @inheritdoc */ - getElementsByTagName(qualifiedName) { - /** - * The getElementsByTagName(qualifiedName) method, when invoked, must return - * the list of elements with qualified name qualifiedName for the context object. - */ - return (0, algorithm_1.node_listOfElementsWithQualifiedName)(qualifiedName, this); - } - /** @inheritdoc */ - getElementsByTagNameNS(namespace, localName) { - /** - * The getElementsByTagNameNS(namespace, localName) method, when invoked, - * must return the list of elements with namespace namespace and local name - * localName for the context object. - */ - return (0, algorithm_1.node_listOfElementsWithNamespace)(namespace, localName, this); - } - /** @inheritdoc */ - getElementsByClassName(classNames) { - /** - * The getElementsByClassName(classNames) method, when invoked, must return - * the list of elements with class names classNames for the context object. - */ - return (0, algorithm_1.node_listOfElementsWithClassNames)(classNames, this); - } - /** @inheritdoc */ - createElement(localName, options) { - /** - * 1. If localName does not match the Name production, then throw an - * "InvalidCharacterError" DOMException. - * 2. If the context object is an HTML document, then set localName to - * localName in ASCII lowercase. - * 3. Let is be null. - * 4. If options is a dictionary and options’s is is present, then set is - * to it. - * 5. Let namespace be the HTML namespace, if the context object is an - * HTML document or context object’s content type is - * "application/xhtml+xml", and null otherwise. - * 6. Return the result of creating an element given the context object, - * localName, namespace, null, is, and with the synchronous custom elements - * flag set. - */ - if (!(0, algorithm_1.xml_isName)(localName)) - throw new DOMException_1.InvalidCharacterError(); - if (this._type === "html") - localName = localName.toLowerCase(); - let is = null; - if (options !== undefined) { - if ((0, util_2.isString)(options)) { - is = options; - } - else { - is = options.is; - } - } - const namespace = (this._type === "html" || this._contentType === "application/xhtml+xml") ? - infra_1.namespace.HTML : null; - return (0, algorithm_1.element_createAnElement)(this, localName, namespace, null, is, true); - } - /** @inheritdoc */ - createElementNS(namespace, qualifiedName, options) { - /** - * The createElementNS(namespace, qualifiedName, options) method, when - * invoked, must return the result of running the internal createElementNS - * steps, given context object, namespace, qualifiedName, and options. - */ - return (0, algorithm_1.document_internalCreateElementNS)(this, namespace, qualifiedName, options); - } - /** @inheritdoc */ - createDocumentFragment() { - /** - * The createDocumentFragment() method, when invoked, must return a new - * DocumentFragment node with its node document set to the context object. - */ - return (0, algorithm_1.create_documentFragment)(this); - } - /** @inheritdoc */ - createTextNode(data) { - /** - * The createTextNode(data) method, when invoked, must return a new Text - * node with its data set to data and node document set to the context object. - */ - return (0, algorithm_1.create_text)(this, data); - } - /** @inheritdoc */ - createCDATASection(data) { - /** - * 1. If context object is an HTML document, then throw a - * "NotSupportedError" DOMException. - * 2. If data contains the string "]]>", then throw an - * "InvalidCharacterError" DOMException. - * 3. Return a new CDATASection node with its data set to data and node - * document set to the context object. - */ - if (this._type === "html") - throw new DOMException_1.NotSupportedError(); - if (data.indexOf(']]>') !== -1) - throw new DOMException_1.InvalidCharacterError(); - return (0, algorithm_1.create_cdataSection)(this, data); - } - /** @inheritdoc */ - createComment(data) { - /** - * The createComment(data) method, when invoked, must return a new Comment - * node with its data set to data and node document set to the context object. - */ - return (0, algorithm_1.create_comment)(this, data); - } - /** @inheritdoc */ - createProcessingInstruction(target, data) { - /** - * 1. If target does not match the Name production, then throw an - * "InvalidCharacterError" DOMException. - * 2. If data contains the string "?>", then throw an - * "InvalidCharacterError" DOMException. - * 3. Return a new ProcessingInstruction node, with target set to target, - * data set to data, and node document set to the context object. - */ - if (!(0, algorithm_1.xml_isName)(target)) - throw new DOMException_1.InvalidCharacterError(); - if (data.indexOf("?>") !== -1) - throw new DOMException_1.InvalidCharacterError(); - return (0, algorithm_1.create_processingInstruction)(this, target, data); - } - /** @inheritdoc */ - importNode(node, deep = false) { - /** - * 1. If node is a document or shadow root, then throw a "NotSupportedError" DOMException. - */ - if (util_1.Guard.isDocumentNode(node) || util_1.Guard.isShadowRoot(node)) - throw new DOMException_1.NotSupportedError(); - /** - * 2. Return a clone of node, with context object and the clone children flag set if deep is true. - */ - return (0, algorithm_1.node_clone)(node, this, deep); - } - /** @inheritdoc */ - adoptNode(node) { - /** - * 1. If node is a document, then throw a "NotSupportedError" DOMException. - */ - if (util_1.Guard.isDocumentNode(node)) - throw new DOMException_1.NotSupportedError(); - /** - * 2. If node is a shadow root, then throw a "HierarchyRequestError" DOMException. - */ - if (util_1.Guard.isShadowRoot(node)) - throw new DOMException_1.HierarchyRequestError(); - /** - * 3. Adopt node into the context object. - * 4. Return node. - */ - (0, algorithm_1.document_adopt)(node, this); - return node; - } - /** @inheritdoc */ - createAttribute(localName) { - /** - * 1. If localName does not match the Name production in XML, then throw - * an "InvalidCharacterError" DOMException. - * 2. If the context object is an HTML document, then set localName to - * localName in ASCII lowercase. - * 3. Return a new attribute whose local name is localName and node document - * is context object. - */ - if (!(0, algorithm_1.xml_isName)(localName)) - throw new DOMException_1.InvalidCharacterError(); - if (this._type === "html") { - localName = localName.toLowerCase(); - } - const attr = (0, algorithm_1.create_attr)(this, localName); - return attr; - } - /** @inheritdoc */ - createAttributeNS(namespace, qualifiedName) { - /** - * 1. Let namespace, prefix, and localName be the result of passing - * namespace and qualifiedName to validate and extract. - * 2. Return a new attribute whose namespace is namespace, namespace prefix - * is prefix, local name is localName, and node document is context object. - */ - const [ns, prefix, localName] = (0, algorithm_1.namespace_validateAndExtract)(namespace, qualifiedName); - const attr = (0, algorithm_1.create_attr)(this, localName); - attr._namespace = ns; - attr._namespacePrefix = prefix; - return attr; - } - /** @inheritdoc */ - createEvent(eventInterface) { - return (0, algorithm_1.event_createLegacyEvent)(eventInterface); - } - /** @inheritdoc */ - createRange() { - /** - * The createRange() method, when invoked, must return a new live range - * with (context object, 0) as its start and end. - */ - const range = (0, algorithm_1.create_range)(); - range._start = [this, 0]; - range._end = [this, 0]; - return range; - } - /** @inheritdoc */ - createNodeIterator(root, whatToShow = interfaces_1.WhatToShow.All, filter = null) { - /** - * 1. Let iterator be a new NodeIterator object. - * 2. Set iterator’s root and iterator’s reference to root. - * 3. Set iterator’s pointer before reference to true. - * 4. Set iterator’s whatToShow to whatToShow. - * 5. Set iterator’s filter to filter. - * 6. Return iterator. - */ - const iterator = (0, algorithm_1.create_nodeIterator)(root, root, true); - iterator._whatToShow = whatToShow; - iterator._iteratorCollection = (0, algorithm_1.create_nodeList)(root); - if ((0, util_2.isFunction)(filter)) { - iterator._filter = (0, algorithm_1.create_nodeFilter)(); - iterator._filter.acceptNode = filter; - } - else { - iterator._filter = filter; - } - return iterator; - } - /** @inheritdoc */ - createTreeWalker(root, whatToShow = interfaces_1.WhatToShow.All, filter = null) { - /** - * 1. Let walker be a new TreeWalker object. - * 2. Set walker’s root and walker’s current to root. - * 3. Set walker’s whatToShow to whatToShow. - * 4. Set walker’s filter to filter. - * 5. Return walker. - */ - const walker = (0, algorithm_1.create_treeWalker)(root, root); - walker._whatToShow = whatToShow; - if ((0, util_2.isFunction)(filter)) { - walker._filter = (0, algorithm_1.create_nodeFilter)(); - walker._filter.acceptNode = filter; - } - else { - walker._filter = filter; - } - return walker; - } - /** - * Gets the parent event target for the given event. - * - * @param event - an event - */ - _getTheParent(event) { - /** - * TODO: Implement realms - * A document’s get the parent algorithm, given an event, returns null if - * event’s type attribute value is "load" or document does not have a - * browsing context, and the document’s relevant global object otherwise. - */ - if (event._type === "load") { - return null; - } - else { - return DOMImpl_1.dom.window; - } + +class LRUCache { + constructor () { + this.max = 1000 + this.map = new Map() + } + + get (key) { + const value = this.map.get(key) + if (value === undefined) { + return undefined + } else { + // Remove the key from the map and add it to the end + this.map.delete(key) + this.map.set(key, value) + return value } - // MIXIN: NonElementParentNode - /* istanbul ignore next */ - getElementById(elementId) { throw new Error("Mixin: NonElementParentNode not implemented."); } - // MIXIN: DocumentOrShadowRoot - // No elements - // MIXIN: ParentNode - /* istanbul ignore next */ - get children() { throw new Error("Mixin: ParentNode not implemented."); } - /* istanbul ignore next */ - get firstElementChild() { throw new Error("Mixin: ParentNode not implemented."); } - /* istanbul ignore next */ - get lastElementChild() { throw new Error("Mixin: ParentNode not implemented."); } - /* istanbul ignore next */ - get childElementCount() { throw new Error("Mixin: ParentNode not implemented."); } - /* istanbul ignore next */ - prepend(...nodes) { throw new Error("Mixin: ParentNode not implemented."); } - /* istanbul ignore next */ - append(...nodes) { throw new Error("Mixin: ParentNode not implemented."); } - /* istanbul ignore next */ - querySelector(selectors) { throw new Error("Mixin: ParentNode not implemented."); } - /* istanbul ignore next */ - querySelectorAll(selectors) { throw new Error("Mixin: ParentNode not implemented."); } -} -exports.DocumentImpl = DocumentImpl; -/** - * Initialize prototype properties - */ -(0, WebIDLAlgorithm_1.idl_defineConst)(DocumentImpl.prototype, "_nodeType", interfaces_1.NodeType.Document); -//# sourceMappingURL=DocumentImpl.js.map + } -/***/ }), + delete (key) { + return this.map.delete(key) + } -/***/ 8024: -/***/ ((__unused_webpack_module, exports) => { + set (key, value) { + const deleted = this.delete(key) + if (!deleted && value !== undefined) { + // If cache is full, delete the least recently used item + if (this.map.size >= this.max) { + const firstKey = this.map.keys().next().value + this.delete(firstKey) + } -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.DocumentOrShadowRootImpl = void 0; -/** - * Represents a mixin for an interface to be used to share APIs between - * documents and shadow roots. This mixin is implemented by - * {@link Document} and {@link ShadowRoot}. - * - * _Note:_ The DocumentOrShadowRoot mixin is expected to be used by other - * standards that want to define APIs shared between documents and shadow roots. - */ -class DocumentOrShadowRootImpl { + this.map.set(key, value) + } + + return this + } } -exports.DocumentOrShadowRootImpl = DocumentOrShadowRootImpl; -//# sourceMappingURL=DocumentOrShadowRootImpl.js.map + +module.exports = LRUCache + /***/ }), -/***/ 1401: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 356: +/***/ ((module) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.DocumentTypeImpl = void 0; -const interfaces_1 = __nccwpck_require__(9454); -const NodeImpl_1 = __nccwpck_require__(2280); -const WebIDLAlgorithm_1 = __nccwpck_require__(4239); -/** - * Represents an object providing methods which are not dependent on - * any particular document - */ -class DocumentTypeImpl extends NodeImpl_1.NodeImpl { - _nodeType = interfaces_1.NodeType.DocumentType; - _name = ''; - _publicId = ''; - _systemId = ''; - /** - * Initializes a new instance of `DocumentType`. - * - * @param name - name of the node - * @param publicId - `PUBLIC` identifier - * @param systemId - `SYSTEM` identifier - */ - constructor(name, publicId, systemId) { - super(); - this._name = name; - this._publicId = publicId; - this._systemId = systemId; - } - /** @inheritdoc */ - get name() { return this._name; } - /** @inheritdoc */ - get publicId() { return this._publicId; } - /** @inheritdoc */ - get systemId() { return this._systemId; } - // MIXIN: ChildNode - /* istanbul ignore next */ - before(...nodes) { throw new Error("Mixin: ChildNode not implemented."); } - /* istanbul ignore next */ - after(...nodes) { throw new Error("Mixin: ChildNode not implemented."); } - /* istanbul ignore next */ - replaceWith(...nodes) { throw new Error("Mixin: ChildNode not implemented."); } - /* istanbul ignore next */ - remove() { throw new Error("Mixin: ChildNode not implemented."); } - /** - * Creates a new `DocumentType`. - * - * @param document - owner document - * @param name - name of the node - * @param publicId - `PUBLIC` identifier - * @param systemId - `SYSTEM` identifier - */ - static _create(document, name, publicId = '', systemId = '') { - const node = new DocumentTypeImpl(name, publicId, systemId); - node._nodeDocument = document; - return node; - } + +// parse out just the options we care about +const looseOption = Object.freeze({ loose: true }) +const emptyOpts = Object.freeze({ }) +const parseOptions = options => { + if (!options) { + return emptyOpts + } + + if (typeof options !== 'object') { + return looseOption + } + + return options } -exports.DocumentTypeImpl = DocumentTypeImpl; -/** - * Initialize prototype properties - */ -(0, WebIDLAlgorithm_1.idl_defineConst)(DocumentTypeImpl.prototype, "_nodeType", interfaces_1.NodeType.DocumentType); -//# sourceMappingURL=DocumentTypeImpl.js.map +module.exports = parseOptions + /***/ }), -/***/ 1342: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 5471: +/***/ ((module, exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.ElementImpl = void 0; -const interfaces_1 = __nccwpck_require__(9454); -const NodeImpl_1 = __nccwpck_require__(2280); -const DOMException_1 = __nccwpck_require__(7175); -const infra_1 = __nccwpck_require__(4737); -const algorithm_1 = __nccwpck_require__(6573); -const WebIDLAlgorithm_1 = __nccwpck_require__(4239); -/** - * Represents an element node. - */ -class ElementImpl extends NodeImpl_1.NodeImpl { - _nodeType = interfaces_1.NodeType.Element; - _children = new Set(); - _namespace = null; - _namespacePrefix = null; - _localName = ""; - _customElementState = "undefined"; - _customElementDefinition = null; - _is = null; - _shadowRoot = null; - _attributeList = (0, algorithm_1.create_namedNodeMap)(this); - _uniqueIdentifier; - _attributeChangeSteps = []; - _name = ''; - _assignedSlot = null; - /** - * Initializes a new instance of `Element`. - */ - constructor() { - super(); - } - /** @inheritdoc */ - get namespaceURI() { return this._namespace; } - /** @inheritdoc */ - get prefix() { return this._namespacePrefix; } - /** @inheritdoc */ - get localName() { return this._localName; } - /** @inheritdoc */ - get tagName() { return this._htmlUppercasedQualifiedName; } - /** @inheritdoc */ - get id() { - return (0, algorithm_1.element_getAnAttributeValue)(this, "id"); - } - set id(value) { - (0, algorithm_1.element_setAnAttributeValue)(this, "id", value); - } - /** @inheritdoc */ - get className() { - return (0, algorithm_1.element_getAnAttributeValue)(this, "class"); - } - set className(value) { - (0, algorithm_1.element_setAnAttributeValue)(this, "class", value); - } - /** @inheritdoc */ - get classList() { - let attr = (0, algorithm_1.element_getAnAttributeByName)("class", this); - if (attr === null) { - attr = (0, algorithm_1.create_attr)(this._nodeDocument, "class"); - } - return (0, algorithm_1.create_domTokenList)(this, attr); - } - /** @inheritdoc */ - get slot() { - return (0, algorithm_1.element_getAnAttributeValue)(this, "slot"); - } - set slot(value) { - (0, algorithm_1.element_setAnAttributeValue)(this, "slot", value); - } - /** @inheritdoc */ - hasAttributes() { - return this._attributeList.length !== 0; - } - /** @inheritdoc */ - get attributes() { return this._attributeList; } - /** @inheritdoc */ - getAttributeNames() { - /** - * The getAttributeNames() method, when invoked, must return the qualified - * names of the attributes in context object’s attribute list, in order, - * and a new list otherwise. - */ - const names = []; - for (const attr of this._attributeList) { - names.push(attr._qualifiedName); - } - return names; - } - /** @inheritdoc */ - getAttribute(qualifiedName) { - /** - * 1. Let attr be the result of getting an attribute given qualifiedName - * and the context object. - * 2. If attr is null, return null. - * 3. Return attr’s value. - */ - const attr = (0, algorithm_1.element_getAnAttributeByName)(qualifiedName, this); - return (attr ? attr._value : null); - } - /** @inheritdoc */ - getAttributeNS(namespace, localName) { - /** - * 1. Let attr be the result of getting an attribute given namespace, - * localName, and the context object. - * 2. If attr is null, return null. - * 3. Return attr’s value. - */ - const attr = (0, algorithm_1.element_getAnAttributeByNamespaceAndLocalName)(namespace, localName, this); - return (attr ? attr._value : null); - } - /** @inheritdoc */ - setAttribute(qualifiedName, value) { - /** - * 1. If qualifiedName does not match the Name production in XML, then - * throw an "InvalidCharacterError" DOMException. - */ - if (!(0, algorithm_1.xml_isName)(qualifiedName)) - throw new DOMException_1.InvalidCharacterError(); - /** - * 2. If the context object is in the HTML namespace and its node document - * is an HTML document, then set qualifiedName to qualifiedName in ASCII - * lowercase. - */ - if (this._namespace === infra_1.namespace.HTML && this._nodeDocument._type === "html") { - qualifiedName = qualifiedName.toLowerCase(); - } - /** - * 3. Let attribute be the first attribute in context object’s attribute - * list whose qualified name is qualifiedName, and null otherwise. - */ - let attribute = null; - for (let i = 0; i < this._attributeList.length; i++) { - const attr = this._attributeList[i]; - if (attr._qualifiedName === qualifiedName) { - attribute = attr; - break; - } - } - /** - * 4. If attribute is null, create an attribute whose local name is - * qualifiedName, value is value, and node document is context object’s - * node document, then append this attribute to context object, and - * then return. - */ - if (attribute === null) { - attribute = (0, algorithm_1.create_attr)(this._nodeDocument, qualifiedName); - attribute._value = value; - (0, algorithm_1.element_append)(attribute, this); - return; - } - /** - * 5. Change attribute from context object to value. - */ - (0, algorithm_1.element_change)(attribute, this, value); - } - /** @inheritdoc */ - setAttributeNS(namespace, qualifiedName, value) { - /** - * 1. Let namespace, prefix, and localName be the result of passing - * namespace and qualifiedName to validate and extract. - * 2. Set an attribute value for the context object using localName, value, - * and also prefix and namespace. - */ - const [ns, prefix, localName] = (0, algorithm_1.namespace_validateAndExtract)(namespace, qualifiedName); - (0, algorithm_1.element_setAnAttributeValue)(this, localName, value, prefix, ns); - } - /** @inheritdoc */ - removeAttribute(qualifiedName) { - /** - * The removeAttribute(qualifiedName) method, when invoked, must remove an - * attribute given qualifiedName and the context object, and then return - * undefined. - */ - (0, algorithm_1.element_removeAnAttributeByName)(qualifiedName, this); - } - /** @inheritdoc */ - removeAttributeNS(namespace, localName) { - /** - * The removeAttributeNS(namespace, localName) method, when invoked, must - * remove an attribute given namespace, localName, and context object, and - * then return undefined. - */ - (0, algorithm_1.element_removeAnAttributeByNamespaceAndLocalName)(namespace, localName, this); - } - /** @inheritdoc */ - hasAttribute(qualifiedName) { - /** - * 1. If the context object is in the HTML namespace and its node document - * is an HTML document, then set qualifiedName to qualifiedName in ASCII - * lowercase. - * 2. Return true if the context object has an attribute whose qualified - * name is qualifiedName, and false otherwise. - */ - if (this._namespace === infra_1.namespace.HTML && this._nodeDocument._type === "html") { - qualifiedName = qualifiedName.toLowerCase(); - } - for (let i = 0; i < this._attributeList.length; i++) { - const attr = this._attributeList[i]; - if (attr._qualifiedName === qualifiedName) { - return true; - } - } - return false; - } - /** @inheritdoc */ - toggleAttribute(qualifiedName, force) { - /** - * 1. If qualifiedName does not match the Name production in XML, then - * throw an "InvalidCharacterError" DOMException. - */ - if (!(0, algorithm_1.xml_isName)(qualifiedName)) - throw new DOMException_1.InvalidCharacterError(); - /** - * 2. If the context object is in the HTML namespace and its node document - * is an HTML document, then set qualifiedName to qualifiedName in ASCII - * lowercase. - */ - if (this._namespace === infra_1.namespace.HTML && this._nodeDocument._type === "html") { - qualifiedName = qualifiedName.toLowerCase(); - } - /** - * 3. Let attribute be the first attribute in the context object’s attribute - * list whose qualified name is qualifiedName, and null otherwise. - */ - let attribute = null; - for (let i = 0; i < this._attributeList.length; i++) { - const attr = this._attributeList[i]; - if (attr._qualifiedName === qualifiedName) { - attribute = attr; - break; - } - } - if (attribute === null) { - /** - * 4. If attribute is null, then: - * 4.1. If force is not given or is true, create an attribute whose local - * name is qualifiedName, value is the empty string, and node document is - * the context object’s node document, then append this attribute to the - * context object, and then return true. - * 4.2. Return false. - */ - if (force === undefined || force === true) { - attribute = (0, algorithm_1.create_attr)(this._nodeDocument, qualifiedName); - attribute._value = ''; - (0, algorithm_1.element_append)(attribute, this); - return true; - } - return false; - } - else if (force === undefined || force === false) { - /** - * 5. Otherwise, if force is not given or is false, remove an attribute - * given qualifiedName and the context object, and then return false. - */ - (0, algorithm_1.element_removeAnAttributeByName)(qualifiedName, this); - return false; - } - /** - * 6. Return true. - */ - return true; - } - /** @inheritdoc */ - hasAttributeNS(namespace, localName) { - /** - * 1. If namespace is the empty string, set it to null. - * 2. Return true if the context object has an attribute whose namespace is - * namespace and local name is localName, and false otherwise. - */ - const ns = namespace || null; - for (let i = 0; i < this._attributeList.length; i++) { - const attr = this._attributeList[i]; - if (attr._namespace === ns && attr._localName === localName) { - return true; - } - } - return false; - } - /** @inheritdoc */ - getAttributeNode(qualifiedName) { - /** - * The getAttributeNode(qualifiedName) method, when invoked, must return the - * result of getting an attribute given qualifiedName and context object. - */ - return (0, algorithm_1.element_getAnAttributeByName)(qualifiedName, this); - } - /** @inheritdoc */ - getAttributeNodeNS(namespace, localName) { - /** - * The getAttributeNodeNS(namespace, localName) method, when invoked, must - * return the result of getting an attribute given namespace, localName, and - * the context object. - */ - return (0, algorithm_1.element_getAnAttributeByNamespaceAndLocalName)(namespace, localName, this); - } - /** @inheritdoc */ - setAttributeNode(attr) { - /** - * The setAttributeNode(attr) and setAttributeNodeNS(attr) methods, when - * invoked, must return the result of setting an attribute given attr and - * the context object. - */ - return (0, algorithm_1.element_setAnAttribute)(attr, this); - } - /** @inheritdoc */ - setAttributeNodeNS(attr) { - return (0, algorithm_1.element_setAnAttribute)(attr, this); - } - /** @inheritdoc */ - removeAttributeNode(attr) { - /** - * 1. If context object’s attribute list does not contain attr, then throw - * a "NotFoundError" DOMException. - * 2. Remove attr from context object. - * 3. Return attr. - */ - let found = false; - for (let i = 0; i < this._attributeList.length; i++) { - const attribute = this._attributeList[i]; - if (attribute === attr) { - found = true; - break; - } - } - if (!found) - throw new DOMException_1.NotFoundError(); - (0, algorithm_1.element_remove)(attr, this); - return attr; - } - /** @inheritdoc */ - attachShadow(init) { - /** - * 1. If context object’s namespace is not the HTML namespace, then throw a - * "NotSupportedError" DOMException. - */ - if (this._namespace !== infra_1.namespace.HTML) - throw new DOMException_1.NotSupportedError(); - /** - * 2. If context object’s local name is not a valid custom element name, - * "article", "aside", "blockquote", "body", "div", "footer", "h1", "h2", - * "h3", "h4", "h5", "h6", "header", "main" "nav", "p", "section", - * or "span", then throw a "NotSupportedError" DOMException. - */ - if (!(0, algorithm_1.customElement_isValidCustomElementName)(this._localName) && - !(0, algorithm_1.customElement_isValidShadowHostName)(this._localName)) - throw new DOMException_1.NotSupportedError(); - /** - * 3. If context object’s local name is a valid custom element name, - * or context object’s is value is not null, then: - * 3.1. Let definition be the result of looking up a custom element - * definition given context object’s node document, its namespace, its - * local name, and its is value. - * 3.2. If definition is not null and definition’s disable shadow is true, - * then throw a "NotSupportedError" DOMException. - */ - if ((0, algorithm_1.customElement_isValidCustomElementName)(this._localName) || this._is !== null) { - const definition = (0, algorithm_1.customElement_lookUpACustomElementDefinition)(this._nodeDocument, this._namespace, this._localName, this._is); - if (definition !== null && definition.disableShadow === true) { - throw new DOMException_1.NotSupportedError(); - } - } - /** - * 4. If context object is a shadow host, then throw an "NotSupportedError" - * DOMException. - */ - if (this._shadowRoot !== null) - throw new DOMException_1.NotSupportedError(); - /** - * 5. Let shadow be a new shadow root whose node document is context - * object’s node document, host is context object, and mode is init’s mode. - * 6. Set context object’s shadow root to shadow. - * 7. Return shadow. - */ - const shadow = (0, algorithm_1.create_shadowRoot)(this._nodeDocument, this); - shadow._mode = init.mode; - this._shadowRoot = shadow; - return shadow; - } - /** @inheritdoc */ - get shadowRoot() { - /** - * 1. Let shadow be context object’s shadow root. - * 2. If shadow is null or its mode is "closed", then return null. - * 3. Return shadow. - */ - const shadow = this._shadowRoot; - if (shadow === null || shadow.mode === "closed") - return null; - else - return shadow; - } - /** @inheritdoc */ - closest(selectors) { - /** - * TODO: Selectors - * 1. Let s be the result of parse a selector from selectors. [SELECTORS4] - * 2. If s is failure, throw a "SyntaxError" DOMException. - * 3. Let elements be context object’s inclusive ancestors that are - * elements, in reverse tree order. - * 4. For each element in elements, if match a selector against an element, - * using s, element, and :scope element context object, returns success, - * return element. [SELECTORS4] - * 5. Return null. - */ - throw new DOMException_1.NotImplementedError(); - } - /** @inheritdoc */ - matches(selectors) { - /** - * TODO: Selectors - * 1. Let s be the result of parse a selector from selectors. [SELECTORS4] - * 2. If s is failure, throw a "SyntaxError" DOMException. - * 3. Return true if the result of match a selector against an element, - * using s, element, and :scope element context object, returns success, - * and false otherwise. [SELECTORS4] - */ - throw new DOMException_1.NotImplementedError(); - } - /** @inheritdoc */ - webkitMatchesSelector(selectors) { - return this.matches(selectors); - } - /** @inheritdoc */ - getElementsByTagName(qualifiedName) { - /** - * The getElementsByTagName(qualifiedName) method, when invoked, must return - * the list of elements with qualified name qualifiedName for context - * object. - */ - return (0, algorithm_1.node_listOfElementsWithQualifiedName)(qualifiedName, this); - } - /** @inheritdoc */ - getElementsByTagNameNS(namespace, localName) { - /** - * The getElementsByTagNameNS(namespace, localName) method, when invoked, - * must return the list of elements with namespace namespace and local name - * localName for context object. - */ - return (0, algorithm_1.node_listOfElementsWithNamespace)(namespace, localName, this); - } - /** @inheritdoc */ - getElementsByClassName(classNames) { - /** - * The getElementsByClassName(classNames) method, when invoked, must return - * the list of elements with class names classNames for context object. - */ - return (0, algorithm_1.node_listOfElementsWithClassNames)(classNames, this); - } - /** @inheritdoc */ - insertAdjacentElement(where, element) { - /** - * The insertAdjacentElement(where, element) method, when invoked, must - * return the result of running insert adjacent, given context object, - * where, and element. - */ - return (0, algorithm_1.element_insertAdjacent)(this, where, element); - } - /** @inheritdoc */ - insertAdjacentText(where, data) { - /** - * 1. Let text be a new Text node whose data is data and node document is - * context object’s node document. - * 2. Run insert adjacent, given context object, where, and text. - */ - const text = (0, algorithm_1.create_text)(this._nodeDocument, data); - (0, algorithm_1.element_insertAdjacent)(this, where, text); - } - /** - * Returns the qualified name. - */ - get _qualifiedName() { - /** - * An element’s qualified name is its local name if its namespace prefix is - * null, and its namespace prefix, followed by ":", followed by its - * local name, otherwise. - */ - return (this._namespacePrefix ? - this._namespacePrefix + ':' + this._localName : - this._localName); - } - /** - * Returns the upper-cased qualified name for a html element. - */ - get _htmlUppercasedQualifiedName() { - /** - * 1. Let qualifiedName be context object’s qualified name. - * 2. If the context object is in the HTML namespace and its node document - * is an HTML document, then set qualifiedName to qualifiedName in ASCII - * uppercase. - * 3. Return qualifiedName. - */ - let qualifiedName = this._qualifiedName; - if (this._namespace === infra_1.namespace.HTML && this._nodeDocument._type === "html") { - qualifiedName = qualifiedName.toUpperCase(); - } - return qualifiedName; - } - // MIXIN: ParentNode - /* istanbul ignore next */ - get children() { throw new Error("Mixin: ParentNode not implemented."); } - /* istanbul ignore next */ - get firstElementChild() { throw new Error("Mixin: ParentNode not implemented."); } - /* istanbul ignore next */ - get lastElementChild() { throw new Error("Mixin: ParentNode not implemented."); } - /* istanbul ignore next */ - get childElementCount() { throw new Error("Mixin: ParentNode not implemented."); } - /* istanbul ignore next */ - prepend(...nodes) { throw new Error("Mixin: ParentNode not implemented."); } - /* istanbul ignore next */ - append(...nodes) { throw new Error("Mixin: ParentNode not implemented."); } - /* istanbul ignore next */ - querySelector(selectors) { throw new Error("Mixin: ParentNode not implemented."); } - /* istanbul ignore next */ - querySelectorAll(selectors) { throw new Error("Mixin: ParentNode not implemented."); } - // MIXIN: NonDocumentTypeChildNode - /* istanbul ignore next */ - get previousElementSibling() { throw new Error("Mixin: NonDocumentTypeChildNode not implemented."); } - /* istanbul ignore next */ - get nextElementSibling() { throw new Error("Mixin: NonDocumentTypeChildNode not implemented."); } - // MIXIN: ChildNode - /* istanbul ignore next */ - before(...nodes) { throw new Error("Mixin: ChildNode not implemented."); } - /* istanbul ignore next */ - after(...nodes) { throw new Error("Mixin: ChildNode not implemented."); } - /* istanbul ignore next */ - replaceWith(...nodes) { throw new Error("Mixin: ChildNode not implemented."); } - /* istanbul ignore next */ - remove() { throw new Error("Mixin: ChildNode not implemented."); } - // MIXIN: Slotable - /* istanbul ignore next */ - get assignedSlot() { throw new Error("Mixin: Slotable not implemented."); } - /** - * Creates a new `Element`. - * - * @param document - owner document - * @param localName - local name - * @param namespace - namespace - * @param prefix - namespace prefix - */ - static _create(document, localName, namespace = null, namespacePrefix = null) { - const node = new ElementImpl(); - node._localName = localName; - node._namespace = namespace; - node._namespacePrefix = namespacePrefix; - node._nodeDocument = document; - return node; - } -} -exports.ElementImpl = ElementImpl; -/** - * Initialize prototype properties - */ -(0, WebIDLAlgorithm_1.idl_defineConst)(ElementImpl.prototype, "_nodeType", interfaces_1.NodeType.Element); -//# sourceMappingURL=ElementImpl.js.map -/***/ }), +const { + MAX_SAFE_COMPONENT_LENGTH, + MAX_SAFE_BUILD_LENGTH, + MAX_LENGTH, +} = __nccwpck_require__(5101) +const debug = __nccwpck_require__(1159) +exports = module.exports = {} -/***/ 2390: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +// The actual regexps go on exports.re +const re = exports.re = [] +const safeRe = exports.safeRe = [] +const src = exports.src = [] +const safeSrc = exports.safeSrc = [] +const t = exports.t = {} +let R = 0 +const LETTERDASHNUMBER = '[a-zA-Z0-9-]' -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.EventImpl = void 0; -const interfaces_1 = __nccwpck_require__(9454); -const algorithm_1 = __nccwpck_require__(6573); -const WebIDLAlgorithm_1 = __nccwpck_require__(4239); -/** - * Represents a DOM event. - */ -class EventImpl { - static NONE = 0; - static CAPTURING_PHASE = 1; - static AT_TARGET = 2; - static BUBBLING_PHASE = 3; - NONE = 0; - CAPTURING_PHASE = 1; - AT_TARGET = 2; - BUBBLING_PHASE = 3; - _target = null; - _relatedTarget = null; - _touchTargetList = []; - _path = []; - _currentTarget = null; - _eventPhase = interfaces_1.EventPhase.None; - _stopPropagationFlag = false; - _stopImmediatePropagationFlag = false; - _canceledFlag = false; - _inPassiveListenerFlag = false; - _composedFlag = false; - _initializedFlag = false; - _dispatchFlag = false; - _isTrusted = false; - _type; - _bubbles = false; - _cancelable = false; - _timeStamp; - /** - * Initializes a new instance of `Event`. - */ - constructor(type, eventInit) { - /** - * When a constructor of the Event interface, or of an interface that - * inherits from the Event interface, is invoked, these steps must be run, - * given the arguments type and eventInitDict: - * 1. Let event be the result of running the inner event creation steps with - * this interface, null, now, and eventInitDict. - * 2. Initialize event’s type attribute to type. - * 3. Return event. - */ - this._type = type; - if (eventInit) { - this._bubbles = eventInit.bubbles || false; - this._cancelable = eventInit.cancelable || false; - this._composedFlag = eventInit.composed || false; - } - this._initializedFlag = true; - this._timeStamp = new Date().getTime(); - } - /** @inheritdoc */ - get type() { return this._type; } - /** @inheritdoc */ - get target() { return this._target; } - /** @inheritdoc */ - get srcElement() { return this._target; } - /** @inheritdoc */ - get currentTarget() { return this._currentTarget; } - /** @inheritdoc */ - composedPath() { - /** - * 1. Let composedPath be an empty list. - * 2. Let path be the context object’s path. - * 3. If path is empty, then return composedPath. - * 4. Let currentTarget be the context object’s currentTarget attribute - * value. - * 5. Append currentTarget to composedPath. - * 6. Let currentTargetIndex be 0. - * 7. Let currentTargetHiddenSubtreeLevel be 0. - */ - const composedPath = []; - const path = this._path; - if (path.length === 0) - return composedPath; - const currentTarget = this._currentTarget; - if (currentTarget === null) { - throw new Error("Event currentTarget is null."); - } - composedPath.push(currentTarget); - let currentTargetIndex = 0; - let currentTargetHiddenSubtreeLevel = 0; - /** - * 8. Let index be path’s size − 1. - * 9. While index is greater than or equal to 0: - */ - let index = path.length - 1; - while (index >= 0) { - /** - * 9.1. If path[index]'s root-of-closed-tree is true, then increase - * currentTargetHiddenSubtreeLevel by 1. - * 9.2. If path[index]'s invocation target is currentTarget, then set - * currentTargetIndex to index and break. - * 9.3. If path[index]'s slot-in-closed-tree is true, then decrease - * currentTargetHiddenSubtreeLevel by 1. - * 9.4. Decrease index by 1. - */ - if (path[index].rootOfClosedTree) { - currentTargetHiddenSubtreeLevel++; - } - if (path[index].invocationTarget === currentTarget) { - currentTargetIndex = index; - break; - } - if (path[index].slotInClosedTree) { - currentTargetHiddenSubtreeLevel--; - } - index--; - } - /** - * 10. Let currentHiddenLevel and maxHiddenLevel be - * currentTargetHiddenSubtreeLevel. - */ - let currentHiddenLevel = currentTargetHiddenSubtreeLevel; - let maxHiddenLevel = currentTargetHiddenSubtreeLevel; - /** - * 11. Set index to currentTargetIndex − 1. - * 12. While index is greater than or equal to 0: - */ - index = currentTargetIndex - 1; - while (index >= 0) { - /** - * 12.1. If path[index]'s root-of-closed-tree is true, then increase - * currentHiddenLevel by 1. - * 12.2. If currentHiddenLevel is less than or equal to maxHiddenLevel, - * then prepend path[index]'s invocation target to composedPath. - */ - if (path[index].rootOfClosedTree) { - currentHiddenLevel++; - } - if (currentHiddenLevel <= maxHiddenLevel) { - composedPath.unshift(path[index].invocationTarget); - } - /** - * 12.3. If path[index]'s slot-in-closed-tree is true, then: - */ - if (path[index].slotInClosedTree) { - /** - * 12.3.1. Decrease currentHiddenLevel by 1. - * 12.3.2. If currentHiddenLevel is less than maxHiddenLevel, then set - * maxHiddenLevel to currentHiddenLevel. - */ - currentHiddenLevel--; - if (currentHiddenLevel < maxHiddenLevel) { - maxHiddenLevel = currentHiddenLevel; - } - } - /** - * 12.4. Decrease index by 1. - */ - index--; - } - /** - * 13. Set currentHiddenLevel and maxHiddenLevel to - * currentTargetHiddenSubtreeLevel. - */ - currentHiddenLevel = currentTargetHiddenSubtreeLevel; - maxHiddenLevel = currentTargetHiddenSubtreeLevel; - /** - * 14. Set index to currentTargetIndex + 1. - * 15. While index is less than path’s size: - */ - index = currentTargetIndex + 1; - while (index < path.length) { - /** - * 15.1. If path[index]'s slot-in-closed-tree is true, then increase - * currentHiddenLevel by 1. - * 15.2. If currentHiddenLevel is less than or equal to maxHiddenLevel, - * then append path[index]'s invocation target to composedPath. - */ - if (path[index].slotInClosedTree) { - currentHiddenLevel++; - } - if (currentHiddenLevel <= maxHiddenLevel) { - composedPath.push(path[index].invocationTarget); - } - /** - * 15.3. If path[index]'s root-of-closed-tree is true, then: - */ - if (path[index].rootOfClosedTree) { - /** - * 15.3.1. Decrease currentHiddenLevel by 1. - * 15.3.2. If currentHiddenLevel is less than maxHiddenLevel, then set - * maxHiddenLevel to currentHiddenLevel. - */ - currentHiddenLevel--; - if (currentHiddenLevel < maxHiddenLevel) { - maxHiddenLevel = currentHiddenLevel; - } - } - /** - * 15.4. Increase index by 1. - */ - index++; - } - /** - * 16. Return composedPath. - */ - return composedPath; - } - /** @inheritdoc */ - get eventPhase() { return this._eventPhase; } - /** @inheritdoc */ - stopPropagation() { this._stopPropagationFlag = true; } - /** @inheritdoc */ - get cancelBubble() { return this._stopPropagationFlag; } - set cancelBubble(value) { if (value) - this.stopPropagation(); } - /** @inheritdoc */ - stopImmediatePropagation() { - this._stopPropagationFlag = true; - this._stopImmediatePropagationFlag = true; - } - /** @inheritdoc */ - get bubbles() { return this._bubbles; } - /** @inheritdoc */ - get cancelable() { return this._cancelable; } - /** @inheritdoc */ - get returnValue() { return !this._canceledFlag; } - set returnValue(value) { - if (!value) { - (0, algorithm_1.event_setTheCanceledFlag)(this); - } - } - /** @inheritdoc */ - preventDefault() { - (0, algorithm_1.event_setTheCanceledFlag)(this); - } - /** @inheritdoc */ - get defaultPrevented() { return this._canceledFlag; } - /** @inheritdoc */ - get composed() { return this._composedFlag; } - /** @inheritdoc */ - get isTrusted() { return this._isTrusted; } - /** @inheritdoc */ - get timeStamp() { return this._timeStamp; } - /** @inheritdoc */ - initEvent(type, bubbles = false, cancelable = false) { - /** - * 1. If the context object’s dispatch flag is set, then return. - */ - if (this._dispatchFlag) - return; - /** - * 2. Initialize the context object with type, bubbles, and cancelable. - */ - (0, algorithm_1.event_initialize)(this, type, bubbles, cancelable); - } +// Replace some greedy regex tokens to prevent regex dos issues. These regex are +// used internally via the safeRe object since all inputs in this library get +// normalized first to trim and collapse all extra whitespace. The original +// regexes are exported for userland consumption and lower level usage. A +// future breaking change could export the safer regex only with a note that +// all input should have extra whitespace removed. +const safeRegexReplacements = [ + ['\\s', 1], + ['\\d', MAX_LENGTH], + [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH], +] + +const makeSafeRegex = (value) => { + for (const [token, max] of safeRegexReplacements) { + value = value + .split(`${token}*`).join(`${token}{0,${max}}`) + .split(`${token}+`).join(`${token}{1,${max}}`) + } + return value } -exports.EventImpl = EventImpl; -/** - * Define constants on prototype. - */ -(0, WebIDLAlgorithm_1.idl_defineConst)(EventImpl.prototype, "NONE", 0); -(0, WebIDLAlgorithm_1.idl_defineConst)(EventImpl.prototype, "CAPTURING_PHASE", 1); -(0, WebIDLAlgorithm_1.idl_defineConst)(EventImpl.prototype, "AT_TARGET", 2); -(0, WebIDLAlgorithm_1.idl_defineConst)(EventImpl.prototype, "BUBBLING_PHASE", 3); -//# sourceMappingURL=EventImpl.js.map -/***/ }), +const createToken = (name, value, isGlobal) => { + const safe = makeSafeRegex(value) + const index = R++ + debug(name, index, value) + t[name] = index + src[index] = value + safeSrc[index] = safe + re[index] = new RegExp(value, isGlobal ? 'g' : undefined) + safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined) +} -/***/ 3611: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +// The following Regular Expressions can be used for tokenizing, +// validating, and parsing SemVer version strings. +// ## Numeric Identifier +// A single `0`, or a non-zero digit followed by zero or more digits. -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.EventTargetImpl = void 0; -const DOMException_1 = __nccwpck_require__(7175); -const util_1 = __nccwpck_require__(8247); -const algorithm_1 = __nccwpck_require__(6573); -/** - * Represents a target to which an event can be dispatched. - */ -class EventTargetImpl { - __eventListenerList; - get _eventListenerList() { - return this.__eventListenerList || (this.__eventListenerList = []); - } - __eventHandlerMap; - get _eventHandlerMap() { - return this.__eventHandlerMap || (this.__eventHandlerMap = {}); - } - /** - * Initializes a new instance of `EventTarget`. - */ - constructor() { } - /** @inheritdoc */ - addEventListener(type, callback, options = { passive: false, once: false, capture: false }) { - /** - * 1. Let capture, passive, and once be the result of flattening more options. - */ - const [capture, passive, once] = (0, algorithm_1.eventTarget_flattenMore)(options); - // convert callback function to EventListener, return if null - let listenerCallback; - if (!callback) { - return; - } - else if (util_1.Guard.isEventListener(callback)) { - listenerCallback = callback; - } - else { - listenerCallback = { handleEvent: callback }; - } - /** - * 2. Add an event listener with the context object and an event listener - * whose type is type, callback is callback, capture is capture, passive is - * passive, and once is once. - */ - (0, algorithm_1.eventTarget_addEventListener)(this, { - type: type, - callback: listenerCallback, - capture: capture, - passive: passive, - once: once, - removed: false - }); - } - /** @inheritdoc */ - removeEventListener(type, callback, options = { capture: false }) { - /** - * TODO: Implement realms - * 1. If the context object’s relevant global object is a - * ServiceWorkerGlobalScope object and its associated service worker’s - * script resource’s has ever been evaluated flag is set, then throw - * a TypeError. [SERVICE-WORKERS] - */ - /** - * 2. Let capture be the result of flattening options. - */ - const capture = (0, algorithm_1.eventTarget_flatten)(options); - if (!callback) - return; - /** - * 3. If the context object’s event listener list contains an event listener - * whose type is type, callback is callback, and capture is capture, then - * remove an event listener with the context object and that event listener. - */ - for (let i = 0; i < this._eventListenerList.length; i++) { - const entry = this._eventListenerList[i]; - if (entry.type !== type || entry.capture !== capture) - continue; - if (util_1.Guard.isEventListener(callback) && entry.callback === callback) { - (0, algorithm_1.eventTarget_removeEventListener)(this, entry, i); - break; - } - else if (callback && entry.callback.handleEvent === callback) { - (0, algorithm_1.eventTarget_removeEventListener)(this, entry, i); - break; - } - } - } - /** @inheritdoc */ - dispatchEvent(event) { - /** - * 1. If event’s dispatch flag is set, or if its initialized flag is not - * set, then throw an "InvalidStateError" DOMException. - * 2. Initialize event’s isTrusted attribute to false. - * 3. Return the result of dispatching event to the context object. - */ - if (event._dispatchFlag || !event._initializedFlag) { - throw new DOMException_1.InvalidStateError(); - } - event._isTrusted = false; - return (0, algorithm_1.event_dispatch)(event, this); - } - /** @inheritdoc */ - _getTheParent(event) { - return null; - } -} -exports.EventTargetImpl = EventTargetImpl; -//# sourceMappingURL=EventTargetImpl.js.map +createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*') +createToken('NUMERICIDENTIFIERLOOSE', '\\d+') -/***/ }), +// ## Non-numeric Identifier +// Zero or more digits, followed by a letter or hyphen, and then zero or +// more letters, digits, or hyphens. -/***/ 9065: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +createToken('NONNUMERICIDENTIFIER', `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`) +// ## Main Version +// Three dot-separated numeric identifiers. -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.HTMLCollectionImpl = void 0; -const infra_1 = __nccwpck_require__(4737); -const algorithm_1 = __nccwpck_require__(6573); -const util_1 = __nccwpck_require__(8247); -const util_2 = __nccwpck_require__(7061); -/** - * Represents a collection of elements. - */ -class HTMLCollectionImpl { - _live = true; - _root; - _filter; - static reservedNames = ['_root', '_live', '_filter', 'length', - 'item', 'namedItem', 'get', 'set']; - /** - * Initializes a new instance of `HTMLCollection`. - * - * @param root - root node - * @param filter - node filter - */ - constructor(root, filter) { - this._root = root; - this._filter = filter; - return new Proxy(this, this); - } - /** @inheritdoc */ - get length() { - /** - * The length attribute’s getter must return the number of nodes - * represented by the collection. - */ - let count = 0; - let node = (0, algorithm_1.tree_getFirstDescendantNode)(this._root, false, false, (e) => util_1.Guard.isElementNode(e) && this._filter(e)); - while (node !== null) { - count++; - node = (0, algorithm_1.tree_getNextDescendantNode)(this._root, node, false, false, (e) => util_1.Guard.isElementNode(e) && this._filter(e)); - } - return count; - } - /** @inheritdoc */ - item(index) { - /** - * The item(index) method, when invoked, must return the indexth element - * in the collection. If there is no indexth element in the collection, - * then the method must return null. - */ - let i = 0; - let node = (0, algorithm_1.tree_getFirstDescendantNode)(this._root, false, false, (e) => util_1.Guard.isElementNode(e) && this._filter(e)); - while (node !== null) { - if (i === index) - return node; - else - i++; - node = (0, algorithm_1.tree_getNextDescendantNode)(this._root, node, false, false, (e) => util_1.Guard.isElementNode(e) && this._filter(e)); - } - return null; - } - /** @inheritdoc */ - namedItem(key) { - /** - * 1. If key is the empty string, return null. - * 2. Return the first element in the collection for which at least one of - * the following is true: - * - it has an ID which is key; - * - it is in the HTML namespace and has a name attribute whose value is key; - * or null if there is no such element. - */ - if (key === '') - return null; - let ele = (0, algorithm_1.tree_getFirstDescendantNode)(this._root, false, false, (e) => util_1.Guard.isElementNode(e) && this._filter(e)); - while (ele != null) { - if (ele._uniqueIdentifier === key) { - return ele; - } - else if (ele._namespace === infra_1.namespace.HTML) { - for (let i = 0; i < ele._attributeList.length; i++) { - const attr = ele._attributeList[i]; - if (attr._localName === "name" && attr._namespace === null && - attr._namespacePrefix === null && attr._value === key) - return ele; - } - } - ele = (0, algorithm_1.tree_getNextDescendantNode)(this._root, ele, false, false, (e) => util_1.Guard.isElementNode(e) && this._filter(e)); - } - return null; - } - /** @inheritdoc */ - [Symbol.iterator]() { - const root = this._root; - const filter = this._filter; - let currentNode = (0, algorithm_1.tree_getFirstDescendantNode)(root, false, false, (e) => util_1.Guard.isElementNode(e) && filter(e)); - return { - next() { - if (currentNode === null) { - return { done: true, value: null }; - } - else { - const result = { done: false, value: currentNode }; - currentNode = (0, algorithm_1.tree_getNextDescendantNode)(root, currentNode, false, false, (e) => util_1.Guard.isElementNode(e) && filter(e)); - return result; - } - } - }; - } - /** - * Implements a proxy get trap to provide array-like access. - */ - get(target, key, receiver) { - if (!(0, util_2.isString)(key) || HTMLCollectionImpl.reservedNames.indexOf(key) !== -1) { - return Reflect.get(target, key, receiver); - } - const index = Number(key); - if (isNaN(index)) { - return target.namedItem(key) || undefined; - } - else { - return target.item(index) || undefined; - } - } - /** - * Implements a proxy set trap to provide array-like access. - */ - set(target, key, value, receiver) { - if (!(0, util_2.isString)(key) || HTMLCollectionImpl.reservedNames.indexOf(key) !== -1) { - return Reflect.set(target, key, value, receiver); - } - const index = Number(key); - const node = isNaN(index) ? - target.namedItem(key) || undefined : target.item(index) || undefined; - if (node && node._parent) { - (0, algorithm_1.mutation_replace)(node, value, node._parent); - return true; - } - else { - return false; - } - } - /** - * Creates a new `HTMLCollection`. - * - * @param root - root node - * @param filter - node filter - */ - static _create(root, filter = (() => true)) { - return new HTMLCollectionImpl(root, filter); - } -} -exports.HTMLCollectionImpl = HTMLCollectionImpl; -//# sourceMappingURL=HTMLCollectionImpl.js.map +createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` + + `(${src[t.NUMERICIDENTIFIER]})\\.` + + `(${src[t.NUMERICIDENTIFIER]})`) -/***/ }), +createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + + `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + + `(${src[t.NUMERICIDENTIFIERLOOSE]})`) -/***/ 9137: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +// ## Pre-release Version Identifier +// A numeric identifier, or a non-numeric identifier. +// Non-numeric identifiers include numeric identifiers but can be longer. +// Therefore non-numeric identifiers must go first. +createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NONNUMERICIDENTIFIER] +}|${src[t.NUMERICIDENTIFIER]})`) + +createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NONNUMERICIDENTIFIER] +}|${src[t.NUMERICIDENTIFIERLOOSE]})`) + +// ## Pre-release Version +// Hyphen, followed by one or more dot-separated pre-release version +// identifiers. + +createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER] +}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`) + +createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE] +}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`) + +// ## Build Metadata Identifier +// Any combination of digits, letters, or hyphens. + +createToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`) + +// ## Build Metadata +// Plus sign, followed by one or more period-separated build metadata +// identifiers. + +createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER] +}(?:\\.${src[t.BUILDIDENTIFIER]})*))`) + +// ## Full Version String +// A main version, followed optionally by a pre-release version and +// build metadata. + +// Note that the only major, minor, patch, and pre-release sections of +// the version string are capturing groups. The build metadata is not a +// capturing group, because it should not ever be used in version +// comparison. + +createToken('FULLPLAIN', `v?${src[t.MAINVERSION] +}${src[t.PRERELEASE]}?${ + src[t.BUILD]}?`) + +createToken('FULL', `^${src[t.FULLPLAIN]}$`) + +// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. +// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty +// common in the npm registry. +createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE] +}${src[t.PRERELEASELOOSE]}?${ + src[t.BUILD]}?`) + +createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`) + +createToken('GTLT', '((?:<|>)?=?)') + +// Something like "2.*" or "1.2.x". +// Note that "x.x" is a valid xRange identifier, meaning "any version" +// Only the first item is strictly required. +createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`) +createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`) + +createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` + + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + + `(?:${src[t.PRERELEASE]})?${ + src[t.BUILD]}?` + + `)?)?`) + +createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` + + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + + `(?:${src[t.PRERELEASELOOSE]})?${ + src[t.BUILD]}?` + + `)?)?`) + +createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`) +createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`) + +// Coercion. +// Extract anything that could conceivably be a part of a valid semver +createToken('COERCEPLAIN', `${'(^|[^\\d])' + + '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` + + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`) +createToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\d])`) +createToken('COERCEFULL', src[t.COERCEPLAIN] + + `(?:${src[t.PRERELEASE]})?` + + `(?:${src[t.BUILD]})?` + + `(?:$|[^\\d])`) +createToken('COERCERTL', src[t.COERCE], true) +createToken('COERCERTLFULL', src[t.COERCEFULL], true) + +// Tilde ranges. +// Meaning is "reasonably at or greater than" +createToken('LONETILDE', '(?:~>?)') + +createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true) +exports.tildeTrimReplace = '$1~' + +createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`) +createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`) + +// Caret ranges. +// Meaning is "at least and backwards compatible with" +createToken('LONECARET', '(?:\\^)') + +createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true) +exports.caretTrimReplace = '$1^' + +createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`) +createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`) + +// A simple gt/lt/eq thing, or just "" to indicate "any version" +createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`) +createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`) + +// An expression to strip any whitespace between the gtlt and the thing +// it modifies, so that `> 1.2.3` ==> `>1.2.3` +createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT] +}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true) +exports.comparatorTrimReplace = '$1$2$3' + +// Something like `1.2.3 - 1.2.4` +// Note that these all use the loose form, because they'll be +// checked against either the strict or loose comparator form +// later. +createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` + + `\\s+-\\s+` + + `(${src[t.XRANGEPLAIN]})` + + `\\s*$`) + +createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` + + `\\s+-\\s+` + + `(${src[t.XRANGEPLAINLOOSE]})` + + `\\s*$`) + +// Star ranges basically just allow anything at all. +createToken('STAR', '(<|>)?=?\\s*\\*') +// >=0.0.0 is like a star +createToken('GTE0', '^\\s*>=\\s*0\\.0\\.0\\s*$') +createToken('GTE0PRE', '^\\s*>=\\s*0\\.0\\.0-0\\s*$') -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.MutationObserverImpl = void 0; -const DOMImpl_1 = __nccwpck_require__(698); -const util_1 = __nccwpck_require__(8247); -const infra_1 = __nccwpck_require__(4737); -/** - * Represents an object that can be used to observe mutations to the tree of - * nodes. - */ -class MutationObserverImpl { - _callback; - _nodeList = []; - _recordQueue = []; - /** - * Initializes a new instance of `MutationObserver`. - * - * @param callback - the callback function - */ - constructor(callback) { - /** - * 1. Let mo be a new MutationObserver object whose callback is callback. - * 2. Append mo to mo’s relevant agent’s mutation observers. - * 3. Return mo. - */ - this._callback = callback; - const window = DOMImpl_1.dom.window; - infra_1.set.append(window._mutationObservers, this); - } - /** @inheritdoc */ - observe(target, options) { - options = options || { - childList: false, - subtree: false - }; - /** - * 1. If either options’s attributeOldValue or attributeFilter is present - * and options’s attributes is omitted, then set options’s attributes - * to true. - * 2. If options’s characterDataOldValue is present and options’s - * characterData is omitted, then set options’s characterData to true. - * 3. If none of options’s childList, attributes, and characterData is - * true, then throw a TypeError. - * 4. If options’s attributeOldValue is true and options’s attributes is - * false, then throw a TypeError. - * 5. If options’s attributeFilter is present and options’s attributes is - * false, then throw a TypeError. - * 6. If options’s characterDataOldValue is true and options’s characterData - * is false, then throw a TypeError. - */ - if ((options.attributeOldValue !== undefined || options.attributeFilter !== undefined) && - options.attributes === undefined) { - options.attributes = true; - } - if (options.characterDataOldValue !== undefined && options.characterData === undefined) { - options.characterData = true; - } - if (!options.childList && !options.attributes && !options.characterData) { - throw new TypeError(); - } - if (options.attributeOldValue && !options.attributes) { - throw new TypeError(); - } - if (options.attributeFilter !== undefined && !options.attributes) { - throw new TypeError(); - } - if (options.characterDataOldValue && !options.characterData) { - throw new TypeError(); - } - /** - * 7. For each registered of target’s registered observer list, if - * registered’s observer is the context object: - */ - let isRegistered = false; - const coptions = options; - for (const registered of target._registeredObserverList) { - if (registered.observer === this) { - isRegistered = true; - /** - * 7.1. For each node of the context object’s node list, remove all - * transient registered observers whose source is registered from node’s - * registered observer list. - */ - for (const node of this._nodeList) { - infra_1.list.remove(node._registeredObserverList, (ob) => util_1.Guard.isTransientRegisteredObserver(ob) && ob.source === registered); - } - /** - * 7.2. Set registered’s options to options. - */ - registered.options = coptions; - } - } - /** - * 8. Otherwise: - * 8.1. Append a new registered observer whose observer is the context - * object and options is options to target’s registered observer list. - * 8.2. Append target to the context object’s node list. - */ - if (!isRegistered) { - target._registeredObserverList.push({ observer: this, options: options }); - this._nodeList.push(target); - } - } - /** @inheritdoc */ - disconnect() { - /** - * 1. For each node of the context object’s node list, remove any - * registered observer from node’s registered observer list for which the - * context object is the observer. - */ - for (const node of this._nodeList) { - infra_1.list.remove((node)._registeredObserverList, (ob) => ob.observer === this); - } - /** - * 2. Empty the context object’s record queue. - */ - this._recordQueue = []; - } - /** @inheritdoc */ - takeRecords() { - /** - * 1. Let records be a clone of the context object’s record queue. - * 2. Empty the context object’s record queue. - * 3. Return records. - */ - const records = this._recordQueue; - this._recordQueue = []; - return records; - } -} -exports.MutationObserverImpl = MutationObserverImpl; -//# sourceMappingURL=MutationObserverImpl.js.map /***/ }), -/***/ 33: -/***/ ((__unused_webpack_module, exports) => { +/***/ 2276: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.MutationRecordImpl = void 0; -/** - * Represents a mutation record. - */ -class MutationRecordImpl { - _type; - _target; - _addedNodes; - _removedNodes; - _previousSibling; - _nextSibling; - _attributeName; - _attributeNamespace; - _oldValue; - /** - * Initializes a new instance of `MutationRecord`. - * - * @param type - type of mutation: `"attributes"` for an attribute - * mutation, `"characterData"` for a mutation to a CharacterData node - * and `"childList"` for a mutation to the tree of nodes. - * @param target - node affected by the mutation. - * @param addedNodes - list of added nodes. - * @param removedNodes - list of removed nodes. - * @param previousSibling - previous sibling of added or removed nodes. - * @param nextSibling - next sibling of added or removed nodes. - * @param attributeName - local name of the changed attribute, - * and `null` otherwise. - * @param attributeNamespace - namespace of the changed attribute, - * and `null` otherwise. - * @param oldValue - value before mutation: attribute value for an attribute - * mutation, node `data` for a mutation to a CharacterData node and `null` - * for a mutation to the tree of nodes. - */ - constructor(type, target, addedNodes, removedNodes, previousSibling, nextSibling, attributeName, attributeNamespace, oldValue) { - this._type = type; - this._target = target; - this._addedNodes = addedNodes; - this._removedNodes = removedNodes; - this._previousSibling = previousSibling; - this._nextSibling = nextSibling; - this._attributeName = attributeName; - this._attributeNamespace = attributeNamespace; - this._oldValue = oldValue; - } - /** @inheritdoc */ - get type() { return this._type; } - /** @inheritdoc */ - get target() { return this._target; } - /** @inheritdoc */ - get addedNodes() { return this._addedNodes; } - /** @inheritdoc */ - get removedNodes() { return this._removedNodes; } - /** @inheritdoc */ - get previousSibling() { return this._previousSibling; } - /** @inheritdoc */ - get nextSibling() { return this._nextSibling; } - /** @inheritdoc */ - get attributeName() { return this._attributeName; } - /** @inheritdoc */ - get attributeNamespace() { return this._attributeNamespace; } - /** @inheritdoc */ - get oldValue() { return this._oldValue; } - /** - * Creates a new `MutationRecord`. - * - * @param type - type of mutation: `"attributes"` for an attribute - * mutation, `"characterData"` for a mutation to a CharacterData node - * and `"childList"` for a mutation to the tree of nodes. - * @param target - node affected by the mutation. - * @param addedNodes - list of added nodes. - * @param removedNodes - list of removed nodes. - * @param previousSibling - previous sibling of added or removed nodes. - * @param nextSibling - next sibling of added or removed nodes. - * @param attributeName - local name of the changed attribute, - * and `null` otherwise. - * @param attributeNamespace - namespace of the changed attribute, - * and `null` otherwise. - * @param oldValue - value before mutation: attribute value for an attribute - * mutation, node `data` for a mutation to a CharacterData node and `null` - * for a mutation to the tree of nodes. - */ - static _create(type, target, addedNodes, removedNodes, previousSibling, nextSibling, attributeName, attributeNamespace, oldValue) { - return new MutationRecordImpl(type, target, addedNodes, removedNodes, previousSibling, nextSibling, attributeName, attributeNamespace, oldValue); - } -} -exports.MutationRecordImpl = MutationRecordImpl; -//# sourceMappingURL=MutationRecordImpl.js.map + +// Determine if version is greater than all the versions possible in the range. +const outside = __nccwpck_require__(280) +const gtr = (version, range, options) => outside(version, range, '>', options) +module.exports = gtr + /***/ }), -/***/ 3145: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 3465: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.NamedNodeMapImpl = void 0; -const DOMException_1 = __nccwpck_require__(7175); -const algorithm_1 = __nccwpck_require__(6573); -/** - * Represents a collection of attributes. - */ -class NamedNodeMapImpl extends Array { - _element; - /** - * Initializes a new instance of `NamedNodeMap`. - * - * @param element - parent element - */ - constructor(element) { - super(); - this._element = element; - // TODO: This workaround is needed to extend Array in ES5 - Object.setPrototypeOf(this, NamedNodeMapImpl.prototype); - } - _asArray() { return this; } - /** @inheritdoc */ - item(index) { - /** - * 1. If index is equal to or greater than context object’s attribute list’s - * size, then return null. - * 2. Otherwise, return context object’s attribute list[index]. - * - */ - return this[index] || null; - } - /** @inheritdoc */ - getNamedItem(qualifiedName) { - /** - * The getNamedItem(qualifiedName) method, when invoked, must return the - * result of getting an attribute given qualifiedName and element. - */ - return (0, algorithm_1.element_getAnAttributeByName)(qualifiedName, this._element); - } - /** @inheritdoc */ - getNamedItemNS(namespace, localName) { - /** - * The getNamedItemNS(namespace, localName) method, when invoked, must - * return the result of getting an attribute given namespace, localName, - * and element. - */ - return (0, algorithm_1.element_getAnAttributeByNamespaceAndLocalName)(namespace || '', localName, this._element); - } - /** @inheritdoc */ - setNamedItem(attr) { - /** - * The setNamedItem(attr) and setNamedItemNS(attr) methods, when invoked, - * must return the result of setting an attribute given attr and element. - */ - return (0, algorithm_1.element_setAnAttribute)(attr, this._element); - } - /** @inheritdoc */ - setNamedItemNS(attr) { - return (0, algorithm_1.element_setAnAttribute)(attr, this._element); - } - /** @inheritdoc */ - removeNamedItem(qualifiedName) { - /** - * 1. Let attr be the result of removing an attribute given qualifiedName - * and element. - * 2. If attr is null, then throw a "NotFoundError" DOMException. - * 3. Return attr. - */ - const attr = (0, algorithm_1.element_removeAnAttributeByName)(qualifiedName, this._element); - if (attr === null) - throw new DOMException_1.NotFoundError(); - return attr; - } - /** @inheritdoc */ - removeNamedItemNS(namespace, localName) { - /** - * 1. Let attr be the result of removing an attribute given namespace, - * localName, and element. - * 2. If attr is null, then throw a "NotFoundError" DOMException. - * 3. Return attr. - */ - const attr = (0, algorithm_1.element_removeAnAttributeByNamespaceAndLocalName)(namespace || '', localName, this._element); - if (attr === null) - throw new DOMException_1.NotFoundError(); - return attr; - } - /** - * Creates a new `NamedNodeMap`. - * - * @param element - parent element - */ - static _create(element) { - return new NamedNodeMapImpl(element); - } + +const Range = __nccwpck_require__(6782) +const intersects = (r1, r2, options) => { + r1 = new Range(r1, options) + r2 = new Range(r2, options) + return r1.intersects(r2, options) } -exports.NamedNodeMapImpl = NamedNodeMapImpl; -//# sourceMappingURL=NamedNodeMapImpl.js.map +module.exports = intersects + /***/ }), -/***/ 4649: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 5213: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.NodeFilterImpl = void 0; -const interfaces_1 = __nccwpck_require__(9454); -const WebIDLAlgorithm_1 = __nccwpck_require__(4239); -/** - * Represents a node filter. - */ -class NodeFilterImpl { - static FILTER_ACCEPT = 1; - static FILTER_REJECT = 2; - static FILTER_SKIP = 3; - static SHOW_ALL = 0xffffffff; - static SHOW_ELEMENT = 0x1; - static SHOW_ATTRIBUTE = 0x2; - static SHOW_TEXT = 0x4; - static SHOW_CDATA_SECTION = 0x8; - static SHOW_ENTITY_REFERENCE = 0x10; - static SHOW_ENTITY = 0x20; - static SHOW_PROCESSING_INSTRUCTION = 0x40; - static SHOW_COMMENT = 0x80; - static SHOW_DOCUMENT = 0x100; - static SHOW_DOCUMENT_TYPE = 0x200; - static SHOW_DOCUMENT_FRAGMENT = 0x400; - static SHOW_NOTATION = 0x800; - FILTER_ACCEPT = 1; - FILTER_REJECT = 2; - FILTER_SKIP = 3; - SHOW_ALL = 0xffffffff; - SHOW_ELEMENT = 0x1; - SHOW_ATTRIBUTE = 0x2; - SHOW_TEXT = 0x4; - SHOW_CDATA_SECTION = 0x8; - SHOW_ENTITY_REFERENCE = 0x10; - SHOW_ENTITY = 0x20; - SHOW_PROCESSING_INSTRUCTION = 0x40; - SHOW_COMMENT = 0x80; - SHOW_DOCUMENT = 0x100; - SHOW_DOCUMENT_TYPE = 0x200; - SHOW_DOCUMENT_FRAGMENT = 0x400; - SHOW_NOTATION = 0x800; - /** - * Initializes a new instance of `NodeFilter`. - */ - constructor() { - } - /** - * Callback function. - */ - acceptNode(node) { - return interfaces_1.FilterResult.Accept; - } - /** - * Creates a new `NodeFilter`. - */ - static _create() { - return new NodeFilterImpl(); - } -} -exports.NodeFilterImpl = NodeFilterImpl; -/** - * Define constants on prototype. - */ -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeFilterImpl.prototype, "FILTER_ACCEPT", 1); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeFilterImpl.prototype, "FILTER_REJECT", 2); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeFilterImpl.prototype, "FILTER_SKIP", 3); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeFilterImpl.prototype, "SHOW_ALL", 0xffffffff); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeFilterImpl.prototype, "SHOW_ELEMENT", 0x1); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeFilterImpl.prototype, "SHOW_ATTRIBUTE", 0x2); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeFilterImpl.prototype, "SHOW_TEXT", 0x4); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeFilterImpl.prototype, "SHOW_CDATA_SECTION", 0x8); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeFilterImpl.prototype, "SHOW_ENTITY_REFERENCE", 0x10); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeFilterImpl.prototype, "SHOW_ENTITY", 0x20); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeFilterImpl.prototype, "SHOW_PROCESSING_INSTRUCTION", 0x40); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeFilterImpl.prototype, "SHOW_COMMENT", 0x80); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeFilterImpl.prototype, "SHOW_DOCUMENT", 0x100); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeFilterImpl.prototype, "SHOW_DOCUMENT_TYPE", 0x200); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeFilterImpl.prototype, "SHOW_DOCUMENT_FRAGMENT", 0x400); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeFilterImpl.prototype, "SHOW_NOTATION", 0x800); -//# sourceMappingURL=NodeFilterImpl.js.map + +const outside = __nccwpck_require__(280) +// Determine if version is less than all the versions possible in the range +const ltr = (version, range, options) => outside(version, range, '<', options) +module.exports = ltr + /***/ }), -/***/ 2280: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 5574: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.NodeImpl = void 0; -const DOMImpl_1 = __nccwpck_require__(698); -const interfaces_1 = __nccwpck_require__(9454); -const EventTargetImpl_1 = __nccwpck_require__(3611); -const util_1 = __nccwpck_require__(8247); -const DOMException_1 = __nccwpck_require__(7175); -const algorithm_1 = __nccwpck_require__(6573); -const URLAlgorithm_1 = __nccwpck_require__(3650); -const WebIDLAlgorithm_1 = __nccwpck_require__(4239); -/** - * Represents a generic XML node. - */ -class NodeImpl extends EventTargetImpl_1.EventTargetImpl { - static ELEMENT_NODE = 1; - static ATTRIBUTE_NODE = 2; - static TEXT_NODE = 3; - static CDATA_SECTION_NODE = 4; - static ENTITY_REFERENCE_NODE = 5; - static ENTITY_NODE = 6; - static PROCESSING_INSTRUCTION_NODE = 7; - static COMMENT_NODE = 8; - static DOCUMENT_NODE = 9; - static DOCUMENT_TYPE_NODE = 10; - static DOCUMENT_FRAGMENT_NODE = 11; - static NOTATION_NODE = 12; - static DOCUMENT_POSITION_DISCONNECTED = 0x01; - static DOCUMENT_POSITION_PRECEDING = 0x02; - static DOCUMENT_POSITION_FOLLOWING = 0x04; - static DOCUMENT_POSITION_CONTAINS = 0x08; - static DOCUMENT_POSITION_CONTAINED_BY = 0x10; - static DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20; - ELEMENT_NODE = 1; - ATTRIBUTE_NODE = 2; - TEXT_NODE = 3; - CDATA_SECTION_NODE = 4; - ENTITY_REFERENCE_NODE = 5; - ENTITY_NODE = 6; - PROCESSING_INSTRUCTION_NODE = 7; - COMMENT_NODE = 8; - DOCUMENT_NODE = 9; - DOCUMENT_TYPE_NODE = 10; - DOCUMENT_FRAGMENT_NODE = 11; - NOTATION_NODE = 12; - DOCUMENT_POSITION_DISCONNECTED = 0x01; - DOCUMENT_POSITION_PRECEDING = 0x02; - DOCUMENT_POSITION_FOLLOWING = 0x04; - DOCUMENT_POSITION_CONTAINS = 0x08; - DOCUMENT_POSITION_CONTAINED_BY = 0x10; - DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20; - __childNodes; - get _childNodes() { - return this.__childNodes || (this.__childNodes = (0, algorithm_1.create_nodeList)(this)); - } - _nodeDocumentOverride; - get _nodeDocument() { return this._nodeDocumentOverride || DOMImpl_1.dom.window._associatedDocument; } - set _nodeDocument(val) { this._nodeDocumentOverride = val; } - __registeredObserverList; - get _registeredObserverList() { - return this.__registeredObserverList || (this.__registeredObserverList = []); - } - _parent = null; - _children = new util_1.EmptySet; - _firstChild = null; - _lastChild = null; - _previousSibling = null; - _nextSibling = null; - /** - * Initializes a new instance of `Node`. - */ - constructor() { - super(); - } - /** @inheritdoc */ - get nodeType() { return this._nodeType; } - /** - * Returns a string appropriate for the type of node. - */ - get nodeName() { - if (util_1.Guard.isElementNode(this)) { - return this._htmlUppercasedQualifiedName; - } - else if (util_1.Guard.isAttrNode(this)) { - return this._qualifiedName; - } - else if (util_1.Guard.isExclusiveTextNode(this)) { - return "#text"; - } - else if (util_1.Guard.isCDATASectionNode(this)) { - return "#cdata-section"; - } - else if (util_1.Guard.isProcessingInstructionNode(this)) { - return this._target; - } - else if (util_1.Guard.isCommentNode(this)) { - return "#comment"; - } - else if (util_1.Guard.isDocumentNode(this)) { - return "#document"; - } - else if (util_1.Guard.isDocumentTypeNode(this)) { - return this._name; - } - else if (util_1.Guard.isDocumentFragmentNode(this)) { - return "#document-fragment"; - } - else { - return ""; - } - } - /** - * Gets the absolute base URL of the node. - */ - get baseURI() { - /** - * The baseURI attribute’s getter must return node document’s document - * base URL, serialized. - * TODO: Implement in HTML DOM - * https://html.spec.whatwg.org/multipage/urls-and-fetching.html#document-base-url - */ - return (0, URLAlgorithm_1.urlSerializer)(this._nodeDocument._URL); - } - /** - * Returns whether the node is rooted to a document node. - */ - get isConnected() { - /** - * The isConnected attribute’s getter must return true, if context object - * is connected, and false otherwise. - */ - return util_1.Guard.isElementNode(this) && (0, algorithm_1.shadowTree_isConnected)(this); - } - /** - * Returns the parent document. - */ - get ownerDocument() { - /** - * The ownerDocument attribute’s getter must return null, if the context - * object is a document, and the context object’s node document otherwise. - * _Note:_ The node document of a document is that document itself. All - * nodes have a node document at all times. - */ - if (this._nodeType === interfaces_1.NodeType.Document) - return null; - else - return this._nodeDocument; - } - /** - * Returns the root node. - * - * @param options - if options has `composed = true` this function - * returns the node's shadow-including root, otherwise it returns - * the node's root node. - */ - getRootNode(options) { - /** - * The getRootNode(options) method, when invoked, must return context - * object’s shadow-including root if options’s composed is true, - * and context object’s root otherwise. - */ - return (0, algorithm_1.tree_rootNode)(this, !!options && options.composed); - } - /** - * Returns the parent node. - */ - get parentNode() { - /** - * The parentNode attribute’s getter must return the context object’s parent. - * _Note:_ An Attr node has no parent. - */ - if (this._nodeType === interfaces_1.NodeType.Attribute) { - return null; - } - else { - return this._parent; - } - } - /** - * Returns the parent element. - */ - get parentElement() { - /** - * The parentElement attribute’s getter must return the context object’s - * parent element. - */ - if (this._parent && util_1.Guard.isElementNode(this._parent)) { - return this._parent; - } - else { - return null; - } - } - /** - * Determines whether a node has any children. - */ - hasChildNodes() { - /** - * The hasChildNodes() method, when invoked, must return true if the context - * object has children, and false otherwise. - */ - return (this._firstChild !== null); - } - /** - * Returns a {@link NodeList} of child nodes. - */ - get childNodes() { - /** - * The childNodes attribute’s getter must return a NodeList rooted at the - * context object matching only children. - */ - return this._childNodes; - } - /** - * Returns the first child node. - */ - get firstChild() { - /** - * The firstChild attribute’s getter must return the context object’s first - * child. - */ - return this._firstChild; - } - /** - * Returns the last child node. - */ - get lastChild() { - /** - * The lastChild attribute’s getter must return the context object’s last - * child. - */ - return this._lastChild; - } - /** - * Returns the previous sibling node. - */ - get previousSibling() { - /** - * The previousSibling attribute’s getter must return the context object’s - * previous sibling. - * _Note:_ An Attr node has no siblings. - */ - return this._previousSibling; - } - /** - * Returns the next sibling node. - */ - get nextSibling() { - /** - * The nextSibling attribute’s getter must return the context object’s - * next sibling. - */ - return this._nextSibling; - } - /** - * Gets or sets the data associated with a {@link CharacterData} node or the - * value of an {@link @Attr} node. For other node types returns `null`. - */ - get nodeValue() { - if (util_1.Guard.isAttrNode(this)) { - return this._value; - } - else if (util_1.Guard.isCharacterDataNode(this)) { - return this._data; - } - else { - return null; - } - } - set nodeValue(value) { - if (value === null) { - value = ''; - } - if (util_1.Guard.isAttrNode(this)) { - (0, algorithm_1.attr_setAnExistingAttributeValue)(this, value); - } - else if (util_1.Guard.isCharacterDataNode(this)) { - (0, algorithm_1.characterData_replaceData)(this, 0, this._data.length, value); - } - } - /** - * Returns the concatenation of data of all the {@link Text} - * node descendants in tree order. When set, replaces the text - * contents of the node with the given value. - */ - get textContent() { - if (util_1.Guard.isDocumentFragmentNode(this) || util_1.Guard.isElementNode(this)) { - return (0, algorithm_1.text_descendantTextContent)(this); - } - else if (util_1.Guard.isAttrNode(this)) { - return this._value; - } - else if (util_1.Guard.isCharacterDataNode(this)) { - return this._data; - } - else { - return null; - } - } - set textContent(value) { - if (value === null) { - value = ''; - } - if (util_1.Guard.isDocumentFragmentNode(this) || util_1.Guard.isElementNode(this)) { - (0, algorithm_1.node_stringReplaceAll)(value, this); - } - else if (util_1.Guard.isAttrNode(this)) { - (0, algorithm_1.attr_setAnExistingAttributeValue)(this, value); - } - else if (util_1.Guard.isCharacterDataNode(this)) { - (0, algorithm_1.characterData_replaceData)(this, 0, (0, algorithm_1.tree_nodeLength)(this), value); - } - } - /** - * Puts all {@link Text} nodes in the full depth of the sub-tree - * underneath this node into a "normal" form where only markup - * (e.g., tags, comments, processing instructions, CDATA sections, - * and entity references) separates {@link Text} nodes, i.e., there - * are no adjacent Text nodes. - */ - normalize() { - /** - * The normalize() method, when invoked, must run these steps for each - * descendant exclusive Text node node of context object: - */ - const descendantNodes = []; - let node = (0, algorithm_1.tree_getFirstDescendantNode)(this, false, false, (e) => util_1.Guard.isExclusiveTextNode(e)); - while (node !== null) { - descendantNodes.push(node); - node = (0, algorithm_1.tree_getNextDescendantNode)(this, node, false, false, (e) => util_1.Guard.isExclusiveTextNode(e)); - } - for (let i = 0; i < descendantNodes.length; i++) { - const node = descendantNodes[i]; - if (node._parent === null) - continue; - /** - * 1. Let length be node’s length. - * 2. If length is zero, then remove node and continue with the next - * exclusive Text node, if any. - */ - let length = (0, algorithm_1.tree_nodeLength)(node); - if (length === 0) { - (0, algorithm_1.mutation_remove)(node, node._parent); - continue; - } - /** - * 3. Let data be the concatenation of the data of node’s contiguous - * exclusive Text nodes (excluding itself), in tree order. - */ - const textSiblings = []; - let data = ''; - for (const sibling of (0, algorithm_1.text_contiguousExclusiveTextNodes)(node)) { - textSiblings.push(sibling); - data += sibling._data; - } - /** - * 4. Replace data with node node, offset length, count 0, and data data. - */ - (0, algorithm_1.characterData_replaceData)(node, length, 0, data); - /** - * 5. Let currentNode be node’s next sibling. - * 6. While currentNode is an exclusive Text node: - */ - if (DOMImpl_1.dom.rangeList.size !== 0) { - let currentNode = node._nextSibling; - while (currentNode !== null && util_1.Guard.isExclusiveTextNode(currentNode)) { - /** - * 6.1. For each live range whose start node is currentNode, add length - * to its start offset and set its start node to node. - * 6.2. For each live range whose end node is currentNode, add length to - * its end offset and set its end node to node. - * 6.3. For each live range whose start node is currentNode’s parent and - * start offset is currentNode’s index, set its start node to node and - * its start offset to length. - * 6.4. For each live range whose end node is currentNode’s parent and - * end offset is currentNode’s index, set its end node to node and its - * end offset to length. - */ - const cn = currentNode; - const index = (0, algorithm_1.tree_index)(cn); - for (const range of DOMImpl_1.dom.rangeList) { - if (range._start[0] === cn) { - range._start[0] = node; - range._start[1] += length; - } - if (range._end[0] === cn) { - range._end[0] = node; - range._end[1] += length; - } - if (range._start[0] === cn._parent && range._start[1] === index) { - range._start[0] = node; - range._start[1] = length; - } - if (range._end[0] === cn._parent && range._end[1] === index) { - range._end[0] = node; - range._end[1] = length; - } - } - /** - * 6.5. Add currentNode’s length to length. - * 6.6. Set currentNode to its next sibling. - */ - length += (0, algorithm_1.tree_nodeLength)(currentNode); - currentNode = currentNode._nextSibling; - } - } - /** - * 7. Remove node’s contiguous exclusive Text nodes (excluding itself), - * in tree order. - */ - for (let i = 0; i < textSiblings.length; i++) { - const sibling = textSiblings[i]; - if (sibling._parent === null) - continue; - (0, algorithm_1.mutation_remove)(sibling, sibling._parent); - } - } - } - /** - * Returns a duplicate of this node, i.e., serves as a generic copy - * constructor for nodes. The duplicate node has no parent - * ({@link parentNode} returns `null`). - * - * @param deep - if `true`, recursively clone the subtree under the - * specified node. If `false`, clone only the node itself (and its - * attributes, if it is an {@link Element}). - */ - cloneNode(deep = false) { - /** - * 1. If context object is a shadow root, then throw a "NotSupportedError" - * DOMException. - * 2. Return a clone of the context object, with the clone children flag set - * if deep is true. - */ - if (util_1.Guard.isShadowRoot(this)) - throw new DOMException_1.NotSupportedError(); - return (0, algorithm_1.node_clone)(this, null, deep); - } - /** - * Determines if the given node is equal to this one. - * - * @param node - the node to compare with - */ - isEqualNode(node = null) { - /** - * The isEqualNode(otherNode) method, when invoked, must return true if - * otherNode is non-null and context object equals otherNode, and false - * otherwise. - */ - return (node !== null && (0, algorithm_1.node_equals)(this, node)); - } - /** - * Determines if the given node is reference equal to this one. - * - * @param node - the node to compare with - */ - isSameNode(node = null) { - /** - * The isSameNode(otherNode) method, when invoked, must return true if - * otherNode is context object, and false otherwise. - */ - return (this === node); - } - /** - * Returns a bitmask indicating the position of the given `node` - * relative to this node. - */ - compareDocumentPosition(other) { - /** - * 1. If context object is other, then return zero. - * 2. Let node1 be other and node2 be context object. - * 3. Let attr1 and attr2 be null. - * attr1’s element. - */ - if (other === this) - return interfaces_1.Position.SameNode; - let node1 = other; - let node2 = this; - let attr1 = null; - let attr2 = null; - /** - * 4. If node1 is an attribute, then set attr1 to node1 and node1 to - * attr1’s element. - */ - if (util_1.Guard.isAttrNode(node1)) { - attr1 = node1; - node1 = attr1._element; - } - /** - * 5. If node2 is an attribute, then: - */ - if (util_1.Guard.isAttrNode(node2)) { - /** - * 5.1. Set attr2 to node2 and node2 to attr2’s element. - */ - attr2 = node2; - node2 = attr2._element; - /** - * 5.2. If attr1 and node1 are non-null, and node2 is node1, then: - */ - if (attr1 && node1 && (node1 === node2)) { - /** - * 5.2. For each attr in node2’s attribute list: - */ - for (let i = 0; i < node2._attributeList.length; i++) { - const attr = node2._attributeList[i]; - /** - * 5.2.1. If attr equals attr1, then return the result of adding - * DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC and - * DOCUMENT_POSITION_PRECEDING. - * 5.2.2. If attr equals attr2, then return the result of adding - * DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC and - * DOCUMENT_POSITION_FOLLOWING. - */ - if ((0, algorithm_1.node_equals)(attr, attr1)) { - return interfaces_1.Position.ImplementationSpecific | interfaces_1.Position.Preceding; - } - else if ((0, algorithm_1.node_equals)(attr, attr2)) { - return interfaces_1.Position.ImplementationSpecific | interfaces_1.Position.Following; - } - } - } - } - /** - * 6. If node1 or node2 is null, or node1’s root is not node2’s root, then - * return the result of adding DOCUMENT_POSITION_DISCONNECTED, - * DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC, and either - * DOCUMENT_POSITION_PRECEDING or DOCUMENT_POSITION_FOLLOWING, - * with the constraint that this is to be consistent, together. - */ - if (node1 === null || node2 === null || - (0, algorithm_1.tree_rootNode)(node1) !== (0, algorithm_1.tree_rootNode)(node2)) { - // nodes are disconnected - // return a random result but cache the value for consistency - return interfaces_1.Position.Disconnected | interfaces_1.Position.ImplementationSpecific | - (DOMImpl_1.dom.compareCache.check(this, other) ? interfaces_1.Position.Preceding : interfaces_1.Position.Following); - } - /** - * 7. If node1 is an ancestor of node2 and attr1 is null, or node1 is node2 - * and attr2 is non-null, then return the result of adding - * DOCUMENT_POSITION_CONTAINS to DOCUMENT_POSITION_PRECEDING. - */ - if ((!attr1 && (0, algorithm_1.tree_isAncestorOf)(node2, node1)) || - (attr2 && (node1 === node2))) { - return interfaces_1.Position.Contains | interfaces_1.Position.Preceding; - } - /** - * 8. If node1 is a descendant of node2 and attr2 is null, or node1 is node2 - * and attr1 is non-null, then return the result of adding - * DOCUMENT_POSITION_CONTAINED_BY to DOCUMENT_POSITION_FOLLOWING. - */ - if ((!attr2 && (0, algorithm_1.tree_isDescendantOf)(node2, node1)) || - (attr1 && (node1 === node2))) { - return interfaces_1.Position.ContainedBy | interfaces_1.Position.Following; - } - /** - * 9. If node1 is preceding node2, then return DOCUMENT_POSITION_PRECEDING. - */ - if ((0, algorithm_1.tree_isPreceding)(node2, node1)) - return interfaces_1.Position.Preceding; - /** - * 10. Return DOCUMENT_POSITION_FOLLOWING. - */ - return interfaces_1.Position.Following; - } - /** - * Returns `true` if given node is an inclusive descendant of this - * node, and `false` otherwise (including when other node is `null`). - * - * @param other - the node to check - */ - contains(other) { - /** - * The contains(other) method, when invoked, must return true if other is an - * inclusive descendant of context object, and false otherwise (including - * when other is null). - */ - if (other === null) - return false; - return (0, algorithm_1.tree_isDescendantOf)(this, other, true); - } - /** - * Returns the prefix for a given namespace URI, if present, and - * `null` if not. - * - * @param namespace - the namespace to search - */ - lookupPrefix(namespace) { - /** - * 1. If namespace is null or the empty string, then return null. - * 2. Switch on the context object: - */ - if (!namespace) - return null; - if (util_1.Guard.isElementNode(this)) { - /** - * Return the result of locating a namespace prefix for it using - * namespace. - */ - return (0, algorithm_1.node_locateANamespacePrefix)(this, namespace); - } - else if (util_1.Guard.isDocumentNode(this)) { - /** - * Return the result of locating a namespace prefix for its document - * element, if its document element is non-null, and null otherwise. - */ - if (this.documentElement === null) { - return null; - } - else { - return (0, algorithm_1.node_locateANamespacePrefix)(this.documentElement, namespace); - } - } - else if (util_1.Guard.isDocumentTypeNode(this) || util_1.Guard.isDocumentFragmentNode(this)) { - return null; - } - else if (util_1.Guard.isAttrNode(this)) { - /** - * Return the result of locating a namespace prefix for its element, - * if its element is non-null, and null otherwise. - */ - if (this._element === null) { - return null; - } - else { - return (0, algorithm_1.node_locateANamespacePrefix)(this._element, namespace); - } - } - else { - /** - * Return the result of locating a namespace prefix for its parent - * element, if its parent element is non-null, and null otherwise. - */ - if (this._parent !== null && util_1.Guard.isElementNode(this._parent)) { - return (0, algorithm_1.node_locateANamespacePrefix)(this._parent, namespace); - } - else { - return null; - } - } - } - /** - * Returns the namespace URI for a given prefix if present, and `null` - * if not. - * - * @param prefix - the prefix to search - */ - lookupNamespaceURI(prefix) { - /** - * 1. If prefix is the empty string, then set it to null. - * 2. Return the result of running locate a namespace for the context object - * using prefix. - */ - return (0, algorithm_1.node_locateANamespace)(this, prefix || null); - } - /** - * Returns `true` if the namespace is the default namespace on this - * node or `false` if not. - * - * @param namespace - the namespace to check - */ - isDefaultNamespace(namespace) { - /** - * 1. If namespace is the empty string, then set it to null. - * 2. Let defaultNamespace be the result of running locate a namespace for - * context object using null. - * 3. Return true if defaultNamespace is the same as namespace, and false otherwise. - */ - if (!namespace) - namespace = null; - const defaultNamespace = (0, algorithm_1.node_locateANamespace)(this, null); - return (defaultNamespace === namespace); - } - /** - * Inserts the node `newChild` before the existing child node - * `refChild`. If `refChild` is `null`, inserts `newChild` at the end - * of the list of children. - * - * If `newChild` is a {@link DocumentFragment} object, all of its - * children are inserted, in the same order, before `refChild`. - * - * If `newChild` is already in the tree, it is first removed. - * - * @param newChild - the node to insert - * @param refChild - the node before which the new node must be - * inserted - * - * @returns the newly inserted child node - */ - insertBefore(newChild, refChild) { - /** - * The insertBefore(node, child) method, when invoked, must return the - * result of pre-inserting node into context object before child. - */ - return (0, algorithm_1.mutation_preInsert)(newChild, this, refChild); - } - /** - * Adds the node `newChild` to the end of the list of children of this - * node, and returns it. If `newChild` is already in the tree, it is - * first removed. - * - * If `newChild` is a {@link DocumentFragment} object, the entire - * contents of the document fragment are moved into the child list of - * this node. - * - * @param newChild - the node to add - * - * @returns the newly inserted child node - */ - appendChild(newChild) { - /** - * The appendChild(node) method, when invoked, must return the result of - * appending node to context object. - */ - return (0, algorithm_1.mutation_append)(newChild, this); - } - /** - * Replaces the child node `oldChild` with `newChild` in the list of - * children, and returns the `oldChild` node. If `newChild` is already - * in the tree, it is first removed. - * - * @param newChild - the new node to put in the child list - * @param oldChild - the node being replaced in the list - * - * @returns the removed child node - */ - replaceChild(newChild, oldChild) { - /** - * The replaceChild(node, child) method, when invoked, must return the - * result of replacing child with node within context object. - */ - return (0, algorithm_1.mutation_replace)(oldChild, newChild, this); - } - /** - * Removes the child node indicated by `oldChild` from the list of - * children, and returns it. - * - * @param oldChild - the node being removed from the list - * - * @returns the removed child node - */ - removeChild(oldChild) { - /** - * The removeChild(child) method, when invoked, must return the result of - * pre-removing child from context object. - */ - return (0, algorithm_1.mutation_preRemove)(oldChild, this); - } - /** - * Gets the parent event target for the given event. - * - * @param event - an event - */ - _getTheParent(event) { - /** - * A node’s get the parent algorithm, given an event, returns the node’s - * assigned slot, if node is assigned, and node’s parent otherwise. - */ - if (util_1.Guard.isSlotable(this) && (0, algorithm_1.shadowTree_isAssigned)(this)) { - return this._assignedSlot; - } - else { - return this._parent; - } - } -} -exports.NodeImpl = NodeImpl; -/** - * A performance tweak to share an empty set between all node classes. This will - * be overwritten by element, document and document fragment nodes to supply an - * actual set of nodes. - */ -NodeImpl.prototype._children = new util_1.EmptySet(); -/** - * Define constants on prototype. - */ -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeImpl.prototype, "ELEMENT_NODE", 1); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeImpl.prototype, "ATTRIBUTE_NODE", 2); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeImpl.prototype, "TEXT_NODE", 3); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeImpl.prototype, "CDATA_SECTION_NODE", 4); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeImpl.prototype, "ENTITY_REFERENCE_NODE", 5); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeImpl.prototype, "ENTITY_NODE", 6); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeImpl.prototype, "PROCESSING_INSTRUCTION_NODE", 7); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeImpl.prototype, "COMMENT_NODE", 8); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeImpl.prototype, "DOCUMENT_NODE", 9); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeImpl.prototype, "DOCUMENT_TYPE_NODE", 10); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeImpl.prototype, "DOCUMENT_FRAGMENT_NODE", 11); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeImpl.prototype, "NOTATION_NODE", 12); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeImpl.prototype, "DOCUMENT_POSITION_DISCONNECTED", 0x01); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeImpl.prototype, "DOCUMENT_POSITION_PRECEDING", 0x02); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeImpl.prototype, "DOCUMENT_POSITION_FOLLOWING", 0x04); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeImpl.prototype, "DOCUMENT_POSITION_CONTAINS", 0x08); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeImpl.prototype, "DOCUMENT_POSITION_CONTAINED_BY", 0x10); -(0, WebIDLAlgorithm_1.idl_defineConst)(NodeImpl.prototype, "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC", 0x20); -//# sourceMappingURL=NodeImpl.js.map - -/***/ }), - -/***/ 4142: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +const SemVer = __nccwpck_require__(7163) +const Range = __nccwpck_require__(6782) -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.NodeIteratorImpl = void 0; -const TraverserImpl_1 = __nccwpck_require__(8506); -const algorithm_1 = __nccwpck_require__(6573); -/** - * Represents an object which can be used to iterate through the nodes - * of a subtree. - */ -class NodeIteratorImpl extends TraverserImpl_1.TraverserImpl { - _iteratorCollection; - _reference; - _pointerBeforeReference; - /** - * Initializes a new instance of `NodeIterator`. - */ - constructor(root, reference, pointerBeforeReference) { - super(root); - this._iteratorCollection = undefined; - this._reference = reference; - this._pointerBeforeReference = pointerBeforeReference; - (0, algorithm_1.nodeIterator_iteratorList)().add(this); - } - /** @inheritdoc */ - get referenceNode() { return this._reference; } - /** @inheritdoc */ - get pointerBeforeReferenceNode() { return this._pointerBeforeReference; } - /** @inheritdoc */ - nextNode() { - /** - * The nextNode() method, when invoked, must return the result of - * traversing with the context object and next. - */ - return (0, algorithm_1.nodeIterator_traverse)(this, true); - } - /** @inheritdoc */ - previousNode() { - /** - * The previousNode() method, when invoked, must return the result of - * traversing with the context object and previous. - */ - return (0, algorithm_1.nodeIterator_traverse)(this, false); - } - /** @inheritdoc */ - detach() { - /** - * The detach() method, when invoked, must do nothing. - * - * since JS lacks weak references, we still use detach - */ - (0, algorithm_1.nodeIterator_iteratorList)().delete(this); - } - /** - * Creates a new `NodeIterator`. - * - * @param root - iterator's root node - * @param reference - reference node - * @param pointerBeforeReference - whether the iterator is before or after the - * reference node - */ - static _create(root, reference, pointerBeforeReference) { - return new NodeIteratorImpl(root, reference, pointerBeforeReference); +const maxSatisfying = (versions, range, options) => { + let max = null + let maxSV = null + let rangeObj = null + try { + rangeObj = new Range(range, options) + } catch (er) { + return null + } + versions.forEach((v) => { + if (rangeObj.test(v)) { + // satisfies(v, range, options) + if (!max || maxSV.compare(v) === -1) { + // compare(max, v, true) + max = v + maxSV = new SemVer(max, options) + } } + }) + return max } -exports.NodeIteratorImpl = NodeIteratorImpl; -//# sourceMappingURL=NodeIteratorImpl.js.map +module.exports = maxSatisfying + /***/ }), -/***/ 5788: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 8595: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.NodeListImpl = void 0; -const DOMImpl_1 = __nccwpck_require__(698); -const util_1 = __nccwpck_require__(7061); -const algorithm_1 = __nccwpck_require__(6573); -/** - * Represents an ordered set of nodes. - */ -class NodeListImpl { - _live = true; - _root; - _filter = null; - _length = 0; - /** - * Initializes a new instance of `NodeList`. - * - * @param root - root node - */ - constructor(root) { - this._root = root; - return new Proxy(this, this); - } - /** @inheritdoc */ - get length() { - /** - * The length attribute must return the number of nodes represented - * by the collection. - */ - return this._root._children.size; - } - /** @inheritdoc */ - item(index) { - /** - * The item(index) method must return the indexth node in the collection. - * If there is no indexth node in the collection, then the method must - * return null. - */ - if (index < 0 || index > this.length - 1) - return null; - if (index < this.length / 2) { - let i = 0; - let node = this._root._firstChild; - while (node !== null && i !== index) { - node = node._nextSibling; - i++; - } - return node; - } - else { - let i = this.length - 1; - let node = this._root._lastChild; - while (node !== null && i !== index) { - node = node._previousSibling; - i--; - } - return node; - } - } - /** @inheritdoc */ - keys() { - return { - [Symbol.iterator]: function () { - let index = 0; - return { - next: function () { - if (index === this.length) { - return { done: true, value: null }; - } - else { - return { done: false, value: index++ }; - } - }.bind(this) - }; - }.bind(this) - }; - } - /** @inheritdoc */ - values() { - return { - [Symbol.iterator]: function () { - const it = this[Symbol.iterator](); - return { - next() { - return it.next(); - } - }; - }.bind(this) - }; - } - /** @inheritdoc */ - entries() { - return { - [Symbol.iterator]: function () { - const it = this[Symbol.iterator](); - let index = 0; - return { - next() { - const itResult = it.next(); - if (itResult.done) { - return { done: true, value: null }; - } - else { - return { done: false, value: [index++, itResult.value] }; - } - } - }; - }.bind(this) - }; - } - /** @inheritdoc */ - [Symbol.iterator]() { - return this._root._children[Symbol.iterator](); - } - /** @inheritdoc */ - forEach(callback, thisArg) { - if (thisArg === undefined) { - thisArg = DOMImpl_1.dom.window; - } - let index = 0; - for (const node of this._root._children) { - callback.call(thisArg, node, index++, this); - } - } - /** - * Implements a proxy get trap to provide array-like access. - */ - get(target, key, receiver) { - if (!(0, util_1.isString)(key)) { - return Reflect.get(target, key, receiver); - } - const index = Number(key); - if (isNaN(index)) { - return Reflect.get(target, key, receiver); - } - return target.item(index) || undefined; - } - /** - * Implements a proxy set trap to provide array-like access. - */ - set(target, key, value, receiver) { - if (!(0, util_1.isString)(key)) { - return Reflect.set(target, key, value, receiver); - } - const index = Number(key); - if (isNaN(index)) { - return Reflect.set(target, key, value, receiver); - } - const node = target.item(index) || undefined; - if (!node) - return false; - if (node._parent) { - (0, algorithm_1.mutation_replace)(node, value, node._parent); - return true; - } - else { - return false; - } - } - /** - * Creates a new `NodeList`. - * - * @param root - root node - */ - static _create(root) { - return new NodeListImpl(root); + +const SemVer = __nccwpck_require__(7163) +const Range = __nccwpck_require__(6782) +const minSatisfying = (versions, range, options) => { + let min = null + let minSV = null + let rangeObj = null + try { + rangeObj = new Range(range, options) + } catch (er) { + return null + } + versions.forEach((v) => { + if (rangeObj.test(v)) { + // satisfies(v, range, options) + if (!min || minSV.compare(v) === 1) { + // compare(min, v, true) + min = v + minSV = new SemVer(min, options) + } } + }) + return min } -exports.NodeListImpl = NodeListImpl; -//# sourceMappingURL=NodeListImpl.js.map +module.exports = minSatisfying + /***/ }), -/***/ 7654: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 1866: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.NodeListStaticImpl = void 0; -const DOMImpl_1 = __nccwpck_require__(698); -const util_1 = __nccwpck_require__(7061); -/** - * Represents an ordered list of nodes. - * This is a static implementation of `NodeList`. - */ -class NodeListStaticImpl { - _live = false; - _root; - _filter; - _items = []; - _length = 0; - /** - * Initializes a new instance of `NodeList`. - * - * @param root - root node - */ - constructor(root) { - this._root = root; - this._items = []; - this._filter = function (node) { return true; }; - return new Proxy(this, this); - } - /** @inheritdoc */ - get length() { - /** - * The length attribute must return the number of nodes represented by - * the collection. - */ - return this._items.length; - } - /** @inheritdoc */ - item(index) { - /** - * The item(index) method must return the indexth node in the collection. - * If there is no indexth node in the collection, then the method must - * return null. - */ - if (index < 0 || index > this.length - 1) - return null; - return this._items[index]; - } - /** @inheritdoc */ - keys() { - return { - [Symbol.iterator]: function () { - let index = 0; - return { - next: function () { - if (index === this.length) { - return { done: true, value: null }; - } - else { - return { done: false, value: index++ }; - } - }.bind(this) - }; - }.bind(this) - }; - } - /** @inheritdoc */ - values() { - return { - [Symbol.iterator]: function () { - const it = this[Symbol.iterator](); - return { - next() { - return it.next(); - } - }; - }.bind(this) - }; - } - /** @inheritdoc */ - entries() { - return { - [Symbol.iterator]: function () { - const it = this[Symbol.iterator](); - let index = 0; - return { - next() { - const itResult = it.next(); - if (itResult.done) { - return { done: true, value: null }; - } - else { - return { done: false, value: [index++, itResult.value] }; - } - } - }; - }.bind(this) - }; - } - /** @inheritdoc */ - [Symbol.iterator]() { - const it = this._items[Symbol.iterator](); - return { - next() { - return it.next(); - } - }; - } - /** @inheritdoc */ - forEach(callback, thisArg) { - if (thisArg === undefined) { - thisArg = DOMImpl_1.dom.window; - } - let index = 0; - for (const node of this._items) { - callback.call(thisArg, node, index++, this); - } - } - /** - * Implements a proxy get trap to provide array-like access. - */ - get(target, key, receiver) { - if (!(0, util_1.isString)(key)) { - return Reflect.get(target, key, receiver); - } - const index = Number(key); - if (isNaN(index)) { - return Reflect.get(target, key, receiver); - } - return target._items[index] || undefined; - } - /** - * Implements a proxy set trap to provide array-like access. - */ - set(target, key, value, receiver) { - if (!(0, util_1.isString)(key)) { - return Reflect.set(target, key, value, receiver); - } - const index = Number(key); - if (isNaN(index)) { - return Reflect.set(target, key, value, receiver); - } - if (index >= 0 && index < target._items.length) { - target._items[index] = value; - return true; - } - else { - return false; - } - } - /** - * Creates a new `NodeList`. - * - * @param root - root node - * @param items - a list of items to initialize the list - */ - static _create(root, items) { - const list = new NodeListStaticImpl(root); - list._items = items; - return list; - } -} -exports.NodeListStaticImpl = NodeListStaticImpl; -//# sourceMappingURL=NodeListStaticImpl.js.map -/***/ }), +const SemVer = __nccwpck_require__(7163) +const Range = __nccwpck_require__(6782) +const gt = __nccwpck_require__(6599) -/***/ 2256: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +const minVersion = (range, loose) => { + range = new Range(range, loose) + let minver = new SemVer('0.0.0') + if (range.test(minver)) { + return minver + } -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.NonDocumentTypeChildNodeImpl = void 0; -const util_1 = __nccwpck_require__(8247); -/** - * Represents a mixin that extends child nodes that can have siblings - * other than doctypes. This mixin is implemented by {@link Element} and - * {@link CharacterData}. - */ -class NonDocumentTypeChildNodeImpl { - /** @inheritdoc */ - get previousElementSibling() { - /** - * The previousElementSibling attribute’s getter must return the first - * preceding sibling that is an element, and null otherwise. - */ - let node = util_1.Cast.asNode(this)._previousSibling; - while (node) { - if (util_1.Guard.isElementNode(node)) - return node; - else - node = node._previousSibling; - } - return null; - } - /** @inheritdoc */ - get nextElementSibling() { - /** - * The nextElementSibling attribute’s getter must return the first - * following sibling that is an element, and null otherwise. - */ - let node = util_1.Cast.asNode(this)._nextSibling; - while (node) { - if (util_1.Guard.isElementNode(node)) - return node; - else - node = node._nextSibling; - } - return null; - } -} -exports.NonDocumentTypeChildNodeImpl = NonDocumentTypeChildNodeImpl; -//# sourceMappingURL=NonDocumentTypeChildNodeImpl.js.map + minver = new SemVer('0.0.0-0') + if (range.test(minver)) { + return minver + } -/***/ }), + minver = null + for (let i = 0; i < range.set.length; ++i) { + const comparators = range.set[i] -/***/ 5325: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + let setMin = null + comparators.forEach((comparator) => { + // Clone to avoid manipulating the comparator's semver object. + const compver = new SemVer(comparator.semver.version) + switch (comparator.operator) { + case '>': + if (compver.prerelease.length === 0) { + compver.patch++ + } else { + compver.prerelease.push(0) + } + compver.raw = compver.format() + /* fallthrough */ + case '': + case '>=': + if (!setMin || gt(compver, setMin)) { + setMin = compver + } + break + case '<': + case '<=': + /* Ignore maximum versions */ + break + /* istanbul ignore next */ + default: + throw new Error(`Unexpected operation: ${comparator.operator}`) + } + }) + if (setMin && (!minver || gt(minver, setMin))) { + minver = setMin + } + } + if (minver && range.test(minver)) { + return minver + } -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.NonElementParentNodeImpl = void 0; -const util_1 = __nccwpck_require__(8247); -const algorithm_1 = __nccwpck_require__(6573); -/** - * Represents a mixin that extends non-element parent nodes. This mixin - * is implemented by {@link Document} and {@link DocumentFragment}. - */ -class NonElementParentNodeImpl { - /** @inheritdoc */ - getElementById(id) { - /** - * The getElementById(elementId) method, when invoked, must return the first - * element, in tree order, within the context object’s descendants, - * whose ID is elementId, and null if there is no such element otherwise. - */ - let ele = (0, algorithm_1.tree_getFirstDescendantNode)(util_1.Cast.asNode(this), false, false, (e) => util_1.Guard.isElementNode(e)); - while (ele !== null) { - if (ele._uniqueIdentifier === id) { - return ele; - } - ele = (0, algorithm_1.tree_getNextDescendantNode)(util_1.Cast.asNode(this), ele, false, false, (e) => util_1.Guard.isElementNode(e)); - } - return null; - } + return null } -exports.NonElementParentNodeImpl = NonElementParentNodeImpl; -//# sourceMappingURL=NonElementParentNodeImpl.js.map +module.exports = minVersion + /***/ }), -/***/ 1824: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 280: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.ParentNodeImpl = void 0; -const util_1 = __nccwpck_require__(8247); -const algorithm_1 = __nccwpck_require__(6573); -/** - * Represents a mixin that extends parent nodes that can have children. - * This mixin is implemented by {@link Element}, {@link Document} and - * {@link DocumentFragment}. - */ -class ParentNodeImpl { - /** @inheritdoc */ - get children() { - /** - * The children attribute’s getter must return an HTMLCollection collection - * rooted at context object matching only element children. - */ - return (0, algorithm_1.create_htmlCollection)(util_1.Cast.asNode(this)); - } - /** @inheritdoc */ - get firstElementChild() { - /** - * The firstElementChild attribute’s getter must return the first child - * that is an element, and null otherwise. - */ - let node = util_1.Cast.asNode(this)._firstChild; - while (node) { - if (util_1.Guard.isElementNode(node)) - return node; - else - node = node._nextSibling; - } - return null; - } - /** @inheritdoc */ - get lastElementChild() { - /** - * The lastElementChild attribute’s getter must return the last child that - * is an element, and null otherwise. - */ - let node = util_1.Cast.asNode(this)._lastChild; - while (node) { - if (util_1.Guard.isElementNode(node)) - return node; - else - node = node._previousSibling; - } - return null; - } - /** @inheritdoc */ - get childElementCount() { - /** - * The childElementCount attribute’s getter must return the number of - * children of context object that are elements. - */ - let count = 0; - for (const childNode of util_1.Cast.asNode(this)._children) { - if (util_1.Guard.isElementNode(childNode)) - count++; - } - return count; - } - /** @inheritdoc */ - prepend(...nodes) { - /** - * 1. Let node be the result of converting nodes into a node given nodes - * and context object’s node document. - * 2. Pre-insert node into context object before the context object’s first - * child. - */ - const node = util_1.Cast.asNode(this); - const childNode = (0, algorithm_1.parentNode_convertNodesIntoANode)(nodes, node._nodeDocument); - (0, algorithm_1.mutation_preInsert)(childNode, node, node._firstChild); - } - /** @inheritdoc */ - append(...nodes) { - /** - * 1. Let node be the result of converting nodes into a node given nodes - * and context object’s node document. - * 2. Append node to context object. - */ - const node = util_1.Cast.asNode(this); - const childNode = (0, algorithm_1.parentNode_convertNodesIntoANode)(nodes, node._nodeDocument); - (0, algorithm_1.mutation_append)(childNode, node); - } - /** @inheritdoc */ - querySelector(selectors) { - /** - * The querySelector(selectors) method, when invoked, must return the first - * result of running scope-match a selectors string selectors against - * context object, if the result is not an empty list, and null otherwise. - */ - const node = util_1.Cast.asNode(this); - const result = (0, algorithm_1.selectors_scopeMatchASelectorsString)(selectors, node); - return (result.length === 0 ? null : result[0]); - } - /** @inheritdoc */ - querySelectorAll(selectors) { - /** - * The querySelectorAll(selectors) method, when invoked, must return the - * static result of running scope-match a selectors string selectors against - * context object. - */ - const node = util_1.Cast.asNode(this); - const result = (0, algorithm_1.selectors_scopeMatchASelectorsString)(selectors, node); - return (0, algorithm_1.create_nodeListStatic)(node, result); - } -} -exports.ParentNodeImpl = ParentNodeImpl; -//# sourceMappingURL=ParentNodeImpl.js.map -/***/ }), +const SemVer = __nccwpck_require__(7163) +const Comparator = __nccwpck_require__(9379) +const { ANY } = Comparator +const Range = __nccwpck_require__(6782) +const satisfies = __nccwpck_require__(8011) +const gt = __nccwpck_require__(6599) +const lt = __nccwpck_require__(3872) +const lte = __nccwpck_require__(6717) +const gte = __nccwpck_require__(1236) -/***/ 2755: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +const outside = (version, range, hilo, options) => { + version = new SemVer(version, options) + range = new Range(range, options) + let gtfn, ltefn, ltfn, comp, ecomp + switch (hilo) { + case '>': + gtfn = gt + ltefn = lte + ltfn = lt + comp = '>' + ecomp = '>=' + break + case '<': + gtfn = lt + ltefn = gte + ltfn = gt + comp = '<' + ecomp = '<=' + break + default: + throw new TypeError('Must provide a hilo val of "<" or ">"') + } -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.ProcessingInstructionImpl = void 0; -const interfaces_1 = __nccwpck_require__(9454); -const CharacterDataImpl_1 = __nccwpck_require__(765); -const WebIDLAlgorithm_1 = __nccwpck_require__(4239); -/** - * Represents a processing instruction node. - */ -class ProcessingInstructionImpl extends CharacterDataImpl_1.CharacterDataImpl { - _nodeType = interfaces_1.NodeType.ProcessingInstruction; - _target; - /** - * Initializes a new instance of `ProcessingInstruction`. - */ - constructor(target, data) { - super(data); - this._target = target; - } - /** - * Gets the target of the {@link ProcessingInstruction} node. - */ - get target() { return this._target; } - /** - * Creates a new `ProcessingInstruction`. - * - * @param document - owner document - * @param target - instruction target - * @param data - node contents - */ - static _create(document, target, data) { - const node = new ProcessingInstructionImpl(target, data); - node._nodeDocument = document; - return node; - } -} -exports.ProcessingInstructionImpl = ProcessingInstructionImpl; -/** - * Initialize prototype properties - */ -(0, WebIDLAlgorithm_1.idl_defineConst)(ProcessingInstructionImpl.prototype, "_nodeType", interfaces_1.NodeType.ProcessingInstruction); -//# sourceMappingURL=ProcessingInstructionImpl.js.map + // If it satisfies the range it is not outside + if (satisfies(version, range, options)) { + return false + } -/***/ }), + // From now on, variable terms are as if we're in "gtr" mode. + // but note that everything is flipped for the "ltr" function. -/***/ 3691: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + for (let i = 0; i < range.set.length; ++i) { + const comparators = range.set[i] + let high = null + let low = null -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.RangeImpl = void 0; -const DOMImpl_1 = __nccwpck_require__(698); -const interfaces_1 = __nccwpck_require__(9454); -const AbstractRangeImpl_1 = __nccwpck_require__(3773); -const DOMException_1 = __nccwpck_require__(7175); -const algorithm_1 = __nccwpck_require__(6573); -const WebIDLAlgorithm_1 = __nccwpck_require__(4239); -const util_1 = __nccwpck_require__(8247); -/** - * Represents a live range. - */ -class RangeImpl extends AbstractRangeImpl_1.AbstractRangeImpl { - static START_TO_START = 0; - static START_TO_END = 1; - static END_TO_END = 2; - static END_TO_START = 3; - START_TO_START = 0; - START_TO_END = 1; - END_TO_END = 2; - END_TO_START = 3; - _start; - _end; - /** - * Initializes a new instance of `Range`. - */ - constructor() { - super(); - /** - * The Range() constructor, when invoked, must return a new live range with - * (current global object’s associated Document, 0) as its start and end. - */ - const doc = DOMImpl_1.dom.window._associatedDocument; - this._start = [doc, 0]; - this._end = [doc, 0]; - DOMImpl_1.dom.rangeList.add(this); - } - /** @inheritdoc */ - get commonAncestorContainer() { - /** - * 1. Let container be start node. - * 2. While container is not an inclusive ancestor of end node, let - * container be container’s parent. - * 3. Return container. - */ - let container = this._start[0]; - while (!(0, algorithm_1.tree_isAncestorOf)(this._end[0], container, true)) { - if (container._parent === null) { - throw new Error("Parent node is null."); - } - container = container._parent; - } - return container; - } - /** @inheritdoc */ - setStart(node, offset) { - /** - * The setStart(node, offset) method, when invoked, must set the start of - * context object to boundary point (node, offset). - */ - (0, algorithm_1.range_setTheStart)(this, node, offset); - } - /** @inheritdoc */ - setEnd(node, offset) { - /** - * The setEnd(node, offset) method, when invoked, must set the end of - * context object to boundary point (node, offset). - */ - (0, algorithm_1.range_setTheEnd)(this, node, offset); - } - /** @inheritdoc */ - setStartBefore(node) { - /** - * 1. Let parent be node’s parent. - * 2. If parent is null, then throw an "InvalidNodeTypeError" DOMException. - * 3. Set the start of the context object to boundary point - * (parent, node’s index). - */ - let parent = node._parent; - if (parent === null) - throw new DOMException_1.InvalidNodeTypeError(); - (0, algorithm_1.range_setTheStart)(this, parent, (0, algorithm_1.tree_index)(node)); - } - /** @inheritdoc */ - setStartAfter(node) { - /** - * 1. Let parent be node’s parent. - * 2. If parent is null, then throw an "InvalidNodeTypeError" DOMException. - * 3. Set the start of the context object to boundary point - * (parent, node’s index plus 1). - */ - let parent = node._parent; - if (parent === null) - throw new DOMException_1.InvalidNodeTypeError(); - (0, algorithm_1.range_setTheStart)(this, parent, (0, algorithm_1.tree_index)(node) + 1); - } - /** @inheritdoc */ - setEndBefore(node) { - /** - * 1. Let parent be node’s parent. - * 2. If parent is null, then throw an "InvalidNodeTypeError" DOMException. - * 3. Set the end of the context object to boundary point - * (parent, node’s index). - */ - let parent = node._parent; - if (parent === null) - throw new DOMException_1.InvalidNodeTypeError(); - (0, algorithm_1.range_setTheEnd)(this, parent, (0, algorithm_1.tree_index)(node)); - } - /** @inheritdoc */ - setEndAfter(node) { - /** - * 1. Let parent be node’s parent. - * 2. If parent is null, then throw an "InvalidNodeTypeError" DOMException. - * 3. Set the end of the context object to boundary point - * (parent, node’s index plus 1). - */ - let parent = node._parent; - if (parent === null) - throw new DOMException_1.InvalidNodeTypeError(); - (0, algorithm_1.range_setTheEnd)(this, parent, (0, algorithm_1.tree_index)(node) + 1); - } - /** @inheritdoc */ - collapse(toStart) { - /** - * The collapse(toStart) method, when invoked, must if toStart is true, - * set end to start, and set start to end otherwise. - */ - if (toStart) { - this._end = this._start; - } - else { - this._start = this._end; - } - } - /** @inheritdoc */ - selectNode(node) { - /** - * The selectNode(node) method, when invoked, must select node within - * context object. - */ - (0, algorithm_1.range_select)(node, this); - } - /** @inheritdoc */ - selectNodeContents(node) { - /** - * 1. If node is a doctype, throw an "InvalidNodeTypeError" DOMException. - * 2. Let length be the length of node. - * 3. Set start to the boundary point (node, 0). - * 4. Set end to the boundary point (node, length). - */ - if (util_1.Guard.isDocumentTypeNode(node)) - throw new DOMException_1.InvalidNodeTypeError(); - const length = (0, algorithm_1.tree_nodeLength)(node); - this._start = [node, 0]; - this._end = [node, length]; - } - /** @inheritdoc */ - compareBoundaryPoints(how, sourceRange) { - /** - * 1. If how is not one of - * - START_TO_START, - * - START_TO_END, - * - END_TO_END, and - * - END_TO_START, - * then throw a "NotSupportedError" DOMException. - */ - if (how !== interfaces_1.HowToCompare.StartToStart && how !== interfaces_1.HowToCompare.StartToEnd && - how !== interfaces_1.HowToCompare.EndToEnd && how !== interfaces_1.HowToCompare.EndToStart) - throw new DOMException_1.NotSupportedError(); - /** - * 2. If context object’s root is not the same as sourceRange’s root, - * then throw a "WrongDocumentError" DOMException. - */ - if ((0, algorithm_1.range_root)(this) !== (0, algorithm_1.range_root)(sourceRange)) - throw new DOMException_1.WrongDocumentError(); - /** - * 3. If how is: - * - START_TO_START: - * Let this point be the context object’s start. Let other point be - * sourceRange’s start. - * - START_TO_END: - * Let this point be the context object’s end. Let other point be - * sourceRange’s start. - * - END_TO_END: - * Let this point be the context object’s end. Let other point be - * sourceRange’s end. - * - END_TO_START: - * Let this point be the context object’s start. Let other point be - * sourceRange’s end. - */ - let thisPoint; - let otherPoint; - switch (how) { - case interfaces_1.HowToCompare.StartToStart: - thisPoint = this._start; - otherPoint = sourceRange._start; - break; - case interfaces_1.HowToCompare.StartToEnd: - thisPoint = this._end; - otherPoint = sourceRange._start; - break; - case interfaces_1.HowToCompare.EndToEnd: - thisPoint = this._end; - otherPoint = sourceRange._end; - break; - case interfaces_1.HowToCompare.EndToStart: - thisPoint = this._start; - otherPoint = sourceRange._end; - break; - /* istanbul ignore next */ - default: - throw new DOMException_1.NotSupportedError(); - } - /** - * 4. If the position of this point relative to other point is - * - before - * Return −1. - * - equal - * Return 0. - * - after - * Return 1. - */ - const position = (0, algorithm_1.boundaryPoint_position)(thisPoint, otherPoint); - if (position === interfaces_1.BoundaryPosition.Before) { - return -1; - } - else if (position === interfaces_1.BoundaryPosition.After) { - return 1; - } - else { - return 0; - } - } - /** @inheritdoc */ - deleteContents() { - /** - * 1. If the context object is collapsed, then return. - * 2. Let original start node, original start offset, original end node, - * and original end offset be the context object’s start node, - * start offset, end node, and end offset, respectively. - */ - if ((0, algorithm_1.range_collapsed)(this)) - return; - const originalStartNode = this._startNode; - const originalStartOffset = this._startOffset; - const originalEndNode = this._endNode; - const originalEndOffset = this._endOffset; - /** - * 3. If original start node and original end node are the same, and they - * are a Text, ProcessingInstruction, or Comment node, replace data with - * node original start node, offset original start offset, count original - * end offset minus original start offset, and data the empty string, - * and then return. - */ - if (originalStartNode === originalEndNode && - util_1.Guard.isCharacterDataNode(originalStartNode)) { - (0, algorithm_1.characterData_replaceData)(originalStartNode, originalStartOffset, originalEndOffset - originalStartOffset, ''); - return; - } - /** - * 4. Let nodes to remove be a list of all the nodes that are contained in - * the context object, in tree order, omitting any node whose parent is also - * contained in the context object. - */ - const nodesToRemove = []; - for (const node of (0, algorithm_1.range_getContainedNodes)(this)) { - const parent = node._parent; - if (parent !== null && (0, algorithm_1.range_isContained)(parent, this)) { - continue; - } - nodesToRemove.push(node); - } - let newNode; - let newOffset; - if ((0, algorithm_1.tree_isAncestorOf)(originalEndNode, originalStartNode, true)) { - /** - * 5. If original start node is an inclusive ancestor of original end - * node, set new node to original start node and new offset to original - * start offset. - */ - newNode = originalStartNode; - newOffset = originalStartOffset; - } - else { - /** - * 6. Otherwise: - * 6.1. Let reference node equal original start node. - * 6.2. While reference node’s parent is not null and is not an inclusive - * ancestor of original end node, set reference node to its parent. - * 6.3. Set new node to the parent of reference node, and new offset to - * one plus the index of reference node. - */ - let referenceNode = originalStartNode; - while (referenceNode._parent !== null && - !(0, algorithm_1.tree_isAncestorOf)(originalEndNode, referenceNode._parent, true)) { - referenceNode = referenceNode._parent; - } - /* istanbul ignore next */ - if (referenceNode._parent === null) { - throw new Error("Parent node is null."); - } - newNode = referenceNode._parent; - newOffset = (0, algorithm_1.tree_index)(referenceNode) + 1; - } - /** - * 7. If original start node is a Text, ProcessingInstruction, or Comment - * node, replace data with node original start node, offset original start - * offset, count original start node’s length minus original start offset, - * data the empty string. - */ - if (util_1.Guard.isCharacterDataNode(originalStartNode)) { - (0, algorithm_1.characterData_replaceData)(originalStartNode, originalStartOffset, (0, algorithm_1.tree_nodeLength)(originalStartNode) - originalStartOffset, ''); - } - /** - * 8. For each node in nodes to remove, in tree order, remove node from its - * parent. - */ - for (const node of nodesToRemove) { - /* istanbul ignore else */ - if (node._parent) { - (0, algorithm_1.mutation_remove)(node, node._parent); - } - } - /** - * 9. If original end node is a Text, ProcessingInstruction, or Comment - * node, replace data with node original end node, offset 0, count original - * end offset and data the empty string. - */ - if (util_1.Guard.isCharacterDataNode(originalEndNode)) { - (0, algorithm_1.characterData_replaceData)(originalEndNode, 0, originalEndOffset, ''); - } - /** - * 10. Set start and end to (new node, new offset). - */ - this._start = [newNode, newOffset]; - this._end = [newNode, newOffset]; - } - /** @inheritdoc */ - extractContents() { - /** - * The extractContents() method, when invoked, must return the result of - * extracting the context object. - */ - return (0, algorithm_1.range_extract)(this); - } - /** @inheritdoc */ - cloneContents() { - /** - * The cloneContents() method, when invoked, must return the result of - * cloning the contents of the context object. - */ - return (0, algorithm_1.range_cloneTheContents)(this); - } - /** @inheritdoc */ - insertNode(node) { - /** - * The insertNode(node) method, when invoked, must insert node into the - * context object. - */ - return (0, algorithm_1.range_insert)(node, this); - } - /** @inheritdoc */ - surroundContents(newParent) { - /** - * 1. If a non-Text node is partially contained in the context object, then - * throw an "InvalidStateError" DOMException. - */ - for (const node of (0, algorithm_1.range_getPartiallyContainedNodes)(this)) { - if (!util_1.Guard.isTextNode(node)) { - throw new DOMException_1.InvalidStateError(); - } - } - /** - * 2. If newParent is a Document, DocumentType, or DocumentFragment node, - * then throw an "InvalidNodeTypeError" DOMException. - */ - if (util_1.Guard.isDocumentNode(newParent) || - util_1.Guard.isDocumentTypeNode(newParent) || - util_1.Guard.isDocumentFragmentNode(newParent)) { - throw new DOMException_1.InvalidNodeTypeError(); - } - /** - * 3. Let fragment be the result of extracting the context object. - */ - const fragment = (0, algorithm_1.range_extract)(this); - /** - * 4. If newParent has children, then replace all with null within newParent. - */ - if ((newParent)._children.size !== 0) { - (0, algorithm_1.mutation_replaceAll)(null, newParent); - } - /** - * 5. Insert newParent into the context object. - * 6. Append fragment to newParent. - */ - (0, algorithm_1.range_insert)(newParent, this); - (0, algorithm_1.mutation_append)(fragment, newParent); - /** - * 7. Select newParent within the context object. - */ - (0, algorithm_1.range_select)(newParent, this); - } - /** @inheritdoc */ - cloneRange() { - /** - * The cloneRange() method, when invoked, must return a new live range with - * the same start and end as the context object. - */ - return (0, algorithm_1.create_range)(this._start, this._end); - } - /** @inheritdoc */ - detach() { - /** - * The detach() method, when invoked, must do nothing. - * - * since JS lacks weak references, we still use detach - */ - DOMImpl_1.dom.rangeList.delete(this); - } - /** @inheritdoc */ - isPointInRange(node, offset) { - /** - * 1. If node’s root is different from the context object’s root, return false. - */ - if ((0, algorithm_1.tree_rootNode)(node) !== (0, algorithm_1.range_root)(this)) { - return false; - } - /** - * 2. If node is a doctype, then throw an "InvalidNodeTypeError" DOMException. - * 3. If offset is greater than node’s length, then throw an - * "IndexSizeError" DOMException. - */ - if (util_1.Guard.isDocumentTypeNode(node)) - throw new DOMException_1.InvalidNodeTypeError(); - if (offset > (0, algorithm_1.tree_nodeLength)(node)) - throw new DOMException_1.IndexSizeError(); - /** - * 4. If (node, offset) is before start or after end, return false. - */ - const bp = [node, offset]; - if ((0, algorithm_1.boundaryPoint_position)(bp, this._start) === interfaces_1.BoundaryPosition.Before || - (0, algorithm_1.boundaryPoint_position)(bp, this._end) === interfaces_1.BoundaryPosition.After) { - return false; - } - /** - * 5. Return true. - */ - return true; - } - /** @inheritdoc */ - comparePoint(node, offset) { - /** - * 1. If node’s root is different from the context object’s root, then throw - * a "WrongDocumentError" DOMException. - * 2. If node is a doctype, then throw an "InvalidNodeTypeError" DOMException. - * 3. If offset is greater than node’s length, then throw an - * "IndexSizeError" DOMException. - */ - if ((0, algorithm_1.tree_rootNode)(node) !== (0, algorithm_1.range_root)(this)) - throw new DOMException_1.WrongDocumentError(); - if (util_1.Guard.isDocumentTypeNode(node)) - throw new DOMException_1.InvalidNodeTypeError(); - if (offset > (0, algorithm_1.tree_nodeLength)(node)) - throw new DOMException_1.IndexSizeError(); - /** - * 4. If (node, offset) is before start, return −1. - * 5. If (node, offset) is after end, return 1. - * 6. Return 0. - */ - const bp = [node, offset]; - if ((0, algorithm_1.boundaryPoint_position)(bp, this._start) === interfaces_1.BoundaryPosition.Before) { - return -1; - } - else if ((0, algorithm_1.boundaryPoint_position)(bp, this._end) === interfaces_1.BoundaryPosition.After) { - return 1; - } - else { - return 0; - } - } - /** @inheritdoc */ - intersectsNode(node) { - /** - * 1. If node’s root is different from the context object’s root, return false. - */ - if ((0, algorithm_1.tree_rootNode)(node) !== (0, algorithm_1.range_root)(this)) { - return false; - } - /** - * 2. Let parent be node’s parent. - * 3. If parent is null, return true. - */ - const parent = node._parent; - if (parent === null) - return true; - /** - * 4. Let offset be node’s index. - */ - const offset = (0, algorithm_1.tree_index)(node); - /** - * 5. If (parent, offset) is before end and (parent, offset plus 1) is - * after start, return true. - */ - if ((0, algorithm_1.boundaryPoint_position)([parent, offset], this._end) === interfaces_1.BoundaryPosition.Before && - (0, algorithm_1.boundaryPoint_position)([parent, offset + 1], this._start) === interfaces_1.BoundaryPosition.After) { - return true; - } - /** - * 6. Return false. - */ - return false; - } - toString() { - /** - * 1. Let s be the empty string. - */ - let s = ''; - /** - * 2. If the context object’s start node is the context object’s end node - * and it is a Text node, then return the substring of that Text node’s data - * beginning at the context object’s start offset and ending at the context - * object’s end offset. - */ - if (this._startNode === this._endNode && util_1.Guard.isTextNode(this._startNode)) { - return this._startNode._data.substring(this._startOffset, this._endOffset); - } - /** - * 3. If the context object’s start node is a Text node, then append the - * substring of that node’s data from the context object’s start offset - * until the end to s. - */ - if (util_1.Guard.isTextNode(this._startNode)) { - s += this._startNode._data.substring(this._startOffset); - } - /** - * 4. Append the concatenation of the data of all Text nodes that are - * contained in the context object, in tree order, to s. - */ - for (const child of (0, algorithm_1.range_getContainedNodes)(this)) { - if (util_1.Guard.isTextNode(child)) { - s += child._data; - } - } - /** - * 5. If the context object’s end node is a Text node, then append the - * substring of that node’s data from its start until the context object’s - * end offset to s. - */ - if (util_1.Guard.isTextNode(this._endNode)) { - s += this._endNode._data.substring(0, this._endOffset); - } - /** - * 6. Return s. - */ - return s; + comparators.forEach((comparator) => { + if (comparator.semver === ANY) { + comparator = new Comparator('>=0.0.0') + } + high = high || comparator + low = low || comparator + if (gtfn(comparator.semver, high.semver, options)) { + high = comparator + } else if (ltfn(comparator.semver, low.semver, options)) { + low = comparator + } + }) + + // If the edge version comparator has a operator then our version + // isn't outside it + if (high.operator === comp || high.operator === ecomp) { + return false } - /** - * Creates a new `Range`. - * - * @param start - start point - * @param end - end point - */ - static _create(start, end) { - const range = new RangeImpl(); - if (start) - range._start = start; - if (end) - range._end = end; - return range; + + // If the lowest version comparator has an operator and our version + // is less than it then it isn't higher than the range + if ((!low.operator || low.operator === comp) && + ltefn(version, low.semver)) { + return false + } else if (low.operator === ecomp && ltfn(version, low.semver)) { + return false } + } + return true } -exports.RangeImpl = RangeImpl; -/** - * Define constants on prototype. - */ -(0, WebIDLAlgorithm_1.idl_defineConst)(RangeImpl.prototype, "START_TO_START", 0); -(0, WebIDLAlgorithm_1.idl_defineConst)(RangeImpl.prototype, "START_TO_END", 1); -(0, WebIDLAlgorithm_1.idl_defineConst)(RangeImpl.prototype, "END_TO_END", 2); -(0, WebIDLAlgorithm_1.idl_defineConst)(RangeImpl.prototype, "END_TO_START", 3); -//# sourceMappingURL=RangeImpl.js.map + +module.exports = outside + /***/ }), -/***/ 6092: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 2028: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.ShadowRootImpl = void 0; -const DocumentFragmentImpl_1 = __nccwpck_require__(9793); -const util_1 = __nccwpck_require__(7061); -const algorithm_1 = __nccwpck_require__(6573); -/** - * Represents a shadow root. - */ -class ShadowRootImpl extends DocumentFragmentImpl_1.DocumentFragmentImpl { - _host; - _mode; - /** - * Initializes a new instance of `ShadowRoot`. - * - * @param host - shadow root's host element - * @param mode - shadow root's mode - */ - constructor(host, mode) { - super(); - this._host = host; - this._mode = mode; - } - /** @inheritdoc */ - get mode() { return this._mode; } - /** @inheritdoc */ - get host() { return this._host; } - /** - * Gets the parent event target for the given event. - * - * @param event - an event - */ - _getTheParent(event) { - /** - * A shadow root’s get the parent algorithm, given an event, returns null - * if event’s composed flag is unset and shadow root is the root of - * event’s path’s first struct’s invocation target, and shadow root’s host - * otherwise. - */ - if (!event._composedFlag && !(0, util_1.isEmpty)(event._path) && - (0, algorithm_1.tree_rootNode)(event._path[0].invocationTarget) === this) { - return null; - } - else { - return this._host; - } + +// given a set of versions and a range, create a "simplified" range +// that includes the same versions that the original range does +// If the original range is shorter than the simplified one, return that. +const satisfies = __nccwpck_require__(8011) +const compare = __nccwpck_require__(8469) +module.exports = (versions, range, options) => { + const set = [] + let first = null + let prev = null + const v = versions.sort((a, b) => compare(a, b, options)) + for (const version of v) { + const included = satisfies(version, range, options) + if (included) { + prev = version + if (!first) { + first = version + } + } else { + if (prev) { + set.push([first, prev]) + } + prev = null + first = null } - // MIXIN: DocumentOrShadowRoot - // No elements - /** - * Creates a new `ShadowRoot`. - * - * @param document - owner document - * @param host - shadow root's host element - */ - static _create(document, host) { - return new ShadowRootImpl(host, "closed"); + } + if (first) { + set.push([first, null]) + } + + const ranges = [] + for (const [min, max] of set) { + if (min === max) { + ranges.push(min) + } else if (!max && min === v[0]) { + ranges.push('*') + } else if (!max) { + ranges.push(`>=${min}`) + } else if (min === v[0]) { + ranges.push(`<=${max}`) + } else { + ranges.push(`${min} - ${max}`) } + } + const simplified = ranges.join(' || ') + const original = typeof range.raw === 'string' ? range.raw : String(range) + return simplified.length < original.length ? simplified : range } -exports.ShadowRootImpl = ShadowRootImpl; -//# sourceMappingURL=ShadowRootImpl.js.map + /***/ }), -/***/ 3940: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 1489: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.SlotableImpl = void 0; -const algorithm_1 = __nccwpck_require__(6573); -/** - * Represents a mixin that allows nodes to become the contents of - * a element. This mixin is implemented by {@link Element} and - * {@link Text}. - */ -class SlotableImpl { - __name; - __assignedSlot; - get _name() { return this.__name || ''; } - set _name(val) { this.__name = val; } - get _assignedSlot() { return this.__assignedSlot || null; } - set _assignedSlot(val) { this.__assignedSlot = val; } - /** @inheritdoc */ - get assignedSlot() { - return (0, algorithm_1.shadowTree_findASlot)(this, true); - } -} -exports.SlotableImpl = SlotableImpl; -//# sourceMappingURL=SlotableImpl.js.map -/***/ }), +const Range = __nccwpck_require__(6782) +const Comparator = __nccwpck_require__(9379) +const { ANY } = Comparator +const satisfies = __nccwpck_require__(8011) +const compare = __nccwpck_require__(8469) -/***/ 7685: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff: +// - Every simple range `r1, r2, ...` is a null set, OR +// - Every simple range `r1, r2, ...` which is not a null set is a subset of +// some `R1, R2, ...` +// +// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff: +// - If c is only the ANY comparator +// - If C is only the ANY comparator, return true +// - Else if in prerelease mode, return false +// - else replace c with `[>=0.0.0]` +// - If C is only the ANY comparator +// - if in prerelease mode, return true +// - else replace C with `[>=0.0.0]` +// - Let EQ be the set of = comparators in c +// - If EQ is more than one, return true (null set) +// - Let GT be the highest > or >= comparator in c +// - Let LT be the lowest < or <= comparator in c +// - If GT and LT, and GT.semver > LT.semver, return true (null set) +// - If any C is a = range, and GT or LT are set, return false +// - If EQ +// - If GT, and EQ does not satisfy GT, return true (null set) +// - If LT, and EQ does not satisfy LT, return true (null set) +// - If EQ satisfies every C, return true +// - Else return false +// - If GT +// - If GT.semver is lower than any > or >= comp in C, return false +// - If GT is >=, and GT.semver does not satisfy every C, return false +// - If GT.semver has a prerelease, and not in prerelease mode +// - If no C has a prerelease and the GT.semver tuple, return false +// - If LT +// - If LT.semver is greater than any < or <= comp in C, return false +// - If LT is <=, and LT.semver does not satisfy every C, return false +// - If LT.semver has a prerelease, and not in prerelease mode +// - If no C has a prerelease and the LT.semver tuple, return false +// - Else return true +const subset = (sub, dom, options = {}) => { + if (sub === dom) { + return true + } -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.StaticRangeImpl = void 0; -const AbstractRangeImpl_1 = __nccwpck_require__(3773); -const DOMException_1 = __nccwpck_require__(7175); -const util_1 = __nccwpck_require__(8247); -/** - * Represents a static range. - */ -class StaticRangeImpl extends AbstractRangeImpl_1.AbstractRangeImpl { - _start; - _end; - /** - * Initializes a new instance of `StaticRange`. - */ - constructor(init) { - super(); - /** - * 1. If init’s startContainer or endContainer is a DocumentType or Attr - * node, then throw an "InvalidNodeTypeError" DOMException. - * 2. Let staticRange be a new StaticRange object. - * 3. Set staticRange’s start to (init’s startContainer, init’s startOffset) - * and end to (init’s endContainer, init’s endOffset). - * 4. Return staticRange. - */ - if (util_1.Guard.isDocumentTypeNode(init.startContainer) || util_1.Guard.isAttrNode(init.startContainer) || - util_1.Guard.isDocumentTypeNode(init.endContainer) || util_1.Guard.isAttrNode(init.endContainer)) { - throw new DOMException_1.InvalidNodeTypeError(); - } - this._start = [init.startContainer, init.startOffset]; - this._end = [init.endContainer, init.endOffset]; + sub = new Range(sub, options) + dom = new Range(dom, options) + let sawNonNull = false + + OUTER: for (const simpleSub of sub.set) { + for (const simpleDom of dom.set) { + const isSub = simpleSubset(simpleSub, simpleDom, options) + sawNonNull = sawNonNull || isSub !== null + if (isSub) { + continue OUTER + } } + // the null set is a subset of everything, but null simple ranges in + // a complex range should be ignored. so if we saw a non-null range, + // then we know this isn't a subset, but if EVERY simple range was null, + // then it is a subset. + if (sawNonNull) { + return false + } + } + return true } -exports.StaticRangeImpl = StaticRangeImpl; -//# sourceMappingURL=StaticRangeImpl.js.map - -/***/ }), -/***/ 4063: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +const minimumVersionWithPreRelease = [new Comparator('>=0.0.0-0')] +const minimumVersion = [new Comparator('>=0.0.0')] +const simpleSubset = (sub, dom, options) => { + if (sub === dom) { + return true + } -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.TextImpl = void 0; -const interfaces_1 = __nccwpck_require__(9454); -const CharacterDataImpl_1 = __nccwpck_require__(765); -const algorithm_1 = __nccwpck_require__(6573); -const WebIDLAlgorithm_1 = __nccwpck_require__(4239); -/** - * Represents a text node. - */ -class TextImpl extends CharacterDataImpl_1.CharacterDataImpl { - _nodeType = interfaces_1.NodeType.Text; - _name = ''; - _assignedSlot = null; - /** - * Initializes a new instance of `Text`. - * - * @param data - the text content - */ - constructor(data = '') { - super(data); - } - /** @inheritdoc */ - get wholeText() { - /** - * The wholeText attribute’s getter must return the concatenation of the - * data of the contiguous Text nodes of the context object, in tree order. - */ - let text = ''; - for (const node of (0, algorithm_1.text_contiguousTextNodes)(this, true)) { - text = text + node._data; - } - return text; + if (sub.length === 1 && sub[0].semver === ANY) { + if (dom.length === 1 && dom[0].semver === ANY) { + return true + } else if (options.includePrerelease) { + sub = minimumVersionWithPreRelease + } else { + sub = minimumVersion } - /** @inheritdoc */ - splitText(offset) { - /** - * The splitText(offset) method, when invoked, must split context object - * with offset offset. - */ - return (0, algorithm_1.text_split)(this, offset); + } + + if (dom.length === 1 && dom[0].semver === ANY) { + if (options.includePrerelease) { + return true + } else { + dom = minimumVersion } - // MIXIN: Slotable - /* istanbul ignore next */ - get assignedSlot() { throw new Error("Mixin: Slotable not implemented."); } - /** - * Creates a `Text`. - * - * @param document - owner document - * @param data - the text content - */ - static _create(document, data = '') { - const node = new TextImpl(data); - node._nodeDocument = document; - return node; + } + + const eqSet = new Set() + let gt, lt + for (const c of sub) { + if (c.operator === '>' || c.operator === '>=') { + gt = higherGT(gt, c, options) + } else if (c.operator === '<' || c.operator === '<=') { + lt = lowerLT(lt, c, options) + } else { + eqSet.add(c.semver) } -} -exports.TextImpl = TextImpl; -/** - * Initialize prototype properties - */ -(0, WebIDLAlgorithm_1.idl_defineConst)(TextImpl.prototype, "_nodeType", interfaces_1.NodeType.Text); -//# sourceMappingURL=TextImpl.js.map + } -/***/ }), + if (eqSet.size > 1) { + return null + } -/***/ 8506: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + let gtltComp + if (gt && lt) { + gtltComp = compare(gt.semver, lt.semver, options) + if (gtltComp > 0) { + return null + } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) { + return null + } + } + // will iterate one or zero times + for (const eq of eqSet) { + if (gt && !satisfies(eq, String(gt), options)) { + return null + } -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.TraverserImpl = void 0; -const interfaces_1 = __nccwpck_require__(9454); -/** - * Represents an object which can be used to iterate through the nodes - * of a subtree. - */ -class TraverserImpl { - _activeFlag; - _root; - _whatToShow; - _filter; - /** - * Initializes a new instance of `Traverser`. - * - * @param root - root node - */ - constructor(root) { - this._activeFlag = false; - this._root = root; - this._whatToShow = interfaces_1.WhatToShow.All; - this._filter = null; - } - /** @inheritdoc */ - get root() { return this._root; } - /** @inheritdoc */ - get whatToShow() { return this._whatToShow; } - /** @inheritdoc */ - get filter() { return this._filter; } -} -exports.TraverserImpl = TraverserImpl; -//# sourceMappingURL=TraverserImpl.js.map + if (lt && !satisfies(eq, String(lt), options)) { + return null + } -/***/ }), + for (const c of dom) { + if (!satisfies(eq, String(c), options)) { + return false + } + } -/***/ 6254: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + return true + } + let higher, lower + let hasDomLT, hasDomGT + // if the subset has a prerelease, we need a comparator in the superset + // with the same tuple and a prerelease, or it's not a subset + let needDomLTPre = lt && + !options.includePrerelease && + lt.semver.prerelease.length ? lt.semver : false + let needDomGTPre = gt && + !options.includePrerelease && + gt.semver.prerelease.length ? gt.semver : false + // exception: <1.2.3-0 is the same as <1.2.3 + if (needDomLTPre && needDomLTPre.prerelease.length === 1 && + lt.operator === '<' && needDomLTPre.prerelease[0] === 0) { + needDomLTPre = false + } -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.TreeWalkerImpl = void 0; -const interfaces_1 = __nccwpck_require__(9454); -const TraverserImpl_1 = __nccwpck_require__(8506); -const algorithm_1 = __nccwpck_require__(6573); -/** - * Represents the nodes of a subtree and a position within them. - */ -class TreeWalkerImpl extends TraverserImpl_1.TraverserImpl { - _current; - /** - * Initializes a new instance of `TreeWalker`. - */ - constructor(root, current) { - super(root); - this._current = current; - } - /** @inheritdoc */ - get currentNode() { return this._current; } - set currentNode(value) { this._current = value; } - /** @inheritdoc */ - parentNode() { - /** - * 1. Let node be the context object’s current. - * 2. While node is non-null and is not the context object’s root: - */ - let node = this._current; - while (node !== null && node !== this._root) { - /** - * 2.1. Set node to node’s parent. - * 2.2. If node is non-null and filtering node within the context object - * returns FILTER_ACCEPT, then set the context object’s current to node - * and return node. - */ - node = node._parent; - if (node !== null && - (0, algorithm_1.traversal_filter)(this, node) === interfaces_1.FilterResult.Accept) { - this._current = node; - return node; - } + for (const c of dom) { + hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>=' + hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<=' + if (gt) { + if (needDomGTPre) { + if (c.semver.prerelease && c.semver.prerelease.length && + c.semver.major === needDomGTPre.major && + c.semver.minor === needDomGTPre.minor && + c.semver.patch === needDomGTPre.patch) { + needDomGTPre = false } - /** - * 3. Return null. - */ - return null; - } - /** @inheritdoc */ - firstChild() { - /** - * The firstChild() method, when invoked, must traverse children with the - * context object and first. - */ - return (0, algorithm_1.treeWalker_traverseChildren)(this, true); - } - /** @inheritdoc */ - lastChild() { - /** - * The lastChild() method, when invoked, must traverse children with the - * context object and last. - */ - return (0, algorithm_1.treeWalker_traverseChildren)(this, false); - } - /** @inheritdoc */ - nextSibling() { - /** - * The nextSibling() method, when invoked, must traverse siblings with the - * context object and next. - */ - return (0, algorithm_1.treeWalker_traverseSiblings)(this, true); - } - /** @inheritdoc */ - previousNode() { - /** - * 1. Let node be the context object’s current. - * 2. While node is not the context object’s root: - */ - let node = this._current; - while (node !== this._root) { - /** - * 2.1. Let sibling be node’s previous sibling. - * 2.2. While sibling is non-null: - */ - let sibling = node._previousSibling; - while (sibling) { - /** - * 2.2.1. Set node to sibling. - * 2.2.2. Let result be the result of filtering node within the context - * object. - */ - node = sibling; - let result = (0, algorithm_1.traversal_filter)(this, node); - /** - * 2.2.3. While result is not FILTER_REJECT and node has a child: - */ - while (result !== interfaces_1.FilterResult.Reject && node._lastChild) { - /** - * 2.2.3.1. Set node to node’s last child. - * 2.2.3.2. Set result to the result of filtering node within the - * context object. - */ - node = node._lastChild; - result = (0, algorithm_1.traversal_filter)(this, node); - } - /** - * 2.2.4. If result is FILTER_ACCEPT, then set the context object’s - * current to node and return node. - */ - if (result === interfaces_1.FilterResult.Accept) { - this._current = node; - return node; - } - /** - * 2.2.5. Set sibling to node’s previous sibling. - */ - sibling = node._previousSibling; - } - /** - * 2.3. If node is the context object’s root or node’s parent is null, - * then return null. - */ - if (node === this._root || node._parent === null) { - return null; - } - /** - * 2.4. Set node to node’s parent. - */ - node = node._parent; - /** - * 2.5. If the return value of filtering node within the context object is - * FILTER_ACCEPT, then set the context object’s current to node and - * return node. - */ - if ((0, algorithm_1.traversal_filter)(this, node) === interfaces_1.FilterResult.Accept) { - this._current = node; - return node; - } + } + if (c.operator === '>' || c.operator === '>=') { + higher = higherGT(gt, c, options) + if (higher === c && higher !== gt) { + return false } - /** - * 3. Return null. - */ - return null; + } else if (gt.operator === '>=' && !c.test(gt.semver)) { + return false + } } - /** @inheritdoc */ - previousSibling() { - /** - * The previousSibling() method, when invoked, must traverse siblings with - * the context object and previous. - */ - return (0, algorithm_1.treeWalker_traverseSiblings)(this, false); - } - /** @inheritdoc */ - nextNode() { - /** - * 1. Let node be the context object’s current. - * 2. Let result be FILTER_ACCEPT. - * 3. While true: - */ - let node = this._current; - let result = interfaces_1.FilterResult.Accept; - while (true) { - /** - * 3.1. While result is not FILTER_REJECT and node has a child: - */ - while (result !== interfaces_1.FilterResult.Reject && node._firstChild) { - /** - * 3.1.1. Set node to its first child. - * 3.1.2. Set result to the result of filtering node within the context - * object. - * 3.1.3. If result is FILTER_ACCEPT, then set the context object’s - * current to node and return node. - */ - node = node._firstChild; - result = (0, algorithm_1.traversal_filter)(this, node); - if (result === interfaces_1.FilterResult.Accept) { - this._current = node; - return node; - } - } - /** - * 3.2. Let sibling be null. - * 3.3. Let temporary be node. - * 3.4. While temporary is non-null: - */ - let sibling = null; - let temporary = node; - while (temporary !== null) { - /** - * 3.4.1. If temporary is the context object’s root, then return null. - */ - if (temporary === this._root) { - return null; - } - /** - * 3.4.2. Set sibling to temporary’s next sibling. - * 3.4.3. If sibling is non-null, then break. - */ - sibling = temporary._nextSibling; - if (sibling !== null) { - node = sibling; - break; - } - /** - * 3.4.4. Set temporary to temporary’s parent. - */ - temporary = temporary._parent; - } - /** - * 3.5. Set result to the result of filtering node within the context object. - * 3.6. If result is FILTER_ACCEPT, then set the context object’s current - * to node and return node. - */ - result = (0, algorithm_1.traversal_filter)(this, node); - if (result === interfaces_1.FilterResult.Accept) { - this._current = node; - return node; - } + if (lt) { + if (needDomLTPre) { + if (c.semver.prerelease && c.semver.prerelease.length && + c.semver.major === needDomLTPre.major && + c.semver.minor === needDomLTPre.minor && + c.semver.patch === needDomLTPre.patch) { + needDomLTPre = false + } + } + if (c.operator === '<' || c.operator === '<=') { + lower = lowerLT(lt, c, options) + if (lower === c && lower !== lt) { + return false } + } else if (lt.operator === '<=' && !c.test(lt.semver)) { + return false + } } - /** - * Creates a new `TreeWalker`. - * - * @param root - iterator's root node - * @param current - current node - */ - static _create(root, current) { - return new TreeWalkerImpl(root, current); + if (!c.operator && (lt || gt) && gtltComp !== 0) { + return false } -} -exports.TreeWalkerImpl = TreeWalkerImpl; -//# sourceMappingURL=TreeWalkerImpl.js.map + } -/***/ }), + // if there was a < or >, and nothing in the dom, then must be false + // UNLESS it was limited by another range in the other direction. + // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0 + if (gt && hasDomLT && !lt && gtltComp !== 0) { + return false + } -/***/ 1448: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + if (lt && hasDomGT && !gt && gtltComp !== 0) { + return false + } + // we needed a prerelease range in a specific tuple, but didn't get one + // then this isn't a subset. eg >=1.2.3-pre is not a subset of >=1.0.0, + // because it includes prereleases in the 1.2.3 tuple + if (needDomGTPre || needDomLTPre) { + return false + } -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.WindowImpl = void 0; -const EventTargetImpl_1 = __nccwpck_require__(3611); -const util_1 = __nccwpck_require__(7061); -const algorithm_1 = __nccwpck_require__(6573); -/** - * Represents a window containing a DOM document. - */ -class WindowImpl extends EventTargetImpl_1.EventTargetImpl { - _currentEvent; - _signalSlots = new Set(); - _mutationObserverMicrotaskQueued = false; - _mutationObservers = new Set(); - _associatedDocument; - _iteratorList = new util_1.FixedSizeSet(); - /** - * Initializes a new instance of `Window`. - */ - constructor() { - super(); - this._associatedDocument = (0, algorithm_1.create_document)(); - } - /** @inheritdoc */ - get document() { return this._associatedDocument; } - /** @inheritdoc */ - get event() { return this._currentEvent; } - /** - * Creates a new window with a blank document. - */ - static _create() { - return new WindowImpl(); - } + return true } -exports.WindowImpl = WindowImpl; -//# sourceMappingURL=WindowImpl.js.map - -/***/ }), - -/***/ 4602: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.XMLDocumentImpl = void 0; -const DocumentImpl_1 = __nccwpck_require__(2113); -/** - * Represents an XML document. - */ -class XMLDocumentImpl extends DocumentImpl_1.DocumentImpl { - /** - * Initializes a new instance of `XMLDocument`. - */ - constructor() { - super(); - } +// >=1.2.3 is lower than >1.2.3 +const higherGT = (a, b, options) => { + if (!a) { + return b + } + const comp = compare(a.semver, b.semver, options) + return comp > 0 ? a + : comp < 0 ? b + : b.operator === '>' && a.operator === '>=' ? b + : a } -exports.XMLDocumentImpl = XMLDocumentImpl; -//# sourceMappingURL=XMLDocumentImpl.js.map -/***/ }), - -/***/ 4204: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +// <=1.2.3 is higher than <1.2.3 +const lowerLT = (a, b, options) => { + if (!a) { + return b + } + const comp = compare(a.semver, b.semver, options) + return comp < 0 ? a + : comp > 0 ? b + : b.operator === '<' && a.operator === '<=' ? b + : a +} +module.exports = subset -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.XMLDocument = exports.Window = exports.TreeWalker = exports.Traverser = exports.Text = exports.StaticRange = exports.ShadowRoot = exports.Range = exports.ProcessingInstruction = exports.NodeListStatic = exports.NodeList = exports.NodeIterator = exports.Node = exports.NodeFilter = exports.NamedNodeMap = exports.MutationRecord = exports.MutationObserver = exports.HTMLCollection = exports.EventTarget = exports.Event = exports.Element = exports.DOMTokenList = exports.DOMImplementation = exports.dom = exports.DocumentType = exports.Document = exports.DocumentFragment = exports.CustomEvent = exports.Comment = exports.CharacterData = exports.CDATASection = exports.Attr = exports.AbstractRange = exports.AbortSignal = exports.AbortController = void 0; -const util_1 = __nccwpck_require__(7061); -// Import implementation classes -const AbortControllerImpl_1 = __nccwpck_require__(7528); -Object.defineProperty(exports, "AbortController", ({ enumerable: true, get: function () { return AbortControllerImpl_1.AbortControllerImpl; } })); -const AbortSignalImpl_1 = __nccwpck_require__(4560); -Object.defineProperty(exports, "AbortSignal", ({ enumerable: true, get: function () { return AbortSignalImpl_1.AbortSignalImpl; } })); -const AbstractRangeImpl_1 = __nccwpck_require__(3773); -Object.defineProperty(exports, "AbstractRange", ({ enumerable: true, get: function () { return AbstractRangeImpl_1.AbstractRangeImpl; } })); -const AttrImpl_1 = __nccwpck_require__(2875); -Object.defineProperty(exports, "Attr", ({ enumerable: true, get: function () { return AttrImpl_1.AttrImpl; } })); -const CDATASectionImpl_1 = __nccwpck_require__(4104); -Object.defineProperty(exports, "CDATASection", ({ enumerable: true, get: function () { return CDATASectionImpl_1.CDATASectionImpl; } })); -const CharacterDataImpl_1 = __nccwpck_require__(765); -Object.defineProperty(exports, "CharacterData", ({ enumerable: true, get: function () { return CharacterDataImpl_1.CharacterDataImpl; } })); -const ChildNodeImpl_1 = __nccwpck_require__(3728); -const CommentImpl_1 = __nccwpck_require__(8223); -Object.defineProperty(exports, "Comment", ({ enumerable: true, get: function () { return CommentImpl_1.CommentImpl; } })); -const CustomEventImpl_1 = __nccwpck_require__(3171); -Object.defineProperty(exports, "CustomEvent", ({ enumerable: true, get: function () { return CustomEventImpl_1.CustomEventImpl; } })); -const DocumentFragmentImpl_1 = __nccwpck_require__(9793); -Object.defineProperty(exports, "DocumentFragment", ({ enumerable: true, get: function () { return DocumentFragmentImpl_1.DocumentFragmentImpl; } })); -const DocumentImpl_1 = __nccwpck_require__(2113); -Object.defineProperty(exports, "Document", ({ enumerable: true, get: function () { return DocumentImpl_1.DocumentImpl; } })); -const DocumentOrShadowRootImpl_1 = __nccwpck_require__(8024); -const DocumentTypeImpl_1 = __nccwpck_require__(1401); -Object.defineProperty(exports, "DocumentType", ({ enumerable: true, get: function () { return DocumentTypeImpl_1.DocumentTypeImpl; } })); -const DOMImpl_1 = __nccwpck_require__(698); -Object.defineProperty(exports, "dom", ({ enumerable: true, get: function () { return DOMImpl_1.dom; } })); -const DOMImplementationImpl_1 = __nccwpck_require__(6348); -Object.defineProperty(exports, "DOMImplementation", ({ enumerable: true, get: function () { return DOMImplementationImpl_1.DOMImplementationImpl; } })); -const DOMTokenListImpl_1 = __nccwpck_require__(6629); -Object.defineProperty(exports, "DOMTokenList", ({ enumerable: true, get: function () { return DOMTokenListImpl_1.DOMTokenListImpl; } })); -const ElementImpl_1 = __nccwpck_require__(1342); -Object.defineProperty(exports, "Element", ({ enumerable: true, get: function () { return ElementImpl_1.ElementImpl; } })); -const EventImpl_1 = __nccwpck_require__(2390); -Object.defineProperty(exports, "Event", ({ enumerable: true, get: function () { return EventImpl_1.EventImpl; } })); -const EventTargetImpl_1 = __nccwpck_require__(3611); -Object.defineProperty(exports, "EventTarget", ({ enumerable: true, get: function () { return EventTargetImpl_1.EventTargetImpl; } })); -const HTMLCollectionImpl_1 = __nccwpck_require__(9065); -Object.defineProperty(exports, "HTMLCollection", ({ enumerable: true, get: function () { return HTMLCollectionImpl_1.HTMLCollectionImpl; } })); -const MutationObserverImpl_1 = __nccwpck_require__(9137); -Object.defineProperty(exports, "MutationObserver", ({ enumerable: true, get: function () { return MutationObserverImpl_1.MutationObserverImpl; } })); -const MutationRecordImpl_1 = __nccwpck_require__(33); -Object.defineProperty(exports, "MutationRecord", ({ enumerable: true, get: function () { return MutationRecordImpl_1.MutationRecordImpl; } })); -const NamedNodeMapImpl_1 = __nccwpck_require__(3145); -Object.defineProperty(exports, "NamedNodeMap", ({ enumerable: true, get: function () { return NamedNodeMapImpl_1.NamedNodeMapImpl; } })); -const NodeFilterImpl_1 = __nccwpck_require__(4649); -Object.defineProperty(exports, "NodeFilter", ({ enumerable: true, get: function () { return NodeFilterImpl_1.NodeFilterImpl; } })); -const NodeImpl_1 = __nccwpck_require__(2280); -Object.defineProperty(exports, "Node", ({ enumerable: true, get: function () { return NodeImpl_1.NodeImpl; } })); -const NodeIteratorImpl_1 = __nccwpck_require__(4142); -Object.defineProperty(exports, "NodeIterator", ({ enumerable: true, get: function () { return NodeIteratorImpl_1.NodeIteratorImpl; } })); -const NodeListImpl_1 = __nccwpck_require__(5788); -Object.defineProperty(exports, "NodeList", ({ enumerable: true, get: function () { return NodeListImpl_1.NodeListImpl; } })); -const NodeListStaticImpl_1 = __nccwpck_require__(7654); -Object.defineProperty(exports, "NodeListStatic", ({ enumerable: true, get: function () { return NodeListStaticImpl_1.NodeListStaticImpl; } })); -const NonDocumentTypeChildNodeImpl_1 = __nccwpck_require__(2256); -const NonElementParentNodeImpl_1 = __nccwpck_require__(5325); -const ParentNodeImpl_1 = __nccwpck_require__(1824); -const ProcessingInstructionImpl_1 = __nccwpck_require__(2755); -Object.defineProperty(exports, "ProcessingInstruction", ({ enumerable: true, get: function () { return ProcessingInstructionImpl_1.ProcessingInstructionImpl; } })); -const RangeImpl_1 = __nccwpck_require__(3691); -Object.defineProperty(exports, "Range", ({ enumerable: true, get: function () { return RangeImpl_1.RangeImpl; } })); -const ShadowRootImpl_1 = __nccwpck_require__(6092); -Object.defineProperty(exports, "ShadowRoot", ({ enumerable: true, get: function () { return ShadowRootImpl_1.ShadowRootImpl; } })); -const SlotableImpl_1 = __nccwpck_require__(3940); -const StaticRangeImpl_1 = __nccwpck_require__(7685); -Object.defineProperty(exports, "StaticRange", ({ enumerable: true, get: function () { return StaticRangeImpl_1.StaticRangeImpl; } })); -const TextImpl_1 = __nccwpck_require__(4063); -Object.defineProperty(exports, "Text", ({ enumerable: true, get: function () { return TextImpl_1.TextImpl; } })); -const TraverserImpl_1 = __nccwpck_require__(8506); -Object.defineProperty(exports, "Traverser", ({ enumerable: true, get: function () { return TraverserImpl_1.TraverserImpl; } })); -const TreeWalkerImpl_1 = __nccwpck_require__(6254); -Object.defineProperty(exports, "TreeWalker", ({ enumerable: true, get: function () { return TreeWalkerImpl_1.TreeWalkerImpl; } })); -const WindowImpl_1 = __nccwpck_require__(1448); -Object.defineProperty(exports, "Window", ({ enumerable: true, get: function () { return WindowImpl_1.WindowImpl; } })); -const XMLDocumentImpl_1 = __nccwpck_require__(4602); -Object.defineProperty(exports, "XMLDocument", ({ enumerable: true, get: function () { return XMLDocumentImpl_1.XMLDocumentImpl; } })); -// Apply mixins -// ChildNode -(0, util_1.applyMixin)(ElementImpl_1.ElementImpl, ChildNodeImpl_1.ChildNodeImpl); -(0, util_1.applyMixin)(CharacterDataImpl_1.CharacterDataImpl, ChildNodeImpl_1.ChildNodeImpl); -(0, util_1.applyMixin)(DocumentTypeImpl_1.DocumentTypeImpl, ChildNodeImpl_1.ChildNodeImpl); -// DocumentOrShadowRoot -(0, util_1.applyMixin)(DocumentImpl_1.DocumentImpl, DocumentOrShadowRootImpl_1.DocumentOrShadowRootImpl); -(0, util_1.applyMixin)(ShadowRootImpl_1.ShadowRootImpl, DocumentOrShadowRootImpl_1.DocumentOrShadowRootImpl); -// NonDocumentTypeChildNode -(0, util_1.applyMixin)(ElementImpl_1.ElementImpl, NonDocumentTypeChildNodeImpl_1.NonDocumentTypeChildNodeImpl); -(0, util_1.applyMixin)(CharacterDataImpl_1.CharacterDataImpl, NonDocumentTypeChildNodeImpl_1.NonDocumentTypeChildNodeImpl); -// NonElementParentNode -(0, util_1.applyMixin)(DocumentImpl_1.DocumentImpl, NonElementParentNodeImpl_1.NonElementParentNodeImpl); -(0, util_1.applyMixin)(DocumentFragmentImpl_1.DocumentFragmentImpl, NonElementParentNodeImpl_1.NonElementParentNodeImpl); -// ParentNode -(0, util_1.applyMixin)(DocumentImpl_1.DocumentImpl, ParentNodeImpl_1.ParentNodeImpl); -(0, util_1.applyMixin)(DocumentFragmentImpl_1.DocumentFragmentImpl, ParentNodeImpl_1.ParentNodeImpl); -(0, util_1.applyMixin)(ElementImpl_1.ElementImpl, ParentNodeImpl_1.ParentNodeImpl); -// Slotable -(0, util_1.applyMixin)(TextImpl_1.TextImpl, SlotableImpl_1.SlotableImpl); -(0, util_1.applyMixin)(ElementImpl_1.ElementImpl, SlotableImpl_1.SlotableImpl); -//# sourceMappingURL=index.js.map /***/ }), -/***/ 9454: -/***/ ((__unused_webpack_module, exports) => { +/***/ 4750: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.HowToCompare = exports.WhatToShow = exports.FilterResult = exports.Position = exports.NodeType = exports.EventPhase = exports.BoundaryPosition = void 0; -/** - * Defines the position of a boundary point relative to another. - */ -var BoundaryPosition; -(function (BoundaryPosition) { - BoundaryPosition[BoundaryPosition["Before"] = 0] = "Before"; - BoundaryPosition[BoundaryPosition["Equal"] = 1] = "Equal"; - BoundaryPosition[BoundaryPosition["After"] = 2] = "After"; -})(BoundaryPosition || (exports.BoundaryPosition = BoundaryPosition = {})); -/** - * Defines the event phase. - */ -var EventPhase; -(function (EventPhase) { - EventPhase[EventPhase["None"] = 0] = "None"; - EventPhase[EventPhase["Capturing"] = 1] = "Capturing"; - EventPhase[EventPhase["AtTarget"] = 2] = "AtTarget"; - EventPhase[EventPhase["Bubbling"] = 3] = "Bubbling"; -})(EventPhase || (exports.EventPhase = EventPhase = {})); -/** - * Defines the type of a node object. - */ -var NodeType; -(function (NodeType) { - NodeType[NodeType["Element"] = 1] = "Element"; - NodeType[NodeType["Attribute"] = 2] = "Attribute"; - NodeType[NodeType["Text"] = 3] = "Text"; - NodeType[NodeType["CData"] = 4] = "CData"; - NodeType[NodeType["EntityReference"] = 5] = "EntityReference"; - NodeType[NodeType["Entity"] = 6] = "Entity"; - NodeType[NodeType["ProcessingInstruction"] = 7] = "ProcessingInstruction"; - NodeType[NodeType["Comment"] = 8] = "Comment"; - NodeType[NodeType["Document"] = 9] = "Document"; - NodeType[NodeType["DocumentType"] = 10] = "DocumentType"; - NodeType[NodeType["DocumentFragment"] = 11] = "DocumentFragment"; - NodeType[NodeType["Notation"] = 12] = "Notation"; // historical -})(NodeType || (exports.NodeType = NodeType = {})); -/** - * Defines the position of a node in the document relative to another - * node. - */ -var Position; -(function (Position) { - Position[Position["SameNode"] = 0] = "SameNode"; - Position[Position["Disconnected"] = 1] = "Disconnected"; - Position[Position["Preceding"] = 2] = "Preceding"; - Position[Position["Following"] = 4] = "Following"; - Position[Position["Contains"] = 8] = "Contains"; - Position[Position["ContainedBy"] = 16] = "ContainedBy"; - Position[Position["ImplementationSpecific"] = 32] = "ImplementationSpecific"; -})(Position || (exports.Position = Position = {})); -/** - * Defines the return value of a filter callback. - */ -var FilterResult; -(function (FilterResult) { - FilterResult[FilterResult["Accept"] = 1] = "Accept"; - FilterResult[FilterResult["Reject"] = 2] = "Reject"; - FilterResult[FilterResult["Skip"] = 3] = "Skip"; -})(FilterResult || (exports.FilterResult = FilterResult = {})); -/** - * Defines what to show in node filter. - */ -var WhatToShow; -(function (WhatToShow) { - WhatToShow[WhatToShow["All"] = 4294967295] = "All"; - WhatToShow[WhatToShow["Element"] = 1] = "Element"; - WhatToShow[WhatToShow["Attribute"] = 2] = "Attribute"; - WhatToShow[WhatToShow["Text"] = 4] = "Text"; - WhatToShow[WhatToShow["CDataSection"] = 8] = "CDataSection"; - WhatToShow[WhatToShow["EntityReference"] = 16] = "EntityReference"; - WhatToShow[WhatToShow["Entity"] = 32] = "Entity"; - WhatToShow[WhatToShow["ProcessingInstruction"] = 64] = "ProcessingInstruction"; - WhatToShow[WhatToShow["Comment"] = 128] = "Comment"; - WhatToShow[WhatToShow["Document"] = 256] = "Document"; - WhatToShow[WhatToShow["DocumentType"] = 512] = "DocumentType"; - WhatToShow[WhatToShow["DocumentFragment"] = 1024] = "DocumentFragment"; - WhatToShow[WhatToShow["Notation"] = 2048] = "Notation"; -})(WhatToShow || (exports.WhatToShow = WhatToShow = {})); -/** - * Defines how boundary points are compared. - */ -var HowToCompare; -(function (HowToCompare) { - HowToCompare[HowToCompare["StartToStart"] = 0] = "StartToStart"; - HowToCompare[HowToCompare["StartToEnd"] = 1] = "StartToEnd"; - HowToCompare[HowToCompare["EndToEnd"] = 2] = "EndToEnd"; - HowToCompare[HowToCompare["EndToStart"] = 3] = "EndToStart"; -})(HowToCompare || (exports.HowToCompare = HowToCompare = {})); -//# sourceMappingURL=interfaces.js.map -/***/ }), +const Range = __nccwpck_require__(6782) -/***/ 6371: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +// Mostly just for testing and legacy API reasons +const toComparators = (range, options) => + new Range(range, options).set + .map(comp => comp.map(c => c.value).join(' ').trim().split(' ')) +module.exports = toComparators -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.XMLSerializer = exports.DOMParser = exports.DOMImplementation = void 0; -const dom_1 = __nccwpck_require__(4204); -dom_1.dom.setFeatures(true); -var dom_2 = __nccwpck_require__(4204); -Object.defineProperty(exports, "DOMImplementation", ({ enumerable: true, get: function () { return dom_2.DOMImplementation; } })); -var parser_1 = __nccwpck_require__(8531); -Object.defineProperty(exports, "DOMParser", ({ enumerable: true, get: function () { return parser_1.DOMParser; } })); -var serializer_1 = __nccwpck_require__(6052); -Object.defineProperty(exports, "XMLSerializer", ({ enumerable: true, get: function () { return serializer_1.XMLSerializer; } })); -//# sourceMappingURL=index.js.map /***/ }), -/***/ 6182: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 4737: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.DOMParserImpl = void 0; -const algorithm_1 = __nccwpck_require__(6573); -const XMLParserImpl_1 = __nccwpck_require__(3515); -/** - * Represents a parser for XML and HTML content. - * - * See: https://w3c.github.io/DOM-Parsing/#the-domparser-interface - */ -class DOMParserImpl { - /** @inheritdoc */ - parseFromString(source, mimeType) { - if (mimeType === "text/html") - throw new Error('HTML parser not implemented.'); - try { - const parser = new XMLParserImpl_1.XMLParserImpl(); - const doc = parser.parse(source); - doc._contentType = mimeType; - return doc; - } - catch (e) { - const errorNS = "http://www.mozilla.org/newlayout/xml/parsererror.xml"; - const doc = (0, algorithm_1.create_xmlDocument)(); - const root = doc.createElementNS(errorNS, "parsererror"); - const ele = doc.createElementNS(errorNS, "error"); - ele.setAttribute("message", e.message); - root.appendChild(ele); - doc.appendChild(root); - return doc; - } - } + +const Range = __nccwpck_require__(6782) +const validRange = (range, options) => { + try { + // Return '*' instead of '' so that truthiness works. + // This will throw if it's invalid anyway + return new Range(range, options).range || '*' + } catch (er) { + return null + } } -exports.DOMParserImpl = DOMParserImpl; -//# sourceMappingURL=DOMParserImpl.js.map +module.exports = validRange + /***/ }), -/***/ 3515: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 770: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +module.exports = __nccwpck_require__(218); -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.XMLParserImpl = void 0; -const XMLStringLexer_1 = __nccwpck_require__(3529); -const interfaces_1 = __nccwpck_require__(4727); -const infra_1 = __nccwpck_require__(4737); -const algorithm_1 = __nccwpck_require__(6573); -const LocalNameSet_1 = __nccwpck_require__(7830); -/** - * Represents a parser for XML content. - * - * See: https://html.spec.whatwg.org/#xml-parser - */ -class XMLParserImpl { - /** - * Parses XML content. - * - * @param source - a string containing XML content - */ - parse(source) { - const lexer = new XMLStringLexer_1.XMLStringLexer(source, { skipWhitespaceOnlyText: true }); - const doc = (0, algorithm_1.create_document)(); - let context = doc; - let token = lexer.nextToken(); - while (token.type !== interfaces_1.TokenType.EOF) { - switch (token.type) { - case interfaces_1.TokenType.Declaration: - const declaration = token; - if (declaration.version !== "1.0") { - throw new Error("Invalid xml version: " + declaration.version); - } - break; - case interfaces_1.TokenType.DocType: - const doctype = token; - if (!(0, algorithm_1.xml_isPubidChar)(doctype.pubId)) { - throw new Error("DocType public identifier does not match PubidChar construct."); - } - if (!(0, algorithm_1.xml_isLegalChar)(doctype.sysId) || - (doctype.sysId.indexOf('"') !== -1 && doctype.sysId.indexOf("'") !== -1)) { - throw new Error("DocType system identifier contains invalid characters."); - } - context.appendChild(doc.implementation.createDocumentType(doctype.name, doctype.pubId, doctype.sysId)); - break; - case interfaces_1.TokenType.CDATA: - const cdata = token; - if (!(0, algorithm_1.xml_isLegalChar)(cdata.data) || - cdata.data.indexOf("]]>") !== -1) { - throw new Error("CDATA contains invalid characters."); - } - context.appendChild(doc.createCDATASection(cdata.data)); - break; - case interfaces_1.TokenType.Comment: - const comment = token; - if (!(0, algorithm_1.xml_isLegalChar)(comment.data) || - comment.data.indexOf("--") !== -1 || comment.data.endsWith("-")) { - throw new Error("Comment data contains invalid characters."); - } - context.appendChild(doc.createComment(comment.data)); - break; - case interfaces_1.TokenType.PI: - const pi = token; - if (pi.target.indexOf(":") !== -1 || (/^xml$/i).test(pi.target)) { - throw new Error("Processing instruction target contains invalid characters."); - } - if (!(0, algorithm_1.xml_isLegalChar)(pi.data) || pi.data.indexOf("?>") !== -1) { - throw new Error("Processing instruction data contains invalid characters."); - } - context.appendChild(doc.createProcessingInstruction(pi.target, pi.data)); - break; - case interfaces_1.TokenType.Text: - const text = token; - if (!(0, algorithm_1.xml_isLegalChar)(text.data)) { - throw new Error("Text data contains invalid characters."); - } - context.appendChild(doc.createTextNode(this._decodeText(text.data))); - break; - case interfaces_1.TokenType.Element: - const element = token; - // inherit namespace from parent - const [prefix, localName] = (0, algorithm_1.namespace_extractQName)(element.name); - if (localName.indexOf(":") !== -1 || !(0, algorithm_1.xml_isName)(localName)) { - throw new Error("Node local name contains invalid characters."); - } - if (prefix === "xmlns") { - throw new Error("An element cannot have the 'xmlns' prefix."); - } - let namespace = context.lookupNamespaceURI(prefix); - // override namespace if there is a namespace declaration - // attribute - // also lookup namespace declaration attributes - const nsDeclarations = {}; - for (const [attName, attValue] of element.attributes) { - if (attName === "xmlns") { - namespace = attValue; - } - else { - const [attPrefix, attLocalName] = (0, algorithm_1.namespace_extractQName)(attName); - if (attPrefix === "xmlns") { - if (attLocalName === prefix) { - namespace = attValue; - } - nsDeclarations[attLocalName] = attValue; - } - } - } - // create the DOM element node - const elementNode = (namespace !== null ? - doc.createElementNS(namespace, element.name) : - doc.createElement(element.name)); - context.appendChild(elementNode); - // assign attributes - const localNameSet = new LocalNameSet_1.LocalNameSet(); - for (const [attName, attValue] of element.attributes) { - const [attPrefix, attLocalName] = (0, algorithm_1.namespace_extractQName)(attName); - let attNamespace = null; - if (attPrefix === "xmlns" || (attPrefix === null && attLocalName === "xmlns")) { - // namespace declaration attribute - attNamespace = infra_1.namespace.XMLNS; - } - else { - attNamespace = elementNode.lookupNamespaceURI(attPrefix); - if (attNamespace !== null && elementNode.isDefaultNamespace(attNamespace)) { - attNamespace = null; - } - else if (attNamespace === null && attPrefix !== null) { - attNamespace = nsDeclarations[attPrefix] || null; - } - } - if (localNameSet.has(attNamespace, attLocalName)) { - throw new Error("Element contains duplicate attributes."); - } - localNameSet.set(attNamespace, attLocalName); - if (attNamespace === infra_1.namespace.XMLNS) { - if (attValue === infra_1.namespace.XMLNS) { - throw new Error("XMLNS namespace is reserved."); - } - } - if (attLocalName.indexOf(":") !== -1 || !(0, algorithm_1.xml_isName)(attLocalName)) { - throw new Error("Attribute local name contains invalid characters."); - } - if (attPrefix === "xmlns" && attValue === "") { - throw new Error("Empty XML namespace is not allowed."); - } - if (attNamespace !== null) - elementNode.setAttributeNS(attNamespace, attName, this._decodeAttributeValue(attValue)); - else - elementNode.setAttribute(attName, this._decodeAttributeValue(attValue)); - } - if (!element.selfClosing) { - context = elementNode; - } - break; - case interfaces_1.TokenType.ClosingTag: - const closingTag = token; - if (closingTag.name !== context.nodeName) { - throw new Error('Closing tag name does not match opening tag name.'); - } - /* istanbul ignore else */ - if (context._parent) { - context = context._parent; - } - break; - } - token = lexer.nextToken(); - } - return doc; - } - /** - * Decodes serialized text. - * - * @param text - text value to serialize - */ - _decodeText(text) { - return text == null ? text : text.replace(/</g, '<') - .replace(/>/g, '>') - .replace(/&/g, '&'); - } - /** - * Decodes serialized attribute value. - * - * @param text - attribute value to serialize - */ - _decodeAttributeValue(text) { - return text == null ? text : text.replace(/</g, '<') - .replace(/>/g, '>') - .replace(/&/g, '&'); - } -} -exports.XMLParserImpl = XMLParserImpl; -//# sourceMappingURL=XMLParserImpl.js.map /***/ }), -/***/ 3529: +/***/ 218: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +var __webpack_unused_export__; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.XMLStringLexer = void 0; -const interfaces_1 = __nccwpck_require__(4727); -/** - * Represents a lexer for XML content in a string. - */ -class XMLStringLexer { - _str; - _index; - _length; - _options = { - skipWhitespaceOnlyText: false - }; - err = { line: -1, col: -1, index: -1, str: "" }; - /** - * Initializes a new instance of `XMLStringLexer`. - * - * @param str - the string to tokenize and lex - * @param options - lexer options - */ - constructor(str, options) { - this._str = str; - this._index = 0; - this._length = str.length; - if (options) { - this._options.skipWhitespaceOnlyText = options.skipWhitespaceOnlyText || false; - } - } - /** - * Returns the next token. - */ - nextToken() { - if (this.eof()) { - return { type: interfaces_1.TokenType.EOF }; - } - let token = (this.skipIfStartsWith('<') ? this.openBracket() : this.text()); - if (this._options.skipWhitespaceOnlyText) { - if (token.type === interfaces_1.TokenType.Text && - XMLStringLexer.isWhiteSpaceToken(token)) { - token = this.nextToken(); - } - } - return token; - } - /** - * Branches from an opening bracket (`<`). - */ - openBracket() { - if (this.skipIfStartsWith('?')) { - if (this.skipIfStartsWith('xml')) { - if (XMLStringLexer.isSpace(this._str[this._index])) { - return this.declaration(); - } - else { - // a processing instruction starting with xml. e.g. - this.seek(-3); - return this.pi(); - } - } - else { - return this.pi(); - } - } - else if (this.skipIfStartsWith('!')) { - if (this.skipIfStartsWith('--')) { - return this.comment(); - } - else if (this.skipIfStartsWith('[CDATA[')) { - return this.cdata(); - } - else if (this.skipIfStartsWith('DOCTYPE')) { - return this.doctype(); - } - else { - this.throwError("Invalid '!' in opening tag."); - } - } - else if (this.skipIfStartsWith('/')) { - return this.closeTag(); - } - else { - return this.openTag(); - } - } - /** - * Produces an XML declaration token. - */ - declaration() { - let version = ''; - let encoding = ''; - let standalone = ''; - while (!this.eof()) { - this.skipSpace(); - if (this.skipIfStartsWith('?>')) { - return { type: interfaces_1.TokenType.Declaration, version: version, encoding: encoding, standalone: standalone }; - } - else { - // attribute name - const [attName, attValue] = this.attribute(); - if (attName === 'version') - version = attValue; - else if (attName === 'encoding') - encoding = attValue; - else if (attName === 'standalone') - standalone = attValue; - else - this.throwError('Invalid attribute name: ' + attName); - } - } - this.throwError('Missing declaration end symbol `?>`'); - } - /** - * Produces a doc type token. - */ - doctype() { - let pubId = ''; - let sysId = ''; - // name - this.skipSpace(); - const name = this.takeUntil2('[', '>', true); - this.skipSpace(); - if (this.skipIfStartsWith('PUBLIC')) { - pubId = this.quotedString(); - sysId = this.quotedString(); - } - else if (this.skipIfStartsWith('SYSTEM')) { - sysId = this.quotedString(); - } - // skip internal subset - this.skipSpace(); - if (this.skipIfStartsWith('[')) { - // skip internal subset nodes - this.skipUntil(']'); - if (!this.skipIfStartsWith(']')) { - this.throwError('Missing end bracket of DTD internal subset'); - } - } - this.skipSpace(); - if (!this.skipIfStartsWith('>')) { - this.throwError('Missing doctype end symbol `>`'); - } - return { type: interfaces_1.TokenType.DocType, name: name, pubId: pubId, sysId: sysId }; - } - /** - * Produces a processing instruction token. - */ - pi() { - const target = this.takeUntilStartsWith('?>', true); - if (this.eof()) { - this.throwError('Missing processing instruction end symbol `?>`'); - } - this.skipSpace(); - if (this.skipIfStartsWith('?>')) { - return { type: interfaces_1.TokenType.PI, target: target, data: '' }; - } - const data = this.takeUntilStartsWith('?>'); - if (this.eof()) { - this.throwError('Missing processing instruction end symbol `?>`'); - } - this.seek(2); - return { type: interfaces_1.TokenType.PI, target: target, data: data }; - } - /** - * Produces a text token. - * - */ - text() { - const data = this.takeUntil('<'); - return { type: interfaces_1.TokenType.Text, data: data }; - } - /** - * Produces a comment token. - * - */ - comment() { - const data = this.takeUntilStartsWith('-->'); - if (this.eof()) { - this.throwError('Missing comment end symbol `-->`'); - } - this.seek(3); - return { type: interfaces_1.TokenType.Comment, data: data }; - } - /** - * Produces a CDATA token. - * - */ - cdata() { - const data = this.takeUntilStartsWith(']]>'); - if (this.eof()) { - this.throwError('Missing CDATA end symbol `]>`'); - } - this.seek(3); - return { type: interfaces_1.TokenType.CDATA, data: data }; - } - /** - * Produces an element token. - */ - openTag() { - // element name - this.skipSpace(); - const name = this.takeUntil2('>', '/', true); - this.skipSpace(); - if (this.skipIfStartsWith('>')) { - return { type: interfaces_1.TokenType.Element, name: name, attributes: [], selfClosing: false }; - } - else if (this.skipIfStartsWith('/>')) { - return { type: interfaces_1.TokenType.Element, name: name, attributes: [], selfClosing: true }; - } - // attributes - const attributes = []; - while (!this.eof()) { - // end tag - this.skipSpace(); - if (this.skipIfStartsWith('>')) { - return { type: interfaces_1.TokenType.Element, name: name, attributes: attributes, selfClosing: false }; - } - else if (this.skipIfStartsWith('/>')) { - return { type: interfaces_1.TokenType.Element, name: name, attributes: attributes, selfClosing: true }; - } - const attr = this.attribute(); - attributes.push(attr); - } - this.throwError('Missing opening element tag end symbol `>`'); - } - /** - * Produces a closing tag token. - * - */ - closeTag() { - this.skipSpace(); - const name = this.takeUntil('>', true); - this.skipSpace(); - if (!this.skipIfStartsWith('>')) { - this.throwError('Missing closing element tag end symbol `>`'); - } - return { type: interfaces_1.TokenType.ClosingTag, name: name }; - } - /** - * Reads an attribute name, value pair - */ - attribute() { - // attribute name - this.skipSpace(); - const name = this.takeUntil('=', true); - this.skipSpace(); - if (!this.skipIfStartsWith('=')) { - this.throwError('Missing equals sign before attribute value'); - } - // attribute value - const value = this.quotedString(); - return [name, value]; - } - /** - * Reads a string between double or single quotes. - */ - quotedString() { - this.skipSpace(); - const startQuote = this.take(1); - if (!XMLStringLexer.isQuote(startQuote)) { - this.throwError('Missing start quote character before quoted value'); - } - const value = this.takeUntil(startQuote); - if (!this.skipIfStartsWith(startQuote)) { - this.throwError('Missing end quote character after quoted value'); - } - return value; - } - /** - * Determines if the current index is at or past the end of input string. - */ - eof() { return this._index >= this._length; } - /** - * Skips the length of the given string if the string from current position - * starts with the given string. - * - * @param str - the string to match - */ - skipIfStartsWith(str) { - const strLength = str.length; - if (strLength === 1) { - if (this._str[this._index] === str) { - this._index++; - return true; - } - else { - return false; - } - } - for (let i = 0; i < strLength; i++) { - if (this._str[this._index + i] !== str[i]) - return false; - } - this._index += strLength; - return true; - } - /** - * Seeks a number of character codes. - * - * @param count - number of characters to skip - */ - seek(count) { - this._index += count; - if (this._index < 0) - this._index = 0; - if (this._index > this._length) - this._index = this._length; - } - /** - * Skips space characters. - */ - skipSpace() { - while (!this.eof() && (XMLStringLexer.isSpace(this._str[this._index]))) { - this._index++; - } - } - /** - * Takes a given number of characters. - * - * @param count - character count - */ - take(count) { - if (count === 1) { - return this._str[this._index++]; - } - const startIndex = this._index; - this.seek(count); - return this._str.slice(startIndex, this._index); - } - /** - * Takes characters until the next character matches `char`. - * - * @param char - a character to match - * @param space - whether a space character stops iteration - */ - takeUntil(char, space = false) { - const startIndex = this._index; - while (this._index < this._length) { - const c = this._str[this._index]; - if (c !== char && (!space || !XMLStringLexer.isSpace(c))) { - this._index++; - } - else { - break; - } - } - return this._str.slice(startIndex, this._index); - } - /** - * Takes characters until the next character matches `char1` or `char1`. - * - * @param char1 - a character to match - * @param char2 - a character to match - * @param space - whether a space character stops iteration - */ - takeUntil2(char1, char2, space = false) { - const startIndex = this._index; - while (this._index < this._length) { - const c = this._str[this._index]; - if (c !== char1 && c !== char2 && (!space || !XMLStringLexer.isSpace(c))) { - this._index++; - } - else { - break; - } - } - return this._str.slice(startIndex, this._index); - } - /** - * Takes characters until the next characters matches `str`. - * - * @param str - a string to match - * @param space - whether a space character stops iteration - */ - takeUntilStartsWith(str, space = false) { - const startIndex = this._index; - const strLength = str.length; - while (this._index < this._length) { - let match = true; - for (let i = 0; i < strLength; i++) { - const c = this._str[this._index + i]; - const char = str[i]; - if (space && XMLStringLexer.isSpace(c)) { - return this._str.slice(startIndex, this._index); - } - else if (c !== char) { - this._index++; - match = false; - break; - } - } - if (match) - return this._str.slice(startIndex, this._index); - } - this._index = this._length; - return this._str.slice(startIndex); - } - /** - * Skips characters until the next character matches `char`. - * - * @param char - a character to match - */ - skipUntil(char) { - while (this._index < this._length) { - const c = this._str[this._index]; - if (c !== char) { - this._index++; - } - else { - break; - } - } - } - /** - * Determines if the given token is entirely whitespace. - * - * @param token - the token to check - */ - static isWhiteSpaceToken(token) { - const str = token.data; - for (let i = 0; i < str.length; i++) { - const c = str[i]; - if (c !== ' ' && c !== '\n' && c !== '\r' && c !== '\t' && c !== '\f') - return false; - } - return true; - } - /** - * Determines if the given character is whitespace. - * - * @param char - the character to check - */ - static isSpace(char) { - return char === ' ' || char === '\n' || char === '\r' || char === '\t'; - } - /** - * Determines if the given character is a quote character. - * - * @param char - the character to check - */ - static isQuote(char) { - return (char === '"' || char === '\''); - } - /** - * Throws a parser error and records the line and column numbers in the parsed - * string. - * - * @param msg - error message - */ - throwError(msg) { - const regexp = /\r\n|\r|\n/g; - let match = null; - let line = 0; - let firstNewLineIndex = 0; - let lastNewlineIndex = this._str.length; - while ((match = regexp.exec(this._str)) !== null) { - if (match === null) - break; - line++; - if (match.index < this._index) - firstNewLineIndex = regexp.lastIndex; - if (match.index > this._index) { - lastNewlineIndex = match.index; - break; - } - } - this.err = { - line: line, - col: this._index - firstNewLineIndex, - index: this._index, - str: this._str.substring(firstNewLineIndex, lastNewlineIndex) - }; - throw new Error(msg + "\nIndex: " + this.err.index + - "\nLn: " + this.err.line + ", Col: " + this.err.col + - "\nInput: " + this.err.str); - } - /** - * Returns an iterator for the lexer. - */ - [Symbol.iterator]() { - this._index = 0; - return { - next: function () { - const token = this.nextToken(); - if (token.type === interfaces_1.TokenType.EOF) { - return { done: true, value: null }; - } - else { - return { done: false, value: token }; - } - }.bind(this) - }; - } -} -exports.XMLStringLexer = XMLStringLexer; -//# sourceMappingURL=XMLStringLexer.js.map - -/***/ }), -/***/ 8531: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +var net = __nccwpck_require__(9278); +var tls = __nccwpck_require__(4756); +var http = __nccwpck_require__(8611); +var https = __nccwpck_require__(5692); +var events = __nccwpck_require__(4434); +var assert = __nccwpck_require__(2613); +var util = __nccwpck_require__(9023); -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.DOMParser = void 0; -// Export classes -var DOMParserImpl_1 = __nccwpck_require__(6182); -Object.defineProperty(exports, "DOMParser", ({ enumerable: true, get: function () { return DOMParserImpl_1.DOMParserImpl; } })); -//# sourceMappingURL=index.js.map +exports.httpOverHttp = httpOverHttp; +exports.httpsOverHttp = httpsOverHttp; +exports.httpOverHttps = httpOverHttps; +exports.httpsOverHttps = httpsOverHttps; -/***/ }), -/***/ 4727: -/***/ ((__unused_webpack_module, exports) => { +function httpOverHttp(options) { + var agent = new TunnelingAgent(options); + agent.request = http.request; + return agent; +} +function httpsOverHttp(options) { + var agent = new TunnelingAgent(options); + agent.request = http.request; + agent.createSocket = createSecureSocket; + agent.defaultPort = 443; + return agent; +} -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.TokenType = void 0; -/** - * Defines the type of a token. - */ -var TokenType; -(function (TokenType) { - TokenType[TokenType["EOF"] = 0] = "EOF"; - TokenType[TokenType["Declaration"] = 1] = "Declaration"; - TokenType[TokenType["DocType"] = 2] = "DocType"; - TokenType[TokenType["Element"] = 3] = "Element"; - TokenType[TokenType["Text"] = 4] = "Text"; - TokenType[TokenType["CDATA"] = 5] = "CDATA"; - TokenType[TokenType["PI"] = 6] = "PI"; - TokenType[TokenType["Comment"] = 7] = "Comment"; - TokenType[TokenType["ClosingTag"] = 8] = "ClosingTag"; -})(TokenType || (exports.TokenType = TokenType = {})); -//# sourceMappingURL=interfaces.js.map +function httpOverHttps(options) { + var agent = new TunnelingAgent(options); + agent.request = https.request; + return agent; +} -/***/ }), +function httpsOverHttps(options) { + var agent = new TunnelingAgent(options); + agent.request = https.request; + agent.createSocket = createSecureSocket; + agent.defaultPort = 443; + return agent; +} -/***/ 7830: -/***/ ((__unused_webpack_module, exports) => { +function TunnelingAgent(options) { + var self = this; + self.options = options || {}; + self.proxyOptions = self.options.proxy || {}; + self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets; + self.requests = []; + self.sockets = []; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.LocalNameSet = void 0; -/** - * Represents a set of unique attribute namespaceURI and localName pairs. - * This set will contain tuples of unique attribute namespaceURI and - * localName pairs, and is populated as each attr is processed. This set is - * used to [optionally] enforce the well-formed constraint that an element - * cannot have two attributes with the same namespaceURI and localName. - * This can occur when two otherwise identical attributes on the same - * element differ only by their prefix values. - */ -class LocalNameSet { - // tuple storage - _items = {}; - _nullItems = {}; - /** - * Adds or replaces a tuple. - * - * @param ns - namespace URI - * @param localName - attribute local name - */ - set(ns, localName) { - if (ns === null) { - this._nullItems[localName] = true; - } - else if (this._items[ns]) { - this._items[ns][localName] = true; - } - else { - this._items[ns] = {}; - this._items[ns][localName] = true; - } - } - /** - * Determines if the given tuple exists in the set. - * - * @param ns - namespace URI - * @param localName - attribute local name - */ - has(ns, localName) { - if (ns === null) { - return this._nullItems[localName] === true; - } - else if (this._items[ns]) { - return this._items[ns][localName] === true; - } - else { - return false; - } + self.on('free', function onFree(socket, host, port, localAddress) { + var options = toOptions(host, port, localAddress); + for (var i = 0, len = self.requests.length; i < len; ++i) { + var pending = self.requests[i]; + if (pending.host === options.host && pending.port === options.port) { + // Detect the request to connect same origin server, + // reuse the connection. + self.requests.splice(i, 1); + pending.request.onSocket(socket); + return; + } } + socket.destroy(); + self.removeSocket(socket); + }); } -exports.LocalNameSet = LocalNameSet; -//# sourceMappingURL=LocalNameSet.js.map +util.inherits(TunnelingAgent, events.EventEmitter); -/***/ }), +TunnelingAgent.prototype.addRequest = function addRequest(req, host, port, localAddress) { + var self = this; + var options = mergeOptions({request: req}, self.options, toOptions(host, port, localAddress)); -/***/ 8377: -/***/ ((__unused_webpack_module, exports) => { + if (self.sockets.length >= this.maxSockets) { + // We are over limit so we'll add it to the queue. + self.requests.push(options); + return; + } + // If we are under maxSockets create a new one. + self.createSocket(options, function(socket) { + socket.on('free', onFree); + socket.on('close', onCloseOrRemove); + socket.on('agentRemove', onCloseOrRemove); + req.onSocket(socket); -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.NamespacePrefixMap = void 0; -/** - * A namespace prefix map is a map that associates namespaceURI and namespace - * prefix lists, where namespaceURI values are the map's unique keys (which can - * include the null value representing no namespace), and ordered lists of - * associated prefix values are the map's key values. The namespace prefix map - * will be populated by previously seen namespaceURIs and all their previously - * encountered prefix associations for a given node and its ancestors. - * - * _Note:_ The last seen prefix for a given namespaceURI is at the end of its - * respective list. The list is searched to find potentially matching prefixes, - * and if no matches are found for the given namespaceURI, then the last prefix - * in the list is used. See copy a namespace prefix map and retrieve a preferred - * prefix string for additional details. - * - * See: https://w3c.github.io/DOM-Parsing/#the-namespace-prefix-map - */ -class NamespacePrefixMap { - _items = {}; - _nullItems = []; - /** - * Creates a copy of the map. - */ - copy() { - /** - * To copy a namespace prefix map map means to copy the map's keys into a - * new empty namespace prefix map, and to copy each of the values in the - * namespace prefix list associated with each keys' value into a new list - * which should be associated with the respective key in the new map. - */ - const mapCopy = new NamespacePrefixMap(); - for (const key in this._items) { - mapCopy._items[key] = this._items[key].slice(0); - } - mapCopy._nullItems = this._nullItems.slice(0); - return mapCopy; - } - /** - * Retrieves a preferred prefix string from the namespace prefix map. - * - * @param preferredPrefix - preferred prefix string - * @param ns - namespace - */ - get(preferredPrefix, ns) { - /** - * 1. Let candidates list be the result of retrieving a list from map where - * there exists a key in map that matches the value of ns or if there is no - * such key, then stop running these steps, and return the null value. - */ - const candidatesList = ns === null ? this._nullItems : (this._items[ns] || null); - if (candidatesList === null) { - return null; - } - /** - * 2. Otherwise, for each prefix value prefix in candidates list, iterating - * from beginning to end: - * - * _Note:_ There will always be at least one prefix value in the list. - */ - let prefix = null; - for (let i = 0; i < candidatesList.length; i++) { - prefix = candidatesList[i]; - /** - * 2.1. If prefix matches preferred prefix, then stop running these steps - * and return prefix. - */ - if (prefix === preferredPrefix) { - return prefix; - } - } - /** - * 2.2. If prefix is the last item in the candidates list, then stop - * running these steps and return prefix. - */ - return prefix; - } - /** - * Checks if a prefix string is found in the namespace prefix map associated - * with the given namespace. - * - * @param prefix - prefix string - * @param ns - namespace - */ - has(prefix, ns) { - /** - * 1. Let candidates list be the result of retrieving a list from map where - * there exists a key in map that matches the value of ns or if there is - * no such key, then stop running these steps, and return false. - */ - const candidatesList = ns === null ? this._nullItems : (this._items[ns] || null); - if (candidatesList === null) { - return false; - } - /** - * 2. If the value of prefix occurs at least once in candidates list, - * return true, otherwise return false. - */ - return (candidatesList.indexOf(prefix) !== -1); + function onFree() { + self.emit('free', socket, options); } - /** - * Checks if a prefix string is found in the namespace prefix map. - * - * @param prefix - prefix string - */ - hasPrefix(prefix) { - if (this._nullItems.indexOf(prefix) !== -1) - return true; - for (const key in this._items) { - if (this._items[key].indexOf(prefix) !== -1) - return true; - } - return false; + + function onCloseOrRemove(err) { + self.removeSocket(socket); + socket.removeListener('free', onFree); + socket.removeListener('close', onCloseOrRemove); + socket.removeListener('agentRemove', onCloseOrRemove); } - /** - * Adds a prefix string associated with a namespace to the prefix map. - * - * @param prefix - prefix string - * @param ns - namespace - */ - set(prefix, ns) { - /** - * 1. Let candidates list be the result of retrieving a list from map where - * there exists a key in map that matches the value of ns or if there is - * no such key, then let candidates list be null. - */ - const candidatesList = ns === null ? this._nullItems : (this._items[ns] || null); - /** - * 2. If candidates list is null, then create a new list with prefix as the - * only item in the list, and associate that list with a new key ns in map. - * 3. Otherwise, append prefix to the end of candidates list. - * - * _Note:_ The steps in retrieve a preferred prefix string use the list to - * track the most recently used (MRU) prefix associated with a given - * namespace, which will be the prefix at the end of the list. This list - * may contain duplicates of the same prefix value seen earlier - * (and that's OK). - */ - if (ns !== null && candidatesList === null) { - this._items[ns] = [prefix]; - } - else { - candidatesList.push(prefix); - } + }); +}; + +TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { + var self = this; + var placeholder = {}; + self.sockets.push(placeholder); + + var connectOptions = mergeOptions({}, self.proxyOptions, { + method: 'CONNECT', + path: options.host + ':' + options.port, + agent: false, + headers: { + host: options.host + ':' + options.port } -} -exports.NamespacePrefixMap = NamespacePrefixMap; -//# sourceMappingURL=NamespacePrefixMap.js.map + }); + if (options.localAddress) { + connectOptions.localAddress = options.localAddress; + } + if (connectOptions.proxyAuth) { + connectOptions.headers = connectOptions.headers || {}; + connectOptions.headers['Proxy-Authorization'] = 'Basic ' + + new Buffer(connectOptions.proxyAuth).toString('base64'); + } -/***/ }), + debug('making CONNECT request'); + var connectReq = self.request(connectOptions); + connectReq.useChunkedEncodingByDefault = false; // for v0.6 + connectReq.once('response', onResponse); // for v0.6 + connectReq.once('upgrade', onUpgrade); // for v0.6 + connectReq.once('connect', onConnect); // for v0.7 or later + connectReq.once('error', onError); + connectReq.end(); -/***/ 6851: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + function onResponse(res) { + // Very hacky. This is necessary to avoid http-parser leaks. + res.upgrade = true; + } + function onUpgrade(res, socket, head) { + // Hacky. + process.nextTick(function() { + onConnect(res, socket, head); + }); + } -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.XMLSerializerImpl = void 0; -const interfaces_1 = __nccwpck_require__(9454); -const LocalNameSet_1 = __nccwpck_require__(7830); -const NamespacePrefixMap_1 = __nccwpck_require__(8377); -const DOMException_1 = __nccwpck_require__(7175); -const infra_1 = __nccwpck_require__(4737); -const algorithm_1 = __nccwpck_require__(6573); -/** - * Represents an XML serializer. - * - * Implements: https://www.w3.org/TR/DOM-Parsing/#serializing - */ -class XMLSerializerImpl { - static _VoidElementNames = new Set(['area', 'base', 'basefont', - 'bgsound', 'br', 'col', 'embed', 'frame', 'hr', 'img', 'input', 'keygen', - 'link', 'menuitem', 'meta', 'param', 'source', 'track', 'wbr']); - /** @inheritdoc */ - serializeToString(root) { - /** - * The serializeToString(root) method must produce an XML serialization - * of root passing a value of false for the require well-formed parameter, - * and return the result. - */ - return this._xmlSerialization(root, false); - } - /** - * Produces an XML serialization of the given node. - * - * @param node - node to serialize - * @param requireWellFormed - whether to check conformance - */ - _xmlSerialization(node, requireWellFormed) { - // To increase performance, use a namespace-aware serializer only if the - // document has namespaced elements - if (node._nodeDocument === undefined || node._nodeDocument._hasNamespaces) { - /** From: https://w3c.github.io/DOM-Parsing/#xml-serialization - * - * 1. Let namespace be a context namespace with value null. - * The context namespace tracks the XML serialization algorithm's current - * default namespace. The context namespace is changed when either an Element - * Node has a default namespace declaration, or the algorithm generates a - * default namespace declaration for the Element Node to match its own - * namespace. The algorithm assumes no namespace (null) to start. - * 2. Let prefix map be a new namespace prefix map. - * 3. Add the XML namespace with prefix value "xml" to prefix map. - * 4. Let prefix index be a generated namespace prefix index with value 1. - * The generated namespace prefix index is used to generate a new unique - * prefix value when no suitable existing namespace prefix is available to - * serialize a node's namespaceURI (or the namespaceURI of one of node's - * attributes). See the generate a prefix algorithm. - */ - const namespace = null; - const prefixMap = new NamespacePrefixMap_1.NamespacePrefixMap(); - prefixMap.set("xml", infra_1.namespace.XML); - const prefixIndex = { value: 1 }; - /** - * 5. Return the result of running the XML serialization algorithm on node - * passing the context namespace namespace, namespace prefix map prefix map, - * generated namespace prefix index reference to prefix index, and the - * flag require well-formed. If an exception occurs during the execution - * of the algorithm, then catch that exception and throw an - * "InvalidStateError" DOMException. - */ - try { - return this._serializeNodeNS(node, namespace, prefixMap, prefixIndex, requireWellFormed); - } - catch { - throw new DOMException_1.InvalidStateError(); - } - } - else { - try { - return this._serializeNode(node, requireWellFormed); - } - catch { - throw new DOMException_1.InvalidStateError(); - } - } - } - /** - * Produces an XML serialization of a node. - * - * @param node - node to serialize - * @param namespace - context namespace - * @param prefixMap - namespace prefix map - * @param prefixIndex - generated namespace prefix index - * @param requireWellFormed - whether to check conformance - */ - _serializeNodeNS(node, namespace, prefixMap, prefixIndex, requireWellFormed) { - switch (node.nodeType) { - case interfaces_1.NodeType.Element: - return this._serializeElementNS(node, namespace, prefixMap, prefixIndex, requireWellFormed); - case interfaces_1.NodeType.Document: - return this._serializeDocumentNS(node, namespace, prefixMap, prefixIndex, requireWellFormed); - case interfaces_1.NodeType.Comment: - return this._serializeComment(node, requireWellFormed); - case interfaces_1.NodeType.Text: - return this._serializeText(node, requireWellFormed); - case interfaces_1.NodeType.DocumentFragment: - return this._serializeDocumentFragmentNS(node, namespace, prefixMap, prefixIndex, requireWellFormed); - case interfaces_1.NodeType.DocumentType: - return this._serializeDocumentType(node, requireWellFormed); - case interfaces_1.NodeType.ProcessingInstruction: - return this._serializeProcessingInstruction(node, requireWellFormed); - case interfaces_1.NodeType.CData: - return this._serializeCData(node, requireWellFormed); - default: - throw new Error(`Unknown node type: ${node.nodeType}`); - } + function onConnect(res, socket, head) { + connectReq.removeAllListeners(); + socket.removeAllListeners(); + + if (res.statusCode !== 200) { + debug('tunneling socket could not be established, statusCode=%d', + res.statusCode); + socket.destroy(); + var error = new Error('tunneling socket could not be established, ' + + 'statusCode=' + res.statusCode); + error.code = 'ECONNRESET'; + options.request.emit('error', error); + self.removeSocket(placeholder); + return; } - /** - * Produces an XML serialization of a node. - * - * @param node - node to serialize - * @param requireWellFormed - whether to check conformance - */ - _serializeNode(node, requireWellFormed) { - switch (node.nodeType) { - case interfaces_1.NodeType.Element: - return this._serializeElement(node, requireWellFormed); - case interfaces_1.NodeType.Document: - return this._serializeDocument(node, requireWellFormed); - case interfaces_1.NodeType.Comment: - return this._serializeComment(node, requireWellFormed); - case interfaces_1.NodeType.Text: - return this._serializeText(node, requireWellFormed); - case interfaces_1.NodeType.DocumentFragment: - return this._serializeDocumentFragment(node, requireWellFormed); - case interfaces_1.NodeType.DocumentType: - return this._serializeDocumentType(node, requireWellFormed); - case interfaces_1.NodeType.ProcessingInstruction: - return this._serializeProcessingInstruction(node, requireWellFormed); - case interfaces_1.NodeType.CData: - return this._serializeCData(node, requireWellFormed); - default: - throw new Error(`Unknown node type: ${node.nodeType}`); - } + if (head.length > 0) { + debug('got illegal response body from proxy'); + socket.destroy(); + var error = new Error('got illegal response body from proxy'); + error.code = 'ECONNRESET'; + options.request.emit('error', error); + self.removeSocket(placeholder); + return; } - /** - * Produces an XML serialization of an element node. - * - * @param node - node to serialize - * @param namespace - context namespace - * @param prefixMap - namespace prefix map - * @param prefixIndex - generated namespace prefix index - * @param requireWellFormed - whether to check conformance - */ - _serializeElementNS(node, namespace, prefixMap, prefixIndex, requireWellFormed) { - /** - * From: https://w3c.github.io/DOM-Parsing/#xml-serializing-an-element-node - * - * 1. If the require well-formed flag is set (its value is true), and this - * node's localName attribute contains the character ":" (U+003A COLON) or - * does not match the XML Name production, then throw an exception; the - * serialization of this node would not be a well-formed element. - */ - if (requireWellFormed && (node.localName.indexOf(":") !== -1 || - !(0, algorithm_1.xml_isName)(node.localName))) { - throw new Error("Node local name contains invalid characters (well-formed required)."); - } - /** - * 2. Let markup be the string "<" (U+003C LESS-THAN SIGN). - * 3. Let qualified name be an empty string. - * 4. Let skip end tag be a boolean flag with value false. - * 5. Let ignore namespace definition attribute be a boolean flag with value - * false. - * 6. Given prefix map, copy a namespace prefix map and let map be the - * result. - * 7. Let local prefixes map be an empty map. The map has unique Node prefix - * strings as its keys, with corresponding namespaceURI Node values as the - * map's key values (in this map, the null namespace is represented by the - * empty string). - * - * _Note:_ This map is local to each element. It is used to ensure there - * are no conflicting prefixes should a new namespace prefix attribute need - * to be generated. It is also used to enable skipping of duplicate prefix - * definitions when writing an element's attributes: the map allows the - * algorithm to distinguish between a prefix in the namespace prefix map - * that might be locally-defined (to the current Element) and one that is - * not. - * 8. Let local default namespace be the result of recording the namespace - * information for node given map and local prefixes map. - * - * _Note:_ The above step will update map with any found namespace prefix - * definitions, add the found prefix definitions to the local prefixes map - * and return a local default namespace value defined by a default namespace - * attribute if one exists. Otherwise it returns null. - * 9. Let inherited ns be a copy of namespace. - * 10. Let ns be the value of node's namespaceURI attribute. - */ - let markup = "<"; - let qualifiedName = ''; - let skipEndTag = false; - let ignoreNamespaceDefinitionAttribute = false; - let map = prefixMap.copy(); - let localPrefixesMap = {}; - let localDefaultNamespace = this._recordNamespaceInformation(node, map, localPrefixesMap); - let inheritedNS = namespace; - let ns = node.namespaceURI; - /** 11. If inherited ns is equal to ns, then: */ - if (inheritedNS === ns) { - /** - * 11.1. If local default namespace is not null, then set ignore - * namespace definition attribute to true. - */ - if (localDefaultNamespace !== null) { - ignoreNamespaceDefinitionAttribute = true; - } - /** - * 11.2. If ns is the XML namespace, then append to qualified name the - * concatenation of the string "xml:" and the value of node's localName. - * 11.3. Otherwise, append to qualified name the value of node's - * localName. The node's prefix if it exists, is dropped. - */ - if (ns === infra_1.namespace.XML) { - qualifiedName = 'xml:' + node.localName; - } - else { - qualifiedName = node.localName; - } - /** 11.4. Append the value of qualified name to markup. */ - markup += qualifiedName; - } - else { - /** - * 12. Otherwise, inherited ns is not equal to ns (the node's own - * namespace is different from the context namespace of its parent). - * Run these sub-steps: - * - * 12.1. Let prefix be the value of node's prefix attribute. - * 12.2. Let candidate prefix be the result of retrieving a preferred - * prefix string prefix from map given namespace ns. The above may return - * null if no namespace key ns exists in map. - */ - let prefix = node.prefix; - /** - * We don't need to run "retrieving a preferred prefix string" algorithm if - * the element has no prefix and its namespace matches to the default - * namespace. - * See: https://github.com/web-platform-tests/wpt/pull/16703 - */ - let candidatePrefix = null; - if (prefix !== null || ns !== localDefaultNamespace) { - candidatePrefix = map.get(prefix, ns); - } - /** - * 12.3. If the value of prefix matches "xmlns", then run the following - * steps: - */ - if (prefix === "xmlns") { - /** - * 12.3.1. If the require well-formed flag is set, then throw an error. - * An Element with prefix "xmlns" will not legally round-trip in a - * conforming XML parser. - */ - if (requireWellFormed) { - throw new Error("An element cannot have the 'xmlns' prefix (well-formed required)."); - } - /** - * 12.3.2. Let candidate prefix be the value of prefix. - */ - candidatePrefix = prefix; - } - /** - * 12.4.Found a suitable namespace prefix: if candidate prefix is not - * null (a namespace prefix is defined which maps to ns), then: - */ - if (candidatePrefix !== null) { - /** - * The following may serialize a different prefix than the Element's - * existing prefix if it already had one. However, the retrieving a - * preferred prefix string algorithm already tried to match the - * existing prefix if possible. - * - * 12.4.1. Append to qualified name the concatenation of candidate - * prefix, ":" (U+003A COLON), and node's localName. There exists on - * this node or the node's ancestry a namespace prefix definition that - * defines the node's namespace. - * 12.4.2. If the local default namespace is not null (there exists a - * locally-defined default namespace declaration attribute) and its - * value is not the XML namespace, then let inherited ns get the value - * of local default namespace unless the local default namespace is the - * empty string in which case let it get null (the context namespace - * is changed to the declared default, rather than this node's own - * namespace). - * - * _Note:_ Any default namespace definitions or namespace prefixes that - * define the XML namespace are omitted when serializing this node's - * attributes. - */ - qualifiedName = candidatePrefix + ':' + node.localName; - if (localDefaultNamespace !== null && localDefaultNamespace !== infra_1.namespace.XML) { - inheritedNS = localDefaultNamespace || null; - } - /** - * 12.4.3. Append the value of qualified name to markup. - */ - markup += qualifiedName; - /** 12.5. Otherwise, if prefix is not null, then: */ - } - else if (prefix !== null) { - /** - * _Note:_ By this step, there is no namespace or prefix mapping - * declaration in this node (or any parent node visited by this - * algorithm) that defines prefix otherwise the step labelled Found - * a suitable namespace prefix would have been followed. The sub-steps - * that follow will create a new namespace prefix declaration for prefix - * and ensure that prefix does not conflict with an existing namespace - * prefix declaration of the same localName in node's attribute list. - * - * 12.5.1. If the local prefixes map contains a key matching prefix, - * then let prefix be the result of generating a prefix providing as - * input map, ns, and prefix index. - */ - if (prefix in localPrefixesMap) { - prefix = this._generatePrefix(ns, map, prefixIndex); - } - /** - * 12.5.2. Add prefix to map given namespace ns. - * 12.5.3. Append to qualified name the concatenation of prefix, ":" - * (U+003A COLON), and node's localName. - * 12.5.4. Append the value of qualified name to markup. - */ - map.set(prefix, ns); - qualifiedName += prefix + ':' + node.localName; - markup += qualifiedName; - /** - * 12.5.5. Append the following to markup, in the order listed: - * - * _Note:_ The following serializes a namespace prefix declaration for - * prefix which was just added to the map. - * - * 12.5.5.1. " " (U+0020 SPACE); - * 12.5.5.2. The string "xmlns:"; - * 12.5.5.3. The value of prefix; - * 12.5.5.4. "="" (U+003D EQUALS SIGN, U+0022 QUOTATION MARK); - * 12.5.5.5. The result of serializing an attribute value given ns and - * the require well-formed flag as input; - * 12.5.5.6. """ (U+0022 QUOTATION MARK). - */ - markup += " xmlns:" + prefix + "=\"" + - this._serializeAttributeValue(ns, requireWellFormed) + "\""; - /** - * 12.5.5.7. If local default namespace is not null (there exists a - * locally-defined default namespace declaration attribute), then - * let inherited ns get the value of local default namespace unless the - * local default namespace is the empty string in which case let it get - * null. - */ - if (localDefaultNamespace !== null) { - inheritedNS = localDefaultNamespace || null; - } - /** - * 12.6. Otherwise, if local default namespace is null, or local - * default namespace is not null and its value is not equal to ns, then: - */ - } - else if (localDefaultNamespace === null || - (localDefaultNamespace !== null && localDefaultNamespace !== ns)) { - /** - * _Note:_ At this point, the namespace for this node still needs to be - * serialized, but there's no prefix (or candidate prefix) available; the - * following uses the default namespace declaration to define the - * namespace--optionally replacing an existing default declaration - * if present. - * - * 12.6.1. Set the ignore namespace definition attribute flag to true. - * 12.6.2. Append to qualified name the value of node's localName. - * 12.6.3. Let the value of inherited ns be ns. - * - * _Note:_ The new default namespace will be used in the serialization - * to define this node's namespace and act as the context namespace for - * its children. - */ - ignoreNamespaceDefinitionAttribute = true; - qualifiedName += node.localName; - inheritedNS = ns; - /** - * 12.6.4. Append the value of qualified name to markup. - */ - markup += qualifiedName; - /** - * 12.6.5. Append the following to markup, in the order listed: - * - * _Note:_ The following serializes the new (or replacement) default - * namespace definition. - * - * 12.6.5.1. " " (U+0020 SPACE); - * 12.6.5.2. The string "xmlns"; - * 12.6.5.3. "="" (U+003D EQUALS SIGN, U+0022 QUOTATION MARK); - * 12.6.5.4. The result of serializing an attribute value given ns - * and the require well-formed flag as input; - * 12.6.5.5. """ (U+0022 QUOTATION MARK). - */ - markup += " xmlns" + "=\"" + - this._serializeAttributeValue(ns, requireWellFormed) + "\""; - /** - * 12.7. Otherwise, the node has a local default namespace that matches - * ns. Append to qualified name the value of node's localName, let the - * value of inherited ns be ns, and append the value of qualified name - * to markup. - */ - } - else { - qualifiedName += node.localName; - inheritedNS = ns; - markup += qualifiedName; - } - } - /** - * 13. Append to markup the result of the XML serialization of node's - * attributes given map, prefix index, local prefixes map, ignore namespace - * definition attribute flag, and require well-formed flag. - */ - markup += this._serializeAttributesNS(node, map, prefixIndex, localPrefixesMap, ignoreNamespaceDefinitionAttribute, requireWellFormed); - /** - * 14. If ns is the HTML namespace, and the node's list of children is - * empty, and the node's localName matches any one of the following void - * elements: "area", "base", "basefont", "bgsound", "br", "col", "embed", - * "frame", "hr", "img", "input", "keygen", "link", "menuitem", "meta", - * "param", "source", "track", "wbr"; then append the following to markup, - * in the order listed: - * 14.1. " " (U+0020 SPACE); - * 14.2. "/" (U+002F SOLIDUS). - * and set the skip end tag flag to true. - * 15. If ns is not the HTML namespace, and the node's list of children is - * empty, then append "/" (U+002F SOLIDUS) to markup and set the skip end - * tag flag to true. - * 16. Append ">" (U+003E GREATER-THAN SIGN) to markup. - */ - const isHTML = (ns === infra_1.namespace.HTML); - if (isHTML && node.childNodes.length === 0 && - XMLSerializerImpl._VoidElementNames.has(node.localName)) { - markup += " /"; - skipEndTag = true; - } - else if (!isHTML && node.childNodes.length === 0) { - markup += "/"; - skipEndTag = true; - } - markup += ">"; - /** - * 17. If the value of skip end tag is true, then return the value of markup - * and skip the remaining steps. The node is a leaf-node. - */ - if (skipEndTag) - return markup; - /** - * 18. If ns is the HTML namespace, and the node's localName matches the - * string "template", then this is a template element. Append to markup the - * result of XML serializing a DocumentFragment node given the template - * element's template contents (a DocumentFragment), providing inherited - * ns, map, prefix index, and the require well-formed flag. - * - * _Note:_ This allows template content to round-trip, given the rules for - * parsing XHTML documents. - * - * 19. Otherwise, append to markup the result of running the XML - * serialization algorithm on each of node's children, in tree order, - * providing inherited ns, map, prefix index, and the require well-formed - * flag. - */ - if (isHTML && node.localName === "template") { - // TODO: serialize template contents - } - else { - for (const childNode of node._children || node.childNodes) { - markup += this._serializeNodeNS(childNode, inheritedNS, map, prefixIndex, requireWellFormed); - } - } - /** - * 20. Append the following to markup, in the order listed: - * 20.1. "" (U+003C LESS-THAN SIGN, U+002F SOLIDUS); - * 20.2. The value of qualified name; - * 20.3. ">" (U+003E GREATER-THAN SIGN). - */ - markup += "" + qualifiedName + ">"; - /** - * 21. Return the value of markup. - */ - return markup; - } - /** - * Produces an XML serialization of a document node. - * - * @param node - node to serialize - * @param namespace - context namespace - * @param prefixMap - namespace prefix map - * @param prefixIndex - generated namespace prefix index - * @param requireWellFormed - whether to check conformance - */ - _serializeDocumentNS(node, namespace, prefixMap, prefixIndex, requireWellFormed) { - /** - * If the require well-formed flag is set (its value is true), and this node - * has no documentElement (the documentElement attribute's value is null), - * then throw an exception; the serialization of this node would not be a - * well-formed document. - */ - if (requireWellFormed && node.documentElement === null) { - throw new Error("Missing document element (well-formed required)."); - } - /** - * Otherwise, run the following steps: - * 1. Let serialized document be an empty string. - * 2. For each child child of node, in tree order, run the XML - * serialization algorithm on the child passing along the provided - * arguments, and append the result to serialized document. - * - * _Note:_ This will serialize any number of ProcessingInstruction and - * Comment nodes both before and after the Document's documentElement node, - * including at most one DocumentType node. (Text nodes are not allowed as - * children of the Document.) - * - * 3. Return the value of serialized document. - */ - let serializedDocument = ""; - for (const childNode of node._children || node.childNodes) { - serializedDocument += this._serializeNodeNS(childNode, namespace, prefixMap, prefixIndex, requireWellFormed); - } - return serializedDocument; - } - /** - * Produces an XML serialization of a comment node. - * - * @param node - node to serialize - * @param requireWellFormed - whether to check conformance - */ - _serializeComment(node, requireWellFormed) { - /** - * If the require well-formed flag is set (its value is true), and node's - * data contains characters that are not matched by the XML Char production - * or contains "--" (two adjacent U+002D HYPHEN-MINUS characters) or that - * ends with a "-" (U+002D HYPHEN-MINUS) character, then throw an exception; - * the serialization of this node's data would not be well-formed. - */ - if (requireWellFormed && (!(0, algorithm_1.xml_isLegalChar)(node.data) || - node.data.indexOf("--") !== -1 || node.data.endsWith("-"))) { - throw new Error("Comment data contains invalid characters (well-formed required)."); - } - /** - * Otherwise, return the concatenation of "". - */ - return ""; - } - /** - * Produces an XML serialization of a text node. - * - * @param node - node to serialize - * @param requireWellFormed - whether to check conformance - * @param level - current depth of the XML tree - */ - _serializeText(node, requireWellFormed) { - /** - * 1. If the require well-formed flag is set (its value is true), and - * node's data contains characters that are not matched by the XML Char - * production, then throw an exception; the serialization of this node's - * data would not be well-formed. - */ - if (requireWellFormed && !(0, algorithm_1.xml_isLegalChar)(node.data)) { - throw new Error("Text data contains invalid characters (well-formed required)."); - } - /** - * 2. Let markup be the value of node's data. - * 3. Replace any occurrences of "&" in markup by "&". - * 4. Replace any occurrences of "<" in markup by "<". - * 5. Replace any occurrences of ">" in markup by ">". - * 6. Return the value of markup. - */ - let result = ""; - for (let i = 0; i < node.data.length; i++) { - const c = node.data[i]; - if (c === "&") - result += "&"; - else if (c === "<") - result += "<"; - else if (c === ">") - result += ">"; - else - result += c; - } - return result; - } - /** - * Produces an XML serialization of a document fragment node. - * - * @param node - node to serialize - * @param namespace - context namespace - * @param prefixMap - namespace prefix map - * @param prefixIndex - generated namespace prefix index - * @param requireWellFormed - whether to check conformance - */ - _serializeDocumentFragmentNS(node, namespace, prefixMap, prefixIndex, requireWellFormed) { - /** - * 1. Let markup the empty string. - * 2. For each child child of node, in tree order, run the XML serialization - * algorithm on the child given namespace, prefix map, a reference to prefix - * index, and flag require well-formed. Concatenate the result to markup. - * 3. Return the value of markup. - */ - let markup = ""; - for (const childNode of node._children || node.childNodes) { - markup += this._serializeNodeNS(childNode, namespace, prefixMap, prefixIndex, requireWellFormed); - } - return markup; - } - /** - * Produces an XML serialization of a document type node. - * - * @param node - node to serialize - * @param requireWellFormed - whether to check conformance - */ - _serializeDocumentType(node, requireWellFormed) { - /** - * 1. If the require well-formed flag is true and the node's publicId - * attribute contains characters that are not matched by the XML PubidChar - * production, then throw an exception; the serialization of this node - * would not be a well-formed document type declaration. - */ - if (requireWellFormed && !(0, algorithm_1.xml_isPubidChar)(node.publicId)) { - throw new Error("DocType public identifier does not match PubidChar construct (well-formed required)."); - } - /** - * 2. If the require well-formed flag is true and the node's systemId - * attribute contains characters that are not matched by the XML Char - * production or that contains both a """ (U+0022 QUOTATION MARK) and a - * "'" (U+0027 APOSTROPHE), then throw an exception; the serialization - * of this node would not be a well-formed document type declaration. - */ - if (requireWellFormed && - (!(0, algorithm_1.xml_isLegalChar)(node.systemId) || - (node.systemId.indexOf('"') !== -1 && node.systemId.indexOf("'") !== -1))) { - throw new Error("DocType system identifier contains invalid characters (well-formed required)."); - } - /** - * 3. Let markup be an empty string. - * 4. Append the string "" (U+003E GREATER-THAN SIGN) to markup. - * 11. Return the value of markup. - */ - return node.publicId && node.systemId ? - "" - : node.publicId ? - "" - : node.systemId ? - "" - : - ""; - } - /** - * Produces an XML serialization of a processing instruction node. - * - * @param node - node to serialize - * @param requireWellFormed - whether to check conformance - */ - _serializeProcessingInstruction(node, requireWellFormed) { - /** - * 1. If the require well-formed flag is set (its value is true), and node's - * target contains a ":" (U+003A COLON) character or is an ASCII - * case-insensitive match for the string "xml", then throw an exception; - * the serialization of this node's target would not be well-formed. - */ - if (requireWellFormed && (node.target.indexOf(":") !== -1 || (/^xml$/i).test(node.target))) { - throw new Error("Processing instruction target contains invalid characters (well-formed required)."); - } - /** - * 2. If the require well-formed flag is set (its value is true), and node's - * data contains characters that are not matched by the XML Char production - * or contains the string "?>" (U+003F QUESTION MARK, - * U+003E GREATER-THAN SIGN), then throw an exception; the serialization of - * this node's data would not be well-formed. - */ - if (requireWellFormed && (!(0, algorithm_1.xml_isLegalChar)(node.data) || - node.data.indexOf("?>") !== -1)) { - throw new Error("Processing instruction data contains invalid characters (well-formed required)."); - } - /** - * 3. Let markup be the concatenation of the following, in the order listed: - * 3.1. "" (U+003C LESS-THAN SIGN, U+003F QUESTION MARK); - * 3.2. The value of node's target; - * 3.3. " " (U+0020 SPACE); - * 3.4. The value of node's data; - * 3.5. "?>" (U+003F QUESTION MARK, U+003E GREATER-THAN SIGN). - * 4. Return the value of markup. - */ - return "" + (node.data === "" ? node.target : node.target + " " + node.data) + "?>"; - } - /** - * Produces an XML serialization of a CDATA node. - * - * @param node - node to serialize - * @param requireWellFormed - whether to check conformance - */ - _serializeCData(node, requireWellFormed) { - if (requireWellFormed && (node.data.indexOf("]]>") !== -1)) { - throw new Error("CDATA contains invalid characters (well-formed required)."); - } - return ""; - } - /** - * Produces an XML serialization of the attributes of an element node. - * - * @param node - node to serialize - * @param map - namespace prefix map - * @param prefixIndex - generated namespace prefix index - * @param localPrefixesMap - local prefixes map - * @param ignoreNamespaceDefinitionAttribute - whether to ignore namespace - * attributes - * @param requireWellFormed - whether to check conformance - */ - _serializeAttributesNS(node, map, prefixIndex, localPrefixesMap, ignoreNamespaceDefinitionAttribute, requireWellFormed) { - /** - * 1. Let result be the empty string. - * 2. Let localname set be a new empty namespace localname set. This - * localname set will contain tuples of unique attribute namespaceURI and - * localName pairs, and is populated as each attr is processed. This set is - * used to [optionally] enforce the well-formed constraint that an element - * cannot have two attributes with the same namespaceURI and localName. - * This can occur when two otherwise identical attributes on the same - * element differ only by their prefix values. - */ - let result = ""; - const localNameSet = requireWellFormed ? new LocalNameSet_1.LocalNameSet() : undefined; - /** - * 3. Loop: For each attribute attr in element's attributes, in the order - * they are specified in the element's attribute list: - */ - for (const attr of node.attributes) { - // Optimize common case - if (!ignoreNamespaceDefinitionAttribute && !requireWellFormed && attr.namespaceURI === null) { - result += " " + attr.localName + "=\"" + - this._serializeAttributeValue(attr.value, requireWellFormed) + "\""; - continue; - } - /** - * 3.1. If the require well-formed flag is set (its value is true), and the - * localname set contains a tuple whose values match those of a new tuple - * consisting of attr's namespaceURI attribute and localName attribute, - * then throw an exception; the serialization of this attr would fail to - * produce a well-formed element serialization. - */ - if (requireWellFormed && localNameSet && localNameSet.has(attr.namespaceURI, attr.localName)) { - throw new Error("Element contains duplicate attributes (well-formed required)."); - } - /** - * 3.2. Create a new tuple consisting of attr's namespaceURI attribute and - * localName attribute, and add it to the localname set. - * 3.3. Let attribute namespace be the value of attr's namespaceURI value. - * 3.4. Let candidate prefix be null. - */ - if (requireWellFormed && localNameSet) - localNameSet.set(attr.namespaceURI, attr.localName); - let attributeNamespace = attr.namespaceURI; - let candidatePrefix = null; - /** 3.5. If attribute namespace is not null, then run these sub-steps: */ - if (attributeNamespace !== null) { - /** - * 3.5.1. Let candidate prefix be the result of retrieving a preferred - * prefix string from map given namespace attribute namespace with - * preferred prefix being attr's prefix value. - */ - candidatePrefix = map.get(attr.prefix, attributeNamespace); - /** - * 3.5.2. If the value of attribute namespace is the XMLNS namespace, - * then run these steps: - */ - if (attributeNamespace === infra_1.namespace.XMLNS) { - /** - * 3.5.2.1. If any of the following are true, then stop running these - * steps and goto Loop to visit the next attribute: - * - the attr's value is the XML namespace; - * _Note:_ The XML namespace cannot be redeclared and survive - * round-tripping (unless it defines the prefix "xml"). To avoid this - * problem, this algorithm always prefixes elements in the XML - * namespace with "xml" and drops any related definitions as seen - * in the above condition. - * - the attr's prefix is null and the ignore namespace definition - * attribute flag is true (the Element's default namespace attribute - * should be skipped); - * - the attr's prefix is not null and either - * * the attr's localName is not a key contained in the local - * prefixes map, or - * * the attr's localName is present in the local prefixes map but - * the value of the key does not match attr's value - * and furthermore that the attr's localName (as the prefix to find) - * is found in the namespace prefix map given the namespace consisting - * of the attr's value (the current namespace prefix definition was - * exactly defined previously--on an ancestor element not the current - * element whose attributes are being processed). - */ - if (attr.value === infra_1.namespace.XML || - (attr.prefix === null && ignoreNamespaceDefinitionAttribute) || - (attr.prefix !== null && (!(attr.localName in localPrefixesMap) || - localPrefixesMap[attr.localName] !== attr.value) && - map.has(attr.localName, attr.value))) - continue; - /** - * 3.5.2.2. If the require well-formed flag is set (its value is true), - * and the value of attr's value attribute matches the XMLNS - * namespace, then throw an exception; the serialization of this - * attribute would produce invalid XML because the XMLNS namespace - * is reserved and cannot be applied as an element's namespace via - * XML parsing. - * - * _Note:_ DOM APIs do allow creation of elements in the XMLNS - * namespace but with strict qualifications. - */ - if (requireWellFormed && attr.value === infra_1.namespace.XMLNS) { - throw new Error("XMLNS namespace is reserved (well-formed required)."); - } - /** - * 3.5.2.3. If the require well-formed flag is set (its value is true), - * and the value of attr's value attribute is the empty string, then - * throw an exception; namespace prefix declarations cannot be used - * to undeclare a namespace (use a default namespace declaration - * instead). - */ - if (requireWellFormed && attr.value === '') { - throw new Error("Namespace prefix declarations cannot be used to undeclare a namespace (well-formed required)."); - } - /** - * 3.5.2.4. the attr's prefix matches the string "xmlns", then let - * candidate prefix be the string "xmlns". - */ - if (attr.prefix === 'xmlns') - candidatePrefix = 'xmlns'; - /** - * 3.5.3. Otherwise, the attribute namespace is not the XMLNS namespace. - * Run these steps: - * - * _Note:_ The (candidatePrefix === null) check is not in the spec. - * We deviate from the spec here. Otherwise a prefix is generated for - * all attributes with namespaces. - */ - } - else if (candidatePrefix === null) { - if (attr.prefix !== null && - (!map.hasPrefix(attr.prefix) || - map.has(attr.prefix, attributeNamespace))) { - /** - * Check if we can use the attribute's own prefix. - * We deviate from the spec here. - * TODO: This is not an efficient way of searching for prefixes. - * Follow developments to the spec. - */ - candidatePrefix = attr.prefix; - } - else { - /** - * 3.5.3.1. Let candidate prefix be the result of generating a prefix - * providing map, attribute namespace, and prefix index as input. - */ - candidatePrefix = this._generatePrefix(attributeNamespace, map, prefixIndex); - } - /** - * 3.5.3.2. Append the following to result, in the order listed: - * 3.5.3.2.1. " " (U+0020 SPACE); - * 3.5.3.2.2. The string "xmlns:"; - * 3.5.3.2.3. The value of candidate prefix; - * 3.5.3.2.4. "="" (U+003D EQUALS SIGN, U+0022 QUOTATION MARK); - * 3.5.3.2.5. The result of serializing an attribute value given - * attribute namespace and the require well-formed flag as input; - * 3.5.3.2.6. """ (U+0022 QUOTATION MARK). - */ - result += " xmlns:" + candidatePrefix + "=\"" + - this._serializeAttributeValue(attributeNamespace, requireWellFormed) + "\""; - } - } - /** - * 3.6. Append a " " (U+0020 SPACE) to result. - * 3.7. If candidate prefix is not null, then append to result the - * concatenation of candidate prefix with ":" (U+003A COLON). - */ - result += " "; - if (candidatePrefix !== null) { - result += candidatePrefix + ':'; - } - /** - * 3.8. If the require well-formed flag is set (its value is true), and - * this attr's localName attribute contains the character - * ":" (U+003A COLON) or does not match the XML Name production or - * equals "xmlns" and attribute namespace is null, then throw an - * exception; the serialization of this attr would not be a - * well-formed attribute. - */ - if (requireWellFormed && (attr.localName.indexOf(":") !== -1 || - !(0, algorithm_1.xml_isName)(attr.localName) || - (attr.localName === "xmlns" && attributeNamespace === null))) { - throw new Error("Attribute local name contains invalid characters (well-formed required)."); - } - /** - * 3.9. Append the following strings to result, in the order listed: - * 3.9.1. The value of attr's localName; - * 3.9.2. "="" (U+003D EQUALS SIGN, U+0022 QUOTATION MARK); - * 3.9.3. The result of serializing an attribute value given attr's value - * attribute and the require well-formed flag as input; - * 3.9.4. """ (U+0022 QUOTATION MARK). - */ - result += attr.localName + "=\"" + - this._serializeAttributeValue(attr.value, requireWellFormed) + "\""; - } - /** - * 4. Return the value of result. - */ - return result; - } - /** - * Records namespace information for the given element and returns the - * default namespace attribute value. - * - * @param node - element node to process - * @param map - namespace prefix map - * @param localPrefixesMap - local prefixes map - */ - _recordNamespaceInformation(node, map, localPrefixesMap) { - /** - * 1. Let default namespace attr value be null. - */ - let defaultNamespaceAttrValue = null; - /** - * 2. Main: For each attribute attr in element's attributes, in the order - * they are specified in the element's attribute list: - */ - for (const attr of node.attributes) { - /** - * _Note:_ The following conditional steps find namespace prefixes. Only - * attributes in the XMLNS namespace are considered (e.g., attributes made - * to look like namespace declarations via - * setAttribute("xmlns:pretend-prefix", "pretend-namespace") are not - * included). - */ - /** 2.1. Let attribute namespace be the value of attr's namespaceURI value. */ - let attributeNamespace = attr.namespaceURI; - /** 2.2. Let attribute prefix be the value of attr's prefix. */ - let attributePrefix = attr.prefix; - /** 2.3. If the attribute namespace is the XMLNS namespace, then: */ - if (attributeNamespace === infra_1.namespace.XMLNS) { - /** - * 2.3.1. If attribute prefix is null, then attr is a default namespace - * declaration. Set the default namespace attr value to attr's value and - * stop running these steps, returning to Main to visit the next - * attribute. - */ - if (attributePrefix === null) { - defaultNamespaceAttrValue = attr.value; - continue; - /** - * 2.3.2. Otherwise, the attribute prefix is not null and attr is a - * namespace prefix definition. Run the following steps: - */ - } - else { - /** 2.3.2.1. Let prefix definition be the value of attr's localName. */ - let prefixDefinition = attr.localName; - /** 2.3.2.2. Let namespace definition be the value of attr's value. */ - let namespaceDefinition = attr.value; - /** - * 2.3.2.3. If namespace definition is the XML namespace, then stop - * running these steps, and return to Main to visit the next - * attribute. - * - * _Note:_ XML namespace definitions in prefixes are completely - * ignored (in order to avoid unnecessary work when there might be - * prefix conflicts). XML namespaced elements are always handled - * uniformly by prefixing (and overriding if necessary) the element's - * localname with the reserved "xml" prefix. - */ - if (namespaceDefinition === infra_1.namespace.XML) { - continue; - } - /** - * 2.3.2.4. If namespace definition is the empty string (the - * declarative form of having no namespace), then let namespace - * definition be null instead. - */ - if (namespaceDefinition === '') { - namespaceDefinition = null; - } - /** - * 2.3.2.5. If prefix definition is found in map given the namespace - * namespace definition, then stop running these steps, and return to - * Main to visit the next attribute. - * - * _Note:_ This step avoids adding duplicate prefix definitions for - * the same namespace in the map. This has the side-effect of avoiding - * later serialization of duplicate namespace prefix declarations in - * any descendant nodes. - */ - if (map.has(prefixDefinition, namespaceDefinition)) { - continue; - } - /** - * 2.3.2.6. Add the prefix prefix definition to map given namespace - * namespace definition. - */ - map.set(prefixDefinition, namespaceDefinition); - /** - * 2.3.2.7. Add the value of prefix definition as a new key to the - * local prefixes map, with the namespace definition as the key's - * value replacing the value of null with the empty string if - * applicable. - */ - localPrefixesMap[prefixDefinition] = namespaceDefinition || ''; - } - } - } - /** - * 3. Return the value of default namespace attr value. - * - * _Note:_ The empty string is a legitimate return value and is not - * converted to null. - */ - return defaultNamespaceAttrValue; - } - /** - * Generates a new prefix for the given namespace. - * - * @param newNamespace - a namespace to generate prefix for - * @param prefixMap - namespace prefix map - * @param prefixIndex - generated namespace prefix index - */ - _generatePrefix(newNamespace, prefixMap, prefixIndex) { - /** - * 1. Let generated prefix be the concatenation of the string "ns" and the - * current numerical value of prefix index. - * 2. Let the value of prefix index be incremented by one. - * 3. Add to map the generated prefix given the new namespace namespace. - * 4. Return the value of generated prefix. - */ - let generatedPrefix = "ns" + prefixIndex.value; - prefixIndex.value++; - prefixMap.set(generatedPrefix, newNamespace); - return generatedPrefix; - } - /** - * Produces an XML serialization of an attribute value. - * - * @param value - attribute value - * @param requireWellFormed - whether to check conformance - */ - _serializeAttributeValue(value, requireWellFormed) { - /** - * From: https://w3c.github.io/DOM-Parsing/#dfn-serializing-an-attribute-value - * - * 1. If the require well-formed flag is set (its value is true), and - * attribute value contains characters that are not matched by the XML Char - * production, then throw an exception; the serialization of this attribute - * value would fail to produce a well-formed element serialization. - */ - if (requireWellFormed && value !== null && !(0, algorithm_1.xml_isLegalChar)(value)) { - throw new Error("Invalid characters in attribute value."); - } - /** - * 2. If attribute value is null, then return the empty string. - */ - if (value === null) - return ""; - /** - * 3. Otherwise, attribute value is a string. Return the value of attribute - * value, first replacing any occurrences of the following: - * - "&" with "&" - * - """ with """ - * - "<" with "<" - * - ">" with ">" - * NOTE - * This matches behavior present in browsers, and goes above and beyond the - * grammar requirement in the XML specification's AttValue production by - * also replacing ">" characters. - */ - let result = ""; - for (let i = 0; i < value.length; i++) { - const c = value[i]; - if (c === "\"") - result += """; - else if (c === "&") - result += "&"; - else if (c === "<") - result += "<"; - else if (c === ">") - result += ">"; - else - result += c; - } - return result; - } - /** - * Produces an XML serialization of an element node. - * - * @param node - node to serialize - * @param requireWellFormed - whether to check conformance - */ - _serializeElement(node, requireWellFormed) { - /** - * From: https://w3c.github.io/DOM-Parsing/#xml-serializing-an-element-node - * - * 1. If the require well-formed flag is set (its value is true), and this - * node's localName attribute contains the character ":" (U+003A COLON) or - * does not match the XML Name production, then throw an exception; the - * serialization of this node would not be a well-formed element. - */ - if (requireWellFormed && (node.localName.indexOf(":") !== -1 || - !(0, algorithm_1.xml_isName)(node.localName))) { - throw new Error("Node local name contains invalid characters (well-formed required)."); - } - /** - * 2. Let markup be the string "<" (U+003C LESS-THAN SIGN). - * 3. Let qualified name be an empty string. - * 4. Let skip end tag be a boolean flag with value false. - * 5. Let ignore namespace definition attribute be a boolean flag with value - * false. - * 6. Given prefix map, copy a namespace prefix map and let map be the - * result. - * 7. Let local prefixes map be an empty map. The map has unique Node prefix - * strings as its keys, with corresponding namespaceURI Node values as the - * map's key values (in this map, the null namespace is represented by the - * empty string). - * - * _Note:_ This map is local to each element. It is used to ensure there - * are no conflicting prefixes should a new namespace prefix attribute need - * to be generated. It is also used to enable skipping of duplicate prefix - * definitions when writing an element's attributes: the map allows the - * algorithm to distinguish between a prefix in the namespace prefix map - * that might be locally-defined (to the current Element) and one that is - * not. - * 8. Let local default namespace be the result of recording the namespace - * information for node given map and local prefixes map. - * - * _Note:_ The above step will update map with any found namespace prefix - * definitions, add the found prefix definitions to the local prefixes map - * and return a local default namespace value defined by a default namespace - * attribute if one exists. Otherwise it returns null. - * 9. Let inherited ns be a copy of namespace. - * 10. Let ns be the value of node's namespaceURI attribute. - */ - let skipEndTag = false; - /** 11. If inherited ns is equal to ns, then: */ - /** - * 11.1. If local default namespace is not null, then set ignore - * namespace definition attribute to true. - * 11.2. If ns is the XML namespace, then append to qualified name the - * concatenation of the string "xml:" and the value of node's localName. - * 11.3. Otherwise, append to qualified name the value of node's - * localName. The node's prefix if it exists, is dropped. - */ - const qualifiedName = node.localName; - /** 11.4. Append the value of qualified name to markup. */ - let markup = "<" + qualifiedName; - /** - * 13. Append to markup the result of the XML serialization of node's - * attributes given map, prefix index, local prefixes map, ignore namespace - * definition attribute flag, and require well-formed flag. - */ - markup += this._serializeAttributes(node, requireWellFormed); - /** - * 14. If ns is the HTML namespace, and the node's list of children is - * empty, and the node's localName matches any one of the following void - * elements: "area", "base", "basefont", "bgsound", "br", "col", "embed", - * "frame", "hr", "img", "input", "keygen", "link", "menuitem", "meta", - * "param", "source", "track", "wbr"; then append the following to markup, - * in the order listed: - * 14.1. " " (U+0020 SPACE); - * 14.2. "/" (U+002F SOLIDUS). - * and set the skip end tag flag to true. - * 15. If ns is not the HTML namespace, and the node's list of children is - * empty, then append "/" (U+002F SOLIDUS) to markup and set the skip end - * tag flag to true. - * 16. Append ">" (U+003E GREATER-THAN SIGN) to markup. - */ - if (node._children.size === 0) { - markup += "/"; - skipEndTag = true; - } - markup += ">"; - /** - * 17. If the value of skip end tag is true, then return the value of markup - * and skip the remaining steps. The node is a leaf-node. - */ - if (skipEndTag) - return markup; - /** - * 18. If ns is the HTML namespace, and the node's localName matches the - * string "template", then this is a template element. Append to markup the - * result of XML serializing a DocumentFragment node given the template - * element's template contents (a DocumentFragment), providing inherited - * ns, map, prefix index, and the require well-formed flag. - * - * _Note:_ This allows template content to round-trip, given the rules for - * parsing XHTML documents. - * - * 19. Otherwise, append to markup the result of running the XML - * serialization algorithm on each of node's children, in tree order, - * providing inherited ns, map, prefix index, and the require well-formed - * flag. - */ - for (const childNode of node._children) { - markup += this._serializeNode(childNode, requireWellFormed); - } - /** - * 20. Append the following to markup, in the order listed: - * 20.1. "" (U+003C LESS-THAN SIGN, U+002F SOLIDUS); - * 20.2. The value of qualified name; - * 20.3. ">" (U+003E GREATER-THAN SIGN). - */ - markup += "" + qualifiedName + ">"; - /** - * 21. Return the value of markup. - */ - return markup; - } - /** - * Produces an XML serialization of a document node. - * - * @param node - node to serialize - * @param requireWellFormed - whether to check conformance - */ - _serializeDocument(node, requireWellFormed) { - /** - * If the require well-formed flag is set (its value is true), and this node - * has no documentElement (the documentElement attribute's value is null), - * then throw an exception; the serialization of this node would not be a - * well-formed document. - */ - if (requireWellFormed && node.documentElement === null) { - throw new Error("Missing document element (well-formed required)."); - } - /** - * Otherwise, run the following steps: - * 1. Let serialized document be an empty string. - * 2. For each child child of node, in tree order, run the XML - * serialization algorithm on the child passing along the provided - * arguments, and append the result to serialized document. - * - * _Note:_ This will serialize any number of ProcessingInstruction and - * Comment nodes both before and after the Document's documentElement node, - * including at most one DocumentType node. (Text nodes are not allowed as - * children of the Document.) - * - * 3. Return the value of serialized document. - */ - let serializedDocument = ""; - for (const childNode of node._children) { - serializedDocument += this._serializeNode(childNode, requireWellFormed); - } - return serializedDocument; - } - /** - * Produces an XML serialization of a document fragment node. - * - * @param node - node to serialize - * @param requireWellFormed - whether to check conformance - */ - _serializeDocumentFragment(node, requireWellFormed) { - /** - * 1. Let markup the empty string. - * 2. For each child child of node, in tree order, run the XML serialization - * algorithm on the child given namespace, prefix map, a reference to prefix - * index, and flag require well-formed. Concatenate the result to markup. - * 3. Return the value of markup. - */ - let markup = ""; - for (const childNode of node._children) { - markup += this._serializeNode(childNode, requireWellFormed); - } - return markup; - } - /** - * Produces an XML serialization of the attributes of an element node. - * - * @param node - node to serialize - * @param requireWellFormed - whether to check conformance - */ - _serializeAttributes(node, requireWellFormed) { - /** - * 1. Let result be the empty string. - * 2. Let localname set be a new empty namespace localname set. This - * localname set will contain tuples of unique attribute namespaceURI and - * localName pairs, and is populated as each attr is processed. This set is - * used to [optionally] enforce the well-formed constraint that an element - * cannot have two attributes with the same namespaceURI and localName. - * This can occur when two otherwise identical attributes on the same - * element differ only by their prefix values. - */ - let result = ""; - const localNameSet = requireWellFormed ? {} : undefined; - /** - * 3. Loop: For each attribute attr in element's attributes, in the order - * they are specified in the element's attribute list: - */ - for (const attr of node.attributes) { - /** - * 3.1. If the require well-formed flag is set (its value is true), and the - * localname set contains a tuple whose values match those of a new tuple - * consisting of attr's namespaceURI attribute and localName attribute, - * then throw an exception; the serialization of this attr would fail to - * produce a well-formed element serialization. - */ - if (requireWellFormed && localNameSet && (attr.localName in localNameSet)) { - throw new Error("Element contains duplicate attributes (well-formed required)."); - } - /** - * 3.2. Create a new tuple consisting of attr's namespaceURI attribute and - * localName attribute, and add it to the localname set. - * 3.3. Let attribute namespace be the value of attr's namespaceURI value. - * 3.4. Let candidate prefix be null. - */ - if (requireWellFormed && localNameSet) - localNameSet[attr.localName] = true; - /** 3.5. If attribute namespace is not null, then run these sub-steps: */ - /** - * 3.6. Append a " " (U+0020 SPACE) to result. - * 3.7. If candidate prefix is not null, then append to result the - * concatenation of candidate prefix with ":" (U+003A COLON). - */ - /** - * 3.8. If the require well-formed flag is set (its value is true), and - * this attr's localName attribute contains the character - * ":" (U+003A COLON) or does not match the XML Name production or - * equals "xmlns" and attribute namespace is null, then throw an - * exception; the serialization of this attr would not be a - * well-formed attribute. - */ - if (requireWellFormed && (attr.localName.indexOf(":") !== -1 || - !(0, algorithm_1.xml_isName)(attr.localName))) { - throw new Error("Attribute local name contains invalid characters (well-formed required)."); - } - /** - * 3.9. Append the following strings to result, in the order listed: - * 3.9.1. The value of attr's localName; - * 3.9.2. "="" (U+003D EQUALS SIGN, U+0022 QUOTATION MARK); - * 3.9.3. The result of serializing an attribute value given attr's value - * attribute and the require well-formed flag as input; - * 3.9.4. """ (U+0022 QUOTATION MARK). - */ - result += " " + attr.localName + "=\"" + - this._serializeAttributeValue(attr.value, requireWellFormed) + "\""; - } - /** - * 4. Return the value of result. - */ - return result; - } -} -exports.XMLSerializerImpl = XMLSerializerImpl; -//# sourceMappingURL=XMLSerializerImpl.js.map + debug('tunneling connection has established'); + self.sockets[self.sockets.indexOf(placeholder)] = socket; + return cb(socket); + } -/***/ }), + function onError(cause) { + connectReq.removeAllListeners(); -/***/ 6052: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + debug('tunneling socket could not be established, cause=%s\n', + cause.message, cause.stack); + var error = new Error('tunneling socket could not be established, ' + + 'cause=' + cause.message); + error.code = 'ECONNRESET'; + options.request.emit('error', error); + self.removeSocket(placeholder); + } +}; +TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { + var pos = this.sockets.indexOf(socket) + if (pos === -1) { + return; + } + this.sockets.splice(pos, 1); -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.XMLSerializer = void 0; -// Export classes -var XMLSerializerImpl_1 = __nccwpck_require__(6851); -Object.defineProperty(exports, "XMLSerializer", ({ enumerable: true, get: function () { return XMLSerializerImpl_1.XMLSerializerImpl; } })); -//# sourceMappingURL=index.js.map + var pending = this.requests.shift(); + if (pending) { + // If we have pending requests and a socket gets closed a new one + // needs to be created to take over in the pool for the one that closed. + this.createSocket(pending, function(socket) { + pending.request.onSocket(socket); + }); + } +}; -/***/ }), +function createSecureSocket(options, cb) { + var self = this; + TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { + var hostHeader = options.request.getHeader('host'); + var tlsOptions = mergeOptions({}, self.options, { + socket: socket, + servername: hostHeader ? hostHeader.replace(/:.*$/, '') : options.host + }); -/***/ 9786: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + // 0 is dummy port for v0.6 + var secureSocket = tls.connect(0, tlsOptions); + self.sockets[self.sockets.indexOf(socket)] = secureSocket; + cb(secureSocket); + }); +} -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Cast = void 0; -const Guard_1 = __nccwpck_require__(7773); -/** - * Contains type casts for DOM objects. - */ -class Cast { - /** - * Casts the given object to a `Node`. - * - * @param a - the object to cast - */ - static asNode(a) { - if (Guard_1.Guard.isNode(a)) { - return a; - } - else { - throw new Error("Invalid object. Node expected."); +function toOptions(host, port, localAddress) { + if (typeof host === 'string') { // since v0.10 + return { + host: host, + port: port, + localAddress: localAddress + }; + } + return host; // for v0.11 or later +} + +function mergeOptions(target) { + for (var i = 1, len = arguments.length; i < len; ++i) { + var overrides = arguments[i]; + if (typeof overrides === 'object') { + var keys = Object.keys(overrides); + for (var j = 0, keyLen = keys.length; j < keyLen; ++j) { + var k = keys[j]; + if (overrides[k] !== undefined) { + target[k] = overrides[k]; } + } } + } + return target; } -exports.Cast = Cast; -//# sourceMappingURL=Cast.js.map - -/***/ }), - -/***/ 4581: -/***/ ((__unused_webpack_module, exports) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.EmptySet = void 0; -class EmptySet { - get size() { - return 0; - } - add(value) { - throw new Error("Cannot add to an empty set."); - } - clear() { - // no-op - } - delete(value) { - return false; - } - forEach(callbackfn, thisArg) { - // no-op - } - has(value) { - return false; - } - [Symbol.iterator]() { - return new EmptySetIterator(); - } - entries() { - return new EmptySetIterator(); - } - keys() { - return new EmptySetIterator(); - } - values() { - return new EmptySetIterator(); - } - get [Symbol.toStringTag]() { - return "EmptySet"; - } -} -exports.EmptySet = EmptySet; -class EmptySetIterator { - [Symbol.iterator]() { - return this; - } - next() { - return { done: true, value: null }; +var debug; +if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { + debug = function() { + var args = Array.prototype.slice.call(arguments); + if (typeof args[0] === 'string') { + args[0] = 'TUNNEL: ' + args[0]; + } else { + args.unshift('TUNNEL:'); } + console.error.apply(console, args); + } +} else { + debug = function() {}; } -//# sourceMappingURL=EmptySet.js.map +__webpack_unused_export__ = debug; // for test + /***/ }), -/***/ 7773: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 6752: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +var __webpack_unused_export__; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Guard = void 0; -const interfaces_1 = __nccwpck_require__(9454); -/** - * Contains user-defined type guards for DOM objects. - */ -class Guard { - /** - * Determines if the given object is a `Node`. - * - * @param a - the object to check - */ - static isNode(a) { - return (!!a && a._nodeType !== undefined); - } - /** - * Determines if the given object is a `Document`. - * - * @param a - the object to check - */ - static isDocumentNode(a) { - return (Guard.isNode(a) && a._nodeType === interfaces_1.NodeType.Document); - } - /** - * Determines if the given object is a `DocumentType`. - * - * @param a - the object to check - */ - static isDocumentTypeNode(a) { - return (Guard.isNode(a) && a._nodeType === interfaces_1.NodeType.DocumentType); - } - /** - * Determines if the given object is a `DocumentFragment`. - * - * @param a - the object to check - */ - static isDocumentFragmentNode(a) { - return (Guard.isNode(a) && a._nodeType === interfaces_1.NodeType.DocumentFragment); - } - /** - * Determines if the given object is a `Attr`. - * - * @param a - the object to check - */ - static isAttrNode(a) { - return (Guard.isNode(a) && a._nodeType === interfaces_1.NodeType.Attribute); - } - /** - * Determines if the given node is a `CharacterData` node. - * - * @param a - the object to check - */ - static isCharacterDataNode(a) { - if (!Guard.isNode(a)) - return false; - const type = a._nodeType; - return (type === interfaces_1.NodeType.Text || - type === interfaces_1.NodeType.ProcessingInstruction || - type === interfaces_1.NodeType.Comment || - type === interfaces_1.NodeType.CData); - } - /** - * Determines if the given object is a `Text` or a `CDATASection`. - * - * @param a - the object to check - */ - static isTextNode(a) { - return (Guard.isNode(a) && (a._nodeType === interfaces_1.NodeType.Text || a._nodeType === interfaces_1.NodeType.CData)); - } - /** - * Determines if the given object is a `Text`. - * - * @param a - the object to check - */ - static isExclusiveTextNode(a) { - return (Guard.isNode(a) && a._nodeType === interfaces_1.NodeType.Text); - } - /** - * Determines if the given object is a `CDATASection`. - * - * @param a - the object to check - */ - static isCDATASectionNode(a) { - return (Guard.isNode(a) && a._nodeType === interfaces_1.NodeType.CData); - } - /** - * Determines if the given object is a `Comment`. - * - * @param a - the object to check - */ - static isCommentNode(a) { - return (Guard.isNode(a) && a._nodeType === interfaces_1.NodeType.Comment); - } - /** - * Determines if the given object is a `ProcessingInstruction`. - * - * @param a - the object to check - */ - static isProcessingInstructionNode(a) { - return (Guard.isNode(a) && a._nodeType === interfaces_1.NodeType.ProcessingInstruction); - } - /** - * Determines if the given object is an `Element`. - * - * @param a - the object to check - */ - static isElementNode(a) { - return (Guard.isNode(a) && a._nodeType === interfaces_1.NodeType.Element); - } - /** - * Determines if the given object is a custom `Element`. - * - * @param a - the object to check - */ - static isCustomElementNode(a) { - return (Guard.isElementNode(a) && a._customElementState === "custom"); - } - /** - * Determines if the given object is a `ShadowRoot`. - * - * @param a - the object to check - */ - static isShadowRoot(a) { - return (!!a && a.host !== undefined); - } - /** - * Determines if the given object is a `MouseEvent`. - * - * @param a - the object to check - */ - static isMouseEvent(a) { - return (!!a && a.screenX !== undefined && a.screenY != undefined); - } - /** - * Determines if the given object is a slotable. - * - * Element and Text nodes are slotables. A slotable has an associated name - * (a string). - * - * @param a - the object to check - */ - static isSlotable(a) { - return (!!a && a._name !== undefined && a._assignedSlot !== undefined && - (Guard.isTextNode(a) || Guard.isElementNode(a))); - } - /** - * Determines if the given object is a slot. - * - * @param a - the object to check - */ - static isSlot(a) { - return (!!a && a._name !== undefined && a._assignedNodes !== undefined && - Guard.isElementNode(a)); - } - /** - * Determines if the given object is a `Window`. - * - * @param a - the object to check - */ - static isWindow(a) { - return (!!a && a.navigator !== undefined); - } - /** - * Determines if the given object is an `EventListener`. - * - * @param a - the object to check - */ - static isEventListener(a) { - return (!!a && a.handleEvent !== undefined); - } - /** - * Determines if the given object is a `RegisteredObserver`. - * - * @param a - the object to check - */ - static isRegisteredObserver(a) { - return (!!a && a.observer !== undefined && a.options !== undefined); + +const Client = __nccwpck_require__(3701) +const Dispatcher = __nccwpck_require__(883) +const Pool = __nccwpck_require__(628) +const BalancedPool = __nccwpck_require__(837) +const Agent = __nccwpck_require__(7405) +const ProxyAgent = __nccwpck_require__(6672) +const EnvHttpProxyAgent = __nccwpck_require__(3137) +const RetryAgent = __nccwpck_require__(50) +const errors = __nccwpck_require__(8707) +const util = __nccwpck_require__(3440) +const { InvalidArgumentError } = errors +const api = __nccwpck_require__(6615) +const buildConnector = __nccwpck_require__(9136) +const MockClient = __nccwpck_require__(7365) +const MockAgent = __nccwpck_require__(7501) +const MockPool = __nccwpck_require__(4004) +const mockErrors = __nccwpck_require__(2429) +const RetryHandler = __nccwpck_require__(7816) +const { getGlobalDispatcher, setGlobalDispatcher } = __nccwpck_require__(2581) +const DecoratorHandler = __nccwpck_require__(8155) +const RedirectHandler = __nccwpck_require__(8754) +const createRedirectInterceptor = __nccwpck_require__(5092) + +Object.assign(Dispatcher.prototype, api) + +__webpack_unused_export__ = Dispatcher +__webpack_unused_export__ = Client +__webpack_unused_export__ = Pool +__webpack_unused_export__ = BalancedPool +__webpack_unused_export__ = Agent +module.exports.kT = ProxyAgent +__webpack_unused_export__ = EnvHttpProxyAgent +__webpack_unused_export__ = RetryAgent +__webpack_unused_export__ = RetryHandler + +__webpack_unused_export__ = DecoratorHandler +__webpack_unused_export__ = RedirectHandler +__webpack_unused_export__ = createRedirectInterceptor +__webpack_unused_export__ = { + redirect: __nccwpck_require__(1514), + retry: __nccwpck_require__(2026), + dump: __nccwpck_require__(8060), + dns: __nccwpck_require__(379) +} + +__webpack_unused_export__ = buildConnector +__webpack_unused_export__ = errors +__webpack_unused_export__ = { + parseHeaders: util.parseHeaders, + headerNameToString: util.headerNameToString +} + +function makeDispatcher (fn) { + return (url, opts, handler) => { + if (typeof opts === 'function') { + handler = opts + opts = null } - /** - * Determines if the given object is a `TransientRegisteredObserver`. - * - * @param a - the object to check - */ - static isTransientRegisteredObserver(a) { - return (!!a && a.source !== undefined && Guard.isRegisteredObserver(a)); + + if (!url || (typeof url !== 'string' && typeof url !== 'object' && !(url instanceof URL))) { + throw new InvalidArgumentError('invalid url') } -} -exports.Guard = Guard; -//# sourceMappingURL=Guard.js.map -/***/ }), + if (opts != null && typeof opts !== 'object') { + throw new InvalidArgumentError('invalid opts') + } -/***/ 8247: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + if (opts && opts.path != null) { + if (typeof opts.path !== 'string') { + throw new InvalidArgumentError('invalid opts.path') + } + let path = opts.path + if (!opts.path.startsWith('/')) { + path = `/${path}` + } -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.EmptySet = exports.Guard = exports.Cast = void 0; -var Cast_1 = __nccwpck_require__(9786); -Object.defineProperty(exports, "Cast", ({ enumerable: true, get: function () { return Cast_1.Cast; } })); -var Guard_1 = __nccwpck_require__(7773); -Object.defineProperty(exports, "Guard", ({ enumerable: true, get: function () { return Guard_1.Guard; } })); -var EmptySet_1 = __nccwpck_require__(4581); -Object.defineProperty(exports, "EmptySet", ({ enumerable: true, get: function () { return EmptySet_1.EmptySet; } })); -//# sourceMappingURL=index.js.map + url = new URL(util.parseOrigin(url).origin + path) + } else { + if (!opts) { + opts = typeof url === 'object' ? url : {} + } -/***/ }), + url = util.parseURL(url) + } -/***/ 9558: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + const { agent, dispatcher = getGlobalDispatcher() } = opts + if (agent) { + throw new InvalidArgumentError('unsupported opts.agent. Did you mean opts.client?') + } -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.forgivingBase64Encode = forgivingBase64Encode; -exports.forgivingBase64Decode = forgivingBase64Decode; -const CodePoints_1 = __nccwpck_require__(4467); -/** - * Base-64 encodes the given string. - * - * @param input - a string - */ -function forgivingBase64Encode(input) { - /** - * To forgiving-base64 encode given a byte sequence data, apply the base64 - * algorithm defined in section 4 of RFC 4648 to data and return the result. - * [RFC4648] - */ - return Buffer.from(input).toString('base64'); + return fn.call(dispatcher, { + ...opts, + origin: url.origin, + path: url.search ? `${url.pathname}${url.search}` : url.pathname, + method: opts.method || (opts.body ? 'PUT' : 'GET') + }, handler) + } } -/** - * Decodes a base-64 string. - * - * @param input - a string - */ -function forgivingBase64Decode(input) { - if (input === "") - return ""; - /** - * 1. Remove all ASCII whitespace from data. - */ - input = input.replace(CodePoints_1.ASCIIWhiteSpace, ''); - /** - * 2. If data’s length divides by 4 leaving no remainder, then: - * 2.1. If data ends with one or two U+003D (=) code points, then remove them from data. - */ - if (input.length % 4 === 0) { - if (input.endsWith("==")) { - input = input.substr(0, input.length - 2); - } - else if (input.endsWith("=")) { - input = input.substr(0, input.length - 1); - } + +__webpack_unused_export__ = setGlobalDispatcher +__webpack_unused_export__ = getGlobalDispatcher + +const fetchImpl = (__nccwpck_require__(4398).fetch) +__webpack_unused_export__ = async function fetch (init, options = undefined) { + try { + return await fetchImpl(init, options) + } catch (err) { + if (err && typeof err === 'object') { + Error.captureStackTrace(err) } - /** - * 3. If data’s length divides by 4 leaving a remainder of 1, then return failure. - */ - if (input.length % 4 === 1) - return null; - /** - * 4. If data contains a code point that is not one of - * - U+002B (+) - * - U+002F (/) - * - ASCII alphanumeric - * then return failure. - */ - if (!/[0-9A-Za-z+/]/.test(input)) - return null; - /** - * 5. Let output be an empty byte sequence. - * 6. Let buffer be an empty buffer that can have bits appended to it. - * 7. Let position be a position variable for data, initially pointing at the - * start of data. - * 8. While position does not point past the end of data: - * 8.1. Find the code point pointed to by position in the second column of - * Table 1: The Base 64 Alphabet of RFC 4648. Let n be the number given in the - * first cell of the same row. [RFC4648] - * 8.2. Append the six bits corresponding to n, most significant bit first, - * to buffer. - * 8.3. If buffer has accumulated 24 bits, interpret them as three 8-bit - * big-endian numbers. Append three bytes with values equal to those numbers - * to output, in the same order, and then empty buffer. - * 8.4. Advance position by 1. - * 9. If buffer is not empty, it contains either 12 or 18 bits. If it contains - * 12 bits, then discard the last four and interpret the remaining eight as an - * 8-bit big-endian number. If it contains 18 bits, then discard the last two - * and interpret the remaining 16 as two 8-bit big-endian numbers. Append the - * one or two bytes with values equal to those one or two numbers to output, - * in the same order. - * 10. Return output. - */ - return Buffer.from(input, 'base64').toString('utf8'); + + throw err + } } -//# sourceMappingURL=Base64.js.map +/* unused reexport */ __nccwpck_require__(660).Headers +/* unused reexport */ __nccwpck_require__(9051).Response +/* unused reexport */ __nccwpck_require__(9967).Request +/* unused reexport */ __nccwpck_require__(5910).FormData +__webpack_unused_export__ = globalThis.File ?? (__nccwpck_require__(4573).File) +/* unused reexport */ __nccwpck_require__(8355).FileReader -/***/ }), +const { setGlobalOrigin, getGlobalOrigin } = __nccwpck_require__(1059) -/***/ 8311: -/***/ ((__unused_webpack_module, exports) => { +__webpack_unused_export__ = setGlobalOrigin +__webpack_unused_export__ = getGlobalOrigin +const { CacheStorage } = __nccwpck_require__(3245) +const { kConstruct } = __nccwpck_require__(109) -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.isASCIIByte = isASCIIByte; -/** - * Determines if the given number is an ASCII byte. - * - * @param byte - a byte - */ -function isASCIIByte(byte) { - /** - * An ASCII byte is a byte in the range 0x00 (NUL) to 0x7F (DEL), inclusive. - */ - return byte >= 0x00 && byte <= 0x7F; -} -//# sourceMappingURL=Byte.js.map +// Cache & CacheStorage are tightly coupled with fetch. Even if it may run +// in an older version of Node, it doesn't have any use without fetch. +__webpack_unused_export__ = new CacheStorage(kConstruct) -/***/ }), +const { deleteCookie, getCookies, getSetCookies, setCookie } = __nccwpck_require__(9061) -/***/ 2017: -/***/ ((__unused_webpack_module, exports) => { +__webpack_unused_export__ = deleteCookie +__webpack_unused_export__ = getCookies +__webpack_unused_export__ = getSetCookies +__webpack_unused_export__ = setCookie +const { parseMIMEType, serializeAMimeType } = __nccwpck_require__(1900) -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.length = length; -exports.byteLowercase = byteLowercase; -exports.byteUppercase = byteUppercase; -exports.byteCaseInsensitiveMatch = byteCaseInsensitiveMatch; -exports.startsWith = startsWith; -exports.byteLessThan = byteLessThan; -exports.isomorphicDecode = isomorphicDecode; -/** - * Returns the count of bytes in a sequence. - * - * @param list - a byte sequence - */ -function length(list) { - /** - * A byte sequence’s length is the number of bytes it contains. - */ - return list.length; -} -/** - * Converts each byte to lowercase. - * - * @param list - a byte sequence - */ -function byteLowercase(list) { - /** - * To byte-lowercase a byte sequence, increase each byte it contains, in the - * range 0x41 (A) to 0x5A (Z), inclusive, by 0x20. - */ - for (let i = 0; i < list.length; i++) { - const c = list[i]; - if (c >= 0x41 && c <= 0x5A) { - list[i] = c + 0x20; - } - } -} -/** - * Converts each byte to uppercase. - * - * @param list - a byte sequence - */ -function byteUppercase(list) { - /** - * To byte-uppercase a byte sequence, subtract each byte it contains, in the - * range 0x61 (a) to 0x7A (z), inclusive, by 0x20. - */ - for (let i = 0; i < list.length; i++) { - const c = list[i]; - if (c >= 0x61 && c <= 0x7A) { - list[i] = c - 0x20; - } - } -} -/** - * Compares two byte sequences. - * - * @param listA - a byte sequence - * @param listB - a byte sequence - */ -function byteCaseInsensitiveMatch(listA, listB) { - /** - * A byte sequence A is a byte-case-insensitive match for a byte sequence B, - * if the byte-lowercase of A is the byte-lowercase of B. - */ - if (listA.length !== listB.length) - return false; - for (let i = 0; i < listA.length; i++) { - let a = listA[i]; - let b = listB[i]; - if (a >= 0x41 && a <= 0x5A) - a += 0x20; - if (b >= 0x41 && b <= 0x5A) - b += 0x20; - if (a !== b) - return false; - } - return true; -} -/** - * Determines if `listA` starts with `listB`. - * - * @param listA - a byte sequence - * @param listB - a byte sequence - */ -function startsWith(listA, listB) { - /** - * 1. Let i be 0. - * 2. While true: - * 2.1. Let aByte be the ith byte of a if i is less than a’s length; otherwise null. - * 2.3. Let bByte be the ith byte of b if i is less than b’s length; otherwise null. - * 2.4. If bByte is null, then return true. - * 2.5. Return false if aByte is not bByte. - * 2.6. Set i to i + 1. - */ - let i = 0; - while (true) { - if (i >= listA.length) - return false; - if (i >= listB.length) - return true; - if (listA[i] !== listB[i]) - return false; - i++; - } -} -/** - * Determines if `listA` is less than `listB`. - * - * @param listA - a byte sequence - * @param listB - a byte sequence - */ -function byteLessThan(listA, listB) { - /** - * 1. If b starts with a, then return false. - * 2. If a starts with b, then return true. - * 3. Let n be the smallest index such that the nth byte of a is different - * from the nth byte of b. (There has to be such an index, since neither byte - * sequence starts with the other.) - * 4. If the nth byte of a is less than the nth byte of b, then return true. - * 5. Return false. - */ - let i = 0; - while (true) { - if (i >= listA.length) - return false; - if (i >= listB.length) - return true; - const a = listA[i]; - const b = listB[i]; - if (a < b) - return true; - else if (a > b) - return false; - i++; - } -} -/** - * Decodes a byte sequence into a string. - * - * @param list - a byte sequence - */ -function isomorphicDecode(list) { - /** - * To isomorphic decode a byte sequence input, return a string whose length is - * equal to input’s length and whose code points have the same values as - * input’s bytes, in the same order. - */ - return String.fromCodePoint(...list); -} -//# sourceMappingURL=ByteSequence.js.map +__webpack_unused_export__ = parseMIMEType +__webpack_unused_export__ = serializeAMimeType -/***/ }), +const { CloseEvent, ErrorEvent, MessageEvent } = __nccwpck_require__(5188) +/* unused reexport */ __nccwpck_require__(3726).WebSocket +__webpack_unused_export__ = CloseEvent +__webpack_unused_export__ = ErrorEvent +__webpack_unused_export__ = MessageEvent -/***/ 4467: -/***/ ((__unused_webpack_module, exports) => { +__webpack_unused_export__ = makeDispatcher(api.request) +__webpack_unused_export__ = makeDispatcher(api.stream) +__webpack_unused_export__ = makeDispatcher(api.pipeline) +__webpack_unused_export__ = makeDispatcher(api.connect) +__webpack_unused_export__ = makeDispatcher(api.upgrade) +__webpack_unused_export__ = MockClient +__webpack_unused_export__ = MockPool +__webpack_unused_export__ = MockAgent +__webpack_unused_export__ = mockErrors + +const { EventSource } = __nccwpck_require__(1238) + +__webpack_unused_export__ = EventSource -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.ASCIIAlphanumeric = exports.ASCIIAlpha = exports.ASCIILowerAlpha = exports.ASCIIUpperAlpha = exports.ASCIIHexDigit = exports.ASCIILowerHexDigit = exports.ASCIIUpperHexDigit = exports.ASCIIDigit = exports.Control = exports.C0ControlOrSpace = exports.C0Control = exports.ASCIIWhiteSpace = exports.ASCIITabOrNewLine = exports.ASCIICodePoint = exports.NonCharacter = exports.ScalarValue = exports.Surrogate = void 0; -/** - * A surrogate is a code point that is in the range U+D800 to U+DFFF, inclusive. - */ -exports.Surrogate = /[\uD800-\uDFFF]/; -/** - * A scalar value is a code point that is not a surrogate. - */ -exports.ScalarValue = /[\uD800-\uDFFF]/; -/** - * A noncharacter is a code point that is in the range U+FDD0 to U+FDEF, - * inclusive, or U+FFFE, U+FFFF, U+1FFFE, U+1FFFF, U+2FFFE, U+2FFFF, U+3FFFE, - * U+3FFFF, U+4FFFE, U+4FFFF, U+5FFFE, U+5FFFF, U+6FFFE, U+6FFFF, U+7FFFE, - * U+7FFFF, U+8FFFE, U+8FFFF, U+9FFFE, U+9FFFF, U+AFFFE, U+AFFFF, U+BFFFE, - * U+BFFFF, U+CFFFE, U+CFFFF, U+DFFFE, U+DFFFF, U+EFFFE, U+EFFFF, U+FFFFE, - * U+FFFFF, U+10FFFE, or U+10FFFF. - */ -exports.NonCharacter = /[\uFDD0-\uFDEF\uFFFE\uFFFF]|[\uD83F\uD87F\uD8BF\uD8FF\uD93F\uD97F\uD9BF\uD9FF\uDA3F\uDA7F\uDABF\uDAFF\uDB3F\uDB7F\uDBBF\uDBFF][\uDFFE\uDFFF]/; -/** - * An ASCII code point is a code point in the range U+0000 NULL to U+007F - * DELETE, inclusive. - */ -exports.ASCIICodePoint = /[\u0000-\u007F]/; -/** - * An ASCII tab or newline is U+0009 TAB, U+000A LF, or U+000D CR. - */ -exports.ASCIITabOrNewLine = /[\t\n\r]/; -/** - * ASCII whitespace is U+0009 TAB, U+000A LF, U+000C FF, U+000D CR, or - * U+0020 SPACE. - */ -exports.ASCIIWhiteSpace = /[\t\n\f\r ]/; -/** - * A C0 control is a code point in the range U+0000 NULL to U+001F - * INFORMATION SEPARATOR ONE, inclusive. - */ -exports.C0Control = /[\u0000-\u001F]/; -/** - * A C0 control or space is a C0 control or U+0020 SPACE. - */ -exports.C0ControlOrSpace = /[\u0000-\u001F ]/; -/** - * A control is a C0 control or a code point in the range U+007F DELETE to - * U+009F APPLICATION PROGRAM COMMAND, inclusive. - */ -exports.Control = /[\u0000-\u001F\u007F-\u009F]/; -/** - * An ASCII digit is a code point in the range U+0030 (0) to U+0039 (9), - * inclusive. - */ -exports.ASCIIDigit = /[0-9]/; -/** - * An ASCII upper hex digit is an ASCII digit or a code point in the range - * U+0041 (A) to U+0046 (F), inclusive. - */ -exports.ASCIIUpperHexDigit = /[0-9A-F]/; -/** - * An ASCII lower hex digit is an ASCII digit or a code point in the range - * U+0061 (a) to U+0066 (f), inclusive. - */ -exports.ASCIILowerHexDigit = /[0-9a-f]/; -/** - * An ASCII hex digit is an ASCII upper hex digit or ASCII lower hex digit. - */ -exports.ASCIIHexDigit = /[0-9A-Fa-f]/; -/** - * An ASCII upper alpha is a code point in the range U+0041 (A) to U+005A (Z), - * inclusive. - */ -exports.ASCIIUpperAlpha = /[A-Z]/; -/** - * An ASCII lower alpha is a code point in the range U+0061 (a) to U+007A (z), - * inclusive. - */ -exports.ASCIILowerAlpha = /[a-z]/; -/** - * An ASCII alpha is an ASCII upper alpha or ASCII lower alpha. - */ -exports.ASCIIAlpha = /[A-Za-z]/; -/** - * An ASCII alphanumeric is an ASCII digit or ASCII alpha. - */ -exports.ASCIIAlphanumeric = /[0-9A-Za-z]/; -//# sourceMappingURL=CodePoints.js.map /***/ }), -/***/ 5475: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 158: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +const { addAbortListener } = __nccwpck_require__(3440) +const { RequestAbortedError } = __nccwpck_require__(8707) -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.parseJSONFromBytes = parseJSONFromBytes; -exports.serializeJSONToBytes = serializeJSONToBytes; -exports.parseJSONIntoInfraValues = parseJSONIntoInfraValues; -exports.convertAJSONDerivedJavaScriptValueToAnInfraValue = convertAJSONDerivedJavaScriptValueToAnInfraValue; -const util_1 = __nccwpck_require__(7061); -/** - * Parses the given byte sequence representing a JSON string into an object. - * - * @param bytes - a byte sequence - */ -function parseJSONFromBytes(bytes) { - /** - * 1. Let jsonText be the result of running UTF-8 decode on bytes. [ENCODING] - * 2. Return ? Call(%JSONParse%, undefined, « jsonText »). - */ - const jsonText = (0, util_1.utf8Decode)(bytes); - return JSON.parse.call(undefined, jsonText); -} -/** - * Serialize the given JavaScript value into a byte sequence. - * - * @param value - a JavaScript value - */ -function serializeJSONToBytes(value) { - /** - * 1. Let jsonString be ? Call(%JSONStringify%, undefined, « value »). - * 2. Return the result of running UTF-8 encode on jsonString. [ENCODING] - */ - const jsonString = JSON.stringify.call(undefined, value); - return (0, util_1.utf8Encode)(jsonString); -} -/** - * Parses the given JSON string into a Realm-independent JavaScript value. - * - * @param jsonText - a JSON string - */ -function parseJSONIntoInfraValues(jsonText) { - /** - * 1. Let jsValue be ? Call(%JSONParse%, undefined, « jsonText »). - * 2. Return the result of converting a JSON-derived JavaScript value to an - * Infra value, given jsValue. - */ - const jsValue = JSON.parse.call(undefined, jsonText); - return convertAJSONDerivedJavaScriptValueToAnInfraValue(jsValue); -} -/** - * Parses the value into a Realm-independent JavaScript value. - * - * @param jsValue - a JavaScript value - */ -function convertAJSONDerivedJavaScriptValueToAnInfraValue(jsValue) { - /** - * 1. If Type(jsValue) is Null, String, or Number, then return jsValue. - */ - if (jsValue === null || (0, util_1.isString)(jsValue) || (0, util_1.isNumber)(jsValue)) - return jsValue; - /** - * 2. If IsArray(jsValue) is true, then: - * 2.1. Let result be an empty list. - * 2.2. Let length be ! ToLength(! Get(jsValue, "length")). - * 2.3. For each index of the range 0 to length − 1, inclusive: - * 2.3.1. Let indexName be ! ToString(index). - * 2.3.2. Let jsValueAtIndex be ! Get(jsValue, indexName). - * 2.3.3. Let infraValueAtIndex be the result of converting a JSON-derived - * JavaScript value to an Infra value, given jsValueAtIndex. - * 2.3.4. Append infraValueAtIndex to result. - * 2.8. Return result. - */ - if ((0, util_1.isArray)(jsValue)) { - const result = new Array(); - for (const jsValueAtIndex of jsValue) { - result.push(convertAJSONDerivedJavaScriptValueToAnInfraValue(jsValueAtIndex)); - } - return result; - } - else if ((0, util_1.isObject)(jsValue)) { - /** - * 3. Let result be an empty ordered map. - * 4. For each key of ! jsValue.[[OwnPropertyKeys]](): - * 4.1. Let jsValueAtKey be ! Get(jsValue, key). - * 4.2. Let infraValueAtKey be the result of converting a JSON-derived - * JavaScript value to an Infra value, given jsValueAtKey. - * 4.3. Set result[key] to infraValueAtKey. - * 5. Return result. - */ - const result = new Map(); - for (const key in jsValue) { - /* istanbul ignore else */ - if (jsValue.hasOwnProperty(key)) { - const jsValueAtKey = jsValue[key]; - result.set(key, convertAJSONDerivedJavaScriptValueToAnInfraValue(jsValueAtKey)); - } - } - return result; - } - /* istanbul ignore next */ - return jsValue; +const kListener = Symbol('kListener') +const kSignal = Symbol('kSignal') + +function abort (self) { + if (self.abort) { + self.abort(self[kSignal]?.reason) + } else { + self.reason = self[kSignal]?.reason ?? new RequestAbortedError() + } + removeSignal(self) } -//# sourceMappingURL=JSON.js.map -/***/ }), +function addSignal (self, signal) { + self.reason = null -/***/ 1193: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + self[kSignal] = null + self[kListener] = null + if (!signal) { + return + } -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.append = append; -exports.extend = extend; -exports.prepend = prepend; -exports.replace = replace; -exports.insert = insert; -exports.remove = remove; -exports.empty = empty; -exports.contains = contains; -exports.size = size; -exports.isEmpty = isEmpty; -exports.forEach = forEach; -exports.clone = clone; -exports.sortInAscendingOrder = sortInAscendingOrder; -exports.sortInDescendingOrder = sortInDescendingOrder; -const util_1 = __nccwpck_require__(7061); -/** - * Adds the given item to the end of the list. - * - * @param list - a list - * @param item - an item - */ -function append(list, item) { - list.push(item); -} -/** - * Extends a list by appending all items from another list. - * - * @param listA - a list to extend - * @param listB - a list containing items to append to `listA` - */ -function extend(listA, listB) { - listA.push(...listB); -} -/** - * Inserts the given item to the start of the list. - * - * @param list - a list - * @param item - an item - */ -function prepend(list, item) { - list.unshift(item); -} -/** - * Replaces the given item or all items matching condition with a new item. - * - * @param list - a list - * @param conditionOrItem - an item to replace or a condition matching items - * to replace - * @param item - an item - */ -function replace(list, conditionOrItem, newItem) { - let i = 0; - for (const oldItem of list) { - if ((0, util_1.isFunction)(conditionOrItem)) { - if (!!conditionOrItem.call(null, oldItem)) { - list[i] = newItem; - } - } - else if (oldItem === conditionOrItem) { - list[i] = newItem; - return; - } - i++; - } -} -/** - * Inserts the given item before the given index. - * - * @param list - a list - * @param item - an item - */ -function insert(list, item, index) { - list.splice(index, 0, item); -} -/** - * Removes the given item or all items matching condition. - * - * @param list - a list - * @param conditionOrItem - an item to remove or a condition matching items - * to remove - */ -function remove(list, conditionOrItem) { - let i = list.length; - while (i--) { - const oldItem = list[i]; - if ((0, util_1.isFunction)(conditionOrItem)) { - if (!!conditionOrItem.call(null, oldItem)) { - list.splice(i, 1); - } - } - else if (oldItem === conditionOrItem) { - list.splice(i, 1); - return; - } - } -} -/** - * Removes all items from the list. - */ -function empty(list) { - list.length = 0; -} -/** - * Determines if the list contains the given item or any items matching - * condition. - * - * @param list - a list - * @param conditionOrItem - an item to a condition to match - */ -function contains(list, conditionOrItem) { - for (const oldItem of list) { - if ((0, util_1.isFunction)(conditionOrItem)) { - if (!!conditionOrItem.call(null, oldItem)) { - return true; - } - } - else if (oldItem === conditionOrItem) { - return true; - } - } - return false; -} -/** - * Returns the count of items in the list matching the given condition. - * - * @param list - a list - * @param condition - an optional condition to match - */ -function size(list, condition) { - if (condition === undefined) { - return list.length; - } - else { - let count = 0; - for (const item of list) { - if (!!condition.call(null, item)) { - count++; - } - } - return count; - } -} -/** - * Determines if the list is empty. - * - * @param list - a list - */ -function isEmpty(list) { - return list.length === 0; -} -/** - * Returns an iterator for the items of the list. - * - * @param list - a list - * @param condition - an optional condition to match - */ -function* forEach(list, condition) { - if (condition === undefined) { - yield* list; - } - else { - for (const item of list) { - if (!!condition.call(null, item)) { - yield item; - } - } - } -} -/** - * Creates and returns a shallow clone of list. - * - * @param list - a list - */ -function clone(list) { - return new Array(...list); + if (signal.aborted) { + abort(self) + return + } + + self[kSignal] = signal + self[kListener] = () => { + abort(self) + } + + addAbortListener(self[kSignal], self[kListener]) } -/** - * Returns a new list containing items from the list sorted in ascending - * order. - * - * @param list - a list - * @param lessThanAlgo - a function that returns `true` if its first argument - * is less than its second argument, and `false` otherwise. - */ -function sortInAscendingOrder(list, lessThanAlgo) { - return list.sort((itemA, itemB) => lessThanAlgo.call(null, itemA, itemB) ? -1 : 1); + +function removeSignal (self) { + if (!self[kSignal]) { + return + } + + if ('removeEventListener' in self[kSignal]) { + self[kSignal].removeEventListener('abort', self[kListener]) + } else { + self[kSignal].removeListener('abort', self[kListener]) + } + + self[kSignal] = null + self[kListener] = null } -/** - * Returns a new list containing items from the list sorted in descending - * order. - * - * @param list - a list - * @param lessThanAlgo - a function that returns `true` if its first argument - * is less than its second argument, and `false` otherwise. - */ -function sortInDescendingOrder(list, lessThanAlgo) { - return list.sort((itemA, itemB) => lessThanAlgo.call(null, itemA, itemB) ? 1 : -1); + +module.exports = { + addSignal, + removeSignal } -//# sourceMappingURL=List.js.map + /***/ }), -/***/ 6067: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 2279: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.get = get; -exports.set = set; -exports.remove = remove; -exports.contains = contains; -exports.keys = keys; -exports.values = values; -exports.size = size; -exports.isEmpty = isEmpty; -exports.forEach = forEach; -exports.clone = clone; -exports.sortInAscendingOrder = sortInAscendingOrder; -exports.sortInDescendingOrder = sortInDescendingOrder; -const util_1 = __nccwpck_require__(7061); -/** - * Gets the value corresponding to the given key. - * - * @param map - a map - * @param key - a key - */ -function get(map, key) { - return map.get(key); -} -/** - * Sets the value corresponding to the given key. - * - * @param map - a map - * @param key - a key - * @param val - a value - */ -function set(map, key, val) { - map.set(key, val); -} -/** - * Removes the item with the given key or all items matching condition. - * - * @param map - a map - * @param conditionOrItem - the key of an item to remove or a condition matching - * items to remove - */ -function remove(map, conditionOrItem) { - if (!(0, util_1.isFunction)(conditionOrItem)) { - map.delete(conditionOrItem); + +const assert = __nccwpck_require__(4589) +const { AsyncResource } = __nccwpck_require__(6698) +const { InvalidArgumentError, SocketError } = __nccwpck_require__(8707) +const util = __nccwpck_require__(3440) +const { addSignal, removeSignal } = __nccwpck_require__(158) + +class ConnectHandler extends AsyncResource { + constructor (opts, callback) { + if (!opts || typeof opts !== 'object') { + throw new InvalidArgumentError('invalid opts') } - else { - const toRemove = []; - for (const item of map) { - if (!!conditionOrItem.call(null, item)) { - toRemove.push(item[0]); - } - } - for (const key of toRemove) { - map.delete(key); - } + + if (typeof callback !== 'function') { + throw new InvalidArgumentError('invalid callback') } -} -/** - * Determines if the map contains a value with the given key. - * - * @param map - a map - * @param conditionOrItem - the key of an item to match or a condition matching - * items - */ -function contains(map, conditionOrItem) { - if (!(0, util_1.isFunction)(conditionOrItem)) { - return map.has(conditionOrItem); + + const { signal, opaque, responseHeaders } = opts + + if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { + throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') } - else { - for (const item of map) { - if (!!conditionOrItem.call(null, item)) { - return true; - } - } - return false; + + super('UNDICI_CONNECT') + + this.opaque = opaque || null + this.responseHeaders = responseHeaders || null + this.callback = callback + this.abort = null + + addSignal(this, signal) + } + + onConnect (abort, context) { + if (this.reason) { + abort(this.reason) + return } -} -/** - * Gets the keys of the map. - * - * @param map - a map - */ -function keys(map) { - return new Set(map.keys()); -} -/** - * Gets the values of the map. - * - * @param map - a map - */ -function values(map) { - return [...map.values()]; -} -/** - * Gets the size of the map. - * - * @param map - a map - * @param condition - an optional condition to match - */ -function size(map, condition) { - if (condition === undefined) { - return map.size; + + assert(this.callback) + + this.abort = abort + this.context = context + } + + onHeaders () { + throw new SocketError('bad connect', null) + } + + onUpgrade (statusCode, rawHeaders, socket) { + const { callback, opaque, context } = this + + removeSignal(this) + + this.callback = null + + let headers = rawHeaders + // Indicates is an HTTP2Session + if (headers != null) { + headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders) } - else { - let count = 0; - for (const item of map) { - if (!!condition.call(null, item)) { - count++; - } - } - return count; + + this.runInAsyncScope(callback, null, null, { + statusCode, + headers, + socket, + opaque, + context + }) + } + + onError (err) { + const { callback, opaque } = this + + removeSignal(this) + + if (callback) { + this.callback = null + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }) + }) } + } } -/** - * Determines if the map is empty. - * - * @param map - a map - */ -function isEmpty(map) { - return map.size === 0; -} -/** - * Returns an iterator for the items of the map. - * - * @param map - a map - * @param condition - an optional condition to match - */ -function* forEach(map, condition) { - if (condition === undefined) { - yield* map; - } - else { - for (const item of map) { - if (!!condition.call(null, item)) { - yield item; - } - } + +function connect (opts, callback) { + if (callback === undefined) { + return new Promise((resolve, reject) => { + connect.call(this, opts, (err, data) => { + return err ? reject(err) : resolve(data) + }) + }) + } + + try { + const connectHandler = new ConnectHandler(opts, callback) + this.dispatch({ ...opts, method: 'CONNECT' }, connectHandler) + } catch (err) { + if (typeof callback !== 'function') { + throw err } + const opaque = opts?.opaque + queueMicrotask(() => callback(err, { opaque })) + } } -/** - * Creates and returns a shallow clone of map. - * - * @param map - a map - */ -function clone(map) { - return new Map(map); -} -/** - * Returns a new map containing items from the map sorted in ascending - * order. - * - * @param map - a map - * @param lessThanAlgo - a function that returns `true` if its first argument - * is less than its second argument, and `false` otherwise. - */ -function sortInAscendingOrder(map, lessThanAlgo) { - const list = new Array(...map); - list.sort((itemA, itemB) => lessThanAlgo.call(null, itemA, itemB) ? -1 : 1); - return new Map(list); -} -/** - * Returns a new map containing items from the map sorted in descending - * order. - * - * @param map - a map - * @param lessThanAlgo - a function that returns `true` if its first argument - * is less than its second argument, and `false` otherwise. - */ -function sortInDescendingOrder(map, lessThanAlgo) { - const list = new Array(...map); - list.sort((itemA, itemB) => lessThanAlgo.call(null, itemA, itemB) ? 1 : -1); - return new Map(list); -} -//# sourceMappingURL=Map.js.map + +module.exports = connect + /***/ }), -/***/ 9018: -/***/ ((__unused_webpack_module, exports) => { +/***/ 6862: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.XLink = exports.SVG = exports.MathML = exports.XMLNS = exports.XML = exports.HTML = void 0; -exports.HTML = "http://www.w3.org/1999/xhtml"; -exports.XML = "http://www.w3.org/XML/1998/namespace"; -exports.XMLNS = "http://www.w3.org/2000/xmlns/"; -exports.MathML = "http://www.w3.org/1998/Math/MathML"; -exports.SVG = "http://www.w3.org/2000/svg"; -exports.XLink = "http://www.w3.org/1999/xlink"; -//# sourceMappingURL=Namespace.js.map -/***/ }), +const { + Readable, + Duplex, + PassThrough +} = __nccwpck_require__(7075) +const { + InvalidArgumentError, + InvalidReturnValueError, + RequestAbortedError +} = __nccwpck_require__(8707) +const util = __nccwpck_require__(3440) +const { AsyncResource } = __nccwpck_require__(6698) +const { addSignal, removeSignal } = __nccwpck_require__(158) +const assert = __nccwpck_require__(4589) -/***/ 7758: -/***/ ((__unused_webpack_module, exports) => { +const kResume = Symbol('resume') +class PipelineRequest extends Readable { + constructor () { + super({ autoDestroy: true }) -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.enqueue = enqueue; -exports.dequeue = dequeue; -/** - * Appends the given item to the queue. - * - * @param list - a list - * @param item - an item - */ -function enqueue(list, item) { - list.push(item); -} -/** - * Removes and returns an item from the queue. - * - * @param list - a list - */ -function dequeue(list) { - return list.shift() || null; -} -//# sourceMappingURL=Queue.js.map + this[kResume] = null + } -/***/ }), + _read () { + const { [kResume]: resume } = this -/***/ 2237: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + if (resume) { + this[kResume] = null + resume() + } + } + _destroy (err, callback) { + this._read() -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.append = append; -exports.extend = extend; -exports.prepend = prepend; -exports.replace = replace; -exports.insert = insert; -exports.remove = remove; -exports.empty = empty; -exports.contains = contains; -exports.size = size; -exports.isEmpty = isEmpty; -exports.forEach = forEach; -exports.clone = clone; -exports.sortInAscendingOrder = sortInAscendingOrder; -exports.sortInDescendingOrder = sortInDescendingOrder; -exports.isSubsetOf = isSubsetOf; -exports.isSupersetOf = isSupersetOf; -exports.intersection = intersection; -exports.union = union; -exports.range = range; -const util_1 = __nccwpck_require__(7061); -/** - * Adds the given item to the end of the set. - * - * @param set - a set - * @param item - an item - */ -function append(set, item) { - set.add(item); -} -/** - * Extends a set by appending all items from another set. - * - * @param setA - a list to extend - * @param setB - a list containing items to append to `setA` - */ -function extend(setA, setB) { - setB.forEach(setA.add, setA); + callback(err) + } } -/** - * Inserts the given item to the start of the set. - * - * @param set - a set - * @param item - an item - */ -function prepend(set, item) { - const cloned = new Set(set); - set.clear(); - set.add(item); - cloned.forEach(set.add, set); + +class PipelineResponse extends Readable { + constructor (resume) { + super({ autoDestroy: true }) + this[kResume] = resume + } + + _read () { + this[kResume]() + } + + _destroy (err, callback) { + if (!err && !this._readableState.endEmitted) { + err = new RequestAbortedError() + } + + callback(err) + } } -/** - * Replaces the given item or all items matching condition with a new item. - * - * @param set - a set - * @param conditionOrItem - an item to replace or a condition matching items - * to replace - * @param item - an item - */ -function replace(set, conditionOrItem, newItem) { - const newSet = new Set(); - for (const oldItem of set) { - if ((0, util_1.isFunction)(conditionOrItem)) { - if (!!conditionOrItem.call(null, oldItem)) { - newSet.add(newItem); - } - else { - newSet.add(oldItem); - } - } - else if (oldItem === conditionOrItem) { - newSet.add(newItem); - } - else { - newSet.add(oldItem); - } - } - set.clear(); - newSet.forEach(set.add, set); -} -/** - * Inserts the given item before the given index. - * - * @param set - a set - * @param item - an item - */ -function insert(set, item, index) { - const newSet = new Set(); - let i = 0; - for (const oldItem of set) { - if (i === index) - newSet.add(item); - newSet.add(oldItem); - i++; - } - set.clear(); - newSet.forEach(set.add, set); -} -/** - * Removes the given item or all items matching condition. - * - * @param set - a set - * @param conditionOrItem - an item to remove or a condition matching items - * to remove - */ -function remove(set, conditionOrItem) { - if (!(0, util_1.isFunction)(conditionOrItem)) { - set.delete(conditionOrItem); + +class PipelineHandler extends AsyncResource { + constructor (opts, handler) { + if (!opts || typeof opts !== 'object') { + throw new InvalidArgumentError('invalid opts') } - else { - const toRemove = []; - for (const item of set) { - if (!!conditionOrItem.call(null, item)) { - toRemove.push(item); - } - } - for (const oldItem of toRemove) { - set.delete(oldItem); - } + + if (typeof handler !== 'function') { + throw new InvalidArgumentError('invalid handler') } -} -/** - * Removes all items from the set. - */ -function empty(set) { - set.clear(); -} -/** - * Determines if the set contains the given item or any items matching - * condition. - * - * @param set - a set - * @param conditionOrItem - an item to a condition to match - */ -function contains(set, conditionOrItem) { - if (!(0, util_1.isFunction)(conditionOrItem)) { - return set.has(conditionOrItem); + + const { signal, method, opaque, onInfo, responseHeaders } = opts + + if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { + throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') } - else { - for (const oldItem of set) { - if (!!conditionOrItem.call(null, oldItem)) { - return true; - } - } + + if (method === 'CONNECT') { + throw new InvalidArgumentError('invalid method') } - return false; -} -/** - * Returns the count of items in the set matching the given condition. - * - * @param set - a set - * @param condition - an optional condition to match - */ -function size(set, condition) { - if (condition === undefined) { - return set.size; + + if (onInfo && typeof onInfo !== 'function') { + throw new InvalidArgumentError('invalid onInfo callback') } - else { - let count = 0; - for (const item of set) { - if (!!condition.call(null, item)) { - count++; - } + + super('UNDICI_PIPELINE') + + this.opaque = opaque || null + this.responseHeaders = responseHeaders || null + this.handler = handler + this.abort = null + this.context = null + this.onInfo = onInfo || null + + this.req = new PipelineRequest().on('error', util.nop) + + this.ret = new Duplex({ + readableObjectMode: opts.objectMode, + autoDestroy: true, + read: () => { + const { body } = this + + if (body?.resume) { + body.resume() } - return count; - } -} -/** - * Determines if the set is empty. - * - * @param set - a set - */ -function isEmpty(set) { - return set.size === 0; -} -/** - * Returns an iterator for the items of the set. - * - * @param set - a set - * @param condition - an optional condition to match - */ -function* forEach(set, condition) { - if (condition === undefined) { - yield* set; - } - else { - for (const item of set) { - if (!!condition.call(null, item)) { - yield item; - } + }, + write: (chunk, encoding, callback) => { + const { req } = this + + if (req.push(chunk, encoding) || req._readableState.destroyed) { + callback() + } else { + req[kResume] = callback } - } -} -/** - * Creates and returns a shallow clone of set. - * - * @param set - a set - */ -function clone(set) { - return new Set(set); -} -/** - * Returns a new set containing items from the set sorted in ascending - * order. - * - * @param set - a set - * @param lessThanAlgo - a function that returns `true` if its first argument - * is less than its second argument, and `false` otherwise. - */ -function sortInAscendingOrder(set, lessThanAlgo) { - const list = new Array(...set); - list.sort((itemA, itemB) => lessThanAlgo.call(null, itemA, itemB) ? -1 : 1); - return new Set(list); -} -/** - * Returns a new set containing items from the set sorted in descending - * order. - * - * @param set - a set - * @param lessThanAlgo - a function that returns `true` if its first argument - * is less than its second argument, and `false` otherwise. - */ -function sortInDescendingOrder(set, lessThanAlgo) { - const list = new Array(...set); - list.sort((itemA, itemB) => lessThanAlgo.call(null, itemA, itemB) ? 1 : -1); - return new Set(list); -} -/** - * Determines if a set is a subset of another set. - * - * @param subset - a set - * @param superset - a superset possibly containing all items from `subset`. - */ -function isSubsetOf(subset, superset) { - for (const item of subset) { - if (!superset.has(item)) - return false; - } - return true; -} -/** - * Determines if a set is a superset of another set. - * - * @param superset - a set - * @param subset - a subset possibly contained within `superset`. - */ -function isSupersetOf(superset, subset) { - return isSubsetOf(subset, superset); -} -/** - * Returns a new set with items that are contained in both sets. - * - * @param setA - a set - * @param setB - a set - */ -function intersection(setA, setB) { - const newSet = new Set(); - for (const item of setA) { - if (setB.has(item)) - newSet.add(item); - } - return newSet; -} -/** - * Returns a new set with items from both sets. - * - * @param setA - a set - * @param setB - a set - */ -function union(setA, setB) { - const newSet = new Set(setA); - setB.forEach(newSet.add, newSet); - return newSet; -} -/** - * Returns a set of integers from `n` to `m` inclusive. - * - * @param n - starting number - * @param m - ending number - */ -function range(n, m) { - const newSet = new Set(); - for (let i = n; i <= m; i++) { - newSet.add(i); - } - return newSet; -} -//# sourceMappingURL=Set.js.map + }, + destroy: (err, callback) => { + const { body, req, res, ret, abort } = this -/***/ }), + if (!err && !ret._readableState.endEmitted) { + err = new RequestAbortedError() + } -/***/ 9221: -/***/ ((__unused_webpack_module, exports) => { + if (abort && err) { + abort() + } + util.destroy(body, err) + util.destroy(req, err) + util.destroy(res, err) -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.push = push; -exports.pop = pop; -/** - * Pushes the given item to the stack. - * - * @param list - a list - * @param item - an item - */ -function push(list, item) { - list.push(item); -} -/** - * Pops and returns an item from the stack. - * - * @param list - a list - */ -function pop(list) { - return list.pop() || null; -} -//# sourceMappingURL=Stack.js.map + removeSignal(this) -/***/ }), + callback(err) + } + }).on('prefinish', () => { + const { req } = this -/***/ 2472: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + // Node < 15 does not call _final in same tick. + req.push(null) + }) + this.res = null -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.isCodeUnitPrefix = isCodeUnitPrefix; -exports.isCodeUnitLessThan = isCodeUnitLessThan; -exports.isomorphicEncode = isomorphicEncode; -exports.isASCIIString = isASCIIString; -exports.asciiLowercase = asciiLowercase; -exports.asciiUppercase = asciiUppercase; -exports.asciiCaseInsensitiveMatch = asciiCaseInsensitiveMatch; -exports.asciiEncode = asciiEncode; -exports.asciiDecode = asciiDecode; -exports.stripNewlines = stripNewlines; -exports.normalizeNewlines = normalizeNewlines; -exports.stripLeadingAndTrailingASCIIWhitespace = stripLeadingAndTrailingASCIIWhitespace; -exports.stripAndCollapseASCIIWhitespace = stripAndCollapseASCIIWhitespace; -exports.collectASequenceOfCodePoints = collectASequenceOfCodePoints; -exports.skipASCIIWhitespace = skipASCIIWhitespace; -exports.strictlySplit = strictlySplit; -exports.splitAStringOnASCIIWhitespace = splitAStringOnASCIIWhitespace; -exports.splitAStringOnCommas = splitAStringOnCommas; -exports.concatenate = concatenate; -const CodePoints_1 = __nccwpck_require__(4467); -const ByteSequence_1 = __nccwpck_require__(2017); -const Byte_1 = __nccwpck_require__(8311); -const util_1 = __nccwpck_require__(7061); -/** - * Determines if the string `a` is a code unit prefix of string `b`. - * - * @param a - a string - * @param b - a string - */ -function isCodeUnitPrefix(a, b) { - /** - * 1. Let i be 0. - * 2. While true: - * 2.1. Let aCodeUnit be the ith code unit of a if i is less than a’s length; - * otherwise null. - * 2.2. Let bCodeUnit be the ith code unit of b if i is less than b’s length; - * otherwise null. - * 2.3. If bCodeUnit is null, then return true. - * 2.4. Return false if aCodeUnit is different from bCodeUnit. - * 2.5. Set i to i + 1. - */ - let i = 0; - while (true) { - const aCodeUnit = i < a.length ? a.charCodeAt(i) : null; - const bCodeUnit = i < b.length ? b.charCodeAt(i) : null; - if (aCodeUnit === null) - return true; - if (aCodeUnit !== bCodeUnit) - return false; - i++; + addSignal(this, signal) + } + + onConnect (abort, context) { + const { ret, res } = this + + if (this.reason) { + abort(this.reason) + return } -} -/** - * Determines if the string `a` is a code unit less than string `b`. - * - * @param a - a string - * @param b - a string - */ -function isCodeUnitLessThan(a, b) { - /** - * 1. If b is a code unit prefix of a, then return false. - * 2. If a is a code unit prefix of b, then return true. - * 3. Let n be the smallest index such that the nth code unit of a is - * different from the nth code unit of b. (There has to be such an index, - * since neither string is a prefix of the other.) - * 4. If the nth code unit of a is less than the nth code unit of b, then - * return true. - * 5. Return false. - */ - if (isCodeUnitPrefix(b, a)) - return false; - if (isCodeUnitPrefix(a, b)) - return true; - for (let i = 0; i < Math.min(a.length, b.length); i++) { - const aCodeUnit = a.charCodeAt(i); - const bCodeUnit = b.charCodeAt(i); - if (aCodeUnit === bCodeUnit) - continue; - return (aCodeUnit < bCodeUnit); + + assert(!res, 'pipeline cannot be retried') + assert(!ret.destroyed) + + this.abort = abort + this.context = context + } + + onHeaders (statusCode, rawHeaders, resume) { + const { opaque, handler, context } = this + + if (statusCode < 200) { + if (this.onInfo) { + const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders) + this.onInfo({ statusCode, headers }) + } + return } - /* istanbul ignore next */ - return false; -} -/** - * Isomorphic encodes the given string. - * - * @param str - a string - */ -function isomorphicEncode(str) { - /** - * 1. Assert: input contains no code points greater than U+00FF. - * 2. Return a byte sequence whose length is equal to input’s length and whose - * bytes have the same values as input’s code points, in the same order. - */ - const codePoints = Array.from(str); - const bytes = new Uint8Array(codePoints.length); - let i = 0; - for (const codePoint of str) { - const byte = codePoint.codePointAt(0); - console.assert(byte !== undefined && byte <= 0x00FF, "isomorphicEncode requires string bytes to be less than or equal to 0x00FF."); - if (byte !== undefined && byte <= 0x00FF) { - bytes[i++] = byte; - } + + this.res = new PipelineResponse(resume) + + let body + try { + this.handler = null + const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders) + body = this.runInAsyncScope(handler, null, { + statusCode, + headers, + opaque, + body: this.res, + context + }) + } catch (err) { + this.res.on('error', util.nop) + throw err } - return bytes; -} -/** - * Determines if the given string is An ASCII string. - * - * @param str - a string - */ -function isASCIIString(str) { - /** - * An ASCII string is a string whose code points are all ASCII code points. - */ - return /^[\u0000-\u007F]*$/.test(str); -} -/** - * Converts all uppercase ASCII code points to lowercase. - * - * @param str - a string - */ -function asciiLowercase(str) { - /** - * To ASCII lowercase a string, replace all ASCII upper alphas in the string - * with their corresponding code point in ASCII lower alpha. - */ - let result = ""; - for (const c of str) { - const code = c.codePointAt(0); - if (code !== undefined && code >= 0x41 && code <= 0x5A) { - result += String.fromCodePoint(code + 0x20); - } - else { - result += c; - } + + if (!body || typeof body.on !== 'function') { + throw new InvalidReturnValueError('expected Readable') } - return result; -} -/** - * Converts all uppercase ASCII code points to uppercase. - * - * @param str - a string - */ -function asciiUppercase(str) { - /** - * To ASCII uppercase a string, replace all ASCII lower alphas in the string - * with their corresponding code point in ASCII upper alpha. - */ - let result = ""; - for (const c of str) { - const code = c.codePointAt(0); - if (code !== undefined && code >= 0x61 && code <= 0x7A) { - result += String.fromCodePoint(code - 0x20); - } - else { - result += c; + + body + .on('data', (chunk) => { + const { ret, body } = this + + if (!ret.push(chunk) && body.pause) { + body.pause() } - } - return result; -} -/** - * Compares two ASCII strings case-insensitively. - * - * @param a - a string - * @param b - a string - */ -function asciiCaseInsensitiveMatch(a, b) { - /** - * A string A is an ASCII case-insensitive match for a string B, if the ASCII - * lowercase of A is the ASCII lowercase of B. - */ - return asciiLowercase(a) === asciiLowercase(b); -} -/** - * ASCII encodes a string. - * - * @param str - a string - */ -function asciiEncode(str) { - /** - * 1. Assert: input is an ASCII string. - * 2. Return the isomorphic encoding of input. - */ - console.assert(isASCIIString(str), "asciiEncode requires an ASCII string."); - return isomorphicEncode(str); -} -/** - * ASCII decodes a byte sequence. - * - * @param bytes - a byte sequence - */ -function asciiDecode(bytes) { - /** - * 1. Assert: All bytes in input are ASCII bytes. - * 2. Return the isomorphic decoding of input. - */ - for (const byte of bytes) { - console.assert((0, Byte_1.isASCIIByte)(byte), "asciiDecode requires an ASCII byte sequence."); - } - return (0, ByteSequence_1.isomorphicDecode)(bytes); -} -/** - * Strips newline characters from a string. - * - * @param str - a string - */ -function stripNewlines(str) { - /** - * To strip newlines from a string, remove any U+000A LF and U+000D CR code - * points from the string. - */ - return str.replace(/[\n\r]/g, ""); -} -/** - * Normalizes newline characters in a string by converting consecutive - * carriage-return newline characters and also single carriage return characters - * into a single newline. - * - * @param str - a string - */ -function normalizeNewlines(str) { - /** - * To normalize newlines in a string, replace every U+000D CR U+000A LF code - * point pair with a single U+000A LF code point, and then replace every - * remaining U+000D CR code point with a U+000A LF code point. - */ - return str.replace(/\r\n/g, "\n").replace(/\r/g, "\n"); -} -/** - * Removes leading and trailing whitespace characters from a string. - * - * @param str - a string - */ -function stripLeadingAndTrailingASCIIWhitespace(str) { - /** - * To strip leading and trailing ASCII whitespace from a string, remove all - * ASCII whitespace that are at the start or the end of the string. - */ - return str.replace(/^[\t\n\f\r ]+/, "").replace(/[\t\n\f\r ]+$/, ""); -} -/** - * Removes consecutive newline characters from a string. - * - * @param str - a string - */ -function stripAndCollapseASCIIWhitespace(str) { - /** - * To strip and collapse ASCII whitespace in a string, replace any sequence of - * one or more consecutive code points that are ASCII whitespace in the string - * with a single U+0020 SPACE code point, and then remove any leading and - * trailing ASCII whitespace from that string. - */ - return stripLeadingAndTrailingASCIIWhitespace(str.replace(/[\t\n\f\r ]{2,}/g, " ")); -} -/** - * Collects a sequence of code points matching a given condition from the input - * string. - * - * @param condition - a condition to match - * @param input - a string - * @param options - starting position - */ -function collectASequenceOfCodePoints(condition, input, options) { - /** - * 1. Let result be the empty string. - * 2. While position doesn’t point past the end of input and the code point at - * position within input meets the condition condition: - * 2.1. Append that code point to the end of result. - * 2.2. Advance position by 1. - * 3. Return result. - */ - if (!(0, util_1.isArray)(input)) - return collectASequenceOfCodePoints(condition, Array.from(input), options); - let result = ""; - while (options.position < input.length && !!condition.call(null, input[options.position])) { - result += input[options.position]; - options.position++; - } - return result; -} -/** - * Skips over ASCII whitespace. - * - * @param input - input string - * @param options - starting position - */ -function skipASCIIWhitespace(input, options) { - /** - * To skip ASCII whitespace within a string input given a position variable - * position, collect a sequence of code points that are ASCII whitespace from - * input given position. The collected code points are not used, but position - * is still updated. - */ - collectASequenceOfCodePoints(str => CodePoints_1.ASCIIWhiteSpace.test(str), input, options); -} -/** - * Solits a string at the given delimiter. - * - * @param input - input string - * @param delimiter - a delimiter string - */ -function strictlySplit(input, delimiter) { - /** - * 1. Let position be a position variable for input, initially pointing at the - * start of input. - * 2. Let tokens be a list of strings, initially empty. - * 3. Let token be the result of collecting a sequence of code points that are - * not equal to delimiter from input, given position. - * 4. Append token to tokens. - * 5. While position is not past the end of input: - * 5.1. Assert: the code point at position within input is delimiter. - * 5.2. Advance position by 1. - * 5.3. Let token be the result of collecting a sequence of code points that - * are not equal to delimiter from input, given position. - * 5.4. Append token to tokens. - * 6. Return tokens. - */ - if (!(0, util_1.isArray)(input)) - return strictlySplit(Array.from(input), delimiter); - const options = { position: 0 }; - const tokens = []; - let token = collectASequenceOfCodePoints(str => delimiter !== str, input, options); - tokens.push(token); - while (options.position < input.length) { - console.assert(input[options.position] === delimiter, "strictlySplit found no delimiter in input string."); - options.position++; - token = collectASequenceOfCodePoints(str => delimiter !== str, input, options); - tokens.push(token); - } - return tokens; -} -/** - * Splits a string on ASCII whitespace. - * - * @param input - a string - */ -function splitAStringOnASCIIWhitespace(input) { - /** - * 1. Let position be a position variable for input, initially pointing at the - * start of input. - * 2. Let tokens be a list of strings, initially empty. - * 3. Skip ASCII whitespace within input given position. - * 4. While position is not past the end of input: - * 4.1. Let token be the result of collecting a sequence of code points that - * are not ASCII whitespace from input, given position. - * 4.2. Append token to tokens. - * 4.3. Skip ASCII whitespace within input given position. - * 5. Return tokens. - */ - if (!(0, util_1.isArray)(input)) - return splitAStringOnASCIIWhitespace(Array.from(input)); - const options = { position: 0 }; - const tokens = []; - skipASCIIWhitespace(input, options); - while (options.position < input.length) { - const token = collectASequenceOfCodePoints(str => !CodePoints_1.ASCIIWhiteSpace.test(str), input, options); - tokens.push(token); - skipASCIIWhitespace(input, options); - } - return tokens; -} -/** - * Splits a string on commas. - * - * @param input - a string - */ -function splitAStringOnCommas(input) { - /** - * 1. Let position be a position variable for input, initially pointing at the - * start of input. - * 2. Let tokens be a list of strings, initially empty. - * 3. While position is not past the end of input: - * 3.1. Let token be the result of collecting a sequence of code points that - * are not U+002C (,) from input, given position. - * 3.2. Strip leading and trailing ASCII whitespace from token. - * 3.3. Append token to tokens. - * 3.4. If position is not past the end of input, then: - * 3.4.1. Assert: the code point at position within input is U+002C (,). - * 3.4.2. Advance position by 1. - * 4. Return tokens. - */ - if (!(0, util_1.isArray)(input)) - return splitAStringOnCommas(Array.from(input)); - const options = { position: 0 }; - const tokens = []; - while (options.position < input.length) { - const token = collectASequenceOfCodePoints(str => str !== ',', input, options); - tokens.push(stripLeadingAndTrailingASCIIWhitespace(token)); - if (options.position < input.length) { - console.assert(input[options.position] === ',', "splitAStringOnCommas found no delimiter in input string."); - options.position++; + }) + .on('error', (err) => { + const { ret } = this + + util.destroy(ret, err) + }) + .on('end', () => { + const { ret } = this + + ret.push(null) + }) + .on('close', () => { + const { ret } = this + + if (!ret._readableState.ended) { + util.destroy(ret, new RequestAbortedError()) } - } - return tokens; + }) + + this.body = body + } + + onData (chunk) { + const { res } = this + return res.push(chunk) + } + + onComplete (trailers) { + const { res } = this + res.push(null) + } + + onError (err) { + const { ret } = this + this.handler = null + util.destroy(ret, err) + } } -/** - * Concatenates a list of strings with the given separator. - * - * @param list - a list of strings - * @param separator - a separator string - */ -function concatenate(list, separator = "") { - /** - * 1. If list is empty, then return the empty string. - * 2. If separator is not given, then set separator to the empty string. - * 3. Return a string whose contents are list’s items, in order, separated - * from each other by separator. - */ - if (list.length === 0) - return ""; - return list.join(separator); + +function pipeline (opts, handler) { + try { + const pipelineHandler = new PipelineHandler(opts, handler) + this.dispatch({ ...opts, body: pipelineHandler.req }, pipelineHandler) + return pipelineHandler.ret + } catch (err) { + return new PassThrough().destroy(err) + } } -//# sourceMappingURL=String.js.map -/***/ }), +module.exports = pipeline -/***/ 4737: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.string = exports.stack = exports.set = exports.queue = exports.namespace = exports.map = exports.list = exports.json = exports.codePoint = exports.byteSequence = exports.byte = exports.base64 = void 0; -const base64 = __importStar(__nccwpck_require__(9558)); -exports.base64 = base64; -const byte = __importStar(__nccwpck_require__(8311)); -exports.byte = byte; -const byteSequence = __importStar(__nccwpck_require__(2017)); -exports.byteSequence = byteSequence; -const codePoint = __importStar(__nccwpck_require__(4467)); -exports.codePoint = codePoint; -const json = __importStar(__nccwpck_require__(5475)); -exports.json = json; -const list = __importStar(__nccwpck_require__(1193)); -exports.list = list; -const map = __importStar(__nccwpck_require__(6067)); -exports.map = map; -const namespace = __importStar(__nccwpck_require__(9018)); -exports.namespace = namespace; -const queue = __importStar(__nccwpck_require__(7758)); -exports.queue = queue; -const set = __importStar(__nccwpck_require__(2237)); -exports.set = set; -const stack = __importStar(__nccwpck_require__(9221)); -exports.stack = stack; -const string = __importStar(__nccwpck_require__(2472)); -exports.string = string; -//# sourceMappingURL=index.js.map /***/ }), -/***/ 3650: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 4043: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.setValidationErrorCallback = setValidationErrorCallback; -exports.newURL = newURL; -exports.isSpecialScheme = isSpecialScheme; -exports.isSpecial = isSpecial; -exports.defaultPort = defaultPort; -exports.includesCredentials = includesCredentials; -exports.cannotHaveAUsernamePasswordPort = cannotHaveAUsernamePasswordPort; -exports.urlSerializer = urlSerializer; -exports.hostSerializer = hostSerializer; -exports.iPv4Serializer = iPv4Serializer; -exports.iPv6Serializer = iPv6Serializer; -exports.urlParser = urlParser; -exports.basicURLParser = basicURLParser; -exports.setTheUsername = setTheUsername; -exports.setThePassword = setThePassword; -exports.isSingleDotPathSegment = isSingleDotPathSegment; -exports.isDoubleDotPathSegment = isDoubleDotPathSegment; -exports.shorten = shorten; -exports.isNormalizedWindowsDriveLetter = isNormalizedWindowsDriveLetter; -exports.isWindowsDriveLetter = isWindowsDriveLetter; -exports.startsWithAWindowsDriveLetter = startsWithAWindowsDriveLetter; -exports.hostParser = hostParser; -exports.iPv4NumberParser = iPv4NumberParser; -exports.iPv4Parser = iPv4Parser; -exports.iPv6Parser = iPv6Parser; -exports.opaqueHostParser = opaqueHostParser; -exports.resolveABlobURL = resolveABlobURL; -exports.percentEncode = percentEncode; -exports.percentDecode = percentDecode; -exports.stringPercentDecode = stringPercentDecode; -exports.utf8PercentEncode = utf8PercentEncode; -exports.hostEquals = hostEquals; -exports.urlEquals = urlEquals; -exports.urlEncodedStringParser = urlEncodedStringParser; -exports.urlEncodedParser = urlEncodedParser; -exports.urlEncodedByteSerializer = urlEncodedByteSerializer; -exports.urlEncodedSerializer = urlEncodedSerializer; -exports.origin = origin; -exports.domainToASCII = domainToASCII; -exports.domainToUnicode = domainToUnicode; -exports.asciiSerializationOfAnOrigin = asciiSerializationOfAnOrigin; -const util_1 = __nccwpck_require__(7061); -const interfaces_1 = __nccwpck_require__(3904); -const infra_1 = __nccwpck_require__(4737); -const url_1 = __nccwpck_require__(7016); -let _validationErrorCallback; -/** - * Default ports for a special URL scheme. - */ -const _defaultPorts = { - "ftp": 21, - "file": null, - "http": 80, - "https": 443, - "ws": 80, - "wss": 443 -}; -/** - * The C0 control percent-encode set are the C0 controls and all code points - * greater than U+007E (~). - */ -const _c0ControlPercentEncodeSet = /[\0-\x1F\x7F-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; -/** - * The fragment percent-encode set is the C0 control percent-encode set and - * U+0020 SPACE, U+0022 ("), U+003C (<), U+003E (>), and U+0060 (`). - */ -const _fragmentPercentEncodeSet = /[ "<>`]|[\0-\x1F\x7F-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; -/** - * The path percent-encode set is the fragment percent-encode set and - * U+0023 (#), U+003F (?), U+007B ({), and U+007D (}). - */ -const _pathPercentEncodeSet = /[ "<>`#?{}]|[\0-\x1F\x7F-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; -/** - * The userinfo percent-encode set is the path percent-encode set and - * U+002F (/), U+003A (:), U+003B (;), U+003D (=), U+0040 (@), U+005B ([), - * U+005C (\), U+005D (]), U+005E (^), and U+007C (|). - */ -const _userInfoPercentEncodeSet = /[ "<>`#?{}/:;=@\[\]\\\^\|]|[\0-\x1F\x7F-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; -/** - * The URL code points are ASCII alphanumeric, U+0021 (!), U+0024 ($), - * U+0026 (&), U+0027 ('), U+0028 LEFT PARENTHESIS, U+0029 RIGHT PARENTHESIS, - * U+002A (*), U+002B (+), U+002C (,), U+002D (-), U+002E (.), U+002F (/), - * U+003A (:), U+003B (;), U+003D (=), U+003F (?), U+0040 (@), U+005F (_), - * U+007E (~), and code points in the range U+00A0 to U+10FFFD, inclusive, - * excluding surrogates and noncharacters. - */ -const _urlCodePoints = /[0-9A-Za-z!\$&-\/:;=\?@_~\xA0-\uD7FF\uE000-\uFDCF\uFDF0-\uFFFD]|[\uD800-\uD83E\uD840-\uD87E\uD880-\uD8BE\uD8C0-\uD8FE\uD900-\uD93E\uD940-\uD97E\uD980-\uD9BE\uD9C0-\uD9FE\uDA00-\uDA3E\uDA40-\uDA7E\uDA80-\uDABE\uDAC0-\uDAFE\uDB00-\uDB3E\uDB40-\uDB7E\uDB80-\uDBBE\uDBC0-\uDBFE][\uDC00-\uDFFF]|[\uD83F\uD87F\uD8BF\uD8FF\uD93F\uD97F\uD9BF\uD9FF\uDA3F\uDA7F\uDABF\uDAFF\uDB3F\uDB7F\uDBBF\uDBFF][\uDC00-\uDFFD]/; -/** - * A forbidden host code point is U+0000 NULL, U+0009 TAB, U+000A LF, - * U+000D CR, U+0020 SPACE, U+0023 (#), U+0025 (%), U+002F (/), U+003A (:), - * U+003F (?), U+0040 (@), U+005B ([), U+005C (\), or U+005D (]). - */ -const _forbiddenHostCodePoint = /[\0\t\f\r #%/:?@\[\\\]]/; -/** - * Sets the callback function for validation errors. - * - * @param validationErrorCallback - a callback function to be called when a - * validation error occurs - */ -function setValidationErrorCallback(validationErrorCallback) { - _validationErrorCallback = validationErrorCallback; -} -/** - * Generates a validation error. - * - * @param message - error message - */ -function validationError(message) { - if (_validationErrorCallback !== undefined) { - _validationErrorCallback.call(null, "Validation Error: " + message); - } -} -/** - * Creates a new URL. - */ -function newURL() { - return { - scheme: '', - username: '', - password: '', - host: null, - port: null, - path: [], - query: null, - fragment: null, - _cannotBeABaseURLFlag: false, - _blobURLEntry: null - }; -} -/** - * Determines if the scheme is a special scheme. - * - * @param scheme - a scheme - */ -function isSpecialScheme(scheme) { - return (scheme in _defaultPorts); -} -/** - * Determines if the URL has a special scheme. - * - * @param url - an URL - */ -function isSpecial(url) { - return isSpecialScheme(url.scheme); -} -/** - * Returns the default port for a special scheme. - * - * @param scheme - a scheme - */ -function defaultPort(scheme) { - return _defaultPorts[scheme] || null; -} -/** - * Determines if the URL has credentials. - * - * @param url - an URL - */ -function includesCredentials(url) { - return url.username !== '' || url.password !== ''; -} -/** - * Determines if an URL cannot have credentials. - * - * @param url - an URL - */ -function cannotHaveAUsernamePasswordPort(url) { - /** - * A URL cannot have a username/password/port if its host is null or the - * empty string, its cannot-be-a-base-URL flag is set, or its scheme is - * "file". - */ - return (url.host === null || url.host === "" || url._cannotBeABaseURLFlag || - url.scheme === "file"); -} -/** - * Serializes an URL into a string. - * - * @param url - an URL - */ -function urlSerializer(url, excludeFragmentFlag = false) { - /** - * 1. Let output be url’s scheme and U+003A (:) concatenated. - */ - let output = url.scheme + ':'; - /** - * 2. If url’s host is non-null: - */ - if (url.host !== null) { - /** - * 2.1. Append "//" to output. - */ - output += '//'; - /** - * 2.2. If url includes credentials, then: - */ - if (includesCredentials(url)) { - /** - * 2.2.1. Append url’s username to output. - * 2.2.2. If url’s password is not the empty string, then append U+003A (:), - * followed by url’s password, to output. - * 2.2.3. Append U+0040 (@) to output. - */ - output += url.username; - if (url.password !== '') { - output += ':' + url.password; - } - output += '@'; - } - /** - * 2.3. Append url’s host, serialized, to output. - * 2.4. If url’s port is non-null, append U+003A (:) followed by url’s port, - * serialized, to output. - */ - output += hostSerializer(url.host); - if (url.port !== null) { - output += ':' + url.port; - } + +const assert = __nccwpck_require__(4589) +const { Readable } = __nccwpck_require__(9927) +const { InvalidArgumentError, RequestAbortedError } = __nccwpck_require__(8707) +const util = __nccwpck_require__(3440) +const { getResolveErrorBodyCallback } = __nccwpck_require__(7655) +const { AsyncResource } = __nccwpck_require__(6698) + +class RequestHandler extends AsyncResource { + constructor (opts, callback) { + if (!opts || typeof opts !== 'object') { + throw new InvalidArgumentError('invalid opts') } - else if (url.host === null && url.scheme === "file") { - /** - * 3. Otherwise, if url’s host is null and url’s scheme is "file", append "//" to output. - */ - output += '//'; + + const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError, highWaterMark } = opts + + try { + if (typeof callback !== 'function') { + throw new InvalidArgumentError('invalid callback') + } + + if (highWaterMark && (typeof highWaterMark !== 'number' || highWaterMark < 0)) { + throw new InvalidArgumentError('invalid highWaterMark') + } + + if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { + throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') + } + + if (method === 'CONNECT') { + throw new InvalidArgumentError('invalid method') + } + + if (onInfo && typeof onInfo !== 'function') { + throw new InvalidArgumentError('invalid onInfo callback') + } + + super('UNDICI_REQUEST') + } catch (err) { + if (util.isStream(body)) { + util.destroy(body.on('error', util.nop), err) + } + throw err } - /** - * 4. If url’s cannot-be-a-base-URL flag is set, append url’s path[0] to - * output. - * 5. Otherwise, then for each string in url’s path, append U+002F (/) - * followed by the string to output. - */ - if (url._cannotBeABaseURLFlag) { - output += url.path[0]; - } - else { - for (const str of url.path) { - output += '/' + str; - } - } - /** - * 6. If url’s query is non-null, append U+003F (?), followed by url’s - * query, to output. - * 7. If the exclude fragment flag is unset and url’s fragment is non-null, - * append U+0023 (#), followed by url’s fragment, to output. - * 8. Return output. - */ - if (url.query !== null) { - output += '?' + url.query; - } - if (!excludeFragmentFlag && url.fragment !== null) { - output += '#' + url.fragment; - } - return output; -} -/** - * Serializes a host into a string. - * - * @param host - a host - */ -function hostSerializer(host) { - /** - * 1. If host is an IPv4 address, return the result of running the IPv4 - * serializer on host. - * 2. Otherwise, if host is an IPv6 address, return U+005B ([), followed - * by the result of running the IPv6 serializer on host, followed by - * U+005D (]). - * 3. Otherwise, host is a domain, opaque host, or empty host, return host. - */ - if ((0, util_1.isNumber)(host)) { - return iPv4Serializer(host); - } - else if ((0, util_1.isArray)(host)) { - return '[' + iPv6Serializer(host) + ']'; - } - else { - return host; - } -} -/** - * Serializes an IPv4 address into a string. - * - * @param address - an IPv4 address - */ -function iPv4Serializer(address) { - /** - * 1. Let output be the empty string. - * 2. Let n be the value of address. - * 3. For each i in the range 1 to 4, inclusive: - * 3.1. Prepend n % 256, serialized, to output. - * 3.2. If i is not 4, then prepend U+002E (.) to output. - * 3.3. Set n to floor(n / 256). - * 4. Return output. - */ - let output = ""; - let n = address; - for (let i = 1; i <= 4; i++) { - output = (n % 256).toString() + output; - if (i !== 4) { - output = '.' + output; - } - n = Math.floor(n / 256); - } - return output; -} -/** - * Serializes an IPv6 address into a string. - * - * @param address - an IPv6 address represented as a list of eight numbers - */ -function iPv6Serializer(address) { - /** - * 1. Let output be the empty string. - * 2. Let compress be an index to the first IPv6 piece in the first longest - * sequences of address’s IPv6 pieces that are 0. - * In 0:f:0:0:f:f:0:0 it would point to the second 0. - * 3. If there is no sequence of address’s IPv6 pieces that are 0 that is - * longer than 1, then set compress to null. - */ - let output = ""; - let compress = null; - let lastIndex = -1; - let count = 0; - let lastCount = 0; - for (let i = 0; i < 8; i++) { - if (address[i] !== 0) - continue; - count = 1; - for (let j = i + 1; j < 8; j++) { - if (address[j] !== 0) - break; - count++; - continue; - } - if (count > lastCount) { - lastCount = count; - lastIndex = i; - } - } - if (lastCount > 1) - compress = lastIndex; - /** - * 4. Let ignore0 be false. - * 5. For each pieceIndex in the range 0 to 7, inclusive: - */ - let ignore0 = false; - for (let pieceIndex = 0; pieceIndex < 8; pieceIndex++) { - /** - * 5.1. If ignore0 is true and address[pieceIndex] is 0, then continue. - * 5.2. Otherwise, if ignore0 is true, set ignore0 to false. - * 5.3. If compress is pieceIndex, then: - */ - if (ignore0 && address[pieceIndex] === 0) - continue; - if (ignore0) - ignore0 = false; - if (compress === pieceIndex) { - /** - * 5.3.1. Let separator be "::" if pieceIndex is 0, and U+003A (:) otherwise. - * 5.3.2. Append separator to output. - * 5.3.3. Set ignore0 to true and continue. - */ - output += (pieceIndex === 0 ? '::' : ':'); - ignore0 = true; - continue; - } - /** - * 5.4. Append address[pieceIndex], represented as the shortest possible - * lowercase hexadecimal number, to output. - * 5.5. If pieceIndex is not 7, then append U+003A (:) to output. - */ - output += address[pieceIndex].toString(16); - if (pieceIndex !== 7) - output += ':'; - } - /** - * 6. Return output. - */ - return output; -} -/** - * Parses an URL string. - * - * @param input - input string - * @param baseURL - base URL - * @param encodingOverride - encoding override - */ -function urlParser(input, baseURL, encodingOverride) { - /** - * 1. Let url be the result of running the basic URL parser on input with - * base, and encoding override as provided. - * 2. If url is failure, return failure. - * 3. If url’s scheme is not "blob", return url. - * 4. Set url’s blob URL entry to the result of resolving the blob URL url, - * if that did not return failure, and null otherwise. - * 5. Return url. - */ - const url = basicURLParser(input, baseURL, encodingOverride); - if (url === null) - return null; - if (url.scheme !== "blob") - return url; - const entry = resolveABlobURL(url); - if (entry !== null) { - url._blobURLEntry = entry; - } - else { - url._blobURLEntry = null; - } - return url; -} -/** - * Parses an URL string. - * - * @param input - input string - * @param baseURL - base URL - * @param encodingOverride - encoding override - */ -function basicURLParser(input, baseURL, encodingOverride, url, stateOverride) { - /** - * 1. If url is not given: - * 1.1. Set url to a new URL. - * 1.2. If input contains any leading or trailing C0 control or space, - * validation error. - * 1.3. Remove any leading and trailing C0 control or space from input. - */ - if (url === undefined) { - url = newURL(); - // leading - const leadingControlOrSpace = /^[\u0000-\u001F\u0020]+/; - const trailingControlOrSpace = /[\u0000-\u001F\u0020]+$/; - if (leadingControlOrSpace.test(input) || trailingControlOrSpace.test(input)) { - validationError("Input string contains leading or trailing control characters or space."); - } - input = input.replace(leadingControlOrSpace, ''); - input = input.replace(trailingControlOrSpace, ''); - } - /** - * 2. If input contains any ASCII tab or newline, validation error. - * 3. Remove all ASCII tab or newline from input. - */ - const tabOrNewline = /[\u0009\u000A\u000D]/g; - if (tabOrNewline.test(input)) { - validationError("Input string contains tab or newline characters."); - } - input = input.replace(tabOrNewline, ''); - /** - * 4. Let state be state override if given, or scheme start state otherwise. - * 5. If base is not given, set it to null. - * 6. Let encoding be UTF-8. - * 7. If encoding override is given, set encoding to the result of getting - * an output encoding from encoding override. - */ - let state = (stateOverride === undefined ? interfaces_1.ParserState.SchemeStart : stateOverride); - if (baseURL === undefined) - baseURL = null; - let encoding = (encodingOverride === undefined || - encodingOverride === "replacement" || encodingOverride === "UTF-16BE" || - encodingOverride === "UTF-16LE" ? "UTF-8" : encodingOverride); - /** - * 8. Let buffer be the empty string. - * 9. Let the @ flag, [] flag, and passwordTokenSeenFlag be unset. - * 10. Let pointer be a pointer to first code point in input. - */ - let buffer = ""; - let atFlag = false; - let arrayFlag = false; - let passwordTokenSeenFlag = false; - const EOF = ""; - const walker = new util_1.StringWalker(input); - /** - * 11. Keep running the following state machine by switching on state. If - * after a run pointer points to the EOF code point, go to the next step. - * Otherwise, increase pointer by one and continue with the state machine. - */ - while (true) { - switch (state) { - case interfaces_1.ParserState.SchemeStart: - /** - * 1. If c is an ASCII alpha, append c, lowercased, to buffer, and set - * state to scheme state. - * 2. Otherwise, if state override is not given, set state to no scheme - * state, and decrease pointer by one. - * 3. Otherwise, validation error, return failure. - */ - if (infra_1.codePoint.ASCIIAlpha.test(walker.c())) { - buffer += walker.c().toLowerCase(); - state = interfaces_1.ParserState.Scheme; - } - else if (stateOverride === undefined) { - state = interfaces_1.ParserState.NoScheme; - walker.pointer--; - } - else { - validationError("Invalid scheme start character."); - return null; - } - break; - case interfaces_1.ParserState.Scheme: - /** - * 1. If c is an ASCII alphanumeric, U+002B (+), U+002D (-), or U+002E - * (.), append c, lowercased, to buffer. - */ - if (infra_1.codePoint.ASCIIAlphanumeric.test(walker.c()) || - walker.c() === '+' || walker.c() === '-' || walker.c() === '.') { - buffer += walker.c().toLowerCase(); - } - else if (walker.c() === ':') { - /** - * 2. Otherwise, if c is U+003A (:), then: - * 2.1. If state override is given, then: - * 2.1.1. If url’s scheme is a special scheme and buffer is not a - * special scheme, then return. - * 2.1.2. If url’s scheme is not a special scheme and buffer is a - * special scheme, then return. - * 2.1.3. If url includes credentials or has a non-null port, and - * buffer is "file", then return. - * 2.1.4. If url’s scheme is "file" and its host is an empty host or - * null, then return. - */ - if (stateOverride !== undefined) { - if (isSpecialScheme(url.scheme) && !isSpecialScheme(buffer)) - return url; - if (!isSpecialScheme(url.scheme) && isSpecialScheme(buffer)) - return url; - if ((includesCredentials(url) || url.port !== null) && buffer === "file") - return url; - if (url.scheme === "file" && (url.host === "" || url.host === null)) - return url; - } - /** - * 2.2. Set url’s scheme to buffer. - */ - url.scheme = buffer; - /** - * 2.3. If state override is given, then: - * 2.3.1. If url’s port is url’s scheme’s default port, then set - * url’s port to null. - * 2.3.2. Return. - */ - if (stateOverride !== undefined) { - if (url.port === defaultPort(url.scheme)) { - url.port = null; - } - return url; - } - /** - * 2.4. Set buffer to the empty string. - */ - buffer = ""; - if (url.scheme === "file") { - /** - * 2.5. If url’s scheme is "file", then: - * 2.5.1. If remaining does not start with "//", validation error. - * 2.5.2. Set state to file state. - */ - if (!walker.remaining().startsWith("//")) { - validationError("Invalid file URL scheme, '//' expected."); - } - state = interfaces_1.ParserState.File; - } - else if (isSpecial(url) && baseURL !== null && baseURL.scheme === url.scheme) { - /** - * 2.6. Otherwise, if url is special, base is non-null, and base’s - * scheme is equal to url’s scheme, set state to special relative - * or authority state. - */ - state = interfaces_1.ParserState.SpecialRelativeOrAuthority; - } - else if (isSpecial(url)) { - /** - * 2.7. Otherwise, if url is special, set state to special - * authority slashes state. - */ - state = interfaces_1.ParserState.SpecialAuthoritySlashes; - } - else if (walker.remaining().startsWith("/")) { - /** - * 2.8. Otherwise, if remaining starts with an U+002F (/), set state - * to path or authority state and increase pointer by one. - */ - state = interfaces_1.ParserState.PathOrAuthority; - walker.pointer++; - } - else { - /** - * 2.9. Otherwise, set url’s cannot-be-a-base-URL flag, append an - * empty string to url’s path, and set state to - * cannot-be-a-base-URL path state. - */ - url._cannotBeABaseURLFlag = true; - url.path.push(""); - state = interfaces_1.ParserState.CannotBeABaseURLPath; - } - } - else if (stateOverride === undefined) { - /** - * 3. Otherwise, if state override is not given, set buffer to the - * empty string, state to no scheme state, and start over (from the - * first code point in input). - */ - buffer = ""; - state = interfaces_1.ParserState.NoScheme; - walker.pointer = 0; - continue; - } - else { - /** - * 4. Otherwise, validation error, return failure. - */ - validationError("Invalid input string."); - return null; - } - break; - case interfaces_1.ParserState.NoScheme: - /** - * 1. If base is null, or base’s cannot-be-a-base-URL flag is set - * and c is not U+0023 (#), validation error, return failure. - * 2. Otherwise, if base’s cannot-be-a-base-URL flag is set and - * c is U+0023 (#), set url’s scheme to base’s scheme, url’s path to - * a copy of base’s path, url’s query to base’s query, url’s - * fragment to the empty string, set url’s cannot-be-a-base-URL - * flag, and set state to fragment state. - * 3. Otherwise, if base’s scheme is not "file", set state to - * relative state and decrease pointer by one. - * 4. Otherwise, set state to file state and decrease pointer by one. - */ - if (baseURL === null || (baseURL._cannotBeABaseURLFlag && walker.c() !== '#')) { - validationError("Invalid input string."); - return null; - } - else if (baseURL._cannotBeABaseURLFlag && walker.c() === '#') { - url.scheme = baseURL.scheme; - url.path = infra_1.list.clone(baseURL.path); - url.query = baseURL.query; - url.fragment = ""; - url._cannotBeABaseURLFlag = true; - state = interfaces_1.ParserState.Fragment; - } - else if (baseURL.scheme !== "file") { - state = interfaces_1.ParserState.Relative; - walker.pointer--; - } - else { - state = interfaces_1.ParserState.File; - walker.pointer--; - } - break; - case interfaces_1.ParserState.SpecialRelativeOrAuthority: - /** - * If c is U+002F (/) and remaining starts with U+002F (/), then set - * state to special authority ignore slashes state and increase - * pointer by one. - * Otherwise, validation error, set state to relative state and - * decrease pointer by one. - */ - if (walker.c() === '/' && walker.remaining().startsWith('/')) { - state = interfaces_1.ParserState.SpecialAuthorityIgnoreSlashes; - walker.pointer++; - } - else { - validationError("Invalid input string."); - state = interfaces_1.ParserState.Relative; - walker.pointer--; - } - break; - case interfaces_1.ParserState.PathOrAuthority: - /** - * If c is U+002F (/), then set state to authority state. - * Otherwise, set state to path state, and decrease pointer by one. - */ - if (walker.c() === '/') { - state = interfaces_1.ParserState.Authority; - } - else { - state = interfaces_1.ParserState.Path; - walker.pointer--; - } - break; - case interfaces_1.ParserState.Relative: - /** - * Set url’s scheme to base’s scheme, and then, switching on c: - */ - if (baseURL === null) { - throw new Error("Invalid parser state. Base URL is null."); - } - url.scheme = baseURL.scheme; - switch (walker.c()) { - case EOF: // EOF - /** - * Set url’s username to base’s username, url’s password to base’s - * password, url’s host to base’s host, url’s port to base’s port, - * url’s path to a copy of base’s path, and url’s query to base’s - * query. - */ - url.username = baseURL.username; - url.password = baseURL.password; - url.host = baseURL.host; - url.port = baseURL.port; - url.path = infra_1.list.clone(baseURL.path); - url.query = baseURL.query; - break; - case '/': - /** - * Set state to relative slash state. - */ - state = interfaces_1.ParserState.RelativeSlash; - break; - case '?': - /** - * Set url’s username to base’s username, url’s password to base’s - * password, url’s host to base’s host, url’s port to base’s port, - * url’s path to a copy of base’s path, url’s query to the empty - * string, and state to query state. - */ - url.username = baseURL.username; - url.password = baseURL.password; - url.host = baseURL.host; - url.port = baseURL.port; - url.path = infra_1.list.clone(baseURL.path); - url.query = ""; - state = interfaces_1.ParserState.Query; - break; - case '#': - /** - * Set url’s username to base’s username, url’s password to base’s - * password, url’s host to base’s host, url’s port to base’s port, - * url’s path to a copy of base’s path, url’s query to base’s - * query, url’s fragment to the empty string, and state to - * fragment state. - */ - url.username = baseURL.username; - url.password = baseURL.password; - url.host = baseURL.host; - url.port = baseURL.port; - url.path = infra_1.list.clone(baseURL.path); - url.query = baseURL.query; - url.fragment = ""; - state = interfaces_1.ParserState.Fragment; - break; - default: - /** - * If url is special and c is U+005C (\), validation error, - * set state to relative slash state. - * Otherwise, run these steps: - * 1. Set url’s username to base’s username, url’s password to - * base’s password, url’s host to base’s host, url’s port to - * base’s port, url’s path to a copy of base’s path, and then - * remove url’s path’s last item, if any. - * 2. Set state to path state, and decrease pointer by one. - */ - if (isSpecial(url) && walker.c() === '\\') { - validationError("Invalid input string."); - state = interfaces_1.ParserState.RelativeSlash; - } - else { - url.username = baseURL.username; - url.password = baseURL.password; - url.host = baseURL.host; - url.port = baseURL.port; - url.path = infra_1.list.clone(baseURL.path); - if (url.path.length !== 0) - url.path.splice(url.path.length - 1, 1); - state = interfaces_1.ParserState.Path; - walker.pointer--; - } - break; - } - break; - case interfaces_1.ParserState.RelativeSlash: - /** - * 1. If url is special and c is U+002F (/) or U+005C (\), then: - * 1.1. If c is U+005C (\), validation error. - * 1.2. Set state to special authority ignore slashes state. - * 2. Otherwise, if c is U+002F (/), then set state to authority state. - * 3. Otherwise, set url’s username to base’s username, url’s password - * to base’s password, url’s host to base’s host, url’s port to base’s - * port, state to path state, and then, decrease pointer by one. - */ - if (isSpecial(url) && (walker.c() === '/' || walker.c() === '\\')) { - if (walker.c() === '\\') { - validationError("Invalid input string."); - } - state = interfaces_1.ParserState.SpecialAuthorityIgnoreSlashes; - } - else if (walker.c() === '/') { - state = interfaces_1.ParserState.Authority; - } - else { - if (baseURL === null) { - throw new Error("Invalid parser state. Base URL is null."); - } - url.username = baseURL.username; - url.password = baseURL.password; - url.host = baseURL.host; - url.port = baseURL.port; - state = interfaces_1.ParserState.Path; - walker.pointer--; - } - break; - case interfaces_1.ParserState.SpecialAuthoritySlashes: - /** - * If c is U+002F (/) and remaining starts with U+002F (/), then set - * state to special authority ignore slashes state and increase - * pointer by one. - * Otherwise, validation error, set state to special authority ignore - * slashes state, and decrease pointer by one. - */ - if (walker.c() === '/' && walker.remaining().startsWith('/')) { - state = interfaces_1.ParserState.SpecialAuthorityIgnoreSlashes; - walker.pointer++; - } - else { - validationError("Expected '//'."); - state = interfaces_1.ParserState.SpecialAuthorityIgnoreSlashes; - walker.pointer--; - } - break; - case interfaces_1.ParserState.SpecialAuthorityIgnoreSlashes: - /** - * If c is neither U+002F (/) nor U+005C (\), then set state to - * authority state and decrease pointer by one. - * Otherwise, validation error. - */ - if (walker.c() !== '/' && walker.c() !== '\\') { - state = interfaces_1.ParserState.Authority; - walker.pointer--; - } - else { - validationError("Unexpected '/' or '\\'."); - } - break; - case interfaces_1.ParserState.Authority: - /** - * 1. If c is U+0040 (@), then: - */ - if (walker.c() === '@') { - /** - * 1.1. Validation error. - * 1.2. If the @ flag is set, prepend "%40" to buffer. - * 1.3. Set the @ flag. - * 1.4. For each codePoint in buffer: - */ - validationError("Unexpected '@'."); - if (atFlag) - buffer = '%40' + buffer; - atFlag = true; - for (const codePoint of buffer) { - /** - * 1.4.1. If codePoint is U+003A (:) and passwordTokenSeenFlag is - * unset, then set passwordTokenSeenFlag and continue. - * 1.4.2. Let encodedCodePoints be the result of running UTF-8 - * percent encode codePoint using the userinfo percent-encode set. - * 1.4.3. If passwordTokenSeenFlag is set, then append - * encodedCodePoints to url’s password. - * 1.4.4. Otherwise, append encodedCodePoints to url’s username. - */ - if (codePoint === ':' && !passwordTokenSeenFlag) { - passwordTokenSeenFlag = true; - continue; - } - const encodedCodePoints = utf8PercentEncode(codePoint, _userInfoPercentEncodeSet); - if (passwordTokenSeenFlag) { - url.password += encodedCodePoints; - } - else { - url.username += encodedCodePoints; - } - } - /** - * 1.5. Set buffer to the empty string. - */ - buffer = ""; - } - else if (walker.c() === EOF || walker.c() === '/' || walker.c() === '?' || walker.c() === '#' || - (isSpecial(url) && walker.c() === '\\')) { - /** - * 2. Otherwise, if one of the following is true - * - c is the EOF code point, U+002F (/), U+003F (?), or U+0023 (#) - * - url is special and c is U+005C (\) - * then: - * 2.1. If @ flag is set and buffer is the empty string, validation - * error, return failure. - * 2.2. Decrease pointer by the number of code points in buffer plus - * one, set buffer to the empty string, and set state to host state. - */ - if (atFlag && buffer === "") { - validationError("Invalid input string."); - return null; - } - walker.pointer -= (buffer.length + 1); - buffer = ""; - state = interfaces_1.ParserState.Host; - } - else { - /** - * 3. Otherwise, append c to buffer. - */ - buffer += walker.c(); - } - break; - case interfaces_1.ParserState.Host: - case interfaces_1.ParserState.Hostname: - if (stateOverride !== undefined && url.scheme === "file") { - /** - * 1. If state override is given and url’s scheme is "file", then - * decrease pointer by one and set state to file host state. - */ - walker.pointer--; - state = interfaces_1.ParserState.FileHost; - } - else if (walker.c() === ':' && !arrayFlag) { - /** - * 2. Otherwise, if c is U+003A (:) and the [] flag is unset, then: - * 2.1. If buffer is the empty string, validation error, return - * failure. - * 2.2. Let host be the result of host parsing buffer with url is - * not special. - * 2.3. If host is failure, then return failure. - * 2.4. Set url’s host to host, buffer to the empty string, and - * state to port state. - * 2.5. If state override is given and state override is hostname - * state, then return. - */ - if (buffer === "") { - validationError("Invalid input string."); - return null; - } - const host = hostParser(buffer, !isSpecial(url)); - if (host === null) - return null; - url.host = host; - buffer = ""; - state = interfaces_1.ParserState.Port; - if (stateOverride === interfaces_1.ParserState.Hostname) - return url; - } - else if (walker.c() === EOF || walker.c() === '/' || walker.c() === '?' || walker.c() === '#' || - (isSpecial(url) && walker.c() === '\\')) { - /** - * 3. Otherwise, if one of the following is true - * - c is the EOF code point, U+002F (/), U+003F (?), or U+0023 (#) - * - url is special and c is U+005C (\) - * then decrease pointer by one, and then: - * 3.1. If url is special and buffer is the empty string, validation - * error, return failure. - * 3.2. Otherwise, if state override is given, buffer is the empty - * string, and either url includes credentials or url’s port is - * non-null, validation error, return. - * 3.3. Let host be the result of host parsing buffer with url is - * not special. - * 3.4. If host is failure, then return failure. - * 3.5. Set url’s host to host, buffer to the empty string, and - * state to path start state. - * 3.6. If state override is given, then return. - */ - walker.pointer--; - if (isSpecial(url) && buffer === "") { - validationError("Invalid input string."); - return null; - } - else if (stateOverride !== undefined && buffer === "" && - (includesCredentials(url) || url.port !== null)) { - validationError("Invalid input string."); - return url; - } - const host = hostParser(buffer, !isSpecial(url)); - if (host === null) - return null; - url.host = host; - buffer = ""; - state = interfaces_1.ParserState.PathStart; - if (stateOverride !== undefined) - return url; - } - else { - /** - * 4. Otherwise: - * 4.1. If c is U+005B ([), then set the [] flag. - * 4.2. If c is U+005D (]), then unset the [] flag. - * 4.3. Append c to buffer. - */ - if (walker.c() === '[') - arrayFlag = true; - if (walker.c() === ']') - arrayFlag = false; - buffer += walker.c(); - } - break; - case interfaces_1.ParserState.Port: - if (infra_1.codePoint.ASCIIDigit.test(walker.c())) { - /** - * 1. If c is an ASCII digit, append c to buffer. - */ - buffer += walker.c(); - } - else if (walker.c() === EOF || walker.c() === '/' || walker.c() === '?' || walker.c() === '#' || - (isSpecial(url) && walker.c() === '\\') || stateOverride) { - /** - * 2. Otherwise, if one of the following is true - * - c is the EOF code point, U+002F (/), U+003F (?), or U+0023 (#) - * - url is special and c is U+005C (\) - * - state override is given - * then: - */ - if (buffer !== "") { - /** - * 2.1. If buffer is not the empty string, then: - * 2.1.1. Let port be the mathematical integer value that is - * represented by buffer in radix-10 using ASCII digits for digits - * with values 0 through 9. - * 2.1.2. If port is greater than 2**16 − 1, validation error, - * return failure. - * 2.1.3. Set url’s port to null, if port is url’s scheme’s default - * port, and to port otherwise. - * 2.1.4. Set buffer to the empty string. - */ - if (buffer !== "") { - const port = parseInt(buffer, 10); - if (port > Math.pow(2, 16) - 1) { - validationError("Invalid port number."); - return null; - } - url.port = (port === defaultPort(url.scheme) ? null : port); - buffer = ""; - } - } - /** - * 2.2. If state override is given, then return. - * 2.3. Set state to path start state, and decrease pointer by one. - */ - if (stateOverride !== undefined) { - return url; - } - state = interfaces_1.ParserState.PathStart; - walker.pointer--; - } - else { - /** - * 3. Otherwise, validation error, return failure. - */ - validationError("Invalid input string."); - return null; - } - break; - case interfaces_1.ParserState.File: - /** - * 1. Set url’s scheme to "file". - */ - url.scheme = "file"; - if (walker.c() === '/' || walker.c() === '\\') { - /** - * 2. If c is U+002F (/) or U+005C (\), then: - * 2.1. If c is U+005C (\), validation error. - * 2.2. Set state to file slash state. - */ - if (walker.c() === '\\') { - validationError("Invalid input string."); - } - state = interfaces_1.ParserState.FileSlash; - } - else if (baseURL !== null && baseURL.scheme === "file") { - /** - * 3. Otherwise, if base is non-null and base’s scheme is "file", - * switch on c: - */ - switch (walker.c()) { - case EOF: - /** - * Set url’s host to base’s host, url’s path to a copy of base’s - * path, and url’s query to base’s query. - */ - url.host = baseURL.host; - url.path = infra_1.list.clone(baseURL.path); - url.query = baseURL.query; - break; - case '?': - /** - * Set url’s host to base’s host, url’s path to a copy of base’s - * path, url’s query to the empty string, and state to query - * state. - */ - url.host = baseURL.host; - url.path = infra_1.list.clone(baseURL.path); - url.query = ""; - state = interfaces_1.ParserState.Query; - break; - case '#': - /** - * Set url’s host to base’s host, url’s path to a copy of base’s - * path, url’s query to base’s query, url’s fragment to the - * empty string, and state to fragment state. - */ - url.host = baseURL.host; - url.path = infra_1.list.clone(baseURL.path); - url.query = baseURL.query; - url.fragment = ""; - state = interfaces_1.ParserState.Fragment; - break; - default: - /** - * 1. If the substring from pointer in input does not start - * with a Windows drive letter, then set url’s host to base’s - * host, url’s path to a copy of base’s path, and then shorten - * url’s path. - * _Note:_ is a (platform-independent) Windows drive letter - * quirk. - * 2. Otherwise, validation error. - * 3. Set state to path state, and decrease pointer by one. - */ - if (!startsWithAWindowsDriveLetter(walker.substring())) { - url.host = baseURL.host; - url.path = infra_1.list.clone(baseURL.path); - shorten(url); - } - else { - validationError("Unexpected windows drive letter in input string."); - } - state = interfaces_1.ParserState.Path; - walker.pointer--; - break; - } - } - else { - /** - * 4. Otherwise, set state to path state, and decrease pointer by - * one. - */ - state = interfaces_1.ParserState.Path; - walker.pointer--; - } - break; - case interfaces_1.ParserState.FileSlash: - if (walker.c() === '/' || walker.c() === '\\') { - /** - * 1. If c is U+002F (/) or U+005C (\), then: - * 1.1. If c is U+005C (\), validation error. - * 1.2. Set state to file host state. - */ - if (walker.c() === '\\') { - validationError("Invalid input string."); - } - state = interfaces_1.ParserState.FileHost; - } - else { - /** - * 2. Otherwise: - * 2.1. If base is non-null, base’s scheme is "file", and the - * substring from pointer in input does not start with a Windows - * drive letter, then: - * 2.1.1. If base’s path[0] is a normalized Windows drive letter, - * then append base’s path[0] to url’s path. - * _Note:_ is a (platform-independent) Windows drive letter - * quirk. Both url’s and base’s host are null under these conditions - * and therefore not copied. - * 2.1.2. Otherwise, set url’s host to base’s host. - * 2.2. Set state to path state, and decrease pointer by one. - */ - if (baseURL !== null && baseURL.scheme === "file" && - !startsWithAWindowsDriveLetter(walker.substring())) { - if (isNormalizedWindowsDriveLetter(baseURL.path[0])) { - url.path.push(baseURL.path[0]); - } - else { - url.host = baseURL.host; - } - } - state = interfaces_1.ParserState.Path; - walker.pointer--; - } - break; - case interfaces_1.ParserState.FileHost: - if (walker.c() === EOF || walker.c() === '/' || walker.c() === '\\' || - walker.c() === '?' || walker.c() === '#') { - /** - * 1. If c is the EOF code point, U+002F (/), U+005C (\), U+003F (?), - * or U+0023 (#), then decrease pointer by one and then: - */ - walker.pointer--; - if (stateOverride === undefined && isWindowsDriveLetter(buffer)) { - /** - * 1.1. If state override is not given and buffer is a Windows drive - * letter, validation error, set state to path state. - * _Note:_ is a (platform-independent) Windows drive letter - * quirk. buffer is not reset here and instead used in the path state. - */ - validationError("Unexpected windows drive letter in input string."); - state = interfaces_1.ParserState.Path; - } - else if (buffer === "") { - /** - * 1.2. Otherwise, if buffer is the empty string, then: - * 1.2.1. Set url’s host to the empty string. - * 1.2.2. If state override is given, then return. - * 1.2.3. Set state to path start state. - */ - url.host = ""; - if (stateOverride !== undefined) - return url; - state = interfaces_1.ParserState.PathStart; - } - else { - /** - * 1.3. Otherwise, run these steps: - * 1.3.1. Let host be the result of host parsing buffer with url - * is not special. - * 1.3.2. If host is failure, then return failure. - * 1.3.3. If host is "localhost", then set host to the empty - * string. - * 1.3.4. Set url’s host to host. - * 1.3.5. If state override is given, then return. - * 1.3.6. Set buffer to the empty string and state to path start - * state. - */ - let host = hostParser(buffer, !isSpecial(url)); - if (host === null) - return null; - if (host === "localhost") - host = ""; - url.host = host; - if (stateOverride !== undefined) - return url; - buffer = ""; - state = interfaces_1.ParserState.PathStart; - } - } - else { - /** - * 2. Otherwise, append c to buffer. - */ - buffer += walker.c(); - } - break; - case interfaces_1.ParserState.PathStart: - if (isSpecial(url)) { - /** - * 1. If url is special, then: - * 1.1. If c is U+005C (\), validation error. - * 1.2. Set state to path state. - * 1.3. If c is neither U+002F (/) nor U+005C (\), then decrease - * pointer by one. - */ - if (walker.c() === '\\') { - validationError("Invalid input string."); - } - state = interfaces_1.ParserState.Path; - if (walker.c() !== '/' && walker.c() !== '\\') - walker.pointer--; - } - else if (stateOverride === undefined && walker.c() === '?') { - /** - * 2. Otherwise, if state override is not given and c is U+003F (?), - * set url’s query to the empty string and state to query state. - */ - url.query = ""; - state = interfaces_1.ParserState.Query; - } - else if (stateOverride === undefined && walker.c() === '#') { - /** - * 3. Otherwise, if state override is not given and c is U+0023 (#), - * set url’s fragment to the empty string and state to fragment - * state. - */ - url.fragment = ""; - state = interfaces_1.ParserState.Fragment; - } - else if (walker.c() !== EOF) { - /** - * 4. Otherwise, if c is not the EOF code point: - * 4.1. Set state to path state. - * 4.2. If c is not U+002F (/), then decrease pointer by one. - */ - state = interfaces_1.ParserState.Path; - if (walker.c() !== '/') - walker.pointer--; - } - break; - case interfaces_1.ParserState.Path: - if ((walker.c() === EOF || walker.c() === '/') || - (isSpecial(url) && walker.c() === '\\') || - (stateOverride === undefined && (walker.c() === '?' || walker.c() === '#'))) { - /** - * 1. If one of the following is true - * - c is the EOF code point or U+002F (/) - * - url is special and c is U+005C (\) - * - state override is not given and c is U+003F (?) or U+0023 (#) - * then: - */ - if (isSpecial(url) && walker.c() === '\\') { - /** - * 1.1 If url is special and c is U+005C (\), validation error. - */ - validationError("Invalid input string."); - } - if (isDoubleDotPathSegment(buffer)) { - /** - * 1.2. If buffer is a double-dot path segment, shorten url’s path, - * and then if neither c is U+002F (/), nor url is special and c is - * U+005C (\), append the empty string to url’s path. - */ - shorten(url); - if (walker.c() !== '/' && !(isSpecial(url) && walker.c() === '\\')) { - url.path.push(""); - } - } - else if (isSingleDotPathSegment(buffer) && walker.c() !== '/' && - !(isSpecial(url) && walker.c() === '\\')) { - /** - * 1.3. Otherwise, if buffer is a single-dot path segment and if - * neither c is U+002F (/), nor url is special and c is U+005C (\), - * append the empty string to url’s path. - */ - url.path.push(""); - } - else if (!isSingleDotPathSegment(buffer)) { - /** - * 1.4. Otherwise, if buffer is not a single-dot path segment, then: - */ - if (url.scheme === "file" && url.path.length === 0 && - isWindowsDriveLetter(buffer)) { - /** - * 1.4.1. If url’s scheme is "file", url’s path is empty, and - * buffer is a Windows drive letter, then: - * 1.4.1.1. If url’s host is neither the empty string nor null, - * validation error, set url’s host to the empty string. - * 1.4.1.2. Replace the second code point in buffer with U+003A (:). - * _Note:_ is a (platform-independent) Windows drive letter quirk. - */ - if (url.host !== null && url.host !== "") { - validationError("Invalid input string."); - url.host = ""; - } - const bufferCodePoints = Array.from(buffer); - buffer = bufferCodePoints.slice(0, 1) + ':' + bufferCodePoints.slice(2); - } - /** - * 1.4.2. Append buffer to url’s path. - */ - url.path.push(buffer); - } - /** - * 1.5. Set buffer to the empty string. - */ - buffer = ""; - /** - * 1.6. If url’s scheme is "file" and c is the EOF code point, - * U+003F (?), or U+0023 (#), then while url’s path’s size is - * greater than 1 and url’s path[0] is the empty string, validation - * error, remove the first item from url’s path. - */ - if (url.scheme === "file" && (walker.c() === EOF || walker.c() === '?' || walker.c() === '#')) { - while (url.path.length > 1 && url.path[0] === "") { - validationError("Invalid input string."); - url.path.splice(0, 1); - } - } - /** - * 1.7. If c is U+003F (?), then set url’s query to the empty string - * and state to query state. - * 1.8. If c is U+0023 (#), then set url’s fragment to the empty - * string and state to fragment state. - */ - if (walker.c() === '?') { - url.query = ""; - state = interfaces_1.ParserState.Query; - } - if (walker.c() === '#') { - url.fragment = ""; - state = interfaces_1.ParserState.Fragment; - } - } - else { - /** - * 2. Otherwise, run these steps: - * 2.1. If c is not a URL code point and not U+0025 (%), validation - * error. - * 2.2. If c is U+0025 (%) and remaining does not start with two - * ASCII hex digits, validation error. - * 2.3. UTF-8 percent encode c using the path percent-encode set, - * and append the result to buffer. - */ - if (!_urlCodePoints.test(walker.c()) && walker.c() !== '%') { - validationError("Character is not a URL code point or a percent encoded character."); - } - if (walker.c() === '%' && !/^[0-9a-fA-F][0-9a-fA-F]/.test(walker.remaining())) { - validationError("Percent encoded character must be followed by two hex digits."); - } - buffer += utf8PercentEncode(walker.c(), _pathPercentEncodeSet); - } - break; - case interfaces_1.ParserState.CannotBeABaseURLPath: - /** - * 1. If c is U+003F (?), then set url’s query to the empty string and - * state to query state. - * 2. Otherwise, if c is U+0023 (#), then set url’s fragment to the - * empty string and state to fragment state. - * 3. Otherwise: - * 3.1. If c is not the EOF code point, not a URL code point, and not - * U+0025 (%), validation error. - * 3.2. If c is U+0025 (%) and remaining does not start with two ASCII - * hex digits, validation error. - * 3.3. If c is not the EOF code point, UTF-8 percent encode c using - * the C0 control percent-encode set, and append the result to url’s - * path[0]. - */ - if (walker.c() === '?') { - url.query = ""; - state = interfaces_1.ParserState.Query; - } - else if (walker.c() === '#') { - url.fragment = ""; - state = interfaces_1.ParserState.Fragment; - } - else { - if (walker.c() !== EOF && !_urlCodePoints.test(walker.c()) && walker.c() !== '%') { - validationError("Character is not a URL code point or a percent encoded character."); - } - if (walker.c() === '%' && !/^[0-9a-fA-F][0-9a-fA-F]/.test(walker.remaining())) { - validationError("Percent encoded character must be followed by two hex digits."); - } - if (walker.c() !== EOF) { - url.path[0] += utf8PercentEncode(walker.c(), _c0ControlPercentEncodeSet); - } - } - break; - case interfaces_1.ParserState.Query: - /** - * 1. If encoding is not UTF-8 and one of the following is true - * - url is not special - * - url’s scheme is "ws" or "wss" - * then set encoding to UTF-8. - */ - if (encoding !== "UTF-8" && (!isSpecial(url) || - url.scheme === "ws" || url.scheme === "wss")) { - encoding = "UTF-8"; - } - if (stateOverride === undefined && walker.c() === '#') { - /** - * 2. If state override is not given and c is U+0023 (#), then set - * url’s fragment to the empty string and state to fragment state. - */ - url.fragment = ""; - state = interfaces_1.ParserState.Fragment; - } - else if (walker.c() !== EOF) { - /** - * 3. Otherwise, if c is not the EOF code point: - * 3.1. If c is not a URL code point and not U+0025 (%), validation - * error. - */ - if (!_urlCodePoints.test(walker.c()) && walker.c() !== '%') { - validationError("Character is not a URL code point or a percent encoded character."); - } - /** - * 3.2. If c is U+0025 (%) and remaining does not start with two - * ASCII hex digits, validation error. - */ - if (walker.c() === '%' && !/^[0-9a-fA-F][0-9a-fA-F]/.test(walker.remaining())) { - validationError("Percent encoded character must be followed by two hex digits."); - } - /** - * 3.3. Let bytes be the result of encoding c using encoding. - */ - if (encoding.toUpperCase() !== "UTF-8") { - throw new Error("Only UTF-8 encoding is supported."); - } - let bytes = (0, util_1.utf8Encode)(walker.c()); - /** - * 3.4. If bytes starts with `` and ends with 0x3B (;), then: - */ - if (bytes.length >= 3 && bytes[0] === 38 && bytes[1] === 35 && - bytes[bytes.length - 1] === 59) { - /** - * 3.4.1. Replace `` at the start of bytes with `%26%23`. - * 3.4.2. Replace 0x3B (;) at the end of bytes with `%3B`. - * 3.4.4. Append bytes, isomorphic decoded, to url’s query. - * _Note:_ can happen when encoding code points using a - * non-UTF-8 encoding. - */ - bytes = bytes.subarray(2, bytes.length - 1); - url.query += "%26%23" + infra_1.byteSequence.isomorphicDecode(bytes) + "%3B"; - } - else { - /** - * 3.5. Otherwise, for each byte in bytes: - * 3.5.1. If one of the following is true - * - byte is less than 0x21 (!) - * - byte is greater than 0x7E (~) - * - byte is 0x22 ("), 0x23 (#), 0x3C (<), or 0x3E (>) - * - byte is 0x27 (') and url is special - * then append byte, percent encoded, to url’s query. - * 3.5.2. Otherwise, append a code point whose value is byte to - * url’s query. - */ - for (const byte of bytes) { - if (byte < 0x21 || byte > 0x7E || byte === 0x22 || - byte === 0x23 || byte === 0x3C || byte === 0x3E || - (byte === 0x27 && isSpecial(url))) { - url.query += percentEncode(byte); - } - else { - url.query += String.fromCharCode(byte); - } - } - } - } - break; - case interfaces_1.ParserState.Fragment: - /** - * Switching on c: - * - The EOF code point - * Do nothing. - * - U+0000 NULL - * Validation error. - * - Otherwise - * 1. If c is not a URL code point and not U+0025 (%), validation - * error. - * 2. If c is U+0025 (%) and remaining does not start with two ASCII - * hex digits, validation error. - * 3. UTF-8 percent encode c using the fragment percent-encode set and - * append the result to url’s fragment. - */ - if (walker.c() === EOF) { - // - } - else if (walker.c() === "\u0000") { - validationError("NULL character in input string."); - } - else { - if (!_urlCodePoints.test(walker.c()) && walker.c() !== '%') { - validationError("Unexpected character in fragment string."); - } - if (walker.c() === '%' && !/^[A-Za-z0-9][A-Za-z0-9]/.test(walker.remaining())) { - validationError("Unexpected character in fragment string."); - } - url.fragment += utf8PercentEncode(walker.c(), _fragmentPercentEncodeSet); - } - break; - } - if (walker.eof) - break; - else - walker.pointer++; - } - /** - * 12. Return url. - */ - return url; -} -/** - * Sets a URL's username. - * - * @param url - a URL - * @param username - username string - */ -function setTheUsername(url, username) { - /** - * 1. Set url’s username to the empty string. - * 2. For each code point in username, UTF-8 percent encode it using the - * userinfo percent-encode set, and append the result to url’s username. - */ - let result = ""; - for (const codePoint of username) { - result += utf8PercentEncode(codePoint, _userInfoPercentEncodeSet); - } - url.username = result; -} -/** - * Sets a URL's password. - * - * @param url - a URL - * @param username - password string - */ -function setThePassword(url, password) { - /** - * 1. Set url’s password to the empty string. - * 2. For each code point in password, UTF-8 percent encode it using the - * userinfo percent-encode set, and append the result to url’s password. - */ - let result = ""; - for (const codePoint of password) { - result += utf8PercentEncode(codePoint, _userInfoPercentEncodeSet); - } - url.password = result; -} -/** - * Determines if the string represents a single dot path. - * - * @param str - a string - */ -function isSingleDotPathSegment(str) { - return str === '.' || str.toLowerCase() === "%2e"; -} -/** - * Determines if the string represents a double dot path. - * - * @param str - a string - */ -function isDoubleDotPathSegment(str) { - const lowerStr = str.toLowerCase(); - return lowerStr === ".." || lowerStr === ".%2e" || - lowerStr === "%2e." || lowerStr === "%2e%2e"; -} -/** - * Shorten's URL's path. - * - * @param url - an URL - */ -function shorten(url) { - /** - * 1. Let path be url’s path. - * 2. If path is empty, then return. - * 3. If url’s scheme is "file", path’s size is 1, and path[0] is a - * normalized Windows drive letter, then return. - * 4. Remove path’s last item. - */ - const path = url.path; - if (path.length === 0) - return; - if (url.scheme === "file" && path.length === 1 && - isNormalizedWindowsDriveLetter(path[0])) - return; - url.path.splice(url.path.length - 1, 1); -} -/** - * Determines if a string is a normalized Windows drive letter. - * - * @param str - a string - */ -function isNormalizedWindowsDriveLetter(str) { - /** - * A normalized Windows drive letter is a Windows drive letter of which the - * second code point is U+003A (:). - */ - return str.length >= 2 && infra_1.codePoint.ASCIIAlpha.test(str[0]) && - str[1] === ':'; -} -/** - * Determines if a string is a Windows drive letter. - * - * @param str - a string - */ -function isWindowsDriveLetter(str) { - /** - * A Windows drive letter is two code points, of which the first is an ASCII - * alpha and the second is either U+003A (:) or U+007C (|). - */ - return str.length >= 2 && infra_1.codePoint.ASCIIAlpha.test(str[0]) && - (str[1] === ':' || str[1] === '|'); -} -/** - * Determines if a string starts with a Windows drive letter. - * - * @param str - a string - */ -function startsWithAWindowsDriveLetter(str) { - /** - * A string starts with a Windows drive letter if all of the following are - * true: - * - its length is greater than or equal to 2 - * - its first two code points are a Windows drive letter - * - its length is 2 or its third code point is U+002F (/), U+005C (\), - * U+003F (?), or U+0023 (#). - */ - return str.length >= 2 && isWindowsDriveLetter(str) && - (str.length === 2 || (str[2] === '/' || str[2] === '\\' || - str[2] === '?' || str[2] === '#')); -} -/** - * Parses a host string. - * - * @param input - input string - * @param isNotSpecial - `true` if the source URL is not special; otherwise - * `false`. - */ -function hostParser(input, isNotSpecial = false) { - /** - * 1. If isNotSpecial is not given, then set isNotSpecial to false. - * 2. If input starts with U+005B ([), then: - * 2.1. If input does not end with U+005D (]), validation error, return - * failure. - * 2.2. Return the result of IPv6 parsing input with its leading U+005B ([) - * and trailing U+005D (]) removed. - */ - if (input.startsWith('[')) { - if (!input.endsWith(']')) { - validationError("Expected ']' after '['."); - return null; - } - return iPv6Parser(input.substring(1, input.length - 1)); - } - /** - * 3. If isNotSpecial is true, then return the result of opaque-host parsing - * input. - */ - if (isNotSpecial) { - return opaqueHostParser(input); - } - /** - * 4. Let domain be the result of running UTF-8 decode without BOM on the - * string percent decoding of input. - * _Note:_ Alternatively UTF-8 decode without BOM or fail can be used, - * coupled with an early return for failure, as domain to ASCII fails - * on U+FFFD REPLACEMENT CHARACTER. - */ - const domain = (0, util_1.utf8Decode)(stringPercentDecode(input)); - /** - * 5. Let asciiDomain be the result of running domain to ASCII on domain. - * 6. If asciiDomain is failure, validation error, return failure. - * 7. If asciiDomain contains a forbidden host code point, validation error, - * return failure. - */ - const asciiDomain = domainToASCII(domain); - if (asciiDomain === null) { - validationError("Invalid domain."); - return null; - } - if (_forbiddenHostCodePoint.test(asciiDomain)) { - validationError("Invalid domain."); - return null; - } - /** - * 8. Let ipv4Host be the result of IPv4 parsing asciiDomain. - * 9. If ipv4Host is an IPv4 address or failure, return ipv4Host. - * 10. Return asciiDomain. - */ - const ipv4Host = iPv4Parser(asciiDomain); - if (ipv4Host === null || (0, util_1.isNumber)(ipv4Host)) - return ipv4Host; - return asciiDomain; -} -/** - * Parses a string containing an IP v4 address. - * - * @param input - input string - * @param isNotSpecial - `true` if the source URL is not special; otherwise - * `false`. - */ -function iPv4NumberParser(input, validationErrorFlag = { value: false }) { - /** - * 1. Let R be 10. - */ - let R = 10; - if (input.startsWith("0x") || input.startsWith("0X")) { - /** - * 2. If input contains at least two code points and the first two code - * points are either "0x" or "0X", then: - * 2.1. Set validationErrorFlag. - * 2.2. Remove the first two code points from input. - * 2.3. Set R to 16. - */ - validationErrorFlag.value = true; - input = input.substr(2); - R = 16; - } - else if (input.length >= 2 && input[0] === '0') { - /** - * 3. Otherwise, if input contains at least two code points and the first - * code point is U+0030 (0), then: - * 3.1. Set validationErrorFlag. - * 3.2. Remove the first code point from input. - * 3.3. Set R to 8. - */ - validationErrorFlag.value = true; - input = input.substr(1); - R = 8; - } - /** - * 4. If input is the empty string, then return zero. - * 5. If input contains a code point that is not a radix-R digit, then - * return failure. - */ - if (input === "") - return 0; - const radixRDigits = (R === 10 ? /^[0-9]+$/ : (R === 16 ? /^[0-9A-Fa-f]+$/ : /^[0-7]+$/)); - if (!radixRDigits.test(input)) - return null; - /** - * 6. Return the mathematical integer value that is represented by input in - * radix-R notation, using ASCII hex digits for digits with values - * 0 through 15. - */ - return parseInt(input, R); -} -/** - * Parses a string containing an IP v4 address. - * - * @param input - input string - */ -function iPv4Parser(input) { - /** - * 1. Let validationErrorFlag be unset. - * 2. Let parts be input split on U+002E (.). - */ - const validationErrorFlag = { value: false }; - const parts = input.split('.'); - /** - * 3. If the last item in parts is the empty string, then: - * 3.1. Set validationErrorFlag. - * 3.2. If parts has more than one item, then remove the last item from - * parts. - */ - if (parts[parts.length - 1] === "") { - validationErrorFlag.value = true; - if (parts.length > 1) - parts.pop(); - } - /** - * 4. If parts has more than four items, return input. - */ - if (parts.length > 4) - return input; - /** - * 5. Let numbers be the empty list. - * 6. For each part in parts: - * 6.1. If part is the empty string, return input. - * 6.2. Let n be the result of parsing part using validationErrorFlag. - * 6.3. If n is failure, return input. - * 6.4. Append n to numbers. - */ - const numbers = []; - for (const part of parts) { - if (part === "") - return input; - const n = iPv4NumberParser(part, validationErrorFlag); - if (n === null) - return input; - numbers.push(n); - } - /** - * 7. If validationErrorFlag is set, validation error. - * 8. If any item in numbers is greater than 255, validation error. - * 9. If any but the last item in numbers is greater than 255, return - * failure. - * 10. If the last item in numbers is greater than or equal to - * 256**(5 − the number of items in numbers), validation error, return failure. - */ - if (validationErrorFlag.value) - validationError("Invalid IP v4 address."); - for (let i = 0; i < numbers.length; i++) { - const item = numbers[i]; - if (item > 255) { - validationError("Invalid IP v4 address."); - if (i < numbers.length - 1) - return null; - } - } - if (numbers[numbers.length - 1] >= Math.pow(256, 5 - numbers.length)) { - validationError("Invalid IP v4 address."); - return null; - } - /** - * 11. Let ipv4 be the last item in numbers. - * 12. Remove the last item from numbers. - */ - let ipv4 = numbers[numbers.length - 1]; - numbers.pop(); - /** - * 13. Let counter be zero. - * 14. For each n in numbers: - * 14.2. Increment ipv4 by n × 256**(3 − counter). - * 14.2. Increment counter by 1. - */ - let counter = 0; - for (const n of numbers) { - ipv4 += n * Math.pow(256, 3 - counter); - counter++; - } - /** - * 15. Return ipv4. - */ - return ipv4; -} -/** - * Parses a string containing an IP v6 address. - * - * @param input - input string - */ -function iPv6Parser(input) { - /** - * 1. Let address be a new IPv6 address whose IPv6 pieces are all 0. - * 2. Let pieceIndex be 0. - * 3. Let compress be null. - * 4. Let pointer be a pointer into input, initially 0 (pointing to the - * first code point). - */ - const EOF = ""; - const address = [0, 0, 0, 0, 0, 0, 0, 0]; - let pieceIndex = 0; - let compress = null; - const walker = new util_1.StringWalker(input); - /** - * 5. If c is U+003A (:), then: - * 5.1. If remaining does not start with U+003A (:), validation error, - * return failure. - * 5.2. Increase pointer by 2. - * 5.3. Increase pieceIndex by 1 and then set compress to pieceIndex. - */ - if (walker.c() === ':') { - if (!walker.remaining().startsWith(':')) { - validationError("Invalid IP v6 address."); - return null; - } - walker.pointer += 2; - pieceIndex += 1; - compress = pieceIndex; - } - /** - * 6. While c is not the EOF code point: - */ - while (walker.c() !== EOF) { - /** - * 6.1. If pieceIndex is 8, validation error, return failure. - */ - if (pieceIndex === 8) { - validationError("Invalid IP v6 address."); - return null; - } - /** - * 6.2. If c is U+003A (:), then: - * 6.2.1. If compress is non-null, validation error, return failure. - * 6.2.2. Increase pointer and pieceIndex by 1, set compress to pieceIndex, - * and then continue. - */ - if (walker.c() === ':') { - if (compress !== null) { - validationError("Invalid IP v6 address."); - return null; - } - walker.pointer++; - pieceIndex++; - compress = pieceIndex; - continue; - } - /** - * 6.3. Let value and length be 0. - * 6.4. While length is less than 4 and c is an ASCII hex digit, set value - * to value × 0x10 + c interpreted as hexadecimal number, and increase - * pointer and length by 1. - */ - let value = 0; - let length = 0; - while (length < 4 && infra_1.codePoint.ASCIIHexDigit.test(walker.c())) { - value = value * 0x10 + parseInt(walker.c(), 16); - walker.pointer++; - length++; - } - /** - * 6.5. If c is U+002E (.), then: - */ - if (walker.c() === '.') { - /** - * 6.5.1. If length is 0, validation error, return failure. - * 6.5.2. Decrease pointer by length. - * 6.5.3. If pieceIndex is greater than 6, validation error, return - * failure. - * 6.5.4. Let numbersSeen be 0. - */ - if (length === 0) { - validationError("Invalid IP v6 address."); - return null; - } - walker.pointer -= length; - if (pieceIndex > 6) { - validationError("Invalid IP v6 address."); - return null; - } - let numbersSeen = 0; - /** - * 6.5.5. While c is not the EOF code point: - */ - while (walker.c() !== EOF) { - /** - * 6.5.5.1. Let ipv4Piece be null. - */ - let ipv4Piece = null; - /** - * 6.5.5.2. If numbersSeen is greater than 0, then: - * 6.5.5.2.1. If c is a U+002E (.) and numbersSeen is less than 4, then - * increase pointer by 1. - * 6.5.5.2.1. Otherwise, validation error, return failure. - */ - if (numbersSeen > 0) { - if (walker.c() === '.' && numbersSeen < 4) { - walker.pointer++; - } - else { - validationError("Invalid IP v6 address."); - return null; - } - } - /** - * 6.5.5.3. If c is not an ASCII digit, validation error, return - * failure. - */ - if (!infra_1.codePoint.ASCIIDigit.test(walker.c())) { - validationError("Invalid IP v6 address."); - return null; - } - /** - * 6.5.5.4. While c is an ASCII digit: - */ - while (infra_1.codePoint.ASCIIDigit.test(walker.c())) { - /** - * 6.5.5.4.1. Let number be c interpreted as decimal number. - */ - const number = parseInt(walker.c(), 10); - /** - * 6.5.5.4.2. If ipv4Piece is null, then set ipv4Piece to number. - * Otherwise, if ipv4Piece is 0, validation error, return failure. - * Otherwise, set ipv4Piece to ipv4Piece × 10 + number. - */ - if (ipv4Piece === null) { - ipv4Piece = number; - } - else if (ipv4Piece === 0) { - validationError("Invalid IP v6 address."); - return null; - } - else { - ipv4Piece = ipv4Piece * 10 + number; - } - /** - * 6.5.5.4.3. If ipv4Piece is greater than 255, validation error, return failure. - * 6.5.5.4.4. Increase pointer by 1. - */ - if (ipv4Piece > 255) { - validationError("Invalid IP v6 address."); - return null; - } - walker.pointer++; - } - /** - * 6.5.5.5. Set address[pieceIndex] to address[pieceIndex] × 0x100 + ipv4Piece. - * 6.5.5.6. Increase numbersSeen by 1. - * 6.5.5.7. If numbersSeen is 2 or 4, then increase pieceIndex by 1. - */ - if (ipv4Piece === null) { - validationError("Invalid IP v6 address."); - return null; - } - address[pieceIndex] = address[pieceIndex] * 0x100 + ipv4Piece; - numbersSeen++; - if (numbersSeen === 2 || numbersSeen === 4) - pieceIndex++; - } - /** - * 6.5.6. If numbersSeen is not 4, validation error, return failure. - */ - if (numbersSeen !== 4) { - validationError("Invalid IP v6 address."); - return null; - } - /** - * 6.5.7. Break. - */ - break; - } - else if (walker.c() === ':') { - /** - * 6.6. Otherwise, if c is U+003A (:): - * 6.6.1. Increase pointer by 1. - * 6.6.2. If c is the EOF code point, validation error, return failure. - */ - walker.pointer++; - if (walker.c() === EOF) { - validationError("Invalid IP v6 address."); - return null; - } - } - else if (walker.c() !== EOF) { - /** - * 6.7. Otherwise, if c is not the EOF code point, validation error, - * return failure. - */ - validationError("Invalid IP v6 address."); - return null; - } - /** - * 6.8. Set address[pieceIndex] to value. - * 6.9. Increase pieceIndex by 1. - */ - address[pieceIndex] = value; - pieceIndex++; - } - /** - * 7. If compress is non-null, then: - * 7.1. Let swaps be pieceIndex − compress. - * 7.2. Set pieceIndex to 7. - * 7.3. While pieceIndex is not 0 and swaps is greater than 0, swap - * address[pieceIndex] with address[compress + swaps − 1], and then decrease - * both pieceIndex and swaps by 1. - */ - if (compress !== null) { - let swaps = pieceIndex - compress; - pieceIndex = 7; - while (pieceIndex !== 0 && swaps > 0) { - [address[pieceIndex], address[compress + swaps - 1]] = - [address[compress + swaps - 1], address[pieceIndex]]; - pieceIndex--; - swaps--; - } - } - else if (compress === null && pieceIndex !== 8) { - /** - * 8. Otherwise, if compress is null and pieceIndex is not 8, - * validation error, return failure. - */ - validationError("Invalid IP v6 address."); - return null; - } - /** - * 9. Return address. - */ - return address; -} -/** - * Parses an opaque host string. - * - * @param input - a string - */ -function opaqueHostParser(input) { - /** - * 1. If input contains a forbidden host code point excluding U+0025 (%), - * validation error, return failure. - * 2. Let output be the empty string. - * 3. For each code point in input, UTF-8 percent encode it using the C0 - * control percent-encode set, and append the result to output. - * 4. Return output. - */ - const forbiddenChars = /[\x00\t\f\r #/:?@\[\\\]]/; - if (forbiddenChars.test(input)) { - validationError("Invalid host string."); - return null; - } - let output = ""; - for (const codePoint of input) { - output += utf8PercentEncode(codePoint, _c0ControlPercentEncodeSet); - } - return output; -} -/** - * Resolves a Blob URL from the user agent's Blob URL store. - * function is not implemented. - * See: https://w3c.github.io/FileAPI/#blob-url-resolve - * - * @param url - an url - */ -function resolveABlobURL(url) { - return null; -} -/** - * Percent encodes a byte. - * - * @param value - a byte - */ -function percentEncode(value) { - /** - * To percent encode a byte into a percent-encoded byte, return a string - * consisting of U+0025 (%), followed by two ASCII upper hex digits - * representing byte. - */ - return '%' + ('00' + value.toString(16).toUpperCase()).slice(-2); -} -/** - * Percent decodes a byte sequence input. - * - * @param input - a byte sequence - */ -function percentDecode(input) { - const isHexDigit = (byte) => { - return (byte >= 0x30 && byte <= 0x39) || (byte >= 0x41 && byte <= 0x46) || - (byte >= 0x61 && byte <= 0x66); - }; - /** - * 1. Let output be an empty byte sequence. - * 2. For each byte byte in input: - */ - const output = new Uint8Array(input.length); - let n = 0; - for (let i = 0; i < input.length; i++) { - const byte = input[i]; - /** - * 2.1. If byte is not 0x25 (%), then append byte to output. - * 2.2. Otherwise, if byte is 0x25 (%) and the next two bytes after byte - * in input are not in the ranges 0x30 (0) to 0x39 (9), 0x41 (A) - * to 0x46 (F), and 0x61 (a) to 0x66 (f), all inclusive, append byte - * to output. - * 2.3. Otherwise: - * 2.3.1. Let bytePoint be the two bytes after byte in input, decoded, - * and then interpreted as hexadecimal number. - * 2.3.2. Append a byte whose value is bytePoint to output. - * 2.3.3. Skip the next two bytes in input. - */ - if (byte !== 0x25) { - output[n] = byte; - n++; - } - else if (byte === 0x25 && i >= input.length - 2) { - output[n] = byte; - n++; - } - else if (byte === 0x25 && (!isHexDigit(input[i + 1]) || !isHexDigit(input[i + 2]))) { - output[n] = byte; - n++; - } - else { - const bytePoint = parseInt((0, util_1.utf8Decode)(Uint8Array.of(input[i + 1], input[i + 2])), 16); - output[n] = bytePoint; - n++; - i += 2; - } - } - return output.subarray(0, n); -} -/** - * String percent decodes a string. - * - * @param input - a string - */ -function stringPercentDecode(input) { - /** - * 1. Let bytes be the UTF-8 encoding of input. - * 2. Return the percent decoding of bytes. - */ - return percentDecode((0, util_1.utf8Encode)(input)); -} -/** - * UTF-8 percent encodes a code point, using a percent encode set. - * - * @param codePoint - a code point - * @param percentEncodeSet - a percent encode set - */ -function utf8PercentEncode(codePoint, percentEncodeSet) { - /** - * 1. If codePoint is not in percentEncodeSet, then return codePoint. - * 2. Let bytes be the result of running UTF-8 encode on codePoint. - * 3. Percent encode each byte in bytes, and then return the results - * concatenated, in the same order. - */ - if (!percentEncodeSet.test(codePoint)) - return codePoint; - const bytes = (0, util_1.utf8Encode)(codePoint); - let result = ""; - for (const byte of bytes) { - result += percentEncode(byte); - } - return result; -} -/** - * Determines if two hosts are considered equal. - * - * @param hostA - a host - * @param hostB - a host - */ -function hostEquals(hostA, hostB) { - return hostA === hostB; -} -/** - * Determines if two URLs are considered equal. - * - * @param urlA - a URL - * @param urlB - a URL - * @param excludeFragmentsFlag - whether to ignore fragments while comparing - */ -function urlEquals(urlA, urlB, excludeFragmentsFlag = false) { - /** - * 1. Let serializedA be the result of serializing A, with the exclude - * fragment flag set if the exclude fragments flag is set. - * 2. Let serializedB be the result of serializing B, with the exclude - * fragment flag set if the exclude fragments flag is set. - * 3. Return true if serializedA is serializedB, and false otherwise. - */ - return urlSerializer(urlA, excludeFragmentsFlag) === - urlSerializer(urlB, excludeFragmentsFlag); -} -/** - * Parses an `application/x-www-form-urlencoded` string. - * - * @param input - a string - */ -function urlEncodedStringParser(input) { - /** - * The application/x-www-form-urlencoded string parser takes a string input, - * UTF-8 encodes it, and then returns the result of - * application/x-www-form-urlencoded parsing it. - */ - return urlEncodedParser((0, util_1.utf8Encode)(input)); -} -/** - * Parses `application/x-www-form-urlencoded` bytes. - * - * @param input - a byte sequence - */ -function urlEncodedParser(input) { - /** - * 1. Let sequences be the result of splitting input on 0x26 (&). - */ - const sequences = []; - let currentSequence = []; - for (const byte of input) { - if (byte === 0x26) { - sequences.push(Uint8Array.from(currentSequence)); - currentSequence = []; - } - else { - currentSequence.push(byte); - } - } - if (currentSequence.length !== 0) { - sequences.push(Uint8Array.from(currentSequence)); - } - /** - * 2. Let output be an initially empty list of name-value tuples where both name and value hold a string. - */ - const output = []; - /** - * 3. For each byte sequence bytes in sequences: - */ - for (const bytes of sequences) { - /** - * 3.1. If bytes is the empty byte sequence, then continue. - */ - if (bytes.length === 0) - continue; - /** - * 3.2. If bytes contains a 0x3D (=), then let name be the bytes from the - * start of bytes up to but excluding its first 0x3D (=), and let value be - * the bytes, if any, after the first 0x3D (=) up to the end of bytes. - * If 0x3D (=) is the first byte, then name will be the empty byte - * sequence. If it is the last, then value will be the empty byte sequence. - * 3.3. Otherwise, let name have the value of bytes and let value be the - * empty byte sequence. - */ - const index = bytes.indexOf(0x3D); - const name = (index !== -1 ? bytes.slice(0, index) : bytes); - const value = (index !== -1 ? bytes.slice(index + 1) : new Uint8Array()); - /** - * 3.4. Replace any 0x2B (+) in name and value with 0x20 (SP). - */ - for (let i = 0; i < name.length; i++) - if (name[i] === 0x2B) - name[i] = 0x20; - for (let i = 0; i < value.length; i++) - if (value[i] === 0x2B) - value[i] = 0x20; - /** - * 3.5. Let nameString and valueString be the result of running UTF-8 - * decode without BOM on the percent decoding of name and value, - * respectively. - */ - const nameString = (0, util_1.utf8Decode)(name); - const valueString = (0, util_1.utf8Decode)(value); - /** - * 3.6. Append (nameString, valueString) to output. - */ - output.push([nameString, valueString]); - } - /** - * 4. Return output. - */ - return output; -} -/** - * Serializes `application/x-www-form-urlencoded` bytes. - * - * @param input - a byte sequence - */ -function urlEncodedByteSerializer(input) { - /** - * 1. Let output be the empty string. - * 2. For each byte in input, depending on byte: - * 0x20 (SP) - * Append U+002B (+) to output. - * - * 0x2A (*) - * 0x2D (-) - * 0x2E (.) - * 0x30 (0) to 0x39 (9) - * 0x41 (A) to 0x5A (Z) - * 0x5F (_) - * 0x61 (a) to 0x7A (z) - * Append a code point whose value is byte to output. - * - * Otherwise - * Append byte, percent encoded, to output. - * 3. Return output. - */ - let output = ""; - for (const byte of input) { - if (byte === 0x20) { - output += '+'; - } - else if (byte === 0x2A || byte === 0x2D || byte === 0x2E || - (byte >= 0x30 && byte <= 0x39) || (byte >= 0x41 && byte <= 0x5A) || - byte === 0x5F || (byte >= 0x61 && byte <= 0x7A)) { - output += String.fromCodePoint(byte); - } - else { - output += percentEncode(byte); - } - } - return output; -} -/** - * Serializes `application/x-www-form-urlencoded` tuples. - * - * @param input - input tuple of name/value pairs - * @param encodingOverride: encoding override - */ -function urlEncodedSerializer(tuples, encodingOverride) { - /** - * 1. Let encoding be UTF-8. - * 2. If encoding override is given, set encoding to the result of getting - * an output encoding from encoding override. - */ - const encoding = (encodingOverride === undefined || - encodingOverride === "replacement" || encodingOverride === "UTF-16BE" || - encodingOverride === "UTF-16LE" ? "UTF-8" : encodingOverride); - if (encoding.toUpperCase() !== "UTF-8") { - throw new Error("Only UTF-8 encoding is supported."); - } - /** - * 3. Let output be the empty string. - */ - let output = ""; - /** - * 4. For each tuple in tuples: - */ - for (const tuple of tuples) { - /** - * 4.1. Let name be the result of serializing the result of encoding - * tuple’s name, using encoding. - */ - const name = urlEncodedByteSerializer((0, util_1.utf8Encode)(tuple[0])); - /** - * 4.2. Let value be tuple’s value. - */ - let value = tuple[1]; - /** - * TODO: - * 4.3. If value is a file, then set value to value’s filename. - */ - /** - * 4.4. Set value to the result of serializing the result of encoding - * value, using encoding. - */ - value = urlEncodedByteSerializer((0, util_1.utf8Encode)(value)); - /** - * 4.5. If tuple is not the first pair in tuples, then append U+0026 (&) - * to output. - */ - if (output !== "") - output += '&'; - /** - * 4.6. Append name, followed by U+003D (=), followed by value, to output. - */ - output += name + '=' + value; - } - /** - * 5. Return output. - */ - return output; -} -/** - * Returns a URL's origin. - * - * @param url - a URL - */ -function origin(url) { - /** - * A URL’s origin is the origin returned by running these steps, switching - * on URL’s scheme: - * "blob" - * 1. If URL’s blob URL entry is non-null, then return URL’s blob URL - * entry’s environment’s origin. - * 2. Let url be the result of parsing URL’s path[0]. - * 3. Return a new opaque origin, if url is failure, and url’s origin - * otherwise. - * "ftp" - * "http" - * "https" - * "ws" - * "wss" - * Return a tuple consisting of URL’s scheme, URL’s host, URL’s port, and - * null. - * "file" - * Unfortunate as it is, is left as an exercise to the reader. When in - * doubt, return a new opaque origin. - * Otherwise - * Return a new opaque origin. - */ - switch (url.scheme) { - case "blob": - if (url._blobURLEntry !== null) { - // TODO: return URL’s blob URL entry’s environment’s origin. - } - const parsedURL = basicURLParser(url.path[0]); - if (parsedURL === null) - return interfaces_1.OpaqueOrigin; - else - return origin(parsedURL); - case "ftp": - case "http": - case "https": - case "ws": - case "wss": - return [url.scheme, url.host === null ? "" : url.host, url.port, null]; - case "file": - return interfaces_1.OpaqueOrigin; - default: - return interfaces_1.OpaqueOrigin; - } -} -/** - * Converts a domain string to ASCII. - * - * @param domain - a domain string - */ -function domainToASCII(domain, beStrict = false) { - /** - * 1. If beStrict is not given, set it to false. - * 2. Let result be the result of running Unicode ToASCII with domain_name - * set to domain, UseSTD3ASCIIRules set to beStrict, CheckHyphens set to - * false, CheckBidi set to true, CheckJoiners set to true, - * Transitional_Processing set to false, and VerifyDnsLength set to beStrict. - * 3. If result is a failure value, validation error, return failure. - * 4. Return result. - */ - // Use node.js function - const result = (0, url_1.domainToASCII)(domain); - if (result === "") { - validationError("Invalid domain name."); - return null; - } - return result; -} -/** - * Converts a domain string to Unicode. - * - * @param domain - a domain string - */ -function domainToUnicode(domain, beStrict = false) { - /** - * 1. Let result be the result of running Unicode ToUnicode with domain_name - * set to domain, CheckHyphens set to false, CheckBidi set to true, - * CheckJoiners set to true, UseSTD3ASCIIRules set to false, and - * Transitional_Processing set to false. - * 2. Signify validation errors for any returned errors, and then, - * return result. - */ - // Use node.js function - const result = (0, url_1.domainToUnicode)(domain); - if (result === "") { - validationError("Invalid domain name."); - } - return result; -} -/** - * Serializes an origin. - * function is from the HTML spec: - * https://html.spec.whatwg.org/#ascii-serialisation-of-an-origin - * - * @param origin - an origin - */ -function asciiSerializationOfAnOrigin(origin) { - /** - * 1. If origin is an opaque origin, then return "null". - * 2. Otherwise, let result be origin's scheme. - * 3. Append "://" to result. - * 4. Append origin's host, serialized, to result. - * 5. If origin's port is non-null, append a U+003A COLON character (:), - * and origin's port, serialized, to result. - * 6. Return result. - */ - if (origin[0] === "" && origin[1] === "" && origin[2] === null && origin[3] === null) { - return "null"; - } - let result = origin[0] + "://" + hostSerializer(origin[1]); - if (origin[2] !== null) - result += ":" + origin[2].toString(); - return result; -} -//# sourceMappingURL=URLAlgorithm.js.map - -/***/ }), - -/***/ 3904: -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.OpaqueOrigin = exports.ParserState = void 0; -/** - * Represents the state of the URL parser. - */ -var ParserState; -(function (ParserState) { - ParserState[ParserState["SchemeStart"] = 0] = "SchemeStart"; - ParserState[ParserState["Scheme"] = 1] = "Scheme"; - ParserState[ParserState["NoScheme"] = 2] = "NoScheme"; - ParserState[ParserState["SpecialRelativeOrAuthority"] = 3] = "SpecialRelativeOrAuthority"; - ParserState[ParserState["PathOrAuthority"] = 4] = "PathOrAuthority"; - ParserState[ParserState["Relative"] = 5] = "Relative"; - ParserState[ParserState["RelativeSlash"] = 6] = "RelativeSlash"; - ParserState[ParserState["SpecialAuthoritySlashes"] = 7] = "SpecialAuthoritySlashes"; - ParserState[ParserState["SpecialAuthorityIgnoreSlashes"] = 8] = "SpecialAuthorityIgnoreSlashes"; - ParserState[ParserState["Authority"] = 9] = "Authority"; - ParserState[ParserState["Host"] = 10] = "Host"; - ParserState[ParserState["Hostname"] = 11] = "Hostname"; - ParserState[ParserState["Port"] = 12] = "Port"; - ParserState[ParserState["File"] = 13] = "File"; - ParserState[ParserState["FileSlash"] = 14] = "FileSlash"; - ParserState[ParserState["FileHost"] = 15] = "FileHost"; - ParserState[ParserState["PathStart"] = 16] = "PathStart"; - ParserState[ParserState["Path"] = 17] = "Path"; - ParserState[ParserState["CannotBeABaseURLPath"] = 18] = "CannotBeABaseURLPath"; - ParserState[ParserState["Query"] = 19] = "Query"; - ParserState[ParserState["Fragment"] = 20] = "Fragment"; -})(ParserState || (exports.ParserState = ParserState = {})); -exports.OpaqueOrigin = ["", "", null, null]; -//# sourceMappingURL=interfaces.js.map - -/***/ }), - -/***/ 214: -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.CompareCache = void 0; -/** - * Represents a cache for storing order between equal objects. - * - * This cache is used when an algorithm compares two objects and finds them to - * be equal but still needs to establish an order between those two objects. - * When two such objects `a` and `b` are passed to the `check` method, a random - * number is generated with `Math.random()`. If the random number is less than - * `0.5` it is assumed that `a < b` otherwise `a > b`. The random number along - * with `a` and `b` is stored in the cache, so that subsequent checks result - * in the same consistent result. - * - * The cache has a size limit which is defined on initialization. - */ -class CompareCache { - _limit; - _items = new Map(); - /** - * Initializes a new instance of `CompareCache`. - * - * @param limit - maximum number of items to keep in the cache. When the limit - * is exceeded the first item is removed from the cache. - */ - constructor(limit = 1000) { - this._limit = limit; - } - /** - * Compares and caches the given objects. Returns `true` if `objA < objB` and - * `false` otherwise. - * - * @param objA - an item to compare - * @param objB - an item to compare - */ - check(objA, objB) { - if (this._items.get(objA) === objB) - return true; - else if (this._items.get(objB) === objA) - return false; - const result = (Math.random() < 0.5); - if (result) { - this._items.set(objA, objB); - } - else { - this._items.set(objB, objA); - } - if (this._items.size > this._limit) { - const it = this._items.keys().next(); - /* istanbul ignore else */ - if (!it.done) { - this._items.delete(it.value); - } - } - return result; - } -} -exports.CompareCache = CompareCache; -//# sourceMappingURL=CompareCache.js.map - -/***/ }), - -/***/ 3004: -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.FixedSizeSet = void 0; -/** - * Represents a set of objects with a size limit. - */ -class FixedSizeSet { - _limit; - _items = new Set(); - /** - * Initializes a new instance of `FixedSizeSet`. - * - * @param limit - maximum number of items to keep in the set. When the limit - * is exceeded the first item is removed from the set. - */ - constructor(limit = 1000) { - this._limit = limit; - } - /** - * Adds a new item to the set. - * - * @param item - an item - */ - add(item) { - this._items.add(item); - if (this._items.size > this._limit) { - const it = this._items.values().next(); - /* istanbul ignore else */ - if (!it.done) { - this._items.delete(it.value); - } - } - return this; - } - /** - * Removes an item from the set. - * - * @param item - an item - */ - delete(item) { - return this._items.delete(item); - } - /** - * Determines if an item is in the set. - * - * @param item - an item - */ - has(item) { - return this._items.has(item); - } - /** - * Removes all items from the set. - */ - clear() { - this._items.clear(); - } - /** - * Gets the number of items in the set. - */ - get size() { return this._items.size; } - /** - * Applies the given callback function to all elements of the set. - */ - forEach(callback, thisArg) { - this._items.forEach(e => callback.call(thisArg, e, e, this)); - } - /** - * Iterates through the items in the set. - */ - *keys() { - yield* this._items.keys(); - } - /** - * Iterates through the items in the set. - */ - *values() { - yield* this._items.values(); - } - /** - * Iterates through the items in the set. - */ - *entries() { - yield* this._items.entries(); - } - /** - * Iterates through the items in the set. - */ - *[Symbol.iterator]() { - yield* this._items; - } - /** - * Returns the string tag of the set. - */ - get [Symbol.toStringTag]() { - return "FixedSizeSet"; - } -} -exports.FixedSizeSet = FixedSizeSet; -//# sourceMappingURL=FixedSizeSet.js.map - -/***/ }), - -/***/ 1323: -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Lazy = void 0; -/** - * Represents an object with lazy initialization. - */ -class Lazy { - _initialized = false; - _initFunc; - _value; - /** - * Initializes a new instance of `Lazy`. - * - * @param initFunc - initializer function - */ - constructor(initFunc) { - this._value = undefined; - this._initFunc = initFunc; - } - /** - * Gets the value of the object. - */ - get value() { - if (!this._initialized) { - this._value = this._initFunc(); - this._initialized = true; - } - return this._value; - } -} -exports.Lazy = Lazy; -//# sourceMappingURL=Lazy.js.map - -/***/ }), - -/***/ 950: -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.ObjectCache = void 0; -/** - * Represents a cache of objects with a size limit. - */ -class ObjectCache { - _limit; - _items = new Map(); - /** - * Initializes a new instance of `ObjectCache`. - * - * @param limit - maximum number of items to keep in the cache. When the limit - * is exceeded the first item is removed from the cache. - */ - constructor(limit = 1000) { - this._limit = limit; - } - /** - * Gets an item from the cache. - * - * @param key - object key - */ - get(key) { - return this._items.get(key); - } - /** - * Adds a new item to the cache. - * - * @param key - object key - * @param value - object value - */ - set(key, value) { - this._items.set(key, value); - if (this._items.size > this._limit) { - const it = this._items.keys().next(); - /* istanbul ignore else */ - if (!it.done) { - this._items.delete(it.value); - } - } - } - /** - * Removes an item from the cache. - * - * @param item - an item - */ - delete(key) { - return this._items.delete(key); - } - /** - * Determines if an item is in the cache. - * - * @param item - an item - */ - has(key) { - return this._items.has(key); - } - /** - * Removes all items from the cache. - */ - clear() { - this._items.clear(); - } - /** - * Gets the number of items in the cache. - */ - get size() { return this._items.size; } - /** - * Applies the given callback function to all elements of the cache. - */ - forEach(callback, thisArg) { - this._items.forEach((v, k) => callback.call(thisArg, k, v)); - } - /** - * Iterates through the items in the set. - */ - *keys() { - yield* this._items.keys(); - } - /** - * Iterates through the items in the set. - */ - *values() { - yield* this._items.values(); - } - /** - * Iterates through the items in the set. - */ - *entries() { - yield* this._items.entries(); - } - /** - * Iterates through the items in the set. - */ - *[Symbol.iterator]() { - yield* this._items; - } - /** - * Returns the string tag of the cache. - */ - get [Symbol.toStringTag]() { - return "ObjectCache"; - } -} -exports.ObjectCache = ObjectCache; -//# sourceMappingURL=ObjectCache.js.map - -/***/ }), - -/***/ 9262: -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.StringWalker = void 0; -/** - * Walks through the code points of a string. - */ -class StringWalker { - _chars; - _length; - _pointer = 0; - _codePoint; - _c; - _remaining; - _substring; - /** - * Initializes a new `StringWalker`. - * - * @param input - input string - */ - constructor(input) { - this._chars = Array.from(input); - this._length = this._chars.length; - } - /** - * Determines if the current position is beyond the end of string. - */ - get eof() { return this._pointer >= this._length; } - /** - * Returns the number of code points in the input string. - */ - get length() { return this._length; } - /** - * Returns the current code point. Returns `-1` if the position is beyond - * the end of string. - */ - codePoint() { - if (this._codePoint === undefined) { - if (this.eof) { - this._codePoint = -1; - } - else { - const cp = this._chars[this._pointer].codePointAt(0); - /* istanbul ignore else */ - if (cp !== undefined) { - this._codePoint = cp; - } - else { - this._codePoint = -1; - } - } - } - return this._codePoint; - } - /** - * Returns the current character. Returns an empty string if the position is - * beyond the end of string. - */ - c() { - if (this._c === undefined) { - this._c = (this.eof ? "" : this._chars[this._pointer]); - } - return this._c; - } - /** - * Returns the remaining string. - */ - remaining() { - if (this._remaining === undefined) { - this._remaining = (this.eof ? - "" : this._chars.slice(this._pointer + 1).join('')); - } - return this._remaining; - } - /** - * Returns the substring from the current character to the end of string. - */ - substring() { - if (this._substring === undefined) { - this._substring = (this.eof ? - "" : this._chars.slice(this._pointer).join('')); - } - return this._substring; - } - /** - * Gets or sets the current position. - */ - get pointer() { return this._pointer; } - set pointer(val) { - if (val === this._pointer) - return; - this._pointer = val; - this._codePoint = undefined; - this._c = undefined; - this._remaining = undefined; - this._substring = undefined; - } -} -exports.StringWalker = StringWalker; -//# sourceMappingURL=StringWalker.js.map - -/***/ }), - -/***/ 7061: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.StringWalker = exports.Lazy = exports.CompareCache = exports.ObjectCache = exports.FixedSizeSet = void 0; -exports.applyMixin = applyMixin; -exports.applyDefaults = applyDefaults; -exports.forEachArray = forEachArray; -exports.forEachObject = forEachObject; -exports.arrayLength = arrayLength; -exports.objectLength = objectLength; -exports.getObjectValue = getObjectValue; -exports.removeObjectValue = removeObjectValue; -exports.clone = clone; -exports.isBoolean = isBoolean; -exports.isNumber = isNumber; -exports.isString = isString; -exports.isFunction = isFunction; -exports.isObject = isObject; -exports.isArray = isArray; -exports.isSet = isSet; -exports.isMap = isMap; -exports.isEmpty = isEmpty; -exports.isPlainObject = isPlainObject; -exports.isIterable = isIterable; -exports.getValue = getValue; -exports.utf8Encode = utf8Encode; -exports.utf8Decode = utf8Decode; -var FixedSizeSet_js_1 = __nccwpck_require__(3004); -Object.defineProperty(exports, "FixedSizeSet", ({ enumerable: true, get: function () { return FixedSizeSet_js_1.FixedSizeSet; } })); -var ObjectCache_js_1 = __nccwpck_require__(950); -Object.defineProperty(exports, "ObjectCache", ({ enumerable: true, get: function () { return ObjectCache_js_1.ObjectCache; } })); -var CompareCache_js_1 = __nccwpck_require__(214); -Object.defineProperty(exports, "CompareCache", ({ enumerable: true, get: function () { return CompareCache_js_1.CompareCache; } })); -var Lazy_js_1 = __nccwpck_require__(1323); -Object.defineProperty(exports, "Lazy", ({ enumerable: true, get: function () { return Lazy_js_1.Lazy; } })); -var StringWalker_js_1 = __nccwpck_require__(9262); -Object.defineProperty(exports, "StringWalker", ({ enumerable: true, get: function () { return StringWalker_js_1.StringWalker; } })); -/** - * Applies the mixin to a given class. - * - * @param baseClass - class to receive the mixin - * @param mixinClass - mixin class - * @param overrides - an array with names of function overrides. Base class - * functions whose names are in this array will be kept by prepending an - * underscore to their names. - */ -function applyMixin(baseClass, mixinClass, ...overrides) { - Object.getOwnPropertyNames(mixinClass.prototype).forEach(name => { - if (name !== "constructor") { - if (overrides.indexOf(name) !== -1) { - const orgPropDesc = Object.getOwnPropertyDescriptor(baseClass.prototype, name); - /* istanbul ignore else */ - if (orgPropDesc) { - Object.defineProperty(baseClass.prototype, "_" + name, orgPropDesc); - } - } - const propDesc = Object.getOwnPropertyDescriptor(mixinClass.prototype, name); - /* istanbul ignore else */ - if (propDesc) { - Object.defineProperty(baseClass.prototype, name, propDesc); - } - } - }); -} -/** - * Applies default values to the given object. - * - * @param obj - an object - * @param defaults - an object with default values - * @param overwrite - if set to `true` defaults object always overwrites object - * values, whether they are `undefined` or not. - */ -function applyDefaults(obj, defaults, overwrite = false) { - const result = clone(obj || {}); - forEachObject(defaults, (key, val) => { - if (isPlainObject(val)) { - result[key] = applyDefaults(result[key], val, overwrite); - } - else if (overwrite || result[key] === undefined) { - result[key] = val; - } - }); - return result; -} -/** - * Iterates over items of an array or set. - * - * @param arr - array or set to iterate - * @param callback - a callback function which receives each array item as its - * single argument - * @param thisArg - the value of this inside callback - */ -function forEachArray(arr, callback, thisArg) { - arr.forEach(callback, thisArg); -} -/** - * Iterates over key/value pairs of a map or object. - * - * @param obj - map or object to iterate - * @param callback - a callback function which receives object key as its first - * argument and object value as its second argument - * @param thisArg - the value of this inside callback - */ -function forEachObject(obj, callback, thisArg) { - if (isMap(obj)) { - obj.forEach((value, key) => callback.call(thisArg, key, value)); - } - else { - for (const key in obj) { - /* istanbul ignore else */ - if (obj.hasOwnProperty(key)) { - callback.call(thisArg, key, obj[key]); - } - } - } -} -/** - * Returns the number of entries in an array or set. - * - * @param arr - array or set - */ -function arrayLength(obj) { - if (isSet(obj)) { - return obj.size; - } - else { - return obj.length; - } -} -/** - * Returns the number of entries in a map or object. - * - * @param obj - map or object - */ -function objectLength(obj) { - if (isMap(obj)) { - return obj.size; - } - else { - return Object.keys(obj).length; - } -} -/** - * Gets the value of a key from a map or object. - * - * @param obj - map or object - * @param key - the key to retrieve - */ -function getObjectValue(obj, key) { - if (isMap(obj)) { - return obj.get(key); - } - else { - return obj[key]; - } -} -/** - * Removes a property from a map or object. - * - * @param obj - map or object - * @param key - the key to remove - */ -function removeObjectValue(obj, key) { - if (isMap(obj)) { - obj.delete(key); - } - else { - delete obj[key]; - } -} -/** - * Deep clones the given object. - * - * @param obj - an object - */ -function clone(obj) { - if (isFunction(obj)) { - return obj; - } - else if (isArray(obj)) { - const result = []; - for (const item of obj) { - result.push(clone(item)); - } - return result; - } - else if (isPlainObject(obj)) { - const result = {}; - for (const key in obj) { - /* istanbul ignore next */ - if (obj.hasOwnProperty(key)) { - const val = obj[key]; - result[key] = clone(val); - } - } - return result; - } - else { - return obj; - } -} -/** - * Type guard for boolean types - * - * @param x - a variable to type check - */ -function isBoolean(x) { - return typeof x === "boolean"; -} -/** - * Type guard for numeric types - * - * @param x - a variable to type check - */ -function isNumber(x) { - return typeof x === "number"; -} -/** - * Type guard for strings - * - * @param x - a variable to type check - */ -function isString(x) { - return typeof x === "string"; -} -/** - * Type guard for function objects - * - * @param x - a variable to type check - */ -function isFunction(x) { - return !!x && typeof x === 'function'; -} -/** - * Type guard for JS objects - * - * _Note:_ Functions are objects too - * - * @param x - a variable to type check - */ -function isObject(x) { - const type = typeof x; - return !!x && (type === 'function' || type === 'object'); -} -/** - * Type guard for arrays - * - * @param x - a variable to type check - */ -function isArray(x) { - return Array.isArray(x); -} -/** - * Type guard for sets. - * - * @param x - a variable to check - */ -function isSet(x) { - return x instanceof Set; -} -/** - * Type guard for maps. - * - * @param x - a variable to check - */ -function isMap(x) { - return x instanceof Map; -} -/** - * Determines if `x` is an empty Array or an Object with no own properties. - * - * @param x - a variable to check - */ -function isEmpty(x) { - if (isArray(x)) { - return !x.length; - } - else if (isSet(x)) { - return !x.size; - } - else if (isMap(x)) { - return !x.size; - } - else if (isObject(x)) { - for (const key in x) { - if (x.hasOwnProperty(key)) { - return false; - } - } - return true; - } - return false; -} -/** - * Determines if `x` is a plain Object. - * - * @param x - a variable to check - */ -function isPlainObject(x) { - if (isObject(x)) { - const proto = Object.getPrototypeOf(x); - const ctor = proto.constructor; - return proto && ctor && - (typeof ctor === 'function') && (ctor instanceof ctor) && - (Function.prototype.toString.call(ctor) === Function.prototype.toString.call(Object)); - } - return false; -} -/** - * Determines if `x` is an iterable Object. - * - * @param x - a variable to check - */ -function isIterable(x) { - return x && (typeof x[Symbol.iterator] === 'function'); -} -/** - * Gets the primitive value of an object. - */ -function getValue(obj) { - if (isFunction(obj.valueOf)) { - return obj.valueOf(); - } - else { - return obj; - } -} -/** - * UTF-8 encodes the given string. - * - * @param input - a string - */ -function utf8Encode(input) { - const bytes = new Uint8Array(input.length * 4); - let byteIndex = 0; - for (let i = 0; i < input.length; i++) { - let char = input.charCodeAt(i); - if (char < 128) { - bytes[byteIndex++] = char; - continue; - } - else if (char < 2048) { - bytes[byteIndex++] = char >> 6 | 192; - } - else { - if (char > 0xd7ff && char < 0xdc00) { - if (++i >= input.length) { - throw new Error("Incomplete surrogate pair."); - } - const c2 = input.charCodeAt(i); - if (c2 < 0xdc00 || c2 > 0xdfff) { - throw new Error("Invalid surrogate character."); - } - char = 0x10000 + ((char & 0x03ff) << 10) + (c2 & 0x03ff); - bytes[byteIndex++] = char >> 18 | 240; - bytes[byteIndex++] = char >> 12 & 63 | 128; - } - else { - bytes[byteIndex++] = char >> 12 | 224; - } - bytes[byteIndex++] = char >> 6 & 63 | 128; - } - bytes[byteIndex++] = char & 63 | 128; - } - return bytes.subarray(0, byteIndex); -} -/** - * UTF-8 decodes the given byte sequence into a string. - * - * @param bytes - a byte sequence - */ -function utf8Decode(bytes) { - let result = ""; - let i = 0; - while (i < bytes.length) { - var c = bytes[i++]; - if (c > 127) { - if (c > 191 && c < 224) { - if (i >= bytes.length) { - throw new Error("Incomplete 2-byte sequence."); - } - c = (c & 31) << 6 | bytes[i++] & 63; - } - else if (c > 223 && c < 240) { - if (i + 1 >= bytes.length) { - throw new Error("Incomplete 3-byte sequence."); - } - c = (c & 15) << 12 | (bytes[i++] & 63) << 6 | bytes[i++] & 63; - } - else if (c > 239 && c < 248) { - if (i + 2 >= bytes.length) { - throw new Error("Incomplete 4-byte sequence."); - } - c = (c & 7) << 18 | (bytes[i++] & 63) << 12 | (bytes[i++] & 63) << 6 | bytes[i++] & 63; - } - else { - throw new Error("Unknown multi-byte start."); - } - } - if (c <= 0xffff) { - result += String.fromCharCode(c); - } - else if (c <= 0x10ffff) { - c -= 0x10000; - result += String.fromCharCode(c >> 10 | 0xd800); - result += String.fromCharCode(c & 0x3FF | 0xdc00); - } - else { - throw new Error("Code point exceeds UTF-16 limit."); - } - } - return result; -} -//# sourceMappingURL=index.js.map - -/***/ }), - -/***/ 9379: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const ANY = Symbol('SemVer ANY') -// hoisted class for cyclic dependency -class Comparator { - static get ANY () { - return ANY - } - - constructor (comp, options) { - options = parseOptions(options) - - if (comp instanceof Comparator) { - if (comp.loose === !!options.loose) { - return comp - } else { - comp = comp.value - } - } - - comp = comp.trim().split(/\s+/).join(' ') - debug('comparator', comp, options) - this.options = options - this.loose = !!options.loose - this.parse(comp) - - if (this.semver === ANY) { - this.value = '' - } else { - this.value = this.operator + this.semver.version - } - - debug('comp', this) - } - - parse (comp) { - const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] - const m = comp.match(r) - - if (!m) { - throw new TypeError(`Invalid comparator: ${comp}`) - } - - this.operator = m[1] !== undefined ? m[1] : '' - if (this.operator === '=') { - this.operator = '' - } - - // if it literally is just '>' or '' then allow anything. - if (!m[2]) { - this.semver = ANY - } else { - this.semver = new SemVer(m[2], this.options.loose) - } - } - - toString () { - return this.value - } - - test (version) { - debug('Comparator.test', version, this.options.loose) - - if (this.semver === ANY || version === ANY) { - return true - } - - if (typeof version === 'string') { - try { - version = new SemVer(version, this.options) - } catch (er) { - return false - } - } - - return cmp(version, this.operator, this.semver, this.options) - } - - intersects (comp, options) { - if (!(comp instanceof Comparator)) { - throw new TypeError('a Comparator is required') - } - - if (this.operator === '') { - if (this.value === '') { - return true - } - return new Range(comp.value, options).test(this.value) - } else if (comp.operator === '') { - if (comp.value === '') { - return true - } - return new Range(this.value, options).test(comp.semver) - } - - options = parseOptions(options) - - // Special cases where nothing can possibly be lower - if (options.includePrerelease && - (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) { - return false - } - if (!options.includePrerelease && - (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) { - return false - } - - // Same direction increasing (> or >=) - if (this.operator.startsWith('>') && comp.operator.startsWith('>')) { - return true - } - // Same direction decreasing (< or <=) - if (this.operator.startsWith('<') && comp.operator.startsWith('<')) { - return true - } - // same SemVer and both sides are inclusive (<= or >=) - if ( - (this.semver.version === comp.semver.version) && - this.operator.includes('=') && comp.operator.includes('=')) { - return true - } - // opposite directions less than - if (cmp(this.semver, '<', comp.semver, options) && - this.operator.startsWith('>') && comp.operator.startsWith('<')) { - return true - } - // opposite directions greater than - if (cmp(this.semver, '>', comp.semver, options) && - this.operator.startsWith('<') && comp.operator.startsWith('>')) { - return true - } - return false - } -} - -module.exports = Comparator - -const parseOptions = __nccwpck_require__(356) -const { safeRe: re, t } = __nccwpck_require__(5471) -const cmp = __nccwpck_require__(6265) -const debug = __nccwpck_require__(1159) -const SemVer = __nccwpck_require__(7163) -const Range = __nccwpck_require__(6782) - - -/***/ }), - -/***/ 6782: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const SPACE_CHARACTERS = /\s+/g - -// hoisted class for cyclic dependency -class Range { - constructor (range, options) { - options = parseOptions(options) - - if (range instanceof Range) { - if ( - range.loose === !!options.loose && - range.includePrerelease === !!options.includePrerelease - ) { - return range - } else { - return new Range(range.raw, options) - } - } - - if (range instanceof Comparator) { - // just put it in the set and return - this.raw = range.value - this.set = [[range]] - this.formatted = undefined - return this - } - - this.options = options - this.loose = !!options.loose - this.includePrerelease = !!options.includePrerelease - - // First reduce all whitespace as much as possible so we do not have to rely - // on potentially slow regexes like \s*. This is then stored and used for - // future error messages as well. - this.raw = range.trim().replace(SPACE_CHARACTERS, ' ') - - // First, split on || - this.set = this.raw - .split('||') - // map the range to a 2d array of comparators - .map(r => this.parseRange(r.trim())) - // throw out any comparator lists that are empty - // this generally means that it was not a valid range, which is allowed - // in loose mode, but will still throw if the WHOLE range is invalid. - .filter(c => c.length) - - if (!this.set.length) { - throw new TypeError(`Invalid SemVer Range: ${this.raw}`) - } - - // if we have any that are not the null set, throw out null sets. - if (this.set.length > 1) { - // keep the first one, in case they're all null sets - const first = this.set[0] - this.set = this.set.filter(c => !isNullSet(c[0])) - if (this.set.length === 0) { - this.set = [first] - } else if (this.set.length > 1) { - // if we have any that are *, then the range is just * - for (const c of this.set) { - if (c.length === 1 && isAny(c[0])) { - this.set = [c] - break - } - } - } - } - - this.formatted = undefined - } - - get range () { - if (this.formatted === undefined) { - this.formatted = '' - for (let i = 0; i < this.set.length; i++) { - if (i > 0) { - this.formatted += '||' - } - const comps = this.set[i] - for (let k = 0; k < comps.length; k++) { - if (k > 0) { - this.formatted += ' ' - } - this.formatted += comps[k].toString().trim() - } - } - } - return this.formatted - } - - format () { - return this.range - } - - toString () { - return this.range - } - - parseRange (range) { - // strip build metadata so it can't bleed into the version - range = range.replace(BUILDSTRIPRE, '') - - // memoize range parsing for performance. - // this is a very hot path, and fully deterministic. - const memoOpts = - (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) | - (this.options.loose && FLAG_LOOSE) - const memoKey = memoOpts + ':' + range - const cached = cache.get(memoKey) - if (cached) { - return cached - } - - const loose = this.options.loose - // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` - const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE] - range = range.replace(hr, hyphenReplace(this.options.includePrerelease)) - debug('hyphen replace', range) - - // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` - range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace) - debug('comparator trim', range) - - // `~ 1.2.3` => `~1.2.3` - range = range.replace(re[t.TILDETRIM], tildeTrimReplace) - debug('tilde trim', range) - - // `^ 1.2.3` => `^1.2.3` - range = range.replace(re[t.CARETTRIM], caretTrimReplace) - debug('caret trim', range) - - // At this point, the range is completely trimmed and - // ready to be split into comparators. - - let rangeList = range - .split(' ') - .map(comp => parseComparator(comp, this.options)) - .join(' ') - .split(/\s+/) - // >=0.0.0 is equivalent to * - .map(comp => replaceGTE0(comp, this.options)) - - if (loose) { - // in loose mode, throw out any that are not valid comparators - rangeList = rangeList.filter(comp => { - debug('loose invalid filter', comp, this.options) - return !!comp.match(re[t.COMPARATORLOOSE]) - }) - } - debug('range list', rangeList) - - // if any comparators are the null set, then replace with JUST null set - // if more than one comparator, remove any * comparators - // also, don't include the same comparator more than once - const rangeMap = new Map() - const comparators = rangeList.map(comp => new Comparator(comp, this.options)) - for (const comp of comparators) { - if (isNullSet(comp)) { - return [comp] - } - rangeMap.set(comp.value, comp) - } - if (rangeMap.size > 1 && rangeMap.has('')) { - rangeMap.delete('') - } - - const result = [...rangeMap.values()] - cache.set(memoKey, result) - return result - } - - intersects (range, options) { - if (!(range instanceof Range)) { - throw new TypeError('a Range is required') - } - - return this.set.some((thisComparators) => { - return ( - isSatisfiable(thisComparators, options) && - range.set.some((rangeComparators) => { - return ( - isSatisfiable(rangeComparators, options) && - thisComparators.every((thisComparator) => { - return rangeComparators.every((rangeComparator) => { - return thisComparator.intersects(rangeComparator, options) - }) - }) - ) - }) - ) - }) - } - - // if ANY of the sets match ALL of its comparators, then pass - test (version) { - if (!version) { - return false - } - - if (typeof version === 'string') { - try { - version = new SemVer(version, this.options) - } catch (er) { - return false - } - } - - for (let i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version, this.options)) { - return true - } - } - return false - } -} - -module.exports = Range - -const LRU = __nccwpck_require__(1383) -const cache = new LRU() - -const parseOptions = __nccwpck_require__(356) -const Comparator = __nccwpck_require__(9379) -const debug = __nccwpck_require__(1159) -const SemVer = __nccwpck_require__(7163) -const { - safeRe: re, - src, - t, - comparatorTrimReplace, - tildeTrimReplace, - caretTrimReplace, -} = __nccwpck_require__(5471) -const { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = __nccwpck_require__(5101) - -// unbounded global build-metadata stripper used by parseRange -const BUILDSTRIPRE = new RegExp(src[t.BUILD], 'g') - -const isNullSet = c => c.value === '<0.0.0-0' -const isAny = c => c.value === '' - -// take a set of comparators and determine whether there -// exists a version which can satisfy it -const isSatisfiable = (comparators, options) => { - let result = true - const remainingComparators = comparators.slice() - let testComparator = remainingComparators.pop() - - while (result && remainingComparators.length) { - result = remainingComparators.every((otherComparator) => { - return testComparator.intersects(otherComparator, options) - }) - - testComparator = remainingComparators.pop() - } - - return result -} - -// comprised of xranges, tildes, stars, and gtlt's at this point. -// already replaced the hyphen ranges -// turn into a set of JUST comparators. -const parseComparator = (comp, options) => { - comp = comp.replace(re[t.BUILD], '') - debug('comp', comp, options) - comp = replaceCarets(comp, options) - debug('caret', comp) - comp = replaceTildes(comp, options) - debug('tildes', comp) - comp = replaceXRanges(comp, options) - debug('xrange', comp) - comp = replaceStars(comp, options) - debug('stars', comp) - return comp -} - -const isX = id => !id || id.toLowerCase() === 'x' || id === '*' - -const invalidXRangeOrder = (M, m, p) => ( - (isX(M) && !isX(m)) || - (isX(m) && p && !isX(p)) -) - -// ~, ~> --> * (any, kinda silly) -// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0 -// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0 -// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0 -// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0 -// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0 -// ~0.0.1 --> >=0.0.1 <0.1.0-0 -const replaceTildes = (comp, options) => { - return comp - .trim() - .split(/\s+/) - .map((c) => replaceTilde(c, options)) - .join(' ') -} - -const replaceTilde = (comp, options) => { - const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE] - // if we're including prereleases in the match, then the lower bound is - // -0, the lowest possible prerelease value, just like x-ranges and carets. - // this keeps `~1.2` equivalent to the `1.2.x` x-range it's documented as. - const z = options.includePrerelease ? '-0' : '' - return comp.replace(r, (_, M, m, p, pr) => { - debug('tilde', comp, _, M, m, p, pr) - let ret - - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0` - } else if (isX(p)) { - // ~1.2 == >=1.2.0 <1.3.0-0 - ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0` - } else if (pr) { - debug('replaceTilde pr', pr) - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${+m + 1}.0-0` - } else { - // ~1.2.3 == >=1.2.3 <1.3.0-0 - ret = `>=${M}.${m}.${p - } <${M}.${+m + 1}.0-0` - } - - debug('tilde return', ret) - return ret - }) -} - -// ^ --> * (any, kinda silly) -// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0 -// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0 -// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0 -// ^1.2.3 --> >=1.2.3 <2.0.0-0 -// ^1.2.0 --> >=1.2.0 <2.0.0-0 -// ^0.0.1 --> >=0.0.1 <0.0.2-0 -// ^0.1.0 --> >=0.1.0 <0.2.0-0 -const replaceCarets = (comp, options) => { - return comp - .trim() - .split(/\s+/) - .map((c) => replaceCaret(c, options)) - .join(' ') -} - -const replaceCaret = (comp, options) => { - debug('caret', comp, options) - const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET] - const z = options.includePrerelease ? '-0' : '' - return comp.replace(r, (_, M, m, p, pr) => { - debug('caret', comp, _, M, m, p, pr) - let ret - - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0` - } else if (isX(p)) { - if (M === '0') { - ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0` - } else { - ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0` - } - } else if (pr) { - debug('replaceCaret pr', pr) - if (M === '0') { - if (m === '0') { - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${m}.${+p + 1}-0` - } else { - ret = `>=${M}.${m}.${p}-${pr - } <${M}.${+m + 1}.0-0` - } - } else { - ret = `>=${M}.${m}.${p}-${pr - } <${+M + 1}.0.0-0` - } - } else { - debug('no pr') - if (M === '0') { - if (m === '0') { - ret = `>=${M}.${m}.${p - } <${M}.${m}.${+p + 1}-0` - } else { - ret = `>=${M}.${m}.${p - } <${M}.${+m + 1}.0-0` - } - } else { - ret = `>=${M}.${m}.${p - } <${+M + 1}.0.0-0` - } - } - - debug('caret return', ret) - return ret - }) -} - -const replaceXRanges = (comp, options) => { - debug('replaceXRanges', comp, options) - return comp - .split(/\s+/) - .map((c) => replaceXRange(c, options)) - .join(' ') -} - -const replaceXRange = (comp, options) => { - comp = comp.trim() - const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE] - return comp.replace(r, (ret, gtlt, M, m, p, pr) => { - debug('xRange', comp, ret, gtlt, M, m, p, pr) - if (invalidXRangeOrder(M, m, p)) { - return comp - } - - const xM = isX(M) - const xm = xM || isX(m) - const xp = xm || isX(p) - const anyX = xp - - if (gtlt === '=' && anyX) { - gtlt = '' - } - - // if we're including prereleases in the match, then we need - // to fix this to -0, the lowest possible prerelease value - pr = options.includePrerelease ? '-0' : '' - - if (xM) { - if (gtlt === '>' || gtlt === '<') { - // nothing is allowed - ret = '<0.0.0-0' - } else { - // nothing is forbidden - ret = '*' - } - } else if (gtlt && anyX) { - // we know patch is an x, because we have any x at all. - // replace X with 0 - if (xm) { - m = 0 - } - p = 0 - - if (gtlt === '>') { - // >1 => >=2.0.0 - // >1.2 => >=1.3.0 - gtlt = '>=' - if (xm) { - M = +M + 1 - m = 0 - p = 0 - } else { - m = +m + 1 - p = 0 - } - } else if (gtlt === '<=') { - // <=0.7.x is actually <0.8.0, since any 0.7.x should - // pass. Similarly, <=7.x is actually <8.0.0, etc. - gtlt = '<' - if (xm) { - M = +M + 1 - } else { - m = +m + 1 - } - } - - if (gtlt === '<') { - pr = '-0' - } - - ret = `${gtlt + M}.${m}.${p}${pr}` - } else if (xm) { - ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0` - } else if (xp) { - ret = `>=${M}.${m}.0${pr - } <${M}.${+m + 1}.0-0` - } - - debug('xRange return', ret) - - return ret - }) -} - -// Because * is AND-ed with everything else in the comparator, -// and '' means "any version", just remove the *s entirely. -const replaceStars = (comp, options) => { - debug('replaceStars', comp, options) - // Looseness is ignored here. star is always as loose as it gets! - return comp - .trim() - .replace(re[t.STAR], '') -} - -const replaceGTE0 = (comp, options) => { - debug('replaceGTE0', comp, options) - return comp - .trim() - .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '') -} - -// This function is passed to string.replace(re[t.HYPHENRANGE]) -// M, m, patch, prerelease, build -// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 -// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do -// 1.2 - 3.4 => >=1.2.0 <3.5.0-0 -// TODO build? -const hyphenReplace = incPr => ($0, - from, fM, fm, fp, fpr, fb, - to, tM, tm, tp, tpr) => { - if (isX(fM)) { - from = '' - } else if (isX(fm)) { - from = `>=${fM}.0.0${incPr ? '-0' : ''}` - } else if (isX(fp)) { - from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}` - } else if (fpr) { - from = `>=${from}` - } else { - from = `>=${from}${incPr ? '-0' : ''}` - } - - if (isX(tM)) { - to = '' - } else if (isX(tm)) { - to = `<${+tM + 1}.0.0-0` - } else if (isX(tp)) { - to = `<${tM}.${+tm + 1}.0-0` - } else if (tpr) { - to = `<=${tM}.${tm}.${tp}-${tpr}` - } else if (incPr) { - to = `<${tM}.${tm}.${+tp + 1}-0` - } else { - to = `<=${to}` - } - - return `${from} ${to}`.trim() -} - -const testSet = (set, version, options) => { - for (let i = 0; i < set.length; i++) { - if (!set[i].test(version)) { - return false - } - } - - if (version.prerelease.length && !options.includePrerelease) { - // Find the set of versions that are allowed to have prereleases - // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 - // That should allow `1.2.3-pr.2` to pass. - // However, `1.2.4-alpha.notready` should NOT be allowed, - // even though it's within the range set by the comparators. - for (let i = 0; i < set.length; i++) { - debug(set[i].semver) - if (set[i].semver === Comparator.ANY) { - continue - } - - if (set[i].semver.prerelease.length > 0) { - const allowed = set[i].semver - if (allowed.major === version.major && - allowed.minor === version.minor && - allowed.patch === version.patch) { - return true - } - } - } - - // Version has a -pre, but it's not one of the ones we like. - return false - } - - return true -} - - -/***/ }), - -/***/ 7163: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const debug = __nccwpck_require__(1159) -const { MAX_LENGTH, MAX_SAFE_INTEGER } = __nccwpck_require__(5101) -const { safeRe: re, t } = __nccwpck_require__(5471) - -const parseOptions = __nccwpck_require__(356) -const { compareIdentifiers } = __nccwpck_require__(3348) - -const isPrereleaseIdentifier = (prerelease, identifier) => { - const identifiers = identifier.split('.') - if (identifiers.length > prerelease.length) { - return false - } - - for (let i = 0; i < identifiers.length; i++) { - if (compareIdentifiers(prerelease[i], identifiers[i]) !== 0) { - return false - } - } - - return true -} - -class SemVer { - constructor (version, options) { - options = parseOptions(options) - - if (version instanceof SemVer) { - if (version.loose === !!options.loose && - version.includePrerelease === !!options.includePrerelease) { - return version - } else { - version = version.version - } - } else if (typeof version !== 'string') { - throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version}".`) - } - - if (version.length > MAX_LENGTH) { - throw new TypeError( - `version is longer than ${MAX_LENGTH} characters` - ) - } - - debug('SemVer', version, options) - this.options = options - this.loose = !!options.loose - // this isn't actually relevant for versions, but keep it so that we - // don't run into trouble passing this.options around. - this.includePrerelease = !!options.includePrerelease - - const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]) - - if (!m) { - throw new TypeError(`Invalid Version: ${version}`) - } - - this.raw = version - - // these are actually numbers - this.major = +m[1] - this.minor = +m[2] - this.patch = +m[3] - - if (this.major > MAX_SAFE_INTEGER || this.major < 0) { - throw new TypeError('Invalid major version') - } - - if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { - throw new TypeError('Invalid minor version') - } - - if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { - throw new TypeError('Invalid patch version') - } - - // numberify any prerelease numeric ids - if (!m[4]) { - this.prerelease = [] - } else { - this.prerelease = m[4].split('.').map((id) => { - if (/^[0-9]+$/.test(id)) { - const num = +id - if (num >= 0 && num < MAX_SAFE_INTEGER) { - return num - } - } - return id - }) - } - - this.build = m[5] ? m[5].split('.') : [] - this.format() - } - - format () { - this.version = `${this.major}.${this.minor}.${this.patch}` - if (this.prerelease.length) { - this.version += `-${this.prerelease.join('.')}` - } - return this.version - } - - toString () { - return this.version - } - - compare (other) { - debug('SemVer.compare', this.version, this.options, other) - if (!(other instanceof SemVer)) { - if (typeof other === 'string' && other === this.version) { - return 0 - } - other = new SemVer(other, this.options) - } - - if (other.version === this.version) { - return 0 - } - - return this.compareMain(other) || this.comparePre(other) - } - - compareMain (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - if (this.major < other.major) { - return -1 - } - if (this.major > other.major) { - return 1 - } - if (this.minor < other.minor) { - return -1 - } - if (this.minor > other.minor) { - return 1 - } - if (this.patch < other.patch) { - return -1 - } - if (this.patch > other.patch) { - return 1 - } - return 0 - } - - comparePre (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - // NOT having a prerelease is > having one - if (this.prerelease.length && !other.prerelease.length) { - return -1 - } else if (!this.prerelease.length && other.prerelease.length) { - return 1 - } else if (!this.prerelease.length && !other.prerelease.length) { - return 0 - } - - let i = 0 - do { - const a = this.prerelease[i] - const b = other.prerelease[i] - debug('prerelease compare', i, a, b) - if (a === undefined && b === undefined) { - return 0 - } else if (b === undefined) { - return 1 - } else if (a === undefined) { - return -1 - } else if (a === b) { - continue - } else { - return compareIdentifiers(a, b) - } - } while (++i) - } - - compareBuild (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - let i = 0 - do { - const a = this.build[i] - const b = other.build[i] - debug('build compare', i, a, b) - if (a === undefined && b === undefined) { - return 0 - } else if (b === undefined) { - return 1 - } else if (a === undefined) { - return -1 - } else if (a === b) { - continue - } else { - return compareIdentifiers(a, b) - } - } while (++i) - } - - // preminor will bump the version up to the next minor release, and immediately - // down to pre-release. premajor and prepatch work the same way. - inc (release, identifier, identifierBase) { - if (release.startsWith('pre')) { - if (!identifier && identifierBase === false) { - throw new Error('invalid increment argument: identifier is empty') - } - // Avoid an invalid semver results - if (identifier) { - const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE]) - if (!match || match[1] !== identifier) { - throw new Error(`invalid identifier: ${identifier}`) - } - } - } - - switch (release) { - case 'premajor': - this.prerelease.length = 0 - this.patch = 0 - this.minor = 0 - this.major++ - this.inc('pre', identifier, identifierBase) - break - case 'preminor': - this.prerelease.length = 0 - this.patch = 0 - this.minor++ - this.inc('pre', identifier, identifierBase) - break - case 'prepatch': - // If this is already a prerelease, it will bump to the next version - // drop any prereleases that might already exist, since they are not - // relevant at this point. - this.prerelease.length = 0 - this.inc('patch', identifier, identifierBase) - this.inc('pre', identifier, identifierBase) - break - // If the input is a non-prerelease version, this acts the same as - // prepatch. - case 'prerelease': - if (this.prerelease.length === 0) { - this.inc('patch', identifier, identifierBase) - } - this.inc('pre', identifier, identifierBase) - break - case 'release': - if (this.prerelease.length === 0) { - throw new Error(`version ${this.raw} is not a prerelease`) - } - this.prerelease.length = 0 - break - - case 'major': - // If this is a pre-major version, bump up to the same major version. - // Otherwise increment major. - // 1.0.0-5 bumps to 1.0.0 - // 1.1.0 bumps to 2.0.0 - if ( - this.minor !== 0 || - this.patch !== 0 || - this.prerelease.length === 0 - ) { - this.major++ - } - this.minor = 0 - this.patch = 0 - this.prerelease = [] - break - case 'minor': - // If this is a pre-minor version, bump up to the same minor version. - // Otherwise increment minor. - // 1.2.0-5 bumps to 1.2.0 - // 1.2.1 bumps to 1.3.0 - if (this.patch !== 0 || this.prerelease.length === 0) { - this.minor++ - } - this.patch = 0 - this.prerelease = [] - break - case 'patch': - // If this is not a pre-release version, it will increment the patch. - // If it is a pre-release it will bump up to the same patch version. - // 1.2.0-5 patches to 1.2.0 - // 1.2.0 patches to 1.2.1 - if (this.prerelease.length === 0) { - this.patch++ - } - this.prerelease = [] - break - // This probably shouldn't be used publicly. - // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction. - case 'pre': { - const base = Number(identifierBase) ? 1 : 0 - - if (this.prerelease.length === 0) { - this.prerelease = [base] - } else { - let i = this.prerelease.length - while (--i >= 0) { - if (typeof this.prerelease[i] === 'number') { - this.prerelease[i]++ - i = -2 - } - } - if (i === -1) { - // didn't increment anything - if (identifier === this.prerelease.join('.') && identifierBase === false) { - throw new Error('invalid increment argument: identifier already exists') - } - this.prerelease.push(base) - } - } - if (identifier) { - // 1.2.0-beta.1 bumps to 1.2.0-beta.2, - // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 - let prerelease = [identifier, base] - if (identifierBase === false) { - prerelease = [identifier] - } - if (isPrereleaseIdentifier(this.prerelease, identifier)) { - const prereleaseBase = this.prerelease[identifier.split('.').length] - if (isNaN(prereleaseBase)) { - this.prerelease = prerelease - } - } else { - this.prerelease = prerelease - } - } - break - } - default: - throw new Error(`invalid increment argument: ${release}`) - } - this.raw = this.format() - if (this.build.length) { - this.raw += `+${this.build.join('.')}` - } - return this - } -} - -module.exports = SemVer - - -/***/ }), - -/***/ 1799: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const parse = __nccwpck_require__(6353) -const clean = (version, options) => { - const s = parse(version.trim().replace(/^[=v]+/, ''), options) - return s ? s.version : null -} -module.exports = clean - - -/***/ }), - -/***/ 6265: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const eq = __nccwpck_require__(5082) -const neq = __nccwpck_require__(4974) -const gt = __nccwpck_require__(6599) -const gte = __nccwpck_require__(1236) -const lt = __nccwpck_require__(3872) -const lte = __nccwpck_require__(6717) - -const cmp = (a, op, b, loose) => { - switch (op) { - case '===': - if (typeof a === 'object') { - a = a.version - } - if (typeof b === 'object') { - b = b.version - } - return a === b - - case '!==': - if (typeof a === 'object') { - a = a.version - } - if (typeof b === 'object') { - b = b.version - } - return a !== b - - case '': - case '=': - case '==': - return eq(a, b, loose) - - case '!=': - return neq(a, b, loose) - - case '>': - return gt(a, b, loose) - - case '>=': - return gte(a, b, loose) - - case '<': - return lt(a, b, loose) - - case '<=': - return lte(a, b, loose) - - default: - throw new TypeError(`Invalid operator: ${op}`) - } -} -module.exports = cmp - - -/***/ }), - -/***/ 7766: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const SemVer = __nccwpck_require__(7163) -const parse = __nccwpck_require__(6353) -const { safeRe: re, t } = __nccwpck_require__(5471) - -const coerce = (version, options) => { - if (version instanceof SemVer) { - return version - } - - if (typeof version === 'number') { - version = String(version) - } - - if (typeof version !== 'string') { - return null - } - - options = options || {} - - let match = null - if (!options.rtl) { - match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE]) - } else { - // Find the right-most coercible string that does not share - // a terminus with a more left-ward coercible string. - // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4' - // With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4' - // - // Walk through the string checking with a /g regexp - // Manually set the index so as to pick up overlapping matches. - // Stop when we get a match that ends at the string end, since no - // coercible string can be more right-ward without the same terminus. - const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL] - let next - while ((next = coerceRtlRegex.exec(version)) && - (!match || match.index + match[0].length !== version.length) - ) { - if (!match || - next.index + next[0].length !== match.index + match[0].length) { - match = next - } - coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length - } - // leave it in a clean state - coerceRtlRegex.lastIndex = -1 - } - - if (match === null) { - return null - } - - const major = match[2] - const minor = match[3] || '0' - const patch = match[4] || '0' - const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : '' - const build = options.includePrerelease && match[6] ? `+${match[6]}` : '' - - return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options) -} -module.exports = coerce - - -/***/ }), - -/***/ 7648: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const SemVer = __nccwpck_require__(7163) -const compareBuild = (a, b, loose) => { - const versionA = new SemVer(a, loose) - const versionB = new SemVer(b, loose) - return versionA.compare(versionB) || versionA.compareBuild(versionB) -} -module.exports = compareBuild - - -/***/ }), - -/***/ 6874: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const compare = __nccwpck_require__(8469) -const compareLoose = (a, b) => compare(a, b, true) -module.exports = compareLoose - - -/***/ }), - -/***/ 8469: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const SemVer = __nccwpck_require__(7163) -const compare = (a, b, loose) => - new SemVer(a, loose).compare(new SemVer(b, loose)) - -module.exports = compare - - -/***/ }), - -/***/ 711: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const parse = __nccwpck_require__(6353) - -const diff = (version1, version2) => { - const v1 = parse(version1, null, true) - const v2 = parse(version2, null, true) - const comparison = v1.compare(v2) - - if (comparison === 0) { - return null - } - - const v1Higher = comparison > 0 - const highVersion = v1Higher ? v1 : v2 - const lowVersion = v1Higher ? v2 : v1 - const highHasPre = !!highVersion.prerelease.length - const lowHasPre = !!lowVersion.prerelease.length - - if (lowHasPre && !highHasPre) { - // Going from prerelease -> no prerelease requires some special casing - - // If the low version has only a major, then it will always be a major - // Some examples: - // 1.0.0-1 -> 1.0.0 - // 1.0.0-1 -> 1.1.1 - // 1.0.0-1 -> 2.0.0 - if (!lowVersion.patch && !lowVersion.minor) { - return 'major' - } - - // If the main part has no difference - if (lowVersion.compareMain(highVersion) === 0) { - if (lowVersion.minor && !lowVersion.patch) { - return 'minor' - } - return 'patch' - } - } - - // add the `pre` prefix if we are going to a prerelease version - const prefix = highHasPre ? 'pre' : '' - - if (v1.major !== v2.major) { - return prefix + 'major' - } - - if (v1.minor !== v2.minor) { - return prefix + 'minor' - } - - if (v1.patch !== v2.patch) { - return prefix + 'patch' - } - - // high and low are prereleases - return 'prerelease' -} - -module.exports = diff - - -/***/ }), - -/***/ 5082: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const compare = __nccwpck_require__(8469) -const eq = (a, b, loose) => compare(a, b, loose) === 0 -module.exports = eq - - -/***/ }), - -/***/ 6599: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const compare = __nccwpck_require__(8469) -const gt = (a, b, loose) => compare(a, b, loose) > 0 -module.exports = gt - - -/***/ }), - -/***/ 1236: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const compare = __nccwpck_require__(8469) -const gte = (a, b, loose) => compare(a, b, loose) >= 0 -module.exports = gte - - -/***/ }), - -/***/ 2338: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const SemVer = __nccwpck_require__(7163) - -const inc = (version, release, options, identifier, identifierBase) => { - if (typeof (options) === 'string') { - identifierBase = identifier - identifier = options - options = undefined - } - - try { - return new SemVer( - version instanceof SemVer ? version.version : version, - options - ).inc(release, identifier, identifierBase).version - } catch (er) { - return null - } -} -module.exports = inc - - -/***/ }), - -/***/ 3872: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const compare = __nccwpck_require__(8469) -const lt = (a, b, loose) => compare(a, b, loose) < 0 -module.exports = lt - - -/***/ }), - -/***/ 6717: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const compare = __nccwpck_require__(8469) -const lte = (a, b, loose) => compare(a, b, loose) <= 0 -module.exports = lte - - -/***/ }), - -/***/ 8511: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const SemVer = __nccwpck_require__(7163) -const major = (a, loose) => new SemVer(a, loose).major -module.exports = major - - -/***/ }), - -/***/ 2603: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const SemVer = __nccwpck_require__(7163) -const minor = (a, loose) => new SemVer(a, loose).minor -module.exports = minor - - -/***/ }), - -/***/ 4974: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const compare = __nccwpck_require__(8469) -const neq = (a, b, loose) => compare(a, b, loose) !== 0 -module.exports = neq - - -/***/ }), - -/***/ 6353: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const SemVer = __nccwpck_require__(7163) -const parse = (version, options, throwErrors = false) => { - if (version instanceof SemVer) { - return version - } - try { - return new SemVer(version, options) - } catch (er) { - if (!throwErrors) { - return null - } - throw er - } -} - -module.exports = parse - - -/***/ }), - -/***/ 8756: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const SemVer = __nccwpck_require__(7163) -const patch = (a, loose) => new SemVer(a, loose).patch -module.exports = patch - - -/***/ }), - -/***/ 5714: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const parse = __nccwpck_require__(6353) -const prerelease = (version, options) => { - const parsed = parse(version, options) - return (parsed && parsed.prerelease.length) ? parsed.prerelease : null -} -module.exports = prerelease - - -/***/ }), - -/***/ 2173: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const compare = __nccwpck_require__(8469) -const rcompare = (a, b, loose) => compare(b, a, loose) -module.exports = rcompare - - -/***/ }), - -/***/ 7192: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const compareBuild = __nccwpck_require__(7648) -const rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose)) -module.exports = rsort - - -/***/ }), - -/***/ 8011: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const Range = __nccwpck_require__(6782) -const satisfies = (version, range, options) => { - try { - range = new Range(range, options) - } catch (er) { - return false - } - return range.test(version) -} -module.exports = satisfies - - -/***/ }), - -/***/ 9872: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const compareBuild = __nccwpck_require__(7648) -const sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose)) -module.exports = sort - - -/***/ }), - -/***/ 6114: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const parse = __nccwpck_require__(6353) -const constants = __nccwpck_require__(5101) -const SemVer = __nccwpck_require__(7163) - -const truncate = (version, truncation, options) => { - if (!constants.RELEASE_TYPES.includes(truncation)) { - return null - } - - const clonedVersion = cloneInputVersion(version, options) - return clonedVersion && doTruncation(clonedVersion, truncation) -} - -const cloneInputVersion = (version, options) => { - const versionStringToParse = ( - version instanceof SemVer ? version.version : version - ) - - return parse(versionStringToParse, options) -} - -const doTruncation = (version, truncation) => { - if (isPrerelease(truncation)) { - return version.version - } - - version.prerelease = [] - - switch (truncation) { - case 'major': - version.minor = 0 - version.patch = 0 - break - case 'minor': - version.patch = 0 - break - } - - return version.format() -} - -const isPrerelease = (type) => { - return type.startsWith('pre') -} - -module.exports = truncate - - -/***/ }), - -/***/ 8780: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const parse = __nccwpck_require__(6353) -const valid = (version, options) => { - const v = parse(version, options) - return v ? v.version : null -} -module.exports = valid - - -/***/ }), - -/***/ 2088: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -// just pre-load all the stuff that index.js lazily exports -const internalRe = __nccwpck_require__(5471) -const constants = __nccwpck_require__(5101) -const SemVer = __nccwpck_require__(7163) -const identifiers = __nccwpck_require__(3348) -const parse = __nccwpck_require__(6353) -const valid = __nccwpck_require__(8780) -const clean = __nccwpck_require__(1799) -const inc = __nccwpck_require__(2338) -const diff = __nccwpck_require__(711) -const major = __nccwpck_require__(8511) -const minor = __nccwpck_require__(2603) -const patch = __nccwpck_require__(8756) -const prerelease = __nccwpck_require__(5714) -const compare = __nccwpck_require__(8469) -const rcompare = __nccwpck_require__(2173) -const compareLoose = __nccwpck_require__(6874) -const compareBuild = __nccwpck_require__(7648) -const sort = __nccwpck_require__(9872) -const rsort = __nccwpck_require__(7192) -const gt = __nccwpck_require__(6599) -const lt = __nccwpck_require__(3872) -const eq = __nccwpck_require__(5082) -const neq = __nccwpck_require__(4974) -const gte = __nccwpck_require__(1236) -const lte = __nccwpck_require__(6717) -const cmp = __nccwpck_require__(6265) -const coerce = __nccwpck_require__(7766) -const truncate = __nccwpck_require__(6114) -const Comparator = __nccwpck_require__(9379) -const Range = __nccwpck_require__(6782) -const satisfies = __nccwpck_require__(8011) -const toComparators = __nccwpck_require__(4750) -const maxSatisfying = __nccwpck_require__(5574) -const minSatisfying = __nccwpck_require__(8595) -const minVersion = __nccwpck_require__(1866) -const validRange = __nccwpck_require__(7118) -const outside = __nccwpck_require__(280) -const gtr = __nccwpck_require__(2276) -const ltr = __nccwpck_require__(5213) -const intersects = __nccwpck_require__(3465) -const simplifyRange = __nccwpck_require__(2028) -const subset = __nccwpck_require__(1489) -module.exports = { - parse, - valid, - clean, - inc, - diff, - major, - minor, - patch, - prerelease, - compare, - rcompare, - compareLoose, - compareBuild, - sort, - rsort, - gt, - lt, - eq, - neq, - gte, - lte, - cmp, - coerce, - truncate, - Comparator, - Range, - satisfies, - toComparators, - maxSatisfying, - minSatisfying, - minVersion, - validRange, - outside, - gtr, - ltr, - intersects, - simplifyRange, - subset, - SemVer, - re: internalRe.re, - src: internalRe.src, - tokens: internalRe.t, - SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION, - RELEASE_TYPES: constants.RELEASE_TYPES, - compareIdentifiers: identifiers.compareIdentifiers, - rcompareIdentifiers: identifiers.rcompareIdentifiers, -} - - -/***/ }), - -/***/ 5101: -/***/ ((module) => { - - - -// Note: this is the semver.org version of the spec that it implements -// Not necessarily the package version of this code. -const SEMVER_SPEC_VERSION = '2.0.0' - -const MAX_LENGTH = 256 -const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || -/* istanbul ignore next */ 9007199254740991 - -// Max safe segment length for coercion. -const MAX_SAFE_COMPONENT_LENGTH = 16 - -// Max safe length for a build identifier. The max length minus 6 characters for -// the shortest version with a build 0.0.0+BUILD. -const MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6 - -const RELEASE_TYPES = [ - 'major', - 'premajor', - 'minor', - 'preminor', - 'patch', - 'prepatch', - 'prerelease', -] - -module.exports = { - MAX_LENGTH, - MAX_SAFE_COMPONENT_LENGTH, - MAX_SAFE_BUILD_LENGTH, - MAX_SAFE_INTEGER, - RELEASE_TYPES, - SEMVER_SPEC_VERSION, - FLAG_INCLUDE_PRERELEASE: 0b001, - FLAG_LOOSE: 0b010, -} - - -/***/ }), - -/***/ 1159: -/***/ ((module) => { - - - -const debug = ( - typeof process === 'object' && - process.env && - process.env.NODE_DEBUG && - /\bsemver\b/i.test(process.env.NODE_DEBUG) -) ? (...args) => console.error('SEMVER', ...args) - : () => {} - -module.exports = debug - - -/***/ }), - -/***/ 3348: -/***/ ((module) => { - - - -const numeric = /^[0-9]+$/ -const compareIdentifiers = (a, b) => { - if (typeof a === 'number' && typeof b === 'number') { - return a === b ? 0 : a < b ? -1 : 1 - } - - const anum = numeric.test(a) - const bnum = numeric.test(b) - - if (anum && bnum) { - a = +a - b = +b - } - - return a === b ? 0 - : (anum && !bnum) ? -1 - : (bnum && !anum) ? 1 - : a < b ? -1 - : 1 -} - -const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a) - -module.exports = { - compareIdentifiers, - rcompareIdentifiers, -} - - -/***/ }), - -/***/ 1383: -/***/ ((module) => { - - - -class LRUCache { - constructor () { - this.max = 1000 - this.map = new Map() - } - - get (key) { - const value = this.map.get(key) - if (value === undefined) { - return undefined - } else { - // Remove the key from the map and add it to the end - this.map.delete(key) - this.map.set(key, value) - return value - } - } - - delete (key) { - return this.map.delete(key) - } - - set (key, value) { - const deleted = this.delete(key) - - if (!deleted && value !== undefined) { - // If cache is full, delete the least recently used item - if (this.map.size >= this.max) { - const firstKey = this.map.keys().next().value - this.delete(firstKey) - } - - this.map.set(key, value) - } - - return this - } -} - -module.exports = LRUCache - - -/***/ }), - -/***/ 356: -/***/ ((module) => { - - - -// parse out just the options we care about -const looseOption = Object.freeze({ loose: true }) -const emptyOpts = Object.freeze({ }) -const parseOptions = options => { - if (!options) { - return emptyOpts - } - - if (typeof options !== 'object') { - return looseOption - } - - return options -} -module.exports = parseOptions - - -/***/ }), - -/***/ 5471: -/***/ ((module, exports, __nccwpck_require__) => { - - - -const { - MAX_SAFE_COMPONENT_LENGTH, - MAX_SAFE_BUILD_LENGTH, - MAX_LENGTH, -} = __nccwpck_require__(5101) -const debug = __nccwpck_require__(1159) -exports = module.exports = {} - -// The actual regexps go on exports.re -const re = exports.re = [] -const safeRe = exports.safeRe = [] -const src = exports.src = [] -const safeSrc = exports.safeSrc = [] -const t = exports.t = {} -let R = 0 - -const LETTERDASHNUMBER = '[a-zA-Z0-9-]' - -// Replace some greedy regex tokens to prevent regex dos issues. These regex are -// used internally via the safeRe object since all inputs in this library get -// normalized first to trim and collapse all extra whitespace. The original -// regexes are exported for userland consumption and lower level usage. A -// future breaking change could export the safer regex only with a note that -// all input should have extra whitespace removed. -const safeRegexReplacements = [ - ['\\s', 1], - ['\\d', MAX_LENGTH], - [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH], -] - -const makeSafeRegex = (value) => { - for (const [token, max] of safeRegexReplacements) { - value = value - .split(`${token}*`).join(`${token}{0,${max}}`) - .split(`${token}+`).join(`${token}{1,${max}}`) - } - return value -} - -const createToken = (name, value, isGlobal) => { - const safe = makeSafeRegex(value) - const index = R++ - debug(name, index, value) - t[name] = index - src[index] = value - safeSrc[index] = safe - re[index] = new RegExp(value, isGlobal ? 'g' : undefined) - safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined) -} - -// The following Regular Expressions can be used for tokenizing, -// validating, and parsing SemVer version strings. - -// ## Numeric Identifier -// A single `0`, or a non-zero digit followed by zero or more digits. - -createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*') -createToken('NUMERICIDENTIFIERLOOSE', '\\d+') - -// ## Non-numeric Identifier -// Zero or more digits, followed by a letter or hyphen, and then zero or -// more letters, digits, or hyphens. - -createToken('NONNUMERICIDENTIFIER', `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`) - -// ## Main Version -// Three dot-separated numeric identifiers. - -createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` + - `(${src[t.NUMERICIDENTIFIER]})\\.` + - `(${src[t.NUMERICIDENTIFIER]})`) - -createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + - `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + - `(${src[t.NUMERICIDENTIFIERLOOSE]})`) - -// ## Pre-release Version Identifier -// A numeric identifier, or a non-numeric identifier. -// Non-numeric identifiers include numeric identifiers but can be longer. -// Therefore non-numeric identifiers must go first. - -createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NONNUMERICIDENTIFIER] -}|${src[t.NUMERICIDENTIFIER]})`) - -createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NONNUMERICIDENTIFIER] -}|${src[t.NUMERICIDENTIFIERLOOSE]})`) - -// ## Pre-release Version -// Hyphen, followed by one or more dot-separated pre-release version -// identifiers. - -createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER] -}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`) - -createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE] -}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`) - -// ## Build Metadata Identifier -// Any combination of digits, letters, or hyphens. - -createToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`) - -// ## Build Metadata -// Plus sign, followed by one or more period-separated build metadata -// identifiers. - -createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER] -}(?:\\.${src[t.BUILDIDENTIFIER]})*))`) - -// ## Full Version String -// A main version, followed optionally by a pre-release version and -// build metadata. - -// Note that the only major, minor, patch, and pre-release sections of -// the version string are capturing groups. The build metadata is not a -// capturing group, because it should not ever be used in version -// comparison. - -createToken('FULLPLAIN', `v?${src[t.MAINVERSION] -}${src[t.PRERELEASE]}?${ - src[t.BUILD]}?`) - -createToken('FULL', `^${src[t.FULLPLAIN]}$`) - -// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. -// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty -// common in the npm registry. -createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE] -}${src[t.PRERELEASELOOSE]}?${ - src[t.BUILD]}?`) - -createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`) - -createToken('GTLT', '((?:<|>)?=?)') - -// Something like "2.*" or "1.2.x". -// Note that "x.x" is a valid xRange identifier, meaning "any version" -// Only the first item is strictly required. -createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`) -createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`) - -createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + - `(?:${src[t.PRERELEASE]})?${ - src[t.BUILD]}?` + - `)?)?`) - -createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:${src[t.PRERELEASELOOSE]})?${ - src[t.BUILD]}?` + - `)?)?`) - -createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`) -createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`) - -// Coercion. -// Extract anything that could conceivably be a part of a valid semver -createToken('COERCEPLAIN', `${'(^|[^\\d])' + - '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` + - `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + - `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`) -createToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\d])`) -createToken('COERCEFULL', src[t.COERCEPLAIN] + - `(?:${src[t.PRERELEASE]})?` + - `(?:${src[t.BUILD]})?` + - `(?:$|[^\\d])`) -createToken('COERCERTL', src[t.COERCE], true) -createToken('COERCERTLFULL', src[t.COERCEFULL], true) - -// Tilde ranges. -// Meaning is "reasonably at or greater than" -createToken('LONETILDE', '(?:~>?)') - -createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true) -exports.tildeTrimReplace = '$1~' - -createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`) -createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`) - -// Caret ranges. -// Meaning is "at least and backwards compatible with" -createToken('LONECARET', '(?:\\^)') - -createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true) -exports.caretTrimReplace = '$1^' - -createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`) -createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`) - -// A simple gt/lt/eq thing, or just "" to indicate "any version" -createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`) -createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`) - -// An expression to strip any whitespace between the gtlt and the thing -// it modifies, so that `> 1.2.3` ==> `>1.2.3` -createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT] -}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true) -exports.comparatorTrimReplace = '$1$2$3' - -// Something like `1.2.3 - 1.2.4` -// Note that these all use the loose form, because they'll be -// checked against either the strict or loose comparator form -// later. -createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` + - `\\s+-\\s+` + - `(${src[t.XRANGEPLAIN]})` + - `\\s*$`) - -createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` + - `\\s+-\\s+` + - `(${src[t.XRANGEPLAINLOOSE]})` + - `\\s*$`) - -// Star ranges basically just allow anything at all. -createToken('STAR', '(<|>)?=?\\s*\\*') -// >=0.0.0 is like a star -createToken('GTE0', '^\\s*>=\\s*0\\.0\\.0\\s*$') -createToken('GTE0PRE', '^\\s*>=\\s*0\\.0\\.0-0\\s*$') - - -/***/ }), - -/***/ 2276: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -// Determine if version is greater than all the versions possible in the range. -const outside = __nccwpck_require__(280) -const gtr = (version, range, options) => outside(version, range, '>', options) -module.exports = gtr - - -/***/ }), - -/***/ 3465: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const Range = __nccwpck_require__(6782) -const intersects = (r1, r2, options) => { - r1 = new Range(r1, options) - r2 = new Range(r2, options) - return r1.intersects(r2, options) -} -module.exports = intersects - - -/***/ }), - -/***/ 5213: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const outside = __nccwpck_require__(280) -// Determine if version is less than all the versions possible in the range -const ltr = (version, range, options) => outside(version, range, '<', options) -module.exports = ltr - - -/***/ }), - -/***/ 5574: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const SemVer = __nccwpck_require__(7163) -const Range = __nccwpck_require__(6782) - -const maxSatisfying = (versions, range, options) => { - let max = null - let maxSV = null - let rangeObj = null - try { - rangeObj = new Range(range, options) - } catch (er) { - return null - } - versions.forEach((v) => { - if (rangeObj.test(v)) { - // satisfies(v, range, options) - if (!max || maxSV.compare(v) === -1) { - // compare(max, v, true) - max = v - maxSV = new SemVer(max, options) - } - } - }) - return max -} -module.exports = maxSatisfying - - -/***/ }), - -/***/ 8595: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const SemVer = __nccwpck_require__(7163) -const Range = __nccwpck_require__(6782) -const minSatisfying = (versions, range, options) => { - let min = null - let minSV = null - let rangeObj = null - try { - rangeObj = new Range(range, options) - } catch (er) { - return null - } - versions.forEach((v) => { - if (rangeObj.test(v)) { - // satisfies(v, range, options) - if (!min || minSV.compare(v) === 1) { - // compare(min, v, true) - min = v - minSV = new SemVer(min, options) - } - } - }) - return min -} -module.exports = minSatisfying - - -/***/ }), - -/***/ 1866: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const SemVer = __nccwpck_require__(7163) -const Range = __nccwpck_require__(6782) -const gt = __nccwpck_require__(6599) - -const minVersion = (range, loose) => { - range = new Range(range, loose) - - let minver = new SemVer('0.0.0') - if (range.test(minver)) { - return minver - } - - minver = new SemVer('0.0.0-0') - if (range.test(minver)) { - return minver - } - - minver = null - for (let i = 0; i < range.set.length; ++i) { - const comparators = range.set[i] - - let setMin = null - comparators.forEach((comparator) => { - // Clone to avoid manipulating the comparator's semver object. - const compver = new SemVer(comparator.semver.version) - switch (comparator.operator) { - case '>': - if (compver.prerelease.length === 0) { - compver.patch++ - } else { - compver.prerelease.push(0) - } - compver.raw = compver.format() - /* fallthrough */ - case '': - case '>=': - if (!setMin || gt(compver, setMin)) { - setMin = compver - } - break - case '<': - case '<=': - /* Ignore maximum versions */ - break - /* istanbul ignore next */ - default: - throw new Error(`Unexpected operation: ${comparator.operator}`) - } - }) - if (setMin && (!minver || gt(minver, setMin))) { - minver = setMin - } - } - - if (minver && range.test(minver)) { - return minver - } - - return null -} -module.exports = minVersion - - -/***/ }), - -/***/ 280: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const SemVer = __nccwpck_require__(7163) -const Comparator = __nccwpck_require__(9379) -const { ANY } = Comparator -const Range = __nccwpck_require__(6782) -const satisfies = __nccwpck_require__(8011) -const gt = __nccwpck_require__(6599) -const lt = __nccwpck_require__(3872) -const lte = __nccwpck_require__(6717) -const gte = __nccwpck_require__(1236) - -const outside = (version, range, hilo, options) => { - version = new SemVer(version, options) - range = new Range(range, options) - - let gtfn, ltefn, ltfn, comp, ecomp - switch (hilo) { - case '>': - gtfn = gt - ltefn = lte - ltfn = lt - comp = '>' - ecomp = '>=' - break - case '<': - gtfn = lt - ltefn = gte - ltfn = gt - comp = '<' - ecomp = '<=' - break - default: - throw new TypeError('Must provide a hilo val of "<" or ">"') - } - - // If it satisfies the range it is not outside - if (satisfies(version, range, options)) { - return false - } - - // From now on, variable terms are as if we're in "gtr" mode. - // but note that everything is flipped for the "ltr" function. - - for (let i = 0; i < range.set.length; ++i) { - const comparators = range.set[i] - - let high = null - let low = null - - comparators.forEach((comparator) => { - if (comparator.semver === ANY) { - comparator = new Comparator('>=0.0.0') - } - high = high || comparator - low = low || comparator - if (gtfn(comparator.semver, high.semver, options)) { - high = comparator - } else if (ltfn(comparator.semver, low.semver, options)) { - low = comparator - } - }) - - // If the edge version comparator has a operator then our version - // isn't outside it - if (high.operator === comp || high.operator === ecomp) { - return false - } - - // If the lowest version comparator has an operator and our version - // is less than it then it isn't higher than the range - if ((!low.operator || low.operator === comp) && - ltefn(version, low.semver)) { - return false - } else if (low.operator === ecomp && ltfn(version, low.semver)) { - return false - } - } - return true -} - -module.exports = outside - - -/***/ }), - -/***/ 2028: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -// given a set of versions and a range, create a "simplified" range -// that includes the same versions that the original range does -// If the original range is shorter than the simplified one, return that. -const satisfies = __nccwpck_require__(8011) -const compare = __nccwpck_require__(8469) -module.exports = (versions, range, options) => { - const set = [] - let first = null - let prev = null - const v = versions.sort((a, b) => compare(a, b, options)) - for (const version of v) { - const included = satisfies(version, range, options) - if (included) { - prev = version - if (!first) { - first = version - } - } else { - if (prev) { - set.push([first, prev]) - } - prev = null - first = null - } - } - if (first) { - set.push([first, null]) - } - - const ranges = [] - for (const [min, max] of set) { - if (min === max) { - ranges.push(min) - } else if (!max && min === v[0]) { - ranges.push('*') - } else if (!max) { - ranges.push(`>=${min}`) - } else if (min === v[0]) { - ranges.push(`<=${max}`) - } else { - ranges.push(`${min} - ${max}`) - } - } - const simplified = ranges.join(' || ') - const original = typeof range.raw === 'string' ? range.raw : String(range) - return simplified.length < original.length ? simplified : range -} - - -/***/ }), - -/***/ 1489: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const Range = __nccwpck_require__(6782) -const Comparator = __nccwpck_require__(9379) -const { ANY } = Comparator -const satisfies = __nccwpck_require__(8011) -const compare = __nccwpck_require__(8469) - -// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff: -// - Every simple range `r1, r2, ...` is a null set, OR -// - Every simple range `r1, r2, ...` which is not a null set is a subset of -// some `R1, R2, ...` -// -// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff: -// - If c is only the ANY comparator -// - If C is only the ANY comparator, return true -// - Else if in prerelease mode, return false -// - else replace c with `[>=0.0.0]` -// - If C is only the ANY comparator -// - if in prerelease mode, return true -// - else replace C with `[>=0.0.0]` -// - Let EQ be the set of = comparators in c -// - If EQ is more than one, return true (null set) -// - Let GT be the highest > or >= comparator in c -// - Let LT be the lowest < or <= comparator in c -// - If GT and LT, and GT.semver > LT.semver, return true (null set) -// - If any C is a = range, and GT or LT are set, return false -// - If EQ -// - If GT, and EQ does not satisfy GT, return true (null set) -// - If LT, and EQ does not satisfy LT, return true (null set) -// - If EQ satisfies every C, return true -// - Else return false -// - If GT -// - If GT.semver is lower than any > or >= comp in C, return false -// - If GT is >=, and GT.semver does not satisfy every C, return false -// - If GT.semver has a prerelease, and not in prerelease mode -// - If no C has a prerelease and the GT.semver tuple, return false -// - If LT -// - If LT.semver is greater than any < or <= comp in C, return false -// - If LT is <=, and LT.semver does not satisfy every C, return false -// - If LT.semver has a prerelease, and not in prerelease mode -// - If no C has a prerelease and the LT.semver tuple, return false -// - Else return true - -const subset = (sub, dom, options = {}) => { - if (sub === dom) { - return true - } - - sub = new Range(sub, options) - dom = new Range(dom, options) - let sawNonNull = false - - OUTER: for (const simpleSub of sub.set) { - for (const simpleDom of dom.set) { - const isSub = simpleSubset(simpleSub, simpleDom, options) - sawNonNull = sawNonNull || isSub !== null - if (isSub) { - continue OUTER - } - } - // the null set is a subset of everything, but null simple ranges in - // a complex range should be ignored. so if we saw a non-null range, - // then we know this isn't a subset, but if EVERY simple range was null, - // then it is a subset. - if (sawNonNull) { - return false - } - } - return true -} - -const minimumVersionWithPreRelease = [new Comparator('>=0.0.0-0')] -const minimumVersion = [new Comparator('>=0.0.0')] - -const simpleSubset = (sub, dom, options) => { - if (sub === dom) { - return true - } - - if (sub.length === 1 && sub[0].semver === ANY) { - if (dom.length === 1 && dom[0].semver === ANY) { - return true - } else if (options.includePrerelease) { - sub = minimumVersionWithPreRelease - } else { - sub = minimumVersion - } - } - - if (dom.length === 1 && dom[0].semver === ANY) { - if (options.includePrerelease) { - return true - } else { - dom = minimumVersion - } - } - - const eqSet = new Set() - let gt, lt - for (const c of sub) { - if (c.operator === '>' || c.operator === '>=') { - gt = higherGT(gt, c, options) - } else if (c.operator === '<' || c.operator === '<=') { - lt = lowerLT(lt, c, options) - } else { - eqSet.add(c.semver) - } - } - - if (eqSet.size > 1) { - return null - } - - let gtltComp - if (gt && lt) { - gtltComp = compare(gt.semver, lt.semver, options) - if (gtltComp > 0) { - return null - } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) { - return null - } - } - - // will iterate one or zero times - for (const eq of eqSet) { - if (gt && !satisfies(eq, String(gt), options)) { - return null - } - - if (lt && !satisfies(eq, String(lt), options)) { - return null - } - - for (const c of dom) { - if (!satisfies(eq, String(c), options)) { - return false - } - } - - return true - } - - let higher, lower - let hasDomLT, hasDomGT - // if the subset has a prerelease, we need a comparator in the superset - // with the same tuple and a prerelease, or it's not a subset - let needDomLTPre = lt && - !options.includePrerelease && - lt.semver.prerelease.length ? lt.semver : false - let needDomGTPre = gt && - !options.includePrerelease && - gt.semver.prerelease.length ? gt.semver : false - // exception: <1.2.3-0 is the same as <1.2.3 - if (needDomLTPre && needDomLTPre.prerelease.length === 1 && - lt.operator === '<' && needDomLTPre.prerelease[0] === 0) { - needDomLTPre = false - } - - for (const c of dom) { - hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>=' - hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<=' - if (gt) { - if (needDomGTPre) { - if (c.semver.prerelease && c.semver.prerelease.length && - c.semver.major === needDomGTPre.major && - c.semver.minor === needDomGTPre.minor && - c.semver.patch === needDomGTPre.patch) { - needDomGTPre = false - } - } - if (c.operator === '>' || c.operator === '>=') { - higher = higherGT(gt, c, options) - if (higher === c && higher !== gt) { - return false - } - } else if (gt.operator === '>=' && !c.test(gt.semver)) { - return false - } - } - if (lt) { - if (needDomLTPre) { - if (c.semver.prerelease && c.semver.prerelease.length && - c.semver.major === needDomLTPre.major && - c.semver.minor === needDomLTPre.minor && - c.semver.patch === needDomLTPre.patch) { - needDomLTPre = false - } - } - if (c.operator === '<' || c.operator === '<=') { - lower = lowerLT(lt, c, options) - if (lower === c && lower !== lt) { - return false - } - } else if (lt.operator === '<=' && !c.test(lt.semver)) { - return false - } - } - if (!c.operator && (lt || gt) && gtltComp !== 0) { - return false - } - } - - // if there was a < or >, and nothing in the dom, then must be false - // UNLESS it was limited by another range in the other direction. - // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0 - if (gt && hasDomLT && !lt && gtltComp !== 0) { - return false - } - - if (lt && hasDomGT && !gt && gtltComp !== 0) { - return false - } - - // we needed a prerelease range in a specific tuple, but didn't get one - // then this isn't a subset. eg >=1.2.3-pre is not a subset of >=1.0.0, - // because it includes prereleases in the 1.2.3 tuple - if (needDomGTPre || needDomLTPre) { - return false - } - - return true -} - -// >=1.2.3 is lower than >1.2.3 -const higherGT = (a, b, options) => { - if (!a) { - return b - } - const comp = compare(a.semver, b.semver, options) - return comp > 0 ? a - : comp < 0 ? b - : b.operator === '>' && a.operator === '>=' ? b - : a -} - -// <=1.2.3 is higher than <1.2.3 -const lowerLT = (a, b, options) => { - if (!a) { - return b - } - const comp = compare(a.semver, b.semver, options) - return comp < 0 ? a - : comp > 0 ? b - : b.operator === '<' && a.operator === '<=' ? b - : a -} - -module.exports = subset - - -/***/ }), - -/***/ 4750: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const Range = __nccwpck_require__(6782) - -// Mostly just for testing and legacy API reasons -const toComparators = (range, options) => - new Range(range, options).set - .map(comp => comp.map(c => c.value).join(' ').trim().split(' ')) - -module.exports = toComparators - - -/***/ }), - -/***/ 7118: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const Range = __nccwpck_require__(6782) -const validRange = (range, options) => { - try { - // Return '*' instead of '' so that truthiness works. - // This will throw if it's invalid anyway - return new Range(range, options).range || '*' - } catch (er) { - return null - } -} -module.exports = validRange - - -/***/ }), - -/***/ 770: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -module.exports = __nccwpck_require__(218); - - -/***/ }), - -/***/ 218: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -var __webpack_unused_export__; - - -var net = __nccwpck_require__(9278); -var tls = __nccwpck_require__(4756); -var http = __nccwpck_require__(8611); -var https = __nccwpck_require__(5692); -var events = __nccwpck_require__(4434); -var assert = __nccwpck_require__(2613); -var util = __nccwpck_require__(9023); - - -exports.httpOverHttp = httpOverHttp; -exports.httpsOverHttp = httpsOverHttp; -exports.httpOverHttps = httpOverHttps; -exports.httpsOverHttps = httpsOverHttps; - - -function httpOverHttp(options) { - var agent = new TunnelingAgent(options); - agent.request = http.request; - return agent; -} - -function httpsOverHttp(options) { - var agent = new TunnelingAgent(options); - agent.request = http.request; - agent.createSocket = createSecureSocket; - agent.defaultPort = 443; - return agent; -} - -function httpOverHttps(options) { - var agent = new TunnelingAgent(options); - agent.request = https.request; - return agent; -} - -function httpsOverHttps(options) { - var agent = new TunnelingAgent(options); - agent.request = https.request; - agent.createSocket = createSecureSocket; - agent.defaultPort = 443; - return agent; -} - - -function TunnelingAgent(options) { - var self = this; - self.options = options || {}; - self.proxyOptions = self.options.proxy || {}; - self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets; - self.requests = []; - self.sockets = []; - - self.on('free', function onFree(socket, host, port, localAddress) { - var options = toOptions(host, port, localAddress); - for (var i = 0, len = self.requests.length; i < len; ++i) { - var pending = self.requests[i]; - if (pending.host === options.host && pending.port === options.port) { - // Detect the request to connect same origin server, - // reuse the connection. - self.requests.splice(i, 1); - pending.request.onSocket(socket); - return; - } - } - socket.destroy(); - self.removeSocket(socket); - }); -} -util.inherits(TunnelingAgent, events.EventEmitter); - -TunnelingAgent.prototype.addRequest = function addRequest(req, host, port, localAddress) { - var self = this; - var options = mergeOptions({request: req}, self.options, toOptions(host, port, localAddress)); - - if (self.sockets.length >= this.maxSockets) { - // We are over limit so we'll add it to the queue. - self.requests.push(options); - return; - } - - // If we are under maxSockets create a new one. - self.createSocket(options, function(socket) { - socket.on('free', onFree); - socket.on('close', onCloseOrRemove); - socket.on('agentRemove', onCloseOrRemove); - req.onSocket(socket); - - function onFree() { - self.emit('free', socket, options); - } - - function onCloseOrRemove(err) { - self.removeSocket(socket); - socket.removeListener('free', onFree); - socket.removeListener('close', onCloseOrRemove); - socket.removeListener('agentRemove', onCloseOrRemove); - } - }); -}; - -TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { - var self = this; - var placeholder = {}; - self.sockets.push(placeholder); - - var connectOptions = mergeOptions({}, self.proxyOptions, { - method: 'CONNECT', - path: options.host + ':' + options.port, - agent: false, - headers: { - host: options.host + ':' + options.port - } - }); - if (options.localAddress) { - connectOptions.localAddress = options.localAddress; - } - if (connectOptions.proxyAuth) { - connectOptions.headers = connectOptions.headers || {}; - connectOptions.headers['Proxy-Authorization'] = 'Basic ' + - new Buffer(connectOptions.proxyAuth).toString('base64'); - } - - debug('making CONNECT request'); - var connectReq = self.request(connectOptions); - connectReq.useChunkedEncodingByDefault = false; // for v0.6 - connectReq.once('response', onResponse); // for v0.6 - connectReq.once('upgrade', onUpgrade); // for v0.6 - connectReq.once('connect', onConnect); // for v0.7 or later - connectReq.once('error', onError); - connectReq.end(); - - function onResponse(res) { - // Very hacky. This is necessary to avoid http-parser leaks. - res.upgrade = true; - } - - function onUpgrade(res, socket, head) { - // Hacky. - process.nextTick(function() { - onConnect(res, socket, head); - }); - } - - function onConnect(res, socket, head) { - connectReq.removeAllListeners(); - socket.removeAllListeners(); - - if (res.statusCode !== 200) { - debug('tunneling socket could not be established, statusCode=%d', - res.statusCode); - socket.destroy(); - var error = new Error('tunneling socket could not be established, ' + - 'statusCode=' + res.statusCode); - error.code = 'ECONNRESET'; - options.request.emit('error', error); - self.removeSocket(placeholder); - return; - } - if (head.length > 0) { - debug('got illegal response body from proxy'); - socket.destroy(); - var error = new Error('got illegal response body from proxy'); - error.code = 'ECONNRESET'; - options.request.emit('error', error); - self.removeSocket(placeholder); - return; - } - debug('tunneling connection has established'); - self.sockets[self.sockets.indexOf(placeholder)] = socket; - return cb(socket); - } - - function onError(cause) { - connectReq.removeAllListeners(); - - debug('tunneling socket could not be established, cause=%s\n', - cause.message, cause.stack); - var error = new Error('tunneling socket could not be established, ' + - 'cause=' + cause.message); - error.code = 'ECONNRESET'; - options.request.emit('error', error); - self.removeSocket(placeholder); - } -}; - -TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { - var pos = this.sockets.indexOf(socket) - if (pos === -1) { - return; - } - this.sockets.splice(pos, 1); - - var pending = this.requests.shift(); - if (pending) { - // If we have pending requests and a socket gets closed a new one - // needs to be created to take over in the pool for the one that closed. - this.createSocket(pending, function(socket) { - pending.request.onSocket(socket); - }); - } -}; - -function createSecureSocket(options, cb) { - var self = this; - TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { - var hostHeader = options.request.getHeader('host'); - var tlsOptions = mergeOptions({}, self.options, { - socket: socket, - servername: hostHeader ? hostHeader.replace(/:.*$/, '') : options.host - }); - - // 0 is dummy port for v0.6 - var secureSocket = tls.connect(0, tlsOptions); - self.sockets[self.sockets.indexOf(socket)] = secureSocket; - cb(secureSocket); - }); -} - - -function toOptions(host, port, localAddress) { - if (typeof host === 'string') { // since v0.10 - return { - host: host, - port: port, - localAddress: localAddress - }; - } - return host; // for v0.11 or later -} - -function mergeOptions(target) { - for (var i = 1, len = arguments.length; i < len; ++i) { - var overrides = arguments[i]; - if (typeof overrides === 'object') { - var keys = Object.keys(overrides); - for (var j = 0, keyLen = keys.length; j < keyLen; ++j) { - var k = keys[j]; - if (overrides[k] !== undefined) { - target[k] = overrides[k]; - } - } - } - } - return target; -} - - -var debug; -if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { - debug = function() { - var args = Array.prototype.slice.call(arguments); - if (typeof args[0] === 'string') { - args[0] = 'TUNNEL: ' + args[0]; - } else { - args.unshift('TUNNEL:'); - } - console.error.apply(console, args); - } -} else { - debug = function() {}; -} -__webpack_unused_export__ = debug; // for test - - -/***/ }), - -/***/ 6752: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -var __webpack_unused_export__; - - -const Client = __nccwpck_require__(3701) -const Dispatcher = __nccwpck_require__(883) -const Pool = __nccwpck_require__(628) -const BalancedPool = __nccwpck_require__(837) -const Agent = __nccwpck_require__(7405) -const ProxyAgent = __nccwpck_require__(6672) -const EnvHttpProxyAgent = __nccwpck_require__(3137) -const RetryAgent = __nccwpck_require__(50) -const errors = __nccwpck_require__(8707) -const util = __nccwpck_require__(3440) -const { InvalidArgumentError } = errors -const api = __nccwpck_require__(6615) -const buildConnector = __nccwpck_require__(9136) -const MockClient = __nccwpck_require__(7365) -const MockAgent = __nccwpck_require__(7501) -const MockPool = __nccwpck_require__(4004) -const mockErrors = __nccwpck_require__(2429) -const RetryHandler = __nccwpck_require__(7816) -const { getGlobalDispatcher, setGlobalDispatcher } = __nccwpck_require__(2581) -const DecoratorHandler = __nccwpck_require__(8155) -const RedirectHandler = __nccwpck_require__(8754) -const createRedirectInterceptor = __nccwpck_require__(5092) - -Object.assign(Dispatcher.prototype, api) - -__webpack_unused_export__ = Dispatcher -__webpack_unused_export__ = Client -__webpack_unused_export__ = Pool -__webpack_unused_export__ = BalancedPool -__webpack_unused_export__ = Agent -module.exports.kT = ProxyAgent -__webpack_unused_export__ = EnvHttpProxyAgent -__webpack_unused_export__ = RetryAgent -__webpack_unused_export__ = RetryHandler - -__webpack_unused_export__ = DecoratorHandler -__webpack_unused_export__ = RedirectHandler -__webpack_unused_export__ = createRedirectInterceptor -__webpack_unused_export__ = { - redirect: __nccwpck_require__(1514), - retry: __nccwpck_require__(2026), - dump: __nccwpck_require__(8060), - dns: __nccwpck_require__(379) -} - -__webpack_unused_export__ = buildConnector -__webpack_unused_export__ = errors -__webpack_unused_export__ = { - parseHeaders: util.parseHeaders, - headerNameToString: util.headerNameToString -} - -function makeDispatcher (fn) { - return (url, opts, handler) => { - if (typeof opts === 'function') { - handler = opts - opts = null - } - - if (!url || (typeof url !== 'string' && typeof url !== 'object' && !(url instanceof URL))) { - throw new InvalidArgumentError('invalid url') - } - - if (opts != null && typeof opts !== 'object') { - throw new InvalidArgumentError('invalid opts') - } - - if (opts && opts.path != null) { - if (typeof opts.path !== 'string') { - throw new InvalidArgumentError('invalid opts.path') - } - - let path = opts.path - if (!opts.path.startsWith('/')) { - path = `/${path}` - } - - url = new URL(util.parseOrigin(url).origin + path) - } else { - if (!opts) { - opts = typeof url === 'object' ? url : {} - } - - url = util.parseURL(url) - } - - const { agent, dispatcher = getGlobalDispatcher() } = opts - - if (agent) { - throw new InvalidArgumentError('unsupported opts.agent. Did you mean opts.client?') - } - - return fn.call(dispatcher, { - ...opts, - origin: url.origin, - path: url.search ? `${url.pathname}${url.search}` : url.pathname, - method: opts.method || (opts.body ? 'PUT' : 'GET') - }, handler) - } -} - -__webpack_unused_export__ = setGlobalDispatcher -__webpack_unused_export__ = getGlobalDispatcher - -const fetchImpl = (__nccwpck_require__(4398).fetch) -__webpack_unused_export__ = async function fetch (init, options = undefined) { - try { - return await fetchImpl(init, options) - } catch (err) { - if (err && typeof err === 'object') { - Error.captureStackTrace(err) - } - - throw err - } -} -/* unused reexport */ __nccwpck_require__(660).Headers -/* unused reexport */ __nccwpck_require__(9051).Response -/* unused reexport */ __nccwpck_require__(9967).Request -/* unused reexport */ __nccwpck_require__(5910).FormData -__webpack_unused_export__ = globalThis.File ?? (__nccwpck_require__(4573).File) -/* unused reexport */ __nccwpck_require__(8355).FileReader - -const { setGlobalOrigin, getGlobalOrigin } = __nccwpck_require__(1059) - -__webpack_unused_export__ = setGlobalOrigin -__webpack_unused_export__ = getGlobalOrigin - -const { CacheStorage } = __nccwpck_require__(3245) -const { kConstruct } = __nccwpck_require__(109) - -// Cache & CacheStorage are tightly coupled with fetch. Even if it may run -// in an older version of Node, it doesn't have any use without fetch. -__webpack_unused_export__ = new CacheStorage(kConstruct) - -const { deleteCookie, getCookies, getSetCookies, setCookie } = __nccwpck_require__(9061) - -__webpack_unused_export__ = deleteCookie -__webpack_unused_export__ = getCookies -__webpack_unused_export__ = getSetCookies -__webpack_unused_export__ = setCookie - -const { parseMIMEType, serializeAMimeType } = __nccwpck_require__(1900) - -__webpack_unused_export__ = parseMIMEType -__webpack_unused_export__ = serializeAMimeType - -const { CloseEvent, ErrorEvent, MessageEvent } = __nccwpck_require__(5188) -/* unused reexport */ __nccwpck_require__(3726).WebSocket -__webpack_unused_export__ = CloseEvent -__webpack_unused_export__ = ErrorEvent -__webpack_unused_export__ = MessageEvent - -__webpack_unused_export__ = makeDispatcher(api.request) -__webpack_unused_export__ = makeDispatcher(api.stream) -__webpack_unused_export__ = makeDispatcher(api.pipeline) -__webpack_unused_export__ = makeDispatcher(api.connect) -__webpack_unused_export__ = makeDispatcher(api.upgrade) - -__webpack_unused_export__ = MockClient -__webpack_unused_export__ = MockPool -__webpack_unused_export__ = MockAgent -__webpack_unused_export__ = mockErrors - -const { EventSource } = __nccwpck_require__(1238) - -__webpack_unused_export__ = EventSource - - -/***/ }), - -/***/ 158: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const { addAbortListener } = __nccwpck_require__(3440) -const { RequestAbortedError } = __nccwpck_require__(8707) - -const kListener = Symbol('kListener') -const kSignal = Symbol('kSignal') - -function abort (self) { - if (self.abort) { - self.abort(self[kSignal]?.reason) - } else { - self.reason = self[kSignal]?.reason ?? new RequestAbortedError() - } - removeSignal(self) -} - -function addSignal (self, signal) { - self.reason = null - - self[kSignal] = null - self[kListener] = null - - if (!signal) { - return - } - - if (signal.aborted) { - abort(self) - return - } - - self[kSignal] = signal - self[kListener] = () => { - abort(self) - } - - addAbortListener(self[kSignal], self[kListener]) -} - -function removeSignal (self) { - if (!self[kSignal]) { - return - } - - if ('removeEventListener' in self[kSignal]) { - self[kSignal].removeEventListener('abort', self[kListener]) - } else { - self[kSignal].removeListener('abort', self[kListener]) - } - - self[kSignal] = null - self[kListener] = null -} - -module.exports = { - addSignal, - removeSignal -} - - -/***/ }), - -/***/ 2279: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const assert = __nccwpck_require__(4589) -const { AsyncResource } = __nccwpck_require__(6698) -const { InvalidArgumentError, SocketError } = __nccwpck_require__(8707) -const util = __nccwpck_require__(3440) -const { addSignal, removeSignal } = __nccwpck_require__(158) - -class ConnectHandler extends AsyncResource { - constructor (opts, callback) { - if (!opts || typeof opts !== 'object') { - throw new InvalidArgumentError('invalid opts') - } - - if (typeof callback !== 'function') { - throw new InvalidArgumentError('invalid callback') - } - - const { signal, opaque, responseHeaders } = opts - - if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { - throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') - } - - super('UNDICI_CONNECT') - - this.opaque = opaque || null - this.responseHeaders = responseHeaders || null - this.callback = callback - this.abort = null - - addSignal(this, signal) - } - - onConnect (abort, context) { - if (this.reason) { - abort(this.reason) - return - } - - assert(this.callback) - - this.abort = abort - this.context = context - } - - onHeaders () { - throw new SocketError('bad connect', null) - } - - onUpgrade (statusCode, rawHeaders, socket) { - const { callback, opaque, context } = this - - removeSignal(this) - - this.callback = null - - let headers = rawHeaders - // Indicates is an HTTP2Session - if (headers != null) { - headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders) - } - - this.runInAsyncScope(callback, null, null, { - statusCode, - headers, - socket, - opaque, - context - }) - } - - onError (err) { - const { callback, opaque } = this - - removeSignal(this) - - if (callback) { - this.callback = null - queueMicrotask(() => { - this.runInAsyncScope(callback, null, err, { opaque }) - }) - } - } -} - -function connect (opts, callback) { - if (callback === undefined) { - return new Promise((resolve, reject) => { - connect.call(this, opts, (err, data) => { - return err ? reject(err) : resolve(data) - }) - }) - } - - try { - const connectHandler = new ConnectHandler(opts, callback) - this.dispatch({ ...opts, method: 'CONNECT' }, connectHandler) - } catch (err) { - if (typeof callback !== 'function') { - throw err - } - const opaque = opts?.opaque - queueMicrotask(() => callback(err, { opaque })) - } -} - -module.exports = connect - - -/***/ }), - -/***/ 6862: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const { - Readable, - Duplex, - PassThrough -} = __nccwpck_require__(7075) -const { - InvalidArgumentError, - InvalidReturnValueError, - RequestAbortedError -} = __nccwpck_require__(8707) -const util = __nccwpck_require__(3440) -const { AsyncResource } = __nccwpck_require__(6698) -const { addSignal, removeSignal } = __nccwpck_require__(158) -const assert = __nccwpck_require__(4589) - -const kResume = Symbol('resume') - -class PipelineRequest extends Readable { - constructor () { - super({ autoDestroy: true }) - - this[kResume] = null - } - - _read () { - const { [kResume]: resume } = this - - if (resume) { - this[kResume] = null - resume() - } - } - - _destroy (err, callback) { - this._read() - - callback(err) - } -} - -class PipelineResponse extends Readable { - constructor (resume) { - super({ autoDestroy: true }) - this[kResume] = resume - } - - _read () { - this[kResume]() - } - - _destroy (err, callback) { - if (!err && !this._readableState.endEmitted) { - err = new RequestAbortedError() - } - - callback(err) - } -} - -class PipelineHandler extends AsyncResource { - constructor (opts, handler) { - if (!opts || typeof opts !== 'object') { - throw new InvalidArgumentError('invalid opts') - } - - if (typeof handler !== 'function') { - throw new InvalidArgumentError('invalid handler') - } - - const { signal, method, opaque, onInfo, responseHeaders } = opts - - if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { - throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') - } - - if (method === 'CONNECT') { - throw new InvalidArgumentError('invalid method') - } - - if (onInfo && typeof onInfo !== 'function') { - throw new InvalidArgumentError('invalid onInfo callback') - } - - super('UNDICI_PIPELINE') - - this.opaque = opaque || null - this.responseHeaders = responseHeaders || null - this.handler = handler - this.abort = null - this.context = null - this.onInfo = onInfo || null - - this.req = new PipelineRequest().on('error', util.nop) - - this.ret = new Duplex({ - readableObjectMode: opts.objectMode, - autoDestroy: true, - read: () => { - const { body } = this - - if (body?.resume) { - body.resume() - } - }, - write: (chunk, encoding, callback) => { - const { req } = this - - if (req.push(chunk, encoding) || req._readableState.destroyed) { - callback() - } else { - req[kResume] = callback - } - }, - destroy: (err, callback) => { - const { body, req, res, ret, abort } = this - - if (!err && !ret._readableState.endEmitted) { - err = new RequestAbortedError() - } - - if (abort && err) { - abort() - } - - util.destroy(body, err) - util.destroy(req, err) - util.destroy(res, err) - - removeSignal(this) - - callback(err) - } - }).on('prefinish', () => { - const { req } = this - - // Node < 15 does not call _final in same tick. - req.push(null) - }) - - this.res = null - - addSignal(this, signal) - } - - onConnect (abort, context) { - const { ret, res } = this - - if (this.reason) { - abort(this.reason) - return - } - - assert(!res, 'pipeline cannot be retried') - assert(!ret.destroyed) - - this.abort = abort - this.context = context - } - - onHeaders (statusCode, rawHeaders, resume) { - const { opaque, handler, context } = this - - if (statusCode < 200) { - if (this.onInfo) { - const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders) - this.onInfo({ statusCode, headers }) - } - return - } - - this.res = new PipelineResponse(resume) - - let body - try { - this.handler = null - const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders) - body = this.runInAsyncScope(handler, null, { - statusCode, - headers, - opaque, - body: this.res, - context - }) - } catch (err) { - this.res.on('error', util.nop) - throw err - } - - if (!body || typeof body.on !== 'function') { - throw new InvalidReturnValueError('expected Readable') - } - - body - .on('data', (chunk) => { - const { ret, body } = this - - if (!ret.push(chunk) && body.pause) { - body.pause() - } - }) - .on('error', (err) => { - const { ret } = this - - util.destroy(ret, err) - }) - .on('end', () => { - const { ret } = this - - ret.push(null) - }) - .on('close', () => { - const { ret } = this - - if (!ret._readableState.ended) { - util.destroy(ret, new RequestAbortedError()) - } - }) - - this.body = body - } - - onData (chunk) { - const { res } = this - return res.push(chunk) - } - - onComplete (trailers) { - const { res } = this - res.push(null) - } - - onError (err) { - const { ret } = this - this.handler = null - util.destroy(ret, err) - } -} - -function pipeline (opts, handler) { - try { - const pipelineHandler = new PipelineHandler(opts, handler) - this.dispatch({ ...opts, body: pipelineHandler.req }, pipelineHandler) - return pipelineHandler.ret - } catch (err) { - return new PassThrough().destroy(err) - } -} - -module.exports = pipeline - - -/***/ }), - -/***/ 4043: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const assert = __nccwpck_require__(4589) -const { Readable } = __nccwpck_require__(9927) -const { InvalidArgumentError, RequestAbortedError } = __nccwpck_require__(8707) -const util = __nccwpck_require__(3440) -const { getResolveErrorBodyCallback } = __nccwpck_require__(7655) -const { AsyncResource } = __nccwpck_require__(6698) - -class RequestHandler extends AsyncResource { - constructor (opts, callback) { - if (!opts || typeof opts !== 'object') { - throw new InvalidArgumentError('invalid opts') - } - - const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError, highWaterMark } = opts - - try { - if (typeof callback !== 'function') { - throw new InvalidArgumentError('invalid callback') - } - - if (highWaterMark && (typeof highWaterMark !== 'number' || highWaterMark < 0)) { - throw new InvalidArgumentError('invalid highWaterMark') - } - - if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { - throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') - } - - if (method === 'CONNECT') { - throw new InvalidArgumentError('invalid method') - } - - if (onInfo && typeof onInfo !== 'function') { - throw new InvalidArgumentError('invalid onInfo callback') - } - - super('UNDICI_REQUEST') - } catch (err) { - if (util.isStream(body)) { - util.destroy(body.on('error', util.nop), err) - } - throw err - } - - this.method = method - this.responseHeaders = responseHeaders || null - this.opaque = opaque || null - this.callback = callback - this.res = null - this.abort = null - this.body = body - this.trailers = {} - this.context = null - this.onInfo = onInfo || null - this.throwOnError = throwOnError - this.highWaterMark = highWaterMark - this.signal = signal - this.reason = null - this.removeAbortListener = null - - if (util.isStream(body)) { - body.on('error', (err) => { - this.onError(err) - }) - } - - if (this.signal) { - if (this.signal.aborted) { - this.reason = this.signal.reason ?? new RequestAbortedError() - } else { - this.removeAbortListener = util.addAbortListener(this.signal, () => { - this.reason = this.signal.reason ?? new RequestAbortedError() - if (this.res) { - util.destroy(this.res.on('error', util.nop), this.reason) - } else if (this.abort) { - this.abort(this.reason) - } - - if (this.removeAbortListener) { - this.res?.off('close', this.removeAbortListener) - this.removeAbortListener() - this.removeAbortListener = null - } - }) - } - } - } - - onConnect (abort, context) { - if (this.reason) { - abort(this.reason) - return - } - - assert(this.callback) - - this.abort = abort - this.context = context - } - - onHeaders (statusCode, rawHeaders, resume, statusMessage) { - const { callback, opaque, abort, context, responseHeaders, highWaterMark } = this - - const headers = responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders) - - if (statusCode < 200) { - if (this.onInfo) { - this.onInfo({ statusCode, headers }) - } - return - } - - const parsedHeaders = responseHeaders === 'raw' ? util.parseHeaders(rawHeaders) : headers - const contentType = parsedHeaders['content-type'] - const contentLength = parsedHeaders['content-length'] - const res = new Readable({ - resume, - abort, - contentType, - contentLength: this.method !== 'HEAD' && contentLength - ? Number(contentLength) - : null, - highWaterMark - }) - - if (this.removeAbortListener) { - res.on('close', this.removeAbortListener) - } - - this.callback = null - this.res = res - if (callback !== null) { - if (this.throwOnError && statusCode >= 400) { - this.runInAsyncScope(getResolveErrorBodyCallback, null, - { callback, body: res, contentType, statusCode, statusMessage, headers } - ) - } else { - this.runInAsyncScope(callback, null, null, { - statusCode, - headers, - trailers: this.trailers, - opaque, - body: res, - context - }) - } - } - } - - onData (chunk) { - return this.res.push(chunk) - } - - onComplete (trailers) { - util.parseHeaders(trailers, this.trailers) - this.res.push(null) - } - - onError (err) { - const { res, callback, body, opaque } = this - - if (callback) { - // TODO: Does this need queueMicrotask? - this.callback = null - queueMicrotask(() => { - this.runInAsyncScope(callback, null, err, { opaque }) - }) - } - - if (res) { - this.res = null - // Ensure all queued handlers are invoked before destroying res. - queueMicrotask(() => { - util.destroy(res, err) - }) - } - - if (body) { - this.body = null - util.destroy(body, err) - } - - if (this.removeAbortListener) { - res?.off('close', this.removeAbortListener) - this.removeAbortListener() - this.removeAbortListener = null - } - } -} - -function request (opts, callback) { - if (callback === undefined) { - return new Promise((resolve, reject) => { - request.call(this, opts, (err, data) => { - return err ? reject(err) : resolve(data) - }) - }) - } - - try { - this.dispatch(opts, new RequestHandler(opts, callback)) - } catch (err) { - if (typeof callback !== 'function') { - throw err - } - const opaque = opts?.opaque - queueMicrotask(() => callback(err, { opaque })) - } -} - -module.exports = request -module.exports.RequestHandler = RequestHandler - - -/***/ }), - -/***/ 3560: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const assert = __nccwpck_require__(4589) -const { finished, PassThrough } = __nccwpck_require__(7075) -const { InvalidArgumentError, InvalidReturnValueError } = __nccwpck_require__(8707) -const util = __nccwpck_require__(3440) -const { getResolveErrorBodyCallback } = __nccwpck_require__(7655) -const { AsyncResource } = __nccwpck_require__(6698) -const { addSignal, removeSignal } = __nccwpck_require__(158) - -class StreamHandler extends AsyncResource { - constructor (opts, factory, callback) { - if (!opts || typeof opts !== 'object') { - throw new InvalidArgumentError('invalid opts') - } - - const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError } = opts - - try { - if (typeof callback !== 'function') { - throw new InvalidArgumentError('invalid callback') - } - - if (typeof factory !== 'function') { - throw new InvalidArgumentError('invalid factory') - } - - if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { - throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') - } - - if (method === 'CONNECT') { - throw new InvalidArgumentError('invalid method') - } - - if (onInfo && typeof onInfo !== 'function') { - throw new InvalidArgumentError('invalid onInfo callback') - } - - super('UNDICI_STREAM') - } catch (err) { - if (util.isStream(body)) { - util.destroy(body.on('error', util.nop), err) - } - throw err - } - - this.responseHeaders = responseHeaders || null - this.opaque = opaque || null - this.factory = factory - this.callback = callback - this.res = null - this.abort = null - this.context = null - this.trailers = null - this.body = body - this.onInfo = onInfo || null - this.throwOnError = throwOnError || false - - if (util.isStream(body)) { - body.on('error', (err) => { - this.onError(err) - }) - } - - addSignal(this, signal) - } - - onConnect (abort, context) { - if (this.reason) { - abort(this.reason) - return - } - - assert(this.callback) - - this.abort = abort - this.context = context - } - - onHeaders (statusCode, rawHeaders, resume, statusMessage) { - const { factory, opaque, context, callback, responseHeaders } = this - - const headers = responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders) - - if (statusCode < 200) { - if (this.onInfo) { - this.onInfo({ statusCode, headers }) - } - return - } - - this.factory = null - - let res - - if (this.throwOnError && statusCode >= 400) { - const parsedHeaders = responseHeaders === 'raw' ? util.parseHeaders(rawHeaders) : headers - const contentType = parsedHeaders['content-type'] - res = new PassThrough() - - this.callback = null - this.runInAsyncScope(getResolveErrorBodyCallback, null, - { callback, body: res, contentType, statusCode, statusMessage, headers } - ) - } else { - if (factory === null) { - return - } - - res = this.runInAsyncScope(factory, null, { - statusCode, - headers, - opaque, - context - }) - - if ( - !res || - typeof res.write !== 'function' || - typeof res.end !== 'function' || - typeof res.on !== 'function' - ) { - throw new InvalidReturnValueError('expected Writable') - } - - // TODO: Avoid finished. It registers an unnecessary amount of listeners. - finished(res, { readable: false }, (err) => { - const { callback, res, opaque, trailers, abort } = this - - this.res = null - if (err || !res.readable) { - util.destroy(res, err) - } - - this.callback = null - this.runInAsyncScope(callback, null, err || null, { opaque, trailers }) - - if (err) { - abort() - } - }) - } - - res.on('drain', resume) - - this.res = res - - const needDrain = res.writableNeedDrain !== undefined - ? res.writableNeedDrain - : res._writableState?.needDrain - - return needDrain !== true - } - - onData (chunk) { - const { res } = this - - return res ? res.write(chunk) : true - } - - onComplete (trailers) { - const { res } = this - - removeSignal(this) - - if (!res) { - return - } - - this.trailers = util.parseHeaders(trailers) - - res.end() - } - - onError (err) { - const { res, callback, opaque, body } = this - - removeSignal(this) - - this.factory = null - - if (res) { - this.res = null - util.destroy(res, err) - } else if (callback) { - this.callback = null - queueMicrotask(() => { - this.runInAsyncScope(callback, null, err, { opaque }) - }) - } - - if (body) { - this.body = null - util.destroy(body, err) - } - } -} - -function stream (opts, factory, callback) { - if (callback === undefined) { - return new Promise((resolve, reject) => { - stream.call(this, opts, factory, (err, data) => { - return err ? reject(err) : resolve(data) - }) - }) - } - - try { - this.dispatch(opts, new StreamHandler(opts, factory, callback)) - } catch (err) { - if (typeof callback !== 'function') { - throw err - } - const opaque = opts?.opaque - queueMicrotask(() => callback(err, { opaque })) - } -} - -module.exports = stream - - -/***/ }), - -/***/ 1882: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const { InvalidArgumentError, SocketError } = __nccwpck_require__(8707) -const { AsyncResource } = __nccwpck_require__(6698) -const util = __nccwpck_require__(3440) -const { addSignal, removeSignal } = __nccwpck_require__(158) -const assert = __nccwpck_require__(4589) - -class UpgradeHandler extends AsyncResource { - constructor (opts, callback) { - if (!opts || typeof opts !== 'object') { - throw new InvalidArgumentError('invalid opts') - } - - if (typeof callback !== 'function') { - throw new InvalidArgumentError('invalid callback') - } - - const { signal, opaque, responseHeaders } = opts - - if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { - throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') - } - - super('UNDICI_UPGRADE') - - this.responseHeaders = responseHeaders || null - this.opaque = opaque || null - this.callback = callback - this.abort = null - this.context = null - - addSignal(this, signal) - } - - onConnect (abort, context) { - if (this.reason) { - abort(this.reason) - return - } - - assert(this.callback) - - this.abort = abort - this.context = null - } - - onHeaders () { - throw new SocketError('bad upgrade', null) - } - - onUpgrade (statusCode, rawHeaders, socket) { - assert(statusCode === 101) - - const { callback, opaque, context } = this - - removeSignal(this) - - this.callback = null - const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders) - this.runInAsyncScope(callback, null, null, { - headers, - socket, - opaque, - context - }) - } - - onError (err) { - const { callback, opaque } = this - - removeSignal(this) - - if (callback) { - this.callback = null - queueMicrotask(() => { - this.runInAsyncScope(callback, null, err, { opaque }) - }) - } - } -} - -function upgrade (opts, callback) { - if (callback === undefined) { - return new Promise((resolve, reject) => { - upgrade.call(this, opts, (err, data) => { - return err ? reject(err) : resolve(data) - }) - }) - } - - try { - const upgradeHandler = new UpgradeHandler(opts, callback) - this.dispatch({ - ...opts, - method: opts.method || 'GET', - upgrade: opts.protocol || 'Websocket' - }, upgradeHandler) - } catch (err) { - if (typeof callback !== 'function') { - throw err - } - const opaque = opts?.opaque - queueMicrotask(() => callback(err, { opaque })) - } -} - -module.exports = upgrade - - -/***/ }), - -/***/ 6615: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -module.exports.request = __nccwpck_require__(4043) -module.exports.stream = __nccwpck_require__(3560) -module.exports.pipeline = __nccwpck_require__(6862) -module.exports.upgrade = __nccwpck_require__(1882) -module.exports.connect = __nccwpck_require__(2279) - - -/***/ }), - -/***/ 9927: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -// Ported from https://github.com/nodejs/undici/pull/907 - - - -const assert = __nccwpck_require__(4589) -const { Readable } = __nccwpck_require__(7075) -const { RequestAbortedError, NotSupportedError, InvalidArgumentError, AbortError } = __nccwpck_require__(8707) -const util = __nccwpck_require__(3440) -const { ReadableStreamFrom } = __nccwpck_require__(3440) - -const kConsume = Symbol('kConsume') -const kReading = Symbol('kReading') -const kBody = Symbol('kBody') -const kAbort = Symbol('kAbort') -const kContentType = Symbol('kContentType') -const kContentLength = Symbol('kContentLength') - -const noop = () => {} - -class BodyReadable extends Readable { - constructor ({ - resume, - abort, - contentType = '', - contentLength, - highWaterMark = 64 * 1024 // Same as nodejs fs streams. - }) { - super({ - autoDestroy: true, - read: resume, - highWaterMark - }) - - this._readableState.dataEmitted = false - - this[kAbort] = abort - this[kConsume] = null - this[kBody] = null - this[kContentType] = contentType - this[kContentLength] = contentLength - - // Is stream being consumed through Readable API? - // This is an optimization so that we avoid checking - // for 'data' and 'readable' listeners in the hot path - // inside push(). - this[kReading] = false - } - - destroy (err) { - if (!err && !this._readableState.endEmitted) { - err = new RequestAbortedError() - } - - if (err) { - this[kAbort]() - } - - return super.destroy(err) - } - - _destroy (err, callback) { - // Workaround for Node "bug". If the stream is destroyed in same - // tick as it is created, then a user who is waiting for a - // promise (i.e micro tick) for installing a 'error' listener will - // never get a chance and will always encounter an unhandled exception. - if (!this[kReading]) { - setImmediate(() => { - callback(err) - }) - } else { - callback(err) - } - } - - on (ev, ...args) { - if (ev === 'data' || ev === 'readable') { - this[kReading] = true - } - return super.on(ev, ...args) - } - - addListener (ev, ...args) { - return this.on(ev, ...args) - } - - off (ev, ...args) { - const ret = super.off(ev, ...args) - if (ev === 'data' || ev === 'readable') { - this[kReading] = ( - this.listenerCount('data') > 0 || - this.listenerCount('readable') > 0 - ) - } - return ret - } - - removeListener (ev, ...args) { - return this.off(ev, ...args) - } - - push (chunk) { - if (this[kConsume] && chunk !== null) { - consumePush(this[kConsume], chunk) - return this[kReading] ? super.push(chunk) : true - } - return super.push(chunk) - } - - // https://fetch.spec.whatwg.org/#dom-body-text - async text () { - return consume(this, 'text') - } - - // https://fetch.spec.whatwg.org/#dom-body-json - async json () { - return consume(this, 'json') - } - - // https://fetch.spec.whatwg.org/#dom-body-blob - async blob () { - return consume(this, 'blob') - } - - // https://fetch.spec.whatwg.org/#dom-body-bytes - async bytes () { - return consume(this, 'bytes') - } - - // https://fetch.spec.whatwg.org/#dom-body-arraybuffer - async arrayBuffer () { - return consume(this, 'arrayBuffer') - } - - // https://fetch.spec.whatwg.org/#dom-body-formdata - async formData () { - // TODO: Implement. - throw new NotSupportedError() - } - - // https://fetch.spec.whatwg.org/#dom-body-bodyused - get bodyUsed () { - return util.isDisturbed(this) - } - - // https://fetch.spec.whatwg.org/#dom-body-body - get body () { - if (!this[kBody]) { - this[kBody] = ReadableStreamFrom(this) - if (this[kConsume]) { - // TODO: Is this the best way to force a lock? - this[kBody].getReader() // Ensure stream is locked. - assert(this[kBody].locked) - } - } - return this[kBody] - } - - async dump (opts) { - let limit = Number.isFinite(opts?.limit) ? opts.limit : 128 * 1024 - const signal = opts?.signal - - if (signal != null && (typeof signal !== 'object' || !('aborted' in signal))) { - throw new InvalidArgumentError('signal must be an AbortSignal') - } - - signal?.throwIfAborted() - - if (this._readableState.closeEmitted) { - return null - } - - return await new Promise((resolve, reject) => { - if (this[kContentLength] > limit) { - this.destroy(new AbortError()) - } - - const onAbort = () => { - this.destroy(signal.reason ?? new AbortError()) - } - signal?.addEventListener('abort', onAbort) - - this - .on('close', function () { - signal?.removeEventListener('abort', onAbort) - if (signal?.aborted) { - reject(signal.reason ?? new AbortError()) - } else { - resolve(null) - } - }) - .on('error', noop) - .on('data', function (chunk) { - limit -= chunk.length - if (limit <= 0) { - this.destroy() - } - }) - .resume() - }) - } -} - -// https://streams.spec.whatwg.org/#readablestream-locked -function isLocked (self) { - // Consume is an implicit lock. - return (self[kBody] && self[kBody].locked === true) || self[kConsume] -} - -// https://fetch.spec.whatwg.org/#body-unusable -function isUnusable (self) { - return util.isDisturbed(self) || isLocked(self) -} - -async function consume (stream, type) { - assert(!stream[kConsume]) - - return new Promise((resolve, reject) => { - if (isUnusable(stream)) { - const rState = stream._readableState - if (rState.destroyed && rState.closeEmitted === false) { - stream - .on('error', err => { - reject(err) - }) - .on('close', () => { - reject(new TypeError('unusable')) - }) - } else { - reject(rState.errored ?? new TypeError('unusable')) - } - } else { - queueMicrotask(() => { - stream[kConsume] = { - type, - stream, - resolve, - reject, - length: 0, - body: [] - } - - stream - .on('error', function (err) { - consumeFinish(this[kConsume], err) - }) - .on('close', function () { - if (this[kConsume].body !== null) { - consumeFinish(this[kConsume], new RequestAbortedError()) - } - }) - - consumeStart(stream[kConsume]) - }) - } - }) -} - -function consumeStart (consume) { - if (consume.body === null) { - return - } - - const { _readableState: state } = consume.stream - - if (state.bufferIndex) { - const start = state.bufferIndex - const end = state.buffer.length - for (let n = start; n < end; n++) { - consumePush(consume, state.buffer[n]) - } - } else { - for (const chunk of state.buffer) { - consumePush(consume, chunk) - } - } - - if (state.endEmitted) { - consumeEnd(this[kConsume]) - } else { - consume.stream.on('end', function () { - consumeEnd(this[kConsume]) - }) - } - - consume.stream.resume() - - while (consume.stream.read() != null) { - // Loop - } -} - -/** - * @param {Buffer[]} chunks - * @param {number} length - */ -function chunksDecode (chunks, length) { - if (chunks.length === 0 || length === 0) { - return '' - } - const buffer = chunks.length === 1 ? chunks[0] : Buffer.concat(chunks, length) - const bufferLength = buffer.length - - // Skip BOM. - const start = - bufferLength > 2 && - buffer[0] === 0xef && - buffer[1] === 0xbb && - buffer[2] === 0xbf - ? 3 - : 0 - return buffer.utf8Slice(start, bufferLength) -} - -/** - * @param {Buffer[]} chunks - * @param {number} length - * @returns {Uint8Array} - */ -function chunksConcat (chunks, length) { - if (chunks.length === 0 || length === 0) { - return new Uint8Array(0) - } - if (chunks.length === 1) { - // fast-path - return new Uint8Array(chunks[0]) - } - const buffer = new Uint8Array(Buffer.allocUnsafeSlow(length).buffer) - - let offset = 0 - for (let i = 0; i < chunks.length; ++i) { - const chunk = chunks[i] - buffer.set(chunk, offset) - offset += chunk.length - } - - return buffer -} - -function consumeEnd (consume) { - const { type, body, resolve, stream, length } = consume - - try { - if (type === 'text') { - resolve(chunksDecode(body, length)) - } else if (type === 'json') { - resolve(JSON.parse(chunksDecode(body, length))) - } else if (type === 'arrayBuffer') { - resolve(chunksConcat(body, length).buffer) - } else if (type === 'blob') { - resolve(new Blob(body, { type: stream[kContentType] })) - } else if (type === 'bytes') { - resolve(chunksConcat(body, length)) - } - - consumeFinish(consume) - } catch (err) { - stream.destroy(err) - } -} - -function consumePush (consume, chunk) { - consume.length += chunk.length - consume.body.push(chunk) -} - -function consumeFinish (consume, err) { - if (consume.body === null) { - return - } - - if (err) { - consume.reject(err) - } else { - consume.resolve() - } - - consume.type = null - consume.stream = null - consume.resolve = null - consume.reject = null - consume.length = 0 - consume.body = null -} - -module.exports = { Readable: BodyReadable, chunksDecode } - - -/***/ }), - -/***/ 7655: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const assert = __nccwpck_require__(4589) -const { - ResponseStatusCodeError -} = __nccwpck_require__(8707) - -const { chunksDecode } = __nccwpck_require__(9927) -const CHUNK_LIMIT = 128 * 1024 - -async function getResolveErrorBodyCallback ({ callback, body, contentType, statusCode, statusMessage, headers }) { - assert(body) - - let chunks = [] - let length = 0 - - try { - for await (const chunk of body) { - chunks.push(chunk) - length += chunk.length - if (length > CHUNK_LIMIT) { - chunks = [] - length = 0 - break - } - } - } catch { - chunks = [] - length = 0 - // Do nothing.... - } - - const message = `Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}` - - if (statusCode === 204 || !contentType || !length) { - queueMicrotask(() => callback(new ResponseStatusCodeError(message, statusCode, headers))) - return - } - - const stackTraceLimit = Error.stackTraceLimit - Error.stackTraceLimit = 0 - let payload - - try { - if (isContentTypeApplicationJson(contentType)) { - payload = JSON.parse(chunksDecode(chunks, length)) - } else if (isContentTypeText(contentType)) { - payload = chunksDecode(chunks, length) - } - } catch { - // process in a callback to avoid throwing in the microtask queue - } finally { - Error.stackTraceLimit = stackTraceLimit - } - queueMicrotask(() => callback(new ResponseStatusCodeError(message, statusCode, headers, payload))) -} - -const isContentTypeApplicationJson = (contentType) => { - return ( - contentType.length > 15 && - contentType[11] === '/' && - contentType[0] === 'a' && - contentType[1] === 'p' && - contentType[2] === 'p' && - contentType[3] === 'l' && - contentType[4] === 'i' && - contentType[5] === 'c' && - contentType[6] === 'a' && - contentType[7] === 't' && - contentType[8] === 'i' && - contentType[9] === 'o' && - contentType[10] === 'n' && - contentType[12] === 'j' && - contentType[13] === 's' && - contentType[14] === 'o' && - contentType[15] === 'n' - ) -} - -const isContentTypeText = (contentType) => { - return ( - contentType.length > 4 && - contentType[4] === '/' && - contentType[0] === 't' && - contentType[1] === 'e' && - contentType[2] === 'x' && - contentType[3] === 't' - ) -} - -module.exports = { - getResolveErrorBodyCallback, - isContentTypeApplicationJson, - isContentTypeText -} - - -/***/ }), - -/***/ 9136: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const net = __nccwpck_require__(7030) -const assert = __nccwpck_require__(4589) -const util = __nccwpck_require__(3440) -const { InvalidArgumentError, ConnectTimeoutError } = __nccwpck_require__(8707) -const timers = __nccwpck_require__(6603) - -function noop () {} - -let tls // include tls conditionally since it is not always available - -// TODO: session re-use does not wait for the first -// connection to resolve the session and might therefore -// resolve the same servername multiple times even when -// re-use is enabled. - -let SessionCache -// FIXME: remove workaround when the Node bug is fixed -// https://github.com/nodejs/node/issues/49344#issuecomment-1741776308 -if (global.FinalizationRegistry && !(process.env.NODE_V8_COVERAGE || process.env.UNDICI_NO_FG)) { - SessionCache = class WeakSessionCache { - constructor (maxCachedSessions) { - this._maxCachedSessions = maxCachedSessions - this._sessionCache = new Map() - this._sessionRegistry = new global.FinalizationRegistry((key) => { - if (this._sessionCache.size < this._maxCachedSessions) { - return - } - - const ref = this._sessionCache.get(key) - if (ref !== undefined && ref.deref() === undefined) { - this._sessionCache.delete(key) - } - }) - } - - get (sessionKey) { - const ref = this._sessionCache.get(sessionKey) - return ref ? ref.deref() : null - } - - set (sessionKey, session) { - if (this._maxCachedSessions === 0) { - return - } - - this._sessionCache.set(sessionKey, new WeakRef(session)) - this._sessionRegistry.register(session, sessionKey) - } - } -} else { - SessionCache = class SimpleSessionCache { - constructor (maxCachedSessions) { - this._maxCachedSessions = maxCachedSessions - this._sessionCache = new Map() - } - - get (sessionKey) { - return this._sessionCache.get(sessionKey) - } - - set (sessionKey, session) { - if (this._maxCachedSessions === 0) { - return - } - - if (this._sessionCache.size >= this._maxCachedSessions) { - // remove the oldest session - const { value: oldestKey } = this._sessionCache.keys().next() - this._sessionCache.delete(oldestKey) - } - - this._sessionCache.set(sessionKey, session) - } - } -} - -function buildConnector ({ allowH2, maxCachedSessions, socketPath, timeout, session: customSession, ...opts }) { - if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) { - throw new InvalidArgumentError('maxCachedSessions must be a positive integer or zero') - } - - const options = { path: socketPath, ...opts } - const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions) - timeout = timeout == null ? 10e3 : timeout - allowH2 = allowH2 != null ? allowH2 : false - return function connect ({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) { - let socket - if (protocol === 'https:') { - if (!tls) { - tls = __nccwpck_require__(1692) - } - servername = servername || options.servername || util.getServerName(host) || null - - const sessionKey = servername || hostname - assert(sessionKey) - - const session = customSession || sessionCache.get(sessionKey) || null - - port = port || 443 - - socket = tls.connect({ - highWaterMark: 16384, // TLS in node can't have bigger HWM anyway... - ...options, - servername, - session, - localAddress, - // TODO(HTTP/2): Add support for h2c - ALPNProtocols: allowH2 ? ['http/1.1', 'h2'] : ['http/1.1'], - socket: httpSocket, // upgrade socket connection - port, - host: hostname - }) - - socket - .on('session', function (session) { - // TODO (fix): Can a session become invalid once established? Don't think so? - sessionCache.set(sessionKey, session) - }) - } else { - assert(!httpSocket, 'httpSocket can only be sent on TLS update') - - port = port || 80 - - socket = net.connect({ - highWaterMark: 64 * 1024, // Same as nodejs fs streams. - ...options, - localAddress, - port, - host: hostname - }) - } - - // Set TCP keep alive options on the socket here instead of in connect() for the case of assigning the socket - if (options.keepAlive == null || options.keepAlive) { - const keepAliveInitialDelay = options.keepAliveInitialDelay === undefined ? 60e3 : options.keepAliveInitialDelay - socket.setKeepAlive(true, keepAliveInitialDelay) - } - - const clearConnectTimeout = setupConnectTimeout(new WeakRef(socket), { timeout, hostname, port }) - - socket - .setNoDelay(true) - .once(protocol === 'https:' ? 'secureConnect' : 'connect', function () { - queueMicrotask(clearConnectTimeout) - - if (callback) { - const cb = callback - callback = null - cb(null, this) - } - }) - .on('error', function (err) { - queueMicrotask(clearConnectTimeout) - - if (callback) { - const cb = callback - callback = null - cb(err) - } - }) - - return socket - } -} - -/** - * @param {WeakRef } socketWeakRef - * @param {object} opts - * @param {number} opts.timeout - * @param {string} opts.hostname - * @param {number} opts.port - * @returns {() => void} - */ -const setupConnectTimeout = process.platform === 'win32' - ? (socketWeakRef, opts) => { - if (!opts.timeout) { - return noop - } - - let s1 = null - let s2 = null - const fastTimer = timers.setFastTimeout(() => { - // setImmediate is added to make sure that we prioritize socket error events over timeouts - s1 = setImmediate(() => { - // Windows needs an extra setImmediate probably due to implementation differences in the socket logic - s2 = setImmediate(() => onConnectTimeout(socketWeakRef.deref(), opts)) - }) - }, opts.timeout) - return () => { - timers.clearFastTimeout(fastTimer) - clearImmediate(s1) - clearImmediate(s2) - } - } - : (socketWeakRef, opts) => { - if (!opts.timeout) { - return noop - } - - let s1 = null - const fastTimer = timers.setFastTimeout(() => { - // setImmediate is added to make sure that we prioritize socket error events over timeouts - s1 = setImmediate(() => { - onConnectTimeout(socketWeakRef.deref(), opts) - }) - }, opts.timeout) - return () => { - timers.clearFastTimeout(fastTimer) - clearImmediate(s1) - } - } - -/** - * @param {net.Socket} socket - * @param {object} opts - * @param {number} opts.timeout - * @param {string} opts.hostname - * @param {number} opts.port - */ -function onConnectTimeout (socket, opts) { - // The socket could be already garbage collected - if (socket == null) { - return - } - - let message = 'Connect Timeout Error' - if (Array.isArray(socket.autoSelectFamilyAttemptedAddresses)) { - message += ` (attempted addresses: ${socket.autoSelectFamilyAttemptedAddresses.join(', ')},` - } else { - message += ` (attempted address: ${opts.hostname}:${opts.port},` - } - - message += ` timeout: ${opts.timeout}ms)` - - util.destroy(socket, new ConnectTimeoutError(message)) -} - -module.exports = buildConnector - - -/***/ }), - -/***/ 735: -/***/ ((module) => { - - - -/** @type {Record } */ -const headerNameLowerCasedRecord = {} - -// https://developer.mozilla.org/docs/Web/HTTP/Headers -const wellknownHeaderNames = [ - 'Accept', - 'Accept-Encoding', - 'Accept-Language', - 'Accept-Ranges', - 'Access-Control-Allow-Credentials', - 'Access-Control-Allow-Headers', - 'Access-Control-Allow-Methods', - 'Access-Control-Allow-Origin', - 'Access-Control-Expose-Headers', - 'Access-Control-Max-Age', - 'Access-Control-Request-Headers', - 'Access-Control-Request-Method', - 'Age', - 'Allow', - 'Alt-Svc', - 'Alt-Used', - 'Authorization', - 'Cache-Control', - 'Clear-Site-Data', - 'Connection', - 'Content-Disposition', - 'Content-Encoding', - 'Content-Language', - 'Content-Length', - 'Content-Location', - 'Content-Range', - 'Content-Security-Policy', - 'Content-Security-Policy-Report-Only', - 'Content-Type', - 'Cookie', - 'Cross-Origin-Embedder-Policy', - 'Cross-Origin-Opener-Policy', - 'Cross-Origin-Resource-Policy', - 'Date', - 'Device-Memory', - 'Downlink', - 'ECT', - 'ETag', - 'Expect', - 'Expect-CT', - 'Expires', - 'Forwarded', - 'From', - 'Host', - 'If-Match', - 'If-Modified-Since', - 'If-None-Match', - 'If-Range', - 'If-Unmodified-Since', - 'Keep-Alive', - 'Last-Modified', - 'Link', - 'Location', - 'Max-Forwards', - 'Origin', - 'Permissions-Policy', - 'Pragma', - 'Proxy-Authenticate', - 'Proxy-Authorization', - 'RTT', - 'Range', - 'Referer', - 'Referrer-Policy', - 'Refresh', - 'Retry-After', - 'Sec-WebSocket-Accept', - 'Sec-WebSocket-Extensions', - 'Sec-WebSocket-Key', - 'Sec-WebSocket-Protocol', - 'Sec-WebSocket-Version', - 'Server', - 'Server-Timing', - 'Service-Worker-Allowed', - 'Service-Worker-Navigation-Preload', - 'Set-Cookie', - 'SourceMap', - 'Strict-Transport-Security', - 'Supports-Loading-Mode', - 'TE', - 'Timing-Allow-Origin', - 'Trailer', - 'Transfer-Encoding', - 'Upgrade', - 'Upgrade-Insecure-Requests', - 'User-Agent', - 'Vary', - 'Via', - 'WWW-Authenticate', - 'X-Content-Type-Options', - 'X-DNS-Prefetch-Control', - 'X-Frame-Options', - 'X-Permitted-Cross-Domain-Policies', - 'X-Powered-By', - 'X-Requested-With', - 'X-XSS-Protection' -] - -for (let i = 0; i < wellknownHeaderNames.length; ++i) { - const key = wellknownHeaderNames[i] - const lowerCasedKey = key.toLowerCase() - headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] = - lowerCasedKey -} - -// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`. -Object.setPrototypeOf(headerNameLowerCasedRecord, null) - -module.exports = { - wellknownHeaderNames, - headerNameLowerCasedRecord -} - - -/***/ }), - -/***/ 2414: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - -const diagnosticsChannel = __nccwpck_require__(3053) -const util = __nccwpck_require__(7975) - -const undiciDebugLog = util.debuglog('undici') -const fetchDebuglog = util.debuglog('fetch') -const websocketDebuglog = util.debuglog('websocket') -let isClientSet = false -const channels = { - // Client - beforeConnect: diagnosticsChannel.channel('undici:client:beforeConnect'), - connected: diagnosticsChannel.channel('undici:client:connected'), - connectError: diagnosticsChannel.channel('undici:client:connectError'), - sendHeaders: diagnosticsChannel.channel('undici:client:sendHeaders'), - // Request - create: diagnosticsChannel.channel('undici:request:create'), - bodySent: diagnosticsChannel.channel('undici:request:bodySent'), - headers: diagnosticsChannel.channel('undici:request:headers'), - trailers: diagnosticsChannel.channel('undici:request:trailers'), - error: diagnosticsChannel.channel('undici:request:error'), - // WebSocket - open: diagnosticsChannel.channel('undici:websocket:open'), - close: diagnosticsChannel.channel('undici:websocket:close'), - socketError: diagnosticsChannel.channel('undici:websocket:socket_error'), - ping: diagnosticsChannel.channel('undici:websocket:ping'), - pong: diagnosticsChannel.channel('undici:websocket:pong') -} - -if (undiciDebugLog.enabled || fetchDebuglog.enabled) { - const debuglog = fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog - - // Track all Client events - diagnosticsChannel.channel('undici:client:beforeConnect').subscribe(evt => { - const { - connectParams: { version, protocol, port, host } - } = evt - debuglog( - 'connecting to %s using %s%s', - `${host}${port ? `:${port}` : ''}`, - protocol, - version - ) - }) - - diagnosticsChannel.channel('undici:client:connected').subscribe(evt => { - const { - connectParams: { version, protocol, port, host } - } = evt - debuglog( - 'connected to %s using %s%s', - `${host}${port ? `:${port}` : ''}`, - protocol, - version - ) - }) - - diagnosticsChannel.channel('undici:client:connectError').subscribe(evt => { - const { - connectParams: { version, protocol, port, host }, - error - } = evt - debuglog( - 'connection to %s using %s%s errored - %s', - `${host}${port ? `:${port}` : ''}`, - protocol, - version, - error.message - ) - }) - - diagnosticsChannel.channel('undici:client:sendHeaders').subscribe(evt => { - const { - request: { method, path, origin } - } = evt - debuglog('sending request to %s %s/%s', method, origin, path) - }) - - // Track Request events - diagnosticsChannel.channel('undici:request:headers').subscribe(evt => { - const { - request: { method, path, origin }, - response: { statusCode } - } = evt - debuglog( - 'received response to %s %s/%s - HTTP %d', - method, - origin, - path, - statusCode - ) - }) - - diagnosticsChannel.channel('undici:request:trailers').subscribe(evt => { - const { - request: { method, path, origin } - } = evt - debuglog('trailers received from %s %s/%s', method, origin, path) - }) - - diagnosticsChannel.channel('undici:request:error').subscribe(evt => { - const { - request: { method, path, origin }, - error - } = evt - debuglog( - 'request to %s %s/%s errored - %s', - method, - origin, - path, - error.message - ) - }) - - isClientSet = true -} - -if (websocketDebuglog.enabled) { - if (!isClientSet) { - const debuglog = undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog - diagnosticsChannel.channel('undici:client:beforeConnect').subscribe(evt => { - const { - connectParams: { version, protocol, port, host } - } = evt - debuglog( - 'connecting to %s%s using %s%s', - host, - port ? `:${port}` : '', - protocol, - version - ) - }) - - diagnosticsChannel.channel('undici:client:connected').subscribe(evt => { - const { - connectParams: { version, protocol, port, host } - } = evt - debuglog( - 'connected to %s%s using %s%s', - host, - port ? `:${port}` : '', - protocol, - version - ) - }) - - diagnosticsChannel.channel('undici:client:connectError').subscribe(evt => { - const { - connectParams: { version, protocol, port, host }, - error - } = evt - debuglog( - 'connection to %s%s using %s%s errored - %s', - host, - port ? `:${port}` : '', - protocol, - version, - error.message - ) - }) - - diagnosticsChannel.channel('undici:client:sendHeaders').subscribe(evt => { - const { - request: { method, path, origin } - } = evt - debuglog('sending request to %s %s/%s', method, origin, path) - }) - } - - // Track all WebSocket events - diagnosticsChannel.channel('undici:websocket:open').subscribe(evt => { - const { - address: { address, port } - } = evt - websocketDebuglog('connection opened %s%s', address, port ? `:${port}` : '') - }) - - diagnosticsChannel.channel('undici:websocket:close').subscribe(evt => { - const { websocket, code, reason } = evt - websocketDebuglog( - 'closed connection to %s - %s %s', - websocket.url, - code, - reason - ) - }) - - diagnosticsChannel.channel('undici:websocket:socket_error').subscribe(err => { - websocketDebuglog('connection errored - %s', err.message) - }) - - diagnosticsChannel.channel('undici:websocket:ping').subscribe(evt => { - websocketDebuglog('ping received') - }) - - diagnosticsChannel.channel('undici:websocket:pong').subscribe(evt => { - websocketDebuglog('pong received') - }) -} - -module.exports = { - channels -} - - -/***/ }), - -/***/ 8707: -/***/ ((module) => { - - - -const kUndiciError = Symbol.for('undici.error.UND_ERR') -class UndiciError extends Error { - constructor (message) { - super(message) - this.name = 'UndiciError' - this.code = 'UND_ERR' - } - - static [Symbol.hasInstance] (instance) { - return instance && instance[kUndiciError] === true - } - - [kUndiciError] = true -} - -const kConnectTimeoutError = Symbol.for('undici.error.UND_ERR_CONNECT_TIMEOUT') -class ConnectTimeoutError extends UndiciError { - constructor (message) { - super(message) - this.name = 'ConnectTimeoutError' - this.message = message || 'Connect Timeout Error' - this.code = 'UND_ERR_CONNECT_TIMEOUT' - } - - static [Symbol.hasInstance] (instance) { - return instance && instance[kConnectTimeoutError] === true - } - - [kConnectTimeoutError] = true -} - -const kHeadersTimeoutError = Symbol.for('undici.error.UND_ERR_HEADERS_TIMEOUT') -class HeadersTimeoutError extends UndiciError { - constructor (message) { - super(message) - this.name = 'HeadersTimeoutError' - this.message = message || 'Headers Timeout Error' - this.code = 'UND_ERR_HEADERS_TIMEOUT' - } - - static [Symbol.hasInstance] (instance) { - return instance && instance[kHeadersTimeoutError] === true - } - - [kHeadersTimeoutError] = true -} - -const kHeadersOverflowError = Symbol.for('undici.error.UND_ERR_HEADERS_OVERFLOW') -class HeadersOverflowError extends UndiciError { - constructor (message) { - super(message) - this.name = 'HeadersOverflowError' - this.message = message || 'Headers Overflow Error' - this.code = 'UND_ERR_HEADERS_OVERFLOW' - } - - static [Symbol.hasInstance] (instance) { - return instance && instance[kHeadersOverflowError] === true - } - - [kHeadersOverflowError] = true -} - -const kBodyTimeoutError = Symbol.for('undici.error.UND_ERR_BODY_TIMEOUT') -class BodyTimeoutError extends UndiciError { - constructor (message) { - super(message) - this.name = 'BodyTimeoutError' - this.message = message || 'Body Timeout Error' - this.code = 'UND_ERR_BODY_TIMEOUT' - } - - static [Symbol.hasInstance] (instance) { - return instance && instance[kBodyTimeoutError] === true - } - - [kBodyTimeoutError] = true -} - -const kResponseStatusCodeError = Symbol.for('undici.error.UND_ERR_RESPONSE_STATUS_CODE') -class ResponseStatusCodeError extends UndiciError { - constructor (message, statusCode, headers, body) { - super(message) - this.name = 'ResponseStatusCodeError' - this.message = message || 'Response Status Code Error' - this.code = 'UND_ERR_RESPONSE_STATUS_CODE' - this.body = body - this.status = statusCode - this.statusCode = statusCode - this.headers = headers - } - - static [Symbol.hasInstance] (instance) { - return instance && instance[kResponseStatusCodeError] === true - } - - [kResponseStatusCodeError] = true -} - -const kInvalidArgumentError = Symbol.for('undici.error.UND_ERR_INVALID_ARG') -class InvalidArgumentError extends UndiciError { - constructor (message) { - super(message) - this.name = 'InvalidArgumentError' - this.message = message || 'Invalid Argument Error' - this.code = 'UND_ERR_INVALID_ARG' - } - - static [Symbol.hasInstance] (instance) { - return instance && instance[kInvalidArgumentError] === true - } - - [kInvalidArgumentError] = true -} - -const kInvalidReturnValueError = Symbol.for('undici.error.UND_ERR_INVALID_RETURN_VALUE') -class InvalidReturnValueError extends UndiciError { - constructor (message) { - super(message) - this.name = 'InvalidReturnValueError' - this.message = message || 'Invalid Return Value Error' - this.code = 'UND_ERR_INVALID_RETURN_VALUE' - } - - static [Symbol.hasInstance] (instance) { - return instance && instance[kInvalidReturnValueError] === true - } - - [kInvalidReturnValueError] = true -} - -const kAbortError = Symbol.for('undici.error.UND_ERR_ABORT') -class AbortError extends UndiciError { - constructor (message) { - super(message) - this.name = 'AbortError' - this.message = message || 'The operation was aborted' - this.code = 'UND_ERR_ABORT' - } - - static [Symbol.hasInstance] (instance) { - return instance && instance[kAbortError] === true - } - - [kAbortError] = true -} - -const kRequestAbortedError = Symbol.for('undici.error.UND_ERR_ABORTED') -class RequestAbortedError extends AbortError { - constructor (message) { - super(message) - this.name = 'AbortError' - this.message = message || 'Request aborted' - this.code = 'UND_ERR_ABORTED' - } - - static [Symbol.hasInstance] (instance) { - return instance && instance[kRequestAbortedError] === true - } - - [kRequestAbortedError] = true -} - -const kInformationalError = Symbol.for('undici.error.UND_ERR_INFO') -class InformationalError extends UndiciError { - constructor (message) { - super(message) - this.name = 'InformationalError' - this.message = message || 'Request information' - this.code = 'UND_ERR_INFO' - } - - static [Symbol.hasInstance] (instance) { - return instance && instance[kInformationalError] === true - } - - [kInformationalError] = true -} - -const kRequestContentLengthMismatchError = Symbol.for('undici.error.UND_ERR_REQ_CONTENT_LENGTH_MISMATCH') -class RequestContentLengthMismatchError extends UndiciError { - constructor (message) { - super(message) - this.name = 'RequestContentLengthMismatchError' - this.message = message || 'Request body length does not match content-length header' - this.code = 'UND_ERR_REQ_CONTENT_LENGTH_MISMATCH' - } - - static [Symbol.hasInstance] (instance) { - return instance && instance[kRequestContentLengthMismatchError] === true - } - - [kRequestContentLengthMismatchError] = true -} - -const kResponseContentLengthMismatchError = Symbol.for('undici.error.UND_ERR_RES_CONTENT_LENGTH_MISMATCH') -class ResponseContentLengthMismatchError extends UndiciError { - constructor (message) { - super(message) - this.name = 'ResponseContentLengthMismatchError' - this.message = message || 'Response body length does not match content-length header' - this.code = 'UND_ERR_RES_CONTENT_LENGTH_MISMATCH' - } - - static [Symbol.hasInstance] (instance) { - return instance && instance[kResponseContentLengthMismatchError] === true - } - - [kResponseContentLengthMismatchError] = true -} - -const kClientDestroyedError = Symbol.for('undici.error.UND_ERR_DESTROYED') -class ClientDestroyedError extends UndiciError { - constructor (message) { - super(message) - this.name = 'ClientDestroyedError' - this.message = message || 'The client is destroyed' - this.code = 'UND_ERR_DESTROYED' - } - - static [Symbol.hasInstance] (instance) { - return instance && instance[kClientDestroyedError] === true - } - - [kClientDestroyedError] = true -} - -const kClientClosedError = Symbol.for('undici.error.UND_ERR_CLOSED') -class ClientClosedError extends UndiciError { - constructor (message) { - super(message) - this.name = 'ClientClosedError' - this.message = message || 'The client is closed' - this.code = 'UND_ERR_CLOSED' - } - - static [Symbol.hasInstance] (instance) { - return instance && instance[kClientClosedError] === true - } - - [kClientClosedError] = true -} - -const kSocketError = Symbol.for('undici.error.UND_ERR_SOCKET') -class SocketError extends UndiciError { - constructor (message, socket) { - super(message) - this.name = 'SocketError' - this.message = message || 'Socket error' - this.code = 'UND_ERR_SOCKET' - this.socket = socket - } - - static [Symbol.hasInstance] (instance) { - return instance && instance[kSocketError] === true - } - - [kSocketError] = true -} - -const kNotSupportedError = Symbol.for('undici.error.UND_ERR_NOT_SUPPORTED') -class NotSupportedError extends UndiciError { - constructor (message) { - super(message) - this.name = 'NotSupportedError' - this.message = message || 'Not supported error' - this.code = 'UND_ERR_NOT_SUPPORTED' - } - - static [Symbol.hasInstance] (instance) { - return instance && instance[kNotSupportedError] === true - } - - [kNotSupportedError] = true -} - -const kBalancedPoolMissingUpstreamError = Symbol.for('undici.error.UND_ERR_BPL_MISSING_UPSTREAM') -class BalancedPoolMissingUpstreamError extends UndiciError { - constructor (message) { - super(message) - this.name = 'MissingUpstreamError' - this.message = message || 'No upstream has been added to the BalancedPool' - this.code = 'UND_ERR_BPL_MISSING_UPSTREAM' - } - - static [Symbol.hasInstance] (instance) { - return instance && instance[kBalancedPoolMissingUpstreamError] === true - } - - [kBalancedPoolMissingUpstreamError] = true -} - -const kHTTPParserError = Symbol.for('undici.error.UND_ERR_HTTP_PARSER') -class HTTPParserError extends Error { - constructor (message, code, data) { - super(message) - this.name = 'HTTPParserError' - this.code = code ? `HPE_${code}` : undefined - this.data = data ? data.toString() : undefined - } - - static [Symbol.hasInstance] (instance) { - return instance && instance[kHTTPParserError] === true - } - - [kHTTPParserError] = true -} - -const kResponseExceededMaxSizeError = Symbol.for('undici.error.UND_ERR_RES_EXCEEDED_MAX_SIZE') -class ResponseExceededMaxSizeError extends UndiciError { - constructor (message) { - super(message) - this.name = 'ResponseExceededMaxSizeError' - this.message = message || 'Response content exceeded max size' - this.code = 'UND_ERR_RES_EXCEEDED_MAX_SIZE' - } - - static [Symbol.hasInstance] (instance) { - return instance && instance[kResponseExceededMaxSizeError] === true - } - - [kResponseExceededMaxSizeError] = true -} - -const kRequestRetryError = Symbol.for('undici.error.UND_ERR_REQ_RETRY') -class RequestRetryError extends UndiciError { - constructor (message, code, { headers, data }) { - super(message) - this.name = 'RequestRetryError' - this.message = message || 'Request retry error' - this.code = 'UND_ERR_REQ_RETRY' - this.statusCode = code - this.data = data - this.headers = headers - } - - static [Symbol.hasInstance] (instance) { - return instance && instance[kRequestRetryError] === true - } - - [kRequestRetryError] = true -} - -const kResponseError = Symbol.for('undici.error.UND_ERR_RESPONSE') -class ResponseError extends UndiciError { - constructor (message, code, { headers, data }) { - super(message) - this.name = 'ResponseError' - this.message = message || 'Response error' - this.code = 'UND_ERR_RESPONSE' - this.statusCode = code - this.data = data - this.headers = headers - } - - static [Symbol.hasInstance] (instance) { - return instance && instance[kResponseError] === true - } - - [kResponseError] = true -} - -const kSecureProxyConnectionError = Symbol.for('undici.error.UND_ERR_PRX_TLS') -class SecureProxyConnectionError extends UndiciError { - constructor (cause, message, options) { - super(message, { cause, ...(options ?? {}) }) - this.name = 'SecureProxyConnectionError' - this.message = message || 'Secure Proxy Connection failed' - this.code = 'UND_ERR_PRX_TLS' - this.cause = cause - } - - static [Symbol.hasInstance] (instance) { - return instance && instance[kSecureProxyConnectionError] === true - } - - [kSecureProxyConnectionError] = true -} - -const kMessageSizeExceededError = Symbol.for('undici.error.UND_ERR_WS_MESSAGE_SIZE_EXCEEDED') -class MessageSizeExceededError extends UndiciError { - constructor (message) { - super(message) - this.name = 'MessageSizeExceededError' - this.message = message || 'Max decompressed message size exceeded' - this.code = 'UND_ERR_WS_MESSAGE_SIZE_EXCEEDED' - } - - static [Symbol.hasInstance] (instance) { - return instance && instance[kMessageSizeExceededError] === true - } - - get [kMessageSizeExceededError] () { - return true - } -} - -module.exports = { - AbortError, - HTTPParserError, - UndiciError, - HeadersTimeoutError, - HeadersOverflowError, - BodyTimeoutError, - RequestContentLengthMismatchError, - ConnectTimeoutError, - ResponseStatusCodeError, - InvalidArgumentError, - InvalidReturnValueError, - RequestAbortedError, - ClientDestroyedError, - ClientClosedError, - InformationalError, - SocketError, - NotSupportedError, - ResponseContentLengthMismatchError, - BalancedPoolMissingUpstreamError, - ResponseExceededMaxSizeError, - RequestRetryError, - ResponseError, - SecureProxyConnectionError, - MessageSizeExceededError -} - - -/***/ }), - -/***/ 4655: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const { - InvalidArgumentError, - NotSupportedError -} = __nccwpck_require__(8707) -const assert = __nccwpck_require__(4589) -const { - isValidHTTPToken, - isValidHeaderValue, - isStream, - destroy, - isBuffer, - isFormDataLike, - isIterable, - isBlobLike, - buildURL, - validateHandler, - getServerName, - normalizedMethodRecords -} = __nccwpck_require__(3440) -const { channels } = __nccwpck_require__(2414) -const { headerNameLowerCasedRecord } = __nccwpck_require__(735) - -// Verifies that a given path is valid does not contain control chars \x00 to \x20 -const invalidPathRegex = /[^\u0021-\u00ff]/ - -const kHandler = Symbol('handler') - -class Request { - constructor (origin, { - path, - method, - body, - headers, - query, - idempotent, - blocking, - upgrade, - headersTimeout, - bodyTimeout, - reset, - throwOnError, - expectContinue, - servername - }, handler) { - if (typeof path !== 'string') { - throw new InvalidArgumentError('path must be a string') - } else if ( - path[0] !== '/' && - !(path.startsWith('http://') || path.startsWith('https://')) && - method !== 'CONNECT' - ) { - throw new InvalidArgumentError('path must be an absolute URL or start with a slash') - } else if (invalidPathRegex.test(path)) { - throw new InvalidArgumentError('invalid request path') - } - - if (typeof method !== 'string') { - throw new InvalidArgumentError('method must be a string') - } else if (normalizedMethodRecords[method] === undefined && !isValidHTTPToken(method)) { - throw new InvalidArgumentError('invalid request method') - } - - if (upgrade && typeof upgrade !== 'string') { - throw new InvalidArgumentError('upgrade must be a string') - } - - if (upgrade && !isValidHeaderValue(upgrade)) { - throw new InvalidArgumentError('invalid upgrade header') - } - - if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) { - throw new InvalidArgumentError('invalid headersTimeout') - } - - if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) { - throw new InvalidArgumentError('invalid bodyTimeout') - } - - if (reset != null && typeof reset !== 'boolean') { - throw new InvalidArgumentError('invalid reset') - } - - if (expectContinue != null && typeof expectContinue !== 'boolean') { - throw new InvalidArgumentError('invalid expectContinue') - } - - this.headersTimeout = headersTimeout - - this.bodyTimeout = bodyTimeout - - this.throwOnError = throwOnError === true - - this.method = method - - this.abort = null - - if (body == null) { - this.body = null - } else if (isStream(body)) { - this.body = body - - const rState = this.body._readableState - if (!rState || !rState.autoDestroy) { - this.endHandler = function autoDestroy () { - destroy(this) - } - this.body.on('end', this.endHandler) - } - - this.errorHandler = err => { - if (this.abort) { - this.abort(err) - } else { - this.error = err - } - } - this.body.on('error', this.errorHandler) - } else if (isBuffer(body)) { - this.body = body.byteLength ? body : null - } else if (ArrayBuffer.isView(body)) { - this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null - } else if (body instanceof ArrayBuffer) { - this.body = body.byteLength ? Buffer.from(body) : null - } else if (typeof body === 'string') { - this.body = body.length ? Buffer.from(body) : null - } else if (isFormDataLike(body) || isIterable(body) || isBlobLike(body)) { - this.body = body - } else { - throw new InvalidArgumentError('body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable') - } - - this.completed = false - - this.aborted = false - - this.upgrade = upgrade || null - - this.path = query ? buildURL(path, query) : path - - this.origin = origin - - this.idempotent = idempotent == null - ? method === 'HEAD' || method === 'GET' - : idempotent - - this.blocking = blocking == null ? false : blocking - - this.reset = reset == null ? null : reset - - this.host = null - - this.contentLength = null - - this.contentType = null - - this.headers = [] - - // Only for H2 - this.expectContinue = expectContinue != null ? expectContinue : false - - if (Array.isArray(headers)) { - if (headers.length % 2 !== 0) { - throw new InvalidArgumentError('headers array must be even') - } - for (let i = 0; i < headers.length; i += 2) { - processHeader(this, headers[i], headers[i + 1]) - } - } else if (headers && typeof headers === 'object') { - if (headers[Symbol.iterator]) { - for (const header of headers) { - if (!Array.isArray(header) || header.length !== 2) { - throw new InvalidArgumentError('headers must be in key-value pair format') - } - processHeader(this, header[0], header[1]) - } - } else { - const keys = Object.keys(headers) - for (let i = 0; i < keys.length; ++i) { - processHeader(this, keys[i], headers[keys[i]]) - } - } - } else if (headers != null) { - throw new InvalidArgumentError('headers must be an object or an array') - } - - validateHandler(handler, method, upgrade) - - this.servername = servername || getServerName(this.host) - - this[kHandler] = handler - - if (channels.create.hasSubscribers) { - channels.create.publish({ request: this }) - } - } - - onBodySent (chunk) { - if (this[kHandler].onBodySent) { - try { - return this[kHandler].onBodySent(chunk) - } catch (err) { - this.abort(err) - } - } - } - - onRequestSent () { - if (channels.bodySent.hasSubscribers) { - channels.bodySent.publish({ request: this }) - } - - if (this[kHandler].onRequestSent) { - try { - return this[kHandler].onRequestSent() - } catch (err) { - this.abort(err) - } - } - } - - onConnect (abort) { - assert(!this.aborted) - assert(!this.completed) - - if (this.error) { - abort(this.error) - } else { - this.abort = abort - return this[kHandler].onConnect(abort) - } - } - - onResponseStarted () { - return this[kHandler].onResponseStarted?.() - } - - onHeaders (statusCode, headers, resume, statusText) { - assert(!this.aborted) - assert(!this.completed) - - if (channels.headers.hasSubscribers) { - channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }) - } - - try { - return this[kHandler].onHeaders(statusCode, headers, resume, statusText) - } catch (err) { - this.abort(err) - } - } - - onData (chunk) { - assert(!this.aborted) - assert(!this.completed) - - try { - return this[kHandler].onData(chunk) - } catch (err) { - this.abort(err) - return false - } - } - - onUpgrade (statusCode, headers, socket) { - assert(!this.aborted) - assert(!this.completed) - - return this[kHandler].onUpgrade(statusCode, headers, socket) - } - - onComplete (trailers) { - this.onFinally() - - assert(!this.aborted) - - this.completed = true - if (channels.trailers.hasSubscribers) { - channels.trailers.publish({ request: this, trailers }) - } - - try { - return this[kHandler].onComplete(trailers) - } catch (err) { - // TODO (fix): This might be a bad idea? - this.onError(err) - } - } - - onError (error) { - this.onFinally() - - if (channels.error.hasSubscribers) { - channels.error.publish({ request: this, error }) - } - - if (this.aborted) { - return - } - this.aborted = true - - return this[kHandler].onError(error) - } - - onFinally () { - if (this.errorHandler) { - this.body.off('error', this.errorHandler) - this.errorHandler = null - } - - if (this.endHandler) { - this.body.off('end', this.endHandler) - this.endHandler = null - } - } - - addHeader (key, value) { - processHeader(this, key, value) - return this - } -} - -function processHeader (request, key, val) { - if (val && (typeof val === 'object' && !Array.isArray(val))) { - throw new InvalidArgumentError(`invalid ${key} header`) - } else if (val === undefined) { - return - } - - let headerName = headerNameLowerCasedRecord[key] - - if (headerName === undefined) { - headerName = key.toLowerCase() - if (headerNameLowerCasedRecord[headerName] === undefined && !isValidHTTPToken(headerName)) { - throw new InvalidArgumentError('invalid header key') - } - } - - if (Array.isArray(val)) { - const arr = [] - for (let i = 0; i < val.length; i++) { - if (typeof val[i] === 'string') { - if (!isValidHeaderValue(val[i])) { - throw new InvalidArgumentError(`invalid ${key} header`) - } - arr.push(val[i]) - } else if (val[i] === null) { - arr.push('') - } else if (typeof val[i] === 'object') { - throw new InvalidArgumentError(`invalid ${key} header`) - } else { - // Coerce primitives (and reject unsafe coercions such as functions - // with a crafted toString/Symbol.toPrimitive). - const str = `${val[i]}` - if (!isValidHeaderValue(str)) { - throw new InvalidArgumentError(`invalid ${key} header`) - } - arr.push(str) - } - } - val = arr - } else if (typeof val === 'string') { - if (!isValidHeaderValue(val)) { - throw new InvalidArgumentError(`invalid ${key} header`) - } - } else if (val === null) { - val = '' - } else { - // Coerce primitives (and reject unsafe coercions such as functions - // with a crafted toString/Symbol.toPrimitive). - val = `${val}` - if (!isValidHeaderValue(val)) { - throw new InvalidArgumentError(`invalid ${key} header`) - } - } - - if (headerName === 'host') { - if (request.host !== null) { - throw new InvalidArgumentError('duplicate host header') - } - if (typeof val !== 'string') { - throw new InvalidArgumentError('invalid host header') - } - // Consumed by Client - request.host = val - } else if (headerName === 'content-length') { - if (request.contentLength !== null) { - throw new InvalidArgumentError('duplicate content-length header') - } - request.contentLength = parseInt(val, 10) - if (!Number.isFinite(request.contentLength)) { - throw new InvalidArgumentError('invalid content-length header') - } - } else if (request.contentType === null && headerName === 'content-type') { - request.contentType = val - request.headers.push(key, val) - } else if (headerName === 'transfer-encoding' || headerName === 'keep-alive' || headerName === 'upgrade') { - throw new InvalidArgumentError(`invalid ${headerName} header`) - } else if (headerName === 'connection') { - const value = typeof val === 'string' ? val.toLowerCase() : null - if (value !== 'close' && value !== 'keep-alive') { - throw new InvalidArgumentError('invalid connection header') - } - - if (value === 'close') { - request.reset = true - } - } else if (headerName === 'expect') { - throw new NotSupportedError('expect header not supported') - } else { - request.headers.push(key, val) - } -} - -module.exports = Request - - -/***/ }), - -/***/ 6443: -/***/ ((module) => { - -module.exports = { - kClose: Symbol('close'), - kDestroy: Symbol('destroy'), - kDispatch: Symbol('dispatch'), - kUrl: Symbol('url'), - kWriting: Symbol('writing'), - kResuming: Symbol('resuming'), - kQueue: Symbol('queue'), - kConnect: Symbol('connect'), - kConnecting: Symbol('connecting'), - kKeepAliveDefaultTimeout: Symbol('default keep alive timeout'), - kKeepAliveMaxTimeout: Symbol('max keep alive timeout'), - kKeepAliveTimeoutThreshold: Symbol('keep alive timeout threshold'), - kKeepAliveTimeoutValue: Symbol('keep alive timeout'), - kKeepAlive: Symbol('keep alive'), - kHeadersTimeout: Symbol('headers timeout'), - kBodyTimeout: Symbol('body timeout'), - kServerName: Symbol('server name'), - kLocalAddress: Symbol('local address'), - kHost: Symbol('host'), - kNoRef: Symbol('no ref'), - kBodyUsed: Symbol('used'), - kBody: Symbol('abstracted request body'), - kRunning: Symbol('running'), - kBlocking: Symbol('blocking'), - kPending: Symbol('pending'), - kSize: Symbol('size'), - kBusy: Symbol('busy'), - kQueued: Symbol('queued'), - kFree: Symbol('free'), - kConnected: Symbol('connected'), - kClosed: Symbol('closed'), - kNeedDrain: Symbol('need drain'), - kReset: Symbol('reset'), - kDestroyed: Symbol.for('nodejs.stream.destroyed'), - kResume: Symbol('resume'), - kOnError: Symbol('on error'), - kMaxHeadersSize: Symbol('max headers size'), - kRunningIdx: Symbol('running index'), - kPendingIdx: Symbol('pending index'), - kError: Symbol('error'), - kClients: Symbol('clients'), - kClient: Symbol('client'), - kParser: Symbol('parser'), - kOnDestroyed: Symbol('destroy callbacks'), - kPipelining: Symbol('pipelining'), - kSocket: Symbol('socket'), - kHostHeader: Symbol('host header'), - kConnector: Symbol('connector'), - kStrictContentLength: Symbol('strict content length'), - kMaxRedirections: Symbol('maxRedirections'), - kMaxRequests: Symbol('maxRequestsPerClient'), - kProxy: Symbol('proxy agent options'), - kCounter: Symbol('socket request counter'), - kInterceptors: Symbol('dispatch interceptors'), - kMaxResponseSize: Symbol('max response size'), - kHTTP2Session: Symbol('http2Session'), - kHTTP2SessionState: Symbol('http2Session state'), - kRetryHandlerDefaultRetry: Symbol('retry agent default retry'), - kConstruct: Symbol('constructable'), - kListeners: Symbol('listeners'), - kHTTPContext: Symbol('http context'), - kMaxConcurrentStreams: Symbol('max concurrent streams'), - kNoProxyAgent: Symbol('no proxy agent'), - kHttpProxyAgent: Symbol('http proxy agent'), - kHttpsProxyAgent: Symbol('https proxy agent') -} - - -/***/ }), - -/***/ 7752: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const { - wellknownHeaderNames, - headerNameLowerCasedRecord -} = __nccwpck_require__(735) - -class TstNode { - /** @type {any} */ - value = null - /** @type {null | TstNode} */ - left = null - /** @type {null | TstNode} */ - middle = null - /** @type {null | TstNode} */ - right = null - /** @type {number} */ - code - /** - * @param {string} key - * @param {any} value - * @param {number} index - */ - constructor (key, value, index) { - if (index === undefined || index >= key.length) { - throw new TypeError('Unreachable') - } - const code = this.code = key.charCodeAt(index) - // check code is ascii string - if (code > 0x7F) { - throw new TypeError('key must be ascii string') - } - if (key.length !== ++index) { - this.middle = new TstNode(key, value, index) - } else { - this.value = value - } - } - - /** - * @param {string} key - * @param {any} value - */ - add (key, value) { - const length = key.length - if (length === 0) { - throw new TypeError('Unreachable') - } - let index = 0 - let node = this - while (true) { - const code = key.charCodeAt(index) - // check code is ascii string - if (code > 0x7F) { - throw new TypeError('key must be ascii string') - } - if (node.code === code) { - if (length === ++index) { - node.value = value - break - } else if (node.middle !== null) { - node = node.middle - } else { - node.middle = new TstNode(key, value, index) - break - } - } else if (node.code < code) { - if (node.left !== null) { - node = node.left - } else { - node.left = new TstNode(key, value, index) - break - } - } else if (node.right !== null) { - node = node.right - } else { - node.right = new TstNode(key, value, index) - break - } - } - } - - /** - * @param {Uint8Array} key - * @return {TstNode | null} - */ - search (key) { - const keylength = key.length - let index = 0 - let node = this - while (node !== null && index < keylength) { - let code = key[index] - // A-Z - // First check if it is bigger than 0x5a. - // Lowercase letters have higher char codes than uppercase ones. - // Also we assume that headers will mostly contain lowercase characters. - if (code <= 0x5a && code >= 0x41) { - // Lowercase for uppercase. - code |= 32 - } - while (node !== null) { - if (code === node.code) { - if (keylength === ++index) { - // Returns Node since it is the last key. - return node - } - node = node.middle - break - } - node = node.code < code ? node.left : node.right - } - } - return null - } -} - -class TernarySearchTree { - /** @type {TstNode | null} */ - node = null - - /** - * @param {string} key - * @param {any} value - * */ - insert (key, value) { - if (this.node === null) { - this.node = new TstNode(key, value, 0) - } else { - this.node.add(key, value) - } - } - - /** - * @param {Uint8Array} key - * @return {any} - */ - lookup (key) { - return this.node?.search(key)?.value ?? null - } -} - -const tree = new TernarySearchTree() - -for (let i = 0; i < wellknownHeaderNames.length; ++i) { - const key = headerNameLowerCasedRecord[wellknownHeaderNames[i]] - tree.insert(key, key) -} - -module.exports = { - TernarySearchTree, - tree -} - - -/***/ }), - -/***/ 3440: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const assert = __nccwpck_require__(4589) -const { kDestroyed, kBodyUsed, kListeners, kBody } = __nccwpck_require__(6443) -const { IncomingMessage } = __nccwpck_require__(7067) -const stream = __nccwpck_require__(7075) -const net = __nccwpck_require__(7030) -const { Blob } = __nccwpck_require__(4573) -const nodeUtil = __nccwpck_require__(7975) -const { stringify } = __nccwpck_require__(1792) -const { EventEmitter: EE } = __nccwpck_require__(8474) -const { InvalidArgumentError } = __nccwpck_require__(8707) -const { headerNameLowerCasedRecord } = __nccwpck_require__(735) -const { tree } = __nccwpck_require__(7752) - -const [nodeMajor, nodeMinor] = process.versions.node.split('.').map(v => Number(v)) - -class BodyAsyncIterable { - constructor (body) { - this[kBody] = body - this[kBodyUsed] = false - } - - async * [Symbol.asyncIterator] () { - assert(!this[kBodyUsed], 'disturbed') - this[kBodyUsed] = true - yield * this[kBody] - } -} - -function wrapRequestBody (body) { - if (isStream(body)) { - // TODO (fix): Provide some way for the user to cache the file to e.g. /tmp - // so that it can be dispatched again? - // TODO (fix): Do we need 100-expect support to provide a way to do this properly? - if (bodyLength(body) === 0) { - body - .on('data', function () { - assert(false) - }) - } - - if (typeof body.readableDidRead !== 'boolean') { - body[kBodyUsed] = false - EE.prototype.on.call(body, 'data', function () { - this[kBodyUsed] = true - }) - } - - return body - } else if (body && typeof body.pipeTo === 'function') { - // TODO (fix): We can't access ReadableStream internal state - // to determine whether or not it has been disturbed. This is just - // a workaround. - return new BodyAsyncIterable(body) - } else if ( - body && - typeof body !== 'string' && - !ArrayBuffer.isView(body) && - isIterable(body) - ) { - // TODO: Should we allow re-using iterable if !this.opts.idempotent - // or through some other flag? - return new BodyAsyncIterable(body) - } else { - return body - } -} - -function nop () {} - -function isStream (obj) { - return obj && typeof obj === 'object' && typeof obj.pipe === 'function' && typeof obj.on === 'function' -} - -// based on https://github.com/node-fetch/fetch-blob/blob/8ab587d34080de94140b54f07168451e7d0b655e/index.js#L229-L241 (MIT License) -function isBlobLike (object) { - if (object === null) { - return false - } else if (object instanceof Blob) { - return true - } else if (typeof object !== 'object') { - return false - } else { - const sTag = object[Symbol.toStringTag] - - return (sTag === 'Blob' || sTag === 'File') && ( - ('stream' in object && typeof object.stream === 'function') || - ('arrayBuffer' in object && typeof object.arrayBuffer === 'function') - ) - } -} - -function buildURL (url, queryParams) { - if (url.includes('?') || url.includes('#')) { - throw new Error('Query params cannot be passed when url already contains "?" or "#".') - } - - const stringified = stringify(queryParams) - - if (stringified) { - url += '?' + stringified - } - - return url -} - -function isValidPort (port) { - const value = parseInt(port, 10) - return ( - value === Number(port) && - value >= 0 && - value <= 65535 - ) -} - -function isHttpOrHttpsPrefixed (value) { - return ( - value != null && - value[0] === 'h' && - value[1] === 't' && - value[2] === 't' && - value[3] === 'p' && - ( - value[4] === ':' || - ( - value[4] === 's' && - value[5] === ':' - ) - ) - ) -} - -function parseURL (url) { - if (typeof url === 'string') { - url = new URL(url) - - if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { - throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.') - } - - return url - } - - if (!url || typeof url !== 'object') { - throw new InvalidArgumentError('Invalid URL: The URL argument must be a non-null object.') - } - - if (!(url instanceof URL)) { - if (url.port != null && url.port !== '' && isValidPort(url.port) === false) { - throw new InvalidArgumentError('Invalid URL: port must be a valid integer or a string representation of an integer.') - } - - if (url.path != null && typeof url.path !== 'string') { - throw new InvalidArgumentError('Invalid URL path: the path must be a string or null/undefined.') - } - - if (url.pathname != null && typeof url.pathname !== 'string') { - throw new InvalidArgumentError('Invalid URL pathname: the pathname must be a string or null/undefined.') - } - - if (url.hostname != null && typeof url.hostname !== 'string') { - throw new InvalidArgumentError('Invalid URL hostname: the hostname must be a string or null/undefined.') - } - - if (url.origin != null && typeof url.origin !== 'string') { - throw new InvalidArgumentError('Invalid URL origin: the origin must be a string or null/undefined.') - } - - if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { - throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.') - } - - const port = url.port != null - ? url.port - : (url.protocol === 'https:' ? 443 : 80) - let origin = url.origin != null - ? url.origin - : `${url.protocol || ''}//${url.hostname || ''}:${port}` - let path = url.path != null - ? url.path - : `${url.pathname || ''}${url.search || ''}` - - if (origin[origin.length - 1] === '/') { - origin = origin.slice(0, origin.length - 1) - } - - if (path && path[0] !== '/') { - path = `/${path}` - } - // new URL(path, origin) is unsafe when `path` contains an absolute URL - // From https://developer.mozilla.org/en-US/docs/Web/API/URL/URL: - // If first parameter is a relative URL, second param is required, and will be used as the base URL. - // If first parameter is an absolute URL, a given second param will be ignored. - return new URL(`${origin}${path}`) - } - - if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { - throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.') - } - - return url -} - -function parseOrigin (url) { - url = parseURL(url) - - if (url.pathname !== '/' || url.search || url.hash) { - throw new InvalidArgumentError('invalid url') - } - - return url -} - -function getHostname (host) { - if (host[0] === '[') { - const idx = host.indexOf(']') - - assert(idx !== -1) - return host.substring(1, idx) - } - - const idx = host.indexOf(':') - if (idx === -1) return host - - return host.substring(0, idx) -} - -// IP addresses are not valid server names per RFC6066 -// > Currently, the only server names supported are DNS hostnames -function getServerName (host) { - if (!host) { - return null - } - - assert(typeof host === 'string') - - const servername = getHostname(host) - if (net.isIP(servername)) { - return '' - } - - return servername -} - -function deepClone (obj) { - return JSON.parse(JSON.stringify(obj)) -} - -function isAsyncIterable (obj) { - return !!(obj != null && typeof obj[Symbol.asyncIterator] === 'function') -} - -function isIterable (obj) { - return !!(obj != null && (typeof obj[Symbol.iterator] === 'function' || typeof obj[Symbol.asyncIterator] === 'function')) -} - -function bodyLength (body) { - if (body == null) { - return 0 - } else if (isStream(body)) { - const state = body._readableState - return state && state.objectMode === false && state.ended === true && Number.isFinite(state.length) - ? state.length - : null - } else if (isBlobLike(body)) { - return body.size != null ? body.size : null - } else if (isBuffer(body)) { - return body.byteLength - } - - return null -} - -function isDestroyed (body) { - return body && !!(body.destroyed || body[kDestroyed] || (stream.isDestroyed?.(body))) -} - -function destroy (stream, err) { - if (stream == null || !isStream(stream) || isDestroyed(stream)) { - return - } - - if (typeof stream.destroy === 'function') { - if (Object.getPrototypeOf(stream).constructor === IncomingMessage) { - // See: https://github.com/nodejs/node/pull/38505/files - stream.socket = null - } - - stream.destroy(err) - } else if (err) { - queueMicrotask(() => { - stream.emit('error', err) - }) - } - - if (stream.destroyed !== true) { - stream[kDestroyed] = true - } -} - -const KEEPALIVE_TIMEOUT_EXPR = /timeout=(\d+)/ -function parseKeepAliveTimeout (val) { - const m = val.toString().match(KEEPALIVE_TIMEOUT_EXPR) - return m ? parseInt(m[1], 10) * 1000 : null -} - -/** - * Retrieves a header name and returns its lowercase value. - * @param {string | Buffer} value Header name - * @returns {string} - */ -function headerNameToString (value) { - return typeof value === 'string' - ? headerNameLowerCasedRecord[value] ?? value.toLowerCase() - : tree.lookup(value) ?? value.toString('latin1').toLowerCase() -} - -/** - * Receive the buffer as a string and return its lowercase value. - * @param {Buffer} value Header name - * @returns {string} - */ -function bufferToLowerCasedHeaderName (value) { - return tree.lookup(value) ?? value.toString('latin1').toLowerCase() -} - -/** - * @param {Record | (Buffer | string | (Buffer | string)[])[]} headers - * @param {Record } [obj] - * @returns {Record } - */ -function parseHeaders (headers, obj) { - if (obj === undefined) obj = {} - for (let i = 0; i < headers.length; i += 2) { - const key = headerNameToString(headers[i]) - let val = obj[key] - - if (val) { - if (typeof val === 'string') { - val = [val] - obj[key] = val - } - val.push(headers[i + 1].toString('utf8')) - } else { - const headersValue = headers[i + 1] - if (typeof headersValue === 'string') { - obj[key] = headersValue - } else { - obj[key] = Array.isArray(headersValue) ? headersValue.map(x => x.toString('utf8')) : headersValue.toString('utf8') - } - } - } - - // See https://github.com/nodejs/node/pull/46528 - if ('content-length' in obj && 'content-disposition' in obj) { - obj['content-disposition'] = Buffer.from(obj['content-disposition']).toString('latin1') - } - - return obj -} - -function parseRawHeaders (headers) { - const len = headers.length - const ret = new Array(len) - - let hasContentLength = false - let contentDispositionIdx = -1 - let key - let val - let kLen = 0 - - for (let n = 0; n < headers.length; n += 2) { - key = headers[n] - val = headers[n + 1] - - typeof key !== 'string' && (key = key.toString()) - typeof val !== 'string' && (val = val.toString('utf8')) - - kLen = key.length - if (kLen === 14 && key[7] === '-' && (key === 'content-length' || key.toLowerCase() === 'content-length')) { - hasContentLength = true - } else if (kLen === 19 && key[7] === '-' && (key === 'content-disposition' || key.toLowerCase() === 'content-disposition')) { - contentDispositionIdx = n + 1 - } - ret[n] = key - ret[n + 1] = val - } - - // See https://github.com/nodejs/node/pull/46528 - if (hasContentLength && contentDispositionIdx !== -1) { - ret[contentDispositionIdx] = Buffer.from(ret[contentDispositionIdx]).toString('latin1') - } - - return ret -} - -function isBuffer (buffer) { - // See, https://github.com/mcollina/undici/pull/319 - return buffer instanceof Uint8Array || Buffer.isBuffer(buffer) -} - -function validateHandler (handler, method, upgrade) { - if (!handler || typeof handler !== 'object') { - throw new InvalidArgumentError('handler must be an object') - } - - if (typeof handler.onConnect !== 'function') { - throw new InvalidArgumentError('invalid onConnect method') - } - - if (typeof handler.onError !== 'function') { - throw new InvalidArgumentError('invalid onError method') - } - - if (typeof handler.onBodySent !== 'function' && handler.onBodySent !== undefined) { - throw new InvalidArgumentError('invalid onBodySent method') - } - - if (upgrade || method === 'CONNECT') { - if (typeof handler.onUpgrade !== 'function') { - throw new InvalidArgumentError('invalid onUpgrade method') - } - } else { - if (typeof handler.onHeaders !== 'function') { - throw new InvalidArgumentError('invalid onHeaders method') - } - - if (typeof handler.onData !== 'function') { - throw new InvalidArgumentError('invalid onData method') - } - - if (typeof handler.onComplete !== 'function') { - throw new InvalidArgumentError('invalid onComplete method') - } - } -} - -// A body is disturbed if it has been read from and it cannot -// be re-used without losing state or data. -function isDisturbed (body) { - // TODO (fix): Why is body[kBodyUsed] needed? - return !!(body && (stream.isDisturbed(body) || body[kBodyUsed])) -} - -function isErrored (body) { - return !!(body && stream.isErrored(body)) -} - -function isReadable (body) { - return !!(body && stream.isReadable(body)) -} - -function getSocketInfo (socket) { - return { - localAddress: socket.localAddress, - localPort: socket.localPort, - remoteAddress: socket.remoteAddress, - remotePort: socket.remotePort, - remoteFamily: socket.remoteFamily, - timeout: socket.timeout, - bytesWritten: socket.bytesWritten, - bytesRead: socket.bytesRead - } -} - -/** @type {globalThis['ReadableStream']} */ -function ReadableStreamFrom (iterable) { - // We cannot use ReadableStream.from here because it does not return a byte stream. - - let iterator - return new ReadableStream( - { - async start () { - iterator = iterable[Symbol.asyncIterator]() - }, - async pull (controller) { - const { done, value } = await iterator.next() - if (done) { - queueMicrotask(() => { - controller.close() - controller.byobRequest?.respond(0) - }) - } else { - const buf = Buffer.isBuffer(value) ? value : Buffer.from(value) - if (buf.byteLength) { - controller.enqueue(new Uint8Array(buf)) - } - } - return controller.desiredSize > 0 - }, - async cancel (reason) { - await iterator.return() - }, - type: 'bytes' - } - ) -} - -// The chunk should be a FormData instance and contains -// all the required methods. -function isFormDataLike (object) { - return ( - object && - typeof object === 'object' && - typeof object.append === 'function' && - typeof object.delete === 'function' && - typeof object.get === 'function' && - typeof object.getAll === 'function' && - typeof object.has === 'function' && - typeof object.set === 'function' && - object[Symbol.toStringTag] === 'FormData' - ) -} - -function addAbortListener (signal, listener) { - if ('addEventListener' in signal) { - signal.addEventListener('abort', listener, { once: true }) - return () => signal.removeEventListener('abort', listener) - } - signal.addListener('abort', listener) - return () => signal.removeListener('abort', listener) -} - -const hasToWellFormed = typeof String.prototype.toWellFormed === 'function' -const hasIsWellFormed = typeof String.prototype.isWellFormed === 'function' - -/** - * @param {string} val - */ -function toUSVString (val) { - return hasToWellFormed ? `${val}`.toWellFormed() : nodeUtil.toUSVString(val) -} - -/** - * @param {string} val - */ -// TODO: move this to webidl -function isUSVString (val) { - return hasIsWellFormed ? `${val}`.isWellFormed() : toUSVString(val) === `${val}` -} - -/** - * @see https://tools.ietf.org/html/rfc7230#section-3.2.6 - * @param {number} c - */ -function isTokenCharCode (c) { - switch (c) { - case 0x22: - case 0x28: - case 0x29: - case 0x2c: - case 0x2f: - case 0x3a: - case 0x3b: - case 0x3c: - case 0x3d: - case 0x3e: - case 0x3f: - case 0x40: - case 0x5b: - case 0x5c: - case 0x5d: - case 0x7b: - case 0x7d: - // DQUOTE and "(),/:;<=>?@[\]{}" - return false - default: - // VCHAR %x21-7E - return c >= 0x21 && c <= 0x7e - } -} - -/** - * @param {string} characters - */ -function isValidHTTPToken (characters) { - if (characters.length === 0) { - return false - } - for (let i = 0; i < characters.length; ++i) { - if (!isTokenCharCode(characters.charCodeAt(i))) { - return false - } - } - return true -} - -// headerCharRegex have been lifted from -// https://github.com/nodejs/node/blob/main/lib/_http_common.js - -/** - * Matches if val contains an invalid field-vchar - * field-value = *( field-content / obs-fold ) - * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] - * field-vchar = VCHAR / obs-text - */ -const headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/ - -/** - * @param {string} characters - */ -function isValidHeaderValue (characters) { - return !headerCharRegex.test(characters) -} - -// Parsed accordingly to RFC 9110 -// https://www.rfc-editor.org/rfc/rfc9110#field.content-range -function parseRangeHeader (range) { - if (range == null || range === '') return { start: 0, end: null, size: null } - - const m = range ? range.match(/^bytes (\d+)-(\d+)\/(\d+)?$/) : null - return m - ? { - start: parseInt(m[1]), - end: m[2] ? parseInt(m[2]) : null, - size: m[3] ? parseInt(m[3]) : null - } - : null -} - -function addListener (obj, name, listener) { - const listeners = (obj[kListeners] ??= []) - listeners.push([name, listener]) - obj.on(name, listener) - return obj -} - -function removeAllListeners (obj) { - for (const [name, listener] of obj[kListeners] ?? []) { - obj.removeListener(name, listener) - } - obj[kListeners] = null -} - -function errorRequest (client, request, err) { - try { - request.onError(err) - assert(request.aborted) - } catch (err) { - client.emit('error', err) - } -} - -const kEnumerableProperty = Object.create(null) -kEnumerableProperty.enumerable = true - -const normalizedMethodRecordsBase = { - delete: 'DELETE', - DELETE: 'DELETE', - get: 'GET', - GET: 'GET', - head: 'HEAD', - HEAD: 'HEAD', - options: 'OPTIONS', - OPTIONS: 'OPTIONS', - post: 'POST', - POST: 'POST', - put: 'PUT', - PUT: 'PUT' -} - -const normalizedMethodRecords = { - ...normalizedMethodRecordsBase, - patch: 'patch', - PATCH: 'PATCH' -} - -// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`. -Object.setPrototypeOf(normalizedMethodRecordsBase, null) -Object.setPrototypeOf(normalizedMethodRecords, null) - -module.exports = { - kEnumerableProperty, - nop, - isDisturbed, - isErrored, - isReadable, - toUSVString, - isUSVString, - isBlobLike, - parseOrigin, - parseURL, - getServerName, - isStream, - isIterable, - isAsyncIterable, - isDestroyed, - headerNameToString, - bufferToLowerCasedHeaderName, - addListener, - removeAllListeners, - errorRequest, - parseRawHeaders, - parseHeaders, - parseKeepAliveTimeout, - destroy, - bodyLength, - deepClone, - ReadableStreamFrom, - isBuffer, - validateHandler, - getSocketInfo, - isFormDataLike, - buildURL, - addAbortListener, - isValidHTTPToken, - isValidHeaderValue, - isTokenCharCode, - parseRangeHeader, - normalizedMethodRecordsBase, - normalizedMethodRecords, - isValidPort, - isHttpOrHttpsPrefixed, - nodeMajor, - nodeMinor, - safeHTTPMethods: ['GET', 'HEAD', 'OPTIONS', 'TRACE'], - wrapRequestBody -} - - -/***/ }), - -/***/ 7405: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const { InvalidArgumentError } = __nccwpck_require__(8707) -const { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = __nccwpck_require__(6443) -const DispatcherBase = __nccwpck_require__(1841) -const Pool = __nccwpck_require__(628) -const Client = __nccwpck_require__(3701) -const util = __nccwpck_require__(3440) -const createRedirectInterceptor = __nccwpck_require__(5092) - -const kOnConnect = Symbol('onConnect') -const kOnDisconnect = Symbol('onDisconnect') -const kOnConnectionError = Symbol('onConnectionError') -const kMaxRedirections = Symbol('maxRedirections') -const kOnDrain = Symbol('onDrain') -const kFactory = Symbol('factory') -const kOptions = Symbol('options') - -function defaultFactory (origin, opts) { - return opts && opts.connections === 1 - ? new Client(origin, opts) - : new Pool(origin, opts) -} - -class Agent extends DispatcherBase { - constructor ({ factory = defaultFactory, maxRedirections = 0, connect, ...options } = {}) { - if (typeof factory !== 'function') { - throw new InvalidArgumentError('factory must be a function.') - } - - if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { - throw new InvalidArgumentError('connect must be a function or an object') - } - - if (!Number.isInteger(maxRedirections) || maxRedirections < 0) { - throw new InvalidArgumentError('maxRedirections must be a positive number') - } - - super(options) - - if (connect && typeof connect !== 'function') { - connect = { ...connect } - } - - this[kInterceptors] = options.interceptors?.Agent && Array.isArray(options.interceptors.Agent) - ? options.interceptors.Agent - : [createRedirectInterceptor({ maxRedirections })] - - this[kOptions] = { ...util.deepClone(options), connect } - this[kOptions].interceptors = options.interceptors - ? { ...options.interceptors } - : undefined - this[kMaxRedirections] = maxRedirections - this[kFactory] = factory - this[kClients] = new Map() - - this[kOnDrain] = (origin, targets) => { - this.emit('drain', origin, [this, ...targets]) - } - - this[kOnConnect] = (origin, targets) => { - this.emit('connect', origin, [this, ...targets]) - } - - this[kOnDisconnect] = (origin, targets, err) => { - this.emit('disconnect', origin, [this, ...targets], err) - } - - this[kOnConnectionError] = (origin, targets, err) => { - this.emit('connectionError', origin, [this, ...targets], err) - } - } - - get [kRunning] () { - let ret = 0 - for (const client of this[kClients].values()) { - ret += client[kRunning] - } - return ret - } - - [kDispatch] (opts, handler) { - let key - if (opts.origin && (typeof opts.origin === 'string' || opts.origin instanceof URL)) { - key = String(opts.origin) - } else { - throw new InvalidArgumentError('opts.origin must be a non-empty string or URL.') - } - - let dispatcher = this[kClients].get(key) - - if (!dispatcher) { - dispatcher = this[kFactory](opts.origin, this[kOptions]) - .on('drain', this[kOnDrain]) - .on('connect', this[kOnConnect]) - .on('disconnect', this[kOnDisconnect]) - .on('connectionError', this[kOnConnectionError]) - - // This introduces a tiny memory leak, as dispatchers are never removed from the map. - // TODO(mcollina): remove te timer when the client/pool do not have any more - // active connections. - this[kClients].set(key, dispatcher) - } - - return dispatcher.dispatch(opts, handler) - } - - async [kClose] () { - const closePromises = [] - for (const client of this[kClients].values()) { - closePromises.push(client.close()) - } - this[kClients].clear() - - await Promise.all(closePromises) - } - - async [kDestroy] (err) { - const destroyPromises = [] - for (const client of this[kClients].values()) { - destroyPromises.push(client.destroy(err)) - } - this[kClients].clear() - - await Promise.all(destroyPromises) - } -} - -module.exports = Agent - - -/***/ }), - -/***/ 837: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const { - BalancedPoolMissingUpstreamError, - InvalidArgumentError -} = __nccwpck_require__(8707) -const { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kRemoveClient, - kGetDispatcher -} = __nccwpck_require__(2128) -const Pool = __nccwpck_require__(628) -const { kUrl, kInterceptors } = __nccwpck_require__(6443) -const { parseOrigin } = __nccwpck_require__(3440) -const kFactory = Symbol('factory') - -const kOptions = Symbol('options') -const kGreatestCommonDivisor = Symbol('kGreatestCommonDivisor') -const kCurrentWeight = Symbol('kCurrentWeight') -const kIndex = Symbol('kIndex') -const kWeight = Symbol('kWeight') -const kMaxWeightPerServer = Symbol('kMaxWeightPerServer') -const kErrorPenalty = Symbol('kErrorPenalty') - -/** - * Calculate the greatest common divisor of two numbers by - * using the Euclidean algorithm. - * - * @param {number} a - * @param {number} b - * @returns {number} - */ -function getGreatestCommonDivisor (a, b) { - if (a === 0) return b - - while (b !== 0) { - const t = b - b = a % b - a = t - } - return a -} - -function defaultFactory (origin, opts) { - return new Pool(origin, opts) -} - -class BalancedPool extends PoolBase { - constructor (upstreams = [], { factory = defaultFactory, ...opts } = {}) { - super() - - this[kOptions] = opts - this[kIndex] = -1 - this[kCurrentWeight] = 0 - - this[kMaxWeightPerServer] = this[kOptions].maxWeightPerServer || 100 - this[kErrorPenalty] = this[kOptions].errorPenalty || 15 - - if (!Array.isArray(upstreams)) { - upstreams = [upstreams] - } - - if (typeof factory !== 'function') { - throw new InvalidArgumentError('factory must be a function.') - } - - this[kInterceptors] = opts.interceptors?.BalancedPool && Array.isArray(opts.interceptors.BalancedPool) - ? opts.interceptors.BalancedPool - : [] - this[kFactory] = factory - - for (const upstream of upstreams) { - this.addUpstream(upstream) - } - this._updateBalancedPoolStats() - } - - addUpstream (upstream) { - const upstreamOrigin = parseOrigin(upstream).origin - - if (this[kClients].find((pool) => ( - pool[kUrl].origin === upstreamOrigin && - pool.closed !== true && - pool.destroyed !== true - ))) { - return this - } - const pool = this[kFactory](upstreamOrigin, Object.assign({}, this[kOptions])) - - this[kAddClient](pool) - pool.on('connect', () => { - pool[kWeight] = Math.min(this[kMaxWeightPerServer], pool[kWeight] + this[kErrorPenalty]) - }) - - pool.on('connectionError', () => { - pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]) - this._updateBalancedPoolStats() - }) - - pool.on('disconnect', (...args) => { - const err = args[2] - if (err && err.code === 'UND_ERR_SOCKET') { - // decrease the weight of the pool. - pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]) - this._updateBalancedPoolStats() - } - }) - - for (const client of this[kClients]) { - client[kWeight] = this[kMaxWeightPerServer] - } - - this._updateBalancedPoolStats() - - return this - } - - _updateBalancedPoolStats () { - let result = 0 - for (let i = 0; i < this[kClients].length; i++) { - result = getGreatestCommonDivisor(this[kClients][i][kWeight], result) - } - - this[kGreatestCommonDivisor] = result - } - - removeUpstream (upstream) { - const upstreamOrigin = parseOrigin(upstream).origin - - const pool = this[kClients].find((pool) => ( - pool[kUrl].origin === upstreamOrigin && - pool.closed !== true && - pool.destroyed !== true - )) - - if (pool) { - this[kRemoveClient](pool) - } - - return this - } - - get upstreams () { - return this[kClients] - .filter(dispatcher => dispatcher.closed !== true && dispatcher.destroyed !== true) - .map((p) => p[kUrl].origin) - } - - [kGetDispatcher] () { - // We validate that pools is greater than 0, - // otherwise we would have to wait until an upstream - // is added, which might never happen. - if (this[kClients].length === 0) { - throw new BalancedPoolMissingUpstreamError() - } - - const dispatcher = this[kClients].find(dispatcher => ( - !dispatcher[kNeedDrain] && - dispatcher.closed !== true && - dispatcher.destroyed !== true - )) - - if (!dispatcher) { - return - } - - const allClientsBusy = this[kClients].map(pool => pool[kNeedDrain]).reduce((a, b) => a && b, true) - - if (allClientsBusy) { - return - } - - let counter = 0 - - let maxWeightIndex = this[kClients].findIndex(pool => !pool[kNeedDrain]) - - while (counter++ < this[kClients].length) { - this[kIndex] = (this[kIndex] + 1) % this[kClients].length - const pool = this[kClients][this[kIndex]] - - // find pool index with the largest weight - if (pool[kWeight] > this[kClients][maxWeightIndex][kWeight] && !pool[kNeedDrain]) { - maxWeightIndex = this[kIndex] - } - - // decrease the current weight every `this[kClients].length`. - if (this[kIndex] === 0) { - // Set the current weight to the next lower weight. - this[kCurrentWeight] = this[kCurrentWeight] - this[kGreatestCommonDivisor] - - if (this[kCurrentWeight] <= 0) { - this[kCurrentWeight] = this[kMaxWeightPerServer] - } - } - if (pool[kWeight] >= this[kCurrentWeight] && (!pool[kNeedDrain])) { - return pool - } - } - - this[kCurrentWeight] = this[kClients][maxWeightIndex][kWeight] - this[kIndex] = maxWeightIndex - return this[kClients][maxWeightIndex] - } -} - -module.exports = BalancedPool - - -/***/ }), - -/***/ 637: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -/* global WebAssembly */ - -const assert = __nccwpck_require__(4589) -const util = __nccwpck_require__(3440) -const { channels } = __nccwpck_require__(2414) -const timers = __nccwpck_require__(6603) -const { - RequestContentLengthMismatchError, - ResponseContentLengthMismatchError, - RequestAbortedError, - InvalidArgumentError, - HeadersTimeoutError, - HeadersOverflowError, - SocketError, - InformationalError, - BodyTimeoutError, - HTTPParserError, - ResponseExceededMaxSizeError -} = __nccwpck_require__(8707) -const { - kUrl, - kReset, - kClient, - kParser, - kBlocking, - kRunning, - kPending, - kSize, - kWriting, - kQueue, - kNoRef, - kKeepAliveDefaultTimeout, - kHostHeader, - kPendingIdx, - kRunningIdx, - kError, - kPipelining, - kSocket, - kKeepAliveTimeoutValue, - kMaxHeadersSize, - kKeepAliveMaxTimeout, - kKeepAliveTimeoutThreshold, - kHeadersTimeout, - kBodyTimeout, - kStrictContentLength, - kMaxRequests, - kCounter, - kMaxResponseSize, - kOnError, - kResume, - kHTTPContext -} = __nccwpck_require__(6443) - -const constants = __nccwpck_require__(2824) -const EMPTY_BUF = Buffer.alloc(0) -const FastBuffer = Buffer[Symbol.species] -const addListener = util.addListener -const removeAllListeners = util.removeAllListeners -const kIdleSocketValidation = Symbol('kIdleSocketValidation') -const kIdleSocketValidationTimeout = Symbol('kIdleSocketValidationTimeout') -const kSocketUsed = Symbol('kSocketUsed') - -let extractBody - -async function lazyllhttp () { - const llhttpWasmData = process.env.JEST_WORKER_ID ? __nccwpck_require__(3870) : undefined - - let mod - try { - mod = await WebAssembly.compile(__nccwpck_require__(3434)) - } catch (e) { - /* istanbul ignore next */ - - // We could check if the error was caused by the simd option not - // being enabled, but the occurring of this other error - // * https://github.com/emscripten-core/emscripten/issues/11495 - // got me to remove that check to avoid breaking Node 12. - mod = await WebAssembly.compile(llhttpWasmData || __nccwpck_require__(3870)) - } - - return await WebAssembly.instantiate(mod, { - env: { - /* eslint-disable camelcase */ - - wasm_on_url: (p, at, len) => { - /* istanbul ignore next */ - return 0 - }, - wasm_on_status: (p, at, len) => { - assert(currentParser.ptr === p) - const start = at - currentBufferPtr + currentBufferRef.byteOffset - return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 - }, - wasm_on_message_begin: (p) => { - assert(currentParser.ptr === p) - return currentParser.onMessageBegin() || 0 - }, - wasm_on_header_field: (p, at, len) => { - assert(currentParser.ptr === p) - const start = at - currentBufferPtr + currentBufferRef.byteOffset - return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 - }, - wasm_on_header_value: (p, at, len) => { - assert(currentParser.ptr === p) - const start = at - currentBufferPtr + currentBufferRef.byteOffset - return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 - }, - wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => { - assert(currentParser.ptr === p) - return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0 - }, - wasm_on_body: (p, at, len) => { - assert(currentParser.ptr === p) - const start = at - currentBufferPtr + currentBufferRef.byteOffset - return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 - }, - wasm_on_message_complete: (p) => { - assert(currentParser.ptr === p) - return currentParser.onMessageComplete() || 0 - } - - /* eslint-enable camelcase */ - } - }) -} - -let llhttpInstance = null -let llhttpPromise = lazyllhttp() -llhttpPromise.catch() - -let currentParser = null -let currentBufferRef = null -let currentBufferSize = 0 -let currentBufferPtr = null - -const USE_NATIVE_TIMER = 0 -const USE_FAST_TIMER = 1 - -// Use fast timers for headers and body to take eventual event loop -// latency into account. -const TIMEOUT_HEADERS = 2 | USE_FAST_TIMER -const TIMEOUT_BODY = 4 | USE_FAST_TIMER - -// Use native timers to ignore event loop latency for keep-alive -// handling. -const TIMEOUT_KEEP_ALIVE = 8 | USE_NATIVE_TIMER - -class Parser { - constructor (client, socket, { exports }) { - assert(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0) - - this.llhttp = exports - this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE) - this.client = client - this.socket = socket - this.timeout = null - this.timeoutValue = null - this.timeoutType = null - this.statusCode = null - this.statusText = '' - this.upgrade = false - this.headers = [] - this.headersSize = 0 - this.headersMaxSize = client[kMaxHeadersSize] - this.shouldKeepAlive = false - this.paused = false - this.resume = this.resume.bind(this) - - this.bytesRead = 0 - - this.keepAlive = '' - this.contentLength = '' - this.connection = '' - this.maxResponseSize = client[kMaxResponseSize] - } - - setTimeout (delay, type) { - // If the existing timer and the new timer are of different timer type - // (fast or native) or have different delay, we need to clear the existing - // timer and set a new one. - if ( - delay !== this.timeoutValue || - (type & USE_FAST_TIMER) ^ (this.timeoutType & USE_FAST_TIMER) - ) { - // If a timeout is already set, clear it with clearTimeout of the fast - // timer implementation, as it can clear fast and native timers. - if (this.timeout) { - timers.clearTimeout(this.timeout) - this.timeout = null - } - - if (delay) { - if (type & USE_FAST_TIMER) { - this.timeout = timers.setFastTimeout(onParserTimeout, delay, new WeakRef(this)) - } else { - this.timeout = setTimeout(onParserTimeout, delay, new WeakRef(this)) - this.timeout.unref() - } - } - - this.timeoutValue = delay - } else if (this.timeout) { - // istanbul ignore else: only for jest - if (this.timeout.refresh) { - this.timeout.refresh() - } - } - - this.timeoutType = type - } - - resume () { - if (this.socket.destroyed || !this.paused) { - return - } - - assert(this.ptr != null) - assert(currentParser == null) - - this.llhttp.llhttp_resume(this.ptr) - - assert(this.timeoutType === TIMEOUT_BODY) - if (this.timeout) { - // istanbul ignore else: only for jest - if (this.timeout.refresh) { - this.timeout.refresh() - } - } - - this.paused = false - this.execute(this.socket.read() || EMPTY_BUF) // Flush parser. - this.readMore() - } - - readMore () { - while (!this.paused && this.ptr) { - const chunk = this.socket.read() - if (chunk === null) { - break - } - this.execute(chunk) - } - } - - execute (data) { - assert(this.ptr != null) - assert(currentParser == null) - assert(!this.paused) - - const { socket, llhttp } = this - - if (data.length > currentBufferSize) { - if (currentBufferPtr) { - llhttp.free(currentBufferPtr) - } - currentBufferSize = Math.ceil(data.length / 4096) * 4096 - currentBufferPtr = llhttp.malloc(currentBufferSize) - } - - new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data) - - // Call `execute` on the wasm parser. - // We pass the `llhttp_parser` pointer address, the pointer address of buffer view data, - // and finally the length of bytes to parse. - // The return value is an error code or `constants.ERROR.OK`. - try { - let ret - - try { - currentBufferRef = data - currentParser = this - ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length) - /* eslint-disable-next-line no-useless-catch */ - } catch (err) { - /* istanbul ignore next: difficult to make a test case for */ - throw err - } finally { - currentParser = null - currentBufferRef = null - } - - const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr - - if (ret !== constants.ERROR.OK) { - const body = data.subarray(offset) - - if (ret === constants.ERROR.PAUSED_UPGRADE) { - this.onUpgrade(body) - } else if (ret === constants.ERROR.PAUSED) { - this.paused = true - socket.unshift(body) - } else { - throw this.createError(ret, body) - } - } - } catch (err) { - util.destroy(socket, err) - } - } - - finish () { - assert(currentParser === null) - assert(this.ptr != null) - assert(!this.paused) - - const { llhttp } = this - - let ret - - try { - currentParser = this - ret = llhttp.llhttp_finish(this.ptr) - } finally { - currentParser = null - } - - if (ret === constants.ERROR.OK) { - return null - } - - if (ret === constants.ERROR.PAUSED || ret === constants.ERROR.PAUSED_UPGRADE) { - this.paused = true - return null - } - - return this.createError(ret, EMPTY_BUF) - } - - createError (ret, data) { - const { llhttp, contentLength, bytesRead } = this - - if (contentLength && bytesRead !== parseInt(contentLength, 10)) { - return new ResponseContentLengthMismatchError() - } - - const ptr = llhttp.llhttp_get_error_reason(this.ptr) - let message = '' - if (ptr) { - const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0) - message = - 'Response does not match the HTTP/1.1 protocol (' + - Buffer.from(llhttp.memory.buffer, ptr, len).toString() + - ')' - } - - return new HTTPParserError(message, constants.ERROR[ret], data) - } - - destroy () { - assert(this.ptr != null) - assert(currentParser == null) - - this.llhttp.llhttp_free(this.ptr) - this.ptr = null - - this.timeout && timers.clearTimeout(this.timeout) - this.timeout = null - this.timeoutValue = null - this.timeoutType = null - - this.paused = false - } - - onStatus (buf) { - this.statusText = buf.toString() - } - - onMessageBegin () { - const { socket, client } = this - - /* istanbul ignore next: difficult to make a test case for */ - if (socket.destroyed) { - return -1 - } - - if (client[kRunning] === 0) { - util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket))) - return -1 - } - - const request = client[kQueue][client[kRunningIdx]] - if (!request) { - return -1 - } - request.onResponseStarted() - } - - onHeaderField (buf) { - const len = this.headers.length - - if ((len & 1) === 0) { - this.headers.push(buf) - } else { - this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]) - } - - this.trackHeader(buf.length) - } - - onHeaderValue (buf) { - let len = this.headers.length - - if ((len & 1) === 1) { - this.headers.push(buf) - len += 1 - } else { - this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]) - } - - const key = this.headers[len - 2] - if (key.length === 10) { - const headerName = util.bufferToLowerCasedHeaderName(key) - if (headerName === 'keep-alive') { - this.keepAlive += buf.toString() - } else if (headerName === 'connection') { - this.connection += buf.toString() - } - } else if (key.length === 14 && util.bufferToLowerCasedHeaderName(key) === 'content-length') { - this.contentLength += buf.toString() - } - - this.trackHeader(buf.length) - } - - trackHeader (len) { - this.headersSize += len - if (this.headersSize >= this.headersMaxSize) { - util.destroy(this.socket, new HeadersOverflowError()) - } - } - - onUpgrade (head) { - const { upgrade, client, socket, headers, statusCode } = this - - assert(upgrade) - assert(client[kSocket] === socket) - assert(!socket.destroyed) - assert(!this.paused) - assert((headers.length & 1) === 0) - - const request = client[kQueue][client[kRunningIdx]] - assert(request) - assert(request.upgrade || request.method === 'CONNECT') - - this.statusCode = null - this.statusText = '' - this.shouldKeepAlive = null - - this.headers = [] - this.headersSize = 0 - - socket.unshift(head) - - socket[kParser].destroy() - socket[kParser] = null - - socket[kClient] = null - socket[kError] = null - - removeAllListeners(socket) - - client[kSocket] = null - client[kHTTPContext] = null // TODO (fix): This is hacky... - client[kQueue][client[kRunningIdx]++] = null - client.emit('disconnect', client[kUrl], [client], new InformationalError('upgrade')) - - try { - request.onUpgrade(statusCode, headers, socket) - } catch (err) { - util.destroy(socket, err) - } - - client[kResume]() - } - - onHeadersComplete (statusCode, upgrade, shouldKeepAlive) { - const { client, socket, headers, statusText } = this - - /* istanbul ignore next: difficult to make a test case for */ - if (socket.destroyed) { - return -1 - } - - if (client[kRunning] === 0) { - util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket))) - return -1 - } - - const request = client[kQueue][client[kRunningIdx]] - - /* istanbul ignore next: difficult to make a test case for */ - if (!request) { - return -1 - } - - assert(!this.upgrade) - assert(this.statusCode < 200) - - if (statusCode === 100) { - util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket))) - return -1 - } - - /* this can only happen if server is misbehaving */ - if (upgrade && !request.upgrade) { - util.destroy(socket, new SocketError('bad upgrade', util.getSocketInfo(socket))) - return -1 - } - - assert(this.timeoutType === TIMEOUT_HEADERS) - - this.statusCode = statusCode - this.shouldKeepAlive = ( - shouldKeepAlive || - // Override llhttp value which does not allow keepAlive for HEAD. - (request.method === 'HEAD' && !socket[kReset] && this.connection.toLowerCase() === 'keep-alive') - ) - - if (this.statusCode >= 200) { - const bodyTimeout = request.bodyTimeout != null - ? request.bodyTimeout - : client[kBodyTimeout] - this.setTimeout(bodyTimeout, TIMEOUT_BODY) - } else if (this.timeout) { - // istanbul ignore else: only for jest - if (this.timeout.refresh) { - this.timeout.refresh() - } - } - - if (request.method === 'CONNECT') { - assert(client[kRunning] === 1) - this.upgrade = true - return 2 - } - - if (upgrade) { - assert(client[kRunning] === 1) - this.upgrade = true - return 2 - } - - assert((this.headers.length & 1) === 0) - this.headers = [] - this.headersSize = 0 - - if (this.shouldKeepAlive && client[kPipelining]) { - const keepAliveTimeout = this.keepAlive ? util.parseKeepAliveTimeout(this.keepAlive) : null - - if (keepAliveTimeout != null) { - const timeout = Math.min( - keepAliveTimeout - client[kKeepAliveTimeoutThreshold], - client[kKeepAliveMaxTimeout] - ) - if (timeout <= 0) { - socket[kReset] = true - } else { - client[kKeepAliveTimeoutValue] = timeout - } - } else { - client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout] - } - } else { - // Stop more requests from being dispatched. - socket[kReset] = true - } - - const pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false - - if (request.aborted) { - return -1 - } - - if (request.method === 'HEAD') { - return 1 - } - - if (statusCode < 200) { - return 1 - } - - if (socket[kBlocking]) { - socket[kBlocking] = false - client[kResume]() - } - - return pause ? constants.ERROR.PAUSED : 0 - } - - onBody (buf) { - const { client, socket, statusCode, maxResponseSize } = this - - if (socket.destroyed) { - return -1 - } - - const request = client[kQueue][client[kRunningIdx]] - assert(request) - - assert(this.timeoutType === TIMEOUT_BODY) - if (this.timeout) { - // istanbul ignore else: only for jest - if (this.timeout.refresh) { - this.timeout.refresh() - } - } - - assert(statusCode >= 200) - - if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) { - util.destroy(socket, new ResponseExceededMaxSizeError()) - return -1 - } - - this.bytesRead += buf.length - - if (request.onData(buf) === false) { - return constants.ERROR.PAUSED - } - } - - onMessageComplete () { - const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this - - if (socket.destroyed && (!statusCode || shouldKeepAlive)) { - return -1 - } - - if (upgrade) { - return - } - - assert(statusCode >= 100) - assert((this.headers.length & 1) === 0) - - const request = client[kQueue][client[kRunningIdx]] - assert(request) - - this.statusCode = null - this.statusText = '' - this.bytesRead = 0 - this.contentLength = '' - this.keepAlive = '' - this.connection = '' - - this.headers = [] - this.headersSize = 0 - - if (statusCode < 200) { - return - } - - /* istanbul ignore next: should be handled by llhttp? */ - if (request.method !== 'HEAD' && contentLength && bytesRead !== parseInt(contentLength, 10)) { - util.destroy(socket, new ResponseContentLengthMismatchError()) - return -1 - } - - request.onComplete(headers) - - client[kQueue][client[kRunningIdx]++] = null - socket[kSocketUsed] = true - - if (socket[kWriting]) { - assert(client[kRunning] === 0) - // Response completed before request. - util.destroy(socket, new InformationalError('reset')) - return constants.ERROR.PAUSED - } else if (!shouldKeepAlive) { - util.destroy(socket, new InformationalError('reset')) - return constants.ERROR.PAUSED - } else if (socket[kReset] && client[kRunning] === 0) { - // Destroy socket once all requests have completed. - // The request at the tail of the pipeline is the one - // that requested reset and no further requests should - // have been queued since then. - util.destroy(socket, new InformationalError('reset')) - return constants.ERROR.PAUSED - } else if (client[kPipelining] == null || client[kPipelining] === 1) { - // We must wait a full event loop cycle to reuse this socket to make sure - // that non-spec compliant servers are not closing the connection even if they - // said they won't. - setImmediate(() => client[kResume]()) - } else { - client[kResume]() - } - } -} - -function onParserTimeout (parser) { - const { socket, timeoutType, client, paused } = parser.deref() - - /* istanbul ignore else */ - if (timeoutType === TIMEOUT_HEADERS) { - if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) { - assert(!paused, 'cannot be paused while waiting for headers') - util.destroy(socket, new HeadersTimeoutError()) - } - } else if (timeoutType === TIMEOUT_BODY) { - if (!paused) { - util.destroy(socket, new BodyTimeoutError()) - } - } else if (timeoutType === TIMEOUT_KEEP_ALIVE) { - assert(client[kRunning] === 0 && client[kKeepAliveTimeoutValue]) - util.destroy(socket, new InformationalError('socket idle timeout')) - } -} - -async function connectH1 (client, socket) { - client[kSocket] = socket - - if (!llhttpInstance) { - llhttpInstance = await llhttpPromise - llhttpPromise = null - } - - socket[kNoRef] = false - socket[kWriting] = false - socket[kReset] = false - socket[kBlocking] = false - socket[kIdleSocketValidation] = 0 - socket[kIdleSocketValidationTimeout] = null - socket[kSocketUsed] = false - socket[kParser] = new Parser(client, socket, llhttpInstance) - - addListener(socket, 'error', function (err) { - assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') - - const parser = this[kParser] - - // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded - // to the user. - if (err.code === 'ECONNRESET' && parser.statusCode && !parser.shouldKeepAlive) { - const parserErr = parser.finish() - if (parserErr) { - this[kError] = parserErr - this[kClient][kOnError](parserErr) - } - return - } - - this[kError] = err - - this[kClient][kOnError](err) - }) - addListener(socket, 'readable', function () { - const parser = this[kParser] - - if (parser) { - parser.readMore() - } - }) - addListener(socket, 'end', function () { - const parser = this[kParser] - - if (parser.statusCode && !parser.shouldKeepAlive) { - const parserErr = parser.finish() - if (parserErr) { - util.destroy(this, parserErr) - } - return - } - - util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this))) - }) - addListener(socket, 'close', function () { - const client = this[kClient] - const parser = this[kParser] - - clearIdleSocketValidation(this) - - if (parser) { - if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { - this[kError] = parser.finish() || this[kError] - } - - this[kParser].destroy() - this[kParser] = null - } - - const err = this[kError] || new SocketError('closed', util.getSocketInfo(this)) - - client[kSocket] = null - client[kHTTPContext] = null // TODO (fix): This is hacky... - - if (client.destroyed) { - assert(client[kPending] === 0) - - // Fail entire queue. - const requests = client[kQueue].splice(client[kRunningIdx]) - for (let i = 0; i < requests.length; i++) { - const request = requests[i] - util.errorRequest(client, request, err) - } - } else if (client[kRunning] > 0 && err.code !== 'UND_ERR_INFO') { - // Fail head of pipeline. - const request = client[kQueue][client[kRunningIdx]] - client[kQueue][client[kRunningIdx]++] = null - - util.errorRequest(client, request, err) - } - - client[kPendingIdx] = client[kRunningIdx] - - assert(client[kRunning] === 0) - - client.emit('disconnect', client[kUrl], [client], err) - - client[kResume]() - }) - - let closed = false - socket.on('close', () => { - closed = true - }) - - return { - version: 'h1', - defaultPipelining: 1, - write (...args) { - return writeH1(client, ...args) - }, - resume () { - resumeH1(client) - }, - destroy (err, callback) { - if (closed) { - queueMicrotask(callback) - } else { - socket.destroy(err).on('close', callback) - } - }, - get destroyed () { - return socket.destroyed - }, - busy (request) { - if (socket[kWriting] || socket[kReset] || socket[kBlocking] || socket[kIdleSocketValidation] === 1) { - return true - } - - if (request) { - if (client[kRunning] > 0 && !request.idempotent) { - // Non-idempotent request cannot be retried. - // Ensure that no other requests are inflight and - // could cause failure. - return true - } - - if (client[kRunning] > 0 && (request.upgrade || request.method === 'CONNECT')) { - // Don't dispatch an upgrade until all preceding requests have completed. - // A misbehaving server might upgrade the connection before all pipelined - // request has completed. - return true - } - - if (client[kRunning] > 0 && util.bodyLength(request.body) !== 0 && - (util.isStream(request.body) || util.isAsyncIterable(request.body) || util.isFormDataLike(request.body))) { - // Request with stream or iterator body can error while other requests - // are inflight and indirectly error those as well. - // Ensure this doesn't happen by waiting for inflight - // to complete before dispatching. - - // Request with stream or iterator body cannot be retried. - // Ensure that no other requests are inflight and - // could cause failure. - return true - } - } - - return false - } - } -} - -function clearIdleSocketValidation (socket) { - if (socket[kIdleSocketValidationTimeout]) { - clearTimeout(socket[kIdleSocketValidationTimeout]) - socket[kIdleSocketValidationTimeout] = null - } - - socket[kIdleSocketValidation] = 0 -} - -function scheduleIdleSocketValidation (client, socket) { - socket[kIdleSocketValidation] = 1 - socket[kIdleSocketValidationTimeout] = setTimeout(() => { - socket[kIdleSocketValidationTimeout] = null - socket[kIdleSocketValidation] = 2 - - if (client[kSocket] === socket && !socket.destroyed) { - client[kResume]() - } - }, 0) - socket[kIdleSocketValidationTimeout].unref?.() -} - -/** - * @param {import('./client.js')} client - */ -function resumeH1 (client) { - const socket = client[kSocket] - - if (socket && !socket.destroyed) { - if (client[kSize] === 0) { - if (!socket[kNoRef] && socket.unref) { - socket.unref() - socket[kNoRef] = true - } - } else if (socket[kNoRef] && socket.ref) { - socket.ref() - socket[kNoRef] = false - } - - if (client[kRunning] === 0 && client[kPending] > 0 && socket[kSocketUsed]) { - if (socket[kIdleSocketValidation] === 0) { - scheduleIdleSocketValidation(client, socket) - socket[kParser].readMore() - if (socket.destroyed) { - return - } - return - } - - if (socket[kIdleSocketValidation] === 1) { - socket[kParser].readMore() - if (socket.destroyed) { - return - } - return - } - } - - if (client[kRunning] === 0) { - socket[kParser].readMore() - if (socket.destroyed) { - return - } - } - - if (client[kSize] === 0) { - if (socket[kParser].timeoutType !== TIMEOUT_KEEP_ALIVE) { - socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_KEEP_ALIVE) - } - } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) { - if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) { - const request = client[kQueue][client[kRunningIdx]] - const headersTimeout = request.headersTimeout != null - ? request.headersTimeout - : client[kHeadersTimeout] - socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS) - } - } - } -} - -// https://www.rfc-editor.org/rfc/rfc7230#section-3.3.2 -function shouldSendContentLength (method) { - return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT' -} - -function writeH1 (client, request) { - const { method, path, host, upgrade, blocking, reset } = request - - let { body, headers, contentLength } = request - - // https://tools.ietf.org/html/rfc7231#section-4.3.1 - // https://tools.ietf.org/html/rfc7231#section-4.3.2 - // https://tools.ietf.org/html/rfc7231#section-4.3.5 - - // Sending a payload body on a request that does not - // expect it can cause undefined behavior on some - // servers and corrupt connection state. Do not - // re-use the connection for further requests. - - const expectsPayload = ( - method === 'PUT' || - method === 'POST' || - method === 'PATCH' || - method === 'QUERY' || - method === 'PROPFIND' || - method === 'PROPPATCH' - ) - - if (util.isFormDataLike(body)) { - if (!extractBody) { - extractBody = (__nccwpck_require__(4492).extractBody) - } - - const [bodyStream, contentType] = extractBody(body) - if (request.contentType == null) { - headers.push('content-type', contentType) - } - body = bodyStream.stream - contentLength = bodyStream.length - } else if (util.isBlobLike(body) && request.contentType == null) { - const contentType = body.type - if (contentType) { - const contentTypeValue = `${contentType}` - if (!util.isValidHeaderValue(contentTypeValue)) { - util.errorRequest(client, request, new InvalidArgumentError('invalid content-type header')) - return false - } - headers.push('content-type', contentTypeValue) - } - } - - if (body && typeof body.read === 'function') { - // Try to read EOF in order to get length. - body.read(0) - } - - const bodyLength = util.bodyLength(body) - - contentLength = bodyLength ?? contentLength - - if (contentLength === null) { - contentLength = request.contentLength - } - - if (contentLength === 0 && !expectsPayload) { - // https://tools.ietf.org/html/rfc7230#section-3.3.2 - // A user agent SHOULD NOT send a Content-Length header field when - // the request message does not contain a payload body and the method - // semantics do not anticipate such a body. - - contentLength = null - } - - // https://github.com/nodejs/undici/issues/2046 - // A user agent may send a Content-Length header with 0 value, this should be allowed. - if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) { - if (client[kStrictContentLength]) { - util.errorRequest(client, request, new RequestContentLengthMismatchError()) - return false - } - - process.emitWarning(new RequestContentLengthMismatchError()) - } - - const socket = client[kSocket] - clearIdleSocketValidation(socket) - - const abort = (err) => { - if (request.aborted || request.completed) { - return - } - - util.errorRequest(client, request, err || new RequestAbortedError()) - - util.destroy(body) - util.destroy(socket, new InformationalError('aborted')) - } - - try { - request.onConnect(abort) - } catch (err) { - util.errorRequest(client, request, err) - } - - if (request.aborted) { - return false - } - - if (method === 'HEAD') { - // https://github.com/mcollina/undici/issues/258 - // Close after a HEAD request to interop with misbehaving servers - // that may send a body in the response. - - socket[kReset] = true - } - - if (upgrade || method === 'CONNECT') { - // On CONNECT or upgrade, block pipeline from dispatching further - // requests on this connection. - - socket[kReset] = true - } - - if (reset != null) { - socket[kReset] = reset - } - - if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) { - socket[kReset] = true - } - - if (blocking) { - socket[kBlocking] = true - } - - let header = `${method} ${path} HTTP/1.1\r\n` - - if (typeof host === 'string') { - header += `host: ${host}\r\n` - } else { - header += client[kHostHeader] - } - - if (upgrade) { - header += `connection: upgrade\r\nupgrade: ${upgrade}\r\n` - } else if (client[kPipelining] && !socket[kReset]) { - header += 'connection: keep-alive\r\n' - } else { - header += 'connection: close\r\n' - } - - if (Array.isArray(headers)) { - for (let n = 0; n < headers.length; n += 2) { - const key = headers[n + 0] - const val = headers[n + 1] - - if (Array.isArray(val)) { - for (let i = 0; i < val.length; i++) { - header += `${key}: ${val[i]}\r\n` - } - } else { - header += `${key}: ${val}\r\n` - } - } - } - - if (channels.sendHeaders.hasSubscribers) { - channels.sendHeaders.publish({ request, headers: header, socket }) - } - - /* istanbul ignore else: assertion */ - if (!body || bodyLength === 0) { - writeBuffer(abort, null, client, request, socket, contentLength, header, expectsPayload) - } else if (util.isBuffer(body)) { - writeBuffer(abort, body, client, request, socket, contentLength, header, expectsPayload) - } else if (util.isBlobLike(body)) { - if (typeof body.stream === 'function') { - writeIterable(abort, body.stream(), client, request, socket, contentLength, header, expectsPayload) - } else { - writeBlob(abort, body, client, request, socket, contentLength, header, expectsPayload) - } - } else if (util.isStream(body)) { - writeStream(abort, body, client, request, socket, contentLength, header, expectsPayload) - } else if (util.isIterable(body)) { - writeIterable(abort, body, client, request, socket, contentLength, header, expectsPayload) - } else { - assert(false) - } - - return true -} - -function writeStream (abort, body, client, request, socket, contentLength, header, expectsPayload) { - assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined') - let finished = false - - const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header }) + this.method = method + this.responseHeaders = responseHeaders || null + this.opaque = opaque || null + this.callback = callback + this.res = null + this.abort = null + this.body = body + this.trailers = {} + this.context = null + this.onInfo = onInfo || null + this.throwOnError = throwOnError + this.highWaterMark = highWaterMark + this.signal = signal + this.reason = null + this.removeAbortListener = null - const onData = function (chunk) { - if (finished) { - return + if (util.isStream(body)) { + body.on('error', (err) => { + this.onError(err) + }) } - try { - if (!writer.write(chunk) && this.pause) { - this.pause() - } - } catch (err) { - util.destroy(this, err) - } - } - const onDrain = function () { - if (finished) { - return - } + if (this.signal) { + if (this.signal.aborted) { + this.reason = this.signal.reason ?? new RequestAbortedError() + } else { + this.removeAbortListener = util.addAbortListener(this.signal, () => { + this.reason = this.signal.reason ?? new RequestAbortedError() + if (this.res) { + util.destroy(this.res.on('error', util.nop), this.reason) + } else if (this.abort) { + this.abort(this.reason) + } - if (body.resume) { - body.resume() + if (this.removeAbortListener) { + this.res?.off('close', this.removeAbortListener) + this.removeAbortListener() + this.removeAbortListener = null + } + }) + } } } - const onClose = function () { - // 'close' might be emitted *before* 'error' for - // broken streams. Wait a tick to avoid this case. - queueMicrotask(() => { - // It's only safe to remove 'error' listener after - // 'close'. - body.removeListener('error', onFinished) - }) - if (!finished) { - const err = new RequestAbortedError() - queueMicrotask(() => onFinished(err)) - } - } - const onFinished = function (err) { - if (finished) { + onConnect (abort, context) { + if (this.reason) { + abort(this.reason) return } - finished = true + assert(this.callback) - assert(socket.destroyed || (socket[kWriting] && client[kRunning] <= 1)) + this.abort = abort + this.context = context + } - socket - .off('drain', onDrain) - .off('error', onFinished) + onHeaders (statusCode, rawHeaders, resume, statusMessage) { + const { callback, opaque, abort, context, responseHeaders, highWaterMark } = this - body - .removeListener('data', onData) - .removeListener('end', onFinished) - .removeListener('close', onClose) + const headers = responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders) - if (!err) { - try { - writer.end() - } catch (er) { - err = er + if (statusCode < 200) { + if (this.onInfo) { + this.onInfo({ statusCode, headers }) } + return } - writer.destroy(err) + const parsedHeaders = responseHeaders === 'raw' ? util.parseHeaders(rawHeaders) : headers + const contentType = parsedHeaders['content-type'] + const contentLength = parsedHeaders['content-length'] + const res = new Readable({ + resume, + abort, + contentType, + contentLength: this.method !== 'HEAD' && contentLength + ? Number(contentLength) + : null, + highWaterMark + }) - if (err && (err.code !== 'UND_ERR_INFO' || err.message !== 'reset')) { - util.destroy(body, err) - } else { - util.destroy(body) + if (this.removeAbortListener) { + res.on('close', this.removeAbortListener) } - } - body - .on('data', onData) - .on('end', onFinished) - .on('error', onFinished) - .on('close', onClose) - - if (body.resume) { - body.resume() + this.callback = null + this.res = res + if (callback !== null) { + if (this.throwOnError && statusCode >= 400) { + this.runInAsyncScope(getResolveErrorBodyCallback, null, + { callback, body: res, contentType, statusCode, statusMessage, headers } + ) + } else { + this.runInAsyncScope(callback, null, null, { + statusCode, + headers, + trailers: this.trailers, + opaque, + body: res, + context + }) + } + } } - socket - .on('drain', onDrain) - .on('error', onFinished) - - if (body.errorEmitted ?? body.errored) { - setImmediate(() => onFinished(body.errored)) - } else if (body.endEmitted ?? body.readableEnded) { - setImmediate(() => onFinished(null)) + onData (chunk) { + return this.res.push(chunk) } - if (body.closeEmitted ?? body.closed) { - setImmediate(onClose) + onComplete (trailers) { + util.parseHeaders(trailers, this.trailers) + this.res.push(null) } -} - -function writeBuffer (abort, body, client, request, socket, contentLength, header, expectsPayload) { - try { - if (!body) { - if (contentLength === 0) { - socket.write(`${header}content-length: 0\r\n\r\n`, 'latin1') - } else { - assert(contentLength === null, 'no body must not have content length') - socket.write(`${header}\r\n`, 'latin1') - } - } else if (util.isBuffer(body)) { - assert(contentLength === body.byteLength, 'buffer body must have content length') - socket.cork() - socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1') - socket.write(body) - socket.uncork() - request.onBodySent(body) + onError (err) { + const { res, callback, body, opaque } = this - if (!expectsPayload && request.reset !== false) { - socket[kReset] = true - } + if (callback) { + // TODO: Does this need queueMicrotask? + this.callback = null + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }) + }) } - request.onRequestSent() - - client[kResume]() - } catch (err) { - abort(err) - } -} - -async function writeBlob (abort, body, client, request, socket, contentLength, header, expectsPayload) { - assert(contentLength === body.size, 'blob body must have content length') - try { - if (contentLength != null && contentLength !== body.size) { - throw new RequestContentLengthMismatchError() + if (res) { + this.res = null + // Ensure all queued handlers are invoked before destroying res. + queueMicrotask(() => { + util.destroy(res, err) + }) } - const buffer = Buffer.from(await body.arrayBuffer()) - - socket.cork() - socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1') - socket.write(buffer) - socket.uncork() - - request.onBodySent(buffer) - request.onRequestSent() - - if (!expectsPayload && request.reset !== false) { - socket[kReset] = true + if (body) { + this.body = null + util.destroy(body, err) } - client[kResume]() - } catch (err) { - abort(err) + if (this.removeAbortListener) { + res?.off('close', this.removeAbortListener) + this.removeAbortListener() + this.removeAbortListener = null + } } } -async function writeIterable (abort, body, client, request, socket, contentLength, header, expectsPayload) { - assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined') - - let callback = null - function onDrain () { - if (callback) { - const cb = callback - callback = null - cb() - } +function request (opts, callback) { + if (callback === undefined) { + return new Promise((resolve, reject) => { + request.call(this, opts, (err, data) => { + return err ? reject(err) : resolve(data) + }) + }) } - const waitForDrain = () => new Promise((resolve, reject) => { - assert(callback === null) - - if (socket[kError]) { - reject(socket[kError]) - } else { - callback = resolve - } - }) - - socket - .on('close', onDrain) - .on('drain', onDrain) - - const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header }) try { - // It's up to the user to somehow abort the async iterable. - for await (const chunk of body) { - if (socket[kError]) { - throw socket[kError] - } - - if (!writer.write(chunk)) { - await waitForDrain() - } - } - - writer.end() + this.dispatch(opts, new RequestHandler(opts, callback)) } catch (err) { - writer.destroy(err) - } finally { - socket - .off('close', onDrain) - .off('drain', onDrain) + if (typeof callback !== 'function') { + throw err + } + const opaque = opts?.opaque + queueMicrotask(() => callback(err, { opaque })) } } -class AsyncWriter { - constructor ({ abort, socket, request, contentLength, client, expectsPayload, header }) { - this.socket = socket - this.request = request - this.contentLength = contentLength - this.client = client - this.bytesWritten = 0 - this.expectsPayload = expectsPayload - this.header = header - this.abort = abort +module.exports = request +module.exports.RequestHandler = RequestHandler - socket[kWriting] = true - } - write (chunk) { - const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this +/***/ }), - if (socket[kError]) { - throw socket[kError] - } +/***/ 3560: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - if (socket.destroyed) { - return false - } - const len = Buffer.byteLength(chunk) - if (!len) { - return true - } - // We should defer writing chunks. - if (contentLength !== null && bytesWritten + len > contentLength) { - if (client[kStrictContentLength]) { - throw new RequestContentLengthMismatchError() - } +const assert = __nccwpck_require__(4589) +const { finished, PassThrough } = __nccwpck_require__(7075) +const { InvalidArgumentError, InvalidReturnValueError } = __nccwpck_require__(8707) +const util = __nccwpck_require__(3440) +const { getResolveErrorBodyCallback } = __nccwpck_require__(7655) +const { AsyncResource } = __nccwpck_require__(6698) +const { addSignal, removeSignal } = __nccwpck_require__(158) - process.emitWarning(new RequestContentLengthMismatchError()) +class StreamHandler extends AsyncResource { + constructor (opts, factory, callback) { + if (!opts || typeof opts !== 'object') { + throw new InvalidArgumentError('invalid opts') } - socket.cork() + const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError } = opts - if (bytesWritten === 0) { - if (!expectsPayload && request.reset !== false) { - socket[kReset] = true + try { + if (typeof callback !== 'function') { + throw new InvalidArgumentError('invalid callback') } - if (contentLength === null) { - socket.write(`${header}transfer-encoding: chunked\r\n`, 'latin1') - } else { - socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1') + if (typeof factory !== 'function') { + throw new InvalidArgumentError('invalid factory') } - } - - if (contentLength === null) { - socket.write(`\r\n${len.toString(16)}\r\n`, 'latin1') - } - - this.bytesWritten += len - - const ret = socket.write(chunk) - - socket.uncork() - - request.onBodySent(chunk) - if (!ret) { - if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { - // istanbul ignore else: only for jest - if (socket[kParser].timeout.refresh) { - socket[kParser].timeout.refresh() - } + if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { + throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') } - } - - return ret - } - - end () { - const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this - request.onRequestSent() - socket[kWriting] = false - - if (socket[kError]) { - throw socket[kError] - } - - if (socket.destroyed) { - return - } - - if (bytesWritten === 0) { - if (expectsPayload) { - // https://tools.ietf.org/html/rfc7230#section-3.3.2 - // A user agent SHOULD send a Content-Length in a request message when - // no Transfer-Encoding is sent and the request method defines a meaning - // for an enclosed payload body. - - socket.write(`${header}content-length: 0\r\n\r\n`, 'latin1') - } else { - socket.write(`${header}\r\n`, 'latin1') + if (method === 'CONNECT') { + throw new InvalidArgumentError('invalid method') } - } else if (contentLength === null) { - socket.write('\r\n0\r\n\r\n', 'latin1') - } - if (contentLength !== null && bytesWritten !== contentLength) { - if (client[kStrictContentLength]) { - throw new RequestContentLengthMismatchError() - } else { - process.emitWarning(new RequestContentLengthMismatchError()) + if (onInfo && typeof onInfo !== 'function') { + throw new InvalidArgumentError('invalid onInfo callback') } - } - if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { - // istanbul ignore else: only for jest - if (socket[kParser].timeout.refresh) { - socket[kParser].timeout.refresh() + super('UNDICI_STREAM') + } catch (err) { + if (util.isStream(body)) { + util.destroy(body.on('error', util.nop), err) } + throw err } - client[kResume]() - } - - destroy (err) { - const { socket, client, abort } = this - - socket[kWriting] = false + this.responseHeaders = responseHeaders || null + this.opaque = opaque || null + this.factory = factory + this.callback = callback + this.res = null + this.abort = null + this.context = null + this.trailers = null + this.body = body + this.onInfo = onInfo || null + this.throwOnError = throwOnError || false - if (err) { - assert(client[kRunning] <= 1, 'pipeline should only contain this request') - abort(err) + if (util.isStream(body)) { + body.on('error', (err) => { + this.onError(err) + }) } - } -} - -module.exports = connectH1 - - -/***/ }), - -/***/ 8788: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const assert = __nccwpck_require__(4589) -const { pipeline } = __nccwpck_require__(7075) -const util = __nccwpck_require__(3440) -const { - RequestContentLengthMismatchError, - RequestAbortedError, - SocketError, - InformationalError -} = __nccwpck_require__(8707) -const { - kUrl, - kReset, - kClient, - kRunning, - kPending, - kQueue, - kPendingIdx, - kRunningIdx, - kError, - kSocket, - kStrictContentLength, - kOnError, - kMaxConcurrentStreams, - kHTTP2Session, - kResume, - kSize, - kHTTPContext -} = __nccwpck_require__(6443) -const kOpenStreams = Symbol('open streams') - -let extractBody + addSignal(this, signal) + } -// Experimental -let h2ExperimentalWarned = false + onConnect (abort, context) { + if (this.reason) { + abort(this.reason) + return + } -/** @type {import('http2')} */ -let http2 -try { - http2 = __nccwpck_require__(2467) -} catch { - // @ts-ignore - http2 = { constants: {} } -} + assert(this.callback) -const { - constants: { - HTTP2_HEADER_AUTHORITY, - HTTP2_HEADER_METHOD, - HTTP2_HEADER_PATH, - HTTP2_HEADER_SCHEME, - HTTP2_HEADER_CONTENT_LENGTH, - HTTP2_HEADER_EXPECT, - HTTP2_HEADER_STATUS + this.abort = abort + this.context = context } -} = http2 -function parseH2Headers (headers) { - const result = [] + onHeaders (statusCode, rawHeaders, resume, statusMessage) { + const { factory, opaque, context, callback, responseHeaders } = this - for (const [name, value] of Object.entries(headers)) { - // h2 may concat the header value by array - // e.g. Set-Cookie - if (Array.isArray(value)) { - for (const subvalue of value) { - // we need to provide each header value of header name - // because the headers handler expect name-value pair - result.push(Buffer.from(name), Buffer.from(subvalue)) + const headers = responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders) + + if (statusCode < 200) { + if (this.onInfo) { + this.onInfo({ statusCode, headers }) } - } else { - result.push(Buffer.from(name), Buffer.from(value)) + return } - } - return result -} + this.factory = null -async function connectH2 (client, socket) { - client[kSocket] = socket + let res - if (!h2ExperimentalWarned) { - h2ExperimentalWarned = true - process.emitWarning('H2 support is experimental, expect them to change at any time.', { - code: 'UNDICI-H2' - }) - } + if (this.throwOnError && statusCode >= 400) { + const parsedHeaders = responseHeaders === 'raw' ? util.parseHeaders(rawHeaders) : headers + const contentType = parsedHeaders['content-type'] + res = new PassThrough() - const session = http2.connect(client[kUrl], { - createConnection: () => socket, - peerMaxConcurrentStreams: client[kMaxConcurrentStreams] - }) + this.callback = null + this.runInAsyncScope(getResolveErrorBodyCallback, null, + { callback, body: res, contentType, statusCode, statusMessage, headers } + ) + } else { + if (factory === null) { + return + } - session[kOpenStreams] = 0 - session[kClient] = client - session[kSocket] = socket + res = this.runInAsyncScope(factory, null, { + statusCode, + headers, + opaque, + context + }) - util.addListener(session, 'error', onHttp2SessionError) - util.addListener(session, 'frameError', onHttp2FrameError) - util.addListener(session, 'end', onHttp2SessionEnd) - util.addListener(session, 'goaway', onHTTP2GoAway) - util.addListener(session, 'close', function () { - const { [kClient]: client } = this - const { [kSocket]: socket } = client + if ( + !res || + typeof res.write !== 'function' || + typeof res.end !== 'function' || + typeof res.on !== 'function' + ) { + throw new InvalidReturnValueError('expected Writable') + } - const err = this[kSocket][kError] || this[kError] || new SocketError('closed', util.getSocketInfo(socket)) + // TODO: Avoid finished. It registers an unnecessary amount of listeners. + finished(res, { readable: false }, (err) => { + const { callback, res, opaque, trailers, abort } = this - client[kHTTP2Session] = null + this.res = null + if (err || !res.readable) { + util.destroy(res, err) + } - if (client.destroyed) { - assert(client[kPending] === 0) + this.callback = null + this.runInAsyncScope(callback, null, err || null, { opaque, trailers }) - // Fail entire queue. - const requests = client[kQueue].splice(client[kRunningIdx]) - for (let i = 0; i < requests.length; i++) { - const request = requests[i] - util.errorRequest(client, request, err) - } + if (err) { + abort() + } + }) } - }) - session.unref() + res.on('drain', resume) - client[kHTTP2Session] = session - socket[kHTTP2Session] = session + this.res = res - util.addListener(socket, 'error', function (err) { - assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') + const needDrain = res.writableNeedDrain !== undefined + ? res.writableNeedDrain + : res._writableState?.needDrain - this[kError] = err + return needDrain !== true + } - this[kClient][kOnError](err) - }) + onData (chunk) { + const { res } = this - util.addListener(socket, 'end', function () { - util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this))) - }) + return res ? res.write(chunk) : true + } - util.addListener(socket, 'close', function () { - const err = this[kError] || new SocketError('closed', util.getSocketInfo(this)) + onComplete (trailers) { + const { res } = this - client[kSocket] = null + removeSignal(this) - if (this[kHTTP2Session] != null) { - this[kHTTP2Session].destroy(err) + if (!res) { + return } - client[kPendingIdx] = client[kRunningIdx] + this.trailers = util.parseHeaders(trailers) - assert(client[kRunning] === 0) + res.end() + } - client.emit('disconnect', client[kUrl], [client], err) + onError (err) { + const { res, callback, opaque, body } = this - client[kResume]() - }) + removeSignal(this) - let closed = false - socket.on('close', () => { - closed = true - }) + this.factory = null - return { - version: 'h2', - defaultPipelining: Infinity, - write (...args) { - return writeH2(client, ...args) - }, - resume () { - resumeH2(client) - }, - destroy (err, callback) { - if (closed) { - queueMicrotask(callback) - } else { - // Destroying the socket will trigger the session close - socket.destroy(err).on('close', callback) - } - }, - get destroyed () { - return socket.destroyed - }, - busy () { - return false + if (res) { + this.res = null + util.destroy(res, err) + } else if (callback) { + this.callback = null + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }) + }) + } + + if (body) { + this.body = null + util.destroy(body, err) } } } -function resumeH2 (client) { - const socket = client[kSocket] +function stream (opts, factory, callback) { + if (callback === undefined) { + return new Promise((resolve, reject) => { + stream.call(this, opts, factory, (err, data) => { + return err ? reject(err) : resolve(data) + }) + }) + } - if (socket?.destroyed === false) { - if (client[kSize] === 0 && client[kMaxConcurrentStreams] === 0) { - socket.unref() - client[kHTTP2Session].unref() - } else { - socket.ref() - client[kHTTP2Session].ref() + try { + this.dispatch(opts, new StreamHandler(opts, factory, callback)) + } catch (err) { + if (typeof callback !== 'function') { + throw err } + const opaque = opts?.opaque + queueMicrotask(() => callback(err, { opaque })) } } -function onHttp2SessionError (err) { - assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') - - this[kSocket][kError] = err - this[kClient][kOnError](err) -} +module.exports = stream -function onHttp2FrameError (type, code, id) { - if (id === 0) { - const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`) - this[kSocket][kError] = err - this[kClient][kOnError](err) - } -} -function onHttp2SessionEnd () { - const err = new SocketError('other side closed', util.getSocketInfo(this[kSocket])) - this.destroy(err) - util.destroy(this[kSocket], err) -} +/***/ }), -/** - * This is the root cause of #3011 - * We need to handle GOAWAY frames properly, and trigger the session close - * along with the socket right away - */ -function onHTTP2GoAway (code) { - // We cannot recover, so best to close the session and the socket - const err = this[kError] || new SocketError(`HTTP/2: "GOAWAY" frame received with code ${code}`, util.getSocketInfo(this)) - const client = this[kClient] +/***/ 1882: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - client[kSocket] = null - client[kHTTPContext] = null - if (this[kHTTP2Session] != null) { - this[kHTTP2Session].destroy(err) - this[kHTTP2Session] = null - } - util.destroy(this[kSocket], err) +const { InvalidArgumentError, SocketError } = __nccwpck_require__(8707) +const { AsyncResource } = __nccwpck_require__(6698) +const util = __nccwpck_require__(3440) +const { addSignal, removeSignal } = __nccwpck_require__(158) +const assert = __nccwpck_require__(4589) - // Fail head of pipeline. - if (client[kRunningIdx] < client[kQueue].length) { - const request = client[kQueue][client[kRunningIdx]] - client[kQueue][client[kRunningIdx]++] = null - util.errorRequest(client, request, err) - client[kPendingIdx] = client[kRunningIdx] - } +class UpgradeHandler extends AsyncResource { + constructor (opts, callback) { + if (!opts || typeof opts !== 'object') { + throw new InvalidArgumentError('invalid opts') + } - assert(client[kRunning] === 0) + if (typeof callback !== 'function') { + throw new InvalidArgumentError('invalid callback') + } - client.emit('disconnect', client[kUrl], [client], err) + const { signal, opaque, responseHeaders } = opts - client[kResume]() -} + if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { + throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') + } -// https://www.rfc-editor.org/rfc/rfc7230#section-3.3.2 -function shouldSendContentLength (method) { - return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT' -} + super('UNDICI_UPGRADE') -function writeH2 (client, request) { - const session = client[kHTTP2Session] - const { method, path, host, upgrade, expectContinue, signal, headers: reqHeaders } = request - let { body } = request + this.responseHeaders = responseHeaders || null + this.opaque = opaque || null + this.callback = callback + this.abort = null + this.context = null - if (upgrade) { - util.errorRequest(client, request, new Error('Upgrade not supported for H2')) - return false + addSignal(this, signal) } - const headers = {} - for (let n = 0; n < reqHeaders.length; n += 2) { - const key = reqHeaders[n + 0] - const val = reqHeaders[n + 1] - - if (Array.isArray(val)) { - for (let i = 0; i < val.length; i++) { - if (headers[key]) { - headers[key] += `,${val[i]}` - } else { - headers[key] = val[i] - } - } - } else { - headers[key] = val + onConnect (abort, context) { + if (this.reason) { + abort(this.reason) + return } + + assert(this.callback) + + this.abort = abort + this.context = null } - /** @type {import('node:http2').ClientHttp2Stream} */ - let stream + onHeaders () { + throw new SocketError('bad upgrade', null) + } - const { hostname, port } = client[kUrl] + onUpgrade (statusCode, rawHeaders, socket) { + assert(statusCode === 101) - headers[HTTP2_HEADER_AUTHORITY] = host || `${hostname}${port ? `:${port}` : ''}` - headers[HTTP2_HEADER_METHOD] = method + const { callback, opaque, context } = this - const abort = (err) => { - if (request.aborted || request.completed) { - return - } + removeSignal(this) - err = err || new RequestAbortedError() + this.callback = null + const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders) + this.runInAsyncScope(callback, null, null, { + headers, + socket, + opaque, + context + }) + } - util.errorRequest(client, request, err) + onError (err) { + const { callback, opaque } = this - if (stream != null) { - util.destroy(stream, err) + removeSignal(this) + + if (callback) { + this.callback = null + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }) + }) } + } +} - // We do not destroy the socket as we can continue using the session - // the stream get's destroyed and the session remains to create new streams - util.destroy(body, err) - client[kQueue][client[kRunningIdx]++] = null - client[kResume]() +function upgrade (opts, callback) { + if (callback === undefined) { + return new Promise((resolve, reject) => { + upgrade.call(this, opts, (err, data) => { + return err ? reject(err) : resolve(data) + }) + }) } try { - // We are already connected, streams are pending. - // We can call on connect, and wait for abort - request.onConnect(abort) + const upgradeHandler = new UpgradeHandler(opts, callback) + this.dispatch({ + ...opts, + method: opts.method || 'GET', + upgrade: opts.protocol || 'Websocket' + }, upgradeHandler) } catch (err) { - util.errorRequest(client, request, err) + if (typeof callback !== 'function') { + throw err + } + const opaque = opts?.opaque + queueMicrotask(() => callback(err, { opaque })) } +} - if (request.aborted) { - return false - } +module.exports = upgrade - if (method === 'CONNECT') { - session.ref() - // We are already connected, streams are pending, first request - // will create a new stream. We trigger a request to create the stream and wait until - // `ready` event is triggered - // We disabled endStream to allow the user to write to the stream - stream = session.request(headers, { endStream: false, signal }) - if (stream.id && !stream.pending) { - request.onUpgrade(null, null, stream) - ++session[kOpenStreams] - client[kQueue][client[kRunningIdx]++] = null - } else { - stream.once('ready', () => { - request.onUpgrade(null, null, stream) - ++session[kOpenStreams] - client[kQueue][client[kRunningIdx]++] = null - }) - } +/***/ }), - stream.once('close', () => { - session[kOpenStreams] -= 1 - if (session[kOpenStreams] === 0) session.unref() - }) +/***/ 6615: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - return true - } - // https://tools.ietf.org/html/rfc7540#section-8.3 - // :path and :scheme headers must be omitted when sending CONNECT - headers[HTTP2_HEADER_PATH] = path - headers[HTTP2_HEADER_SCHEME] = 'https' +module.exports.request = __nccwpck_require__(4043) +module.exports.stream = __nccwpck_require__(3560) +module.exports.pipeline = __nccwpck_require__(6862) +module.exports.upgrade = __nccwpck_require__(1882) +module.exports.connect = __nccwpck_require__(2279) - // https://tools.ietf.org/html/rfc7231#section-4.3.1 - // https://tools.ietf.org/html/rfc7231#section-4.3.2 - // https://tools.ietf.org/html/rfc7231#section-4.3.5 - // Sending a payload body on a request that does not - // expect it can cause undefined behavior on some - // servers and corrupt connection state. Do not - // re-use the connection for further requests. +/***/ }), - const expectsPayload = ( - method === 'PUT' || - method === 'POST' || - method === 'PATCH' - ) +/***/ 9927: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - if (body && typeof body.read === 'function') { - // Try to read EOF in order to get length. - body.read(0) - } +// Ported from https://github.com/nodejs/undici/pull/907 - let contentLength = util.bodyLength(body) - if (util.isFormDataLike(body)) { - extractBody ??= (__nccwpck_require__(4492).extractBody) - const [bodyStream, contentType] = extractBody(body) - headers['content-type'] = contentType +const assert = __nccwpck_require__(4589) +const { Readable } = __nccwpck_require__(7075) +const { RequestAbortedError, NotSupportedError, InvalidArgumentError, AbortError } = __nccwpck_require__(8707) +const util = __nccwpck_require__(3440) +const { ReadableStreamFrom } = __nccwpck_require__(3440) - body = bodyStream.stream - contentLength = bodyStream.length +const kConsume = Symbol('kConsume') +const kReading = Symbol('kReading') +const kBody = Symbol('kBody') +const kAbort = Symbol('kAbort') +const kContentType = Symbol('kContentType') +const kContentLength = Symbol('kContentLength') + +const noop = () => {} + +class BodyReadable extends Readable { + constructor ({ + resume, + abort, + contentType = '', + contentLength, + highWaterMark = 64 * 1024 // Same as nodejs fs streams. + }) { + super({ + autoDestroy: true, + read: resume, + highWaterMark + }) + + this._readableState.dataEmitted = false + + this[kAbort] = abort + this[kConsume] = null + this[kBody] = null + this[kContentType] = contentType + this[kContentLength] = contentLength + + // Is stream being consumed through Readable API? + // This is an optimization so that we avoid checking + // for 'data' and 'readable' listeners in the hot path + // inside push(). + this[kReading] = false + } + + destroy (err) { + if (!err && !this._readableState.endEmitted) { + err = new RequestAbortedError() + } + + if (err) { + this[kAbort]() + } + + return super.destroy(err) } - if (contentLength == null) { - contentLength = request.contentLength + _destroy (err, callback) { + // Workaround for Node "bug". If the stream is destroyed in same + // tick as it is created, then a user who is waiting for a + // promise (i.e micro tick) for installing a 'error' listener will + // never get a chance and will always encounter an unhandled exception. + if (!this[kReading]) { + setImmediate(() => { + callback(err) + }) + } else { + callback(err) + } } - if (contentLength === 0 || !expectsPayload) { - // https://tools.ietf.org/html/rfc7230#section-3.3.2 - // A user agent SHOULD NOT send a Content-Length header field when - // the request message does not contain a payload body and the method - // semantics do not anticipate such a body. + on (ev, ...args) { + if (ev === 'data' || ev === 'readable') { + this[kReading] = true + } + return super.on(ev, ...args) + } - contentLength = null + addListener (ev, ...args) { + return this.on(ev, ...args) } - // https://github.com/nodejs/undici/issues/2046 - // A user agent may send a Content-Length header with 0 value, this should be allowed. - if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength != null && request.contentLength !== contentLength) { - if (client[kStrictContentLength]) { - util.errorRequest(client, request, new RequestContentLengthMismatchError()) - return false + off (ev, ...args) { + const ret = super.off(ev, ...args) + if (ev === 'data' || ev === 'readable') { + this[kReading] = ( + this.listenerCount('data') > 0 || + this.listenerCount('readable') > 0 + ) } + return ret + } - process.emitWarning(new RequestContentLengthMismatchError()) + removeListener (ev, ...args) { + return this.off(ev, ...args) } - if (contentLength != null) { - assert(body, 'no body must not have content length') - headers[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}` + push (chunk) { + if (this[kConsume] && chunk !== null) { + consumePush(this[kConsume], chunk) + return this[kReading] ? super.push(chunk) : true + } + return super.push(chunk) } - session.ref() + // https://fetch.spec.whatwg.org/#dom-body-text + async text () { + return consume(this, 'text') + } - const shouldEndStream = method === 'GET' || method === 'HEAD' || body === null - if (expectContinue) { - headers[HTTP2_HEADER_EXPECT] = '100-continue' - stream = session.request(headers, { endStream: shouldEndStream, signal }) + // https://fetch.spec.whatwg.org/#dom-body-json + async json () { + return consume(this, 'json') + } - stream.once('continue', writeBodyH2) - } else { - stream = session.request(headers, { - endStream: shouldEndStream, - signal - }) - writeBodyH2() + // https://fetch.spec.whatwg.org/#dom-body-blob + async blob () { + return consume(this, 'blob') } - // Increment counter as we have new streams open - ++session[kOpenStreams] + // https://fetch.spec.whatwg.org/#dom-body-bytes + async bytes () { + return consume(this, 'bytes') + } - stream.once('response', headers => { - const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers - request.onResponseStarted() + // https://fetch.spec.whatwg.org/#dom-body-arraybuffer + async arrayBuffer () { + return consume(this, 'arrayBuffer') + } - // Due to the stream nature, it is possible we face a race condition - // where the stream has been assigned, but the request has been aborted - // the request remains in-flight and headers hasn't been received yet - // for those scenarios, best effort is to destroy the stream immediately - // as there's no value to keep it open. - if (request.aborted) { - const err = new RequestAbortedError() - util.errorRequest(client, request, err) - util.destroy(stream, err) - return - } + // https://fetch.spec.whatwg.org/#dom-body-formdata + async formData () { + // TODO: Implement. + throw new NotSupportedError() + } - if (request.onHeaders(Number(statusCode), parseH2Headers(realHeaders), stream.resume.bind(stream), '') === false) { - stream.pause() - } + // https://fetch.spec.whatwg.org/#dom-body-bodyused + get bodyUsed () { + return util.isDisturbed(this) + } - stream.on('data', (chunk) => { - if (request.onData(chunk) === false) { - stream.pause() + // https://fetch.spec.whatwg.org/#dom-body-body + get body () { + if (!this[kBody]) { + this[kBody] = ReadableStreamFrom(this) + if (this[kConsume]) { + // TODO: Is this the best way to force a lock? + this[kBody].getReader() // Ensure stream is locked. + assert(this[kBody].locked) } - }) - }) - - stream.once('end', () => { - // When state is null, it means we haven't consumed body and the stream still do not have - // a state. - // Present specially when using pipeline or stream - if (stream.state?.state == null || stream.state.state < 6) { - request.onComplete([]) } + return this[kBody] + } - if (session[kOpenStreams] === 0) { - // Stream is closed or half-closed-remote (6), decrement counter and cleanup - // It does not have sense to continue working with the stream as we do not - // have yet RST_STREAM support on client-side + async dump (opts) { + let limit = Number.isFinite(opts?.limit) ? opts.limit : 128 * 1024 + const signal = opts?.signal - session.unref() + if (signal != null && (typeof signal !== 'object' || !('aborted' in signal))) { + throw new InvalidArgumentError('signal must be an AbortSignal') } - abort(new InformationalError('HTTP/2: stream half-closed (remote)')) - client[kQueue][client[kRunningIdx]++] = null - client[kPendingIdx] = client[kRunningIdx] - client[kResume]() - }) + signal?.throwIfAborted() - stream.once('close', () => { - session[kOpenStreams] -= 1 - if (session[kOpenStreams] === 0) { - session.unref() + if (this._readableState.closeEmitted) { + return null } - }) - stream.once('error', function (err) { - abort(err) - }) - - stream.once('frameError', (type, code) => { - abort(new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`)) - }) - - // stream.on('aborted', () => { - // // TODO(HTTP/2): Support aborted - // }) - - // stream.on('timeout', () => { - // // TODO(HTTP/2): Support timeout - // }) - - // stream.on('push', headers => { - // // TODO(HTTP/2): Support push - // }) - - // stream.on('trailers', headers => { - // // TODO(HTTP/2): Support trailers - // }) - - return true + return await new Promise((resolve, reject) => { + if (this[kContentLength] > limit) { + this.destroy(new AbortError()) + } - function writeBodyH2 () { - /* istanbul ignore else: assertion */ - if (!body || contentLength === 0) { - writeBuffer( - abort, - stream, - null, - client, - request, - client[kSocket], - contentLength, - expectsPayload - ) - } else if (util.isBuffer(body)) { - writeBuffer( - abort, - stream, - body, - client, - request, - client[kSocket], - contentLength, - expectsPayload - ) - } else if (util.isBlobLike(body)) { - if (typeof body.stream === 'function') { - writeIterable( - abort, - stream, - body.stream(), - client, - request, - client[kSocket], - contentLength, - expectsPayload - ) - } else { - writeBlob( - abort, - stream, - body, - client, - request, - client[kSocket], - contentLength, - expectsPayload - ) + const onAbort = () => { + this.destroy(signal.reason ?? new AbortError()) } - } else if (util.isStream(body)) { - writeStream( - abort, - client[kSocket], - expectsPayload, - stream, - body, - client, - request, - contentLength - ) - } else if (util.isIterable(body)) { - writeIterable( - abort, - stream, - body, - client, - request, - client[kSocket], - contentLength, - expectsPayload - ) - } else { - assert(false) - } + signal?.addEventListener('abort', onAbort) + + this + .on('close', function () { + signal?.removeEventListener('abort', onAbort) + if (signal?.aborted) { + reject(signal.reason ?? new AbortError()) + } else { + resolve(null) + } + }) + .on('error', noop) + .on('data', function (chunk) { + limit -= chunk.length + if (limit <= 0) { + this.destroy() + } + }) + .resume() + }) } } -function writeBuffer (abort, h2stream, body, client, request, socket, contentLength, expectsPayload) { - try { - if (body != null && util.isBuffer(body)) { - assert(contentLength === body.byteLength, 'buffer body must have content length') - h2stream.cork() - h2stream.write(body) - h2stream.uncork() - h2stream.end() - - request.onBodySent(body) - } - - if (!expectsPayload) { - socket[kReset] = true - } +// https://streams.spec.whatwg.org/#readablestream-locked +function isLocked (self) { + // Consume is an implicit lock. + return (self[kBody] && self[kBody].locked === true) || self[kConsume] +} - request.onRequestSent() - client[kResume]() - } catch (error) { - abort(error) - } +// https://fetch.spec.whatwg.org/#body-unusable +function isUnusable (self) { + return util.isDisturbed(self) || isLocked(self) } -function writeStream (abort, socket, expectsPayload, h2stream, body, client, request, contentLength) { - assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined') +async function consume (stream, type) { + assert(!stream[kConsume]) - // For HTTP/2, is enough to pipe the stream - const pipe = pipeline( - body, - h2stream, - (err) => { - if (err) { - util.destroy(pipe, err) - abort(err) + return new Promise((resolve, reject) => { + if (isUnusable(stream)) { + const rState = stream._readableState + if (rState.destroyed && rState.closeEmitted === false) { + stream + .on('error', err => { + reject(err) + }) + .on('close', () => { + reject(new TypeError('unusable')) + }) } else { - util.removeAllListeners(pipe) - request.onRequestSent() - - if (!expectsPayload) { - socket[kReset] = true + reject(rState.errored ?? new TypeError('unusable')) + } + } else { + queueMicrotask(() => { + stream[kConsume] = { + type, + stream, + resolve, + reject, + length: 0, + body: [] } - client[kResume]() - } - } - ) + stream + .on('error', function (err) { + consumeFinish(this[kConsume], err) + }) + .on('close', function () { + if (this[kConsume].body !== null) { + consumeFinish(this[kConsume], new RequestAbortedError()) + } + }) - util.addListener(pipe, 'data', onPipeData) + consumeStart(stream[kConsume]) + }) + } + }) +} - function onPipeData (chunk) { - request.onBodySent(chunk) +function consumeStart (consume) { + if (consume.body === null) { + return } -} -async function writeBlob (abort, h2stream, body, client, request, socket, contentLength, expectsPayload) { - assert(contentLength === body.size, 'blob body must have content length') + const { _readableState: state } = consume.stream - try { - if (contentLength != null && contentLength !== body.size) { - throw new RequestContentLengthMismatchError() + if (state.bufferIndex) { + const start = state.bufferIndex + const end = state.buffer.length + for (let n = start; n < end; n++) { + consumePush(consume, state.buffer[n]) } + } else { + for (const chunk of state.buffer) { + consumePush(consume, chunk) + } + } - const buffer = Buffer.from(await body.arrayBuffer()) - - h2stream.cork() - h2stream.write(buffer) - h2stream.uncork() - h2stream.end() - - request.onBodySent(buffer) - request.onRequestSent() + if (state.endEmitted) { + consumeEnd(this[kConsume]) + } else { + consume.stream.on('end', function () { + consumeEnd(this[kConsume]) + }) + } - if (!expectsPayload) { - socket[kReset] = true - } + consume.stream.resume() - client[kResume]() - } catch (err) { - abort(err) + while (consume.stream.read() != null) { + // Loop } } -async function writeIterable (abort, h2stream, body, client, request, socket, contentLength, expectsPayload) { - assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined') +/** + * @param {Buffer[]} chunks + * @param {number} length + */ +function chunksDecode (chunks, length) { + if (chunks.length === 0 || length === 0) { + return '' + } + const buffer = chunks.length === 1 ? chunks[0] : Buffer.concat(chunks, length) + const bufferLength = buffer.length - let callback = null - function onDrain () { - if (callback) { - const cb = callback - callback = null - cb() - } + // Skip BOM. + const start = + bufferLength > 2 && + buffer[0] === 0xef && + buffer[1] === 0xbb && + buffer[2] === 0xbf + ? 3 + : 0 + return buffer.utf8Slice(start, bufferLength) +} + +/** + * @param {Buffer[]} chunks + * @param {number} length + * @returns {Uint8Array} + */ +function chunksConcat (chunks, length) { + if (chunks.length === 0 || length === 0) { + return new Uint8Array(0) + } + if (chunks.length === 1) { + // fast-path + return new Uint8Array(chunks[0]) } + const buffer = new Uint8Array(Buffer.allocUnsafeSlow(length).buffer) - const waitForDrain = () => new Promise((resolve, reject) => { - assert(callback === null) + let offset = 0 + for (let i = 0; i < chunks.length; ++i) { + const chunk = chunks[i] + buffer.set(chunk, offset) + offset += chunk.length + } - if (socket[kError]) { - reject(socket[kError]) - } else { - callback = resolve - } - }) + return buffer +} - h2stream - .on('close', onDrain) - .on('drain', onDrain) +function consumeEnd (consume) { + const { type, body, resolve, stream, length } = consume try { - // It's up to the user to somehow abort the async iterable. - for await (const chunk of body) { - if (socket[kError]) { - throw socket[kError] - } - - const res = h2stream.write(chunk) - request.onBodySent(chunk) - if (!res) { - await waitForDrain() - } + if (type === 'text') { + resolve(chunksDecode(body, length)) + } else if (type === 'json') { + resolve(JSON.parse(chunksDecode(body, length))) + } else if (type === 'arrayBuffer') { + resolve(chunksConcat(body, length).buffer) + } else if (type === 'blob') { + resolve(new Blob(body, { type: stream[kContentType] })) + } else if (type === 'bytes') { + resolve(chunksConcat(body, length)) } - h2stream.end() + consumeFinish(consume) + } catch (err) { + stream.destroy(err) + } +} - request.onRequestSent() +function consumePush (consume, chunk) { + consume.length += chunk.length + consume.body.push(chunk) +} - if (!expectsPayload) { - socket[kReset] = true - } +function consumeFinish (consume, err) { + if (consume.body === null) { + return + } - client[kResume]() - } catch (err) { - abort(err) - } finally { - h2stream - .off('close', onDrain) - .off('drain', onDrain) + if (err) { + consume.reject(err) + } else { + consume.resolve() } + + consume.type = null + consume.stream = null + consume.resolve = null + consume.reject = null + consume.length = 0 + consume.body = null } -module.exports = connectH2 +module.exports = { Readable: BodyReadable, chunksDecode } /***/ }), -/***/ 3701: +/***/ 7655: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -// @ts-check - - - const assert = __nccwpck_require__(4589) -const net = __nccwpck_require__(7030) -const http = __nccwpck_require__(7067) -const util = __nccwpck_require__(3440) -const { channels } = __nccwpck_require__(2414) -const Request = __nccwpck_require__(4655) -const DispatcherBase = __nccwpck_require__(1841) const { - InvalidArgumentError, - InformationalError, - ClientDestroyedError + ResponseStatusCodeError } = __nccwpck_require__(8707) -const buildConnector = __nccwpck_require__(9136) -const { - kUrl, - kServerName, - kClient, - kBusy, - kConnect, - kResuming, - kRunning, - kPending, - kSize, - kQueue, - kConnected, - kConnecting, - kNeedDrain, - kKeepAliveDefaultTimeout, - kHostHeader, - kPendingIdx, - kRunningIdx, - kError, - kPipelining, - kKeepAliveTimeoutValue, - kMaxHeadersSize, - kKeepAliveMaxTimeout, - kKeepAliveTimeoutThreshold, - kHeadersTimeout, - kBodyTimeout, - kStrictContentLength, - kConnector, - kMaxRedirections, - kMaxRequests, - kCounter, - kClose, - kDestroy, - kDispatch, - kInterceptors, - kLocalAddress, - kMaxResponseSize, - kOnError, - kHTTPContext, - kMaxConcurrentStreams, - kResume -} = __nccwpck_require__(6443) -const connectH1 = __nccwpck_require__(637) -const connectH2 = __nccwpck_require__(8788) -let deprecatedInterceptorWarned = false - -const kClosedResolve = Symbol('kClosedResolve') -const noop = () => {} +const { chunksDecode } = __nccwpck_require__(9927) +const CHUNK_LIMIT = 128 * 1024 -function getPipelining (client) { - return client[kPipelining] ?? client[kHTTPContext]?.defaultPipelining ?? 1 -} +async function getResolveErrorBodyCallback ({ callback, body, contentType, statusCode, statusMessage, headers }) { + assert(body) -/** - * @type {import('../../types/client.js').default} - */ -class Client extends DispatcherBase { - /** - * - * @param {string|URL} url - * @param {import('../../types/client.js').Client.Options} options - */ - constructor (url, { - interceptors, - maxHeaderSize, - headersTimeout, - socketTimeout, - requestTimeout, - connectTimeout, - bodyTimeout, - idleTimeout, - keepAlive, - keepAliveTimeout, - maxKeepAliveTimeout, - keepAliveMaxTimeout, - keepAliveTimeoutThreshold, - socketPath, - pipelining, - tls, - strictContentLength, - maxCachedSessions, - maxRedirections, - connect, - maxRequestsPerClient, - localAddress, - maxResponseSize, - autoSelectFamily, - autoSelectFamilyAttemptTimeout, - // h2 - maxConcurrentStreams, - allowH2, - webSocket - } = {}) { - super({ webSocket }) + let chunks = [] + let length = 0 - if (keepAlive !== undefined) { - throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead') + try { + for await (const chunk of body) { + chunks.push(chunk) + length += chunk.length + if (length > CHUNK_LIMIT) { + chunks = [] + length = 0 + break + } } + } catch { + chunks = [] + length = 0 + // Do nothing.... + } - if (socketTimeout !== undefined) { - throw new InvalidArgumentError('unsupported socketTimeout, use headersTimeout & bodyTimeout instead') - } + const message = `Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}` - if (requestTimeout !== undefined) { - throw new InvalidArgumentError('unsupported requestTimeout, use headersTimeout & bodyTimeout instead') - } + if (statusCode === 204 || !contentType || !length) { + queueMicrotask(() => callback(new ResponseStatusCodeError(message, statusCode, headers))) + return + } - if (idleTimeout !== undefined) { - throw new InvalidArgumentError('unsupported idleTimeout, use keepAliveTimeout instead') - } + const stackTraceLimit = Error.stackTraceLimit + Error.stackTraceLimit = 0 + let payload - if (maxKeepAliveTimeout !== undefined) { - throw new InvalidArgumentError('unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead') + try { + if (isContentTypeApplicationJson(contentType)) { + payload = JSON.parse(chunksDecode(chunks, length)) + } else if (isContentTypeText(contentType)) { + payload = chunksDecode(chunks, length) } + } catch { + // process in a callback to avoid throwing in the microtask queue + } finally { + Error.stackTraceLimit = stackTraceLimit + } + queueMicrotask(() => callback(new ResponseStatusCodeError(message, statusCode, headers, payload))) +} - if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) { - throw new InvalidArgumentError('invalid maxHeaderSize') - } +const isContentTypeApplicationJson = (contentType) => { + return ( + contentType.length > 15 && + contentType[11] === '/' && + contentType[0] === 'a' && + contentType[1] === 'p' && + contentType[2] === 'p' && + contentType[3] === 'l' && + contentType[4] === 'i' && + contentType[5] === 'c' && + contentType[6] === 'a' && + contentType[7] === 't' && + contentType[8] === 'i' && + contentType[9] === 'o' && + contentType[10] === 'n' && + contentType[12] === 'j' && + contentType[13] === 's' && + contentType[14] === 'o' && + contentType[15] === 'n' + ) +} - if (socketPath != null && typeof socketPath !== 'string') { - throw new InvalidArgumentError('invalid socketPath') - } +const isContentTypeText = (contentType) => { + return ( + contentType.length > 4 && + contentType[4] === '/' && + contentType[0] === 't' && + contentType[1] === 'e' && + contentType[2] === 'x' && + contentType[3] === 't' + ) +} - if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) { - throw new InvalidArgumentError('invalid connectTimeout') - } +module.exports = { + getResolveErrorBodyCallback, + isContentTypeApplicationJson, + isContentTypeText +} - if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) { - throw new InvalidArgumentError('invalid keepAliveTimeout') - } - if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) { - throw new InvalidArgumentError('invalid keepAliveMaxTimeout') - } +/***/ }), - if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) { - throw new InvalidArgumentError('invalid keepAliveTimeoutThreshold') - } +/***/ 9136: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) { - throw new InvalidArgumentError('headersTimeout must be a positive integer or zero') - } - if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) { - throw new InvalidArgumentError('bodyTimeout must be a positive integer or zero') - } - if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { - throw new InvalidArgumentError('connect must be a function or an object') - } +const net = __nccwpck_require__(7030) +const assert = __nccwpck_require__(4589) +const util = __nccwpck_require__(3440) +const { InvalidArgumentError, ConnectTimeoutError } = __nccwpck_require__(8707) +const timers = __nccwpck_require__(6603) - if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { - throw new InvalidArgumentError('maxRedirections must be a positive number') - } +function noop () {} - if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) { - throw new InvalidArgumentError('maxRequestsPerClient must be a positive number') - } +let tls // include tls conditionally since it is not always available - if (localAddress != null && (typeof localAddress !== 'string' || net.isIP(localAddress) === 0)) { - throw new InvalidArgumentError('localAddress must be valid string IP address') - } +// TODO: session re-use does not wait for the first +// connection to resolve the session and might therefore +// resolve the same servername multiple times even when +// re-use is enabled. - if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) { - throw new InvalidArgumentError('maxResponseSize must be a positive number') - } +let SessionCache +// FIXME: remove workaround when the Node bug is fixed +// https://github.com/nodejs/node/issues/49344#issuecomment-1741776308 +if (global.FinalizationRegistry && !(process.env.NODE_V8_COVERAGE || process.env.UNDICI_NO_FG)) { + SessionCache = class WeakSessionCache { + constructor (maxCachedSessions) { + this._maxCachedSessions = maxCachedSessions + this._sessionCache = new Map() + this._sessionRegistry = new global.FinalizationRegistry((key) => { + if (this._sessionCache.size < this._maxCachedSessions) { + return + } - if ( - autoSelectFamilyAttemptTimeout != null && - (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1) - ) { - throw new InvalidArgumentError('autoSelectFamilyAttemptTimeout must be a positive number') + const ref = this._sessionCache.get(key) + if (ref !== undefined && ref.deref() === undefined) { + this._sessionCache.delete(key) + } + }) } - // h2 - if (allowH2 != null && typeof allowH2 !== 'boolean') { - throw new InvalidArgumentError('allowH2 must be a valid boolean value') + get (sessionKey) { + const ref = this._sessionCache.get(sessionKey) + return ref ? ref.deref() : null } - if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== 'number' || maxConcurrentStreams < 1)) { - throw new InvalidArgumentError('maxConcurrentStreams must be a positive integer, greater than 0') - } + set (sessionKey, session) { + if (this._maxCachedSessions === 0) { + return + } - if (typeof connect !== 'function') { - connect = buildConnector({ - ...tls, - maxCachedSessions, - allowH2, - socketPath, - timeout: connectTimeout, - ...(autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined), - ...connect - }) + this._sessionCache.set(sessionKey, new WeakRef(session)) + this._sessionRegistry.register(session, sessionKey) } - - if (interceptors?.Client && Array.isArray(interceptors.Client)) { - this[kInterceptors] = interceptors.Client - if (!deprecatedInterceptorWarned) { - deprecatedInterceptorWarned = true - process.emitWarning('Client.Options#interceptor is deprecated. Use Dispatcher#compose instead.', { - code: 'UNDICI-CLIENT-INTERCEPTOR-DEPRECATED' - }) - } - } else { - this[kInterceptors] = [createRedirectInterceptor({ maxRedirections })] + } +} else { + SessionCache = class SimpleSessionCache { + constructor (maxCachedSessions) { + this._maxCachedSessions = maxCachedSessions + this._sessionCache = new Map() } - this[kUrl] = util.parseOrigin(url) - this[kConnector] = connect - this[kPipelining] = pipelining != null ? pipelining : 1 - this[kMaxHeadersSize] = maxHeaderSize || http.maxHeaderSize - this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout - this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 600e3 : keepAliveMaxTimeout - this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 2e3 : keepAliveTimeoutThreshold - this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout] - this[kServerName] = null - this[kLocalAddress] = localAddress != null ? localAddress : null - this[kResuming] = 0 // 0, idle, 1, scheduled, 2 resuming - this[kNeedDrain] = 0 // 0, idle, 1, scheduled, 2 resuming - this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}\r\n` - this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 300e3 - this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 300e3 - this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength - this[kMaxRedirections] = maxRedirections - this[kMaxRequests] = maxRequestsPerClient - this[kClosedResolve] = null - this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1 - this[kMaxConcurrentStreams] = maxConcurrentStreams != null ? maxConcurrentStreams : 100 // Max peerConcurrentStreams for a Node h2 server - this[kHTTPContext] = null - - // kQueue is built up of 3 sections separated by - // the kRunningIdx and kPendingIdx indices. - // | complete | running | pending | - // ^ kRunningIdx ^ kPendingIdx ^ kQueue.length - // kRunningIdx points to the first running element. - // kPendingIdx points to the first pending element. - // This implements a fast queue with an amortized - // time of O(1). + get (sessionKey) { + return this._sessionCache.get(sessionKey) + } - this[kQueue] = [] - this[kRunningIdx] = 0 - this[kPendingIdx] = 0 + set (sessionKey, session) { + if (this._maxCachedSessions === 0) { + return + } - this[kResume] = (sync) => resume(this, sync) - this[kOnError] = (err) => onError(this, err) - } + if (this._sessionCache.size >= this._maxCachedSessions) { + // remove the oldest session + const { value: oldestKey } = this._sessionCache.keys().next() + this._sessionCache.delete(oldestKey) + } - get pipelining () { - return this[kPipelining] + this._sessionCache.set(sessionKey, session) + } } +} - set pipelining (value) { - this[kPipelining] = value - this[kResume](true) +function buildConnector ({ allowH2, maxCachedSessions, socketPath, timeout, session: customSession, ...opts }) { + if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) { + throw new InvalidArgumentError('maxCachedSessions must be a positive integer or zero') } - get [kPending] () { - return this[kQueue].length - this[kPendingIdx] - } + const options = { path: socketPath, ...opts } + const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions) + timeout = timeout == null ? 10e3 : timeout + allowH2 = allowH2 != null ? allowH2 : false + return function connect ({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) { + let socket + if (protocol === 'https:') { + if (!tls) { + tls = __nccwpck_require__(1692) + } + servername = servername || options.servername || util.getServerName(host) || null - get [kRunning] () { - return this[kPendingIdx] - this[kRunningIdx] - } + const sessionKey = servername || hostname + assert(sessionKey) - get [kSize] () { - return this[kQueue].length - this[kRunningIdx] - } + const session = customSession || sessionCache.get(sessionKey) || null - get [kConnected] () { - return !!this[kHTTPContext] && !this[kConnecting] && !this[kHTTPContext].destroyed - } + port = port || 443 - get [kBusy] () { - return Boolean( - this[kHTTPContext]?.busy(null) || - (this[kSize] >= (getPipelining(this) || 1)) || - this[kPending] > 0 - ) - } + socket = tls.connect({ + highWaterMark: 16384, // TLS in node can't have bigger HWM anyway... + ...options, + servername, + session, + localAddress, + // TODO(HTTP/2): Add support for h2c + ALPNProtocols: allowH2 ? ['http/1.1', 'h2'] : ['http/1.1'], + socket: httpSocket, // upgrade socket connection + port, + host: hostname + }) - /* istanbul ignore: only used for test */ - [kConnect] (cb) { - connect(this) - this.once('connect', cb) - } + socket + .on('session', function (session) { + // TODO (fix): Can a session become invalid once established? Don't think so? + sessionCache.set(sessionKey, session) + }) + } else { + assert(!httpSocket, 'httpSocket can only be sent on TLS update') - [kDispatch] (opts, handler) { - const origin = opts.origin || this[kUrl].origin - const request = new Request(origin, opts, handler) + port = port || 80 - this[kQueue].push(request) - if (this[kResuming]) { - // Do nothing. - } else if (util.bodyLength(request.body) == null && util.isIterable(request.body)) { - // Wait a tick in case stream/iterator is ended in the same tick. - this[kResuming] = 1 - queueMicrotask(() => resume(this)) - } else { - this[kResume](true) + socket = net.connect({ + highWaterMark: 64 * 1024, // Same as nodejs fs streams. + ...options, + localAddress, + port, + host: hostname + }) } - if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) { - this[kNeedDrain] = 2 + // Set TCP keep alive options on the socket here instead of in connect() for the case of assigning the socket + if (options.keepAlive == null || options.keepAlive) { + const keepAliveInitialDelay = options.keepAliveInitialDelay === undefined ? 60e3 : options.keepAliveInitialDelay + socket.setKeepAlive(true, keepAliveInitialDelay) } - return this[kNeedDrain] < 2 - } - - async [kClose] () { - // TODO: for H2 we need to gracefully flush the remaining enqueued - // request and close each stream. - return new Promise((resolve) => { - if (this[kSize]) { - this[kClosedResolve] = resolve - } else { - resolve(null) - } - }) - } + const clearConnectTimeout = setupConnectTimeout(new WeakRef(socket), { timeout, hostname, port }) - async [kDestroy] (err) { - return new Promise((resolve) => { - const requests = this[kQueue].splice(this[kPendingIdx]) - for (let i = 0; i < requests.length; i++) { - const request = requests[i] - util.errorRequest(this, request, err) - } + socket + .setNoDelay(true) + .once(protocol === 'https:' ? 'secureConnect' : 'connect', function () { + queueMicrotask(clearConnectTimeout) - const callback = () => { - if (this[kClosedResolve]) { - // TODO (fix): Should we error here with ClientDestroyedError? - this[kClosedResolve]() - this[kClosedResolve] = null + if (callback) { + const cb = callback + callback = null + cb(null, this) } - resolve(null) - } + }) + .on('error', function (err) { + queueMicrotask(clearConnectTimeout) - if (this[kHTTPContext]) { - this[kHTTPContext].destroy(err, callback) - this[kHTTPContext] = null - } else { - queueMicrotask(callback) - } + if (callback) { + const cb = callback + callback = null + cb(err) + } + }) - this[kResume]() - }) + return socket } } -const createRedirectInterceptor = __nccwpck_require__(5092) - -function onError (client, err) { - if ( - client[kRunning] === 0 && - err.code !== 'UND_ERR_INFO' && - err.code !== 'UND_ERR_SOCKET' - ) { - // Error is not caused by running request and not a recoverable - // socket error. - - assert(client[kPendingIdx] === client[kRunningIdx]) +/** + * @param {WeakRef } socketWeakRef + * @param {object} opts + * @param {number} opts.timeout + * @param {string} opts.hostname + * @param {number} opts.port + * @returns {() => void} + */ +const setupConnectTimeout = process.platform === 'win32' + ? (socketWeakRef, opts) => { + if (!opts.timeout) { + return noop + } - const requests = client[kQueue].splice(client[kRunningIdx]) + let s1 = null + let s2 = null + const fastTimer = timers.setFastTimeout(() => { + // setImmediate is added to make sure that we prioritize socket error events over timeouts + s1 = setImmediate(() => { + // Windows needs an extra setImmediate probably due to implementation differences in the socket logic + s2 = setImmediate(() => onConnectTimeout(socketWeakRef.deref(), opts)) + }) + }, opts.timeout) + return () => { + timers.clearFastTimeout(fastTimer) + clearImmediate(s1) + clearImmediate(s2) + } + } + : (socketWeakRef, opts) => { + if (!opts.timeout) { + return noop + } - for (let i = 0; i < requests.length; i++) { - const request = requests[i] - util.errorRequest(client, request, err) + let s1 = null + const fastTimer = timers.setFastTimeout(() => { + // setImmediate is added to make sure that we prioritize socket error events over timeouts + s1 = setImmediate(() => { + onConnectTimeout(socketWeakRef.deref(), opts) + }) + }, opts.timeout) + return () => { + timers.clearFastTimeout(fastTimer) + clearImmediate(s1) + } } - assert(client[kSize] === 0) - } -} /** - * @param {Client} client - * @returns + * @param {net.Socket} socket + * @param {object} opts + * @param {number} opts.timeout + * @param {string} opts.hostname + * @param {number} opts.port */ -async function connect (client) { - assert(!client[kConnecting]) - assert(!client[kHTTPContext]) +function onConnectTimeout (socket, opts) { + // The socket could be already garbage collected + if (socket == null) { + return + } - let { host, hostname, protocol, port } = client[kUrl] + let message = 'Connect Timeout Error' + if (Array.isArray(socket.autoSelectFamilyAttemptedAddresses)) { + message += ` (attempted addresses: ${socket.autoSelectFamilyAttemptedAddresses.join(', ')},` + } else { + message += ` (attempted address: ${opts.hostname}:${opts.port},` + } - // Resolve ipv6 - if (hostname[0] === '[') { - const idx = hostname.indexOf(']') + message += ` timeout: ${opts.timeout}ms)` - assert(idx !== -1) - const ip = hostname.substring(1, idx) + util.destroy(socket, new ConnectTimeoutError(message)) +} - assert(net.isIP(ip)) - hostname = ip - } +module.exports = buildConnector - client[kConnecting] = true - if (channels.beforeConnect.hasSubscribers) { - channels.beforeConnect.publish({ - connectParams: { - host, - hostname, - protocol, - port, - version: client[kHTTPContext]?.version, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, - connector: client[kConnector] - }) - } +/***/ }), - try { - const socket = await new Promise((resolve, reject) => { - client[kConnector]({ - host, - hostname, - protocol, - port, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, (err, socket) => { - if (err) { - reject(err) - } else { - resolve(socket) - } - }) - }) +/***/ 735: +/***/ ((module) => { - if (client.destroyed) { - util.destroy(socket.on('error', noop), new ClientDestroyedError()) - return - } - assert(socket) - try { - client[kHTTPContext] = socket.alpnProtocol === 'h2' - ? await connectH2(client, socket) - : await connectH1(client, socket) - } catch (err) { - socket.destroy().on('error', noop) - throw err - } +/** @type {Record } */ +const headerNameLowerCasedRecord = {} - client[kConnecting] = false +// https://developer.mozilla.org/docs/Web/HTTP/Headers +const wellknownHeaderNames = [ + 'Accept', + 'Accept-Encoding', + 'Accept-Language', + 'Accept-Ranges', + 'Access-Control-Allow-Credentials', + 'Access-Control-Allow-Headers', + 'Access-Control-Allow-Methods', + 'Access-Control-Allow-Origin', + 'Access-Control-Expose-Headers', + 'Access-Control-Max-Age', + 'Access-Control-Request-Headers', + 'Access-Control-Request-Method', + 'Age', + 'Allow', + 'Alt-Svc', + 'Alt-Used', + 'Authorization', + 'Cache-Control', + 'Clear-Site-Data', + 'Connection', + 'Content-Disposition', + 'Content-Encoding', + 'Content-Language', + 'Content-Length', + 'Content-Location', + 'Content-Range', + 'Content-Security-Policy', + 'Content-Security-Policy-Report-Only', + 'Content-Type', + 'Cookie', + 'Cross-Origin-Embedder-Policy', + 'Cross-Origin-Opener-Policy', + 'Cross-Origin-Resource-Policy', + 'Date', + 'Device-Memory', + 'Downlink', + 'ECT', + 'ETag', + 'Expect', + 'Expect-CT', + 'Expires', + 'Forwarded', + 'From', + 'Host', + 'If-Match', + 'If-Modified-Since', + 'If-None-Match', + 'If-Range', + 'If-Unmodified-Since', + 'Keep-Alive', + 'Last-Modified', + 'Link', + 'Location', + 'Max-Forwards', + 'Origin', + 'Permissions-Policy', + 'Pragma', + 'Proxy-Authenticate', + 'Proxy-Authorization', + 'RTT', + 'Range', + 'Referer', + 'Referrer-Policy', + 'Refresh', + 'Retry-After', + 'Sec-WebSocket-Accept', + 'Sec-WebSocket-Extensions', + 'Sec-WebSocket-Key', + 'Sec-WebSocket-Protocol', + 'Sec-WebSocket-Version', + 'Server', + 'Server-Timing', + 'Service-Worker-Allowed', + 'Service-Worker-Navigation-Preload', + 'Set-Cookie', + 'SourceMap', + 'Strict-Transport-Security', + 'Supports-Loading-Mode', + 'TE', + 'Timing-Allow-Origin', + 'Trailer', + 'Transfer-Encoding', + 'Upgrade', + 'Upgrade-Insecure-Requests', + 'User-Agent', + 'Vary', + 'Via', + 'WWW-Authenticate', + 'X-Content-Type-Options', + 'X-DNS-Prefetch-Control', + 'X-Frame-Options', + 'X-Permitted-Cross-Domain-Policies', + 'X-Powered-By', + 'X-Requested-With', + 'X-XSS-Protection' +] - socket[kCounter] = 0 - socket[kMaxRequests] = client[kMaxRequests] - socket[kClient] = client - socket[kError] = null +for (let i = 0; i < wellknownHeaderNames.length; ++i) { + const key = wellknownHeaderNames[i] + const lowerCasedKey = key.toLowerCase() + headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] = + lowerCasedKey +} - if (channels.connected.hasSubscribers) { - channels.connected.publish({ - connectParams: { - host, - hostname, - protocol, - port, - version: client[kHTTPContext]?.version, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, - connector: client[kConnector], - socket - }) - } - client.emit('connect', client[kUrl], [client]) - } catch (err) { - if (client.destroyed) { - return - } +// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`. +Object.setPrototypeOf(headerNameLowerCasedRecord, null) - client[kConnecting] = false +module.exports = { + wellknownHeaderNames, + headerNameLowerCasedRecord +} - if (channels.connectError.hasSubscribers) { - channels.connectError.publish({ - connectParams: { - host, - hostname, - protocol, - port, - version: client[kHTTPContext]?.version, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, - connector: client[kConnector], - error: err - }) - } - if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') { - assert(client[kRunning] === 0) - while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) { - const request = client[kQueue][client[kPendingIdx]++] - util.errorRequest(client, request, err) - } - } else { - onError(client, err) - } +/***/ }), - client.emit('connectionError', client[kUrl], [client], err) - } +/***/ 2414: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - client[kResume]() -} -function emitDrain (client) { - client[kNeedDrain] = 0 - client.emit('drain', client[kUrl], [client]) +const diagnosticsChannel = __nccwpck_require__(3053) +const util = __nccwpck_require__(7975) + +const undiciDebugLog = util.debuglog('undici') +const fetchDebuglog = util.debuglog('fetch') +const websocketDebuglog = util.debuglog('websocket') +let isClientSet = false +const channels = { + // Client + beforeConnect: diagnosticsChannel.channel('undici:client:beforeConnect'), + connected: diagnosticsChannel.channel('undici:client:connected'), + connectError: diagnosticsChannel.channel('undici:client:connectError'), + sendHeaders: diagnosticsChannel.channel('undici:client:sendHeaders'), + // Request + create: diagnosticsChannel.channel('undici:request:create'), + bodySent: diagnosticsChannel.channel('undici:request:bodySent'), + headers: diagnosticsChannel.channel('undici:request:headers'), + trailers: diagnosticsChannel.channel('undici:request:trailers'), + error: diagnosticsChannel.channel('undici:request:error'), + // WebSocket + open: diagnosticsChannel.channel('undici:websocket:open'), + close: diagnosticsChannel.channel('undici:websocket:close'), + socketError: diagnosticsChannel.channel('undici:websocket:socket_error'), + ping: diagnosticsChannel.channel('undici:websocket:ping'), + pong: diagnosticsChannel.channel('undici:websocket:pong') } -function resume (client, sync) { - if (client[kResuming] === 2) { - return - } +if (undiciDebugLog.enabled || fetchDebuglog.enabled) { + const debuglog = fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog - client[kResuming] = 2 + // Track all Client events + diagnosticsChannel.channel('undici:client:beforeConnect').subscribe(evt => { + const { + connectParams: { version, protocol, port, host } + } = evt + debuglog( + 'connecting to %s using %s%s', + `${host}${port ? `:${port}` : ''}`, + protocol, + version + ) + }) - _resume(client, sync) - client[kResuming] = 0 + diagnosticsChannel.channel('undici:client:connected').subscribe(evt => { + const { + connectParams: { version, protocol, port, host } + } = evt + debuglog( + 'connected to %s using %s%s', + `${host}${port ? `:${port}` : ''}`, + protocol, + version + ) + }) - if (client[kRunningIdx] > 256) { - client[kQueue].splice(0, client[kRunningIdx]) - client[kPendingIdx] -= client[kRunningIdx] - client[kRunningIdx] = 0 - } -} + diagnosticsChannel.channel('undici:client:connectError').subscribe(evt => { + const { + connectParams: { version, protocol, port, host }, + error + } = evt + debuglog( + 'connection to %s using %s%s errored - %s', + `${host}${port ? `:${port}` : ''}`, + protocol, + version, + error.message + ) + }) -function _resume (client, sync) { - while (true) { - if (client.destroyed) { - assert(client[kPending] === 0) - return - } + diagnosticsChannel.channel('undici:client:sendHeaders').subscribe(evt => { + const { + request: { method, path, origin } + } = evt + debuglog('sending request to %s %s/%s', method, origin, path) + }) - if (client[kClosedResolve] && !client[kSize]) { - client[kClosedResolve]() - client[kClosedResolve] = null - return - } + // Track Request events + diagnosticsChannel.channel('undici:request:headers').subscribe(evt => { + const { + request: { method, path, origin }, + response: { statusCode } + } = evt + debuglog( + 'received response to %s %s/%s - HTTP %d', + method, + origin, + path, + statusCode + ) + }) - if (client[kHTTPContext]) { - client[kHTTPContext].resume() - } + diagnosticsChannel.channel('undici:request:trailers').subscribe(evt => { + const { + request: { method, path, origin } + } = evt + debuglog('trailers received from %s %s/%s', method, origin, path) + }) - if (client[kBusy]) { - client[kNeedDrain] = 2 - } else if (client[kNeedDrain] === 2) { - if (sync) { - client[kNeedDrain] = 1 - queueMicrotask(() => emitDrain(client)) - } else { - emitDrain(client) - } - continue - } + diagnosticsChannel.channel('undici:request:error').subscribe(evt => { + const { + request: { method, path, origin }, + error + } = evt + debuglog( + 'request to %s %s/%s errored - %s', + method, + origin, + path, + error.message + ) + }) - if (client[kPending] === 0) { - return - } + isClientSet = true +} - if (client[kRunning] >= (getPipelining(client) || 1)) { - return - } +if (websocketDebuglog.enabled) { + if (!isClientSet) { + const debuglog = undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog + diagnosticsChannel.channel('undici:client:beforeConnect').subscribe(evt => { + const { + connectParams: { version, protocol, port, host } + } = evt + debuglog( + 'connecting to %s%s using %s%s', + host, + port ? `:${port}` : '', + protocol, + version + ) + }) - const request = client[kQueue][client[kPendingIdx]] + diagnosticsChannel.channel('undici:client:connected').subscribe(evt => { + const { + connectParams: { version, protocol, port, host } + } = evt + debuglog( + 'connected to %s%s using %s%s', + host, + port ? `:${port}` : '', + protocol, + version + ) + }) - if (client[kUrl].protocol === 'https:' && client[kServerName] !== request.servername) { - if (client[kRunning] > 0) { - return - } + diagnosticsChannel.channel('undici:client:connectError').subscribe(evt => { + const { + connectParams: { version, protocol, port, host }, + error + } = evt + debuglog( + 'connection to %s%s using %s%s errored - %s', + host, + port ? `:${port}` : '', + protocol, + version, + error.message + ) + }) - client[kServerName] = request.servername - client[kHTTPContext]?.destroy(new InformationalError('servername changed'), () => { - client[kHTTPContext] = null - resume(client) - }) - } + diagnosticsChannel.channel('undici:client:sendHeaders').subscribe(evt => { + const { + request: { method, path, origin } + } = evt + debuglog('sending request to %s %s/%s', method, origin, path) + }) + } - if (client[kConnecting]) { - return - } + // Track all WebSocket events + diagnosticsChannel.channel('undici:websocket:open').subscribe(evt => { + const { + address: { address, port } + } = evt + websocketDebuglog('connection opened %s%s', address, port ? `:${port}` : '') + }) - if (!client[kHTTPContext]) { - connect(client) - return - } + diagnosticsChannel.channel('undici:websocket:close').subscribe(evt => { + const { websocket, code, reason } = evt + websocketDebuglog( + 'closed connection to %s - %s %s', + websocket.url, + code, + reason + ) + }) - if (client[kHTTPContext].destroyed) { - return - } + diagnosticsChannel.channel('undici:websocket:socket_error').subscribe(err => { + websocketDebuglog('connection errored - %s', err.message) + }) - if (client[kHTTPContext].busy(request)) { - return - } + diagnosticsChannel.channel('undici:websocket:ping').subscribe(evt => { + websocketDebuglog('ping received') + }) - if (!request.aborted && client[kHTTPContext].write(request)) { - client[kPendingIdx]++ - } else { - client[kQueue].splice(client[kPendingIdx], 1) - } - } + diagnosticsChannel.channel('undici:websocket:pong').subscribe(evt => { + websocketDebuglog('pong received') + }) } -module.exports = Client +module.exports = { + channels +} /***/ }), -/***/ 1841: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const Dispatcher = __nccwpck_require__(883) -const { - ClientDestroyedError, - ClientClosedError, - InvalidArgumentError -} = __nccwpck_require__(8707) -const { kDestroy, kClose, kClosed, kDestroyed, kDispatch, kInterceptors } = __nccwpck_require__(6443) +/***/ 8707: +/***/ ((module) => { -const kOnDestroyed = Symbol('onDestroyed') -const kOnClosed = Symbol('onClosed') -const kInterceptedDispatch = Symbol('Intercepted Dispatch') -const kWebSocketOptions = Symbol('webSocketOptions') -class DispatcherBase extends Dispatcher { - constructor (opts) { - super() - this[kDestroyed] = false - this[kOnDestroyed] = null - this[kClosed] = false - this[kOnClosed] = [] - this[kWebSocketOptions] = opts?.webSocket ?? {} +const kUndiciError = Symbol.for('undici.error.UND_ERR') +class UndiciError extends Error { + constructor (message) { + super(message) + this.name = 'UndiciError' + this.code = 'UND_ERR' } - get webSocketOptions () { - return { - maxFragments: this[kWebSocketOptions].maxFragments ?? 131072, - maxPayloadSize: this[kWebSocketOptions].maxPayloadSize ?? 128 * 1024 * 1024 - } + static [Symbol.hasInstance] (instance) { + return instance && instance[kUndiciError] === true } - get destroyed () { - return this[kDestroyed] - } + [kUndiciError] = true +} - get closed () { - return this[kClosed] +const kConnectTimeoutError = Symbol.for('undici.error.UND_ERR_CONNECT_TIMEOUT') +class ConnectTimeoutError extends UndiciError { + constructor (message) { + super(message) + this.name = 'ConnectTimeoutError' + this.message = message || 'Connect Timeout Error' + this.code = 'UND_ERR_CONNECT_TIMEOUT' } - get interceptors () { - return this[kInterceptors] + static [Symbol.hasInstance] (instance) { + return instance && instance[kConnectTimeoutError] === true } - set interceptors (newInterceptors) { - if (newInterceptors) { - for (let i = newInterceptors.length - 1; i >= 0; i--) { - const interceptor = this[kInterceptors][i] - if (typeof interceptor !== 'function') { - throw new InvalidArgumentError('interceptor must be an function') - } - } - } + [kConnectTimeoutError] = true +} - this[kInterceptors] = newInterceptors +const kHeadersTimeoutError = Symbol.for('undici.error.UND_ERR_HEADERS_TIMEOUT') +class HeadersTimeoutError extends UndiciError { + constructor (message) { + super(message) + this.name = 'HeadersTimeoutError' + this.message = message || 'Headers Timeout Error' + this.code = 'UND_ERR_HEADERS_TIMEOUT' } - close (callback) { - if (callback === undefined) { - return new Promise((resolve, reject) => { - this.close((err, data) => { - return err ? reject(err) : resolve(data) - }) - }) - } - - if (typeof callback !== 'function') { - throw new InvalidArgumentError('invalid callback') - } - - if (this[kDestroyed]) { - queueMicrotask(() => callback(new ClientDestroyedError(), null)) - return - } - - if (this[kClosed]) { - if (this[kOnClosed]) { - this[kOnClosed].push(callback) - } else { - queueMicrotask(() => callback(null, null)) - } - return - } - - this[kClosed] = true - this[kOnClosed].push(callback) - - const onClosed = () => { - const callbacks = this[kOnClosed] - this[kOnClosed] = null - for (let i = 0; i < callbacks.length; i++) { - callbacks[i](null, null) - } - } - - // Should not error. - this[kClose]() - .then(() => this.destroy()) - .then(() => { - queueMicrotask(onClosed) - }) + static [Symbol.hasInstance] (instance) { + return instance && instance[kHeadersTimeoutError] === true } - destroy (err, callback) { - if (typeof err === 'function') { - callback = err - err = null - } - - if (callback === undefined) { - return new Promise((resolve, reject) => { - this.destroy(err, (err, data) => { - return err ? /* istanbul ignore next: should never error */ reject(err) : resolve(data) - }) - }) - } - - if (typeof callback !== 'function') { - throw new InvalidArgumentError('invalid callback') - } - - if (this[kDestroyed]) { - if (this[kOnDestroyed]) { - this[kOnDestroyed].push(callback) - } else { - queueMicrotask(() => callback(null, null)) - } - return - } - - if (!err) { - err = new ClientDestroyedError() - } - - this[kDestroyed] = true - this[kOnDestroyed] = this[kOnDestroyed] || [] - this[kOnDestroyed].push(callback) + [kHeadersTimeoutError] = true +} - const onDestroyed = () => { - const callbacks = this[kOnDestroyed] - this[kOnDestroyed] = null - for (let i = 0; i < callbacks.length; i++) { - callbacks[i](null, null) - } - } +const kHeadersOverflowError = Symbol.for('undici.error.UND_ERR_HEADERS_OVERFLOW') +class HeadersOverflowError extends UndiciError { + constructor (message) { + super(message) + this.name = 'HeadersOverflowError' + this.message = message || 'Headers Overflow Error' + this.code = 'UND_ERR_HEADERS_OVERFLOW' + } - // Should not error. - this[kDestroy](err).then(() => { - queueMicrotask(onDestroyed) - }) + static [Symbol.hasInstance] (instance) { + return instance && instance[kHeadersOverflowError] === true } - [kInterceptedDispatch] (opts, handler) { - if (!this[kInterceptors] || this[kInterceptors].length === 0) { - this[kInterceptedDispatch] = this[kDispatch] - return this[kDispatch](opts, handler) - } + [kHeadersOverflowError] = true +} - let dispatch = this[kDispatch].bind(this) - for (let i = this[kInterceptors].length - 1; i >= 0; i--) { - dispatch = this[kInterceptors][i](dispatch) - } - this[kInterceptedDispatch] = dispatch - return dispatch(opts, handler) +const kBodyTimeoutError = Symbol.for('undici.error.UND_ERR_BODY_TIMEOUT') +class BodyTimeoutError extends UndiciError { + constructor (message) { + super(message) + this.name = 'BodyTimeoutError' + this.message = message || 'Body Timeout Error' + this.code = 'UND_ERR_BODY_TIMEOUT' } - dispatch (opts, handler) { - if (!handler || typeof handler !== 'object') { - throw new InvalidArgumentError('handler must be an object') - } - - try { - if (!opts || typeof opts !== 'object') { - throw new InvalidArgumentError('opts must be an object.') - } + static [Symbol.hasInstance] (instance) { + return instance && instance[kBodyTimeoutError] === true + } - if (this[kDestroyed] || this[kOnDestroyed]) { - throw new ClientDestroyedError() - } + [kBodyTimeoutError] = true +} - if (this[kClosed]) { - throw new ClientClosedError() - } +const kResponseStatusCodeError = Symbol.for('undici.error.UND_ERR_RESPONSE_STATUS_CODE') +class ResponseStatusCodeError extends UndiciError { + constructor (message, statusCode, headers, body) { + super(message) + this.name = 'ResponseStatusCodeError' + this.message = message || 'Response Status Code Error' + this.code = 'UND_ERR_RESPONSE_STATUS_CODE' + this.body = body + this.status = statusCode + this.statusCode = statusCode + this.headers = headers + } - return this[kInterceptedDispatch](opts, handler) - } catch (err) { - if (typeof handler.onError !== 'function') { - throw new InvalidArgumentError('invalid onError method') - } + static [Symbol.hasInstance] (instance) { + return instance && instance[kResponseStatusCodeError] === true + } - handler.onError(err) + [kResponseStatusCodeError] = true +} - return false - } +const kInvalidArgumentError = Symbol.for('undici.error.UND_ERR_INVALID_ARG') +class InvalidArgumentError extends UndiciError { + constructor (message) { + super(message) + this.name = 'InvalidArgumentError' + this.message = message || 'Invalid Argument Error' + this.code = 'UND_ERR_INVALID_ARG' } -} -module.exports = DispatcherBase + static [Symbol.hasInstance] (instance) { + return instance && instance[kInvalidArgumentError] === true + } + [kInvalidArgumentError] = true +} -/***/ }), +const kInvalidReturnValueError = Symbol.for('undici.error.UND_ERR_INVALID_RETURN_VALUE') +class InvalidReturnValueError extends UndiciError { + constructor (message) { + super(message) + this.name = 'InvalidReturnValueError' + this.message = message || 'Invalid Return Value Error' + this.code = 'UND_ERR_INVALID_RETURN_VALUE' + } -/***/ 883: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + static [Symbol.hasInstance] (instance) { + return instance && instance[kInvalidReturnValueError] === true + } + [kInvalidReturnValueError] = true +} -const EventEmitter = __nccwpck_require__(8474) +const kAbortError = Symbol.for('undici.error.UND_ERR_ABORT') +class AbortError extends UndiciError { + constructor (message) { + super(message) + this.name = 'AbortError' + this.message = message || 'The operation was aborted' + this.code = 'UND_ERR_ABORT' + } -class Dispatcher extends EventEmitter { - dispatch () { - throw new Error('not implemented') + static [Symbol.hasInstance] (instance) { + return instance && instance[kAbortError] === true } - close () { - throw new Error('not implemented') + [kAbortError] = true +} + +const kRequestAbortedError = Symbol.for('undici.error.UND_ERR_ABORTED') +class RequestAbortedError extends AbortError { + constructor (message) { + super(message) + this.name = 'AbortError' + this.message = message || 'Request aborted' + this.code = 'UND_ERR_ABORTED' } - destroy () { - throw new Error('not implemented') + static [Symbol.hasInstance] (instance) { + return instance && instance[kRequestAbortedError] === true } - compose (...args) { - // So we handle [interceptor1, interceptor2] or interceptor1, interceptor2, ... - const interceptors = Array.isArray(args[0]) ? args[0] : args - let dispatch = this.dispatch.bind(this) + [kRequestAbortedError] = true +} - for (const interceptor of interceptors) { - if (interceptor == null) { - continue - } +const kInformationalError = Symbol.for('undici.error.UND_ERR_INFO') +class InformationalError extends UndiciError { + constructor (message) { + super(message) + this.name = 'InformationalError' + this.message = message || 'Request information' + this.code = 'UND_ERR_INFO' + } - if (typeof interceptor !== 'function') { - throw new TypeError(`invalid interceptor, expected function received ${typeof interceptor}`) - } + static [Symbol.hasInstance] (instance) { + return instance && instance[kInformationalError] === true + } - dispatch = interceptor(dispatch) + [kInformationalError] = true +} - if (dispatch == null || typeof dispatch !== 'function' || dispatch.length !== 2) { - throw new TypeError('invalid interceptor') - } - } +const kRequestContentLengthMismatchError = Symbol.for('undici.error.UND_ERR_REQ_CONTENT_LENGTH_MISMATCH') +class RequestContentLengthMismatchError extends UndiciError { + constructor (message) { + super(message) + this.name = 'RequestContentLengthMismatchError' + this.message = message || 'Request body length does not match content-length header' + this.code = 'UND_ERR_REQ_CONTENT_LENGTH_MISMATCH' + } - return new ComposedDispatcher(this, dispatch) + static [Symbol.hasInstance] (instance) { + return instance && instance[kRequestContentLengthMismatchError] === true } -} -class ComposedDispatcher extends Dispatcher { - #dispatcher = null - #dispatch = null + [kRequestContentLengthMismatchError] = true +} - constructor (dispatcher, dispatch) { - super() - this.#dispatcher = dispatcher - this.#dispatch = dispatch +const kResponseContentLengthMismatchError = Symbol.for('undici.error.UND_ERR_RES_CONTENT_LENGTH_MISMATCH') +class ResponseContentLengthMismatchError extends UndiciError { + constructor (message) { + super(message) + this.name = 'ResponseContentLengthMismatchError' + this.message = message || 'Response body length does not match content-length header' + this.code = 'UND_ERR_RES_CONTENT_LENGTH_MISMATCH' } - dispatch (...args) { - this.#dispatch(...args) + static [Symbol.hasInstance] (instance) { + return instance && instance[kResponseContentLengthMismatchError] === true } - close (...args) { - return this.#dispatcher.close(...args) - } + [kResponseContentLengthMismatchError] = true +} - destroy (...args) { - return this.#dispatcher.destroy(...args) +const kClientDestroyedError = Symbol.for('undici.error.UND_ERR_DESTROYED') +class ClientDestroyedError extends UndiciError { + constructor (message) { + super(message) + this.name = 'ClientDestroyedError' + this.message = message || 'The client is destroyed' + this.code = 'UND_ERR_DESTROYED' } -} -module.exports = Dispatcher + static [Symbol.hasInstance] (instance) { + return instance && instance[kClientDestroyedError] === true + } + [kClientDestroyedError] = true +} -/***/ }), +const kClientClosedError = Symbol.for('undici.error.UND_ERR_CLOSED') +class ClientClosedError extends UndiciError { + constructor (message) { + super(message) + this.name = 'ClientClosedError' + this.message = message || 'The client is closed' + this.code = 'UND_ERR_CLOSED' + } -/***/ 3137: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + static [Symbol.hasInstance] (instance) { + return instance && instance[kClientClosedError] === true + } + [kClientClosedError] = true +} +const kSocketError = Symbol.for('undici.error.UND_ERR_SOCKET') +class SocketError extends UndiciError { + constructor (message, socket) { + super(message) + this.name = 'SocketError' + this.message = message || 'Socket error' + this.code = 'UND_ERR_SOCKET' + this.socket = socket + } -const DispatcherBase = __nccwpck_require__(1841) -const { kClose, kDestroy, kClosed, kDestroyed, kDispatch, kNoProxyAgent, kHttpProxyAgent, kHttpsProxyAgent } = __nccwpck_require__(6443) -const ProxyAgent = __nccwpck_require__(6672) -const Agent = __nccwpck_require__(7405) + static [Symbol.hasInstance] (instance) { + return instance && instance[kSocketError] === true + } -const DEFAULT_PORTS = { - 'http:': 80, - 'https:': 443 + [kSocketError] = true } -let experimentalWarned = false +const kNotSupportedError = Symbol.for('undici.error.UND_ERR_NOT_SUPPORTED') +class NotSupportedError extends UndiciError { + constructor (message) { + super(message) + this.name = 'NotSupportedError' + this.message = message || 'Not supported error' + this.code = 'UND_ERR_NOT_SUPPORTED' + } -class EnvHttpProxyAgent extends DispatcherBase { - #noProxyValue = null - #noProxyEntries = null - #opts = null + static [Symbol.hasInstance] (instance) { + return instance && instance[kNotSupportedError] === true + } - constructor (opts = {}) { - super() - this.#opts = opts + [kNotSupportedError] = true +} - if (!experimentalWarned) { - experimentalWarned = true - process.emitWarning('EnvHttpProxyAgent is experimental, expect them to change at any time.', { - code: 'UNDICI-EHPA' - }) - } +const kBalancedPoolMissingUpstreamError = Symbol.for('undici.error.UND_ERR_BPL_MISSING_UPSTREAM') +class BalancedPoolMissingUpstreamError extends UndiciError { + constructor (message) { + super(message) + this.name = 'MissingUpstreamError' + this.message = message || 'No upstream has been added to the BalancedPool' + this.code = 'UND_ERR_BPL_MISSING_UPSTREAM' + } - const { httpProxy, httpsProxy, noProxy, ...agentOpts } = opts + static [Symbol.hasInstance] (instance) { + return instance && instance[kBalancedPoolMissingUpstreamError] === true + } - this[kNoProxyAgent] = new Agent(agentOpts) + [kBalancedPoolMissingUpstreamError] = true +} - const HTTP_PROXY = httpProxy ?? process.env.http_proxy ?? process.env.HTTP_PROXY - if (HTTP_PROXY) { - this[kHttpProxyAgent] = new ProxyAgent({ ...agentOpts, uri: HTTP_PROXY }) - } else { - this[kHttpProxyAgent] = this[kNoProxyAgent] - } +const kHTTPParserError = Symbol.for('undici.error.UND_ERR_HTTP_PARSER') +class HTTPParserError extends Error { + constructor (message, code, data) { + super(message) + this.name = 'HTTPParserError' + this.code = code ? `HPE_${code}` : undefined + this.data = data ? data.toString() : undefined + } - const HTTPS_PROXY = httpsProxy ?? process.env.https_proxy ?? process.env.HTTPS_PROXY - if (HTTPS_PROXY) { - this[kHttpsProxyAgent] = new ProxyAgent({ ...agentOpts, uri: HTTPS_PROXY }) - } else { - this[kHttpsProxyAgent] = this[kHttpProxyAgent] - } + static [Symbol.hasInstance] (instance) { + return instance && instance[kHTTPParserError] === true + } - this.#parseNoProxy() + [kHTTPParserError] = true +} + +const kResponseExceededMaxSizeError = Symbol.for('undici.error.UND_ERR_RES_EXCEEDED_MAX_SIZE') +class ResponseExceededMaxSizeError extends UndiciError { + constructor (message) { + super(message) + this.name = 'ResponseExceededMaxSizeError' + this.message = message || 'Response content exceeded max size' + this.code = 'UND_ERR_RES_EXCEEDED_MAX_SIZE' } - [kDispatch] (opts, handler) { - const url = new URL(opts.origin) - const agent = this.#getProxyAgentForUrl(url) - return agent.dispatch(opts, handler) + static [Symbol.hasInstance] (instance) { + return instance && instance[kResponseExceededMaxSizeError] === true } - async [kClose] () { - await this[kNoProxyAgent].close() - if (!this[kHttpProxyAgent][kClosed]) { - await this[kHttpProxyAgent].close() - } - if (!this[kHttpsProxyAgent][kClosed]) { - await this[kHttpsProxyAgent].close() - } + [kResponseExceededMaxSizeError] = true +} + +const kRequestRetryError = Symbol.for('undici.error.UND_ERR_REQ_RETRY') +class RequestRetryError extends UndiciError { + constructor (message, code, { headers, data }) { + super(message) + this.name = 'RequestRetryError' + this.message = message || 'Request retry error' + this.code = 'UND_ERR_REQ_RETRY' + this.statusCode = code + this.data = data + this.headers = headers } - async [kDestroy] (err) { - await this[kNoProxyAgent].destroy(err) - if (!this[kHttpProxyAgent][kDestroyed]) { - await this[kHttpProxyAgent].destroy(err) - } - if (!this[kHttpsProxyAgent][kDestroyed]) { - await this[kHttpsProxyAgent].destroy(err) - } + static [Symbol.hasInstance] (instance) { + return instance && instance[kRequestRetryError] === true } - #getProxyAgentForUrl (url) { - let { protocol, host: hostname, port } = url + [kRequestRetryError] = true +} - // Stripping ports in this way instead of using parsedUrl.hostname to make - // sure that the brackets around IPv6 addresses are kept. - hostname = hostname.replace(/:\d*$/, '').toLowerCase() - port = Number.parseInt(port, 10) || DEFAULT_PORTS[protocol] || 0 - if (!this.#shouldProxy(hostname, port)) { - return this[kNoProxyAgent] - } - if (protocol === 'https:') { - return this[kHttpsProxyAgent] - } - return this[kHttpProxyAgent] +const kResponseError = Symbol.for('undici.error.UND_ERR_RESPONSE') +class ResponseError extends UndiciError { + constructor (message, code, { headers, data }) { + super(message) + this.name = 'ResponseError' + this.message = message || 'Response error' + this.code = 'UND_ERR_RESPONSE' + this.statusCode = code + this.data = data + this.headers = headers } - #shouldProxy (hostname, port) { - if (this.#noProxyChanged) { - this.#parseNoProxy() - } - - if (this.#noProxyEntries.length === 0) { - return true // Always proxy if NO_PROXY is not set or empty. - } - if (this.#noProxyValue === '*') { - return false // Never proxy if wildcard is set. - } + static [Symbol.hasInstance] (instance) { + return instance && instance[kResponseError] === true + } - for (let i = 0; i < this.#noProxyEntries.length; i++) { - const entry = this.#noProxyEntries[i] - if (entry.port && entry.port !== port) { - continue // Skip if ports don't match. - } - if (!/^[.*]/.test(entry.hostname)) { - // No wildcards, so don't proxy only if there is not an exact match. - if (hostname === entry.hostname) { - return false - } - } else { - // Don't proxy if the hostname ends with the no_proxy host. - if (hostname.endsWith(entry.hostname.replace(/^\*/, ''))) { - return false - } - } - } + [kResponseError] = true +} - return true +const kSecureProxyConnectionError = Symbol.for('undici.error.UND_ERR_PRX_TLS') +class SecureProxyConnectionError extends UndiciError { + constructor (cause, message, options) { + super(message, { cause, ...(options ?? {}) }) + this.name = 'SecureProxyConnectionError' + this.message = message || 'Secure Proxy Connection failed' + this.code = 'UND_ERR_PRX_TLS' + this.cause = cause } - #parseNoProxy () { - const noProxyValue = this.#opts.noProxy ?? this.#noProxyEnv - const noProxySplit = noProxyValue.split(/[,\s]/) - const noProxyEntries = [] + static [Symbol.hasInstance] (instance) { + return instance && instance[kSecureProxyConnectionError] === true + } - for (let i = 0; i < noProxySplit.length; i++) { - const entry = noProxySplit[i] - if (!entry) { - continue - } - const parsed = entry.match(/^(.+):(\d+)$/) - noProxyEntries.push({ - hostname: (parsed ? parsed[1] : entry).toLowerCase(), - port: parsed ? Number.parseInt(parsed[2], 10) : 0 - }) - } + [kSecureProxyConnectionError] = true +} - this.#noProxyValue = noProxyValue - this.#noProxyEntries = noProxyEntries +const kMessageSizeExceededError = Symbol.for('undici.error.UND_ERR_WS_MESSAGE_SIZE_EXCEEDED') +class MessageSizeExceededError extends UndiciError { + constructor (message) { + super(message) + this.name = 'MessageSizeExceededError' + this.message = message || 'Max decompressed message size exceeded' + this.code = 'UND_ERR_WS_MESSAGE_SIZE_EXCEEDED' } - get #noProxyChanged () { - if (this.#opts.noProxy !== undefined) { - return false - } - return this.#noProxyValue !== this.#noProxyEnv + static [Symbol.hasInstance] (instance) { + return instance && instance[kMessageSizeExceededError] === true } - get #noProxyEnv () { - return process.env.no_proxy ?? process.env.NO_PROXY ?? '' + get [kMessageSizeExceededError] () { + return true } } -module.exports = EnvHttpProxyAgent +module.exports = { + AbortError, + HTTPParserError, + UndiciError, + HeadersTimeoutError, + HeadersOverflowError, + BodyTimeoutError, + RequestContentLengthMismatchError, + ConnectTimeoutError, + ResponseStatusCodeError, + InvalidArgumentError, + InvalidReturnValueError, + RequestAbortedError, + ClientDestroyedError, + ClientClosedError, + InformationalError, + SocketError, + NotSupportedError, + ResponseContentLengthMismatchError, + BalancedPoolMissingUpstreamError, + ResponseExceededMaxSizeError, + RequestRetryError, + ResponseError, + SecureProxyConnectionError, + MessageSizeExceededError +} /***/ }), -/***/ 4660: -/***/ ((module) => { - -/* eslint-disable */ - +/***/ 4655: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -// Extracted from node/lib/internal/fixed_queue.js -// Currently optimal queue size, tested on V8 6.0 - 6.6. Must be power of two. -const kSize = 2048; -const kMask = kSize - 1; +const { + InvalidArgumentError, + NotSupportedError +} = __nccwpck_require__(8707) +const assert = __nccwpck_require__(4589) +const { + isValidHTTPToken, + isValidHeaderValue, + isStream, + destroy, + isBuffer, + isFormDataLike, + isIterable, + isBlobLike, + buildURL, + validateHandler, + getServerName, + normalizedMethodRecords +} = __nccwpck_require__(3440) +const { channels } = __nccwpck_require__(2414) +const { headerNameLowerCasedRecord } = __nccwpck_require__(735) -// The FixedQueue is implemented as a singly-linked list of fixed-size -// circular buffers. It looks something like this: -// -// head tail -// | | -// v v -// +-----------+ <-----\ +-----------+ <------\ +-----------+ -// | [null] | \----- | next | \------- | next | -// +-----------+ +-----------+ +-----------+ -// | item | <-- bottom | item | <-- bottom | [empty] | -// | item | | item | | [empty] | -// | item | | item | | [empty] | -// | item | | item | | [empty] | -// | item | | item | bottom --> | item | -// | item | | item | | item | -// | ... | | ... | | ... | -// | item | | item | | item | -// | item | | item | | item | -// | [empty] | <-- top | item | | item | -// | [empty] | | item | | item | -// | [empty] | | [empty] | <-- top top --> | [empty] | -// +-----------+ +-----------+ +-----------+ -// -// Or, if there is only one circular buffer, it looks something -// like either of these: -// -// head tail head tail -// | | | | -// v v v v -// +-----------+ +-----------+ -// | [null] | | [null] | -// +-----------+ +-----------+ -// | [empty] | | item | -// | [empty] | | item | -// | item | <-- bottom top --> | [empty] | -// | item | | [empty] | -// | [empty] | <-- top bottom --> | item | -// | [empty] | | item | -// +-----------+ +-----------+ -// -// Adding a value means moving `top` forward by one, removing means -// moving `bottom` forward by one. After reaching the end, the queue -// wraps around. -// -// When `top === bottom` the current queue is empty and when -// `top + 1 === bottom` it's full. This wastes a single space of storage -// but allows much quicker checks. +// Verifies that a given path is valid does not contain control chars \x00 to \x20 +const invalidPathRegex = /[^\u0021-\u00ff]/ -class FixedCircularBuffer { - constructor() { - this.bottom = 0; - this.top = 0; - this.list = new Array(kSize); - this.next = null; - } +const kHandler = Symbol('handler') - isEmpty() { - return this.top === this.bottom; - } +class Request { + constructor (origin, { + path, + method, + body, + headers, + query, + idempotent, + blocking, + upgrade, + headersTimeout, + bodyTimeout, + reset, + throwOnError, + expectContinue, + servername + }, handler) { + if (typeof path !== 'string') { + throw new InvalidArgumentError('path must be a string') + } else if ( + path[0] !== '/' && + !(path.startsWith('http://') || path.startsWith('https://')) && + method !== 'CONNECT' + ) { + throw new InvalidArgumentError('path must be an absolute URL or start with a slash') + } else if (invalidPathRegex.test(path)) { + throw new InvalidArgumentError('invalid request path') + } - isFull() { - return ((this.top + 1) & kMask) === this.bottom; - } + if (typeof method !== 'string') { + throw new InvalidArgumentError('method must be a string') + } else if (normalizedMethodRecords[method] === undefined && !isValidHTTPToken(method)) { + throw new InvalidArgumentError('invalid request method') + } - push(data) { - this.list[this.top] = data; - this.top = (this.top + 1) & kMask; - } + if (upgrade && typeof upgrade !== 'string') { + throw new InvalidArgumentError('upgrade must be a string') + } - shift() { - const nextItem = this.list[this.bottom]; - if (nextItem === undefined) - return null; - this.list[this.bottom] = undefined; - this.bottom = (this.bottom + 1) & kMask; - return nextItem; - } -} + if (upgrade && !isValidHeaderValue(upgrade)) { + throw new InvalidArgumentError('invalid upgrade header') + } -module.exports = class FixedQueue { - constructor() { - this.head = this.tail = new FixedCircularBuffer(); - } + if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) { + throw new InvalidArgumentError('invalid headersTimeout') + } - isEmpty() { - return this.head.isEmpty(); - } + if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) { + throw new InvalidArgumentError('invalid bodyTimeout') + } - push(data) { - if (this.head.isFull()) { - // Head is full: Creates a new queue, sets the old queue's `.next` to it, - // and sets it as the new main queue. - this.head = this.head.next = new FixedCircularBuffer(); + if (reset != null && typeof reset !== 'boolean') { + throw new InvalidArgumentError('invalid reset') } - this.head.push(data); - } - shift() { - const tail = this.tail; - const next = tail.shift(); - if (tail.isEmpty() && tail.next !== null) { - // If there is another queue, it forms the new tail. - this.tail = tail.next; + if (expectContinue != null && typeof expectContinue !== 'boolean') { + throw new InvalidArgumentError('invalid expectContinue') } - return next; - } -}; + this.headersTimeout = headersTimeout -/***/ }), + this.bodyTimeout = bodyTimeout -/***/ 2128: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + this.throwOnError = throwOnError === true + this.method = method + this.abort = null -const DispatcherBase = __nccwpck_require__(1841) -const FixedQueue = __nccwpck_require__(4660) -const { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = __nccwpck_require__(6443) -const PoolStats = __nccwpck_require__(3246) + if (body == null) { + this.body = null + } else if (isStream(body)) { + this.body = body -const kClients = Symbol('clients') -const kNeedDrain = Symbol('needDrain') -const kQueue = Symbol('queue') -const kClosedResolve = Symbol('closed resolve') -const kOnDrain = Symbol('onDrain') -const kOnConnect = Symbol('onConnect') -const kOnDisconnect = Symbol('onDisconnect') -const kOnConnectionError = Symbol('onConnectionError') -const kGetDispatcher = Symbol('get dispatcher') -const kAddClient = Symbol('add client') -const kRemoveClient = Symbol('remove client') -const kStats = Symbol('stats') + const rState = this.body._readableState + if (!rState || !rState.autoDestroy) { + this.endHandler = function autoDestroy () { + destroy(this) + } + this.body.on('end', this.endHandler) + } -class PoolBase extends DispatcherBase { - constructor (opts) { - super(opts) + this.errorHandler = err => { + if (this.abort) { + this.abort(err) + } else { + this.error = err + } + } + this.body.on('error', this.errorHandler) + } else if (isBuffer(body)) { + this.body = body.byteLength ? body : null + } else if (ArrayBuffer.isView(body)) { + this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null + } else if (body instanceof ArrayBuffer) { + this.body = body.byteLength ? Buffer.from(body) : null + } else if (typeof body === 'string') { + this.body = body.length ? Buffer.from(body) : null + } else if (isFormDataLike(body) || isIterable(body) || isBlobLike(body)) { + this.body = body + } else { + throw new InvalidArgumentError('body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable') + } - this[kQueue] = new FixedQueue() - this[kClients] = [] - this[kQueued] = 0 + this.completed = false - const pool = this + this.aborted = false - this[kOnDrain] = function onDrain (origin, targets) { - const queue = pool[kQueue] + this.upgrade = upgrade || null - let needDrain = false + this.path = query ? buildURL(path, query) : path - while (!needDrain) { - const item = queue.shift() - if (!item) { - break - } - pool[kQueued]-- - needDrain = !this.dispatch(item.opts, item.handler) - } + this.origin = origin + + this.idempotent = idempotent == null + ? method === 'HEAD' || method === 'GET' + : idempotent + + this.blocking = blocking == null ? false : blocking - this[kNeedDrain] = needDrain + this.reset = reset == null ? null : reset - if (!this[kNeedDrain] && pool[kNeedDrain]) { - pool[kNeedDrain] = false - pool.emit('drain', origin, [pool, ...targets]) - } + this.host = null - if (pool[kClosedResolve] && queue.isEmpty()) { - Promise - .all(pool[kClients].map(c => c.close())) - .then(pool[kClosedResolve]) - } - } + this.contentLength = null - this[kOnConnect] = (origin, targets) => { - pool.emit('connect', origin, [pool, ...targets]) - } + this.contentType = null - this[kOnDisconnect] = (origin, targets, err) => { - pool.emit('disconnect', origin, [pool, ...targets], err) - } + this.headers = [] - this[kOnConnectionError] = (origin, targets, err) => { - pool.emit('connectionError', origin, [pool, ...targets], err) + // Only for H2 + this.expectContinue = expectContinue != null ? expectContinue : false + + if (Array.isArray(headers)) { + if (headers.length % 2 !== 0) { + throw new InvalidArgumentError('headers array must be even') + } + for (let i = 0; i < headers.length; i += 2) { + processHeader(this, headers[i], headers[i + 1]) + } + } else if (headers && typeof headers === 'object') { + if (headers[Symbol.iterator]) { + for (const header of headers) { + if (!Array.isArray(header) || header.length !== 2) { + throw new InvalidArgumentError('headers must be in key-value pair format') + } + processHeader(this, header[0], header[1]) + } + } else { + const keys = Object.keys(headers) + for (let i = 0; i < keys.length; ++i) { + processHeader(this, keys[i], headers[keys[i]]) + } + } + } else if (headers != null) { + throw new InvalidArgumentError('headers must be an object or an array') } - this[kStats] = new PoolStats(this) - } + validateHandler(handler, method, upgrade) - get [kBusy] () { - return this[kNeedDrain] - } + this.servername = servername || getServerName(this.host) - get [kConnected] () { - return this[kClients].filter(client => client[kConnected]).length - } + this[kHandler] = handler - get [kFree] () { - return this[kClients].filter(client => client[kConnected] && !client[kNeedDrain]).length + if (channels.create.hasSubscribers) { + channels.create.publish({ request: this }) + } } - get [kPending] () { - let ret = this[kQueued] - for (const { [kPending]: pending } of this[kClients]) { - ret += pending + onBodySent (chunk) { + if (this[kHandler].onBodySent) { + try { + return this[kHandler].onBodySent(chunk) + } catch (err) { + this.abort(err) + } } - return ret } - get [kRunning] () { - let ret = 0 - for (const { [kRunning]: running } of this[kClients]) { - ret += running + onRequestSent () { + if (channels.bodySent.hasSubscribers) { + channels.bodySent.publish({ request: this }) } - return ret - } - get [kSize] () { - let ret = this[kQueued] - for (const { [kSize]: size } of this[kClients]) { - ret += size + if (this[kHandler].onRequestSent) { + try { + return this[kHandler].onRequestSent() + } catch (err) { + this.abort(err) + } } - return ret } - get stats () { - return this[kStats] - } + onConnect (abort) { + assert(!this.aborted) + assert(!this.completed) - async [kClose] () { - if (this[kQueue].isEmpty()) { - await Promise.all(this[kClients].map(c => c.close())) + if (this.error) { + abort(this.error) } else { - await new Promise((resolve) => { - this[kClosedResolve] = resolve - }) + this.abort = abort + return this[kHandler].onConnect(abort) } } - async [kDestroy] (err) { - while (true) { - const item = this[kQueue].shift() - if (!item) { - break - } - item.handler.onError(err) - } - - await Promise.all(this[kClients].map(c => c.destroy(err))) + onResponseStarted () { + return this[kHandler].onResponseStarted?.() } - [kDispatch] (opts, handler) { - const dispatcher = this[kGetDispatcher]() + onHeaders (statusCode, headers, resume, statusText) { + assert(!this.aborted) + assert(!this.completed) - if (!dispatcher) { - this[kNeedDrain] = true - this[kQueue].push({ opts, handler }) - this[kQueued]++ - } else if (!dispatcher.dispatch(opts, handler)) { - dispatcher[kNeedDrain] = true - this[kNeedDrain] = !this[kGetDispatcher]() + if (channels.headers.hasSubscribers) { + channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }) } - return !this[kNeedDrain] + try { + return this[kHandler].onHeaders(statusCode, headers, resume, statusText) + } catch (err) { + this.abort(err) + } } - [kAddClient] (client) { - client - .on('drain', this[kOnDrain]) - .on('connect', this[kOnConnect]) - .on('disconnect', this[kOnDisconnect]) - .on('connectionError', this[kOnConnectionError]) - - this[kClients].push(client) + onData (chunk) { + assert(!this.aborted) + assert(!this.completed) - if (this[kNeedDrain]) { - queueMicrotask(() => { - if (this[kNeedDrain]) { - this[kOnDrain](client[kUrl], [this, client]) - } - }) + try { + return this[kHandler].onData(chunk) + } catch (err) { + this.abort(err) + return false } - - return this } - [kRemoveClient] (client) { - client.close(() => { - const idx = this[kClients].indexOf(client) - if (idx !== -1) { - this[kClients].splice(idx, 1) - } - }) + onUpgrade (statusCode, headers, socket) { + assert(!this.aborted) + assert(!this.completed) - this[kNeedDrain] = this[kClients].some(dispatcher => ( - !dispatcher[kNeedDrain] && - dispatcher.closed !== true && - dispatcher.destroyed !== true - )) + return this[kHandler].onUpgrade(statusCode, headers, socket) } -} - -module.exports = { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kRemoveClient, - kGetDispatcher -} + onComplete (trailers) { + this.onFinally() -/***/ }), - -/***/ 3246: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + assert(!this.aborted) -const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = __nccwpck_require__(6443) -const kPool = Symbol('pool') + this.completed = true + if (channels.trailers.hasSubscribers) { + channels.trailers.publish({ request: this, trailers }) + } -class PoolStats { - constructor (pool) { - this[kPool] = pool + try { + return this[kHandler].onComplete(trailers) + } catch (err) { + // TODO (fix): This might be a bad idea? + this.onError(err) + } } - get connected () { - return this[kPool][kConnected] - } + onError (error) { + this.onFinally() - get free () { - return this[kPool][kFree] - } + if (channels.error.hasSubscribers) { + channels.error.publish({ request: this, error }) + } - get pending () { - return this[kPool][kPending] - } + if (this.aborted) { + return + } + this.aborted = true - get queued () { - return this[kPool][kQueued] + return this[kHandler].onError(error) } - get running () { - return this[kPool][kRunning] + onFinally () { + if (this.errorHandler) { + this.body.off('error', this.errorHandler) + this.errorHandler = null + } + + if (this.endHandler) { + this.body.off('end', this.endHandler) + this.endHandler = null + } } - get size () { - return this[kPool][kSize] + addHeader (key, value) { + processHeader(this, key, value) + return this } } -module.exports = PoolStats - - -/***/ }), - -/***/ 628: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kGetDispatcher -} = __nccwpck_require__(2128) -const Client = __nccwpck_require__(3701) -const { - InvalidArgumentError -} = __nccwpck_require__(8707) -const util = __nccwpck_require__(3440) -const { kUrl, kInterceptors } = __nccwpck_require__(6443) -const buildConnector = __nccwpck_require__(9136) - -const kOptions = Symbol('options') -const kConnections = Symbol('connections') -const kFactory = Symbol('factory') +function processHeader (request, key, val) { + if (val && (typeof val === 'object' && !Array.isArray(val))) { + throw new InvalidArgumentError(`invalid ${key} header`) + } else if (val === undefined) { + return + } -function defaultFactory (origin, opts) { - return new Client(origin, opts) -} + let headerName = headerNameLowerCasedRecord[key] -class Pool extends PoolBase { - constructor (origin, { - connections, - factory = defaultFactory, - connect, - connectTimeout, - tls, - maxCachedSessions, - socketPath, - autoSelectFamily, - autoSelectFamilyAttemptTimeout, - allowH2, - ...options - } = {}) { - if (connections != null && (!Number.isFinite(connections) || connections < 0)) { - throw new InvalidArgumentError('invalid connections') + if (headerName === undefined) { + headerName = key.toLowerCase() + if (headerNameLowerCasedRecord[headerName] === undefined && !isValidHTTPToken(headerName)) { + throw new InvalidArgumentError('invalid header key') } + } - if (typeof factory !== 'function') { - throw new InvalidArgumentError('factory must be a function.') + if (Array.isArray(val)) { + const arr = [] + for (let i = 0; i < val.length; i++) { + if (typeof val[i] === 'string') { + if (!isValidHeaderValue(val[i])) { + throw new InvalidArgumentError(`invalid ${key} header`) + } + arr.push(val[i]) + } else if (val[i] === null) { + arr.push('') + } else if (typeof val[i] === 'object') { + throw new InvalidArgumentError(`invalid ${key} header`) + } else { + // Coerce primitives (and reject unsafe coercions such as functions + // with a crafted toString/Symbol.toPrimitive). + const str = `${val[i]}` + if (!isValidHeaderValue(str)) { + throw new InvalidArgumentError(`invalid ${key} header`) + } + arr.push(str) + } } - - if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { - throw new InvalidArgumentError('connect must be a function or an object') + val = arr + } else if (typeof val === 'string') { + if (!isValidHeaderValue(val)) { + throw new InvalidArgumentError(`invalid ${key} header`) } - - if (typeof connect !== 'function') { - connect = buildConnector({ - ...tls, - maxCachedSessions, - allowH2, - socketPath, - timeout: connectTimeout, - ...(autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined), - ...connect - }) + } else if (val === null) { + val = '' + } else { + // Coerce primitives (and reject unsafe coercions such as functions + // with a crafted toString/Symbol.toPrimitive). + val = `${val}` + if (!isValidHeaderValue(val)) { + throw new InvalidArgumentError(`invalid ${key} header`) } - - super(options) - - this[kInterceptors] = options.interceptors?.Pool && Array.isArray(options.interceptors.Pool) - ? options.interceptors.Pool - : [] - this[kConnections] = connections || null - this[kUrl] = util.parseOrigin(origin) - this[kOptions] = { ...util.deepClone(options), connect, allowH2 } - this[kOptions].interceptors = options.interceptors - ? { ...options.interceptors } - : undefined - this[kFactory] = factory - - this.on('connectionError', (origin, targets, error) => { - // If a connection error occurs, we remove the client from the pool, - // and emit a connectionError event. They will not be re-used. - // Fixes https://github.com/nodejs/undici/issues/3895 - for (const target of targets) { - // Do not use kRemoveClient here, as it will close the client, - // but the client cannot be closed in this state. - const idx = this[kClients].indexOf(target) - if (idx !== -1) { - this[kClients].splice(idx, 1) - } - } - }) } - [kGetDispatcher] () { - for (const client of this[kClients]) { - if (!client[kNeedDrain]) { - return client - } + if (headerName === 'host') { + if (request.host !== null) { + throw new InvalidArgumentError('duplicate host header') + } + if (typeof val !== 'string') { + throw new InvalidArgumentError('invalid host header') + } + // Consumed by Client + request.host = val + } else if (headerName === 'content-length') { + if (request.contentLength !== null) { + throw new InvalidArgumentError('duplicate content-length header') + } + request.contentLength = parseInt(val, 10) + if (!Number.isFinite(request.contentLength)) { + throw new InvalidArgumentError('invalid content-length header') + } + } else if (request.contentType === null && headerName === 'content-type') { + request.contentType = val + request.headers.push(key, val) + } else if (headerName === 'transfer-encoding' || headerName === 'keep-alive' || headerName === 'upgrade') { + throw new InvalidArgumentError(`invalid ${headerName} header`) + } else if (headerName === 'connection') { + const value = typeof val === 'string' ? val.toLowerCase() : null + if (value !== 'close' && value !== 'keep-alive') { + throw new InvalidArgumentError('invalid connection header') } - if (!this[kConnections] || this[kClients].length < this[kConnections]) { - const dispatcher = this[kFactory](this[kUrl], this[kOptions]) - this[kAddClient](dispatcher) - return dispatcher + if (value === 'close') { + request.reset = true } + } else if (headerName === 'expect') { + throw new NotSupportedError('expect header not supported') + } else { + request.headers.push(key, val) } } -module.exports = Pool +module.exports = Request /***/ }), -/***/ 6672: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - +/***/ 6443: +/***/ ((module) => { -const { kProxy, kClose, kDestroy, kDispatch, kInterceptors } = __nccwpck_require__(6443) -const { URL } = __nccwpck_require__(3136) -const Agent = __nccwpck_require__(7405) -const Pool = __nccwpck_require__(628) -const DispatcherBase = __nccwpck_require__(1841) -const { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError } = __nccwpck_require__(8707) -const buildConnector = __nccwpck_require__(9136) -const Client = __nccwpck_require__(3701) +module.exports = { + kClose: Symbol('close'), + kDestroy: Symbol('destroy'), + kDispatch: Symbol('dispatch'), + kUrl: Symbol('url'), + kWriting: Symbol('writing'), + kResuming: Symbol('resuming'), + kQueue: Symbol('queue'), + kConnect: Symbol('connect'), + kConnecting: Symbol('connecting'), + kKeepAliveDefaultTimeout: Symbol('default keep alive timeout'), + kKeepAliveMaxTimeout: Symbol('max keep alive timeout'), + kKeepAliveTimeoutThreshold: Symbol('keep alive timeout threshold'), + kKeepAliveTimeoutValue: Symbol('keep alive timeout'), + kKeepAlive: Symbol('keep alive'), + kHeadersTimeout: Symbol('headers timeout'), + kBodyTimeout: Symbol('body timeout'), + kServerName: Symbol('server name'), + kLocalAddress: Symbol('local address'), + kHost: Symbol('host'), + kNoRef: Symbol('no ref'), + kBodyUsed: Symbol('used'), + kBody: Symbol('abstracted request body'), + kRunning: Symbol('running'), + kBlocking: Symbol('blocking'), + kPending: Symbol('pending'), + kSize: Symbol('size'), + kBusy: Symbol('busy'), + kQueued: Symbol('queued'), + kFree: Symbol('free'), + kConnected: Symbol('connected'), + kClosed: Symbol('closed'), + kNeedDrain: Symbol('need drain'), + kReset: Symbol('reset'), + kDestroyed: Symbol.for('nodejs.stream.destroyed'), + kResume: Symbol('resume'), + kOnError: Symbol('on error'), + kMaxHeadersSize: Symbol('max headers size'), + kRunningIdx: Symbol('running index'), + kPendingIdx: Symbol('pending index'), + kError: Symbol('error'), + kClients: Symbol('clients'), + kClient: Symbol('client'), + kParser: Symbol('parser'), + kOnDestroyed: Symbol('destroy callbacks'), + kPipelining: Symbol('pipelining'), + kSocket: Symbol('socket'), + kHostHeader: Symbol('host header'), + kConnector: Symbol('connector'), + kStrictContentLength: Symbol('strict content length'), + kMaxRedirections: Symbol('maxRedirections'), + kMaxRequests: Symbol('maxRequestsPerClient'), + kProxy: Symbol('proxy agent options'), + kCounter: Symbol('socket request counter'), + kInterceptors: Symbol('dispatch interceptors'), + kMaxResponseSize: Symbol('max response size'), + kHTTP2Session: Symbol('http2Session'), + kHTTP2SessionState: Symbol('http2Session state'), + kRetryHandlerDefaultRetry: Symbol('retry agent default retry'), + kConstruct: Symbol('constructable'), + kListeners: Symbol('listeners'), + kHTTPContext: Symbol('http context'), + kMaxConcurrentStreams: Symbol('max concurrent streams'), + kNoProxyAgent: Symbol('no proxy agent'), + kHttpProxyAgent: Symbol('http proxy agent'), + kHttpsProxyAgent: Symbol('https proxy agent') +} -const kAgent = Symbol('proxy agent') -const kClient = Symbol('proxy client') -const kProxyHeaders = Symbol('proxy headers') -const kRequestTls = Symbol('request tls settings') -const kProxyTls = Symbol('proxy tls settings') -const kConnectEndpoint = Symbol('connect endpoint function') -const kTunnelProxy = Symbol('tunnel proxy') -function defaultProtocolPort (protocol) { - return protocol === 'https:' ? 443 : 80 -} +/***/ }), -function defaultFactory (origin, opts) { - return new Pool(origin, opts) -} +/***/ 7752: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -const noop = () => {} -function defaultAgentFactory (origin, opts) { - if (opts.connections === 1) { - return new Client(origin, opts) - } - return new Pool(origin, opts) -} -class Http1ProxyWrapper extends DispatcherBase { - #client +const { + wellknownHeaderNames, + headerNameLowerCasedRecord +} = __nccwpck_require__(735) - constructor (proxyUrl, { headers = {}, connect, factory }) { - super() - if (!proxyUrl) { - throw new InvalidArgumentError('Proxy URL is mandatory') +class TstNode { + /** @type {any} */ + value = null + /** @type {null | TstNode} */ + left = null + /** @type {null | TstNode} */ + middle = null + /** @type {null | TstNode} */ + right = null + /** @type {number} */ + code + /** + * @param {string} key + * @param {any} value + * @param {number} index + */ + constructor (key, value, index) { + if (index === undefined || index >= key.length) { + throw new TypeError('Unreachable') } - - this[kProxyHeaders] = headers - if (factory) { - this.#client = factory(proxyUrl, { connect }) + const code = this.code = key.charCodeAt(index) + // check code is ascii string + if (code > 0x7F) { + throw new TypeError('key must be ascii string') + } + if (key.length !== ++index) { + this.middle = new TstNode(key, value, index) } else { - this.#client = new Client(proxyUrl, { connect }) + this.value = value } } - [kDispatch] (opts, handler) { - const onHeaders = handler.onHeaders - handler.onHeaders = function (statusCode, data, resume) { - if (statusCode === 407) { - if (typeof handler.onError === 'function') { - handler.onError(new InvalidArgumentError('Proxy Authentication Required (407)')) + /** + * @param {string} key + * @param {any} value + */ + add (key, value) { + const length = key.length + if (length === 0) { + throw new TypeError('Unreachable') + } + let index = 0 + let node = this + while (true) { + const code = key.charCodeAt(index) + // check code is ascii string + if (code > 0x7F) { + throw new TypeError('key must be ascii string') + } + if (node.code === code) { + if (length === ++index) { + node.value = value + break + } else if (node.middle !== null) { + node = node.middle + } else { + node.middle = new TstNode(key, value, index) + break } - return + } else if (node.code < code) { + if (node.left !== null) { + node = node.left + } else { + node.left = new TstNode(key, value, index) + break + } + } else if (node.right !== null) { + node = node.right + } else { + node.right = new TstNode(key, value, index) + break } - if (onHeaders) onHeaders.call(this, statusCode, data, resume) } + } - // Rewrite request as an HTTP1 Proxy request, without tunneling. - const { - origin, - path = '/', - headers = {} - } = opts + /** + * @param {Uint8Array} key + * @return {TstNode | null} + */ + search (key) { + const keylength = key.length + let index = 0 + let node = this + while (node !== null && index < keylength) { + let code = key[index] + // A-Z + // First check if it is bigger than 0x5a. + // Lowercase letters have higher char codes than uppercase ones. + // Also we assume that headers will mostly contain lowercase characters. + if (code <= 0x5a && code >= 0x41) { + // Lowercase for uppercase. + code |= 32 + } + while (node !== null) { + if (code === node.code) { + if (keylength === ++index) { + // Returns Node since it is the last key. + return node + } + node = node.middle + break + } + node = node.code < code ? node.left : node.right + } + } + return null + } +} - opts.path = origin + path +class TernarySearchTree { + /** @type {TstNode | null} */ + node = null - if (!('host' in headers) && !('Host' in headers)) { - const { host } = new URL(origin) - headers.host = host + /** + * @param {string} key + * @param {any} value + * */ + insert (key, value) { + if (this.node === null) { + this.node = new TstNode(key, value, 0) + } else { + this.node.add(key, value) } - opts.headers = { ...this[kProxyHeaders], ...headers } - - return this.#client[kDispatch](opts, handler) } - async [kClose] () { - return this.#client.close() + /** + * @param {Uint8Array} key + * @return {any} + */ + lookup (key) { + return this.node?.search(key)?.value ?? null } +} - async [kDestroy] (err) { - return this.#client.destroy(err) - } +const tree = new TernarySearchTree() + +for (let i = 0; i < wellknownHeaderNames.length; ++i) { + const key = headerNameLowerCasedRecord[wellknownHeaderNames[i]] + tree.insert(key, key) } -class ProxyAgent extends DispatcherBase { - constructor (opts) { - super() +module.exports = { + TernarySearchTree, + tree +} - if (!opts || (typeof opts === 'object' && !(opts instanceof URL) && !opts.uri)) { - throw new InvalidArgumentError('Proxy uri is mandatory') - } - const { clientFactory = defaultFactory } = opts - if (typeof clientFactory !== 'function') { - throw new InvalidArgumentError('Proxy opts.clientFactory must be a function.') - } +/***/ }), - const { proxyTunnel = true } = opts +/***/ 3440: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - const url = this.#getUrl(opts) - const { href, origin, port, protocol, username, password, hostname: proxyHostname } = url - this[kProxy] = { uri: href, protocol } - this[kInterceptors] = opts.interceptors?.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent) - ? opts.interceptors.ProxyAgent - : [] - this[kRequestTls] = opts.requestTls - this[kProxyTls] = opts.proxyTls - this[kProxyHeaders] = opts.headers || {} - this[kTunnelProxy] = proxyTunnel - if (opts.auth && opts.token) { - throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token') - } else if (opts.auth) { - /* @deprecated in favour of opts.token */ - this[kProxyHeaders]['proxy-authorization'] = `Basic ${opts.auth}` - } else if (opts.token) { - this[kProxyHeaders]['proxy-authorization'] = opts.token - } else if (username && password) { - this[kProxyHeaders]['proxy-authorization'] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString('base64')}` - } +const assert = __nccwpck_require__(4589) +const { kDestroyed, kBodyUsed, kListeners, kBody } = __nccwpck_require__(6443) +const { IncomingMessage } = __nccwpck_require__(7067) +const stream = __nccwpck_require__(7075) +const net = __nccwpck_require__(7030) +const { Blob } = __nccwpck_require__(4573) +const nodeUtil = __nccwpck_require__(7975) +const { stringify } = __nccwpck_require__(1792) +const { EventEmitter: EE } = __nccwpck_require__(8474) +const { InvalidArgumentError } = __nccwpck_require__(8707) +const { headerNameLowerCasedRecord } = __nccwpck_require__(735) +const { tree } = __nccwpck_require__(7752) - const connect = buildConnector({ ...opts.proxyTls }) - this[kConnectEndpoint] = buildConnector({ ...opts.requestTls }) +const [nodeMajor, nodeMinor] = process.versions.node.split('.').map(v => Number(v)) - const agentFactory = opts.factory || defaultAgentFactory - const factory = (origin, options) => { - const { protocol } = new URL(origin) - if (!this[kTunnelProxy] && protocol === 'http:' && this[kProxy].protocol === 'http:') { - return new Http1ProxyWrapper(this[kProxy].uri, { - headers: this[kProxyHeaders], - connect, - factory: agentFactory +class BodyAsyncIterable { + constructor (body) { + this[kBody] = body + this[kBodyUsed] = false + } + + async * [Symbol.asyncIterator] () { + assert(!this[kBodyUsed], 'disturbed') + this[kBodyUsed] = true + yield * this[kBody] + } +} + +function wrapRequestBody (body) { + if (isStream(body)) { + // TODO (fix): Provide some way for the user to cache the file to e.g. /tmp + // so that it can be dispatched again? + // TODO (fix): Do we need 100-expect support to provide a way to do this properly? + if (bodyLength(body) === 0) { + body + .on('data', function () { + assert(false) }) - } - return agentFactory(origin, options) } - this[kClient] = clientFactory(url, { connect }) - this[kAgent] = new Agent({ - ...opts, - factory, - connect: async (opts, callback) => { - let requestedPath = opts.host - if (!opts.port) { - requestedPath += `:${defaultProtocolPort(opts.protocol)}` - } - try { - const { socket, statusCode } = await this[kClient].connect({ - origin, - port, - path: requestedPath, - signal: opts.signal, - headers: { - ...this[kProxyHeaders], - host: opts.host - }, - servername: this[kProxyTls]?.servername || proxyHostname - }) - if (statusCode !== 200) { - socket.on('error', noop).destroy() - callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`)) - } - if (opts.protocol !== 'https:') { - callback(null, socket) - return - } - let servername - if (this[kRequestTls]) { - servername = this[kRequestTls].servername - } else { - servername = opts.servername - } - this[kConnectEndpoint]({ ...opts, servername, httpSocket: socket }, callback) - } catch (err) { - if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') { - // Throw a custom error to avoid loop in client.js#connect - callback(new SecureProxyConnectionError(err)) - } else { - callback(err) - } - } - } - }) + + if (typeof body.readableDidRead !== 'boolean') { + body[kBodyUsed] = false + EE.prototype.on.call(body, 'data', function () { + this[kBodyUsed] = true + }) + } + + return body + } else if (body && typeof body.pipeTo === 'function') { + // TODO (fix): We can't access ReadableStream internal state + // to determine whether or not it has been disturbed. This is just + // a workaround. + return new BodyAsyncIterable(body) + } else if ( + body && + typeof body !== 'string' && + !ArrayBuffer.isView(body) && + isIterable(body) + ) { + // TODO: Should we allow re-using iterable if !this.opts.idempotent + // or through some other flag? + return new BodyAsyncIterable(body) + } else { + return body } +} - dispatch (opts, handler) { - const headers = buildHeaders(opts.headers) - throwIfProxyAuthIsSent(headers) +function nop () {} - if (headers && !('host' in headers) && !('Host' in headers)) { - const { host } = new URL(opts.origin) - headers.host = host - } +function isStream (obj) { + return obj && typeof obj === 'object' && typeof obj.pipe === 'function' && typeof obj.on === 'function' +} - return this[kAgent].dispatch( - { - ...opts, - headers - }, - handler +// based on https://github.com/node-fetch/fetch-blob/blob/8ab587d34080de94140b54f07168451e7d0b655e/index.js#L229-L241 (MIT License) +function isBlobLike (object) { + if (object === null) { + return false + } else if (object instanceof Blob) { + return true + } else if (typeof object !== 'object') { + return false + } else { + const sTag = object[Symbol.toStringTag] + + return (sTag === 'Blob' || sTag === 'File') && ( + ('stream' in object && typeof object.stream === 'function') || + ('arrayBuffer' in object && typeof object.arrayBuffer === 'function') ) } +} - /** - * @param {import('../types/proxy-agent').ProxyAgent.Options | string | URL} opts - * @returns {URL} - */ - #getUrl (opts) { - if (typeof opts === 'string') { - return new URL(opts) - } else if (opts instanceof URL) { - return opts - } else { - return new URL(opts.uri) - } +function buildURL (url, queryParams) { + if (url.includes('?') || url.includes('#')) { + throw new Error('Query params cannot be passed when url already contains "?" or "#".') } - async [kClose] () { - await this[kAgent].close() - await this[kClient].close() - } + const stringified = stringify(queryParams) - async [kDestroy] () { - await this[kAgent].destroy() - await this[kClient].destroy() + if (stringified) { + url += '?' + stringified } + + return url } -/** - * @param {string[] | Record } headers - * @returns {Record } - */ -function buildHeaders (headers) { - // When using undici.fetch, the headers list is stored - // as an array. - if (Array.isArray(headers)) { - /** @type {Record } */ - const headersPair = {} +function isValidPort (port) { + const value = parseInt(port, 10) + return ( + value === Number(port) && + value >= 0 && + value <= 65535 + ) +} - for (let i = 0; i < headers.length; i += 2) { - headersPair[headers[i]] = headers[i + 1] - } +function isHttpOrHttpsPrefixed (value) { + return ( + value != null && + value[0] === 'h' && + value[1] === 't' && + value[2] === 't' && + value[3] === 'p' && + ( + value[4] === ':' || + ( + value[4] === 's' && + value[5] === ':' + ) + ) + ) +} - return headersPair - } +function parseURL (url) { + if (typeof url === 'string') { + url = new URL(url) - return headers -} + if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { + throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.') + } -/** - * @param {Record } headers - * - * Previous versions of ProxyAgent suggests the Proxy-Authorization in request headers - * Nevertheless, it was changed and to avoid a security vulnerability by end users - * this check was created. - * It should be removed in the next major version for performance reasons - */ -function throwIfProxyAuthIsSent (headers) { - const existProxyAuth = headers && Object.keys(headers) - .find((key) => key.toLowerCase() === 'proxy-authorization') - if (existProxyAuth) { - throw new InvalidArgumentError('Proxy-Authorization should be sent in ProxyAgent constructor') + return url } -} -module.exports = ProxyAgent + if (!url || typeof url !== 'object') { + throw new InvalidArgumentError('Invalid URL: The URL argument must be a non-null object.') + } + if (!(url instanceof URL)) { + if (url.port != null && url.port !== '' && isValidPort(url.port) === false) { + throw new InvalidArgumentError('Invalid URL: port must be a valid integer or a string representation of an integer.') + } -/***/ }), + if (url.path != null && typeof url.path !== 'string') { + throw new InvalidArgumentError('Invalid URL path: the path must be a string or null/undefined.') + } -/***/ 50: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + if (url.pathname != null && typeof url.pathname !== 'string') { + throw new InvalidArgumentError('Invalid URL pathname: the pathname must be a string or null/undefined.') + } + if (url.hostname != null && typeof url.hostname !== 'string') { + throw new InvalidArgumentError('Invalid URL hostname: the hostname must be a string or null/undefined.') + } + if (url.origin != null && typeof url.origin !== 'string') { + throw new InvalidArgumentError('Invalid URL origin: the origin must be a string or null/undefined.') + } -const Dispatcher = __nccwpck_require__(883) -const RetryHandler = __nccwpck_require__(7816) + if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { + throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.') + } -class RetryAgent extends Dispatcher { - #agent = null - #options = null - constructor (agent, options = {}) { - super(options) - this.#agent = agent - this.#options = options - } + const port = url.port != null + ? url.port + : (url.protocol === 'https:' ? 443 : 80) + let origin = url.origin != null + ? url.origin + : `${url.protocol || ''}//${url.hostname || ''}:${port}` + let path = url.path != null + ? url.path + : `${url.pathname || ''}${url.search || ''}` - dispatch (opts, handler) { - const retry = new RetryHandler({ - ...opts, - retryOptions: this.#options - }, { - dispatch: this.#agent.dispatch.bind(this.#agent), - handler - }) - return this.#agent.dispatch(opts, retry) - } + if (origin[origin.length - 1] === '/') { + origin = origin.slice(0, origin.length - 1) + } - close () { - return this.#agent.close() + if (path && path[0] !== '/') { + path = `/${path}` + } + // new URL(path, origin) is unsafe when `path` contains an absolute URL + // From https://developer.mozilla.org/en-US/docs/Web/API/URL/URL: + // If first parameter is a relative URL, second param is required, and will be used as the base URL. + // If first parameter is an absolute URL, a given second param will be ignored. + return new URL(`${origin}${path}`) } - destroy () { - return this.#agent.destroy() + if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { + throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.') } -} -module.exports = RetryAgent + return url +} +function parseOrigin (url) { + url = parseURL(url) -/***/ }), + if (url.pathname !== '/' || url.search || url.hash) { + throw new InvalidArgumentError('invalid url') + } -/***/ 2581: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + return url +} +function getHostname (host) { + if (host[0] === '[') { + const idx = host.indexOf(']') + assert(idx !== -1) + return host.substring(1, idx) + } -// We include a version number for the Dispatcher API. In case of breaking changes, -// this version number must be increased to avoid conflicts. -const globalDispatcher = Symbol.for('undici.globalDispatcher.1') -const { InvalidArgumentError } = __nccwpck_require__(8707) -const Agent = __nccwpck_require__(7405) + const idx = host.indexOf(':') + if (idx === -1) return host -if (getGlobalDispatcher() === undefined) { - setGlobalDispatcher(new Agent()) + return host.substring(0, idx) } -function setGlobalDispatcher (agent) { - if (!agent || typeof agent.dispatch !== 'function') { - throw new InvalidArgumentError('Argument agent must implement Agent') +// IP addresses are not valid server names per RFC6066 +// > Currently, the only server names supported are DNS hostnames +function getServerName (host) { + if (!host) { + return null } - Object.defineProperty(globalThis, globalDispatcher, { - value: agent, - writable: true, - enumerable: false, - configurable: false - }) -} -function getGlobalDispatcher () { - return globalThis[globalDispatcher] + assert(typeof host === 'string') + + const servername = getHostname(host) + if (net.isIP(servername)) { + return '' + } + + return servername } -module.exports = { - setGlobalDispatcher, - getGlobalDispatcher +function deepClone (obj) { + return JSON.parse(JSON.stringify(obj)) } +function isAsyncIterable (obj) { + return !!(obj != null && typeof obj[Symbol.asyncIterator] === 'function') +} -/***/ }), +function isIterable (obj) { + return !!(obj != null && (typeof obj[Symbol.iterator] === 'function' || typeof obj[Symbol.asyncIterator] === 'function')) +} -/***/ 8155: -/***/ ((module) => { +function bodyLength (body) { + if (body == null) { + return 0 + } else if (isStream(body)) { + const state = body._readableState + return state && state.objectMode === false && state.ended === true && Number.isFinite(state.length) + ? state.length + : null + } else if (isBlobLike(body)) { + return body.size != null ? body.size : null + } else if (isBuffer(body)) { + return body.byteLength + } + return null +} +function isDestroyed (body) { + return body && !!(body.destroyed || body[kDestroyed] || (stream.isDestroyed?.(body))) +} -module.exports = class DecoratorHandler { - #handler +function destroy (stream, err) { + if (stream == null || !isStream(stream) || isDestroyed(stream)) { + return + } - constructor (handler) { - if (typeof handler !== 'object' || handler === null) { - throw new TypeError('handler must be an object') + if (typeof stream.destroy === 'function') { + if (Object.getPrototypeOf(stream).constructor === IncomingMessage) { + // See: https://github.com/nodejs/node/pull/38505/files + stream.socket = null } - this.#handler = handler - } - onConnect (...args) { - return this.#handler.onConnect?.(...args) + stream.destroy(err) + } else if (err) { + queueMicrotask(() => { + stream.emit('error', err) + }) } - onError (...args) { - return this.#handler.onError?.(...args) + if (stream.destroyed !== true) { + stream[kDestroyed] = true } +} - onUpgrade (...args) { - return this.#handler.onUpgrade?.(...args) - } +const KEEPALIVE_TIMEOUT_EXPR = /timeout=(\d+)/ +function parseKeepAliveTimeout (val) { + const m = val.toString().match(KEEPALIVE_TIMEOUT_EXPR) + return m ? parseInt(m[1], 10) * 1000 : null +} - onResponseStarted (...args) { - return this.#handler.onResponseStarted?.(...args) - } +/** + * Retrieves a header name and returns its lowercase value. + * @param {string | Buffer} value Header name + * @returns {string} + */ +function headerNameToString (value) { + return typeof value === 'string' + ? headerNameLowerCasedRecord[value] ?? value.toLowerCase() + : tree.lookup(value) ?? value.toString('latin1').toLowerCase() +} - onHeaders (...args) { - return this.#handler.onHeaders?.(...args) - } +/** + * Receive the buffer as a string and return its lowercase value. + * @param {Buffer} value Header name + * @returns {string} + */ +function bufferToLowerCasedHeaderName (value) { + return tree.lookup(value) ?? value.toString('latin1').toLowerCase() +} - onData (...args) { - return this.#handler.onData?.(...args) - } +/** + * @param {Record | (Buffer | string | (Buffer | string)[])[]} headers + * @param {Record } [obj] + * @returns {Record } + */ +function parseHeaders (headers, obj) { + if (obj === undefined) obj = {} + for (let i = 0; i < headers.length; i += 2) { + const key = headerNameToString(headers[i]) + let val = obj[key] - onComplete (...args) { - return this.#handler.onComplete?.(...args) + if (val) { + if (typeof val === 'string') { + val = [val] + obj[key] = val + } + val.push(headers[i + 1].toString('utf8')) + } else { + const headersValue = headers[i + 1] + if (typeof headersValue === 'string') { + obj[key] = headersValue + } else { + obj[key] = Array.isArray(headersValue) ? headersValue.map(x => x.toString('utf8')) : headersValue.toString('utf8') + } + } } - onBodySent (...args) { - return this.#handler.onBodySent?.(...args) + // See https://github.com/nodejs/node/pull/46528 + if ('content-length' in obj && 'content-disposition' in obj) { + obj['content-disposition'] = Buffer.from(obj['content-disposition']).toString('latin1') } -} - - -/***/ }), - -/***/ 8754: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + return obj +} +function parseRawHeaders (headers) { + const len = headers.length + const ret = new Array(len) -const util = __nccwpck_require__(3440) -const { kBodyUsed } = __nccwpck_require__(6443) -const assert = __nccwpck_require__(4589) -const { InvalidArgumentError } = __nccwpck_require__(8707) -const EE = __nccwpck_require__(8474) + let hasContentLength = false + let contentDispositionIdx = -1 + let key + let val + let kLen = 0 -const redirectableStatusCodes = [300, 301, 302, 303, 307, 308] + for (let n = 0; n < headers.length; n += 2) { + key = headers[n] + val = headers[n + 1] -const kBody = Symbol('body') + typeof key !== 'string' && (key = key.toString()) + typeof val !== 'string' && (val = val.toString('utf8')) -class BodyAsyncIterable { - constructor (body) { - this[kBody] = body - this[kBodyUsed] = false + kLen = key.length + if (kLen === 14 && key[7] === '-' && (key === 'content-length' || key.toLowerCase() === 'content-length')) { + hasContentLength = true + } else if (kLen === 19 && key[7] === '-' && (key === 'content-disposition' || key.toLowerCase() === 'content-disposition')) { + contentDispositionIdx = n + 1 + } + ret[n] = key + ret[n + 1] = val } - async * [Symbol.asyncIterator] () { - assert(!this[kBodyUsed], 'disturbed') - this[kBodyUsed] = true - yield * this[kBody] + // See https://github.com/nodejs/node/pull/46528 + if (hasContentLength && contentDispositionIdx !== -1) { + ret[contentDispositionIdx] = Buffer.from(ret[contentDispositionIdx]).toString('latin1') } -} - -class RedirectHandler { - constructor (dispatch, maxRedirections, opts, handler) { - if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { - throw new InvalidArgumentError('maxRedirections must be a positive number') - } - - util.validateHandler(handler, opts.method, opts.upgrade) - this.dispatch = dispatch - this.location = null - this.abort = null - this.opts = { ...opts, maxRedirections: 0 } // opts must be a copy - this.maxRedirections = maxRedirections - this.handler = handler - this.history = [] - this.redirectionLimitReached = false + return ret +} - if (util.isStream(this.opts.body)) { - // TODO (fix): Provide some way for the user to cache the file to e.g. /tmp - // so that it can be dispatched again? - // TODO (fix): Do we need 100-expect support to provide a way to do this properly? - if (util.bodyLength(this.opts.body) === 0) { - this.opts.body - .on('data', function () { - assert(false) - }) - } +function isBuffer (buffer) { + // See, https://github.com/mcollina/undici/pull/319 + return buffer instanceof Uint8Array || Buffer.isBuffer(buffer) +} - if (typeof this.opts.body.readableDidRead !== 'boolean') { - this.opts.body[kBodyUsed] = false - EE.prototype.on.call(this.opts.body, 'data', function () { - this[kBodyUsed] = true - }) - } - } else if (this.opts.body && typeof this.opts.body.pipeTo === 'function') { - // TODO (fix): We can't access ReadableStream internal state - // to determine whether or not it has been disturbed. This is just - // a workaround. - this.opts.body = new BodyAsyncIterable(this.opts.body) - } else if ( - this.opts.body && - typeof this.opts.body !== 'string' && - !ArrayBuffer.isView(this.opts.body) && - util.isIterable(this.opts.body) - ) { - // TODO: Should we allow re-using iterable if !this.opts.idempotent - // or through some other flag? - this.opts.body = new BodyAsyncIterable(this.opts.body) - } +function validateHandler (handler, method, upgrade) { + if (!handler || typeof handler !== 'object') { + throw new InvalidArgumentError('handler must be an object') } - onConnect (abort) { - this.abort = abort - this.handler.onConnect(abort, { history: this.history }) + if (typeof handler.onConnect !== 'function') { + throw new InvalidArgumentError('invalid onConnect method') } - onUpgrade (statusCode, headers, socket) { - this.handler.onUpgrade(statusCode, headers, socket) + if (typeof handler.onError !== 'function') { + throw new InvalidArgumentError('invalid onError method') } - onError (error) { - this.handler.onError(error) + if (typeof handler.onBodySent !== 'function' && handler.onBodySent !== undefined) { + throw new InvalidArgumentError('invalid onBodySent method') } - onHeaders (statusCode, headers, resume, statusText) { - this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body) - ? null - : parseLocation(statusCode, headers) - - if (this.opts.throwOnMaxRedirect && this.history.length >= this.maxRedirections) { - if (this.request) { - this.request.abort(new Error('max redirects')) - } - - this.redirectionLimitReached = true - this.abort(new Error('max redirects')) - return + if (upgrade || method === 'CONNECT') { + if (typeof handler.onUpgrade !== 'function') { + throw new InvalidArgumentError('invalid onUpgrade method') + } + } else { + if (typeof handler.onHeaders !== 'function') { + throw new InvalidArgumentError('invalid onHeaders method') } - if (this.opts.origin) { - this.history.push(new URL(this.opts.path, this.opts.origin)) + if (typeof handler.onData !== 'function') { + throw new InvalidArgumentError('invalid onData method') } - if (!this.location) { - return this.handler.onHeaders(statusCode, headers, resume, statusText) + if (typeof handler.onComplete !== 'function') { + throw new InvalidArgumentError('invalid onComplete method') } + } +} - const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin))) - const path = search ? `${pathname}${search}` : pathname +// A body is disturbed if it has been read from and it cannot +// be re-used without losing state or data. +function isDisturbed (body) { + // TODO (fix): Why is body[kBodyUsed] needed? + return !!(body && (stream.isDisturbed(body) || body[kBodyUsed])) +} - // Remove headers referring to the original URL. - // By default it is Host only, unless it's a 303 (see below), which removes also all Content-* headers. - // https://tools.ietf.org/html/rfc7231#section-6.4 - this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin) - this.opts.path = path - this.opts.origin = origin - this.opts.maxRedirections = 0 - this.opts.query = null +function isErrored (body) { + return !!(body && stream.isErrored(body)) +} - // https://tools.ietf.org/html/rfc7231#section-6.4.4 - // In case of HTTP 303, always replace method to be either HEAD or GET - if (statusCode === 303 && this.opts.method !== 'HEAD') { - this.opts.method = 'GET' - this.opts.body = null - } +function isReadable (body) { + return !!(body && stream.isReadable(body)) +} + +function getSocketInfo (socket) { + return { + localAddress: socket.localAddress, + localPort: socket.localPort, + remoteAddress: socket.remoteAddress, + remotePort: socket.remotePort, + remoteFamily: socket.remoteFamily, + timeout: socket.timeout, + bytesWritten: socket.bytesWritten, + bytesRead: socket.bytesRead } +} - onData (chunk) { - if (this.location) { - /* - https://tools.ietf.org/html/rfc7231#section-6.4 +/** @type {globalThis['ReadableStream']} */ +function ReadableStreamFrom (iterable) { + // We cannot use ReadableStream.from here because it does not return a byte stream. - TLDR: undici always ignores 3xx response bodies. + let iterator + return new ReadableStream( + { + async start () { + iterator = iterable[Symbol.asyncIterator]() + }, + async pull (controller) { + const { done, value } = await iterator.next() + if (done) { + queueMicrotask(() => { + controller.close() + controller.byobRequest?.respond(0) + }) + } else { + const buf = Buffer.isBuffer(value) ? value : Buffer.from(value) + if (buf.byteLength) { + controller.enqueue(new Uint8Array(buf)) + } + } + return controller.desiredSize > 0 + }, + async cancel (reason) { + await iterator.return() + }, + type: 'bytes' + } + ) +} - Redirection is used to serve the requested resource from another URL, so it is assumes that - no body is generated (and thus can be ignored). Even though generating a body is not prohibited. +// The chunk should be a FormData instance and contains +// all the required methods. +function isFormDataLike (object) { + return ( + object && + typeof object === 'object' && + typeof object.append === 'function' && + typeof object.delete === 'function' && + typeof object.get === 'function' && + typeof object.getAll === 'function' && + typeof object.has === 'function' && + typeof object.set === 'function' && + object[Symbol.toStringTag] === 'FormData' + ) +} - For status 301, 302, 303, 307 and 308 (the latter from RFC 7238), the specs mention that the body usually - (which means it's optional and not mandated) contain just an hyperlink to the value of - the Location response header, so the body can be ignored safely. +function addAbortListener (signal, listener) { + if ('addEventListener' in signal) { + signal.addEventListener('abort', listener, { once: true }) + return () => signal.removeEventListener('abort', listener) + } + signal.addListener('abort', listener) + return () => signal.removeListener('abort', listener) +} - For status 300, which is "Multiple Choices", the spec mentions both generating a Location - response header AND a response body with the other possible location to follow. - Since the spec explicitly chooses not to specify a format for such body and leave it to - servers and browsers implementors, we ignore the body as there is no specified way to eventually parse it. - */ - } else { - return this.handler.onData(chunk) +const hasToWellFormed = typeof String.prototype.toWellFormed === 'function' +const hasIsWellFormed = typeof String.prototype.isWellFormed === 'function' + +/** + * @param {string} val + */ +function toUSVString (val) { + return hasToWellFormed ? `${val}`.toWellFormed() : nodeUtil.toUSVString(val) +} + +/** + * @param {string} val + */ +// TODO: move this to webidl +function isUSVString (val) { + return hasIsWellFormed ? `${val}`.isWellFormed() : toUSVString(val) === `${val}` +} + +/** + * @see https://tools.ietf.org/html/rfc7230#section-3.2.6 + * @param {number} c + */ +function isTokenCharCode (c) { + switch (c) { + case 0x22: + case 0x28: + case 0x29: + case 0x2c: + case 0x2f: + case 0x3a: + case 0x3b: + case 0x3c: + case 0x3d: + case 0x3e: + case 0x3f: + case 0x40: + case 0x5b: + case 0x5c: + case 0x5d: + case 0x7b: + case 0x7d: + // DQUOTE and "(),/:;<=>?@[\]{}" + return false + default: + // VCHAR %x21-7E + return c >= 0x21 && c <= 0x7e + } +} + +/** + * @param {string} characters + */ +function isValidHTTPToken (characters) { + if (characters.length === 0) { + return false + } + for (let i = 0; i < characters.length; ++i) { + if (!isTokenCharCode(characters.charCodeAt(i))) { + return false } } + return true +} - onComplete (trailers) { - if (this.location) { - /* - https://tools.ietf.org/html/rfc7231#section-6.4 +// headerCharRegex have been lifted from +// https://github.com/nodejs/node/blob/main/lib/_http_common.js - TLDR: undici always ignores 3xx response trailers as they are not expected in case of redirections - and neither are useful if present. +/** + * Matches if val contains an invalid field-vchar + * field-value = *( field-content / obs-fold ) + * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] + * field-vchar = VCHAR / obs-text + */ +const headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/ - See comment on onData method above for more detailed information. - */ +/** + * @param {string} characters + */ +function isValidHeaderValue (characters) { + return !headerCharRegex.test(characters) +} - this.location = null - this.abort = null +// Parsed accordingly to RFC 9110 +// https://www.rfc-editor.org/rfc/rfc9110#field.content-range +function parseRangeHeader (range) { + if (range == null || range === '') return { start: 0, end: null, size: null } - this.dispatch(this.opts, this) - } else { - this.handler.onComplete(trailers) - } - } + const m = range ? range.match(/^bytes (\d+)-(\d+)\/(\d+)?$/) : null + return m + ? { + start: parseInt(m[1]), + end: m[2] ? parseInt(m[2]) : null, + size: m[3] ? parseInt(m[3]) : null + } + : null +} - onBodySent (chunk) { - if (this.handler.onBodySent) { - this.handler.onBodySent(chunk) - } - } +function addListener (obj, name, listener) { + const listeners = (obj[kListeners] ??= []) + listeners.push([name, listener]) + obj.on(name, listener) + return obj } -function parseLocation (statusCode, headers) { - if (redirectableStatusCodes.indexOf(statusCode) === -1) { - return null +function removeAllListeners (obj) { + for (const [name, listener] of obj[kListeners] ?? []) { + obj.removeListener(name, listener) } + obj[kListeners] = null +} - for (let i = 0; i < headers.length; i += 2) { - if (headers[i].length === 8 && util.headerNameToString(headers[i]) === 'location') { - return headers[i + 1] - } +function errorRequest (client, request, err) { + try { + request.onError(err) + assert(request.aborted) + } catch (err) { + client.emit('error', err) } } -// https://tools.ietf.org/html/rfc7231#section-6.4.4 -function shouldRemoveHeader (header, removeContent, unknownOrigin) { - if (header.length === 4) { - return util.headerNameToString(header) === 'host' - } - if (removeContent && util.headerNameToString(header).startsWith('content-')) { - return true - } - if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) { - const name = util.headerNameToString(header) - return name === 'authorization' || name === 'cookie' || name === 'proxy-authorization' - } - return false +const kEnumerableProperty = Object.create(null) +kEnumerableProperty.enumerable = true + +const normalizedMethodRecordsBase = { + delete: 'DELETE', + DELETE: 'DELETE', + get: 'GET', + GET: 'GET', + head: 'HEAD', + HEAD: 'HEAD', + options: 'OPTIONS', + OPTIONS: 'OPTIONS', + post: 'POST', + POST: 'POST', + put: 'PUT', + PUT: 'PUT' } -// https://tools.ietf.org/html/rfc7231#section-6.4 -function cleanRequestHeaders (headers, removeContent, unknownOrigin) { - const ret = [] - if (Array.isArray(headers)) { - for (let i = 0; i < headers.length; i += 2) { - if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) { - ret.push(headers[i], headers[i + 1]) - } - } - } else if (headers && typeof headers === 'object') { - for (const key of Object.keys(headers)) { - if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) { - ret.push(key, headers[key]) - } - } - } else { - assert(headers == null, 'headers must be an object or an array') - } - return ret +const normalizedMethodRecords = { + ...normalizedMethodRecordsBase, + patch: 'patch', + PATCH: 'PATCH' } -module.exports = RedirectHandler +// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`. +Object.setPrototypeOf(normalizedMethodRecordsBase, null) +Object.setPrototypeOf(normalizedMethodRecords, null) + +module.exports = { + kEnumerableProperty, + nop, + isDisturbed, + isErrored, + isReadable, + toUSVString, + isUSVString, + isBlobLike, + parseOrigin, + parseURL, + getServerName, + isStream, + isIterable, + isAsyncIterable, + isDestroyed, + headerNameToString, + bufferToLowerCasedHeaderName, + addListener, + removeAllListeners, + errorRequest, + parseRawHeaders, + parseHeaders, + parseKeepAliveTimeout, + destroy, + bodyLength, + deepClone, + ReadableStreamFrom, + isBuffer, + validateHandler, + getSocketInfo, + isFormDataLike, + buildURL, + addAbortListener, + isValidHTTPToken, + isValidHeaderValue, + isTokenCharCode, + parseRangeHeader, + normalizedMethodRecordsBase, + normalizedMethodRecords, + isValidPort, + isHttpOrHttpsPrefixed, + nodeMajor, + nodeMinor, + safeHTTPMethods: ['GET', 'HEAD', 'OPTIONS', 'TRACE'], + wrapRequestBody +} /***/ }), -/***/ 7816: +/***/ 7405: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -const assert = __nccwpck_require__(4589) -const { kRetryHandlerDefaultRetry } = __nccwpck_require__(6443) -const { RequestRetryError } = __nccwpck_require__(8707) -const { - isDisturbed, - parseHeaders, - parseRangeHeader, - wrapRequestBody -} = __nccwpck_require__(3440) +const { InvalidArgumentError } = __nccwpck_require__(8707) +const { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = __nccwpck_require__(6443) +const DispatcherBase = __nccwpck_require__(1841) +const Pool = __nccwpck_require__(628) +const Client = __nccwpck_require__(3701) +const util = __nccwpck_require__(3440) +const createRedirectInterceptor = __nccwpck_require__(5092) -function calculateRetryAfterHeader (retryAfter) { - const current = Date.now() - return new Date(retryAfter).getTime() - current +const kOnConnect = Symbol('onConnect') +const kOnDisconnect = Symbol('onDisconnect') +const kOnConnectionError = Symbol('onConnectionError') +const kMaxRedirections = Symbol('maxRedirections') +const kOnDrain = Symbol('onDrain') +const kFactory = Symbol('factory') +const kOptions = Symbol('options') + +function defaultFactory (origin, opts) { + return opts && opts.connections === 1 + ? new Client(origin, opts) + : new Pool(origin, opts) } -function validatePartialResponseContentLength (headers, range, statusCode, retryCount) { - const contentLength = headers['content-length'] - if (contentLength == null) { - return null - } +class Agent extends DispatcherBase { + constructor ({ factory = defaultFactory, maxRedirections = 0, connect, ...options } = {}) { + if (typeof factory !== 'function') { + throw new InvalidArgumentError('factory must be a function.') + } - if (!Number.isFinite(range.start) || !Number.isFinite(range.end)) { - return null - } + if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { + throw new InvalidArgumentError('connect must be a function or an object') + } - const length = Number(contentLength) - const expectedLength = range.end - range.start + 1 - if (!Number.isFinite(length) || length !== expectedLength) { - return new RequestRetryError('Content-Length mismatch', statusCode, { - headers, - data: { count: retryCount } - }) - } + if (!Number.isInteger(maxRedirections) || maxRedirections < 0) { + throw new InvalidArgumentError('maxRedirections must be a positive number') + } - return null -} + super(options) -class RetryHandler { - constructor (opts, handlers) { - const { retryOptions, ...dispatchOpts } = opts - const { - // Retry scoped - retry: retryFn, - maxRetries, - maxTimeout, - minTimeout, - timeoutFactor, - // Response scoped - methods, - errorCodes, - retryAfter, - statusCodes - } = retryOptions ?? {} + if (connect && typeof connect !== 'function') { + connect = { ...connect } + } - this.dispatch = handlers.dispatch - this.handler = handlers.handler - this.opts = { ...dispatchOpts, body: wrapRequestBody(opts.body) } - this.abort = null - this.aborted = false - this.retryOpts = { - retry: retryFn ?? RetryHandler[kRetryHandlerDefaultRetry], - retryAfter: retryAfter ?? true, - maxTimeout: maxTimeout ?? 30 * 1000, // 30s, - minTimeout: minTimeout ?? 500, // .5s - timeoutFactor: timeoutFactor ?? 2, - maxRetries: maxRetries ?? 5, - // What errors we should retry - methods: methods ?? ['GET', 'HEAD', 'OPTIONS', 'PUT', 'DELETE', 'TRACE'], - // Indicates which errors to retry - statusCodes: statusCodes ?? [500, 502, 503, 504, 429], - // List of errors to retry - errorCodes: errorCodes ?? [ - 'ECONNRESET', - 'ECONNREFUSED', - 'ENOTFOUND', - 'ENETDOWN', - 'ENETUNREACH', - 'EHOSTDOWN', - 'EHOSTUNREACH', - 'EPIPE', - 'UND_ERR_SOCKET' - ] + this[kInterceptors] = options.interceptors?.Agent && Array.isArray(options.interceptors.Agent) + ? options.interceptors.Agent + : [createRedirectInterceptor({ maxRedirections })] + + this[kOptions] = { ...util.deepClone(options), connect } + this[kOptions].interceptors = options.interceptors + ? { ...options.interceptors } + : undefined + this[kMaxRedirections] = maxRedirections + this[kFactory] = factory + this[kClients] = new Map() + + this[kOnDrain] = (origin, targets) => { + this.emit('drain', origin, [this, ...targets]) } - this.retryCount = 0 - this.retryCountCheckpoint = 0 - this.start = 0 - this.end = null - this.etag = null - this.resume = null + this[kOnConnect] = (origin, targets) => { + this.emit('connect', origin, [this, ...targets]) + } - // Handle possible onConnect duplication - this.handler.onConnect(reason => { - this.aborted = true - if (this.abort) { - this.abort(reason) - } else { - this.reason = reason - } - }) - } + this[kOnDisconnect] = (origin, targets, err) => { + this.emit('disconnect', origin, [this, ...targets], err) + } - onRequestSent () { - if (this.handler.onRequestSent) { - this.handler.onRequestSent() + this[kOnConnectionError] = (origin, targets, err) => { + this.emit('connectionError', origin, [this, ...targets], err) } } - onUpgrade (statusCode, headers, socket) { - if (this.handler.onUpgrade) { - this.handler.onUpgrade(statusCode, headers, socket) + get [kRunning] () { + let ret = 0 + for (const client of this[kClients].values()) { + ret += client[kRunning] } + return ret } - onConnect (abort) { - if (this.aborted) { - abort(this.reason) + [kDispatch] (opts, handler) { + let key + if (opts.origin && (typeof opts.origin === 'string' || opts.origin instanceof URL)) { + key = String(opts.origin) } else { - this.abort = abort + throw new InvalidArgumentError('opts.origin must be a non-empty string or URL.') } - } - onBodySent (chunk) { - if (this.handler.onBodySent) return this.handler.onBodySent(chunk) - } + let dispatcher = this[kClients].get(key) - static [kRetryHandlerDefaultRetry] (err, { state, opts }, cb) { - const { statusCode, code, headers } = err - const { method, retryOptions } = opts - const { - maxRetries, - minTimeout, - maxTimeout, - timeoutFactor, - statusCodes, - errorCodes, - methods - } = retryOptions - const { counter } = state + if (!dispatcher) { + dispatcher = this[kFactory](opts.origin, this[kOptions]) + .on('drain', this[kOnDrain]) + .on('connect', this[kOnConnect]) + .on('disconnect', this[kOnDisconnect]) + .on('connectionError', this[kOnConnectionError]) - // Any code that is not a Undici's originated and allowed to retry - if (code && code !== 'UND_ERR_REQ_RETRY' && !errorCodes.includes(code)) { - cb(err) - return + // This introduces a tiny memory leak, as dispatchers are never removed from the map. + // TODO(mcollina): remove te timer when the client/pool do not have any more + // active connections. + this[kClients].set(key, dispatcher) } - // If a set of method are provided and the current method is not in the list - if (Array.isArray(methods) && !methods.includes(method)) { - cb(err) - return - } + return dispatcher.dispatch(opts, handler) + } - // If a set of status code are provided and the current status code is not in the list - if ( - statusCode != null && - Array.isArray(statusCodes) && - !statusCodes.includes(statusCode) - ) { - cb(err) - return + async [kClose] () { + const closePromises = [] + for (const client of this[kClients].values()) { + closePromises.push(client.close()) } + this[kClients].clear() - // If we reached the max number of retries - if (counter > maxRetries) { - cb(err) - return - } + await Promise.all(closePromises) + } - let retryAfterHeader = headers?.['retry-after'] - if (retryAfterHeader) { - retryAfterHeader = Number(retryAfterHeader) - retryAfterHeader = Number.isNaN(retryAfterHeader) - ? calculateRetryAfterHeader(retryAfterHeader) - : retryAfterHeader * 1e3 // Retry-After is in seconds + async [kDestroy] (err) { + const destroyPromises = [] + for (const client of this[kClients].values()) { + destroyPromises.push(client.destroy(err)) } + this[kClients].clear() - const retryTimeout = - retryAfterHeader > 0 - ? Math.min(retryAfterHeader, maxTimeout) - : Math.min(minTimeout * timeoutFactor ** (counter - 1), maxTimeout) - - setTimeout(() => cb(null), retryTimeout) + await Promise.all(destroyPromises) } +} - onHeaders (statusCode, rawHeaders, resume, statusMessage) { - const headers = parseHeaders(rawHeaders) +module.exports = Agent - this.retryCount += 1 - if (statusCode >= 300) { - if (this.retryOpts.statusCodes.includes(statusCode) === false) { - return this.handler.onHeaders( - statusCode, - rawHeaders, - resume, - statusMessage - ) - } else { - this.abort( - new RequestRetryError('Request failed', statusCode, { - headers, - data: { - count: this.retryCount - } - }) - ) - return false - } - } +/***/ }), - // Checkpoint for resume from where we left it - if (this.resume != null) { - this.resume = null +/***/ 837: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - // Only Partial Content 206 supposed to provide Content-Range, - // any other status code that partially consumed the payload - // should not be retry because it would result in downstream - // wrongly concatanete multiple responses. - if (statusCode !== 206 && (this.start > 0 || statusCode !== 200)) { - this.abort( - new RequestRetryError('server does not support the range header and the payload was partially consumed', statusCode, { - headers, - data: { count: this.retryCount } - }) - ) - return false - } - const contentRange = parseRangeHeader(headers['content-range']) - // If no content range - if (!contentRange) { - this.abort( - new RequestRetryError('Content-Range mismatch', statusCode, { - headers, - data: { count: this.retryCount } - }) - ) - return false - } - // Let's start with a weak etag check - if (this.etag != null && this.etag !== headers.etag) { - this.abort( - new RequestRetryError('ETag mismatch', statusCode, { - headers, - data: { count: this.retryCount } - }) - ) - return false - } +const { + BalancedPoolMissingUpstreamError, + InvalidArgumentError +} = __nccwpck_require__(8707) +const { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kRemoveClient, + kGetDispatcher +} = __nccwpck_require__(2128) +const Pool = __nccwpck_require__(628) +const { kUrl, kInterceptors } = __nccwpck_require__(6443) +const { parseOrigin } = __nccwpck_require__(3440) +const kFactory = Symbol('factory') + +const kOptions = Symbol('options') +const kGreatestCommonDivisor = Symbol('kGreatestCommonDivisor') +const kCurrentWeight = Symbol('kCurrentWeight') +const kIndex = Symbol('kIndex') +const kWeight = Symbol('kWeight') +const kMaxWeightPerServer = Symbol('kMaxWeightPerServer') +const kErrorPenalty = Symbol('kErrorPenalty') + +/** + * Calculate the greatest common divisor of two numbers by + * using the Euclidean algorithm. + * + * @param {number} a + * @param {number} b + * @returns {number} + */ +function getGreatestCommonDivisor (a, b) { + if (a === 0) return b + + while (b !== 0) { + const t = b + b = a % b + a = t + } + return a +} + +function defaultFactory (origin, opts) { + return new Pool(origin, opts) +} - const contentLengthError = validatePartialResponseContentLength(headers, contentRange, statusCode, this.retryCount) - if (contentLengthError != null) { - this.abort(contentLengthError) - return false - } +class BalancedPool extends PoolBase { + constructor (upstreams = [], { factory = defaultFactory, ...opts } = {}) { + super() - const { start, size, end = size - 1 } = contentRange + this[kOptions] = opts + this[kIndex] = -1 + this[kCurrentWeight] = 0 - assert(this.start === start, 'content-range mismatch') - assert(this.end == null || this.end === end, 'content-range mismatch') + this[kMaxWeightPerServer] = this[kOptions].maxWeightPerServer || 100 + this[kErrorPenalty] = this[kOptions].errorPenalty || 15 - this.resume = resume - return true + if (!Array.isArray(upstreams)) { + upstreams = [upstreams] } - if (this.end == null) { - if (statusCode === 206) { - // First time we receive 206 - const range = parseRangeHeader(headers['content-range']) - - if (range == null) { - return this.handler.onHeaders( - statusCode, - rawHeaders, - resume, - statusMessage - ) - } + if (typeof factory !== 'function') { + throw new InvalidArgumentError('factory must be a function.') + } - const contentLengthError = validatePartialResponseContentLength(headers, range, statusCode, this.retryCount) - if (contentLengthError != null) { - this.abort(contentLengthError) - return false - } + this[kInterceptors] = opts.interceptors?.BalancedPool && Array.isArray(opts.interceptors.BalancedPool) + ? opts.interceptors.BalancedPool + : [] + this[kFactory] = factory - const { start, size, end = size - 1 } = range - assert( - start != null && Number.isFinite(start), - 'content-range mismatch' - ) - assert(end != null && Number.isFinite(end), 'invalid content-length') + for (const upstream of upstreams) { + this.addUpstream(upstream) + } + this._updateBalancedPoolStats() + } - this.start = start - this.end = end - } + addUpstream (upstream) { + const upstreamOrigin = parseOrigin(upstream).origin - // We make our best to checkpoint the body for further range headers - if (this.end == null) { - const contentLength = headers['content-length'] - this.end = contentLength != null ? Number(contentLength) - 1 : null - } + if (this[kClients].find((pool) => ( + pool[kUrl].origin === upstreamOrigin && + pool.closed !== true && + pool.destroyed !== true + ))) { + return this + } + const pool = this[kFactory](upstreamOrigin, Object.assign({}, this[kOptions])) - assert(Number.isFinite(this.start)) - assert( - this.end == null || Number.isFinite(this.end), - 'invalid content-length' - ) + this[kAddClient](pool) + pool.on('connect', () => { + pool[kWeight] = Math.min(this[kMaxWeightPerServer], pool[kWeight] + this[kErrorPenalty]) + }) - this.resume = resume - this.etag = headers.etag != null ? headers.etag : null + pool.on('connectionError', () => { + pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]) + this._updateBalancedPoolStats() + }) - // Weak etags are not useful for comparison nor cache - // for instance not safe to assume if the response is byte-per-byte - // equal - if (this.etag != null && this.etag.startsWith('W/')) { - this.etag = null + pool.on('disconnect', (...args) => { + const err = args[2] + if (err && err.code === 'UND_ERR_SOCKET') { + // decrease the weight of the pool. + pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]) + this._updateBalancedPoolStats() } + }) - return this.handler.onHeaders( - statusCode, - rawHeaders, - resume, - statusMessage - ) + for (const client of this[kClients]) { + client[kWeight] = this[kMaxWeightPerServer] } - const err = new RequestRetryError('Request failed', statusCode, { - headers, - data: { count: this.retryCount } - }) + this._updateBalancedPoolStats() - this.abort(err) + return this + } - return false + _updateBalancedPoolStats () { + let result = 0 + for (let i = 0; i < this[kClients].length; i++) { + result = getGreatestCommonDivisor(this[kClients][i][kWeight], result) + } + + this[kGreatestCommonDivisor] = result } - onData (chunk) { - this.start += chunk.length + removeUpstream (upstream) { + const upstreamOrigin = parseOrigin(upstream).origin - return this.handler.onData(chunk) + const pool = this[kClients].find((pool) => ( + pool[kUrl].origin === upstreamOrigin && + pool.closed !== true && + pool.destroyed !== true + )) + + if (pool) { + this[kRemoveClient](pool) + } + + return this } - onComplete (rawTrailers) { - this.retryCount = 0 - return this.handler.onComplete(rawTrailers) + get upstreams () { + return this[kClients] + .filter(dispatcher => dispatcher.closed !== true && dispatcher.destroyed !== true) + .map((p) => p[kUrl].origin) } - onError (err) { - if (this.aborted || isDisturbed(this.opts.body)) { - return this.handler.onError(err) + [kGetDispatcher] () { + // We validate that pools is greater than 0, + // otherwise we would have to wait until an upstream + // is added, which might never happen. + if (this[kClients].length === 0) { + throw new BalancedPoolMissingUpstreamError() } - // We reconcile in case of a mix between network errors - // and server error response - if (this.retryCount - this.retryCountCheckpoint > 0) { - // We count the difference between the last checkpoint and the current retry count - this.retryCount = - this.retryCountCheckpoint + - (this.retryCount - this.retryCountCheckpoint) - } else { - this.retryCount += 1 + const dispatcher = this[kClients].find(dispatcher => ( + !dispatcher[kNeedDrain] && + dispatcher.closed !== true && + dispatcher.destroyed !== true + )) + + if (!dispatcher) { + return } - this.retryOpts.retry( - err, - { - state: { counter: this.retryCount }, - opts: { retryOptions: this.retryOpts, ...this.opts } - }, - onRetry.bind(this) - ) + const allClientsBusy = this[kClients].map(pool => pool[kNeedDrain]).reduce((a, b) => a && b, true) - function onRetry (err) { - if (err != null || this.aborted || isDisturbed(this.opts.body)) { - return this.handler.onError(err) - } + if (allClientsBusy) { + return + } - if (this.start !== 0) { - const headers = { range: `bytes=${this.start}-${this.end ?? ''}` } + let counter = 0 - // Weak etag check - weak etags will make comparison algorithms never match - if (this.etag != null) { - headers['if-match'] = this.etag - } + let maxWeightIndex = this[kClients].findIndex(pool => !pool[kNeedDrain]) - this.opts = { - ...this.opts, - headers: { - ...this.opts.headers, - ...headers - } - } + while (counter++ < this[kClients].length) { + this[kIndex] = (this[kIndex] + 1) % this[kClients].length + const pool = this[kClients][this[kIndex]] + + // find pool index with the largest weight + if (pool[kWeight] > this[kClients][maxWeightIndex][kWeight] && !pool[kNeedDrain]) { + maxWeightIndex = this[kIndex] } - try { - this.retryCountCheckpoint = this.retryCount - this.dispatch(this.opts, this) - } catch (err) { - this.handler.onError(err) + // decrease the current weight every `this[kClients].length`. + if (this[kIndex] === 0) { + // Set the current weight to the next lower weight. + this[kCurrentWeight] = this[kCurrentWeight] - this[kGreatestCommonDivisor] + + if (this[kCurrentWeight] <= 0) { + this[kCurrentWeight] = this[kMaxWeightPerServer] + } + } + if (pool[kWeight] >= this[kCurrentWeight] && (!pool[kNeedDrain])) { + return pool } } + + this[kCurrentWeight] = this[kClients][maxWeightIndex][kWeight] + this[kIndex] = maxWeightIndex + return this[kClients][maxWeightIndex] } } -module.exports = RetryHandler +module.exports = BalancedPool /***/ }), -/***/ 379: +/***/ 637: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -const { isIP } = __nccwpck_require__(7030) -const { lookup } = __nccwpck_require__(610) -const DecoratorHandler = __nccwpck_require__(8155) -const { InvalidArgumentError, InformationalError } = __nccwpck_require__(8707) -const maxInt = Math.pow(2, 31) - 1 -class DNSInstance { - #maxTTL = 0 - #maxItems = 0 - #records = new Map() - dualStack = true - affinity = null - lookup = null - pick = null +/* global WebAssembly */ - constructor (opts) { - this.#maxTTL = opts.maxTTL - this.#maxItems = opts.maxItems - this.dualStack = opts.dualStack - this.affinity = opts.affinity - this.lookup = opts.lookup ?? this.#defaultLookup - this.pick = opts.pick ?? this.#defaultPick - } +const assert = __nccwpck_require__(4589) +const util = __nccwpck_require__(3440) +const { channels } = __nccwpck_require__(2414) +const timers = __nccwpck_require__(6603) +const { + RequestContentLengthMismatchError, + ResponseContentLengthMismatchError, + RequestAbortedError, + InvalidArgumentError, + HeadersTimeoutError, + HeadersOverflowError, + SocketError, + InformationalError, + BodyTimeoutError, + HTTPParserError, + ResponseExceededMaxSizeError +} = __nccwpck_require__(8707) +const { + kUrl, + kReset, + kClient, + kParser, + kBlocking, + kRunning, + kPending, + kSize, + kWriting, + kQueue, + kNoRef, + kKeepAliveDefaultTimeout, + kHostHeader, + kPendingIdx, + kRunningIdx, + kError, + kPipelining, + kSocket, + kKeepAliveTimeoutValue, + kMaxHeadersSize, + kKeepAliveMaxTimeout, + kKeepAliveTimeoutThreshold, + kHeadersTimeout, + kBodyTimeout, + kStrictContentLength, + kMaxRequests, + kCounter, + kMaxResponseSize, + kOnError, + kResume, + kHTTPContext +} = __nccwpck_require__(6443) - get full () { - return this.#records.size === this.#maxItems - } +const constants = __nccwpck_require__(2824) +const EMPTY_BUF = Buffer.alloc(0) +const FastBuffer = Buffer[Symbol.species] +const addListener = util.addListener +const removeAllListeners = util.removeAllListeners +const kIdleSocketValidation = Symbol('kIdleSocketValidation') +const kIdleSocketValidationTimeout = Symbol('kIdleSocketValidationTimeout') +const kSocketUsed = Symbol('kSocketUsed') - runLookup (origin, opts, cb) { - const ips = this.#records.get(origin.hostname) +let extractBody - // If full, we just return the origin - if (ips == null && this.full) { - cb(null, origin.origin) - return - } +async function lazyllhttp () { + const llhttpWasmData = process.env.JEST_WORKER_ID ? __nccwpck_require__(3870) : undefined - const newOpts = { - affinity: this.affinity, - dualStack: this.dualStack, - lookup: this.lookup, - pick: this.pick, - ...opts.dns, - maxTTL: this.#maxTTL, - maxItems: this.#maxItems - } + let mod + try { + mod = await WebAssembly.compile(__nccwpck_require__(3434)) + } catch (e) { + /* istanbul ignore next */ - // If no IPs we lookup - if (ips == null) { - this.lookup(origin, newOpts, (err, addresses) => { - if (err || addresses == null || addresses.length === 0) { - cb(err ?? new InformationalError('No DNS entries found')) - return - } + // We could check if the error was caused by the simd option not + // being enabled, but the occurring of this other error + // * https://github.com/emscripten-core/emscripten/issues/11495 + // got me to remove that check to avoid breaking Node 12. + mod = await WebAssembly.compile(llhttpWasmData || __nccwpck_require__(3870)) + } - this.setRecords(origin, addresses) - const records = this.#records.get(origin.hostname) + return await WebAssembly.instantiate(mod, { + env: { + /* eslint-disable camelcase */ - const ip = this.pick( - origin, - records, - newOpts.affinity - ) + wasm_on_url: (p, at, len) => { + /* istanbul ignore next */ + return 0 + }, + wasm_on_status: (p, at, len) => { + assert(currentParser.ptr === p) + const start = at - currentBufferPtr + currentBufferRef.byteOffset + return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + }, + wasm_on_message_begin: (p) => { + assert(currentParser.ptr === p) + return currentParser.onMessageBegin() || 0 + }, + wasm_on_header_field: (p, at, len) => { + assert(currentParser.ptr === p) + const start = at - currentBufferPtr + currentBufferRef.byteOffset + return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + }, + wasm_on_header_value: (p, at, len) => { + assert(currentParser.ptr === p) + const start = at - currentBufferPtr + currentBufferRef.byteOffset + return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + }, + wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => { + assert(currentParser.ptr === p) + return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0 + }, + wasm_on_body: (p, at, len) => { + assert(currentParser.ptr === p) + const start = at - currentBufferPtr + currentBufferRef.byteOffset + return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + }, + wasm_on_message_complete: (p) => { + assert(currentParser.ptr === p) + return currentParser.onMessageComplete() || 0 + } - let port - if (typeof ip.port === 'number') { - port = `:${ip.port}` - } else if (origin.port !== '') { - port = `:${origin.port}` - } else { - port = '' - } + /* eslint-enable camelcase */ + } + }) +} - cb( - null, - `${origin.protocol}//${ - ip.family === 6 ? `[${ip.address}]` : ip.address - }${port}` - ) - }) - } else { - // If there's IPs we pick - const ip = this.pick( - origin, - ips, - newOpts.affinity - ) +let llhttpInstance = null +let llhttpPromise = lazyllhttp() +llhttpPromise.catch() - // If no IPs we lookup - deleting old records - if (ip == null) { - this.#records.delete(origin.hostname) - this.runLookup(origin, opts, cb) - return - } +let currentParser = null +let currentBufferRef = null +let currentBufferSize = 0 +let currentBufferPtr = null - let port - if (typeof ip.port === 'number') { - port = `:${ip.port}` - } else if (origin.port !== '') { - port = `:${origin.port}` - } else { - port = '' - } +const USE_NATIVE_TIMER = 0 +const USE_FAST_TIMER = 1 - cb( - null, - `${origin.protocol}//${ - ip.family === 6 ? `[${ip.address}]` : ip.address - }${port}` - ) - } - } +// Use fast timers for headers and body to take eventual event loop +// latency into account. +const TIMEOUT_HEADERS = 2 | USE_FAST_TIMER +const TIMEOUT_BODY = 4 | USE_FAST_TIMER - #defaultLookup (origin, opts, cb) { - lookup( - origin.hostname, - { - all: true, - family: this.dualStack === false ? this.affinity : 0, - order: 'ipv4first' - }, - (err, addresses) => { - if (err) { - return cb(err) - } +// Use native timers to ignore event loop latency for keep-alive +// handling. +const TIMEOUT_KEEP_ALIVE = 8 | USE_NATIVE_TIMER - const results = new Map() +class Parser { + constructor (client, socket, { exports }) { + assert(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0) - for (const addr of addresses) { - // On linux we found duplicates, we attempt to remove them with - // the latest record - results.set(`${addr.address}:${addr.family}`, addr) - } + this.llhttp = exports + this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE) + this.client = client + this.socket = socket + this.timeout = null + this.timeoutValue = null + this.timeoutType = null + this.statusCode = null + this.statusText = '' + this.upgrade = false + this.headers = [] + this.headersSize = 0 + this.headersMaxSize = client[kMaxHeadersSize] + this.shouldKeepAlive = false + this.paused = false + this.resume = this.resume.bind(this) - cb(null, results.values()) - } - ) + this.bytesRead = 0 + + this.keepAlive = '' + this.contentLength = '' + this.connection = '' + this.maxResponseSize = client[kMaxResponseSize] } - #defaultPick (origin, hostnameRecords, affinity) { - let ip = null - const { records, offset } = hostnameRecords + setTimeout (delay, type) { + // If the existing timer and the new timer are of different timer type + // (fast or native) or have different delay, we need to clear the existing + // timer and set a new one. + if ( + delay !== this.timeoutValue || + (type & USE_FAST_TIMER) ^ (this.timeoutType & USE_FAST_TIMER) + ) { + // If a timeout is already set, clear it with clearTimeout of the fast + // timer implementation, as it can clear fast and native timers. + if (this.timeout) { + timers.clearTimeout(this.timeout) + this.timeout = null + } - let family - if (this.dualStack) { - if (affinity == null) { - // Balance between ip families - if (offset == null || offset === maxInt) { - hostnameRecords.offset = 0 - affinity = 4 + if (delay) { + if (type & USE_FAST_TIMER) { + this.timeout = timers.setFastTimeout(onParserTimeout, delay, new WeakRef(this)) } else { - hostnameRecords.offset++ - affinity = (hostnameRecords.offset & 1) === 1 ? 6 : 4 + this.timeout = setTimeout(onParserTimeout, delay, new WeakRef(this)) + this.timeout.unref() } } - if (records[affinity] != null && records[affinity].ips.length > 0) { - family = records[affinity] - } else { - family = records[affinity === 4 ? 6 : 4] + this.timeoutValue = delay + } else if (this.timeout) { + // istanbul ignore else: only for jest + if (this.timeout.refresh) { + this.timeout.refresh() } - } else { - family = records[affinity] } - // If no IPs we return null - if (family == null || family.ips.length === 0) { - return ip - } + this.timeoutType = type + } - if (family.offset == null || family.offset === maxInt) { - family.offset = 0 - } else { - family.offset++ + resume () { + if (this.socket.destroyed || !this.paused) { + return } - const position = family.offset % family.ips.length - ip = family.ips[position] ?? null + assert(this.ptr != null) + assert(currentParser == null) - if (ip == null) { - return ip - } + this.llhttp.llhttp_resume(this.ptr) - if (Date.now() - ip.timestamp > ip.ttl) { // record TTL is already in ms - // We delete expired records - // It is possible that they have different TTL, so we manage them individually - family.ips.splice(position, 1) - return this.pick(origin, hostnameRecords, affinity) + assert(this.timeoutType === TIMEOUT_BODY) + if (this.timeout) { + // istanbul ignore else: only for jest + if (this.timeout.refresh) { + this.timeout.refresh() + } } - return ip + this.paused = false + this.execute(this.socket.read() || EMPTY_BUF) // Flush parser. + this.readMore() } - setRecords (origin, addresses) { - const timestamp = Date.now() - const records = { records: { 4: null, 6: null } } - for (const record of addresses) { - record.timestamp = timestamp - if (typeof record.ttl === 'number') { - // The record TTL is expected to be in ms - record.ttl = Math.min(record.ttl, this.#maxTTL) - } else { - record.ttl = this.#maxTTL + readMore () { + while (!this.paused && this.ptr) { + const chunk = this.socket.read() + if (chunk === null) { + break } - - const familyRecords = records.records[record.family] ?? { ips: [] } - - familyRecords.ips.push(record) - records.records[record.family] = familyRecords + this.execute(chunk) } - - this.#records.set(origin.hostname, records) } - getHandler (meta, opts) { - return new DNSDispatchHandler(this, meta, opts) - } -} + execute (data) { + assert(this.ptr != null) + assert(currentParser == null) + assert(!this.paused) -class DNSDispatchHandler extends DecoratorHandler { - #state = null - #opts = null - #dispatch = null - #handler = null - #origin = null + const { socket, llhttp } = this - constructor (state, { origin, handler, dispatch }, opts) { - super(handler) - this.#origin = origin - this.#handler = handler - this.#opts = { ...opts } - this.#state = state - this.#dispatch = dispatch - } + if (data.length > currentBufferSize) { + if (currentBufferPtr) { + llhttp.free(currentBufferPtr) + } + currentBufferSize = Math.ceil(data.length / 4096) * 4096 + currentBufferPtr = llhttp.malloc(currentBufferSize) + } - onError (err) { - switch (err.code) { - case 'ETIMEDOUT': - case 'ECONNREFUSED': { - if (this.#state.dualStack) { - // We delete the record and retry - this.#state.runLookup(this.#origin, this.#opts, (err, newOrigin) => { - if (err) { - return this.#handler.onError(err) - } + new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data) - const dispatchOpts = { - ...this.#opts, - origin: newOrigin - } + // Call `execute` on the wasm parser. + // We pass the `llhttp_parser` pointer address, the pointer address of buffer view data, + // and finally the length of bytes to parse. + // The return value is an error code or `constants.ERROR.OK`. + try { + let ret - this.#dispatch(dispatchOpts, this) - }) + try { + currentBufferRef = data + currentParser = this + ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length) + /* eslint-disable-next-line no-useless-catch */ + } catch (err) { + /* istanbul ignore next: difficult to make a test case for */ + throw err + } finally { + currentParser = null + currentBufferRef = null + } - // if dual-stack disabled, we error out - return - } + const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr - this.#handler.onError(err) - return + if (ret !== constants.ERROR.OK) { + const body = data.subarray(offset) + + if (ret === constants.ERROR.PAUSED_UPGRADE) { + this.onUpgrade(body) + } else if (ret === constants.ERROR.PAUSED) { + this.paused = true + socket.unshift(body) + } else { + throw this.createError(ret, body) + } } - case 'ENOTFOUND': - this.#state.deleteRecord(this.#origin) - // eslint-disable-next-line no-fallthrough - default: - this.#handler.onError(err) - break + } catch (err) { + util.destroy(socket, err) } } -} - -module.exports = interceptorOpts => { - if ( - interceptorOpts?.maxTTL != null && - (typeof interceptorOpts?.maxTTL !== 'number' || interceptorOpts?.maxTTL < 0) - ) { - throw new InvalidArgumentError('Invalid maxTTL. Must be a positive number') - } - if ( - interceptorOpts?.maxItems != null && - (typeof interceptorOpts?.maxItems !== 'number' || - interceptorOpts?.maxItems < 1) - ) { - throw new InvalidArgumentError( - 'Invalid maxItems. Must be a positive number and greater than zero' - ) - } + finish () { + assert(currentParser === null) + assert(this.ptr != null) + assert(!this.paused) - if ( - interceptorOpts?.affinity != null && - interceptorOpts?.affinity !== 4 && - interceptorOpts?.affinity !== 6 - ) { - throw new InvalidArgumentError('Invalid affinity. Must be either 4 or 6') - } + const { llhttp } = this - if ( - interceptorOpts?.dualStack != null && - typeof interceptorOpts?.dualStack !== 'boolean' - ) { - throw new InvalidArgumentError('Invalid dualStack. Must be a boolean') - } + let ret - if ( - interceptorOpts?.lookup != null && - typeof interceptorOpts?.lookup !== 'function' - ) { - throw new InvalidArgumentError('Invalid lookup. Must be a function') - } + try { + currentParser = this + ret = llhttp.llhttp_finish(this.ptr) + } finally { + currentParser = null + } - if ( - interceptorOpts?.pick != null && - typeof interceptorOpts?.pick !== 'function' - ) { - throw new InvalidArgumentError('Invalid pick. Must be a function') - } + if (ret === constants.ERROR.OK) { + return null + } - const dualStack = interceptorOpts?.dualStack ?? true - let affinity - if (dualStack) { - affinity = interceptorOpts?.affinity ?? null - } else { - affinity = interceptorOpts?.affinity ?? 4 - } + if (ret === constants.ERROR.PAUSED || ret === constants.ERROR.PAUSED_UPGRADE) { + this.paused = true + return null + } - const opts = { - maxTTL: interceptorOpts?.maxTTL ?? 10e3, // Expressed in ms - lookup: interceptorOpts?.lookup ?? null, - pick: interceptorOpts?.pick ?? null, - dualStack, - affinity, - maxItems: interceptorOpts?.maxItems ?? Infinity + return this.createError(ret, EMPTY_BUF) } - const instance = new DNSInstance(opts) - - return dispatch => { - return function dnsInterceptor (origDispatchOpts, handler) { - const origin = - origDispatchOpts.origin.constructor === URL - ? origDispatchOpts.origin - : new URL(origDispatchOpts.origin) - - if (isIP(origin.hostname) !== 0) { - return dispatch(origDispatchOpts, handler) - } - - instance.runLookup(origin, origDispatchOpts, (err, newOrigin) => { - if (err) { - return handler.onError(err) - } - - let dispatchOpts = null - dispatchOpts = { - ...origDispatchOpts, - servername: origin.hostname, // For SNI on TLS - origin: newOrigin, - headers: { - host: origin.hostname, - ...origDispatchOpts.headers - } - } + createError (ret, data) { + const { llhttp, contentLength, bytesRead } = this - dispatch( - dispatchOpts, - instance.getHandler({ origin, dispatch, handler }, origDispatchOpts) - ) - }) + if (contentLength && bytesRead !== parseInt(contentLength, 10)) { + return new ResponseContentLengthMismatchError() + } - return true + const ptr = llhttp.llhttp_get_error_reason(this.ptr) + let message = '' + if (ptr) { + const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0) + message = + 'Response does not match the HTTP/1.1 protocol (' + + Buffer.from(llhttp.memory.buffer, ptr, len).toString() + + ')' } - } -} + return new HTTPParserError(message, constants.ERROR[ret], data) + } -/***/ }), + destroy () { + assert(this.ptr != null) + assert(currentParser == null) -/***/ 8060: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + this.llhttp.llhttp_free(this.ptr) + this.ptr = null + this.timeout && timers.clearTimeout(this.timeout) + this.timeout = null + this.timeoutValue = null + this.timeoutType = null + this.paused = false + } -const util = __nccwpck_require__(3440) -const { InvalidArgumentError, RequestAbortedError } = __nccwpck_require__(8707) -const DecoratorHandler = __nccwpck_require__(8155) + onStatus (buf) { + this.statusText = buf.toString() + } -class DumpHandler extends DecoratorHandler { - #maxSize = 1024 * 1024 - #abort = null - #dumped = false - #aborted = false - #size = 0 - #reason = null - #handler = null + onMessageBegin () { + const { socket, client } = this - constructor ({ maxSize }, handler) { - super(handler) + /* istanbul ignore next: difficult to make a test case for */ + if (socket.destroyed) { + return -1 + } - if (maxSize != null && (!Number.isFinite(maxSize) || maxSize < 1)) { - throw new InvalidArgumentError('maxSize must be a number greater than 0') + if (client[kRunning] === 0) { + util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket))) + return -1 } - this.#maxSize = maxSize ?? this.#maxSize - this.#handler = handler + const request = client[kQueue][client[kRunningIdx]] + if (!request) { + return -1 + } + request.onResponseStarted() } - onConnect (abort) { - this.#abort = abort + onHeaderField (buf) { + const len = this.headers.length - this.#handler.onConnect(this.#customAbort.bind(this)) - } + if ((len & 1) === 0) { + this.headers.push(buf) + } else { + this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]) + } - #customAbort (reason) { - this.#aborted = true - this.#reason = reason + this.trackHeader(buf.length) } - // TODO: will require adjustment after new hooks are out - onHeaders (statusCode, rawHeaders, resume, statusMessage) { - const headers = util.parseHeaders(rawHeaders) - const contentLength = headers['content-length'] + onHeaderValue (buf) { + let len = this.headers.length - if (contentLength != null && contentLength > this.#maxSize) { - throw new RequestAbortedError( - `Response size (${contentLength}) larger than maxSize (${ - this.#maxSize - })` - ) + if ((len & 1) === 1) { + this.headers.push(buf) + len += 1 + } else { + this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]) } - if (this.#aborted) { - return true + const key = this.headers[len - 2] + if (key.length === 10) { + const headerName = util.bufferToLowerCasedHeaderName(key) + if (headerName === 'keep-alive') { + this.keepAlive += buf.toString() + } else if (headerName === 'connection') { + this.connection += buf.toString() + } + } else if (key.length === 14 && util.bufferToLowerCasedHeaderName(key) === 'content-length') { + this.contentLength += buf.toString() } - return this.#handler.onHeaders( - statusCode, - rawHeaders, - resume, - statusMessage - ) + this.trackHeader(buf.length) } - onError (err) { - if (this.#dumped) { - return + trackHeader (len) { + this.headersSize += len + if (this.headersSize >= this.headersMaxSize) { + util.destroy(this.socket, new HeadersOverflowError()) } + } - err = this.#reason ?? err + onUpgrade (head) { + const { upgrade, client, socket, headers, statusCode } = this - this.#handler.onError(err) - } + assert(upgrade) + assert(client[kSocket] === socket) + assert(!socket.destroyed) + assert(!this.paused) + assert((headers.length & 1) === 0) - onData (chunk) { - this.#size = this.#size + chunk.length + const request = client[kQueue][client[kRunningIdx]] + assert(request) + assert(request.upgrade || request.method === 'CONNECT') - if (this.#size >= this.#maxSize) { - this.#dumped = true + this.statusCode = null + this.statusText = '' + this.shouldKeepAlive = null - if (this.#aborted) { - this.#handler.onError(this.#reason) - } else { - this.#handler.onComplete([]) - } + this.headers = [] + this.headersSize = 0 + + socket.unshift(head) + + socket[kParser].destroy() + socket[kParser] = null + + socket[kClient] = null + socket[kError] = null + + removeAllListeners(socket) + + client[kSocket] = null + client[kHTTPContext] = null // TODO (fix): This is hacky... + client[kQueue][client[kRunningIdx]++] = null + client.emit('disconnect', client[kUrl], [client], new InformationalError('upgrade')) + + try { + request.onUpgrade(statusCode, headers, socket) + } catch (err) { + util.destroy(socket, err) } - return true + client[kResume]() } - onComplete (trailers) { - if (this.#dumped) { - return + onHeadersComplete (statusCode, upgrade, shouldKeepAlive) { + const { client, socket, headers, statusText } = this + + /* istanbul ignore next: difficult to make a test case for */ + if (socket.destroyed) { + return -1 } - if (this.#aborted) { - this.#handler.onError(this.reason) - return + if (client[kRunning] === 0) { + util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket))) + return -1 } - this.#handler.onComplete(trailers) - } -} + const request = client[kQueue][client[kRunningIdx]] -function createDumpInterceptor ( - { maxSize: defaultMaxSize } = { - maxSize: 1024 * 1024 - } -) { - return dispatch => { - return function Intercept (opts, handler) { - const { dumpMaxSize = defaultMaxSize } = - opts + /* istanbul ignore next: difficult to make a test case for */ + if (!request) { + return -1 + } - const dumpHandler = new DumpHandler( - { maxSize: dumpMaxSize }, - handler - ) + assert(!this.upgrade) + assert(this.statusCode < 200) - return dispatch(opts, dumpHandler) + if (statusCode === 100) { + util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket))) + return -1 } - } -} -module.exports = createDumpInterceptor + /* this can only happen if server is misbehaving */ + if (upgrade && !request.upgrade) { + util.destroy(socket, new SocketError('bad upgrade', util.getSocketInfo(socket))) + return -1 + } + assert(this.timeoutType === TIMEOUT_HEADERS) -/***/ }), + this.statusCode = statusCode + this.shouldKeepAlive = ( + shouldKeepAlive || + // Override llhttp value which does not allow keepAlive for HEAD. + (request.method === 'HEAD' && !socket[kReset] && this.connection.toLowerCase() === 'keep-alive') + ) -/***/ 5092: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + if (this.statusCode >= 200) { + const bodyTimeout = request.bodyTimeout != null + ? request.bodyTimeout + : client[kBodyTimeout] + this.setTimeout(bodyTimeout, TIMEOUT_BODY) + } else if (this.timeout) { + // istanbul ignore else: only for jest + if (this.timeout.refresh) { + this.timeout.refresh() + } + } + if (request.method === 'CONNECT') { + assert(client[kRunning] === 1) + this.upgrade = true + return 2 + } + if (upgrade) { + assert(client[kRunning] === 1) + this.upgrade = true + return 2 + } -const RedirectHandler = __nccwpck_require__(8754) + assert((this.headers.length & 1) === 0) + this.headers = [] + this.headersSize = 0 -function createRedirectInterceptor ({ maxRedirections: defaultMaxRedirections }) { - return (dispatch) => { - return function Intercept (opts, handler) { - const { maxRedirections = defaultMaxRedirections } = opts + if (this.shouldKeepAlive && client[kPipelining]) { + const keepAliveTimeout = this.keepAlive ? util.parseKeepAliveTimeout(this.keepAlive) : null - if (!maxRedirections) { - return dispatch(opts, handler) + if (keepAliveTimeout != null) { + const timeout = Math.min( + keepAliveTimeout - client[kKeepAliveTimeoutThreshold], + client[kKeepAliveMaxTimeout] + ) + if (timeout <= 0) { + socket[kReset] = true + } else { + client[kKeepAliveTimeoutValue] = timeout + } + } else { + client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout] } + } else { + // Stop more requests from being dispatched. + socket[kReset] = true + } - const redirectHandler = new RedirectHandler(dispatch, maxRedirections, opts, handler) - opts = { ...opts, maxRedirections: 0 } // Stop sub dispatcher from also redirecting. - return dispatch(opts, redirectHandler) + const pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false + + if (request.aborted) { + return -1 } - } -} -module.exports = createRedirectInterceptor + if (request.method === 'HEAD') { + return 1 + } + if (statusCode < 200) { + return 1 + } -/***/ }), + if (socket[kBlocking]) { + socket[kBlocking] = false + client[kResume]() + } -/***/ 1514: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + return pause ? constants.ERROR.PAUSED : 0 + } + onBody (buf) { + const { client, socket, statusCode, maxResponseSize } = this -const RedirectHandler = __nccwpck_require__(8754) + if (socket.destroyed) { + return -1 + } -module.exports = opts => { - const globalMaxRedirections = opts?.maxRedirections - return dispatch => { - return function redirectInterceptor (opts, handler) { - const { maxRedirections = globalMaxRedirections, ...baseOpts } = opts + const request = client[kQueue][client[kRunningIdx]] + assert(request) - if (!maxRedirections) { - return dispatch(opts, handler) + assert(this.timeoutType === TIMEOUT_BODY) + if (this.timeout) { + // istanbul ignore else: only for jest + if (this.timeout.refresh) { + this.timeout.refresh() } + } - const redirectHandler = new RedirectHandler( - dispatch, - maxRedirections, - opts, - handler - ) + assert(statusCode >= 200) - return dispatch(baseOpts, redirectHandler) + if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) { + util.destroy(socket, new ResponseExceededMaxSizeError()) + return -1 } - } -} - -/***/ }), + this.bytesRead += buf.length -/***/ 2026: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + if (request.onData(buf) === false) { + return constants.ERROR.PAUSED + } + } + onMessageComplete () { + const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this -const RetryHandler = __nccwpck_require__(7816) + if (socket.destroyed && (!statusCode || shouldKeepAlive)) { + return -1 + } -module.exports = globalOpts => { - return dispatch => { - return function retryInterceptor (opts, handler) { - return dispatch( - opts, - new RetryHandler( - { ...opts, retryOptions: { ...globalOpts, ...opts.retryOptions } }, - { - handler, - dispatch - } - ) - ) + if (upgrade) { + return } - } -} + assert(statusCode >= 100) + assert((this.headers.length & 1) === 0) -/***/ }), + const request = client[kQueue][client[kRunningIdx]] + assert(request) -/***/ 2824: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + this.statusCode = null + this.statusText = '' + this.bytesRead = 0 + this.contentLength = '' + this.keepAlive = '' + this.connection = '' + this.headers = [] + this.headersSize = 0 -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.SPECIAL_HEADERS = exports.HEADER_STATE = exports.MINOR = exports.MAJOR = exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS = exports.TOKEN = exports.STRICT_TOKEN = exports.HEX = exports.URL_CHAR = exports.STRICT_URL_CHAR = exports.USERINFO_CHARS = exports.MARK = exports.ALPHANUM = exports.NUM = exports.HEX_MAP = exports.NUM_MAP = exports.ALPHA = exports.FINISH = exports.H_METHOD_MAP = exports.METHOD_MAP = exports.METHODS_RTSP = exports.METHODS_ICE = exports.METHODS_HTTP = exports.METHODS = exports.LENIENT_FLAGS = exports.FLAGS = exports.TYPE = exports.ERROR = void 0; -const utils_1 = __nccwpck_require__(172); -// C headers -var ERROR; -(function (ERROR) { - ERROR[ERROR["OK"] = 0] = "OK"; - ERROR[ERROR["INTERNAL"] = 1] = "INTERNAL"; - ERROR[ERROR["STRICT"] = 2] = "STRICT"; - ERROR[ERROR["LF_EXPECTED"] = 3] = "LF_EXPECTED"; - ERROR[ERROR["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH"; - ERROR[ERROR["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION"; - ERROR[ERROR["INVALID_METHOD"] = 6] = "INVALID_METHOD"; - ERROR[ERROR["INVALID_URL"] = 7] = "INVALID_URL"; - ERROR[ERROR["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT"; - ERROR[ERROR["INVALID_VERSION"] = 9] = "INVALID_VERSION"; - ERROR[ERROR["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN"; - ERROR[ERROR["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH"; - ERROR[ERROR["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE"; - ERROR[ERROR["INVALID_STATUS"] = 13] = "INVALID_STATUS"; - ERROR[ERROR["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE"; - ERROR[ERROR["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING"; - ERROR[ERROR["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN"; - ERROR[ERROR["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE"; - ERROR[ERROR["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE"; - ERROR[ERROR["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER"; - ERROR[ERROR["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE"; - ERROR[ERROR["PAUSED"] = 21] = "PAUSED"; - ERROR[ERROR["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE"; - ERROR[ERROR["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE"; - ERROR[ERROR["USER"] = 24] = "USER"; -})(ERROR = exports.ERROR || (exports.ERROR = {})); -var TYPE; -(function (TYPE) { - TYPE[TYPE["BOTH"] = 0] = "BOTH"; - TYPE[TYPE["REQUEST"] = 1] = "REQUEST"; - TYPE[TYPE["RESPONSE"] = 2] = "RESPONSE"; -})(TYPE = exports.TYPE || (exports.TYPE = {})); -var FLAGS; -(function (FLAGS) { - FLAGS[FLAGS["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE"; - FLAGS[FLAGS["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE"; - FLAGS[FLAGS["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE"; - FLAGS[FLAGS["CHUNKED"] = 8] = "CHUNKED"; - FLAGS[FLAGS["UPGRADE"] = 16] = "UPGRADE"; - FLAGS[FLAGS["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH"; - FLAGS[FLAGS["SKIPBODY"] = 64] = "SKIPBODY"; - FLAGS[FLAGS["TRAILING"] = 128] = "TRAILING"; - // 1 << 8 is unused - FLAGS[FLAGS["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING"; -})(FLAGS = exports.FLAGS || (exports.FLAGS = {})); -var LENIENT_FLAGS; -(function (LENIENT_FLAGS) { - LENIENT_FLAGS[LENIENT_FLAGS["HEADERS"] = 1] = "HEADERS"; - LENIENT_FLAGS[LENIENT_FLAGS["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH"; - LENIENT_FLAGS[LENIENT_FLAGS["KEEP_ALIVE"] = 4] = "KEEP_ALIVE"; -})(LENIENT_FLAGS = exports.LENIENT_FLAGS || (exports.LENIENT_FLAGS = {})); -var METHODS; -(function (METHODS) { - METHODS[METHODS["DELETE"] = 0] = "DELETE"; - METHODS[METHODS["GET"] = 1] = "GET"; - METHODS[METHODS["HEAD"] = 2] = "HEAD"; - METHODS[METHODS["POST"] = 3] = "POST"; - METHODS[METHODS["PUT"] = 4] = "PUT"; - /* pathological */ - METHODS[METHODS["CONNECT"] = 5] = "CONNECT"; - METHODS[METHODS["OPTIONS"] = 6] = "OPTIONS"; - METHODS[METHODS["TRACE"] = 7] = "TRACE"; - /* WebDAV */ - METHODS[METHODS["COPY"] = 8] = "COPY"; - METHODS[METHODS["LOCK"] = 9] = "LOCK"; - METHODS[METHODS["MKCOL"] = 10] = "MKCOL"; - METHODS[METHODS["MOVE"] = 11] = "MOVE"; - METHODS[METHODS["PROPFIND"] = 12] = "PROPFIND"; - METHODS[METHODS["PROPPATCH"] = 13] = "PROPPATCH"; - METHODS[METHODS["SEARCH"] = 14] = "SEARCH"; - METHODS[METHODS["UNLOCK"] = 15] = "UNLOCK"; - METHODS[METHODS["BIND"] = 16] = "BIND"; - METHODS[METHODS["REBIND"] = 17] = "REBIND"; - METHODS[METHODS["UNBIND"] = 18] = "UNBIND"; - METHODS[METHODS["ACL"] = 19] = "ACL"; - /* subversion */ - METHODS[METHODS["REPORT"] = 20] = "REPORT"; - METHODS[METHODS["MKACTIVITY"] = 21] = "MKACTIVITY"; - METHODS[METHODS["CHECKOUT"] = 22] = "CHECKOUT"; - METHODS[METHODS["MERGE"] = 23] = "MERGE"; - /* upnp */ - METHODS[METHODS["M-SEARCH"] = 24] = "M-SEARCH"; - METHODS[METHODS["NOTIFY"] = 25] = "NOTIFY"; - METHODS[METHODS["SUBSCRIBE"] = 26] = "SUBSCRIBE"; - METHODS[METHODS["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE"; - /* RFC-5789 */ - METHODS[METHODS["PATCH"] = 28] = "PATCH"; - METHODS[METHODS["PURGE"] = 29] = "PURGE"; - /* CalDAV */ - METHODS[METHODS["MKCALENDAR"] = 30] = "MKCALENDAR"; - /* RFC-2068, section 19.6.1.2 */ - METHODS[METHODS["LINK"] = 31] = "LINK"; - METHODS[METHODS["UNLINK"] = 32] = "UNLINK"; - /* icecast */ - METHODS[METHODS["SOURCE"] = 33] = "SOURCE"; - /* RFC-7540, section 11.6 */ - METHODS[METHODS["PRI"] = 34] = "PRI"; - /* RFC-2326 RTSP */ - METHODS[METHODS["DESCRIBE"] = 35] = "DESCRIBE"; - METHODS[METHODS["ANNOUNCE"] = 36] = "ANNOUNCE"; - METHODS[METHODS["SETUP"] = 37] = "SETUP"; - METHODS[METHODS["PLAY"] = 38] = "PLAY"; - METHODS[METHODS["PAUSE"] = 39] = "PAUSE"; - METHODS[METHODS["TEARDOWN"] = 40] = "TEARDOWN"; - METHODS[METHODS["GET_PARAMETER"] = 41] = "GET_PARAMETER"; - METHODS[METHODS["SET_PARAMETER"] = 42] = "SET_PARAMETER"; - METHODS[METHODS["REDIRECT"] = 43] = "REDIRECT"; - METHODS[METHODS["RECORD"] = 44] = "RECORD"; - /* RAOP */ - METHODS[METHODS["FLUSH"] = 45] = "FLUSH"; -})(METHODS = exports.METHODS || (exports.METHODS = {})); -exports.METHODS_HTTP = [ - METHODS.DELETE, - METHODS.GET, - METHODS.HEAD, - METHODS.POST, - METHODS.PUT, - METHODS.CONNECT, - METHODS.OPTIONS, - METHODS.TRACE, - METHODS.COPY, - METHODS.LOCK, - METHODS.MKCOL, - METHODS.MOVE, - METHODS.PROPFIND, - METHODS.PROPPATCH, - METHODS.SEARCH, - METHODS.UNLOCK, - METHODS.BIND, - METHODS.REBIND, - METHODS.UNBIND, - METHODS.ACL, - METHODS.REPORT, - METHODS.MKACTIVITY, - METHODS.CHECKOUT, - METHODS.MERGE, - METHODS['M-SEARCH'], - METHODS.NOTIFY, - METHODS.SUBSCRIBE, - METHODS.UNSUBSCRIBE, - METHODS.PATCH, - METHODS.PURGE, - METHODS.MKCALENDAR, - METHODS.LINK, - METHODS.UNLINK, - METHODS.PRI, - // TODO(indutny): should we allow it with HTTP? - METHODS.SOURCE, -]; -exports.METHODS_ICE = [ - METHODS.SOURCE, -]; -exports.METHODS_RTSP = [ - METHODS.OPTIONS, - METHODS.DESCRIBE, - METHODS.ANNOUNCE, - METHODS.SETUP, - METHODS.PLAY, - METHODS.PAUSE, - METHODS.TEARDOWN, - METHODS.GET_PARAMETER, - METHODS.SET_PARAMETER, - METHODS.REDIRECT, - METHODS.RECORD, - METHODS.FLUSH, - // For AirPlay - METHODS.GET, - METHODS.POST, -]; -exports.METHOD_MAP = utils_1.enumToMap(METHODS); -exports.H_METHOD_MAP = {}; -Object.keys(exports.METHOD_MAP).forEach((key) => { - if (/^H/.test(key)) { - exports.H_METHOD_MAP[key] = exports.METHOD_MAP[key]; + if (statusCode < 200) { + return } -}); -var FINISH; -(function (FINISH) { - FINISH[FINISH["SAFE"] = 0] = "SAFE"; - FINISH[FINISH["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB"; - FINISH[FINISH["UNSAFE"] = 2] = "UNSAFE"; -})(FINISH = exports.FINISH || (exports.FINISH = {})); -exports.ALPHA = []; -for (let i = 'A'.charCodeAt(0); i <= 'Z'.charCodeAt(0); i++) { - // Upper case - exports.ALPHA.push(String.fromCharCode(i)); - // Lower case - exports.ALPHA.push(String.fromCharCode(i + 0x20)); -} -exports.NUM_MAP = { - 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, - 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, -}; -exports.HEX_MAP = { - 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, - 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, - A: 0XA, B: 0XB, C: 0XC, D: 0XD, E: 0XE, F: 0XF, - a: 0xa, b: 0xb, c: 0xc, d: 0xd, e: 0xe, f: 0xf, -}; -exports.NUM = [ - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', -]; -exports.ALPHANUM = exports.ALPHA.concat(exports.NUM); -exports.MARK = ['-', '_', '.', '!', '~', '*', '\'', '(', ')']; -exports.USERINFO_CHARS = exports.ALPHANUM - .concat(exports.MARK) - .concat(['%', ';', ':', '&', '=', '+', '$', ',']); -// TODO(indutny): use RFC -exports.STRICT_URL_CHAR = [ - '!', '"', '$', '%', '&', '\'', - '(', ')', '*', '+', ',', '-', '.', '/', - ':', ';', '<', '=', '>', - '@', '[', '\\', ']', '^', '_', - '`', - '{', '|', '}', '~', -].concat(exports.ALPHANUM); -exports.URL_CHAR = exports.STRICT_URL_CHAR - .concat(['\t', '\f']); -// All characters with 0x80 bit set to 1 -for (let i = 0x80; i <= 0xff; i++) { - exports.URL_CHAR.push(i); -} -exports.HEX = exports.NUM.concat(['a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F']); -/* Tokens as defined by rfc 2616. Also lowercases them. - * token = 1* - * separators = "(" | ")" | "<" | ">" | "@" - * | "," | ";" | ":" | "\" | <"> - * | "/" | "[" | "]" | "?" | "=" - * | "{" | "}" | SP | HT - */ -exports.STRICT_TOKEN = [ - '!', '#', '$', '%', '&', '\'', - '*', '+', '-', '.', - '^', '_', '`', - '|', '~', -].concat(exports.ALPHANUM); -exports.TOKEN = exports.STRICT_TOKEN.concat([' ']); -/* - * Verify that a char is a valid visible (printable) US-ASCII - * character or %x80-FF - */ -exports.HEADER_CHARS = ['\t']; -for (let i = 32; i <= 255; i++) { - if (i !== 127) { - exports.HEADER_CHARS.push(i); + + /* istanbul ignore next: should be handled by llhttp? */ + if (request.method !== 'HEAD' && contentLength && bytesRead !== parseInt(contentLength, 10)) { + util.destroy(socket, new ResponseContentLengthMismatchError()) + return -1 } -} -// ',' = \x44 -exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS.filter((c) => c !== 44); -exports.MAJOR = exports.NUM_MAP; -exports.MINOR = exports.MAJOR; -var HEADER_STATE; -(function (HEADER_STATE) { - HEADER_STATE[HEADER_STATE["GENERAL"] = 0] = "GENERAL"; - HEADER_STATE[HEADER_STATE["CONNECTION"] = 1] = "CONNECTION"; - HEADER_STATE[HEADER_STATE["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH"; - HEADER_STATE[HEADER_STATE["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING"; - HEADER_STATE[HEADER_STATE["UPGRADE"] = 4] = "UPGRADE"; - HEADER_STATE[HEADER_STATE["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE"; - HEADER_STATE[HEADER_STATE["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE"; - HEADER_STATE[HEADER_STATE["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE"; - HEADER_STATE[HEADER_STATE["TRANSFER_ENCODING_CHUNKED"] = 8] = "TRANSFER_ENCODING_CHUNKED"; -})(HEADER_STATE = exports.HEADER_STATE || (exports.HEADER_STATE = {})); -exports.SPECIAL_HEADERS = { - 'connection': HEADER_STATE.CONNECTION, - 'content-length': HEADER_STATE.CONTENT_LENGTH, - 'proxy-connection': HEADER_STATE.CONNECTION, - 'transfer-encoding': HEADER_STATE.TRANSFER_ENCODING, - 'upgrade': HEADER_STATE.UPGRADE, -}; -//# sourceMappingURL=constants.js.map -/***/ }), + request.onComplete(headers) -/***/ 3870: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + client[kQueue][client[kRunningIdx]++] = null + socket[kSocketUsed] = true + if (socket[kWriting]) { + assert(client[kRunning] === 0) + // Response completed before request. + util.destroy(socket, new InformationalError('reset')) + return constants.ERROR.PAUSED + } else if (!shouldKeepAlive) { + util.destroy(socket, new InformationalError('reset')) + return constants.ERROR.PAUSED + } else if (socket[kReset] && client[kRunning] === 0) { + // Destroy socket once all requests have completed. + // The request at the tail of the pipeline is the one + // that requested reset and no further requests should + // have been queued since then. + util.destroy(socket, new InformationalError('reset')) + return constants.ERROR.PAUSED + } else if (client[kPipelining] == null || client[kPipelining] === 1) { + // We must wait a full event loop cycle to reuse this socket to make sure + // that non-spec compliant servers are not closing the connection even if they + // said they won't. + setImmediate(() => client[kResume]()) + } else { + client[kResume]() + } + } +} +function onParserTimeout (parser) { + const { socket, timeoutType, client, paused } = parser.deref() -const { Buffer } = __nccwpck_require__(4573) + /* istanbul ignore else */ + if (timeoutType === TIMEOUT_HEADERS) { + if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) { + assert(!paused, 'cannot be paused while waiting for headers') + util.destroy(socket, new HeadersTimeoutError()) + } + } else if (timeoutType === TIMEOUT_BODY) { + if (!paused) { + util.destroy(socket, new BodyTimeoutError()) + } + } else if (timeoutType === TIMEOUT_KEEP_ALIVE) { + assert(client[kRunning] === 0 && client[kKeepAliveTimeoutValue]) + util.destroy(socket, new InformationalError('socket idle timeout')) + } +} -module.exports = Buffer.from('AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAy0sBQYAAAIAAAAAAAACAQIAAgICAAADAAAAAAMDAwMBAQEBAQEBAQEAAAIAAAAEBQFwARISBQMBAAIGCAF/AUGA1AQLB9EFIgZtZW1vcnkCAAtfaW5pdGlhbGl6ZQAIGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAtsbGh0dHBfaW5pdAAJGGxsaHR0cF9zaG91bGRfa2VlcF9hbGl2ZQAvDGxsaHR0cF9hbGxvYwALBm1hbGxvYwAxC2xsaHR0cF9mcmVlAAwEZnJlZQAMD2xsaHR0cF9nZXRfdHlwZQANFWxsaHR0cF9nZXRfaHR0cF9tYWpvcgAOFWxsaHR0cF9nZXRfaHR0cF9taW5vcgAPEWxsaHR0cF9nZXRfbWV0aG9kABAWbGxodHRwX2dldF9zdGF0dXNfY29kZQAREmxsaHR0cF9nZXRfdXBncmFkZQASDGxsaHR0cF9yZXNldAATDmxsaHR0cF9leGVjdXRlABQUbGxodHRwX3NldHRpbmdzX2luaXQAFQ1sbGh0dHBfZmluaXNoABYMbGxodHRwX3BhdXNlABcNbGxodHRwX3Jlc3VtZQAYG2xsaHR0cF9yZXN1bWVfYWZ0ZXJfdXBncmFkZQAZEGxsaHR0cF9nZXRfZXJybm8AGhdsbGh0dHBfZ2V0X2Vycm9yX3JlYXNvbgAbF2xsaHR0cF9zZXRfZXJyb3JfcmVhc29uABwUbGxodHRwX2dldF9lcnJvcl9wb3MAHRFsbGh0dHBfZXJybm9fbmFtZQAeEmxsaHR0cF9tZXRob2RfbmFtZQAfEmxsaHR0cF9zdGF0dXNfbmFtZQAgGmxsaHR0cF9zZXRfbGVu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PgtBhwEMPQtBiAEMPAtBiQEMOwtBigEMOgtBiwEMOQtBjAEMOAtBjQEMNwtBjgEMNgtBjwEMNQtBkAEMNAtBkQEMMwtBkgEMMgtBkwEMMQtBlAEMMAtBlQEMLwtBlgEMLgtBlwEMLQtBmAEMLAtBmQEMKwtBmgEMKgtBmwEMKQtBnAEMKAtBnQEMJwtBngEMJgtBnwEMJQtBoAEMJAtBoQEMIwtBogEMIgtBowEMIQtBpAEMIAtBpQEMHwtBpgEMHgtBpwEMHQtBqAEMHAtBqQEMGwtBqgEMGgtBqwEMGQtBrAEMGAtBrQEMFwtBrgEMFgtBAQwVC0GvAQwUC0GwAQwTC0GxAQwSC0GzAQwRC0GyAQwQC0G0AQwPC0G1AQwOC0G2AQwNC0G3AQwMC0G4AQwLC0G5AQwKC0G6AQwJC0G7AQwIC0HGAQwHC0G8AQwGC0G9AQwFC0G+AQwEC0G/AQwDC0HAAQwCC0HCAQwBC0HBAQshAwNAAkACQAJAAkACQAJAAkACQAJAIAICfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAgJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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iQEhAwykAgtBASABLQAAQd8ARw1nGiABQQFqIQEMXgtBigEhAyABIARGDaICIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgNAIAEtAAAgAEGMzwBqLQAARw1kIABBAUYN+gEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMogILQYsBIQMgASAERg2hAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGOzwBqLQAARw1kIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyiAgsgAkEANgIAIAZBAWohAUECDGULQYwBIQMgASAERg2gAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHwzwBqLQAARw1jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyhAgsgAkEANgIAIAZBAWohAUEfDGQLQY0BIQMgASAERg2fAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHyzwBqLQAARw1iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAygAgsgAkEANgIAIAZBAWohAUEJDGMLIAEgBEYEQEGOASEDDJ8CCwJAAkAgAS0AAEHJAGsOBwBiYmJiYgFiCyABQQFqIQFB+AAhAwyGAgsgAUEBaiEBQfkAIQMMhQILQY8BIQMgASAERg2dAiACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGRzwBqLQAARw1gIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyeAgsgAkEANgIAIAZBAWohAUEYDGELQZABIQMgASAERg2cAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGXzwBqLQAARw1fIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAydAgsgAkEANgIAIAZBAWohAUEXDGALQZEBIQMgASAERg2bAiACKAIAIgAgBCABa2ohBSABIABrQQZqIQYCQANAIAEtAAAgAEGazwBqLQAARw1eIABBBkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAycAgsgAkEANgIAIAZBAWohAUEV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JSIARQ0RIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMtAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0gIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMswELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0iIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMsgELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0OIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMsQELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0dIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMsAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0fIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMrwELIABBP0cNASABQQFqCyEBQQUhAwyUAQtBACEDIAJBADYCHCACIAE2AhQgAkH9EjYCECACQQc2AgwMrAELIAJBADYCHCACIAE2AhQgAkHcCDYCECACQQc2AgxBACEDDKsBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNByACQeUANgIcIAIgATYCFCACIAA2AgxBACEDDKoBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNFiACQdMANgIcIAIgATYCFCACIAA2AgxBACEDDKkBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNGCACQdIANgIcIAIgATYCFCACIAA2AgxBACEDDKgBCyACQQA2AhwgAiABNgIUIAJBxgo2AhAgAkEHNgIMQQAhAwynAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQMgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwymAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRIgAkHTADYCHCACIAE2AhQgAiAANgIMQQAhAwylAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRQgAkHSADYCHCACIAE2AhQgAiAANgIMQQAhAwykAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQAgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwyjAQtB1QAhAwyJAQsgAEEVRwRAIAJBADYCHCACIAE2AhQgAkG5DTYCECACQRo2AgxB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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB5ABrDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0HhJw8LQaQhDwtByywPC0H+MQ8LQcAkDwtBqyQPC0GNKA8LQeImDwtBgDAPC0G5Lw8LQdckDwtB7x8PC0HhHw8LQfofDwtB8iAPC0GoLw8LQa4yDwtBiDAPC0HsJw8LQYIiDwtBjh0PC0HQLg8LQcojDwtBxTIPC0HfHA8LQdIcDwtBxCAPC0HXIA8LQaIfDwtB7S4PC0GrMA8LQdQlDwtBzC4PC0H6Lg8LQfwrDwtB0jAPC0HxHQ8LQbsgDwtB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CABB3AgLii1JbnZhbGlkIGNoYXIgaW4gdXJsIHF1ZXJ5AFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fYm9keQBDb250ZW50LUxlbmd0aCBvdmVyZmxvdwBDaHVuayBzaXplIG92ZXJmbG93AFJlc3BvbnNlIG92ZXJmbG93AEludmFsaWQgbWV0aG9kIGZvciBIVFRQL3gueCByZXF1ZXN0AEludmFsaWQgbWV0aG9kIGZvciBSVFNQL3gueCByZXF1ZXN0AEV4cGVjdGVkIFNPVVJDRSBtZXRob2QgZm9yIElDRS94LnggcmVxdWVzdABJbnZhbGlkIGNoYXIgaW4gdXJsIGZyYWdtZW50IHN0YXJ0AEV4cGVjdGVkIGRvdABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3N0YXR1cwBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zAFVzZXIgY2FsbGJhY2sgZXJyb3IAYG9uX3Jlc2V0YCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfaGVhZGVyYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9iZWdpbmAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3N0YXR1c19jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3ZlcnNpb25fY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl91cmxfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl92YWx1ZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXRob2RfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfZmllbGRfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fbmFtZWAgY2FsbGJhY2sgZXJyb3IAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzZXJ2ZXIASW52YWxpZCBoZWFkZXIgdmFsdWUgY2hhcgBJbnZhbGlkIGhlYWRlciBmaWVsZCBjaGFyAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fdmVyc2lvbgBJbnZhbGlkIG1pbm9yIHZlcnNpb24ASW52YWxpZCBtYWpvciB2ZXJzaW9uAEV4cGVjdGVkIHNwYWNlIGFmdGVyIHZlcnNpb24ARXhwZWN0ZWQgQ1JMRiBhZnRlciB2ZXJzaW9uAEludmFsaWQgSFRUUCB2ZXJzaW9uAEludmFsaWQgaGVhZGVyIHRva2VuAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fdXJsAEludmFsaWQgY2hhcmFjdGVycyBpbiB1cmwAVW5leHBlY3RlZCBzdGFydCBjaGFyIGluIHVybABEb3VibGUgQCBpbiB1cmwARW1wdHkgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyYWN0ZXIgaW4gQ29udGVudC1MZW5ndGgARHVwbGljYXRlIENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhciBpbiB1cmwgcGF0aABDb250ZW50LUxlbmd0aCBjYW4ndCBiZSBwcmVzZW50IHdpdGggVHJhbnNmZXItRW5jb2RpbmcASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgc2l6ZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2hlYWRlcl92YWx1ZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZSB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlZCB2YWx1ZQBQYXVzZWQgYnkgb25faGVhZGVyc19jb21wbGV0ZQBJbnZhbGlkIEVPRiBzdGF0ZQBvbl9yZXNldCBwYXVzZQBvbl9jaHVua19oZWFkZXIgcGF1c2UAb25fbWVzc2FnZV9iZWdpbiBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fdmFsdWUgcGF1c2UAb25fc3RhdHVzX2NvbXBsZXRlIHBhdXNlAG9uX3ZlcnNpb25fY29tcGxldGUgcGF1c2UAb25fdXJsX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl92YWx1ZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXNzYWdlX2NvbXBsZXRlIHBhdXNlAG9uX21ldGhvZF9jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfZmllbGRfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUgcGF1c2UAVW5leHBlY3RlZCBzcGFjZSBhZnRlciBzdGFydCBsaW5lAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBuYW1lAFBhdXNlIG9uIENPTk5FQ1QvVXBncmFkZQBQYXVzZSBvbiBQUkkvVXBncmFkZQBFeHBlY3RlZCBIVFRQLzIgQ29ubmVjdGlvbiBQcmVmYWNlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fbWV0aG9kAEV4cGVjdGVkIHNwYWNlIGFmdGVyIG1ldGhvZABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2hlYWRlcl9maWVsZABQYXVzZWQASW52YWxpZCB3b3JkIGVuY291bnRlcmVkAEludmFsaWQgbWV0aG9kIGVuY291bnRlcmVkAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2NoZW1hAFJlcXVlc3QgaGFzIGludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYABTV0lUQ0hfUFJPWFkAVVNFX1BST1hZAE1LQUNUSVZJVFkAVU5QUk9DRVNTQUJMRV9FTlRJVFkAQ09QWQBNT1ZFRF9QRVJNQU5FTlRMWQBUT09fRUFSTFkATk9USUZZAEZBSUxFRF9ERVBFTkRFTkNZAEJBRF9HQVRFV0FZAFBMQVkAUFVUAENIRUNLT1VUAEdBVEVXQVlfVElNRU9VVABSRVFVRVNUX1RJTUVPVVQATkVUV09SS19DT05ORUNUX1RJTUVPVVQAQ09OTkVDVElPTl9USU1FT1VUAExPR0lOX1RJTUVPVVQATkVUV09SS19SRUFEX1RJTUVPVVQAUE9TVABNSVNESVJFQ1RFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX0xPQURfQkFMQU5DRURfUkVRVUVTVABCQURfUkVRVUVTVABIVFRQX1JFUVVFU1RfU0VOVF9UT19IVFRQU19QT1JUAFJFUE9SVABJTV9BX1RFQVBPVABSRVNFVF9DT05URU5UAE5PX0NPTlRFTlQAUEFSVElBTF9DT05URU5UAEhQRV9JTlZBTElEX0NPTlNUQU5UAEhQRV9DQl9SRVNFVABHRVQASFBFX1NUUklDVABDT05GTElDVABURU1QT1JBUllfUkVESVJFQ1QAUEVSTUFORU5UX1JFRElSRUNUAENPTk5FQ1QATVVMVElfU1RBVFVTAEhQRV9JTlZBTElEX1NUQVRVUwBUT09fTUFOWV9SRVFVRVNUUwBFQVJMWV9ISU5UUwBVTkFWQUlMQUJMRV9GT1JfTEVHQUxfUkVBU09OUwBPUFRJT05TAFNXSVRDSElOR19QUk9UT0NPTFMAVkFSSUFOVF9BTFNPX05FR09USUFURVMATVVMVElQTEVfQ0hPSUNFUwBJTlRFUk5BTF9TRVJWRVJfRVJST1IAV0VCX1NFUlZFUl9VTktOT1dOX0VSUk9SAFJBSUxHVU5fRVJST1IASURFTlRJVFlfUFJPVklERVJfQVVUSEVOVElDQVRJT05fRVJST1IAU1NMX0NFUlRJRklDQVRFX0VSUk9SAElOVkFMSURfWF9GT1JXQVJERURfRk9SAFNFVF9QQVJBTUVURVIAR0VUX1BBUkFNRVRFUgBIUEVfVVNFUgBTRUVfT1RIRVIASFBFX0NCX0NIVU5LX0hFQURFUgBNS0NBTEVOREFSAFNFVFVQAFdFQl9TRVJWRVJfSVNfRE9XTgBURUFSRE9XTgBIUEVfQ0xPU0VEX0NPTk5FQ1RJT04ASEVVUklTVElDX0VYUElSQVRJT04ARElTQ09OTkVDVEVEX09QRVJBVElPTgBOT05fQVVUSE9SSVRBVElWRV9JTkZPUk1BVElPTgBIUEVfSU5WQUxJRF9WRVJTSU9OAEhQRV9DQl9NRVNTQUdFX0JFR0lOAFNJVEVfSVNfRlJPWkVOAEhQRV9JTlZBTElEX0hFQURFUl9UT0tFTgBJTlZBTElEX1RPS0VOAEZPUkJJRERFTgBFTkhBTkNFX1lPVVJfQ0FMTQBIUEVfSU5WQUxJRF9VUkwAQkxPQ0tFRF9CWV9QQVJFTlRBTF9DT05UUk9MAE1LQ09MAEFDTABIUEVfSU5URVJOQUwAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRV9VTk9GRklDSUFMAEhQRV9PSwBVTkxJTksAVU5MT0NLAFBSSQBSRVRSWV9XSVRIAEhQRV9JTlZBTElEX0NPTlRFTlRfTEVOR1RIAEhQRV9VTkVYUEVDVEVEX0NPTlRFTlRfTEVOR1RIAEZMVVNIAFBST1BQQVRDSABNLVNFQVJDSABVUklfVE9PX0xPTkcAUFJPQ0VTU0lORwBNSVNDRUxMQU5FT1VTX1BFUlNJU1RFTlRfV0FSTklORwBNSVNDRUxMQU5FT1VTX1dBUk5JTkcASFBFX0lOVkFMSURfVFJBTlNGRVJfRU5DT0RJTkcARXhwZWN0ZWQgQ1JMRgBIUEVfSU5WQUxJRF9DSFVOS19TSVpFAE1PVkUAQ09OVElOVUUASFBFX0NCX1NUQVRVU19DT01QTEVURQBIUEVfQ0JfSEVBREVSU19DT01QTEVURQBIUEVfQ0JfVkVSU0lPTl9DT01QTEVURQBIUEVfQ0JfVVJMX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19DT01QTEVURQBIUEVfQ0JfSEVBREVSX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9OQU1FX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAEhQRV9DQl9NRVRIT0RfQ09NUExFVEUASFBFX0NCX0hFQURFUl9GSUVMRF9DT01QTEVURQBERUxFVEUASFBFX0lOVkFMSURfRU9GX1NUQVRFAElOVkFMSURfU1NMX0NFUlRJRklDQVRFAFBBVVNFAE5PX1JFU1BPTlNFAFVOU1VQUE9SVEVEX01FRElBX1RZUEUAR09ORQBOT1RfQUNDRVBUQUJMRQBTRVJWSUNFX1VOQVZBSUxBQkxFAFJBTkdFX05PVF9TQVRJU0ZJQUJMRQBPUklHSU5fSVNfVU5SRUFDSEFCTEUAUkVTUE9OU0VfSVNfU1RBTEUAUFVSR0UATUVSR0UAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRQBSRVFVRVNUX0hFQURFUl9UT09fTEFSR0UAUEFZTE9BRF9UT09fTEFSR0UASU5TVUZGSUNJRU5UX1NUT1JBR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UASFBFX1VORVhQRUNURURfU1BBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABOT1RfRk9VTkQAUFJPUEZJTkQAVU5CSU5EAFJFQklORABVTkFVVEhPUklaRUQATUVUSE9EX05PVF9BTExPV0VEAEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEAEFMUkVBRFlfUkVQT1JURUQAQUNDRVBURUQATk9UX0lNUExFTUVOVEVEAExPT1BfREVURUNURUQASFBFX0NSX0VYUEVDVEVEAEhQRV9MRl9FWFBFQ1RFRABDUkVBVEVEAElNX1VTRUQASFBFX1BBVVNFRABUSU1FT1VUX09DQ1VSRUQAUEFZTUVOVF9SRVFVSVJFRABQUkVDT05ESVRJT05fUkVRVUlSRUQAUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRABMRU5HVEhfUkVRVUlSRUQAU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEAFVQR1JBREVfUkVRVUlSRUQAUEFHRV9FWFBJUkVEAFBSRUNPTkRJVElPTl9GQUlMRUQARVhQRUNUQVRJT05fRkFJTEVEAFJFVkFMSURBVElPTl9GQUlMRUQAU1NMX0hBTkRTSEFLRV9GQUlMRUQATE9DS0VEAFRSQU5TRk9STUFUSU9OX0FQUExJRUQATk9UX01PRElGSUVEAE5PVF9FWFRFTkRFRABCQU5EV0lEVEhfTElNSVRfRVhDRUVERUQAU0lURV9JU19PVkVSTE9BREVEAEhFQUQARXhwZWN0ZWQgSFRUUC8AAF4TAAAmEwAAMBAAAPAXAACdEwAAFRIAADkXAADwEgAAChAAAHUSAACtEgAAghMAAE8UAAB/EAAAoBUAACMUAACJEgAAixQAAE0VAADUEQAAzxQAABAYAADJFgAA3BYAAMERAADgFwAAuxQAAHQUAAB8FQAA5RQAAAgXAAAfEAAAZRUAAKMUAAAoFQAAAhUAAJkVAAAsEAAAixkAAE8PAADUDgAAahAAAM4QAAACFwAAiQ4AAG4TAAAcEwAAZhQAAFYXAADBEwAAzRMAAGwTAABoFwAAZhcAAF8XAAAiEwAAzg8AAGkOAADYDgAAYxYAAMsTAACqDgAAKBcAACYXAADFEwAAXRYAAOgRAABnEwAAZRMAAPIWAABzEwAAHRcAAPkWAADzEQAAzw4AAM4VAAAMEgAAsxEAAKURAABhEAAAMhcAALsTAEH5NQsBAQBBkDYL4AEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB/TcLAQEAQZE4C14CAwICAgICAAACAgACAgACAgICAgICAgICAAQAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAEH9OQsBAQBBkToLXgIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAQfA7Cw1sb3NlZWVwLWFsaXZlAEGJPAsBAQBBoDwL4AEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBiT4LAQEAQaA+C+cBAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAEGwwAALXwEBAAEBAQEBAAABAQABAQABAQEBAQEBAQEBAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAEGQwgALIWVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgBBwMIACy1yYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AQfnCAAsFAQIAAQMAQZDDAAvgAQQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAEH5xAALBQECAAEDAEGQxQAL4AEEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+cYACwQBAAABAEGRxwAL3wEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAEH6yAALBAEAAAIAQZDJAAtfAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAQfrKAAsEAQAAAQBBkMsACwEBAEGqywALQQIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEH6zAALBAEAAAEAQZDNAAsBAQBBms0ACwYCAAAAAAIAQbHNAAs6AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBB8M4AC5YBTk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRU9SRElSRUNUT1JUUkNIUEFSQU1FVEVSVVJDRUJTQ1JJQkVBUkRPV05BQ0VJTkROS0NLVUJTQ1JJQkVIVFRQL0FEVFAv', 'base64') +async function connectH1 (client, socket) { + client[kSocket] = socket + if (!llhttpInstance) { + llhttpInstance = await llhttpPromise + llhttpPromise = null + } -/***/ }), + socket[kNoRef] = false + socket[kWriting] = false + socket[kReset] = false + socket[kBlocking] = false + socket[kIdleSocketValidation] = 0 + socket[kIdleSocketValidationTimeout] = null + socket[kSocketUsed] = false + socket[kParser] = new Parser(client, socket, llhttpInstance) -/***/ 3434: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + addListener(socket, 'error', function (err) { + assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') + const parser = this[kParser] + // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded + // to the user. + if (err.code === 'ECONNRESET' && parser.statusCode && !parser.shouldKeepAlive) { + const parserErr = parser.finish() + if (parserErr) { + this[kError] = parserErr + this[kClient][kOnError](parserErr) + } + return + } -const { Buffer } = __nccwpck_require__(4573) + this[kError] = err -module.exports = Buffer.from('AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAy0sBQYAAAIAAAAAAAACAQIAAgICAAADAAAAAAMDAwMBAQEBAQEBAQEAAAIAAAAEBQFwARISBQMBAAIGCAF/AUGA1AQLB9EFIgZtZW1vcnkCAAtfaW5pdGlhbGl6ZQAIGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAtsbGh0dHBfaW5pdAAJGGxsaHR0cF9zaG91bGRfa2VlcF9hbGl2ZQAvDGxsaHR0cF9hbGxvYwALBm1hbGxvYwAxC2xsaHR0cF9mcmVlAAwEZnJlZQAMD2xsaHR0cF9nZXRfdHlwZQANFWxsaHR0cF9nZXRfaHR0cF9tYWpvcgAOFWxsaHR0cF9nZXRfaHR0cF9taW5vcgAPEWxsaHR0cF9nZXRfbWV0aG9kABAWbGxodHRwX2dldF9zdGF0dXNfY29kZQAREmxsaHR0cF9nZXRfdXBncmFkZQASDGxsaHR0cF9yZXNldAATDmxsaHR0cF9leGVjdXRlABQUbGxodHRwX3NldHRpbmdzX2luaXQAFQ1sbGh0dHBfZmluaXNoABYMbGxodHRwX3BhdXNlABcNbGxodHRwX3Jlc3VtZQAYG2xsaHR0cF9yZXN1bWVfYWZ0ZXJfdXBncmFkZQAZEGxsaHR0cF9nZXRfZXJybm8AGhdsbGh0dHBfZ2V0X2Vycm9yX3JlYXNvbgAbF2xsaHR0cF9zZXRfZXJyb3JfcmVhc29uABwUbGxodHRwX2dldF9lcnJvcl9wb3MAHRFsbGh0dHBfZXJybm9fbmFtZQAeEmxsaHR0cF9tZXRob2RfbmFtZQAfEmxsaHR0cF9zdGF0dXNfbmFtZQAgGmxsaHR0cF9zZXRfbGVuaWVudF9oZWFkZXJzACEhbGxodHRwX3NldF9sZW5pZW50X2NodW5rZWRfbGVuZ3RoACIdbGxodHRwX3NldF9sZW5pZW50X2tlZXBfYWxpdmUAIyRsbGh0dHBfc2V0X2xlbmllbnRfdHJhbnNmZXJfZW5jb2RpbmcAJBhsbGh0dHBfbWVzc2FnZV9uZWVkc19lb2YALgkXAQBBAQsRAQIDBAUKBgcrLSwqKSglJyYK77MCLBYAQYjQACgCAARAAAtBiNAAQQE2AgALFAAgABAwIAAgAjYCOCAAIAE6ACgLFAAgACAALwEyIAAtAC4gABAvEAALHgEBf0HAABAyIgEQMCABQYAINgI4IAEgADoAKCABC48MAQd/AkAgAEUNACAAQQhrIgEgAEEEaygCACIAQXhxIgRqIQUCQCAAQQFxDQAgAEEDcUUNASABIAEoAgAiAGsiAUGc0AAoAgBJDQEgACAEaiEEAkACQEGg0AAoAgAgAUcEQCAAQf8BTQRAIABBA3YhAyABKAIIIgAgASgCDCICRgRAQYzQAEGM0AAoAgBBfiADd3E2AgAMBQsgAiAANgIIIAAgAjYCDAwECyABKAIYIQYgASABKAIMIgBHBEAgACABKAIIIgI2AgggAiAANgIMDAMLIAFBFGoiAygCACICRQRAIAEoAhAiAkUNAiABQRBqIQMLA0AgAyEHIAIiAEEUaiIDKAIAIgINACAAQRBqIQMgACgCECICDQALIAdBADYCAAwCCyAFKAIEIgBBA3FBA0cNAiAFIABBfnE2AgRBlNAAIAQ2AgAgBSAENgIAIAEgBEEBcjYCBAwDC0EAIQALIAZFDQACQCABKAIcIgJBAnRBvNIAaiIDKAIAIAFGBEAgAyAANgIAIAANAUGQ0ABBkNAAKAIAQX4gAndxNgIADAILIAZBEEEUIAYoAhAgAUYbaiAANgIAIABFDQELIAAgBjYCGCABKAIQIgIEQCAAIAI2AhAgAiAANgIYCyABQRRqKAIAIgJFDQAgAEEUaiACNgIAIAIgADYCGAsgASAFTw0AIAUoAgQiAEEBcUUNAAJAAkACQAJAIABBAnFFBEBBpNAAKAIAIAVGBEBBpNAAIAE2AgBBmNAAQZjQACgCACAEaiIANgIAIAEgAEEBcjYCBCABQaDQACgCAEcNBkGU0ABBADYCAEGg0ABBADYCAAwGC0Gg0AAoAgAgBUYEQEGg0AAgATYCAEGU0ABBlNAAKAIAIARqIgA2AgAgASAAQQFyNgIEIAAgAWogADYCAAwGCyAAQXhxIARqIQQgAEH/AU0EQCAAQQN2IQMgBSgCCCIAIAUoAgwiAkYEQEGM0ABBjNAAKAIAQX4gA3dxNgIADAULIAIgADYCCCAAIAI2AgwMBAsgBSgCGCEGIAUgBSgCDCIARwRAQZzQACgCABogACAFKAIIIgI2AgggAiAANgIMDAMLIAVBFGoiAygCACICRQRAIAUoAhAiAkUNAiAFQRBqIQMLA0AgAyEHIAIiAEEUaiIDKAIAIgINACAAQRBqIQMgACgCECICDQALIAdBADYCAAwCCyAFIABBfnE2AgQgASAEaiAENgIAIAEgBEEBcjYCBAwDC0EAIQALIAZFDQACQCAFKAIcIgJBAnRBvNIAaiIDKAIAIAVGBEAgAyAANgIAIAANAUGQ0ABBkNAAKAIAQX4gAndxNgIADAILIAZBEEEUIAYoAhAgBUYbaiAANgIAIABFDQELIAAgBjYCGCAFKAIQIgIEQCAAIAI2AhAgAiAANgIYCyAFQRRqKAIAIgJFDQAgAEEUaiACNgIAIAIgADYCGAsgASAEaiAENgIAIAEgBEEBcjYCBCABQaDQACgCAEcNAEGU0AAgBDYCAAwBCyAEQf8BTQRAIARBeHFBtNAAaiEAAn9BjNAAKAIAIgJBASAEQQN2dCIDcUUEQEGM0AAgAiADcjYCACAADAELIAAoAggLIgIgATYCDCAAIAE2AgggASAANgIMIAEgAjYCCAwBC0EfIQIgBEH///8HTQRAIARBJiAEQQh2ZyIAa3ZBAXEgAEEBdGtBPmohAgsgASACNgIcIAFCADcCECACQQJ0QbzSAGohAAJAQZDQACgCACIDQQEgAnQiB3FFBEAgACABNgIAQZDQACADIAdyNgIAIAEgADYCGCABIAE2AgggASABNgIMDAELIARBGSACQQF2a0EAIAJBH0cbdCECIAAoAgAhAAJAA0AgACIDKAIEQXhxIARGDQEgAkEddiEAIAJBAXQhAiADIABBBHFqQRBqIgcoAgAiAA0ACyAHIAE2AgAgASADNgIYIAEgATYCDCABIAE2AggMAQsgAygCCCIAIAE2AgwgAyABNgIIIAFBADYCGCABIAM2AgwgASAANgIIC0Gs0ABBrNAAKAIAQQFrIgBBfyAAGzYCAAsLBwAgAC0AKAsHACAALQAqCwcAIAAtACsLBwAgAC0AKQsHACAALwEyCwcAIAAtAC4LQAEEfyAAKAIYIQEgAC0ALSECIAAtACghAyAAKAI4IQQgABAwIAAgBDYCOCAAIAM6ACggACACOgAtIAAgATYCGAu74gECB38DfiABIAJqIQQCQCAAIgIoAgwiAA0AIAIoAgQEQCACIAE2AgQLIwBBEGsiCCQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAIoAhwiA0EBaw7dAdoBAdkBAgMEBQYHCAkKCwwNDtgBDxDXARES1gETFBUWFxgZGhvgAd8BHB0e1QEfICEiIyQl1AEmJygpKiss0wHSAS0u0QHQAS8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRtsBR0hJSs8BzgFLzQFMzAFNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AAYEBggGDAYQBhQGGAYcBiAGJAYoBiwGMAY0BjgGPAZABkQGSAZMBlAGVAZYBlwGYAZkBmgGbAZwBnQGeAZ8BoAGhAaIBowGkAaUBpgGnAagBqQGqAasBrAGtAa4BrwGwAbEBsgGzAbQBtQG2AbcBywHKAbgByQG5AcgBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgEA3AELQQAMxgELQQ4MxQELQQ0MxAELQQ8MwwELQRAMwgELQRMMwQELQRQMwAELQRUMvwELQRYMvgELQRgMvQELQRkMvAELQRoMuwELQRsMugELQRwMuQELQR0MuAELQQgMtwELQR4MtgELQSAMtQELQR8MtAELQQcMswELQSEMsgELQSIMsQELQSMMsAELQSQMrwELQRIMrgELQREMrQELQSUMrAELQSYMqwELQScMqgELQSgMqQELQcMBDKgBC0EqDKcBC0ErDKYBC0EsDKUBC0EtDKQBC0EuDKMBC0EvDKIBC0HEAQyhAQtBMAygAQtBNAyfAQtBDAyeAQtBMQydAQtBMgycAQtBMwybAQtBOQyaAQtBNQyZAQtBxQEMmAELQQsMlwELQToMlgELQTYMlQELQQoMlAELQTcMkwELQTgMkgELQTwMkQELQTsMkAELQT0MjwELQQkMjgELQSkMjQELQT4MjAELQT8MiwELQcAADIoBC0HBAAyJAQtBwgAMiAELQcMADIcBC0HEAAyGAQtBxQAMhQELQcYADIQBC0EXDIMBC0HHAAyCAQtByAAMgQELQckADIABC0HKAAx/C0HLAAx+C0HNAAx9C0HMAAx8C0HOAAx7C0HPAAx6C0HQAAx5C0HRAAx4C0HSAAx3C0HTAAx2C0HUAAx1C0HWAAx0C0HVAAxzC0EGDHILQdcADHELQQUMcAtB2AAMbwtBBAxuC0HZAAxtC0HaAAxsC0HbAAxrC0HcAAxqC0EDDGkLQd0ADGgLQd4ADGcLQd8ADGYLQeEADGULQeAADGQLQeIADGMLQeMADGILQQIMYQtB5AAMYAtB5QAMXwtB5gAMXgtB5wAMXQtB6AAMXAtB6QAMWwtB6gAMWgtB6wAMWQtB7AAMWAtB7QAMVwtB7gAMVgtB7wAMVQtB8AAMVAtB8QAMUwtB8gAMUgtB8wAMUQtB9AAMUAtB9QAMTwtB9gAMTgtB9wAMTQtB+AAMTAtB+QAMSwtB+gAMSgtB+wAMSQtB/AAMSAtB/QAMRwtB/gAMRgtB/wAMRQtBgAEMRAtBgQEMQwtBggEMQgtBgwEMQQtBhAEMQAtBhQEMPwtBhgEMPgtBhwEMPQtBiAEMPAtBiQEMOwtBigEMOgtBiwEMOQtBjAEMOAtBjQEMNwtBjgEMNgtBjwEMNQtBkAEMNAtBkQEMMwtBkgEMMgtBkwEMMQtBlAEMMAtBlQEMLwtBlgEMLgtBlwEMLQtBmAEMLAtBmQEMKwtBmgEMKgtBmwEMKQtBnAEMKAtBnQEMJwtBngEMJgtBnwEMJQtBoAEMJAtBoQEMIwtBogEMIgtBowEMIQtBpAEMIAtBpQEMHwtBpgEMHgtBpwEMHQtBqAEMHAtBqQEMGwtBqgEMGgtBqwEMGQtBrAEMGAtBrQEMFwtBrgEMFgtBAQwVC0GvAQwUC0GwAQwTC0GxAQwSC0GzAQwRC0GyAQwQC0G0AQwPC0G1AQwOC0G2AQwNC0G3AQwMC0G4AQwLC0G5AQwKC0G6AQwJC0G7AQwIC0HGAQwHC0G8AQwGC0G9AQwFC0G+AQwEC0G/AQwDC0HAAQwCC0HCAQwBC0HBAQshAwNAAkACQAJAAkACQAJAAkACQAJAIAICfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAgJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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iQEhAwykAgtBASABLQAAQd8ARw1nGiABQQFqIQEMXgtBigEhAyABIARGDaICIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgNAIAEtAAAgAEGMzwBqLQAARw1kIABBAUYN+gEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMogILQYsBIQMgASAERg2hAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGOzwBqLQAARw1kIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyiAgsgAkEANgIAIAZBAWohAUECDGULQYwBIQMgASAERg2gAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHwzwBqLQAARw1jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyhAgsgAkEANgIAIAZBAWohAUEfDGQLQY0BIQMgASAERg2fAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHyzwBqLQAARw1iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAygAgsgAkEANgIAIAZBAWohAUEJDGMLIAEgBEYEQEGOASEDDJ8CCwJAAkAgAS0AAEHJAGsOBwBiYmJiYgFiCyABQQFqIQFB+AAhAwyGAgsgAUEBaiEBQfkAIQMMhQILQY8BIQMgASAERg2dAiACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGRzwBqLQAARw1gIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyeAgsgAkEANgIAIAZBAWohAUEYDGELQZABIQMgASAERg2cAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGXzwBqLQAARw1fIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAydAgsgAkEANgIAIAZBAWohAUEXDGALQZEBIQMgASAERg2bAiACKAIAIgAgBCABa2ohBSABIABrQQZqIQYCQANAIAEtAAAgAEGazwBqLQAARw1eIABBBkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAycAgsgAkEANgIAIAZBAWohAUEV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JSIARQ0RIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMtAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0gIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMswELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0iIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMsgELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0OIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMsQELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0dIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMsAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0fIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMrwELIABBP0cNASABQQFqCyEBQQUhAwyUAQtBACEDIAJBADYCHCACIAE2AhQgAkH9EjYCECACQQc2AgwMrAELIAJBADYCHCACIAE2AhQgAkHcCDYCECACQQc2AgxBACEDDKsBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNByACQeUANgIcIAIgATYCFCACIAA2AgxBACEDDKoBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNFiACQdMANgIcIAIgATYCFCACIAA2AgxBACEDDKkBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNGCACQdIANgIcIAIgATYCFCACIAA2AgxBACEDDKgBCyACQQA2AhwgAiABNgIUIAJBxgo2AhAgAkEHNgIMQQAhAwynAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQMgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwymAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRIgAkHTADYCHCACIAE2AhQgAiAANgIMQQAhAwylAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRQgAkHSADYCHCACIAE2AhQgAiAANgIMQQAhAwykAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQAgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwyjAQtB1QAhAwyJAQsgAEEVRwRAIAJBADYCHCACIAE2AhQgAkG5DTYCECACQRo2AgxB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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB5ABrDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0HhJw8LQaQhDwtByywPC0H+MQ8LQcAkDwtBqyQPC0GNKA8LQeImDwtBgDAPC0G5Lw8LQdckDwtB7x8PC0HhHw8LQfofDwtB8iAPC0GoLw8LQa4yDwtBiDAPC0HsJw8LQYIiDwtBjh0PC0HQLg8LQcojDwtBxTIPC0HfHA8LQdIcDwtBxCAPC0HXIA8LQaIfDwtB7S4PC0GrMA8LQdQlDwtBzC4PC0H6Lg8LQfwrDwtB0jAPC0HxHQ8LQbsgDwtB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AAADAEGUCAsFBAAAAAUAQaQICwkGAAAABwAAAAgAQdwIC4otSW52YWxpZCBjaGFyIGluIHVybCBxdWVyeQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2JvZHkAQ29udGVudC1MZW5ndGggb3ZlcmZsb3cAQ2h1bmsgc2l6ZSBvdmVyZmxvdwBSZXNwb25zZSBvdmVyZmxvdwBJbnZhbGlkIG1ldGhvZCBmb3IgSFRUUC94LnggcmVxdWVzdABJbnZhbGlkIG1ldGhvZCBmb3IgUlRTUC94LnggcmVxdWVzdABFeHBlY3RlZCBTT1VSQ0UgbWV0aG9kIGZvciBJQ0UveC54IHJlcXVlc3QASW52YWxpZCBjaGFyIGluIHVybCBmcmFnbWVudCBzdGFydABFeHBlY3RlZCBkb3QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9zdGF0dXMASW52YWxpZCByZXNwb25zZSBzdGF0dXMASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucwBVc2VyIGNhbGxiYWNrIGVycm9yAGBvbl9yZXNldGAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2hlYWRlcmAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfYmVnaW5gIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwBB+TULAQEAQZA2C+ABAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQf03CwEBAEGROAteAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgBB/TkLAQEAQZE6C14CAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAEHwOwsNbG9zZWVlcC1hbGl2ZQBBiTwLAQEAQaA8C+ABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQYk+CwEBAEGgPgvnAQEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZABBsMAAC18BAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQBBkMIACyFlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AQcDCAAstcmFuc2Zlci1lbmNvZGluZ3BncmFkZQ0KDQoNClNNDQoNClRUUC9DRS9UU1AvAEH5wgALBQECAAEDAEGQwwAL4AEEAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+cQACwUBAgABAwBBkMUAC+ABBAEBBQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQfnGAAsEAQAAAQBBkccAC98BAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+sgACwQBAAACAEGQyQALXwMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAEH6ygALBAEAAAEAQZDLAAsBAQBBqssAC0ECAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBB+swACwQBAAABAEGQzQALAQEAQZrNAAsGAgAAAAACAEGxzQALOgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQfDOAAuWAU5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw==', 'base64') + this[kClient][kOnError](err) + }) + addListener(socket, 'readable', function () { + const parser = this[kParser] + if (parser) { + parser.readMore() + } + }) + addListener(socket, 'end', function () { + const parser = this[kParser] -/***/ }), + if (parser.statusCode && !parser.shouldKeepAlive) { + const parserErr = parser.finish() + if (parserErr) { + util.destroy(this, parserErr) + } + return + } -/***/ 172: -/***/ ((__unused_webpack_module, exports) => { + util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this))) + }) + addListener(socket, 'close', function () { + const client = this[kClient] + const parser = this[kParser] + clearIdleSocketValidation(this) -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.enumToMap = void 0; -function enumToMap(obj) { - const res = {}; - Object.keys(obj).forEach((key) => { - const value = obj[key]; - if (typeof value === 'number') { - res[key] = value; - } - }); - return res; -} -exports.enumToMap = enumToMap; -//# sourceMappingURL=utils.js.map + if (parser) { + if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { + this[kError] = parser.finish() || this[kError] + } -/***/ }), + this[kParser].destroy() + this[kParser] = null + } -/***/ 7501: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + const err = this[kError] || new SocketError('closed', util.getSocketInfo(this)) + client[kSocket] = null + client[kHTTPContext] = null // TODO (fix): This is hacky... + if (client.destroyed) { + assert(client[kPending] === 0) -const { kClients } = __nccwpck_require__(6443) -const Agent = __nccwpck_require__(7405) -const { - kAgent, - kMockAgentSet, - kMockAgentGet, - kDispatches, - kIsMockActive, - kNetConnect, - kGetNetConnect, - kOptions, - kFactory -} = __nccwpck_require__(1117) -const MockClient = __nccwpck_require__(7365) -const MockPool = __nccwpck_require__(4004) -const { matchValue, buildMockOptions } = __nccwpck_require__(3397) -const { InvalidArgumentError, UndiciError } = __nccwpck_require__(8707) -const Dispatcher = __nccwpck_require__(883) -const Pluralizer = __nccwpck_require__(1529) -const PendingInterceptorsFormatter = __nccwpck_require__(6142) + // Fail entire queue. + const requests = client[kQueue].splice(client[kRunningIdx]) + for (let i = 0; i < requests.length; i++) { + const request = requests[i] + util.errorRequest(client, request, err) + } + } else if (client[kRunning] > 0 && err.code !== 'UND_ERR_INFO') { + // Fail head of pipeline. + const request = client[kQueue][client[kRunningIdx]] + client[kQueue][client[kRunningIdx]++] = null -class MockAgent extends Dispatcher { - constructor (opts) { - super(opts) + util.errorRequest(client, request, err) + } - this[kNetConnect] = true - this[kIsMockActive] = true + client[kPendingIdx] = client[kRunningIdx] - // Instantiate Agent and encapsulate - if ((opts?.agent && typeof opts.agent.dispatch !== 'function')) { - throw new InvalidArgumentError('Argument opts.agent must implement Agent') - } - const agent = opts?.agent ? opts.agent : new Agent(opts) - this[kAgent] = agent + assert(client[kRunning] === 0) - this[kClients] = agent[kClients] - this[kOptions] = buildMockOptions(opts) - } + client.emit('disconnect', client[kUrl], [client], err) - get (origin) { - let dispatcher = this[kMockAgentGet](origin) + client[kResume]() + }) - if (!dispatcher) { - dispatcher = this[kFactory](origin) - this[kMockAgentSet](origin, dispatcher) - } - return dispatcher - } + let closed = false + socket.on('close', () => { + closed = true + }) - dispatch (opts, handler) { - // Call MockAgent.get to perform additional setup before dispatching as normal - this.get(opts.origin) - return this[kAgent].dispatch(opts, handler) - } + return { + version: 'h1', + defaultPipelining: 1, + write (...args) { + return writeH1(client, ...args) + }, + resume () { + resumeH1(client) + }, + destroy (err, callback) { + if (closed) { + queueMicrotask(callback) + } else { + socket.destroy(err).on('close', callback) + } + }, + get destroyed () { + return socket.destroyed + }, + busy (request) { + if (socket[kWriting] || socket[kReset] || socket[kBlocking] || socket[kIdleSocketValidation] === 1) { + return true + } - async close () { - await this[kAgent].close() - this[kClients].clear() - } + if (request) { + if (client[kRunning] > 0 && !request.idempotent) { + // Non-idempotent request cannot be retried. + // Ensure that no other requests are inflight and + // could cause failure. + return true + } - deactivate () { - this[kIsMockActive] = false - } + if (client[kRunning] > 0 && (request.upgrade || request.method === 'CONNECT')) { + // Don't dispatch an upgrade until all preceding requests have completed. + // A misbehaving server might upgrade the connection before all pipelined + // request has completed. + return true + } - activate () { - this[kIsMockActive] = true - } + if (client[kRunning] > 0 && util.bodyLength(request.body) !== 0 && + (util.isStream(request.body) || util.isAsyncIterable(request.body) || util.isFormDataLike(request.body))) { + // Request with stream or iterator body can error while other requests + // are inflight and indirectly error those as well. + // Ensure this doesn't happen by waiting for inflight + // to complete before dispatching. - enableNetConnect (matcher) { - if (typeof matcher === 'string' || typeof matcher === 'function' || matcher instanceof RegExp) { - if (Array.isArray(this[kNetConnect])) { - this[kNetConnect].push(matcher) - } else { - this[kNetConnect] = [matcher] + // Request with stream or iterator body cannot be retried. + // Ensure that no other requests are inflight and + // could cause failure. + return true + } } - } else if (typeof matcher === 'undefined') { - this[kNetConnect] = true - } else { - throw new InvalidArgumentError('Unsupported matcher. Must be one of String|Function|RegExp.') - } - } - disableNetConnect () { - this[kNetConnect] = false + return false + } } +} - // This is required to bypass issues caused by using global symbols - see: - // https://github.com/nodejs/undici/issues/1447 - get isMockActive () { - return this[kIsMockActive] +function clearIdleSocketValidation (socket) { + if (socket[kIdleSocketValidationTimeout]) { + clearTimeout(socket[kIdleSocketValidationTimeout]) + socket[kIdleSocketValidationTimeout] = null } - [kMockAgentSet] (origin, dispatcher) { - this[kClients].set(origin, dispatcher) - } + socket[kIdleSocketValidation] = 0 +} - [kFactory] (origin) { - const mockOptions = Object.assign({ agent: this }, this[kOptions]) - return this[kOptions] && this[kOptions].connections === 1 - ? new MockClient(origin, mockOptions) - : new MockPool(origin, mockOptions) - } +function scheduleIdleSocketValidation (client, socket) { + socket[kIdleSocketValidation] = 1 + socket[kIdleSocketValidationTimeout] = setTimeout(() => { + socket[kIdleSocketValidationTimeout] = null + socket[kIdleSocketValidation] = 2 - [kMockAgentGet] (origin) { - // First check if we can immediately find it - const client = this[kClients].get(origin) - if (client) { - return client + if (client[kSocket] === socket && !socket.destroyed) { + client[kResume]() } + }, 0) + socket[kIdleSocketValidationTimeout].unref?.() +} - // If the origin is not a string create a dummy parent pool and return to user - if (typeof origin !== 'string') { - const dispatcher = this[kFactory]('http://localhost:9999') - this[kMockAgentSet](origin, dispatcher) - return dispatcher - } +/** + * @param {import('./client.js')} client + */ +function resumeH1 (client) { + const socket = client[kSocket] - // If we match, create a pool and assign the same dispatches - for (const [keyMatcher, nonExplicitDispatcher] of Array.from(this[kClients])) { - if (nonExplicitDispatcher && typeof keyMatcher !== 'string' && matchValue(keyMatcher, origin)) { - const dispatcher = this[kFactory](origin) - this[kMockAgentSet](origin, dispatcher) - dispatcher[kDispatches] = nonExplicitDispatcher[kDispatches] - return dispatcher + if (socket && !socket.destroyed) { + if (client[kSize] === 0) { + if (!socket[kNoRef] && socket.unref) { + socket.unref() + socket[kNoRef] = true } + } else if (socket[kNoRef] && socket.ref) { + socket.ref() + socket[kNoRef] = false } - } - - [kGetNetConnect] () { - return this[kNetConnect] - } - - pendingInterceptors () { - const mockAgentClients = this[kClients] - - return Array.from(mockAgentClients.entries()) - .flatMap(([origin, scope]) => scope[kDispatches].map(dispatch => ({ ...dispatch, origin }))) - .filter(({ pending }) => pending) - } - assertNoPendingInterceptors ({ pendingInterceptorsFormatter = new PendingInterceptorsFormatter() } = {}) { - const pending = this.pendingInterceptors() + if (client[kRunning] === 0 && client[kPending] > 0 && socket[kSocketUsed]) { + if (socket[kIdleSocketValidation] === 0) { + scheduleIdleSocketValidation(client, socket) + socket[kParser].readMore() + if (socket.destroyed) { + return + } + return + } - if (pending.length === 0) { - return + if (socket[kIdleSocketValidation] === 1) { + socket[kParser].readMore() + if (socket.destroyed) { + return + } + return + } } - const pluralizer = new Pluralizer('interceptor', 'interceptors').pluralize(pending.length) - - throw new UndiciError(` -${pluralizer.count} ${pluralizer.noun} ${pluralizer.is} pending: + if (client[kRunning] === 0) { + socket[kParser].readMore() + if (socket.destroyed) { + return + } + } -${pendingInterceptorsFormatter.format(pending)} -`.trim()) + if (client[kSize] === 0) { + if (socket[kParser].timeoutType !== TIMEOUT_KEEP_ALIVE) { + socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_KEEP_ALIVE) + } + } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) { + if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) { + const request = client[kQueue][client[kRunningIdx]] + const headersTimeout = request.headersTimeout != null + ? request.headersTimeout + : client[kHeadersTimeout] + socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS) + } + } } } -module.exports = MockAgent - - -/***/ }), +// https://www.rfc-editor.org/rfc/rfc7230#section-3.3.2 +function shouldSendContentLength (method) { + return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT' +} -/***/ 7365: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +function writeH1 (client, request) { + const { method, path, host, upgrade, blocking, reset } = request + let { body, headers, contentLength } = request + // https://tools.ietf.org/html/rfc7231#section-4.3.1 + // https://tools.ietf.org/html/rfc7231#section-4.3.2 + // https://tools.ietf.org/html/rfc7231#section-4.3.5 -const { promisify } = __nccwpck_require__(7975) -const Client = __nccwpck_require__(3701) -const { buildMockDispatch } = __nccwpck_require__(3397) -const { - kDispatches, - kMockAgent, - kClose, - kOriginalClose, - kOrigin, - kOriginalDispatch, - kConnected -} = __nccwpck_require__(1117) -const { MockInterceptor } = __nccwpck_require__(1511) -const Symbols = __nccwpck_require__(6443) -const { InvalidArgumentError } = __nccwpck_require__(8707) + // Sending a payload body on a request that does not + // expect it can cause undefined behavior on some + // servers and corrupt connection state. Do not + // re-use the connection for further requests. -/** - * MockClient provides an API that extends the Client to influence the mockDispatches. - */ -class MockClient extends Client { - constructor (origin, opts) { - super(origin, opts) + const expectsPayload = ( + method === 'PUT' || + method === 'POST' || + method === 'PATCH' || + method === 'QUERY' || + method === 'PROPFIND' || + method === 'PROPPATCH' + ) - if (!opts || !opts.agent || typeof opts.agent.dispatch !== 'function') { - throw new InvalidArgumentError('Argument opts.agent must implement Agent') + if (util.isFormDataLike(body)) { + if (!extractBody) { + extractBody = (__nccwpck_require__(4492).extractBody) } - this[kMockAgent] = opts.agent - this[kOrigin] = origin - this[kDispatches] = [] - this[kConnected] = 1 - this[kOriginalDispatch] = this.dispatch - this[kOriginalClose] = this.close.bind(this) - - this.dispatch = buildMockDispatch.call(this) - this.close = this[kClose] + const [bodyStream, contentType] = extractBody(body) + if (request.contentType == null) { + headers.push('content-type', contentType) + } + body = bodyStream.stream + contentLength = bodyStream.length + } else if (util.isBlobLike(body) && request.contentType == null) { + const contentType = body.type + if (contentType) { + const contentTypeValue = `${contentType}` + if (!util.isValidHeaderValue(contentTypeValue)) { + util.errorRequest(client, request, new InvalidArgumentError('invalid content-type header')) + return false + } + headers.push('content-type', contentTypeValue) + } } - get [Symbols.kConnected] () { - return this[kConnected] + if (body && typeof body.read === 'function') { + // Try to read EOF in order to get length. + body.read(0) } - /** - * Sets up the base interceptor for mocking replies from undici. - */ - intercept (opts) { - return new MockInterceptor(opts, this[kDispatches]) - } + const bodyLength = util.bodyLength(body) - async [kClose] () { - await promisify(this[kOriginalClose])() - this[kConnected] = 0 - this[kMockAgent][Symbols.kClients].delete(this[kOrigin]) + contentLength = bodyLength ?? contentLength + + if (contentLength === null) { + contentLength = request.contentLength } -} -module.exports = MockClient + if (contentLength === 0 && !expectsPayload) { + // https://tools.ietf.org/html/rfc7230#section-3.3.2 + // A user agent SHOULD NOT send a Content-Length header field when + // the request message does not contain a payload body and the method + // semantics do not anticipate such a body. + contentLength = null + } -/***/ }), + // https://github.com/nodejs/undici/issues/2046 + // A user agent may send a Content-Length header with 0 value, this should be allowed. + if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) { + if (client[kStrictContentLength]) { + util.errorRequest(client, request, new RequestContentLengthMismatchError()) + return false + } -/***/ 2429: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + process.emitWarning(new RequestContentLengthMismatchError()) + } + const socket = client[kSocket] + clearIdleSocketValidation(socket) + const abort = (err) => { + if (request.aborted || request.completed) { + return + } -const { UndiciError } = __nccwpck_require__(8707) + util.errorRequest(client, request, err || new RequestAbortedError()) -const kMockNotMatchedError = Symbol.for('undici.error.UND_MOCK_ERR_MOCK_NOT_MATCHED') + util.destroy(body) + util.destroy(socket, new InformationalError('aborted')) + } -/** - * The request does not match any registered mock dispatches. - */ -class MockNotMatchedError extends UndiciError { - constructor (message) { - super(message) - Error.captureStackTrace(this, MockNotMatchedError) - this.name = 'MockNotMatchedError' - this.message = message || 'The request does not match any registered mock dispatches' - this.code = 'UND_MOCK_ERR_MOCK_NOT_MATCHED' + try { + request.onConnect(abort) + } catch (err) { + util.errorRequest(client, request, err) } - static [Symbol.hasInstance] (instance) { - return instance && instance[kMockNotMatchedError] === true + if (request.aborted) { + return false } - [kMockNotMatchedError] = true -} + if (method === 'HEAD') { + // https://github.com/mcollina/undici/issues/258 + // Close after a HEAD request to interop with misbehaving servers + // that may send a body in the response. -module.exports = { - MockNotMatchedError -} + socket[kReset] = true + } + if (upgrade || method === 'CONNECT') { + // On CONNECT or upgrade, block pipeline from dispatching further + // requests on this connection. -/***/ }), + socket[kReset] = true + } -/***/ 1511: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + if (reset != null) { + socket[kReset] = reset + } + if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) { + socket[kReset] = true + } + if (blocking) { + socket[kBlocking] = true + } -const { getResponseData, buildKey, addMockDispatch } = __nccwpck_require__(3397) -const { - kDispatches, - kDispatchKey, - kDefaultHeaders, - kDefaultTrailers, - kContentLength, - kMockDispatch -} = __nccwpck_require__(1117) -const { InvalidArgumentError } = __nccwpck_require__(8707) -const { buildURL } = __nccwpck_require__(3440) + let header = `${method} ${path} HTTP/1.1\r\n` -/** - * Defines the scope API for an interceptor reply - */ -class MockScope { - constructor (mockDispatch) { - this[kMockDispatch] = mockDispatch + if (typeof host === 'string') { + header += `host: ${host}\r\n` + } else { + header += client[kHostHeader] } - /** - * Delay a reply by a set amount in ms. - */ - delay (waitInMs) { - if (typeof waitInMs !== 'number' || !Number.isInteger(waitInMs) || waitInMs <= 0) { - throw new InvalidArgumentError('waitInMs must be a valid integer > 0') - } + if (upgrade) { + header += `connection: upgrade\r\nupgrade: ${upgrade}\r\n` + } else if (client[kPipelining] && !socket[kReset]) { + header += 'connection: keep-alive\r\n' + } else { + header += 'connection: close\r\n' + } - this[kMockDispatch].delay = waitInMs - return this + if (Array.isArray(headers)) { + for (let n = 0; n < headers.length; n += 2) { + const key = headers[n + 0] + const val = headers[n + 1] + + if (Array.isArray(val)) { + for (let i = 0; i < val.length; i++) { + header += `${key}: ${val[i]}\r\n` + } + } else { + header += `${key}: ${val}\r\n` + } + } } - /** - * For a defined reply, never mark as consumed. - */ - persist () { - this[kMockDispatch].persist = true - return this + if (channels.sendHeaders.hasSubscribers) { + channels.sendHeaders.publish({ request, headers: header, socket }) } - /** - * Allow one to define a reply for a set amount of matching requests. - */ - times (repeatTimes) { - if (typeof repeatTimes !== 'number' || !Number.isInteger(repeatTimes) || repeatTimes <= 0) { - throw new InvalidArgumentError('repeatTimes must be a valid integer > 0') + /* istanbul ignore else: assertion */ + if (!body || bodyLength === 0) { + writeBuffer(abort, null, client, request, socket, contentLength, header, expectsPayload) + } else if (util.isBuffer(body)) { + writeBuffer(abort, body, client, request, socket, contentLength, header, expectsPayload) + } else if (util.isBlobLike(body)) { + if (typeof body.stream === 'function') { + writeIterable(abort, body.stream(), client, request, socket, contentLength, header, expectsPayload) + } else { + writeBlob(abort, body, client, request, socket, contentLength, header, expectsPayload) } - - this[kMockDispatch].times = repeatTimes - return this + } else if (util.isStream(body)) { + writeStream(abort, body, client, request, socket, contentLength, header, expectsPayload) + } else if (util.isIterable(body)) { + writeIterable(abort, body, client, request, socket, contentLength, header, expectsPayload) + } else { + assert(false) } + + return true } -/** - * Defines an interceptor for a Mock - */ -class MockInterceptor { - constructor (opts, mockDispatches) { - if (typeof opts !== 'object') { - throw new InvalidArgumentError('opts must be an object') - } - if (typeof opts.path === 'undefined') { - throw new InvalidArgumentError('opts.path must be defined') - } - if (typeof opts.method === 'undefined') { - opts.method = 'GET' +function writeStream (abort, body, client, request, socket, contentLength, header, expectsPayload) { + assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined') + + let finished = false + + const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header }) + + const onData = function (chunk) { + if (finished) { + return } - // See https://github.com/nodejs/undici/issues/1245 - // As per RFC 3986, clients are not supposed to send URI - // fragments to servers when they retrieve a document, - if (typeof opts.path === 'string') { - if (opts.query) { - opts.path = buildURL(opts.path, opts.query) - } else { - // Matches https://github.com/nodejs/undici/blob/main/lib/web/fetch/index.js#L1811 - const parsedURL = new URL(opts.path, 'data://') - opts.path = parsedURL.pathname + parsedURL.search + + try { + if (!writer.write(chunk) && this.pause) { + this.pause() } + } catch (err) { + util.destroy(this, err) } - if (typeof opts.method === 'string') { - opts.method = opts.method.toUpperCase() - } - - this[kDispatchKey] = buildKey(opts) - this[kDispatches] = mockDispatches - this[kDefaultHeaders] = {} - this[kDefaultTrailers] = {} - this[kContentLength] = false } + const onDrain = function () { + if (finished) { + return + } - createMockScopeDispatchData ({ statusCode, data, responseOptions }) { - const responseData = getResponseData(data) - const contentLength = this[kContentLength] ? { 'content-length': responseData.length } : {} - const headers = { ...this[kDefaultHeaders], ...contentLength, ...responseOptions.headers } - const trailers = { ...this[kDefaultTrailers], ...responseOptions.trailers } - - return { statusCode, data, headers, trailers } + if (body.resume) { + body.resume() + } } + const onClose = function () { + // 'close' might be emitted *before* 'error' for + // broken streams. Wait a tick to avoid this case. + queueMicrotask(() => { + // It's only safe to remove 'error' listener after + // 'close'. + body.removeListener('error', onFinished) + }) - validateReplyParameters (replyParameters) { - if (typeof replyParameters.statusCode === 'undefined') { - throw new InvalidArgumentError('statusCode must be defined') - } - if (typeof replyParameters.responseOptions !== 'object' || replyParameters.responseOptions === null) { - throw new InvalidArgumentError('responseOptions must be an object') + if (!finished) { + const err = new RequestAbortedError() + queueMicrotask(() => onFinished(err)) } } + const onFinished = function (err) { + if (finished) { + return + } - /** - * Mock an undici request with a defined reply. - */ - reply (replyOptionsCallbackOrStatusCode) { - // Values of reply aren't available right now as they - // can only be available when the reply callback is invoked. - if (typeof replyOptionsCallbackOrStatusCode === 'function') { - // We'll first wrap the provided callback in another function, - // this function will properly resolve the data from the callback - // when invoked. - const wrappedDefaultsCallback = (opts) => { - // Our reply options callback contains the parameter for statusCode, data and options. - const resolvedData = replyOptionsCallbackOrStatusCode(opts) + finished = true - // Check if it is in the right format - if (typeof resolvedData !== 'object' || resolvedData === null) { - throw new InvalidArgumentError('reply options callback must return an object') - } + assert(socket.destroyed || (socket[kWriting] && client[kRunning] <= 1)) - const replyParameters = { data: '', responseOptions: {}, ...resolvedData } - this.validateReplyParameters(replyParameters) - // Since the values can be obtained immediately we return them - // from this higher order function that will be resolved later. - return { - ...this.createMockScopeDispatchData(replyParameters) - } - } + socket + .off('drain', onDrain) + .off('error', onFinished) - // Add usual dispatch data, but this time set the data parameter to function that will eventually provide data. - const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], wrappedDefaultsCallback) - return new MockScope(newMockDispatch) - } + body + .removeListener('data', onData) + .removeListener('end', onFinished) + .removeListener('close', onClose) - // We can have either one or three parameters, if we get here, - // we should have 1-3 parameters. So we spread the arguments of - // this function to obtain the parameters, since replyData will always - // just be the statusCode. - const replyParameters = { - statusCode: replyOptionsCallbackOrStatusCode, - data: arguments[1] === undefined ? '' : arguments[1], - responseOptions: arguments[2] === undefined ? {} : arguments[2] + if (!err) { + try { + writer.end() + } catch (er) { + err = er + } } - this.validateReplyParameters(replyParameters) - // Send in-already provided data like usual - const dispatchData = this.createMockScopeDispatchData(replyParameters) - const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], dispatchData) - return new MockScope(newMockDispatch) - } + writer.destroy(err) - /** - * Mock an undici request with a defined error. - */ - replyWithError (error) { - if (typeof error === 'undefined') { - throw new InvalidArgumentError('error must be defined') + if (err && (err.code !== 'UND_ERR_INFO' || err.message !== 'reset')) { + util.destroy(body, err) + } else { + util.destroy(body) } - - const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], { error }) - return new MockScope(newMockDispatch) } - /** - * Set default reply headers on the interceptor for subsequent replies - */ - defaultReplyHeaders (headers) { - if (typeof headers === 'undefined') { - throw new InvalidArgumentError('headers must be defined') - } + body + .on('data', onData) + .on('end', onFinished) + .on('error', onFinished) + .on('close', onClose) - this[kDefaultHeaders] = headers - return this + if (body.resume) { + body.resume() } - /** - * Set default reply trailers on the interceptor for subsequent replies - */ - defaultReplyTrailers (trailers) { - if (typeof trailers === 'undefined') { - throw new InvalidArgumentError('trailers must be defined') - } + socket + .on('drain', onDrain) + .on('error', onFinished) - this[kDefaultTrailers] = trailers - return this + if (body.errorEmitted ?? body.errored) { + setImmediate(() => onFinished(body.errored)) + } else if (body.endEmitted ?? body.readableEnded) { + setImmediate(() => onFinished(null)) } - /** - * Set reply content length header for replies on the interceptor - */ - replyContentLength () { - this[kContentLength] = true - return this + if (body.closeEmitted ?? body.closed) { + setImmediate(onClose) } } -module.exports.MockInterceptor = MockInterceptor -module.exports.MockScope = MockScope +function writeBuffer (abort, body, client, request, socket, contentLength, header, expectsPayload) { + try { + if (!body) { + if (contentLength === 0) { + socket.write(`${header}content-length: 0\r\n\r\n`, 'latin1') + } else { + assert(contentLength === null, 'no body must not have content length') + socket.write(`${header}\r\n`, 'latin1') + } + } else if (util.isBuffer(body)) { + assert(contentLength === body.byteLength, 'buffer body must have content length') + socket.cork() + socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1') + socket.write(body) + socket.uncork() + request.onBodySent(body) -/***/ }), + if (!expectsPayload && request.reset !== false) { + socket[kReset] = true + } + } + request.onRequestSent() -/***/ 4004: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + client[kResume]() + } catch (err) { + abort(err) + } +} +async function writeBlob (abort, body, client, request, socket, contentLength, header, expectsPayload) { + assert(contentLength === body.size, 'blob body must have content length') + try { + if (contentLength != null && contentLength !== body.size) { + throw new RequestContentLengthMismatchError() + } -const { promisify } = __nccwpck_require__(7975) -const Pool = __nccwpck_require__(628) -const { buildMockDispatch } = __nccwpck_require__(3397) -const { - kDispatches, - kMockAgent, - kClose, - kOriginalClose, - kOrigin, - kOriginalDispatch, - kConnected -} = __nccwpck_require__(1117) -const { MockInterceptor } = __nccwpck_require__(1511) -const Symbols = __nccwpck_require__(6443) -const { InvalidArgumentError } = __nccwpck_require__(8707) + const buffer = Buffer.from(await body.arrayBuffer()) -/** - * MockPool provides an API that extends the Pool to influence the mockDispatches. - */ -class MockPool extends Pool { - constructor (origin, opts) { - super(origin, opts) + socket.cork() + socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1') + socket.write(buffer) + socket.uncork() - if (!opts || !opts.agent || typeof opts.agent.dispatch !== 'function') { - throw new InvalidArgumentError('Argument opts.agent must implement Agent') - } + request.onBodySent(buffer) + request.onRequestSent() - this[kMockAgent] = opts.agent - this[kOrigin] = origin - this[kDispatches] = [] - this[kConnected] = 1 - this[kOriginalDispatch] = this.dispatch - this[kOriginalClose] = this.close.bind(this) + if (!expectsPayload && request.reset !== false) { + socket[kReset] = true + } - this.dispatch = buildMockDispatch.call(this) - this.close = this[kClose] + client[kResume]() + } catch (err) { + abort(err) } +} - get [Symbols.kConnected] () { - return this[kConnected] - } +async function writeIterable (abort, body, client, request, socket, contentLength, header, expectsPayload) { + assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined') - /** - * Sets up the base interceptor for mocking replies from undici. - */ - intercept (opts) { - return new MockInterceptor(opts, this[kDispatches]) + let callback = null + function onDrain () { + if (callback) { + const cb = callback + callback = null + cb() + } } - async [kClose] () { - await promisify(this[kOriginalClose])() - this[kConnected] = 0 - this[kMockAgent][Symbols.kClients].delete(this[kOrigin]) - } -} + const waitForDrain = () => new Promise((resolve, reject) => { + assert(callback === null) -module.exports = MockPool + if (socket[kError]) { + reject(socket[kError]) + } else { + callback = resolve + } + }) + socket + .on('close', onDrain) + .on('drain', onDrain) -/***/ }), + const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header }) + try { + // It's up to the user to somehow abort the async iterable. + for await (const chunk of body) { + if (socket[kError]) { + throw socket[kError] + } -/***/ 1117: -/***/ ((module) => { + if (!writer.write(chunk)) { + await waitForDrain() + } + } + + writer.end() + } catch (err) { + writer.destroy(err) + } finally { + socket + .off('close', onDrain) + .off('drain', onDrain) + } +} + +class AsyncWriter { + constructor ({ abort, socket, request, contentLength, client, expectsPayload, header }) { + this.socket = socket + this.request = request + this.contentLength = contentLength + this.client = client + this.bytesWritten = 0 + this.expectsPayload = expectsPayload + this.header = header + this.abort = abort + socket[kWriting] = true + } + write (chunk) { + const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this -module.exports = { - kAgent: Symbol('agent'), - kOptions: Symbol('options'), - kFactory: Symbol('factory'), - kDispatches: Symbol('dispatches'), - kDispatchKey: Symbol('dispatch key'), - kDefaultHeaders: Symbol('default headers'), - kDefaultTrailers: Symbol('default trailers'), - kContentLength: Symbol('content length'), - kMockAgent: Symbol('mock agent'), - kMockAgentSet: Symbol('mock agent set'), - kMockAgentGet: Symbol('mock agent get'), - kMockDispatch: Symbol('mock dispatch'), - kClose: Symbol('close'), - kOriginalClose: Symbol('original agent close'), - kOrigin: Symbol('origin'), - kIsMockActive: Symbol('is mock active'), - kNetConnect: Symbol('net connect'), - kGetNetConnect: Symbol('get net connect'), - kConnected: Symbol('connected') -} + if (socket[kError]) { + throw socket[kError] + } + + if (socket.destroyed) { + return false + } + const len = Buffer.byteLength(chunk) + if (!len) { + return true + } -/***/ }), + // We should defer writing chunks. + if (contentLength !== null && bytesWritten + len > contentLength) { + if (client[kStrictContentLength]) { + throw new RequestContentLengthMismatchError() + } -/***/ 3397: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + process.emitWarning(new RequestContentLengthMismatchError()) + } + socket.cork() + if (bytesWritten === 0) { + if (!expectsPayload && request.reset !== false) { + socket[kReset] = true + } -const { MockNotMatchedError } = __nccwpck_require__(2429) -const { - kDispatches, - kMockAgent, - kOriginalDispatch, - kOrigin, - kGetNetConnect -} = __nccwpck_require__(1117) -const { buildURL } = __nccwpck_require__(3440) -const { STATUS_CODES } = __nccwpck_require__(7067) -const { - types: { - isPromise - } -} = __nccwpck_require__(7975) + if (contentLength === null) { + socket.write(`${header}transfer-encoding: chunked\r\n`, 'latin1') + } else { + socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1') + } + } -function matchValue (match, value) { - if (typeof match === 'string') { - return match === value - } - if (match instanceof RegExp) { - return match.test(value) - } - if (typeof match === 'function') { - return match(value) === true - } - return false -} + if (contentLength === null) { + socket.write(`\r\n${len.toString(16)}\r\n`, 'latin1') + } -function lowerCaseEntries (headers) { - return Object.fromEntries( - Object.entries(headers).map(([headerName, headerValue]) => { - return [headerName.toLocaleLowerCase(), headerValue] - }) - ) -} + this.bytesWritten += len -/** - * @param {import('../../index').Headers|string[]|Record } headers - * @param {string} key - */ -function getHeaderByName (headers, key) { - if (Array.isArray(headers)) { - for (let i = 0; i < headers.length; i += 2) { - if (headers[i].toLocaleLowerCase() === key.toLocaleLowerCase()) { - return headers[i + 1] + const ret = socket.write(chunk) + + socket.uncork() + + request.onBodySent(chunk) + + if (!ret) { + if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { + // istanbul ignore else: only for jest + if (socket[kParser].timeout.refresh) { + socket[kParser].timeout.refresh() + } } } - return undefined - } else if (typeof headers.get === 'function') { - return headers.get(key) - } else { - return lowerCaseEntries(headers)[key.toLocaleLowerCase()] + return ret } -} -/** @param {string[]} headers */ -function buildHeadersFromArray (headers) { // fetch HeadersList - const clone = headers.slice() - const entries = [] - for (let index = 0; index < clone.length; index += 2) { - entries.push([clone[index], clone[index + 1]]) - } - return Object.fromEntries(entries) -} + end () { + const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this + request.onRequestSent() -function matchHeaders (mockDispatch, headers) { - if (typeof mockDispatch.headers === 'function') { - if (Array.isArray(headers)) { // fetch HeadersList - headers = buildHeadersFromArray(headers) + socket[kWriting] = false + + if (socket[kError]) { + throw socket[kError] } - return mockDispatch.headers(headers ? lowerCaseEntries(headers) : {}) - } - if (typeof mockDispatch.headers === 'undefined') { - return true - } - if (typeof headers !== 'object' || typeof mockDispatch.headers !== 'object') { - return false - } - for (const [matchHeaderName, matchHeaderValue] of Object.entries(mockDispatch.headers)) { - const headerValue = getHeaderByName(headers, matchHeaderName) + if (socket.destroyed) { + return + } - if (!matchValue(matchHeaderValue, headerValue)) { - return false + if (bytesWritten === 0) { + if (expectsPayload) { + // https://tools.ietf.org/html/rfc7230#section-3.3.2 + // A user agent SHOULD send a Content-Length in a request message when + // no Transfer-Encoding is sent and the request method defines a meaning + // for an enclosed payload body. + + socket.write(`${header}content-length: 0\r\n\r\n`, 'latin1') + } else { + socket.write(`${header}\r\n`, 'latin1') + } + } else if (contentLength === null) { + socket.write('\r\n0\r\n\r\n', 'latin1') } - } - return true -} -function safeUrl (path) { - if (typeof path !== 'string') { - return path - } + if (contentLength !== null && bytesWritten !== contentLength) { + if (client[kStrictContentLength]) { + throw new RequestContentLengthMismatchError() + } else { + process.emitWarning(new RequestContentLengthMismatchError()) + } + } - const pathSegments = path.split('?') + if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { + // istanbul ignore else: only for jest + if (socket[kParser].timeout.refresh) { + socket[kParser].timeout.refresh() + } + } - if (pathSegments.length !== 2) { - return path + client[kResume]() } - const qp = new URLSearchParams(pathSegments.pop()) - qp.sort() - return [...pathSegments, qp.toString()].join('?') -} + destroy (err) { + const { socket, client, abort } = this -function matchKey (mockDispatch, { path, method, body, headers }) { - const pathMatch = matchValue(mockDispatch.path, path) - const methodMatch = matchValue(mockDispatch.method, method) - const bodyMatch = typeof mockDispatch.body !== 'undefined' ? matchValue(mockDispatch.body, body) : true - const headersMatch = matchHeaders(mockDispatch, headers) - return pathMatch && methodMatch && bodyMatch && headersMatch -} + socket[kWriting] = false -function getResponseData (data) { - if (Buffer.isBuffer(data)) { - return data - } else if (data instanceof Uint8Array) { - return data - } else if (data instanceof ArrayBuffer) { - return data - } else if (typeof data === 'object') { - return JSON.stringify(data) - } else { - return data.toString() + if (err) { + assert(client[kRunning] <= 1, 'pipeline should only contain this request') + abort(err) + } } } -function getMockDispatch (mockDispatches, key) { - const basePath = key.query ? buildURL(key.path, key.query) : key.path - const resolvedPath = typeof basePath === 'string' ? safeUrl(basePath) : basePath +module.exports = connectH1 - // Match path - let matchedMockDispatches = mockDispatches.filter(({ consumed }) => !consumed).filter(({ path }) => matchValue(safeUrl(path), resolvedPath)) - if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for path '${resolvedPath}'`) - } - // Match method - matchedMockDispatches = matchedMockDispatches.filter(({ method }) => matchValue(method, key.method)) - if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for method '${key.method}' on path '${resolvedPath}'`) - } +/***/ }), - // Match body - matchedMockDispatches = matchedMockDispatches.filter(({ body }) => typeof body !== 'undefined' ? matchValue(body, key.body) : true) - if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for body '${key.body}' on path '${resolvedPath}'`) - } +/***/ 8788: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - // Match headers - matchedMockDispatches = matchedMockDispatches.filter((mockDispatch) => matchHeaders(mockDispatch, key.headers)) - if (matchedMockDispatches.length === 0) { - const headers = typeof key.headers === 'object' ? JSON.stringify(key.headers) : key.headers - throw new MockNotMatchedError(`Mock dispatch not matched for headers '${headers}' on path '${resolvedPath}'`) - } - return matchedMockDispatches[0] -} -function addMockDispatch (mockDispatches, key, data) { - const baseData = { timesInvoked: 0, times: 1, persist: false, consumed: false } - const replyData = typeof data === 'function' ? { callback: data } : { ...data } - const newMockDispatch = { ...baseData, ...key, pending: true, data: { error: null, ...replyData } } - mockDispatches.push(newMockDispatch) - return newMockDispatch -} +const assert = __nccwpck_require__(4589) +const { pipeline } = __nccwpck_require__(7075) +const util = __nccwpck_require__(3440) +const { + RequestContentLengthMismatchError, + RequestAbortedError, + SocketError, + InformationalError +} = __nccwpck_require__(8707) +const { + kUrl, + kReset, + kClient, + kRunning, + kPending, + kQueue, + kPendingIdx, + kRunningIdx, + kError, + kSocket, + kStrictContentLength, + kOnError, + kMaxConcurrentStreams, + kHTTP2Session, + kResume, + kSize, + kHTTPContext +} = __nccwpck_require__(6443) -function deleteMockDispatch (mockDispatches, key) { - const index = mockDispatches.findIndex(dispatch => { - if (!dispatch.consumed) { - return false - } - return matchKey(dispatch, key) - }) - if (index !== -1) { - mockDispatches.splice(index, 1) - } +const kOpenStreams = Symbol('open streams') + +let extractBody + +// Experimental +let h2ExperimentalWarned = false + +/** @type {import('http2')} */ +let http2 +try { + http2 = __nccwpck_require__(2467) +} catch { + // @ts-ignore + http2 = { constants: {} } } -function buildKey (opts) { - const { path, method, body, headers, query } = opts - return { - path, - method, - body, - headers, - query +const { + constants: { + HTTP2_HEADER_AUTHORITY, + HTTP2_HEADER_METHOD, + HTTP2_HEADER_PATH, + HTTP2_HEADER_SCHEME, + HTTP2_HEADER_CONTENT_LENGTH, + HTTP2_HEADER_EXPECT, + HTTP2_HEADER_STATUS } -} +} = http2 -function generateKeyValues (data) { - const keys = Object.keys(data) +function parseH2Headers (headers) { const result = [] - for (let i = 0; i < keys.length; ++i) { - const key = keys[i] - const value = data[key] - const name = Buffer.from(`${key}`) + + for (const [name, value] of Object.entries(headers)) { + // h2 may concat the header value by array + // e.g. Set-Cookie if (Array.isArray(value)) { - for (let j = 0; j < value.length; ++j) { - result.push(name, Buffer.from(`${value[j]}`)) + for (const subvalue of value) { + // we need to provide each header value of header name + // because the headers handler expect name-value pair + result.push(Buffer.from(name), Buffer.from(subvalue)) } } else { - result.push(name, Buffer.from(`${value}`)) + result.push(Buffer.from(name), Buffer.from(value)) } } + return result } -/** - * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Status - * @param {number} statusCode - */ -function getStatusText (statusCode) { - return STATUS_CODES[statusCode] || 'unknown' -} +async function connectH2 (client, socket) { + client[kSocket] = socket -async function getResponse (body) { - const buffers = [] - for await (const data of body) { - buffers.push(data) + if (!h2ExperimentalWarned) { + h2ExperimentalWarned = true + process.emitWarning('H2 support is experimental, expect them to change at any time.', { + code: 'UNDICI-H2' + }) } - return Buffer.concat(buffers).toString('utf8') -} -/** - * Mock dispatch function used to simulate undici dispatches - */ -function mockDispatch (opts, handler) { - // Get mock dispatch from built key - const key = buildKey(opts) - const mockDispatch = getMockDispatch(this[kDispatches], key) + const session = http2.connect(client[kUrl], { + createConnection: () => socket, + peerMaxConcurrentStreams: client[kMaxConcurrentStreams] + }) - mockDispatch.timesInvoked++ + session[kOpenStreams] = 0 + session[kClient] = client + session[kSocket] = socket - // Here's where we resolve a callback if a callback is present for the dispatch data. - if (mockDispatch.data.callback) { - mockDispatch.data = { ...mockDispatch.data, ...mockDispatch.data.callback(opts) } - } + util.addListener(session, 'error', onHttp2SessionError) + util.addListener(session, 'frameError', onHttp2FrameError) + util.addListener(session, 'end', onHttp2SessionEnd) + util.addListener(session, 'goaway', onHTTP2GoAway) + util.addListener(session, 'close', function () { + const { [kClient]: client } = this + const { [kSocket]: socket } = client - // Parse mockDispatch data - const { data: { statusCode, data, headers, trailers, error }, delay, persist } = mockDispatch - const { timesInvoked, times } = mockDispatch + const err = this[kSocket][kError] || this[kError] || new SocketError('closed', util.getSocketInfo(socket)) - // If it's used up and not persistent, mark as consumed - mockDispatch.consumed = !persist && timesInvoked >= times - mockDispatch.pending = timesInvoked < times + client[kHTTP2Session] = null - // If specified, trigger dispatch error - if (error !== null) { - deleteMockDispatch(this[kDispatches], key) - handler.onError(error) - return true - } + if (client.destroyed) { + assert(client[kPending] === 0) - // Handle the request with a delay if necessary - if (typeof delay === 'number' && delay > 0) { - setTimeout(() => { - handleReply(this[kDispatches]) - }, delay) - } else { - handleReply(this[kDispatches]) - } + // Fail entire queue. + const requests = client[kQueue].splice(client[kRunningIdx]) + for (let i = 0; i < requests.length; i++) { + const request = requests[i] + util.errorRequest(client, request, err) + } + } + }) - function handleReply (mockDispatches, _data = data) { - // fetch's HeadersList is a 1D string array - const optsHeaders = Array.isArray(opts.headers) - ? buildHeadersFromArray(opts.headers) - : opts.headers - const body = typeof _data === 'function' - ? _data({ ...opts, headers: optsHeaders }) - : _data + session.unref() - // util.types.isPromise is likely needed for jest. - if (isPromise(body)) { - // If handleReply is asynchronous, throwing an error - // in the callback will reject the promise, rather than - // synchronously throw the error, which breaks some tests. - // Rather, we wait for the callback to resolve if it is a - // promise, and then re-run handleReply with the new body. - body.then((newData) => handleReply(mockDispatches, newData)) - return + client[kHTTP2Session] = session + socket[kHTTP2Session] = session + + util.addListener(socket, 'error', function (err) { + assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') + + this[kError] = err + + this[kClient][kOnError](err) + }) + + util.addListener(socket, 'end', function () { + util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this))) + }) + + util.addListener(socket, 'close', function () { + const err = this[kError] || new SocketError('closed', util.getSocketInfo(this)) + + client[kSocket] = null + + if (this[kHTTP2Session] != null) { + this[kHTTP2Session].destroy(err) } - const responseData = getResponseData(body) - const responseHeaders = generateKeyValues(headers) - const responseTrailers = generateKeyValues(trailers) + client[kPendingIdx] = client[kRunningIdx] - handler.onConnect?.(err => handler.onError(err), null) - handler.onHeaders?.(statusCode, responseHeaders, resume, getStatusText(statusCode)) - handler.onData?.(Buffer.from(responseData)) - handler.onComplete?.(responseTrailers) - deleteMockDispatch(mockDispatches, key) - } + assert(client[kRunning] === 0) - function resume () {} + client.emit('disconnect', client[kUrl], [client], err) - return true -} + client[kResume]() + }) -function buildMockDispatch () { - const agent = this[kMockAgent] - const origin = this[kOrigin] - const originalDispatch = this[kOriginalDispatch] + let closed = false + socket.on('close', () => { + closed = true + }) - return function dispatch (opts, handler) { - if (agent.isMockActive) { - try { - mockDispatch.call(this, opts, handler) - } catch (error) { - if (error instanceof MockNotMatchedError) { - const netConnect = agent[kGetNetConnect]() - if (netConnect === false) { - throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)`) - } - if (checkNetConnect(netConnect, origin)) { - originalDispatch.call(this, opts, handler) - } else { - throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)`) - } - } else { - throw error - } + return { + version: 'h2', + defaultPipelining: Infinity, + write (...args) { + return writeH2(client, ...args) + }, + resume () { + resumeH2(client) + }, + destroy (err, callback) { + if (closed) { + queueMicrotask(callback) + } else { + // Destroying the socket will trigger the session close + socket.destroy(err).on('close', callback) } + }, + get destroyed () { + return socket.destroyed + }, + busy () { + return false + } + } +} + +function resumeH2 (client) { + const socket = client[kSocket] + + if (socket?.destroyed === false) { + if (client[kSize] === 0 && client[kMaxConcurrentStreams] === 0) { + socket.unref() + client[kHTTP2Session].unref() } else { - originalDispatch.call(this, opts, handler) + socket.ref() + client[kHTTP2Session].ref() } } } -function checkNetConnect (netConnect, origin) { - const url = new URL(origin) - if (netConnect === true) { - return true - } else if (Array.isArray(netConnect) && netConnect.some((matcher) => matchValue(matcher, url.host))) { - return true - } - return false +function onHttp2SessionError (err) { + assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') + + this[kSocket][kError] = err + this[kClient][kOnError](err) } -function buildMockOptions (opts) { - if (opts) { - const { agent, ...mockOptions } = opts - return mockOptions +function onHttp2FrameError (type, code, id) { + if (id === 0) { + const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`) + this[kSocket][kError] = err + this[kClient][kOnError](err) } } -module.exports = { - getResponseData, - getMockDispatch, - addMockDispatch, - deleteMockDispatch, - buildKey, - generateKeyValues, - matchValue, - getResponse, - getStatusText, - mockDispatch, - buildMockDispatch, - checkNetConnect, - buildMockOptions, - getHeaderByName, - buildHeadersFromArray +function onHttp2SessionEnd () { + const err = new SocketError('other side closed', util.getSocketInfo(this[kSocket])) + this.destroy(err) + util.destroy(this[kSocket], err) } - -/***/ }), - -/***/ 6142: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - - -const { Transform } = __nccwpck_require__(7075) -const { Console } = __nccwpck_require__(7540) - -const PERSISTENT = process.versions.icu ? '✅' : 'Y ' -const NOT_PERSISTENT = process.versions.icu ? '❌' : 'N ' - /** - * Gets the output of `console.table(…)` as a string. + * This is the root cause of #3011 + * We need to handle GOAWAY frames properly, and trigger the session close + * along with the socket right away */ -module.exports = class PendingInterceptorsFormatter { - constructor ({ disableColors } = {}) { - this.transform = new Transform({ - transform (chunk, _enc, cb) { - cb(null, chunk) - } - }) - - this.logger = new Console({ - stdout: this.transform, - inspectOptions: { - colors: !disableColors && !process.env.CI - } - }) - } +function onHTTP2GoAway (code) { + // We cannot recover, so best to close the session and the socket + const err = this[kError] || new SocketError(`HTTP/2: "GOAWAY" frame received with code ${code}`, util.getSocketInfo(this)) + const client = this[kClient] - format (pendingInterceptors) { - const withPrettyHeaders = pendingInterceptors.map( - ({ method, path, data: { statusCode }, persist, times, timesInvoked, origin }) => ({ - Method: method, - Origin: origin, - Path: path, - 'Status code': statusCode, - Persistent: persist ? PERSISTENT : NOT_PERSISTENT, - Invocations: timesInvoked, - Remaining: persist ? Infinity : times - timesInvoked - })) + client[kSocket] = null + client[kHTTPContext] = null - this.logger.table(withPrettyHeaders) - return this.transform.read().toString() + if (this[kHTTP2Session] != null) { + this[kHTTP2Session].destroy(err) + this[kHTTP2Session] = null } -} + util.destroy(this[kSocket], err) -/***/ }), - -/***/ 1529: -/***/ ((module) => { + // Fail head of pipeline. + if (client[kRunningIdx] < client[kQueue].length) { + const request = client[kQueue][client[kRunningIdx]] + client[kQueue][client[kRunningIdx]++] = null + util.errorRequest(client, request, err) + client[kPendingIdx] = client[kRunningIdx] + } + assert(client[kRunning] === 0) + client.emit('disconnect', client[kUrl], [client], err) -const singulars = { - pronoun: 'it', - is: 'is', - was: 'was', - this: 'this' + client[kResume]() } -const plurals = { - pronoun: 'they', - is: 'are', - was: 'were', - this: 'these' +// https://www.rfc-editor.org/rfc/rfc7230#section-3.3.2 +function shouldSendContentLength (method) { + return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT' } -module.exports = class Pluralizer { - constructor (singular, plural) { - this.singular = singular - this.plural = plural - } +function writeH2 (client, request) { + const session = client[kHTTP2Session] + const { method, path, host, upgrade, expectContinue, signal, headers: reqHeaders } = request + let { body } = request - pluralize (count) { - const one = count === 1 - const keys = one ? singulars : plurals - const noun = one ? this.singular : this.plural - return { ...keys, count, noun } + if (upgrade) { + util.errorRequest(client, request, new Error('Upgrade not supported for H2')) + return false } -} + const headers = {} + for (let n = 0; n < reqHeaders.length; n += 2) { + const key = reqHeaders[n + 0] + const val = reqHeaders[n + 1] -/***/ }), + if (Array.isArray(val)) { + for (let i = 0; i < val.length; i++) { + if (headers[key]) { + headers[key] += `,${val[i]}` + } else { + headers[key] = val[i] + } + } + } else { + headers[key] = val + } + } -/***/ 6603: -/***/ ((module) => { + /** @type {import('node:http2').ClientHttp2Stream} */ + let stream + const { hostname, port } = client[kUrl] + headers[HTTP2_HEADER_AUTHORITY] = host || `${hostname}${port ? `:${port}` : ''}` + headers[HTTP2_HEADER_METHOD] = method -/** - * This module offers an optimized timer implementation designed for scenarios - * where high precision is not critical. - * - * The timer achieves faster performance by using a low-resolution approach, - * with an accuracy target of within 500ms. This makes it particularly useful - * for timers with delays of 1 second or more, where exact timing is less - * crucial. - * - * It's important to note that Node.js timers are inherently imprecise, as - * delays can occur due to the event loop being blocked by other operations. - * Consequently, timers may trigger later than their scheduled time. - */ + const abort = (err) => { + if (request.aborted || request.completed) { + return + } -/** - * The fastNow variable contains the internal fast timer clock value. - * - * @type {number} - */ -let fastNow = 0 + err = err || new RequestAbortedError() -/** - * RESOLUTION_MS represents the target resolution time in milliseconds. - * - * @type {number} - * @default 1000 - */ -const RESOLUTION_MS = 1e3 + util.errorRequest(client, request, err) -/** - * TICK_MS defines the desired interval in milliseconds between each tick. - * The target value is set to half the resolution time, minus 1 ms, to account - * for potential event loop overhead. - * - * @type {number} - * @default 499 - */ -const TICK_MS = (RESOLUTION_MS >> 1) - 1 + if (stream != null) { + util.destroy(stream, err) + } -/** - * fastNowTimeout is a Node.js timer used to manage and process - * the FastTimers stored in the `fastTimers` array. - * - * @type {NodeJS.Timeout} - */ -let fastNowTimeout + // We do not destroy the socket as we can continue using the session + // the stream get's destroyed and the session remains to create new streams + util.destroy(body, err) + client[kQueue][client[kRunningIdx]++] = null + client[kResume]() + } -/** - * The kFastTimer symbol is used to identify FastTimer instances. - * - * @type {Symbol} - */ -const kFastTimer = Symbol('kFastTimer') + try { + // We are already connected, streams are pending. + // We can call on connect, and wait for abort + request.onConnect(abort) + } catch (err) { + util.errorRequest(client, request, err) + } -/** - * The fastTimers array contains all active FastTimers. - * - * @type {FastTimer[]} - */ -const fastTimers = [] + if (request.aborted) { + return false + } -/** - * These constants represent the various states of a FastTimer. - */ + if (method === 'CONNECT') { + session.ref() + // We are already connected, streams are pending, first request + // will create a new stream. We trigger a request to create the stream and wait until + // `ready` event is triggered + // We disabled endStream to allow the user to write to the stream + stream = session.request(headers, { endStream: false, signal }) -/** - * The `NOT_IN_LIST` constant indicates that the FastTimer is not included - * in the `fastTimers` array. Timers with this status will not be processed - * during the next tick by the `onTick` function. - * - * A FastTimer can be re-added to the `fastTimers` array by invoking the - * `refresh` method on the FastTimer instance. - * - * @type {-2} - */ -const NOT_IN_LIST = -2 + if (stream.id && !stream.pending) { + request.onUpgrade(null, null, stream) + ++session[kOpenStreams] + client[kQueue][client[kRunningIdx]++] = null + } else { + stream.once('ready', () => { + request.onUpgrade(null, null, stream) + ++session[kOpenStreams] + client[kQueue][client[kRunningIdx]++] = null + }) + } -/** - * The `TO_BE_CLEARED` constant indicates that the FastTimer is scheduled - * for removal from the `fastTimers` array. A FastTimer in this state will - * be removed in the next tick by the `onTick` function and will no longer - * be processed. - * - * This status is also set when the `clear` method is called on the FastTimer instance. - * - * @type {-1} - */ -const TO_BE_CLEARED = -1 + stream.once('close', () => { + session[kOpenStreams] -= 1 + if (session[kOpenStreams] === 0) session.unref() + }) -/** - * The `PENDING` constant signifies that the FastTimer is awaiting processing - * in the next tick by the `onTick` function. Timers with this status will have - * their `_idleStart` value set and their status updated to `ACTIVE` in the next tick. - * - * @type {0} - */ -const PENDING = 0 + return true + } -/** - * The `ACTIVE` constant indicates that the FastTimer is active and waiting - * for its timer to expire. During the next tick, the `onTick` function will - * check if the timer has expired, and if so, it will execute the associated callback. - * - * @type {1} - */ -const ACTIVE = 1 + // https://tools.ietf.org/html/rfc7540#section-8.3 + // :path and :scheme headers must be omitted when sending CONNECT -/** - * The onTick function processes the fastTimers array. - * - * @returns {void} - */ -function onTick () { - /** - * Increment the fastNow value by the TICK_MS value, despite the actual time - * that has passed since the last tick. This approach ensures independence - * from the system clock and delays caused by a blocked event loop. - * - * @type {number} - */ - fastNow += TICK_MS + headers[HTTP2_HEADER_PATH] = path + headers[HTTP2_HEADER_SCHEME] = 'https' - /** - * The `idx` variable is used to iterate over the `fastTimers` array. - * Expired timers are removed by replacing them with the last element in the array. - * Consequently, `idx` is only incremented when the current element is not removed. - * - * @type {number} - */ - let idx = 0 + // https://tools.ietf.org/html/rfc7231#section-4.3.1 + // https://tools.ietf.org/html/rfc7231#section-4.3.2 + // https://tools.ietf.org/html/rfc7231#section-4.3.5 - /** - * The len variable will contain the length of the fastTimers array - * and will be decremented when a FastTimer should be removed from the - * fastTimers array. - * - * @type {number} - */ - let len = fastTimers.length + // Sending a payload body on a request that does not + // expect it can cause undefined behavior on some + // servers and corrupt connection state. Do not + // re-use the connection for further requests. - while (idx < len) { - /** - * @type {FastTimer} - */ - const timer = fastTimers[idx] + const expectsPayload = ( + method === 'PUT' || + method === 'POST' || + method === 'PATCH' + ) - // If the timer is in the ACTIVE state and the timer has expired, it will - // be processed in the next tick. - if (timer._state === PENDING) { - // Set the _idleStart value to the fastNow value minus the TICK_MS value - // to account for the time the timer was in the PENDING state. - timer._idleStart = fastNow - TICK_MS - timer._state = ACTIVE - } else if ( - timer._state === ACTIVE && - fastNow >= timer._idleStart + timer._idleTimeout - ) { - timer._state = TO_BE_CLEARED - timer._idleStart = -1 - timer._onTimeout(timer._timerArg) - } + if (body && typeof body.read === 'function') { + // Try to read EOF in order to get length. + body.read(0) + } - if (timer._state === TO_BE_CLEARED) { - timer._state = NOT_IN_LIST + let contentLength = util.bodyLength(body) - // Move the last element to the current index and decrement len if it is - // not the only element in the array. - if (--len !== 0) { - fastTimers[idx] = fastTimers[len] - } - } else { - ++idx - } - } + if (util.isFormDataLike(body)) { + extractBody ??= (__nccwpck_require__(4492).extractBody) - // Set the length of the fastTimers array to the new length and thus - // removing the excess FastTimers elements from the array. - fastTimers.length = len + const [bodyStream, contentType] = extractBody(body) + headers['content-type'] = contentType - // If there are still active FastTimers in the array, refresh the Timer. - // If there are no active FastTimers, the timer will be refreshed again - // when a new FastTimer is instantiated. - if (fastTimers.length !== 0) { - refreshTimeout() + body = bodyStream.stream + contentLength = bodyStream.length } -} - -function refreshTimeout () { - // If the fastNowTimeout is already set, refresh it. - if (fastNowTimeout) { - fastNowTimeout.refresh() - // fastNowTimeout is not instantiated yet, create a new Timer. - } else { - clearTimeout(fastNowTimeout) - fastNowTimeout = setTimeout(onTick, TICK_MS) - // If the Timer has an unref method, call it to allow the process to exit if - // there are no other active handles. - if (fastNowTimeout.unref) { - fastNowTimeout.unref() - } + if (contentLength == null) { + contentLength = request.contentLength } -} -/** - * The `FastTimer` class is a data structure designed to store and manage - * timer information. - */ -class FastTimer { - [kFastTimer] = true + if (contentLength === 0 || !expectsPayload) { + // https://tools.ietf.org/html/rfc7230#section-3.3.2 + // A user agent SHOULD NOT send a Content-Length header field when + // the request message does not contain a payload body and the method + // semantics do not anticipate such a body. - /** - * The state of the timer, which can be one of the following: - * - NOT_IN_LIST (-2) - * - TO_BE_CLEARED (-1) - * - PENDING (0) - * - ACTIVE (1) - * - * @type {-2|-1|0|1} - * @private - */ - _state = NOT_IN_LIST + contentLength = null + } - /** - * The number of milliseconds to wait before calling the callback. - * - * @type {number} - * @private - */ - _idleTimeout = -1 + // https://github.com/nodejs/undici/issues/2046 + // A user agent may send a Content-Length header with 0 value, this should be allowed. + if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength != null && request.contentLength !== contentLength) { + if (client[kStrictContentLength]) { + util.errorRequest(client, request, new RequestContentLengthMismatchError()) + return false + } - /** - * The time in milliseconds when the timer was started. This value is used to - * calculate when the timer should expire. - * - * @type {number} - * @default -1 - * @private - */ - _idleStart = -1 + process.emitWarning(new RequestContentLengthMismatchError()) + } - /** - * The function to be executed when the timer expires. - * @type {Function} - * @private - */ - _onTimeout + if (contentLength != null) { + assert(body, 'no body must not have content length') + headers[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}` + } - /** - * The argument to be passed to the callback when the timer expires. - * - * @type {*} - * @private - */ - _timerArg + session.ref() - /** - * @constructor - * @param {Function} callback A function to be executed after the timer - * expires. - * @param {number} delay The time, in milliseconds that the timer should wait - * before the specified function or code is executed. - * @param {*} arg - */ - constructor (callback, delay, arg) { - this._onTimeout = callback - this._idleTimeout = delay - this._timerArg = arg + const shouldEndStream = method === 'GET' || method === 'HEAD' || body === null + if (expectContinue) { + headers[HTTP2_HEADER_EXPECT] = '100-continue' + stream = session.request(headers, { endStream: shouldEndStream, signal }) - this.refresh() + stream.once('continue', writeBodyH2) + } else { + stream = session.request(headers, { + endStream: shouldEndStream, + signal + }) + writeBodyH2() } - /** - * Sets the timer's start time to the current time, and reschedules the timer - * to call its callback at the previously specified duration adjusted to the - * current time. - * Using this on a timer that has already called its callback will reactivate - * the timer. - * - * @returns {void} - */ - refresh () { - // In the special case that the timer is not in the list of active timers, - // add it back to the array to be processed in the next tick by the onTick - // function. - if (this._state === NOT_IN_LIST) { - fastTimers.push(this) + // Increment counter as we have new streams open + ++session[kOpenStreams] + + stream.once('response', headers => { + const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers + request.onResponseStarted() + + // Due to the stream nature, it is possible we face a race condition + // where the stream has been assigned, but the request has been aborted + // the request remains in-flight and headers hasn't been received yet + // for those scenarios, best effort is to destroy the stream immediately + // as there's no value to keep it open. + if (request.aborted) { + const err = new RequestAbortedError() + util.errorRequest(client, request, err) + util.destroy(stream, err) + return } - // If the timer is the only active timer, refresh the fastNowTimeout for - // better resolution. - if (!fastNowTimeout || fastTimers.length === 1) { - refreshTimeout() + if (request.onHeaders(Number(statusCode), parseH2Headers(realHeaders), stream.resume.bind(stream), '') === false) { + stream.pause() } - // Setting the state to PENDING will cause the timer to be reset in the - // next tick by the onTick function. - this._state = PENDING - } + stream.on('data', (chunk) => { + if (request.onData(chunk) === false) { + stream.pause() + } + }) + }) - /** - * The `clear` method cancels the timer, preventing it from executing. - * - * @returns {void} - * @private - */ - clear () { - // Set the state to TO_BE_CLEARED to mark the timer for removal in the next - // tick by the onTick function. - this._state = TO_BE_CLEARED + stream.once('end', () => { + // When state is null, it means we haven't consumed body and the stream still do not have + // a state. + // Present specially when using pipeline or stream + if (stream.state?.state == null || stream.state.state < 6) { + request.onComplete([]) + } - // Reset the _idleStart value to -1 to indicate that the timer is no longer - // active. - this._idleStart = -1 - } -} + if (session[kOpenStreams] === 0) { + // Stream is closed or half-closed-remote (6), decrement counter and cleanup + // It does not have sense to continue working with the stream as we do not + // have yet RST_STREAM support on client-side -/** - * This module exports a setTimeout and clearTimeout function that can be - * used as a drop-in replacement for the native functions. - */ -module.exports = { - /** - * The setTimeout() method sets a timer which executes a function once the - * timer expires. - * @param {Function} callback A function to be executed after the timer - * expires. - * @param {number} delay The time, in milliseconds that the timer should - * wait before the specified function or code is executed. - * @param {*} [arg] An optional argument to be passed to the callback function - * when the timer expires. - * @returns {NodeJS.Timeout|FastTimer} - */ - setTimeout (callback, delay, arg) { - // If the delay is less than or equal to the RESOLUTION_MS value return a - // native Node.js Timer instance. - return delay <= RESOLUTION_MS - ? setTimeout(callback, delay, arg) - : new FastTimer(callback, delay, arg) - }, - /** - * The clearTimeout method cancels an instantiated Timer previously created - * by calling setTimeout. - * - * @param {NodeJS.Timeout|FastTimer} timeout - */ - clearTimeout (timeout) { - // If the timeout is a FastTimer, call its own clear method. - if (timeout[kFastTimer]) { - /** - * @type {FastTimer} - */ - timeout.clear() - // Otherwise it is an instance of a native NodeJS.Timeout, so call the - // Node.js native clearTimeout function. - } else { - clearTimeout(timeout) + session.unref() } - }, - /** - * The setFastTimeout() method sets a fastTimer which executes a function once - * the timer expires. - * @param {Function} callback A function to be executed after the timer - * expires. - * @param {number} delay The time, in milliseconds that the timer should - * wait before the specified function or code is executed. - * @param {*} [arg] An optional argument to be passed to the callback function - * when the timer expires. - * @returns {FastTimer} - */ - setFastTimeout (callback, delay, arg) { - return new FastTimer(callback, delay, arg) - }, - /** - * The clearTimeout method cancels an instantiated FastTimer previously - * created by calling setFastTimeout. - * - * @param {FastTimer} timeout - */ - clearFastTimeout (timeout) { - timeout.clear() - }, - /** - * The now method returns the value of the internal fast timer clock. - * - * @returns {number} - */ - now () { - return fastNow - }, - /** - * Trigger the onTick function to process the fastTimers array. - * Exported for testing purposes only. - * Marking as deprecated to discourage any use outside of testing. - * @deprecated - * @param {number} [delay=0] The delay in milliseconds to add to the now value. - */ - tick (delay = 0) { - fastNow += delay - RESOLUTION_MS + 1 - onTick() - onTick() - }, - /** - * Reset FastTimers. - * Exported for testing purposes only. - * Marking as deprecated to discourage any use outside of testing. - * @deprecated - */ - reset () { - fastNow = 0 - fastTimers.length = 0 - clearTimeout(fastNowTimeout) - fastNowTimeout = null - }, - /** - * Exporting for testing purposes only. - * Marking as deprecated to discourage any use outside of testing. - * @deprecated - */ - kFastTimer -} + abort(new InformationalError('HTTP/2: stream half-closed (remote)')) + client[kQueue][client[kRunningIdx]++] = null + client[kPendingIdx] = client[kRunningIdx] + client[kResume]() + }) -/***/ }), + stream.once('close', () => { + session[kOpenStreams] -= 1 + if (session[kOpenStreams] === 0) { + session.unref() + } + }) -/***/ 9634: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + stream.once('error', function (err) { + abort(err) + }) + stream.once('frameError', (type, code) => { + abort(new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`)) + }) + // stream.on('aborted', () => { + // // TODO(HTTP/2): Support aborted + // }) -const { kConstruct } = __nccwpck_require__(109) -const { urlEquals, getFieldValues } = __nccwpck_require__(6798) -const { kEnumerableProperty, isDisturbed } = __nccwpck_require__(3440) -const { webidl } = __nccwpck_require__(5893) -const { Response, cloneResponse, fromInnerResponse } = __nccwpck_require__(9051) -const { Request, fromInnerRequest } = __nccwpck_require__(9967) -const { kState } = __nccwpck_require__(3627) -const { fetching } = __nccwpck_require__(4398) -const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = __nccwpck_require__(3168) -const assert = __nccwpck_require__(4589) + // stream.on('timeout', () => { + // // TODO(HTTP/2): Support timeout + // }) -/** - * @see https://w3c.github.io/ServiceWorker/#dfn-cache-batch-operation - * @typedef {Object} CacheBatchOperation - * @property {'delete' | 'put'} type - * @property {any} request - * @property {any} response - * @property {import('../../types/cache').CacheQueryOptions} options - */ + // stream.on('push', headers => { + // // TODO(HTTP/2): Support push + // }) -/** - * @see https://w3c.github.io/ServiceWorker/#dfn-request-response-list - * @typedef {[any, any][]} requestResponseList - */ + // stream.on('trailers', headers => { + // // TODO(HTTP/2): Support trailers + // }) -class Cache { - /** - * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-request-response-list - * @type {requestResponseList} - */ - #relevantRequestResponseList + return true - constructor () { - if (arguments[0] !== kConstruct) { - webidl.illegalConstructor() + function writeBodyH2 () { + /* istanbul ignore else: assertion */ + if (!body || contentLength === 0) { + writeBuffer( + abort, + stream, + null, + client, + request, + client[kSocket], + contentLength, + expectsPayload + ) + } else if (util.isBuffer(body)) { + writeBuffer( + abort, + stream, + body, + client, + request, + client[kSocket], + contentLength, + expectsPayload + ) + } else if (util.isBlobLike(body)) { + if (typeof body.stream === 'function') { + writeIterable( + abort, + stream, + body.stream(), + client, + request, + client[kSocket], + contentLength, + expectsPayload + ) + } else { + writeBlob( + abort, + stream, + body, + client, + request, + client[kSocket], + contentLength, + expectsPayload + ) + } + } else if (util.isStream(body)) { + writeStream( + abort, + client[kSocket], + expectsPayload, + stream, + body, + client, + request, + contentLength + ) + } else if (util.isIterable(body)) { + writeIterable( + abort, + stream, + body, + client, + request, + client[kSocket], + contentLength, + expectsPayload + ) + } else { + assert(false) } - - webidl.util.markAsUncloneable(this) - this.#relevantRequestResponseList = arguments[1] } +} - async match (request, options = {}) { - webidl.brandCheck(this, Cache) - - const prefix = 'Cache.match' - webidl.argumentLengthCheck(arguments, 1, prefix) - - request = webidl.converters.RequestInfo(request, prefix, 'request') - options = webidl.converters.CacheQueryOptions(options, prefix, 'options') +function writeBuffer (abort, h2stream, body, client, request, socket, contentLength, expectsPayload) { + try { + if (body != null && util.isBuffer(body)) { + assert(contentLength === body.byteLength, 'buffer body must have content length') + h2stream.cork() + h2stream.write(body) + h2stream.uncork() + h2stream.end() - const p = this.#internalMatchAll(request, options, 1) + request.onBodySent(body) + } - if (p.length === 0) { - return + if (!expectsPayload) { + socket[kReset] = true } - return p[0] + request.onRequestSent() + client[kResume]() + } catch (error) { + abort(error) } +} - async matchAll (request = undefined, options = {}) { - webidl.brandCheck(this, Cache) +function writeStream (abort, socket, expectsPayload, h2stream, body, client, request, contentLength) { + assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined') - const prefix = 'Cache.matchAll' - if (request !== undefined) request = webidl.converters.RequestInfo(request, prefix, 'request') - options = webidl.converters.CacheQueryOptions(options, prefix, 'options') + // For HTTP/2, is enough to pipe the stream + const pipe = pipeline( + body, + h2stream, + (err) => { + if (err) { + util.destroy(pipe, err) + abort(err) + } else { + util.removeAllListeners(pipe) + request.onRequestSent() - return this.#internalMatchAll(request, options) + if (!expectsPayload) { + socket[kReset] = true + } + + client[kResume]() + } + } + ) + + util.addListener(pipe, 'data', onPipeData) + + function onPipeData (chunk) { + request.onBodySent(chunk) } +} - async add (request) { - webidl.brandCheck(this, Cache) +async function writeBlob (abort, h2stream, body, client, request, socket, contentLength, expectsPayload) { + assert(contentLength === body.size, 'blob body must have content length') - const prefix = 'Cache.add' - webidl.argumentLengthCheck(arguments, 1, prefix) + try { + if (contentLength != null && contentLength !== body.size) { + throw new RequestContentLengthMismatchError() + } - request = webidl.converters.RequestInfo(request, prefix, 'request') + const buffer = Buffer.from(await body.arrayBuffer()) - // 1. - const requests = [request] + h2stream.cork() + h2stream.write(buffer) + h2stream.uncork() + h2stream.end() - // 2. - const responseArrayPromise = this.addAll(requests) + request.onBodySent(buffer) + request.onRequestSent() - // 3. - return await responseArrayPromise + if (!expectsPayload) { + socket[kReset] = true + } + + client[kResume]() + } catch (err) { + abort(err) } +} - async addAll (requests) { - webidl.brandCheck(this, Cache) +async function writeIterable (abort, h2stream, body, client, request, socket, contentLength, expectsPayload) { + assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined') - const prefix = 'Cache.addAll' - webidl.argumentLengthCheck(arguments, 1, prefix) + let callback = null + function onDrain () { + if (callback) { + const cb = callback + callback = null + cb() + } + } - // 1. - const responsePromises = [] + const waitForDrain = () => new Promise((resolve, reject) => { + assert(callback === null) - // 2. - const requestList = [] + if (socket[kError]) { + reject(socket[kError]) + } else { + callback = resolve + } + }) - // 3. - for (let request of requests) { - if (request === undefined) { - throw webidl.errors.conversionFailed({ - prefix, - argument: 'Argument 1', - types: ['undefined is not allowed'] - }) - } + h2stream + .on('close', onDrain) + .on('drain', onDrain) - request = webidl.converters.RequestInfo(request) + try { + // It's up to the user to somehow abort the async iterable. + for await (const chunk of body) { + if (socket[kError]) { + throw socket[kError] + } - if (typeof request === 'string') { - continue + const res = h2stream.write(chunk) + request.onBodySent(chunk) + if (!res) { + await waitForDrain() } + } - // 3.1 - const r = request[kState] + h2stream.end() - // 3.2 - if (!urlIsHttpHttpsScheme(r.url) || r.method !== 'GET') { - throw webidl.errors.exception({ - header: prefix, - message: 'Expected http/s scheme when method is not GET.' - }) - } + request.onRequestSent() + + if (!expectsPayload) { + socket[kReset] = true } - // 4. - /** @type {ReturnType []} */ - const fetchControllers = [] + client[kResume]() + } catch (err) { + abort(err) + } finally { + h2stream + .off('close', onDrain) + .off('drain', onDrain) + } +} - // 5. - for (const request of requests) { - // 5.1 - const r = new Request(request)[kState] +module.exports = connectH2 + + +/***/ }), + +/***/ 3701: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - // 5.2 - if (!urlIsHttpHttpsScheme(r.url)) { - throw webidl.errors.exception({ - header: prefix, - message: 'Expected http/s scheme.' - }) - } +// @ts-check - // 5.4 - r.initiator = 'fetch' - r.destination = 'subresource' - // 5.5 - requestList.push(r) - // 5.6 - const responsePromise = createDeferredPromise() +const assert = __nccwpck_require__(4589) +const net = __nccwpck_require__(7030) +const http = __nccwpck_require__(7067) +const util = __nccwpck_require__(3440) +const { channels } = __nccwpck_require__(2414) +const Request = __nccwpck_require__(4655) +const DispatcherBase = __nccwpck_require__(1841) +const { + InvalidArgumentError, + InformationalError, + ClientDestroyedError +} = __nccwpck_require__(8707) +const buildConnector = __nccwpck_require__(9136) +const { + kUrl, + kServerName, + kClient, + kBusy, + kConnect, + kResuming, + kRunning, + kPending, + kSize, + kQueue, + kConnected, + kConnecting, + kNeedDrain, + kKeepAliveDefaultTimeout, + kHostHeader, + kPendingIdx, + kRunningIdx, + kError, + kPipelining, + kKeepAliveTimeoutValue, + kMaxHeadersSize, + kKeepAliveMaxTimeout, + kKeepAliveTimeoutThreshold, + kHeadersTimeout, + kBodyTimeout, + kStrictContentLength, + kConnector, + kMaxRedirections, + kMaxRequests, + kCounter, + kClose, + kDestroy, + kDispatch, + kInterceptors, + kLocalAddress, + kMaxResponseSize, + kOnError, + kHTTPContext, + kMaxConcurrentStreams, + kResume +} = __nccwpck_require__(6443) +const connectH1 = __nccwpck_require__(637) +const connectH2 = __nccwpck_require__(8788) +let deprecatedInterceptorWarned = false - // 5.7 - fetchControllers.push(fetching({ - request: r, - processResponse (response) { - // 1. - if (response.type === 'error' || response.status === 206 || response.status < 200 || response.status > 299) { - responsePromise.reject(webidl.errors.exception({ - header: 'Cache.addAll', - message: 'Received an invalid status code or the request failed.' - })) - } else if (response.headersList.contains('vary')) { // 2. - // 2.1 - const fieldValues = getFieldValues(response.headersList.get('vary')) +const kClosedResolve = Symbol('kClosedResolve') - // 2.2 - for (const fieldValue of fieldValues) { - // 2.2.1 - if (fieldValue === '*') { - responsePromise.reject(webidl.errors.exception({ - header: 'Cache.addAll', - message: 'invalid vary field value' - })) +const noop = () => {} - for (const controller of fetchControllers) { - controller.abort() - } +function getPipelining (client) { + return client[kPipelining] ?? client[kHTTPContext]?.defaultPipelining ?? 1 +} - return - } - } - } - }, - processResponseEndOfBody (response) { - // 1. - if (response.aborted) { - responsePromise.reject(new DOMException('aborted', 'AbortError')) - return - } +/** + * @type {import('../../types/client.js').default} + */ +class Client extends DispatcherBase { + /** + * + * @param {string|URL} url + * @param {import('../../types/client.js').Client.Options} options + */ + constructor (url, { + interceptors, + maxHeaderSize, + headersTimeout, + socketTimeout, + requestTimeout, + connectTimeout, + bodyTimeout, + idleTimeout, + keepAlive, + keepAliveTimeout, + maxKeepAliveTimeout, + keepAliveMaxTimeout, + keepAliveTimeoutThreshold, + socketPath, + pipelining, + tls, + strictContentLength, + maxCachedSessions, + maxRedirections, + connect, + maxRequestsPerClient, + localAddress, + maxResponseSize, + autoSelectFamily, + autoSelectFamilyAttemptTimeout, + // h2 + maxConcurrentStreams, + allowH2, + webSocket + } = {}) { + super({ webSocket }) - // 2. - responsePromise.resolve(response) - } - })) + if (keepAlive !== undefined) { + throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead') + } - // 5.8 - responsePromises.push(responsePromise.promise) + if (socketTimeout !== undefined) { + throw new InvalidArgumentError('unsupported socketTimeout, use headersTimeout & bodyTimeout instead') } - // 6. - const p = Promise.all(responsePromises) + if (requestTimeout !== undefined) { + throw new InvalidArgumentError('unsupported requestTimeout, use headersTimeout & bodyTimeout instead') + } - // 7. - const responses = await p + if (idleTimeout !== undefined) { + throw new InvalidArgumentError('unsupported idleTimeout, use keepAliveTimeout instead') + } - // 7.1 - const operations = [] + if (maxKeepAliveTimeout !== undefined) { + throw new InvalidArgumentError('unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead') + } - // 7.2 - let index = 0 + if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) { + throw new InvalidArgumentError('invalid maxHeaderSize') + } - // 7.3 - for (const response of responses) { - // 7.3.1 - /** @type {CacheBatchOperation} */ - const operation = { - type: 'put', // 7.3.2 - request: requestList[index], // 7.3.3 - response // 7.3.4 - } + if (socketPath != null && typeof socketPath !== 'string') { + throw new InvalidArgumentError('invalid socketPath') + } - operations.push(operation) // 7.3.5 + if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) { + throw new InvalidArgumentError('invalid connectTimeout') + } - index++ // 7.3.6 + if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) { + throw new InvalidArgumentError('invalid keepAliveTimeout') } - // 7.5 - const cacheJobPromise = createDeferredPromise() + if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) { + throw new InvalidArgumentError('invalid keepAliveMaxTimeout') + } - // 7.6.1 - let errorData = null + if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) { + throw new InvalidArgumentError('invalid keepAliveTimeoutThreshold') + } - // 7.6.2 - try { - this.#batchCacheOperations(operations) - } catch (e) { - errorData = e + if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) { + throw new InvalidArgumentError('headersTimeout must be a positive integer or zero') } - // 7.6.3 - queueMicrotask(() => { - // 7.6.3.1 - if (errorData === null) { - cacheJobPromise.resolve(undefined) - } else { - // 7.6.3.2 - cacheJobPromise.reject(errorData) - } - }) + if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) { + throw new InvalidArgumentError('bodyTimeout must be a positive integer or zero') + } - // 7.7 - return cacheJobPromise.promise - } + if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { + throw new InvalidArgumentError('connect must be a function or an object') + } - async put (request, response) { - webidl.brandCheck(this, Cache) + if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { + throw new InvalidArgumentError('maxRedirections must be a positive number') + } - const prefix = 'Cache.put' - webidl.argumentLengthCheck(arguments, 2, prefix) + if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) { + throw new InvalidArgumentError('maxRequestsPerClient must be a positive number') + } - request = webidl.converters.RequestInfo(request, prefix, 'request') - response = webidl.converters.Response(response, prefix, 'response') + if (localAddress != null && (typeof localAddress !== 'string' || net.isIP(localAddress) === 0)) { + throw new InvalidArgumentError('localAddress must be valid string IP address') + } - // 1. - let innerRequest = null + if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) { + throw new InvalidArgumentError('maxResponseSize must be a positive number') + } - // 2. - if (request instanceof Request) { - innerRequest = request[kState] - } else { // 3. - innerRequest = new Request(request)[kState] + if ( + autoSelectFamilyAttemptTimeout != null && + (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1) + ) { + throw new InvalidArgumentError('autoSelectFamilyAttemptTimeout must be a positive number') } - // 4. - if (!urlIsHttpHttpsScheme(innerRequest.url) || innerRequest.method !== 'GET') { - throw webidl.errors.exception({ - header: prefix, - message: 'Expected an http/s scheme when method is not GET' - }) + // h2 + if (allowH2 != null && typeof allowH2 !== 'boolean') { + throw new InvalidArgumentError('allowH2 must be a valid boolean value') } - // 5. - const innerResponse = response[kState] + if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== 'number' || maxConcurrentStreams < 1)) { + throw new InvalidArgumentError('maxConcurrentStreams must be a positive integer, greater than 0') + } - // 6. - if (innerResponse.status === 206) { - throw webidl.errors.exception({ - header: prefix, - message: 'Got 206 status' + if (typeof connect !== 'function') { + connect = buildConnector({ + ...tls, + maxCachedSessions, + allowH2, + socketPath, + timeout: connectTimeout, + ...(autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined), + ...connect }) } - // 7. - if (innerResponse.headersList.contains('vary')) { - // 7.1. - const fieldValues = getFieldValues(innerResponse.headersList.get('vary')) - - // 7.2. - for (const fieldValue of fieldValues) { - // 7.2.1 - if (fieldValue === '*') { - throw webidl.errors.exception({ - header: prefix, - message: 'Got * vary field value' - }) - } + if (interceptors?.Client && Array.isArray(interceptors.Client)) { + this[kInterceptors] = interceptors.Client + if (!deprecatedInterceptorWarned) { + deprecatedInterceptorWarned = true + process.emitWarning('Client.Options#interceptor is deprecated. Use Dispatcher#compose instead.', { + code: 'UNDICI-CLIENT-INTERCEPTOR-DEPRECATED' + }) } + } else { + this[kInterceptors] = [createRedirectInterceptor({ maxRedirections })] } - // 8. - if (innerResponse.body && (isDisturbed(innerResponse.body.stream) || innerResponse.body.stream.locked)) { - throw webidl.errors.exception({ - header: prefix, - message: 'Response body is locked or disturbed' - }) - } + this[kUrl] = util.parseOrigin(url) + this[kConnector] = connect + this[kPipelining] = pipelining != null ? pipelining : 1 + this[kMaxHeadersSize] = maxHeaderSize || http.maxHeaderSize + this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout + this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 600e3 : keepAliveMaxTimeout + this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 2e3 : keepAliveTimeoutThreshold + this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout] + this[kServerName] = null + this[kLocalAddress] = localAddress != null ? localAddress : null + this[kResuming] = 0 // 0, idle, 1, scheduled, 2 resuming + this[kNeedDrain] = 0 // 0, idle, 1, scheduled, 2 resuming + this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}\r\n` + this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 300e3 + this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 300e3 + this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength + this[kMaxRedirections] = maxRedirections + this[kMaxRequests] = maxRequestsPerClient + this[kClosedResolve] = null + this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1 + this[kMaxConcurrentStreams] = maxConcurrentStreams != null ? maxConcurrentStreams : 100 // Max peerConcurrentStreams for a Node h2 server + this[kHTTPContext] = null - // 9. - const clonedResponse = cloneResponse(innerResponse) + // kQueue is built up of 3 sections separated by + // the kRunningIdx and kPendingIdx indices. + // | complete | running | pending | + // ^ kRunningIdx ^ kPendingIdx ^ kQueue.length + // kRunningIdx points to the first running element. + // kPendingIdx points to the first pending element. + // This implements a fast queue with an amortized + // time of O(1). - // 10. - const bodyReadPromise = createDeferredPromise() + this[kQueue] = [] + this[kRunningIdx] = 0 + this[kPendingIdx] = 0 - // 11. - if (innerResponse.body != null) { - // 11.1 - const stream = innerResponse.body.stream + this[kResume] = (sync) => resume(this, sync) + this[kOnError] = (err) => onError(this, err) + } - // 11.2 - const reader = stream.getReader() + get pipelining () { + return this[kPipelining] + } - // 11.3 - readAllBytes(reader).then(bodyReadPromise.resolve, bodyReadPromise.reject) - } else { - bodyReadPromise.resolve(undefined) - } + set pipelining (value) { + this[kPipelining] = value + this[kResume](true) + } - // 12. - /** @type {CacheBatchOperation[]} */ - const operations = [] + get [kPending] () { + return this[kQueue].length - this[kPendingIdx] + } - // 13. - /** @type {CacheBatchOperation} */ - const operation = { - type: 'put', // 14. - request: innerRequest, // 15. - response: clonedResponse // 16. - } + get [kRunning] () { + return this[kPendingIdx] - this[kRunningIdx] + } - // 17. - operations.push(operation) + get [kSize] () { + return this[kQueue].length - this[kRunningIdx] + } - // 19. - const bytes = await bodyReadPromise.promise + get [kConnected] () { + return !!this[kHTTPContext] && !this[kConnecting] && !this[kHTTPContext].destroyed + } - if (clonedResponse.body != null) { - clonedResponse.body.source = bytes - } + get [kBusy] () { + return Boolean( + this[kHTTPContext]?.busy(null) || + (this[kSize] >= (getPipelining(this) || 1)) || + this[kPending] > 0 + ) + } - // 19.1 - const cacheJobPromise = createDeferredPromise() + /* istanbul ignore: only used for test */ + [kConnect] (cb) { + connect(this) + this.once('connect', cb) + } - // 19.2.1 - let errorData = null + [kDispatch] (opts, handler) { + const origin = opts.origin || this[kUrl].origin + const request = new Request(origin, opts, handler) - // 19.2.2 - try { - this.#batchCacheOperations(operations) - } catch (e) { - errorData = e + this[kQueue].push(request) + if (this[kResuming]) { + // Do nothing. + } else if (util.bodyLength(request.body) == null && util.isIterable(request.body)) { + // Wait a tick in case stream/iterator is ended in the same tick. + this[kResuming] = 1 + queueMicrotask(() => resume(this)) + } else { + this[kResume](true) } - // 19.2.3 - queueMicrotask(() => { - // 19.2.3.1 - if (errorData === null) { - cacheJobPromise.resolve() - } else { // 19.2.3.2 - cacheJobPromise.reject(errorData) + if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) { + this[kNeedDrain] = 2 + } + + return this[kNeedDrain] < 2 + } + + async [kClose] () { + // TODO: for H2 we need to gracefully flush the remaining enqueued + // request and close each stream. + return new Promise((resolve) => { + if (this[kSize]) { + this[kClosedResolve] = resolve + } else { + resolve(null) } }) - - return cacheJobPromise.promise } - async delete (request, options = {}) { - webidl.brandCheck(this, Cache) + async [kDestroy] (err) { + return new Promise((resolve) => { + const requests = this[kQueue].splice(this[kPendingIdx]) + for (let i = 0; i < requests.length; i++) { + const request = requests[i] + util.errorRequest(this, request, err) + } - const prefix = 'Cache.delete' - webidl.argumentLengthCheck(arguments, 1, prefix) + const callback = () => { + if (this[kClosedResolve]) { + // TODO (fix): Should we error here with ClientDestroyedError? + this[kClosedResolve]() + this[kClosedResolve] = null + } + resolve(null) + } - request = webidl.converters.RequestInfo(request, prefix, 'request') - options = webidl.converters.CacheQueryOptions(options, prefix, 'options') + if (this[kHTTPContext]) { + this[kHTTPContext].destroy(err, callback) + this[kHTTPContext] = null + } else { + queueMicrotask(callback) + } - /** - * @type {Request} - */ - let r = null + this[kResume]() + }) + } +} + +const createRedirectInterceptor = __nccwpck_require__(5092) + +function onError (client, err) { + if ( + client[kRunning] === 0 && + err.code !== 'UND_ERR_INFO' && + err.code !== 'UND_ERR_SOCKET' + ) { + // Error is not caused by running request and not a recoverable + // socket error. - if (request instanceof Request) { - r = request[kState] + assert(client[kPendingIdx] === client[kRunningIdx]) - if (r.method !== 'GET' && !options.ignoreMethod) { - return false - } - } else { - assert(typeof request === 'string') + const requests = client[kQueue].splice(client[kRunningIdx]) - r = new Request(request)[kState] + for (let i = 0; i < requests.length; i++) { + const request = requests[i] + util.errorRequest(client, request, err) } + assert(client[kSize] === 0) + } +} - /** @type {CacheBatchOperation[]} */ - const operations = [] +/** + * @param {Client} client + * @returns + */ +async function connect (client) { + assert(!client[kConnecting]) + assert(!client[kHTTPContext]) - /** @type {CacheBatchOperation} */ - const operation = { - type: 'delete', - request: r, - options - } + let { host, hostname, protocol, port } = client[kUrl] - operations.push(operation) + // Resolve ipv6 + if (hostname[0] === '[') { + const idx = hostname.indexOf(']') - const cacheJobPromise = createDeferredPromise() + assert(idx !== -1) + const ip = hostname.substring(1, idx) - let errorData = null - let requestResponses + assert(net.isIP(ip)) + hostname = ip + } - try { - requestResponses = this.#batchCacheOperations(operations) - } catch (e) { - errorData = e - } + client[kConnecting] = true - queueMicrotask(() => { - if (errorData === null) { - cacheJobPromise.resolve(!!requestResponses?.length) - } else { - cacheJobPromise.reject(errorData) - } + if (channels.beforeConnect.hasSubscribers) { + channels.beforeConnect.publish({ + connectParams: { + host, + hostname, + protocol, + port, + version: client[kHTTPContext]?.version, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, + connector: client[kConnector] }) - - return cacheJobPromise.promise } - /** - * @see https://w3c.github.io/ServiceWorker/#dom-cache-keys - * @param {any} request - * @param {import('../../types/cache').CacheQueryOptions} options - * @returns {Promise } - */ - async keys (request = undefined, options = {}) { - webidl.brandCheck(this, Cache) + try { + const socket = await new Promise((resolve, reject) => { + client[kConnector]({ + host, + hostname, + protocol, + port, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, (err, socket) => { + if (err) { + reject(err) + } else { + resolve(socket) + } + }) + }) - const prefix = 'Cache.keys' + if (client.destroyed) { + util.destroy(socket.on('error', noop), new ClientDestroyedError()) + return + } - if (request !== undefined) request = webidl.converters.RequestInfo(request, prefix, 'request') - options = webidl.converters.CacheQueryOptions(options, prefix, 'options') + assert(socket) - // 1. - let r = null + try { + client[kHTTPContext] = socket.alpnProtocol === 'h2' + ? await connectH2(client, socket) + : await connectH1(client, socket) + } catch (err) { + socket.destroy().on('error', noop) + throw err + } - // 2. - if (request !== undefined) { - // 2.1 - if (request instanceof Request) { - // 2.1.1 - r = request[kState] + client[kConnecting] = false - // 2.1.2 - if (r.method !== 'GET' && !options.ignoreMethod) { - return [] - } - } else if (typeof request === 'string') { // 2.2 - r = new Request(request)[kState] - } - } + socket[kCounter] = 0 + socket[kMaxRequests] = client[kMaxRequests] + socket[kClient] = client + socket[kError] = null - // 4. - const promise = createDeferredPromise() + if (channels.connected.hasSubscribers) { + channels.connected.publish({ + connectParams: { + host, + hostname, + protocol, + port, + version: client[kHTTPContext]?.version, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, + connector: client[kConnector], + socket + }) + } + client.emit('connect', client[kUrl], [client]) + } catch (err) { + if (client.destroyed) { + return + } - // 5. - // 5.1 - const requests = [] + client[kConnecting] = false - // 5.2 - if (request === undefined) { - // 5.2.1 - for (const requestResponse of this.#relevantRequestResponseList) { - // 5.2.1.1 - requests.push(requestResponse[0]) - } - } else { // 5.3 - // 5.3.1 - const requestResponses = this.#queryCache(r, options) + if (channels.connectError.hasSubscribers) { + channels.connectError.publish({ + connectParams: { + host, + hostname, + protocol, + port, + version: client[kHTTPContext]?.version, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, + connector: client[kConnector], + error: err + }) + } - // 5.3.2 - for (const requestResponse of requestResponses) { - // 5.3.2.1 - requests.push(requestResponse[0]) + if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') { + assert(client[kRunning] === 0) + while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) { + const request = client[kQueue][client[kPendingIdx]++] + util.errorRequest(client, request, err) } + } else { + onError(client, err) } - // 5.4 - queueMicrotask(() => { - // 5.4.1 - const requestList = [] + client.emit('connectionError', client[kUrl], [client], err) + } - // 5.4.2 - for (const request of requests) { - const requestObject = fromInnerRequest( - request, - new AbortController().signal, - 'immutable' - ) - // 5.4.2.1 - requestList.push(requestObject) - } + client[kResume]() +} - // 5.4.3 - promise.resolve(Object.freeze(requestList)) - }) +function emitDrain (client) { + client[kNeedDrain] = 0 + client.emit('drain', client[kUrl], [client]) +} - return promise.promise +function resume (client, sync) { + if (client[kResuming] === 2) { + return } - /** - * @see https://w3c.github.io/ServiceWorker/#batch-cache-operations-algorithm - * @param {CacheBatchOperation[]} operations - * @returns {requestResponseList} - */ - #batchCacheOperations (operations) { - // 1. - const cache = this.#relevantRequestResponseList + client[kResuming] = 2 - // 2. - const backupCache = [...cache] + _resume(client, sync) + client[kResuming] = 0 - // 3. - const addedItems = [] + if (client[kRunningIdx] > 256) { + client[kQueue].splice(0, client[kRunningIdx]) + client[kPendingIdx] -= client[kRunningIdx] + client[kRunningIdx] = 0 + } +} - // 4.1 - const resultList = [] +function _resume (client, sync) { + while (true) { + if (client.destroyed) { + assert(client[kPending] === 0) + return + } - try { - // 4.2 - for (const operation of operations) { - // 4.2.1 - if (operation.type !== 'delete' && operation.type !== 'put') { - throw webidl.errors.exception({ - header: 'Cache.#batchCacheOperations', - message: 'operation type does not match "delete" or "put"' - }) - } + if (client[kClosedResolve] && !client[kSize]) { + client[kClosedResolve]() + client[kClosedResolve] = null + return + } - // 4.2.2 - if (operation.type === 'delete' && operation.response != null) { - throw webidl.errors.exception({ - header: 'Cache.#batchCacheOperations', - message: 'delete operation should not have an associated response' - }) - } + if (client[kHTTPContext]) { + client[kHTTPContext].resume() + } - // 4.2.3 - if (this.#queryCache(operation.request, operation.options, addedItems).length) { - throw new DOMException('???', 'InvalidStateError') - } + if (client[kBusy]) { + client[kNeedDrain] = 2 + } else if (client[kNeedDrain] === 2) { + if (sync) { + client[kNeedDrain] = 1 + queueMicrotask(() => emitDrain(client)) + } else { + emitDrain(client) + } + continue + } - // 4.2.4 - let requestResponses + if (client[kPending] === 0) { + return + } - // 4.2.5 - if (operation.type === 'delete') { - // 4.2.5.1 - requestResponses = this.#queryCache(operation.request, operation.options) + if (client[kRunning] >= (getPipelining(client) || 1)) { + return + } - // TODO: the spec is wrong, this is needed to pass WPTs - if (requestResponses.length === 0) { - return [] - } + const request = client[kQueue][client[kPendingIdx]] - // 4.2.5.2 - for (const requestResponse of requestResponses) { - const idx = cache.indexOf(requestResponse) - assert(idx !== -1) + if (client[kUrl].protocol === 'https:' && client[kServerName] !== request.servername) { + if (client[kRunning] > 0) { + return + } - // 4.2.5.2.1 - cache.splice(idx, 1) - } - } else if (operation.type === 'put') { // 4.2.6 - // 4.2.6.1 - if (operation.response == null) { - throw webidl.errors.exception({ - header: 'Cache.#batchCacheOperations', - message: 'put operation should have an associated response' - }) - } + client[kServerName] = request.servername + client[kHTTPContext]?.destroy(new InformationalError('servername changed'), () => { + client[kHTTPContext] = null + resume(client) + }) + } - // 4.2.6.2 - const r = operation.request + if (client[kConnecting]) { + return + } - // 4.2.6.3 - if (!urlIsHttpHttpsScheme(r.url)) { - throw webidl.errors.exception({ - header: 'Cache.#batchCacheOperations', - message: 'expected http or https scheme' - }) - } + if (!client[kHTTPContext]) { + connect(client) + return + } - // 4.2.6.4 - if (r.method !== 'GET') { - throw webidl.errors.exception({ - header: 'Cache.#batchCacheOperations', - message: 'not get method' - }) - } + if (client[kHTTPContext].destroyed) { + return + } - // 4.2.6.5 - if (operation.options != null) { - throw webidl.errors.exception({ - header: 'Cache.#batchCacheOperations', - message: 'options must not be defined' - }) - } + if (client[kHTTPContext].busy(request)) { + return + } - // 4.2.6.6 - requestResponses = this.#queryCache(operation.request) + if (!request.aborted && client[kHTTPContext].write(request)) { + client[kPendingIdx]++ + } else { + client[kQueue].splice(client[kPendingIdx], 1) + } + } +} - // 4.2.6.7 - for (const requestResponse of requestResponses) { - const idx = cache.indexOf(requestResponse) - assert(idx !== -1) +module.exports = Client - // 4.2.6.7.1 - cache.splice(idx, 1) - } - // 4.2.6.8 - cache.push([operation.request, operation.response]) +/***/ }), - // 4.2.6.10 - addedItems.push([operation.request, operation.response]) - } +/***/ 1841: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - // 4.2.7 - resultList.push([operation.request, operation.response]) - } - // 4.3 - return resultList - } catch (e) { // 5. - // 5.1 - this.#relevantRequestResponseList.length = 0 - // 5.2 - this.#relevantRequestResponseList = backupCache +const Dispatcher = __nccwpck_require__(883) +const { + ClientDestroyedError, + ClientClosedError, + InvalidArgumentError +} = __nccwpck_require__(8707) +const { kDestroy, kClose, kClosed, kDestroyed, kDispatch, kInterceptors } = __nccwpck_require__(6443) - // 5.3 - throw e - } - } +const kOnDestroyed = Symbol('onDestroyed') +const kOnClosed = Symbol('onClosed') +const kInterceptedDispatch = Symbol('Intercepted Dispatch') +const kWebSocketOptions = Symbol('webSocketOptions') - /** - * @see https://w3c.github.io/ServiceWorker/#query-cache - * @param {any} requestQuery - * @param {import('../../types/cache').CacheQueryOptions} options - * @param {requestResponseList} targetStorage - * @returns {requestResponseList} - */ - #queryCache (requestQuery, options, targetStorage) { - /** @type {requestResponseList} */ - const resultList = [] +class DispatcherBase extends Dispatcher { + constructor (opts) { + super() - const storage = targetStorage ?? this.#relevantRequestResponseList + this[kDestroyed] = false + this[kOnDestroyed] = null + this[kClosed] = false + this[kOnClosed] = [] + this[kWebSocketOptions] = opts?.webSocket ?? {} + } - for (const requestResponse of storage) { - const [cachedRequest, cachedResponse] = requestResponse - if (this.#requestMatchesCachedItem(requestQuery, cachedRequest, cachedResponse, options)) { - resultList.push(requestResponse) - } + get webSocketOptions () { + return { + maxFragments: this[kWebSocketOptions].maxFragments ?? 131072, + maxPayloadSize: this[kWebSocketOptions].maxPayloadSize ?? 128 * 1024 * 1024 } - - return resultList } - /** - * @see https://w3c.github.io/ServiceWorker/#request-matches-cached-item-algorithm - * @param {any} requestQuery - * @param {any} request - * @param {any | null} response - * @param {import('../../types/cache').CacheQueryOptions | undefined} options - * @returns {boolean} - */ - #requestMatchesCachedItem (requestQuery, request, response = null, options) { - // if (options?.ignoreMethod === false && request.method === 'GET') { - // return false - // } - - const queryURL = new URL(requestQuery.url) + get destroyed () { + return this[kDestroyed] + } - const cachedURL = new URL(request.url) + get closed () { + return this[kClosed] + } - if (options?.ignoreSearch) { - cachedURL.search = '' + get interceptors () { + return this[kInterceptors] + } - queryURL.search = '' + set interceptors (newInterceptors) { + if (newInterceptors) { + for (let i = newInterceptors.length - 1; i >= 0; i--) { + const interceptor = this[kInterceptors][i] + if (typeof interceptor !== 'function') { + throw new InvalidArgumentError('interceptor must be an function') + } + } } - if (!urlEquals(queryURL, cachedURL, true)) { - return false + this[kInterceptors] = newInterceptors + } + + close (callback) { + if (callback === undefined) { + return new Promise((resolve, reject) => { + this.close((err, data) => { + return err ? reject(err) : resolve(data) + }) + }) } - if ( - response == null || - options?.ignoreVary || - !response.headersList.contains('vary') - ) { - return true + if (typeof callback !== 'function') { + throw new InvalidArgumentError('invalid callback') } - const fieldValues = getFieldValues(response.headersList.get('vary')) + if (this[kDestroyed]) { + queueMicrotask(() => callback(new ClientDestroyedError(), null)) + return + } - for (const fieldValue of fieldValues) { - if (fieldValue === '*') { - return false + if (this[kClosed]) { + if (this[kOnClosed]) { + this[kOnClosed].push(callback) + } else { + queueMicrotask(() => callback(null, null)) } + return + } - const requestValue = request.headersList.get(fieldValue) - const queryValue = requestQuery.headersList.get(fieldValue) + this[kClosed] = true + this[kOnClosed].push(callback) - // If one has the header and the other doesn't, or one has - // a different value than the other, return false - if (requestValue !== queryValue) { - return false + const onClosed = () => { + const callbacks = this[kOnClosed] + this[kOnClosed] = null + for (let i = 0; i < callbacks.length; i++) { + callbacks[i](null, null) } } - return true + // Should not error. + this[kClose]() + .then(() => this.destroy()) + .then(() => { + queueMicrotask(onClosed) + }) } - #internalMatchAll (request, options, maxResponses = Infinity) { - // 1. - let r = null - - // 2. - if (request !== undefined) { - if (request instanceof Request) { - // 2.1.1 - r = request[kState] - - // 2.1.2 - if (r.method !== 'GET' && !options.ignoreMethod) { - return [] - } - } else if (typeof request === 'string') { - // 2.2.1 - r = new Request(request)[kState] - } + destroy (err, callback) { + if (typeof err === 'function') { + callback = err + err = null } - // 5. - // 5.1 - const responses = [] + if (callback === undefined) { + return new Promise((resolve, reject) => { + this.destroy(err, (err, data) => { + return err ? /* istanbul ignore next: should never error */ reject(err) : resolve(data) + }) + }) + } - // 5.2 - if (request === undefined) { - // 5.2.1 - for (const requestResponse of this.#relevantRequestResponseList) { - responses.push(requestResponse[1]) - } - } else { // 5.3 - // 5.3.1 - const requestResponses = this.#queryCache(r, options) + if (typeof callback !== 'function') { + throw new InvalidArgumentError('invalid callback') + } - // 5.3.2 - for (const requestResponse of requestResponses) { - responses.push(requestResponse[1]) + if (this[kDestroyed]) { + if (this[kOnDestroyed]) { + this[kOnDestroyed].push(callback) + } else { + queueMicrotask(() => callback(null, null)) } + return } - // 5.4 - // We don't implement CORs so we don't need to loop over the responses, yay! - - // 5.5.1 - const responseList = [] - - // 5.5.2 - for (const response of responses) { - // 5.5.2.1 - const responseObject = fromInnerResponse(response, 'immutable') + if (!err) { + err = new ClientDestroyedError() + } - responseList.push(responseObject.clone()) + this[kDestroyed] = true + this[kOnDestroyed] = this[kOnDestroyed] || [] + this[kOnDestroyed].push(callback) - if (responseList.length >= maxResponses) { - break + const onDestroyed = () => { + const callbacks = this[kOnDestroyed] + this[kOnDestroyed] = null + for (let i = 0; i < callbacks.length; i++) { + callbacks[i](null, null) } } - // 6. - return Object.freeze(responseList) + // Should not error. + this[kDestroy](err).then(() => { + queueMicrotask(onDestroyed) + }) } -} -Object.defineProperties(Cache.prototype, { - [Symbol.toStringTag]: { - value: 'Cache', - configurable: true - }, - match: kEnumerableProperty, - matchAll: kEnumerableProperty, - add: kEnumerableProperty, - addAll: kEnumerableProperty, - put: kEnumerableProperty, - delete: kEnumerableProperty, - keys: kEnumerableProperty -}) + [kInterceptedDispatch] (opts, handler) { + if (!this[kInterceptors] || this[kInterceptors].length === 0) { + this[kInterceptedDispatch] = this[kDispatch] + return this[kDispatch](opts, handler) + } -const cacheQueryOptionConverters = [ - { - key: 'ignoreSearch', - converter: webidl.converters.boolean, - defaultValue: () => false - }, - { - key: 'ignoreMethod', - converter: webidl.converters.boolean, - defaultValue: () => false - }, - { - key: 'ignoreVary', - converter: webidl.converters.boolean, - defaultValue: () => false + let dispatch = this[kDispatch].bind(this) + for (let i = this[kInterceptors].length - 1; i >= 0; i--) { + dispatch = this[kInterceptors][i](dispatch) + } + this[kInterceptedDispatch] = dispatch + return dispatch(opts, handler) } -] -webidl.converters.CacheQueryOptions = webidl.dictionaryConverter(cacheQueryOptionConverters) + dispatch (opts, handler) { + if (!handler || typeof handler !== 'object') { + throw new InvalidArgumentError('handler must be an object') + } -webidl.converters.MultiCacheQueryOptions = webidl.dictionaryConverter([ - ...cacheQueryOptionConverters, - { - key: 'cacheName', - converter: webidl.converters.DOMString - } -]) + try { + if (!opts || typeof opts !== 'object') { + throw new InvalidArgumentError('opts must be an object.') + } -webidl.converters.Response = webidl.interfaceConverter(Response) + if (this[kDestroyed] || this[kOnDestroyed]) { + throw new ClientDestroyedError() + } -webidl.converters['sequence '] = webidl.sequenceConverter( - webidl.converters.RequestInfo -) + if (this[kClosed]) { + throw new ClientClosedError() + } -module.exports = { - Cache + return this[kInterceptedDispatch](opts, handler) + } catch (err) { + if (typeof handler.onError !== 'function') { + throw new InvalidArgumentError('invalid onError method') + } + + handler.onError(err) + + return false + } + } } +module.exports = DispatcherBase + /***/ }), -/***/ 3245: +/***/ 883: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +const EventEmitter = __nccwpck_require__(8474) -const { kConstruct } = __nccwpck_require__(109) -const { Cache } = __nccwpck_require__(9634) -const { webidl } = __nccwpck_require__(5893) -const { kEnumerableProperty } = __nccwpck_require__(3440) - -class CacheStorage { - /** - * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-name-to-cache-map - * @type {Map } - */ - async has (cacheName) { - webidl.brandCheck(this, CacheStorage) - - const prefix = 'CacheStorage.has' - webidl.argumentLengthCheck(arguments, 1, prefix) - cacheName = webidl.converters.DOMString(cacheName, prefix, 'cacheName') - - // 2.1.1 - // 2.2 - return this.#caches.has(cacheName) + return new ComposedDispatcher(this, dispatch) } +} - /** - * @see https://w3c.github.io/ServiceWorker/#dom-cachestorage-open - * @param {string} cacheName - * @returns {Promise } - */ - async open (cacheName) { - webidl.brandCheck(this, CacheStorage) - - const prefix = 'CacheStorage.open' - webidl.argumentLengthCheck(arguments, 1, prefix) - - cacheName = webidl.converters.DOMString(cacheName, prefix, 'cacheName') - - // 2.1 - if (this.#caches.has(cacheName)) { - // await caches.open('v1') !== await caches.open('v1') - - // 2.1.1 - const cache = this.#caches.get(cacheName) +class ComposedDispatcher extends Dispatcher { + #dispatcher = null + #dispatch = null - // 2.1.1.1 - return new Cache(kConstruct, cache) - } + constructor (dispatcher, dispatch) { + super() + this.#dispatcher = dispatcher + this.#dispatch = dispatch + } - // 2.2 - const cache = [] + dispatch (...args) { + this.#dispatch(...args) + } - // 2.3 - this.#caches.set(cacheName, cache) + close (...args) { + return this.#dispatcher.close(...args) + } - // 2.4 - return new Cache(kConstruct, cache) + destroy (...args) { + return this.#dispatcher.destroy(...args) } +} - /** - * @see https://w3c.github.io/ServiceWorker/#cache-storage-delete - * @param {string} cacheName - * @returns {Promise } - */ - async delete (cacheName) { - webidl.brandCheck(this, CacheStorage) +module.exports = Dispatcher - const prefix = 'CacheStorage.delete' - webidl.argumentLengthCheck(arguments, 1, prefix) - cacheName = webidl.converters.DOMString(cacheName, prefix, 'cacheName') +/***/ }), - return this.#caches.delete(cacheName) - } +/***/ 3137: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - /** - * @see https://w3c.github.io/ServiceWorker/#cache-storage-keys - * @returns {Promise } - */ - async keys () { - webidl.brandCheck(this, CacheStorage) - // 2.1 - const keys = this.#caches.keys() - // 2.2 - return [...keys] - } +const DispatcherBase = __nccwpck_require__(1841) +const { kClose, kDestroy, kClosed, kDestroyed, kDispatch, kNoProxyAgent, kHttpProxyAgent, kHttpsProxyAgent } = __nccwpck_require__(6443) +const ProxyAgent = __nccwpck_require__(6672) +const Agent = __nccwpck_require__(7405) + +const DEFAULT_PORTS = { + 'http:': 80, + 'https:': 443 } -Object.defineProperties(CacheStorage.prototype, { - [Symbol.toStringTag]: { - value: 'CacheStorage', - configurable: true - }, - match: kEnumerableProperty, - has: kEnumerableProperty, - open: kEnumerableProperty, - delete: kEnumerableProperty, - keys: kEnumerableProperty -}) +let experimentalWarned = false -module.exports = { - CacheStorage -} +class EnvHttpProxyAgent extends DispatcherBase { + #noProxyValue = null + #noProxyEntries = null + #opts = null + + constructor (opts = {}) { + super() + this.#opts = opts + if (!experimentalWarned) { + experimentalWarned = true + process.emitWarning('EnvHttpProxyAgent is experimental, expect them to change at any time.', { + code: 'UNDICI-EHPA' + }) + } -/***/ }), + const { httpProxy, httpsProxy, noProxy, ...agentOpts } = opts -/***/ 109: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + this[kNoProxyAgent] = new Agent(agentOpts) + const HTTP_PROXY = httpProxy ?? process.env.http_proxy ?? process.env.HTTP_PROXY + if (HTTP_PROXY) { + this[kHttpProxyAgent] = new ProxyAgent({ ...agentOpts, uri: HTTP_PROXY }) + } else { + this[kHttpProxyAgent] = this[kNoProxyAgent] + } + const HTTPS_PROXY = httpsProxy ?? process.env.https_proxy ?? process.env.HTTPS_PROXY + if (HTTPS_PROXY) { + this[kHttpsProxyAgent] = new ProxyAgent({ ...agentOpts, uri: HTTPS_PROXY }) + } else { + this[kHttpsProxyAgent] = this[kHttpProxyAgent] + } -module.exports = { - kConstruct: (__nccwpck_require__(6443).kConstruct) -} + this.#parseNoProxy() + } + [kDispatch] (opts, handler) { + const url = new URL(opts.origin) + const agent = this.#getProxyAgentForUrl(url) + return agent.dispatch(opts, handler) + } -/***/ }), + async [kClose] () { + await this[kNoProxyAgent].close() + if (!this[kHttpProxyAgent][kClosed]) { + await this[kHttpProxyAgent].close() + } + if (!this[kHttpsProxyAgent][kClosed]) { + await this[kHttpsProxyAgent].close() + } + } -/***/ 6798: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + async [kDestroy] (err) { + await this[kNoProxyAgent].destroy(err) + if (!this[kHttpProxyAgent][kDestroyed]) { + await this[kHttpProxyAgent].destroy(err) + } + if (!this[kHttpsProxyAgent][kDestroyed]) { + await this[kHttpsProxyAgent].destroy(err) + } + } + #getProxyAgentForUrl (url) { + let { protocol, host: hostname, port } = url + // Stripping ports in this way instead of using parsedUrl.hostname to make + // sure that the brackets around IPv6 addresses are kept. + hostname = hostname.replace(/:\d*$/, '').toLowerCase() + port = Number.parseInt(port, 10) || DEFAULT_PORTS[protocol] || 0 + if (!this.#shouldProxy(hostname, port)) { + return this[kNoProxyAgent] + } + if (protocol === 'https:') { + return this[kHttpsProxyAgent] + } + return this[kHttpProxyAgent] + } -const assert = __nccwpck_require__(4589) -const { URLSerializer } = __nccwpck_require__(1900) -const { isValidHeaderName } = __nccwpck_require__(3168) + #shouldProxy (hostname, port) { + if (this.#noProxyChanged) { + this.#parseNoProxy() + } -/** - * @see https://url.spec.whatwg.org/#concept-url-equals - * @param {URL} A - * @param {URL} B - * @param {boolean | undefined} excludeFragment - * @returns {boolean} - */ -function urlEquals (A, B, excludeFragment = false) { - const serializedA = URLSerializer(A, excludeFragment) + if (this.#noProxyEntries.length === 0) { + return true // Always proxy if NO_PROXY is not set or empty. + } + if (this.#noProxyValue === '*') { + return false // Never proxy if wildcard is set. + } - const serializedB = URLSerializer(B, excludeFragment) + for (let i = 0; i < this.#noProxyEntries.length; i++) { + const entry = this.#noProxyEntries[i] + if (entry.port && entry.port !== port) { + continue // Skip if ports don't match. + } + if (!/^[.*]/.test(entry.hostname)) { + // No wildcards, so don't proxy only if there is not an exact match. + if (hostname === entry.hostname) { + return false + } + } else { + // Don't proxy if the hostname ends with the no_proxy host. + if (hostname.endsWith(entry.hostname.replace(/^\*/, ''))) { + return false + } + } + } - return serializedA === serializedB -} + return true + } -/** - * @see https://github.com/chromium/chromium/blob/694d20d134cb553d8d89e5500b9148012b1ba299/content/browser/cache_storage/cache_storage_cache.cc#L260-L262 - * @param {string} header - */ -function getFieldValues (header) { - assert(header !== null) + #parseNoProxy () { + const noProxyValue = this.#opts.noProxy ?? this.#noProxyEnv + const noProxySplit = noProxyValue.split(/[,\s]/) + const noProxyEntries = [] - const values = [] + for (let i = 0; i < noProxySplit.length; i++) { + const entry = noProxySplit[i] + if (!entry) { + continue + } + const parsed = entry.match(/^(.+):(\d+)$/) + noProxyEntries.push({ + hostname: (parsed ? parsed[1] : entry).toLowerCase(), + port: parsed ? Number.parseInt(parsed[2], 10) : 0 + }) + } - for (let value of header.split(',')) { - value = value.trim() + this.#noProxyValue = noProxyValue + this.#noProxyEntries = noProxyEntries + } - if (isValidHeaderName(value)) { - values.push(value) + get #noProxyChanged () { + if (this.#opts.noProxy !== undefined) { + return false } + return this.#noProxyValue !== this.#noProxyEnv } - return values + get #noProxyEnv () { + return process.env.no_proxy ?? process.env.NO_PROXY ?? '' + } } -module.exports = { - urlEquals, - getFieldValues -} +module.exports = EnvHttpProxyAgent /***/ }), -/***/ 1276: +/***/ 4660: /***/ ((module) => { +/* eslint-disable */ -// https://wicg.github.io/cookie-store/#cookie-maximum-attribute-value-size -const maxAttributeValueSize = 1024 - -// https://wicg.github.io/cookie-store/#cookie-maximum-name-value-pair-size -const maxNameValuePairSize = 4096 - -module.exports = { - maxAttributeValueSize, - maxNameValuePairSize -} - - -/***/ }), - -/***/ 9061: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +// Extracted from node/lib/internal/fixed_queue.js +// Currently optimal queue size, tested on V8 6.0 - 6.6. Must be power of two. +const kSize = 2048; +const kMask = kSize - 1; -const { parseSetCookie } = __nccwpck_require__(1978) -const { stringify } = __nccwpck_require__(7797) -const { webidl } = __nccwpck_require__(5893) -const { Headers } = __nccwpck_require__(660) +// The FixedQueue is implemented as a singly-linked list of fixed-size +// circular buffers. It looks something like this: +// +// head tail +// | | +// v v +// +-----------+ <-----\ +-----------+ <------\ +-----------+ +// | [null] | \----- | next | \------- | next | +// +-----------+ +-----------+ +-----------+ +// | item | <-- bottom | item | <-- bottom | [empty] | +// | item | | item | | [empty] | +// | item | | item | | [empty] | +// | item | | item | | [empty] | +// | item | | item | bottom --> | item | +// | item | | item | | item | +// | ... | | ... | | ... | +// | item | | item | | item | +// | item | | item | | item | +// | [empty] | <-- top | item | | item | +// | [empty] | | item | | item | +// | [empty] | | [empty] | <-- top top --> | [empty] | +// +-----------+ +-----------+ +-----------+ +// +// Or, if there is only one circular buffer, it looks something +// like either of these: +// +// head tail head tail +// | | | | +// v v v v +// +-----------+ +-----------+ +// | [null] | | [null] | +// +-----------+ +-----------+ +// | [empty] | | item | +// | [empty] | | item | +// | item | <-- bottom top --> | [empty] | +// | item | | [empty] | +// | [empty] | <-- top bottom --> | item | +// | [empty] | | item | +// +-----------+ +-----------+ +// +// Adding a value means moving `top` forward by one, removing means +// moving `bottom` forward by one. After reaching the end, the queue +// wraps around. +// +// When `top === bottom` the current queue is empty and when +// `top + 1 === bottom` it's full. This wastes a single space of storage +// but allows much quicker checks. -/** - * @typedef {Object} Cookie - * @property {string} name - * @property {string} value - * @property {Date|number|undefined} expires - * @property {number|undefined} maxAge - * @property {string|undefined} domain - * @property {string|undefined} path - * @property {boolean|undefined} secure - * @property {boolean|undefined} httpOnly - * @property {'Strict'|'Lax'|'None'} sameSite - * @property {string[]} unparsed - */ +class FixedCircularBuffer { + constructor() { + this.bottom = 0; + this.top = 0; + this.list = new Array(kSize); + this.next = null; + } -/** - * @param {Headers} headers - * @returns {Record } - */ -function getCookies (headers) { - webidl.argumentLengthCheck(arguments, 1, 'getCookies') + isEmpty() { + return this.top === this.bottom; + } - webidl.brandCheck(headers, Headers, { strict: false }) + isFull() { + return ((this.top + 1) & kMask) === this.bottom; + } - const cookie = headers.get('cookie') - const out = {} + push(data) { + this.list[this.top] = data; + this.top = (this.top + 1) & kMask; + } - if (!cookie) { - return out + shift() { + const nextItem = this.list[this.bottom]; + if (nextItem === undefined) + return null; + this.list[this.bottom] = undefined; + this.bottom = (this.bottom + 1) & kMask; + return nextItem; } +} - for (const piece of cookie.split(';')) { - const [name, ...value] = piece.split('=') +module.exports = class FixedQueue { + constructor() { + this.head = this.tail = new FixedCircularBuffer(); + } - out[name.trim()] = value.join('=') + isEmpty() { + return this.head.isEmpty(); } - return out -} + push(data) { + if (this.head.isFull()) { + // Head is full: Creates a new queue, sets the old queue's `.next` to it, + // and sets it as the new main queue. + this.head = this.head.next = new FixedCircularBuffer(); + } + this.head.push(data); + } -/** - * @param {Headers} headers - * @param {string} name - * @param {{ path?: string, domain?: string }|undefined} attributes - * @returns {void} - */ -function deleteCookie (headers, name, attributes) { - webidl.brandCheck(headers, Headers, { strict: false }) + shift() { + const tail = this.tail; + const next = tail.shift(); + if (tail.isEmpty() && tail.next !== null) { + // If there is another queue, it forms the new tail. + this.tail = tail.next; + } + return next; + } +}; - const prefix = 'deleteCookie' - webidl.argumentLengthCheck(arguments, 2, prefix) - name = webidl.converters.DOMString(name, prefix, 'name') - attributes = webidl.converters.DeleteCookieAttributes(attributes) +/***/ }), - // Matches behavior of - // https://github.com/denoland/deno_std/blob/63827b16330b82489a04614027c33b7904e08be5/http/cookie.ts#L278 - setCookie(headers, { - name, - value: '', - expires: new Date(0), - ...attributes - }) -} +/***/ 2128: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -/** - * @param {Headers} headers - * @returns {Cookie[]} - */ -function getSetCookies (headers) { - webidl.argumentLengthCheck(arguments, 1, 'getSetCookies') - webidl.brandCheck(headers, Headers, { strict: false }) - const cookies = headers.getSetCookie() +const DispatcherBase = __nccwpck_require__(1841) +const FixedQueue = __nccwpck_require__(4660) +const { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = __nccwpck_require__(6443) +const PoolStats = __nccwpck_require__(3246) - if (!cookies) { - return [] - } +const kClients = Symbol('clients') +const kNeedDrain = Symbol('needDrain') +const kQueue = Symbol('queue') +const kClosedResolve = Symbol('closed resolve') +const kOnDrain = Symbol('onDrain') +const kOnConnect = Symbol('onConnect') +const kOnDisconnect = Symbol('onDisconnect') +const kOnConnectionError = Symbol('onConnectionError') +const kGetDispatcher = Symbol('get dispatcher') +const kAddClient = Symbol('add client') +const kRemoveClient = Symbol('remove client') +const kStats = Symbol('stats') - return cookies.map((pair) => parseSetCookie(pair)) -} +class PoolBase extends DispatcherBase { + constructor (opts) { + super(opts) -/** - * @param {Headers} headers - * @param {Cookie} cookie - * @returns {void} - */ -function setCookie (headers, cookie) { - webidl.argumentLengthCheck(arguments, 2, 'setCookie') + this[kQueue] = new FixedQueue() + this[kClients] = [] + this[kQueued] = 0 - webidl.brandCheck(headers, Headers, { strict: false }) + const pool = this - cookie = webidl.converters.Cookie(cookie) + this[kOnDrain] = function onDrain (origin, targets) { + const queue = pool[kQueue] - const str = stringify(cookie) + let needDrain = false - if (str) { - headers.append('Set-Cookie', str) - } -} + while (!needDrain) { + const item = queue.shift() + if (!item) { + break + } + pool[kQueued]-- + needDrain = !this.dispatch(item.opts, item.handler) + } -webidl.converters.DeleteCookieAttributes = webidl.dictionaryConverter([ - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: 'path', - defaultValue: () => null - }, - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: 'domain', - defaultValue: () => null - } -]) + this[kNeedDrain] = needDrain -webidl.converters.Cookie = webidl.dictionaryConverter([ - { - converter: webidl.converters.DOMString, - key: 'name' - }, - { - converter: webidl.converters.DOMString, - key: 'value' - }, - { - converter: webidl.nullableConverter((value) => { - if (typeof value === 'number') { - return webidl.converters['unsigned long long'](value) + if (!this[kNeedDrain] && pool[kNeedDrain]) { + pool[kNeedDrain] = false + pool.emit('drain', origin, [pool, ...targets]) } - return new Date(value) - }), - key: 'expires', - defaultValue: () => null - }, - { - converter: webidl.nullableConverter(webidl.converters['long long']), - key: 'maxAge', - defaultValue: () => null - }, - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: 'domain', - defaultValue: () => null - }, - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: 'path', - defaultValue: () => null - }, - { - converter: webidl.nullableConverter(webidl.converters.boolean), - key: 'secure', - defaultValue: () => null - }, - { - converter: webidl.nullableConverter(webidl.converters.boolean), - key: 'httpOnly', - defaultValue: () => null - }, - { - converter: webidl.converters.USVString, - key: 'sameSite', - allowedValues: ['Strict', 'Lax', 'None'] - }, - { - converter: webidl.sequenceConverter(webidl.converters.DOMString), - key: 'unparsed', - defaultValue: () => new Array(0) - } -]) - -module.exports = { - getCookies, - deleteCookie, - getSetCookies, - setCookie -} + if (pool[kClosedResolve] && queue.isEmpty()) { + Promise + .all(pool[kClients].map(c => c.close())) + .then(pool[kClosedResolve]) + } + } + this[kOnConnect] = (origin, targets) => { + pool.emit('connect', origin, [pool, ...targets]) + } -/***/ }), + this[kOnDisconnect] = (origin, targets, err) => { + pool.emit('disconnect', origin, [pool, ...targets], err) + } -/***/ 1978: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + this[kOnConnectionError] = (origin, targets, err) => { + pool.emit('connectionError', origin, [pool, ...targets], err) + } + this[kStats] = new PoolStats(this) + } + get [kBusy] () { + return this[kNeedDrain] + } -const { maxNameValuePairSize, maxAttributeValueSize } = __nccwpck_require__(1276) -const { isCTLExcludingHtab } = __nccwpck_require__(7797) -const { collectASequenceOfCodePointsFast } = __nccwpck_require__(1900) -const assert = __nccwpck_require__(4589) + get [kConnected] () { + return this[kClients].filter(client => client[kConnected]).length + } -/** - * @description Parses the field-value attributes of a set-cookie header string. - * @see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4 - * @param {string} header - * @returns if the header is invalid, null will be returned - */ -function parseSetCookie (header) { - // 1. If the set-cookie-string contains a %x00-08 / %x0A-1F / %x7F - // character (CTL characters excluding HTAB): Abort these steps and - // ignore the set-cookie-string entirely. - if (isCTLExcludingHtab(header)) { - return null + get [kFree] () { + return this[kClients].filter(client => client[kConnected] && !client[kNeedDrain]).length } - let nameValuePair = '' - let unparsedAttributes = '' - let name = '' - let value = '' + get [kPending] () { + let ret = this[kQueued] + for (const { [kPending]: pending } of this[kClients]) { + ret += pending + } + return ret + } - // 2. If the set-cookie-string contains a %x3B (";") character: - if (header.includes(';')) { - // 1. The name-value-pair string consists of the characters up to, - // but not including, the first %x3B (";"), and the unparsed- - // attributes consist of the remainder of the set-cookie-string - // (including the %x3B (";") in question). - const position = { position: 0 } + get [kRunning] () { + let ret = 0 + for (const { [kRunning]: running } of this[kClients]) { + ret += running + } + return ret + } - nameValuePair = collectASequenceOfCodePointsFast(';', header, position) - unparsedAttributes = header.slice(position.position) - } else { - // Otherwise: + get [kSize] () { + let ret = this[kQueued] + for (const { [kSize]: size } of this[kClients]) { + ret += size + } + return ret + } - // 1. The name-value-pair string consists of all the characters - // contained in the set-cookie-string, and the unparsed- - // attributes is the empty string. - nameValuePair = header + get stats () { + return this[kStats] } - // 3. If the name-value-pair string lacks a %x3D ("=") character, then - // the name string is empty, and the value string is the value of - // name-value-pair. - if (!nameValuePair.includes('=')) { - value = nameValuePair - } else { - // Otherwise, the name string consists of the characters up to, but - // not including, the first %x3D ("=") character, and the (possibly - // empty) value string consists of the characters after the first - // %x3D ("=") character. - const position = { position: 0 } - name = collectASequenceOfCodePointsFast( - '=', - nameValuePair, - position - ) - value = nameValuePair.slice(position.position + 1) + async [kClose] () { + if (this[kQueue].isEmpty()) { + await Promise.all(this[kClients].map(c => c.close())) + } else { + await new Promise((resolve) => { + this[kClosedResolve] = resolve + }) + } } - // 4. Remove any leading or trailing WSP characters from the name - // string and the value string. - name = name.trim() - value = value.trim() + async [kDestroy] (err) { + while (true) { + const item = this[kQueue].shift() + if (!item) { + break + } + item.handler.onError(err) + } - // 5. If the sum of the lengths of the name string and the value string - // is more than 4096 octets, abort these steps and ignore the set- - // cookie-string entirely. - if (name.length + value.length > maxNameValuePairSize) { - return null + await Promise.all(this[kClients].map(c => c.destroy(err))) } - // 6. The cookie-name is the name string, and the cookie-value is the - // value string. - return { - name, value, ...parseUnparsedAttributes(unparsedAttributes) - } -} + [kDispatch] (opts, handler) { + const dispatcher = this[kGetDispatcher]() -/** - * Parses the remaining attributes of a set-cookie header - * @see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4 - * @param {string} unparsedAttributes - * @param {[Object. ]={}} cookieAttributeList - */ -function parseUnparsedAttributes (unparsedAttributes, cookieAttributeList = {}) { - // 1. If the unparsed-attributes string is empty, skip the rest of - // these steps. - if (unparsedAttributes.length === 0) { - return cookieAttributeList + if (!dispatcher) { + this[kNeedDrain] = true + this[kQueue].push({ opts, handler }) + this[kQueued]++ + } else if (!dispatcher.dispatch(opts, handler)) { + dispatcher[kNeedDrain] = true + this[kNeedDrain] = !this[kGetDispatcher]() + } + + return !this[kNeedDrain] } - // 2. Discard the first character of the unparsed-attributes (which - // will be a %x3B (";") character). - assert(unparsedAttributes[0] === ';') - unparsedAttributes = unparsedAttributes.slice(1) + [kAddClient] (client) { + client + .on('drain', this[kOnDrain]) + .on('connect', this[kOnConnect]) + .on('disconnect', this[kOnDisconnect]) + .on('connectionError', this[kOnConnectionError]) + + this[kClients].push(client) - let cookieAv = '' + if (this[kNeedDrain]) { + queueMicrotask(() => { + if (this[kNeedDrain]) { + this[kOnDrain](client[kUrl], [this, client]) + } + }) + } - // 3. If the remaining unparsed-attributes contains a %x3B (";") - // character: - if (unparsedAttributes.includes(';')) { - // 1. Consume the characters of the unparsed-attributes up to, but - // not including, the first %x3B (";") character. - cookieAv = collectASequenceOfCodePointsFast( - ';', - unparsedAttributes, - { position: 0 } - ) - unparsedAttributes = unparsedAttributes.slice(cookieAv.length) - } else { - // Otherwise: + return this + } - // 1. Consume the remainder of the unparsed-attributes. - cookieAv = unparsedAttributes - unparsedAttributes = '' + [kRemoveClient] (client) { + client.close(() => { + const idx = this[kClients].indexOf(client) + if (idx !== -1) { + this[kClients].splice(idx, 1) + } + }) + + this[kNeedDrain] = this[kClients].some(dispatcher => ( + !dispatcher[kNeedDrain] && + dispatcher.closed !== true && + dispatcher.destroyed !== true + )) } +} - // Let the cookie-av string be the characters consumed in this step. +module.exports = { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kRemoveClient, + kGetDispatcher +} - let attributeName = '' - let attributeValue = '' - // 4. If the cookie-av string contains a %x3D ("=") character: - if (cookieAv.includes('=')) { - // 1. The (possibly empty) attribute-name string consists of the - // characters up to, but not including, the first %x3D ("=") - // character, and the (possibly empty) attribute-value string - // consists of the characters after the first %x3D ("=") - // character. - const position = { position: 0 } +/***/ }), - attributeName = collectASequenceOfCodePointsFast( - '=', - cookieAv, - position - ) - attributeValue = cookieAv.slice(position.position + 1) - } else { - // Otherwise: +/***/ 3246: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - // 1. The attribute-name string consists of the entire cookie-av - // string, and the attribute-value string is empty. - attributeName = cookieAv +const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = __nccwpck_require__(6443) +const kPool = Symbol('pool') + +class PoolStats { + constructor (pool) { + this[kPool] = pool } - // 5. Remove any leading or trailing WSP characters from the attribute- - // name string and the attribute-value string. - attributeName = attributeName.trim() - attributeValue = attributeValue.trim() + get connected () { + return this[kPool][kConnected] + } - // 6. If the attribute-value is longer than 1024 octets, ignore the - // cookie-av string and return to Step 1 of this algorithm. - if (attributeValue.length > maxAttributeValueSize) { - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList) + get free () { + return this[kPool][kFree] } - // 7. Process the attribute-name and attribute-value according to the - // requirements in the following subsections. (Notice that - // attributes with unrecognized attribute-names are ignored.) - const attributeNameLowercase = attributeName.toLowerCase() + get pending () { + return this[kPool][kPending] + } - // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.1 - // If the attribute-name case-insensitively matches the string - // "Expires", the user agent MUST process the cookie-av as follows. - if (attributeNameLowercase === 'expires') { - // 1. Let the expiry-time be the result of parsing the attribute-value - // as cookie-date (see Section 5.1.1). - const expiryTime = new Date(attributeValue) + get queued () { + return this[kPool][kQueued] + } - // 2. If the attribute-value failed to parse as a cookie date, ignore - // the cookie-av. + get running () { + return this[kPool][kRunning] + } - cookieAttributeList.expires = expiryTime - } else if (attributeNameLowercase === 'max-age') { - // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.2 - // If the attribute-name case-insensitively matches the string "Max- - // Age", the user agent MUST process the cookie-av as follows. + get size () { + return this[kPool][kSize] + } +} - // 1. If the first character of the attribute-value is not a DIGIT or a - // "-" character, ignore the cookie-av. - const charCode = attributeValue.charCodeAt(0) +module.exports = PoolStats - if ((charCode < 48 || charCode > 57) && attributeValue[0] !== '-') { - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList) - } - // 2. If the remainder of attribute-value contains a non-DIGIT - // character, ignore the cookie-av. - if (!/^\d+$/.test(attributeValue)) { - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList) - } +/***/ }), - // 3. Let delta-seconds be the attribute-value converted to an integer. - const deltaSeconds = Number(attributeValue) +/***/ 628: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - // 4. Let cookie-age-limit be the maximum age of the cookie (which - // SHOULD be 400 days or less, see Section 4.1.2.2). - // 5. Set delta-seconds to the smaller of its present value and cookie- - // age-limit. - // deltaSeconds = Math.min(deltaSeconds * 1000, maxExpiresMs) - // 6. If delta-seconds is less than or equal to zero (0), let expiry- - // time be the earliest representable date and time. Otherwise, let - // the expiry-time be the current date and time plus delta-seconds - // seconds. - // const expiryTime = deltaSeconds <= 0 ? Date.now() : Date.now() + deltaSeconds +const { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kGetDispatcher +} = __nccwpck_require__(2128) +const Client = __nccwpck_require__(3701) +const { + InvalidArgumentError +} = __nccwpck_require__(8707) +const util = __nccwpck_require__(3440) +const { kUrl, kInterceptors } = __nccwpck_require__(6443) +const buildConnector = __nccwpck_require__(9136) - // 7. Append an attribute to the cookie-attribute-list with an - // attribute-name of Max-Age and an attribute-value of expiry-time. - cookieAttributeList.maxAge = deltaSeconds - } else if (attributeNameLowercase === 'domain') { - // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.3 - // If the attribute-name case-insensitively matches the string "Domain", - // the user agent MUST process the cookie-av as follows. +const kOptions = Symbol('options') +const kConnections = Symbol('connections') +const kFactory = Symbol('factory') - // 1. Let cookie-domain be the attribute-value. - let cookieDomain = attributeValue +function defaultFactory (origin, opts) { + return new Client(origin, opts) +} - // 2. If cookie-domain starts with %x2E ("."), let cookie-domain be - // cookie-domain without its leading %x2E ("."). - if (cookieDomain[0] === '.') { - cookieDomain = cookieDomain.slice(1) +class Pool extends PoolBase { + constructor (origin, { + connections, + factory = defaultFactory, + connect, + connectTimeout, + tls, + maxCachedSessions, + socketPath, + autoSelectFamily, + autoSelectFamilyAttemptTimeout, + allowH2, + ...options + } = {}) { + if (connections != null && (!Number.isFinite(connections) || connections < 0)) { + throw new InvalidArgumentError('invalid connections') } - // 3. Convert the cookie-domain to lower case. - cookieDomain = cookieDomain.toLowerCase() - - // 4. Append an attribute to the cookie-attribute-list with an - // attribute-name of Domain and an attribute-value of cookie-domain. - cookieAttributeList.domain = cookieDomain - } else if (attributeNameLowercase === 'path') { - // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.4 - // If the attribute-name case-insensitively matches the string "Path", - // the user agent MUST process the cookie-av as follows. - - // 1. If the attribute-value is empty or if the first character of the - // attribute-value is not %x2F ("/"): - let cookiePath = '' - if (attributeValue.length === 0 || attributeValue[0] !== '/') { - // 1. Let cookie-path be the default-path. - cookiePath = '/' - } else { - // Otherwise: + if (typeof factory !== 'function') { + throw new InvalidArgumentError('factory must be a function.') + } - // 1. Let cookie-path be the attribute-value. - cookiePath = attributeValue + if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { + throw new InvalidArgumentError('connect must be a function or an object') } - // 2. Append an attribute to the cookie-attribute-list with an - // attribute-name of Path and an attribute-value of cookie-path. - cookieAttributeList.path = cookiePath - } else if (attributeNameLowercase === 'secure') { - // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.5 - // If the attribute-name case-insensitively matches the string "Secure", - // the user agent MUST append an attribute to the cookie-attribute-list - // with an attribute-name of Secure and an empty attribute-value. + if (typeof connect !== 'function') { + connect = buildConnector({ + ...tls, + maxCachedSessions, + allowH2, + socketPath, + timeout: connectTimeout, + ...(autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined), + ...connect + }) + } - cookieAttributeList.secure = true - } else if (attributeNameLowercase === 'httponly') { - // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.6 - // If the attribute-name case-insensitively matches the string - // "HttpOnly", the user agent MUST append an attribute to the cookie- - // attribute-list with an attribute-name of HttpOnly and an empty - // attribute-value. + super(options) - cookieAttributeList.httpOnly = true - } else if (attributeNameLowercase === 'samesite') { - // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.7 - // If the attribute-name case-insensitively matches the string - // "SameSite", the user agent MUST process the cookie-av as follows: + this[kInterceptors] = options.interceptors?.Pool && Array.isArray(options.interceptors.Pool) + ? options.interceptors.Pool + : [] + this[kConnections] = connections || null + this[kUrl] = util.parseOrigin(origin) + this[kOptions] = { ...util.deepClone(options), connect, allowH2 } + this[kOptions].interceptors = options.interceptors + ? { ...options.interceptors } + : undefined + this[kFactory] = factory - const attributeValueLowercase = attributeValue.toLowerCase() + this.on('connectionError', (origin, targets, error) => { + // If a connection error occurs, we remove the client from the pool, + // and emit a connectionError event. They will not be re-used. + // Fixes https://github.com/nodejs/undici/issues/3895 + for (const target of targets) { + // Do not use kRemoveClient here, as it will close the client, + // but the client cannot be closed in this state. + const idx = this[kClients].indexOf(target) + if (idx !== -1) { + this[kClients].splice(idx, 1) + } + } + }) + } - // 1. If cookie-av's attribute-value is a case-insensitive match for - // "None", append an attribute to the cookie-attribute-list with an - // attribute-name of "SameSite" and an attribute-value of "None". - if (attributeValueLowercase === 'none') { - cookieAttributeList.sameSite = 'None' - } else if (attributeValueLowercase === 'strict') { - // 2. If cookie-av's attribute-value is a case-insensitive match for - // "Strict", append an attribute to the cookie-attribute-list with - // an attribute-name of "SameSite" and an attribute-value of - // "Strict". - cookieAttributeList.sameSite = 'Strict' - } else if (attributeValueLowercase === 'lax') { - // 3. If cookie-av's attribute-value is a case-insensitive match for - // "Lax", append an attribute to the cookie-attribute-list with an - // attribute-name of "SameSite" and an attribute-value of "Lax". - cookieAttributeList.sameSite = 'Lax' + [kGetDispatcher] () { + for (const client of this[kClients]) { + if (!client[kNeedDrain]) { + return client + } } - } else { - cookieAttributeList.unparsed ??= [] - cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`) + if (!this[kConnections] || this[kClients].length < this[kConnections]) { + const dispatcher = this[kFactory](this[kUrl], this[kOptions]) + this[kAddClient](dispatcher) + return dispatcher + } } - - // 8. Return to Step 1 of this algorithm. - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList) } -module.exports = { - parseSetCookie, - parseUnparsedAttributes -} +module.exports = Pool /***/ }), -/***/ 7797: -/***/ ((module) => { +/***/ 6672: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -/** - * @param {string} value - * @returns {boolean} - */ -function isCTLExcludingHtab (value) { - for (let i = 0; i < value.length; ++i) { - const code = value.charCodeAt(i) +const { kProxy, kClose, kDestroy, kDispatch, kInterceptors } = __nccwpck_require__(6443) +const { URL } = __nccwpck_require__(3136) +const Agent = __nccwpck_require__(7405) +const Pool = __nccwpck_require__(628) +const DispatcherBase = __nccwpck_require__(1841) +const { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError } = __nccwpck_require__(8707) +const buildConnector = __nccwpck_require__(9136) +const Client = __nccwpck_require__(3701) - if ( - (code >= 0x00 && code <= 0x08) || - (code >= 0x0A && code <= 0x1F) || - code === 0x7F - ) { - return true - } - } - return false -} +const kAgent = Symbol('proxy agent') +const kClient = Symbol('proxy client') +const kProxyHeaders = Symbol('proxy headers') +const kRequestTls = Symbol('request tls settings') +const kProxyTls = Symbol('proxy tls settings') +const kConnectEndpoint = Symbol('connect endpoint function') +const kTunnelProxy = Symbol('tunnel proxy') -/** - CHAR = - token = 1* - separators = "(" | ")" | "<" | ">" | "@" - | "," | ";" | ":" | "\" | <"> - | "/" | "[" | "]" | "?" | "=" - | "{" | "}" | SP | HT - * @param {string} name - */ -function validateCookieName (name) { - for (let i = 0; i < name.length; ++i) { - const code = name.charCodeAt(i) +function defaultProtocolPort (protocol) { + return protocol === 'https:' ? 443 : 80 +} - if ( - code < 0x21 || // exclude CTLs (0-31), SP and HT - code > 0x7E || // exclude non-ascii and DEL - code === 0x22 || // " - code === 0x28 || // ( - code === 0x29 || // ) - code === 0x3C || // < - code === 0x3E || // > - code === 0x40 || // @ - code === 0x2C || // , - code === 0x3B || // ; - code === 0x3A || // : - code === 0x5C || // \ - code === 0x2F || // / - code === 0x5B || // [ - code === 0x5D || // ] - code === 0x3F || // ? - code === 0x3D || // = - code === 0x7B || // { - code === 0x7D // } - ) { - throw new Error('Invalid cookie name') - } - } +function defaultFactory (origin, opts) { + return new Pool(origin, opts) } -/** - cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE ) - cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E - ; US-ASCII characters excluding CTLs, - ; whitespace DQUOTE, comma, semicolon, - ; and backslash - * @param {string} value - */ -function validateCookieValue (value) { - let len = value.length - let i = 0 +const noop = () => {} - // if the value is wrapped in DQUOTE - if (value[0] === '"') { - if (len === 1 || value[len - 1] !== '"') { - throw new Error('Invalid cookie value') - } - --len - ++i +function defaultAgentFactory (origin, opts) { + if (opts.connections === 1) { + return new Client(origin, opts) } + return new Pool(origin, opts) +} - while (i < len) { - const code = value.charCodeAt(i++) +class Http1ProxyWrapper extends DispatcherBase { + #client - if ( - code < 0x21 || // exclude CTLs (0-31) - code > 0x7E || // non-ascii and DEL (127) - code === 0x22 || // " - code === 0x2C || // , - code === 0x3B || // ; - code === 0x5C // \ - ) { - throw new Error('Invalid cookie value') + constructor (proxyUrl, { headers = {}, connect, factory }) { + super() + if (!proxyUrl) { + throw new InvalidArgumentError('Proxy URL is mandatory') } - } -} - -/** - * path-value = - * @param {string} path - */ -function validateCookiePath (path) { - for (let i = 0; i < path.length; ++i) { - const code = path.charCodeAt(i) - if ( - code < 0x20 || // exclude CTLs (0-31) - code > 0x7E || // exclude DEL and non-ascii - code === 0x3B // ; - ) { - throw new Error('Invalid cookie path') + this[kProxyHeaders] = headers + if (factory) { + this.#client = factory(proxyUrl, { connect }) + } else { + this.#client = new Client(proxyUrl, { connect }) } } -} -/** - * ::= | - * - * ::= any one of the 52 alphabetic characters A through Z in - * upper case and a through z in lower case - * - * ::= any one of the ten digits 0 through 9r - * - * @see https://www.rfc-editor.org/rfc/rfc1034#section-3.5 - * @param {number} code - */ -function isLetterOrDigit (code) { - return ( - (code >= 0x30 && code <= 0x39) || // 0-9 - (code >= 0x41 && code <= 0x5A) || // A-Z - (code >= 0x61 && code <= 0x7A) // a-z - ) -} + [kDispatch] (opts, handler) { + const onHeaders = handler.onHeaders + handler.onHeaders = function (statusCode, data, resume) { + if (statusCode === 407) { + if (typeof handler.onError === 'function') { + handler.onError(new InvalidArgumentError('Proxy Authentication Required (407)')) + } + return + } + if (onHeaders) onHeaders.call(this, statusCode, data, resume) + } -/** - * Validates a cookie domain against the "preferred name syntax". - * - * ::= | " " - * ::=