Bump undici from 5.27.2 to 5.28.3 (#817)

* Bump undici from 5.27.2 to 5.28.3

Bumps [undici](https://github.com/nodejs/undici) from 5.27.2 to 5.28.3.
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v5.27.2...v5.28.3)

---
updated-dependencies:
- dependency-name: undici
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* license check fix

* dependency fix

* nightly version issue fix

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: HarithaVattikuti <73516759+HarithaVattikuti@users.noreply.github.com>
This commit is contained in:
dependabot[bot] 2024-03-11 10:03:54 -05:00 committed by GitHub
parent 871daa956c
commit 9a7ac94420
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 1511 additions and 594 deletions

View File

@ -30,7 +30,7 @@ jobs:
- 'pypy-3.7-v7.3.x' - 'pypy-3.7-v7.3.x'
- 'pypy-3.7-v7.x' - 'pypy-3.7-v7.x'
- 'pypy-2.7-v7.3.4rc1' - 'pypy-2.7-v7.3.4rc1'
- 'pypy-3.7-nightly' - 'pypy-3.8-nightly'
- 'pypy3.8-v7.3.7' - 'pypy3.8-v7.3.7'
steps: steps:

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -319,7 +319,8 @@ function createHttpClient() {
return new http_client_1.HttpClient('actions/cache', [bearerCredentialHandler], getRequestOptions()); return new http_client_1.HttpClient('actions/cache', [bearerCredentialHandler], getRequestOptions());
} }
function getCacheVersion(paths, compressionMethod, enableCrossOsArchive = false) { function getCacheVersion(paths, compressionMethod, enableCrossOsArchive = false) {
const components = paths; // don't pass changes upstream
const components = paths.slice();
// Add compression method to cache version to restore // Add compression method to cache version to restore
// compressed cache as per compression method // compressed cache as per compression method
if (compressionMethod) { if (compressionMethod) {
@ -608,26 +609,21 @@ function resolvePaths(patterns) {
implicitDescendants: false implicitDescendants: false
}); });
try { try {
for (var _e = true, _f = __asyncValues(globber.globGenerator()), _g; _g = yield _f.next(), _a = _g.done, !_a;) { for (var _e = true, _f = __asyncValues(globber.globGenerator()), _g; _g = yield _f.next(), _a = _g.done, !_a; _e = true) {
_c = _g.value; _c = _g.value;
_e = false; _e = false;
try { const file = _c;
const file = _c; const relativeFile = path
const relativeFile = path .relative(workspace, file)
.relative(workspace, file) .replace(new RegExp(`\\${path.sep}`, 'g'), '/');
.replace(new RegExp(`\\${path.sep}`, 'g'), '/'); core.debug(`Matched: ${relativeFile}`);
core.debug(`Matched: ${relativeFile}`); // Paths are made relative so the tar entries are all relative to the root of the workspace.
// Paths are made relative so the tar entries are all relative to the root of the workspace. if (relativeFile === '') {
if (relativeFile === '') { // path.relative returns empty string if workspace and file are equal
// path.relative returns empty string if workspace and file are equal paths.push('.');
paths.push('.');
}
else {
paths.push(`${relativeFile}`);
}
} }
finally { else {
_e = true; paths.push(`${relativeFile}`);
} }
} }
} }
@ -711,7 +707,10 @@ function assertDefined(name, value) {
exports.assertDefined = assertDefined; exports.assertDefined = assertDefined;
function isGhes() { function isGhes() {
const ghUrl = new URL(process.env['GITHUB_SERVER_URL'] || 'https://github.com'); const ghUrl = new URL(process.env['GITHUB_SERVER_URL'] || 'https://github.com');
return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM'; const hostname = ghUrl.hostname.trimEnd().toUpperCase();
const isGitHubHost = hostname === 'GITHUB.COM';
const isGheHost = hostname.endsWith('.GHE.COM') || hostname.endsWith('.GHE.LOCALHOST');
return !isGitHubHost && !isGheHost;
} }
exports.isGhes = isGhes; exports.isGhes = isGhes;
//# sourceMappingURL=cacheUtils.js.map //# sourceMappingURL=cacheUtils.js.map
@ -729,7 +728,7 @@ var CacheFilename;
(function (CacheFilename) { (function (CacheFilename) {
CacheFilename["Gzip"] = "cache.tgz"; CacheFilename["Gzip"] = "cache.tgz";
CacheFilename["Zstd"] = "cache.tzst"; CacheFilename["Zstd"] = "cache.tzst";
})(CacheFilename = exports.CacheFilename || (exports.CacheFilename = {})); })(CacheFilename || (exports.CacheFilename = CacheFilename = {}));
var CompressionMethod; var CompressionMethod;
(function (CompressionMethod) { (function (CompressionMethod) {
CompressionMethod["Gzip"] = "gzip"; CompressionMethod["Gzip"] = "gzip";
@ -737,12 +736,12 @@ var CompressionMethod;
// This enum is for earlier version of zstd that does not have --long support // This enum is for earlier version of zstd that does not have --long support
CompressionMethod["ZstdWithoutLong"] = "zstd-without-long"; CompressionMethod["ZstdWithoutLong"] = "zstd-without-long";
CompressionMethod["Zstd"] = "zstd"; CompressionMethod["Zstd"] = "zstd";
})(CompressionMethod = exports.CompressionMethod || (exports.CompressionMethod = {})); })(CompressionMethod || (exports.CompressionMethod = CompressionMethod = {}));
var ArchiveToolType; var ArchiveToolType;
(function (ArchiveToolType) { (function (ArchiveToolType) {
ArchiveToolType["GNU"] = "gnu"; ArchiveToolType["GNU"] = "gnu";
ArchiveToolType["BSD"] = "bsd"; ArchiveToolType["BSD"] = "bsd";
})(ArchiveToolType = exports.ArchiveToolType || (exports.ArchiveToolType = {})); })(ArchiveToolType || (exports.ArchiveToolType = ArchiveToolType = {}));
// The default number of retry attempts. // The default number of retry attempts.
exports.DefaultRetryAttempts = 2; exports.DefaultRetryAttempts = 2;
// The default delay in milliseconds between retry attempts. // The default delay in milliseconds between retry attempts.
@ -7359,7 +7358,7 @@ class HttpClient {
if (this._keepAlive && useProxy) { if (this._keepAlive && useProxy) {
agent = this._proxyAgent; agent = this._proxyAgent;
} }
if (this._keepAlive && !useProxy) { if (!useProxy) {
agent = this._agent; agent = this._agent;
} }
// if agent is already assigned use that agent. // if agent is already assigned use that agent.
@ -7391,16 +7390,12 @@ class HttpClient {
agent = tunnelAgent(agentOptions); agent = tunnelAgent(agentOptions);
this._proxyAgent = agent; this._proxyAgent = agent;
} }
// if reusing agent across request and tunneling agent isn't assigned create a new agent // if tunneling agent isn't assigned create a new agent
if (this._keepAlive && !agent) { if (!agent) {
const options = { keepAlive: this._keepAlive, maxSockets }; const options = { keepAlive: this._keepAlive, maxSockets };
agent = usingSsl ? new https.Agent(options) : new http.Agent(options); agent = usingSsl ? new https.Agent(options) : new http.Agent(options);
this._agent = agent; this._agent = agent;
} }
// if not using private agent and tunnel agent isn't setup then use global agent
if (!agent) {
agent = usingSsl ? https.globalAgent : http.globalAgent;
}
if (usingSsl && this._ignoreSslError) { if (usingSsl && this._ignoreSslError) {
// we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process
// http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options
@ -51658,6 +51653,7 @@ const MockAgent = __nccwpck_require__(6771)
const MockPool = __nccwpck_require__(6193) const MockPool = __nccwpck_require__(6193)
const mockErrors = __nccwpck_require__(888) const mockErrors = __nccwpck_require__(888)
const ProxyAgent = __nccwpck_require__(7858) const ProxyAgent = __nccwpck_require__(7858)
const RetryHandler = __nccwpck_require__(2286)
const { getGlobalDispatcher, setGlobalDispatcher } = __nccwpck_require__(1892) const { getGlobalDispatcher, setGlobalDispatcher } = __nccwpck_require__(1892)
const DecoratorHandler = __nccwpck_require__(6930) const DecoratorHandler = __nccwpck_require__(6930)
const RedirectHandler = __nccwpck_require__(2860) const RedirectHandler = __nccwpck_require__(2860)
@ -51679,6 +51675,7 @@ module.exports.Pool = Pool
module.exports.BalancedPool = BalancedPool module.exports.BalancedPool = BalancedPool
module.exports.Agent = Agent module.exports.Agent = Agent
module.exports.ProxyAgent = ProxyAgent module.exports.ProxyAgent = ProxyAgent
module.exports.RetryHandler = RetryHandler
module.exports.DecoratorHandler = DecoratorHandler module.exports.DecoratorHandler = DecoratorHandler
module.exports.RedirectHandler = RedirectHandler module.exports.RedirectHandler = RedirectHandler
@ -52579,6 +52576,7 @@ function request (opts, callback) {
} }
module.exports = request module.exports = request
module.exports.RequestHandler = RequestHandler
/***/ }), /***/ }),
@ -52961,6 +52959,8 @@ const kBody = Symbol('kBody')
const kAbort = Symbol('abort') const kAbort = Symbol('abort')
const kContentType = Symbol('kContentType') const kContentType = Symbol('kContentType')
const noop = () => {}
module.exports = class BodyReadable extends Readable { module.exports = class BodyReadable extends Readable {
constructor ({ constructor ({
resume, resume,
@ -53094,37 +53094,50 @@ module.exports = class BodyReadable extends Readable {
return this[kBody] return this[kBody]
} }
async dump (opts) { dump (opts) {
let limit = opts && Number.isFinite(opts.limit) ? opts.limit : 262144 let limit = opts && Number.isFinite(opts.limit) ? opts.limit : 262144
const signal = opts && opts.signal const signal = opts && opts.signal
const abortFn = () => {
this.destroy()
}
let signalListenerCleanup
if (signal) { if (signal) {
if (typeof signal !== 'object' || !('aborted' in signal)) { try {
throw new InvalidArgumentError('signal must be an AbortSignal') if (typeof signal !== 'object' || !('aborted' in signal)) {
} throw new InvalidArgumentError('signal must be an AbortSignal')
util.throwIfAborted(signal)
signalListenerCleanup = util.addAbortListener(signal, abortFn)
}
try {
for await (const chunk of this) {
util.throwIfAborted(signal)
limit -= Buffer.byteLength(chunk)
if (limit < 0) {
return
} }
} util.throwIfAborted(signal)
} catch { } catch (err) {
util.throwIfAborted(signal) return Promise.reject(err)
} finally {
if (typeof signalListenerCleanup === 'function') {
signalListenerCleanup()
} else if (signalListenerCleanup) {
signalListenerCleanup[Symbol.dispose]()
} }
} }
if (this.closed) {
return Promise.resolve(null)
}
return new Promise((resolve, reject) => {
const signalListenerCleanup = signal
? util.addAbortListener(signal, () => {
this.destroy()
})
: noop
this
.on('close', function () {
signalListenerCleanup()
if (signal && signal.aborted) {
reject(signal.reason || Object.assign(new Error('The operation was aborted'), { name: 'AbortError' }))
} else {
resolve(null)
}
})
.on('error', noop)
.on('data', function (chunk) {
limit -= chunk.length
if (limit <= 0) {
this.destroy()
}
})
.resume()
})
} }
} }
@ -54504,13 +54517,13 @@ module.exports = {
/***/ }), /***/ }),
/***/ 9174: /***/ 9174:
/***/ ((module) => { /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict"; "use strict";
module.exports = { module.exports = {
kConstruct: Symbol('constructable') kConstruct: (__nccwpck_require__(2785).kConstruct)
} }
@ -55496,11 +55509,9 @@ class Parser {
socket[kReset] = true socket[kReset] = true
} }
let pause const pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false
try {
pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false if (request.aborted) {
} catch (err) {
util.destroy(socket, err)
return -1 return -1
} }
@ -55547,13 +55558,8 @@ class Parser {
this.bytesRead += buf.length this.bytesRead += buf.length
try { if (request.onData(buf) === false) {
if (request.onData(buf) === false) { return constants.ERROR.PAUSED
return constants.ERROR.PAUSED
}
} catch (err) {
util.destroy(socket, err)
return -1
} }
} }
@ -55594,11 +55600,7 @@ class Parser {
return -1 return -1
} }
try { request.onComplete(headers)
request.onComplete(headers)
} catch (err) {
errorRequest(client, request, err)
}
client[kQueue][client[kRunningIdx]++] = null client[kQueue][client[kRunningIdx]++] = null
@ -55762,7 +55764,7 @@ async function connect (client) {
const idx = hostname.indexOf(']') const idx = hostname.indexOf(']')
assert(idx !== -1) assert(idx !== -1)
const ip = hostname.substr(1, idx - 1) const ip = hostname.substring(1, idx)
assert(net.isIP(ip)) assert(net.isIP(ip))
hostname = ip hostname = ip
@ -56261,6 +56263,7 @@ function writeH2 (client, session, request) {
return false return false
} }
/** @type {import('node:http2').ClientHttp2Stream} */
let stream let stream
const h2State = client[kHTTP2SessionState] const h2State = client[kHTTP2SessionState]
@ -56356,14 +56359,10 @@ function writeH2 (client, session, request) {
const shouldEndStream = method === 'GET' || method === 'HEAD' const shouldEndStream = method === 'GET' || method === 'HEAD'
if (expectContinue) { if (expectContinue) {
headers[HTTP2_HEADER_EXPECT] = '100-continue' headers[HTTP2_HEADER_EXPECT] = '100-continue'
/**
* @type {import('node:http2').ClientHttp2Stream}
*/
stream = session.request(headers, { endStream: shouldEndStream, signal }) stream = session.request(headers, { endStream: shouldEndStream, signal })
stream.once('continue', writeBodyH2) stream.once('continue', writeBodyH2)
} else { } else {
/** @type {import('node:http2').ClientHttp2Stream} */
stream = session.request(headers, { stream = session.request(headers, {
endStream: shouldEndStream, endStream: shouldEndStream,
signal signal
@ -56375,7 +56374,9 @@ function writeH2 (client, session, request) {
++h2State.openStreams ++h2State.openStreams
stream.once('response', headers => { stream.once('response', headers => {
if (request.onHeaders(Number(headers[HTTP2_HEADER_STATUS]), headers, stream.resume.bind(stream), '') === false) { const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers
if (request.onHeaders(Number(statusCode), realHeaders, stream.resume.bind(stream), '') === false) {
stream.pause() stream.pause()
} }
}) })
@ -56385,13 +56386,17 @@ function writeH2 (client, session, request) {
}) })
stream.on('data', (chunk) => { stream.on('data', (chunk) => {
if (request.onData(chunk) === false) stream.pause() if (request.onData(chunk) === false) {
stream.pause()
}
}) })
stream.once('close', () => { stream.once('close', () => {
h2State.openStreams -= 1 h2State.openStreams -= 1
// TODO(HTTP/2): unref only if current streams count is 0 // TODO(HTTP/2): unref only if current streams count is 0
if (h2State.openStreams === 0) session.unref() if (h2State.openStreams === 0) {
session.unref()
}
}) })
stream.once('error', function (err) { stream.once('error', function (err) {
@ -56551,7 +56556,11 @@ function writeStream ({ h2stream, body, client, request, socket, contentLength,
} }
} }
const onAbort = function () { const onAbort = function () {
onFinished(new RequestAbortedError()) if (finished) {
return
}
const err = new RequestAbortedError()
queueMicrotask(() => onFinished(err))
} }
const onFinished = function (err) { const onFinished = function (err) {
if (finished) { if (finished) {
@ -58156,6 +58165,19 @@ class ResponseExceededMaxSizeError extends UndiciError {
} }
} }
class RequestRetryError extends UndiciError {
constructor (message, code, { headers, data }) {
super(message)
Error.captureStackTrace(this, RequestRetryError)
this.name = 'RequestRetryError'
this.message = message || 'Request retry error'
this.code = 'UND_ERR_REQ_RETRY'
this.statusCode = code
this.data = data
this.headers = headers
}
}
module.exports = { module.exports = {
HTTPParserError, HTTPParserError,
UndiciError, UndiciError,
@ -58175,7 +58197,8 @@ module.exports = {
NotSupportedError, NotSupportedError,
ResponseContentLengthMismatchError, ResponseContentLengthMismatchError,
BalancedPoolMissingUpstreamError, BalancedPoolMissingUpstreamError,
ResponseExceededMaxSizeError ResponseExceededMaxSizeError,
RequestRetryError
} }
@ -58417,9 +58440,9 @@ class Request {
onBodySent (chunk) { onBodySent (chunk) {
if (this[kHandler].onBodySent) { if (this[kHandler].onBodySent) {
try { try {
this[kHandler].onBodySent(chunk) return this[kHandler].onBodySent(chunk)
} catch (err) { } catch (err) {
this.onError(err) this.abort(err)
} }
} }
} }
@ -58431,9 +58454,9 @@ class Request {
if (this[kHandler].onRequestSent) { if (this[kHandler].onRequestSent) {
try { try {
this[kHandler].onRequestSent() return this[kHandler].onRequestSent()
} catch (err) { } catch (err) {
this.onError(err) this.abort(err)
} }
} }
} }
@ -58458,14 +58481,23 @@ class Request {
channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }) channels.headers.publish({ request: this, response: { statusCode, headers, statusText } })
} }
return this[kHandler].onHeaders(statusCode, headers, resume, statusText) try {
return this[kHandler].onHeaders(statusCode, headers, resume, statusText)
} catch (err) {
this.abort(err)
}
} }
onData (chunk) { onData (chunk) {
assert(!this.aborted) assert(!this.aborted)
assert(!this.completed) assert(!this.completed)
return this[kHandler].onData(chunk) try {
return this[kHandler].onData(chunk)
} catch (err) {
this.abort(err)
return false
}
} }
onUpgrade (statusCode, headers, socket) { onUpgrade (statusCode, headers, socket) {
@ -58484,7 +58516,13 @@ class Request {
if (channels.trailers.hasSubscribers) { if (channels.trailers.hasSubscribers) {
channels.trailers.publish({ request: this, trailers }) channels.trailers.publish({ request: this, trailers })
} }
return this[kHandler].onComplete(trailers)
try {
return this[kHandler].onComplete(trailers)
} catch (err) {
// TODO (fix): This might be a bad idea?
this.onError(err)
}
} }
onError (error) { onError (error) {
@ -58498,6 +58536,7 @@ class Request {
return return
} }
this.aborted = true this.aborted = true
return this[kHandler].onError(error) return this[kHandler].onError(error)
} }
@ -58734,7 +58773,9 @@ module.exports = {
kHTTP2BuildRequest: Symbol('http2 build request'), kHTTP2BuildRequest: Symbol('http2 build request'),
kHTTP1BuildRequest: Symbol('http1 build request'), kHTTP1BuildRequest: Symbol('http1 build request'),
kHTTP2CopyHeaders: Symbol('http2 copy headers'), kHTTP2CopyHeaders: Symbol('http2 copy headers'),
kHTTPConnVersion: Symbol('http connection version') kHTTPConnVersion: Symbol('http connection version'),
kRetryHandlerDefaultRetry: Symbol('retry agent default retry'),
kConstruct: Symbol('constructable')
} }
@ -58871,13 +58912,13 @@ function getHostname (host) {
const idx = host.indexOf(']') const idx = host.indexOf(']')
assert(idx !== -1) assert(idx !== -1)
return host.substr(1, idx - 1) return host.substring(1, idx)
} }
const idx = host.indexOf(':') const idx = host.indexOf(':')
if (idx === -1) return host if (idx === -1) return host
return host.substr(0, idx) return host.substring(0, idx)
} }
// IP addresses are not valid server names per RFC6066 // IP addresses are not valid server names per RFC6066
@ -58974,7 +59015,7 @@ function parseHeaders (headers, obj = {}) {
if (!val) { if (!val) {
if (Array.isArray(headers[i + 1])) { if (Array.isArray(headers[i + 1])) {
obj[key] = headers[i + 1] obj[key] = headers[i + 1].map(x => x.toString('utf8'))
} else { } else {
obj[key] = headers[i + 1].toString('utf8') obj[key] = headers[i + 1].toString('utf8')
} }
@ -59177,16 +59218,7 @@ function throwIfAborted (signal) {
} }
} }
let events
function addAbortListener (signal, listener) { function addAbortListener (signal, listener) {
if (typeof Symbol.dispose === 'symbol') {
if (!events) {
events = __nccwpck_require__(2361)
}
if (typeof events.addAbortListener === 'function' && 'aborted' in signal) {
return events.addAbortListener(signal, listener)
}
}
if ('addEventListener' in signal) { if ('addEventListener' in signal) {
signal.addEventListener('abort', listener, { once: true }) signal.addEventListener('abort', listener, { once: true })
return () => signal.removeEventListener('abort', listener) return () => signal.removeEventListener('abort', listener)
@ -59210,6 +59242,21 @@ function toUSVString (val) {
return `${val}` return `${val}`
} }
// 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
}
const kEnumerableProperty = Object.create(null) const kEnumerableProperty = Object.create(null)
kEnumerableProperty.enumerable = true kEnumerableProperty.enumerable = true
@ -59243,9 +59290,11 @@ module.exports = {
buildURL, buildURL,
throwIfAborted, throwIfAborted,
addAbortListener, addAbortListener,
parseRangeHeader,
nodeMajor, nodeMajor,
nodeMinor, nodeMinor,
nodeHasAutoSelectFamily: nodeMajor > 18 || (nodeMajor === 18 && nodeMinor >= 13) nodeHasAutoSelectFamily: nodeMajor > 18 || (nodeMajor === 18 && nodeMinor >= 13),
safeHTTPMethods: ['GET', 'HEAD', 'OPTIONS', 'TRACE']
} }
@ -60374,17 +60423,14 @@ function dataURLProcessor (dataURL) {
* @param {boolean} excludeFragment * @param {boolean} excludeFragment
*/ */
function URLSerializer (url, excludeFragment = false) { function URLSerializer (url, excludeFragment = false) {
const href = url.href
if (!excludeFragment) { if (!excludeFragment) {
return href return url.href
} }
const hash = href.lastIndexOf('#') const href = url.href
if (hash === -1) { const hashLength = url.hash.length
return href
} return hashLength === 0 ? href : href.substring(0, href.length - hashLength)
return href.slice(0, hash)
} }
// https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points // https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points
@ -61568,7 +61614,7 @@ module.exports = {
const { kHeadersList } = __nccwpck_require__(2785) const { kHeadersList, kConstruct } = __nccwpck_require__(2785)
const { kGuard } = __nccwpck_require__(5861) const { kGuard } = __nccwpck_require__(5861)
const { kEnumerableProperty } = __nccwpck_require__(3983) const { kEnumerableProperty } = __nccwpck_require__(3983)
const { const {
@ -61582,6 +61628,13 @@ const assert = __nccwpck_require__(9491)
const kHeadersMap = Symbol('headers map') const kHeadersMap = Symbol('headers map')
const kHeadersSortedMap = Symbol('headers map sorted') const kHeadersSortedMap = Symbol('headers map sorted')
/**
* @param {number} code
*/
function isHTTPWhiteSpaceCharCode (code) {
return code === 0x00a || code === 0x00d || code === 0x009 || code === 0x020
}
/** /**
* @see https://fetch.spec.whatwg.org/#concept-header-value-normalize * @see https://fetch.spec.whatwg.org/#concept-header-value-normalize
* @param {string} potentialValue * @param {string} potentialValue
@ -61590,12 +61643,12 @@ function headerValueNormalize (potentialValue) {
// To normalize a byte sequence potentialValue, remove // To normalize a byte sequence potentialValue, remove
// any leading and trailing HTTP whitespace bytes from // any leading and trailing HTTP whitespace bytes from
// potentialValue. // potentialValue.
let i = 0; let j = potentialValue.length
// Trimming the end with `.replace()` and a RegExp is typically subject to while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(j - 1))) --j
// ReDoS. This is safer and faster. while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(i))) ++i
let i = potentialValue.length
while (/[\r\n\t ]/.test(potentialValue.charAt(--i))); return i === 0 && j === potentialValue.length ? potentialValue : potentialValue.substring(i, j)
return potentialValue.slice(0, i + 1).replace(/^[\r\n\t ]+/, '')
} }
function fill (headers, object) { function fill (headers, object) {
@ -61604,7 +61657,8 @@ function fill (headers, object) {
// 1. If object is a sequence, then for each header in object: // 1. If object is a sequence, then for each header in object:
// Note: webidl conversion to array has already been done. // Note: webidl conversion to array has already been done.
if (Array.isArray(object)) { if (Array.isArray(object)) {
for (const header of object) { for (let i = 0; i < object.length; ++i) {
const header = object[i]
// 1. If header does not contain exactly two items, then throw a TypeError. // 1. If header does not contain exactly two items, then throw a TypeError.
if (header.length !== 2) { if (header.length !== 2) {
throw webidl.errors.exception({ throw webidl.errors.exception({
@ -61614,15 +61668,16 @@ function fill (headers, object) {
} }
// 2. Append (headers first item, headers second item) to headers. // 2. Append (headers first item, headers second item) to headers.
headers.append(header[0], header[1]) appendHeader(headers, header[0], header[1])
} }
} else if (typeof object === 'object' && object !== null) { } else if (typeof object === 'object' && object !== null) {
// Note: null should throw // Note: null should throw
// 2. Otherwise, object is a record, then for each key → value in object, // 2. Otherwise, object is a record, then for each key → value in object,
// append (key, value) to headers // append (key, value) to headers
for (const [key, value] of Object.entries(object)) { const keys = Object.keys(object)
headers.append(key, value) for (let i = 0; i < keys.length; ++i) {
appendHeader(headers, keys[i], object[keys[i]])
} }
} else { } else {
throw webidl.errors.conversionFailed({ throw webidl.errors.conversionFailed({
@ -61633,6 +61688,50 @@ function fill (headers, object) {
} }
} }
/**
* @see https://fetch.spec.whatwg.org/#concept-headers-append
*/
function appendHeader (headers, name, value) {
// 1. Normalize value.
value = headerValueNormalize(value)
// 2. If name is not a header name or value is not a
// header value, then throw a TypeError.
if (!isValidHeaderName(name)) {
throw webidl.errors.invalidArgument({
prefix: 'Headers.append',
value: name,
type: 'header name'
})
} else if (!isValidHeaderValue(value)) {
throw webidl.errors.invalidArgument({
prefix: 'Headers.append',
value,
type: 'header value'
})
}
// 3. If headerss guard is "immutable", then throw a TypeError.
// 4. Otherwise, if headerss guard is "request" and name is a
// forbidden header name, return.
// Note: undici does not implement forbidden header names
if (headers[kGuard] === 'immutable') {
throw new TypeError('immutable')
} else if (headers[kGuard] === 'request-no-cors') {
// 5. Otherwise, if headerss guard is "request-no-cors":
// TODO
}
// 6. Otherwise, if headerss guard is "response" and name is a
// forbidden response-header name, return.
// 7. Append (name, value) to headerss header list.
return headers[kHeadersList].append(name, value)
// 8. If headerss guard is "request-no-cors", then remove
// privileged no-CORS request headers from headers
}
class HeadersList { class HeadersList {
/** @type {[string, string][]|null} */ /** @type {[string, string][]|null} */
cookies = null cookies = null
@ -61641,7 +61740,7 @@ class HeadersList {
if (init instanceof HeadersList) { if (init instanceof HeadersList) {
this[kHeadersMap] = new Map(init[kHeadersMap]) this[kHeadersMap] = new Map(init[kHeadersMap])
this[kHeadersSortedMap] = init[kHeadersSortedMap] this[kHeadersSortedMap] = init[kHeadersSortedMap]
this.cookies = init.cookies this.cookies = init.cookies === null ? null : [...init.cookies]
} else { } else {
this[kHeadersMap] = new Map(init) this[kHeadersMap] = new Map(init)
this[kHeadersSortedMap] = null this[kHeadersSortedMap] = null
@ -61703,7 +61802,7 @@ class HeadersList {
// the first such header to value and remove the // the first such header to value and remove the
// others. // others.
// 2. Otherwise, append header (name, value) to list. // 2. Otherwise, append header (name, value) to list.
return this[kHeadersMap].set(lowercaseName, { name, value }) this[kHeadersMap].set(lowercaseName, { name, value })
} }
// https://fetch.spec.whatwg.org/#concept-header-list-delete // https://fetch.spec.whatwg.org/#concept-header-list-delete
@ -61716,20 +61815,18 @@ class HeadersList {
this.cookies = null this.cookies = null
} }
return this[kHeadersMap].delete(name) this[kHeadersMap].delete(name)
} }
// https://fetch.spec.whatwg.org/#concept-header-list-get // https://fetch.spec.whatwg.org/#concept-header-list-get
get (name) { get (name) {
// 1. If list does not contain name, then return null. const value = this[kHeadersMap].get(name.toLowerCase())
if (!this.contains(name)) {
return null
}
// 1. If list does not contain name, then return null.
// 2. Return the values of all headers in list whose name // 2. Return the values of all headers in list whose name
// is a byte-case-insensitive match for name, // is a byte-case-insensitive match for name,
// separated from each other by 0x2C 0x20, in order. // separated from each other by 0x2C 0x20, in order.
return this[kHeadersMap].get(name.toLowerCase())?.value ?? null return value === undefined ? null : value.value
} }
* [Symbol.iterator] () { * [Symbol.iterator] () {
@ -61755,6 +61852,9 @@ class HeadersList {
// https://fetch.spec.whatwg.org/#headers-class // https://fetch.spec.whatwg.org/#headers-class
class Headers { class Headers {
constructor (init = undefined) { constructor (init = undefined) {
if (init === kConstruct) {
return
}
this[kHeadersList] = new HeadersList() this[kHeadersList] = new HeadersList()
// The new Headers(init) constructor steps are: // The new Headers(init) constructor steps are:
@ -61778,43 +61878,7 @@ class Headers {
name = webidl.converters.ByteString(name) name = webidl.converters.ByteString(name)
value = webidl.converters.ByteString(value) value = webidl.converters.ByteString(value)
// 1. Normalize value. return appendHeader(this, name, value)
value = headerValueNormalize(value)
// 2. If name is not a header name or value is not a
// header value, then throw a TypeError.
if (!isValidHeaderName(name)) {
throw webidl.errors.invalidArgument({
prefix: 'Headers.append',
value: name,
type: 'header name'
})
} else if (!isValidHeaderValue(value)) {
throw webidl.errors.invalidArgument({
prefix: 'Headers.append',
value,
type: 'header value'
})
}
// 3. If headerss guard is "immutable", then throw a TypeError.
// 4. Otherwise, if headerss guard is "request" and name is a
// forbidden header name, return.
// Note: undici does not implement forbidden header names
if (this[kGuard] === 'immutable') {
throw new TypeError('immutable')
} else if (this[kGuard] === 'request-no-cors') {
// 5. Otherwise, if headerss guard is "request-no-cors":
// TODO
}
// 6. Otherwise, if headerss guard is "response" and name is a
// forbidden response-header name, return.
// 7. Append (name, value) to headerss header list.
// 8. If headerss guard is "request-no-cors", then remove
// privileged no-CORS request headers from headers
return this[kHeadersList].append(name, value)
} }
// https://fetch.spec.whatwg.org/#dom-headers-delete // https://fetch.spec.whatwg.org/#dom-headers-delete
@ -61859,7 +61923,7 @@ class Headers {
// 7. Delete name from thiss header list. // 7. Delete name from thiss header list.
// 8. If thiss guard is "request-no-cors", then remove // 8. If thiss guard is "request-no-cors", then remove
// privileged no-CORS request headers from this. // privileged no-CORS request headers from this.
return this[kHeadersList].delete(name) this[kHeadersList].delete(name)
} }
// https://fetch.spec.whatwg.org/#dom-headers-get // https://fetch.spec.whatwg.org/#dom-headers-get
@ -61952,7 +62016,7 @@ class Headers {
// 7. Set (name, value) in thiss header list. // 7. Set (name, value) in thiss header list.
// 8. If thiss guard is "request-no-cors", then remove // 8. If thiss guard is "request-no-cors", then remove
// privileged no-CORS request headers from this // privileged no-CORS request headers from this
return this[kHeadersList].set(name, value) this[kHeadersList].set(name, value)
} }
// https://fetch.spec.whatwg.org/#dom-headers-getsetcookie // https://fetch.spec.whatwg.org/#dom-headers-getsetcookie
@ -61988,7 +62052,8 @@ class Headers {
const cookies = this[kHeadersList].cookies const cookies = this[kHeadersList].cookies
// 3. For each name of names: // 3. For each name of names:
for (const [name, value] of names) { for (let i = 0; i < names.length; ++i) {
const [name, value] = names[i]
// 1. If name is `set-cookie`, then: // 1. If name is `set-cookie`, then:
if (name === 'set-cookie') { if (name === 'set-cookie') {
// 1. Let values be a list of all values of headers in list whose name // 1. Let values be a list of all values of headers in list whose name
@ -61996,8 +62061,8 @@ class Headers {
// 2. For each value of values: // 2. For each value of values:
// 1. Append (name, value) to headers. // 1. Append (name, value) to headers.
for (const value of cookies) { for (let j = 0; j < cookies.length; ++j) {
headers.push([name, value]) headers.push([name, cookies[j]])
} }
} else { } else {
// 2. Otherwise: // 2. Otherwise:
@ -62021,6 +62086,12 @@ class Headers {
keys () { keys () {
webidl.brandCheck(this, Headers) webidl.brandCheck(this, Headers)
if (this[kGuard] === 'immutable') {
const value = this[kHeadersSortedMap]
return makeIterator(() => value, 'Headers',
'key')
}
return makeIterator( return makeIterator(
() => [...this[kHeadersSortedMap].values()], () => [...this[kHeadersSortedMap].values()],
'Headers', 'Headers',
@ -62031,6 +62102,12 @@ class Headers {
values () { values () {
webidl.brandCheck(this, Headers) webidl.brandCheck(this, Headers)
if (this[kGuard] === 'immutable') {
const value = this[kHeadersSortedMap]
return makeIterator(() => value, 'Headers',
'value')
}
return makeIterator( return makeIterator(
() => [...this[kHeadersSortedMap].values()], () => [...this[kHeadersSortedMap].values()],
'Headers', 'Headers',
@ -62041,6 +62118,12 @@ class Headers {
entries () { entries () {
webidl.brandCheck(this, Headers) webidl.brandCheck(this, Headers)
if (this[kGuard] === 'immutable') {
const value = this[kHeadersSortedMap]
return makeIterator(() => value, 'Headers',
'key+value')
}
return makeIterator( return makeIterator(
() => [...this[kHeadersSortedMap].values()], () => [...this[kHeadersSortedMap].values()],
'Headers', 'Headers',
@ -62412,7 +62495,7 @@ function finalizeAndReportTiming (response, initiatorType = 'other') {
} }
// 8. If responses timing allow passed flag is not set, then: // 8. If responses timing allow passed flag is not set, then:
if (!timingInfo.timingAllowPassed) { if (!response.timingAllowPassed) {
// 1. Set timingInfo to a the result of creating an opaque timing info for timingInfo. // 1. Set timingInfo to a the result of creating an opaque timing info for timingInfo.
timingInfo = createOpaqueTimingInfo({ timingInfo = createOpaqueTimingInfo({
startTime: timingInfo.startTime startTime: timingInfo.startTime
@ -63329,6 +63412,9 @@ function httpRedirectFetch (fetchParams, response) {
// https://fetch.spec.whatwg.org/#cors-non-wildcard-request-header-name // https://fetch.spec.whatwg.org/#cors-non-wildcard-request-header-name
request.headersList.delete('authorization') request.headersList.delete('authorization')
// https://fetch.spec.whatwg.org/#authentication-entries
request.headersList.delete('proxy-authorization', true)
// "Cookie" and "Host" are forbidden request-headers, which undici doesn't implement. // "Cookie" and "Host" are forbidden request-headers, which undici doesn't implement.
request.headersList.delete('cookie') request.headersList.delete('cookie')
request.headersList.delete('host') request.headersList.delete('host')
@ -64083,7 +64169,7 @@ async function httpNetworkFetch (
path: url.pathname + url.search, path: url.pathname + url.search,
origin: url.origin, origin: url.origin,
method: request.method, method: request.method,
body: fetchParams.controller.dispatcher.isMockActive ? request.body && request.body.source : body, body: fetchParams.controller.dispatcher.isMockActive ? request.body && (request.body.source || request.body.stream) : body,
headers: request.headersList.entries, headers: request.headersList.entries,
maxRedirections: 0, maxRedirections: 0,
upgrade: request.mode === 'websocket' ? 'websocket' : undefined upgrade: request.mode === 'websocket' ? 'websocket' : undefined
@ -64128,7 +64214,7 @@ async function httpNetworkFetch (
location = val location = val
} }
headers.append(key, val) headers[kHeadersList].append(key, val)
} }
} else { } else {
const keys = Object.keys(headersList) const keys = Object.keys(headersList)
@ -64142,7 +64228,7 @@ async function httpNetworkFetch (
location = val location = val
} }
headers.append(key, val) headers[kHeadersList].append(key, val)
} }
} }
@ -64246,7 +64332,7 @@ async function httpNetworkFetch (
const key = headersList[n + 0].toString('latin1') const key = headersList[n + 0].toString('latin1')
const val = headersList[n + 1].toString('latin1') const val = headersList[n + 1].toString('latin1')
headers.append(key, val) headers[kHeadersList].append(key, val)
} }
resolve({ resolve({
@ -64289,7 +64375,8 @@ const {
isValidHTTPToken, isValidHTTPToken,
sameOrigin, sameOrigin,
normalizeMethod, normalizeMethod,
makePolicyContainer makePolicyContainer,
normalizeMethodRecord
} = __nccwpck_require__(2538) } = __nccwpck_require__(2538)
const { const {
forbiddenMethodsSet, forbiddenMethodsSet,
@ -64306,13 +64393,12 @@ const { kHeaders, kSignal, kState, kGuard, kRealm } = __nccwpck_require__(5861)
const { webidl } = __nccwpck_require__(1744) const { webidl } = __nccwpck_require__(1744)
const { getGlobalOrigin } = __nccwpck_require__(1246) const { getGlobalOrigin } = __nccwpck_require__(1246)
const { URLSerializer } = __nccwpck_require__(685) const { URLSerializer } = __nccwpck_require__(685)
const { kHeadersList } = __nccwpck_require__(2785) const { kHeadersList, kConstruct } = __nccwpck_require__(2785)
const assert = __nccwpck_require__(9491) const assert = __nccwpck_require__(9491)
const { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = __nccwpck_require__(2361) const { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = __nccwpck_require__(2361)
let TransformStream = globalThis.TransformStream let TransformStream = globalThis.TransformStream
const kInit = Symbol('init')
const kAbortController = Symbol('abortController') const kAbortController = Symbol('abortController')
const requestFinalizer = new FinalizationRegistry(({ signal, abort }) => { const requestFinalizer = new FinalizationRegistry(({ signal, abort }) => {
@ -64323,7 +64409,7 @@ const requestFinalizer = new FinalizationRegistry(({ signal, abort }) => {
class Request { class Request {
// https://fetch.spec.whatwg.org/#dom-request // https://fetch.spec.whatwg.org/#dom-request
constructor (input, init = {}) { constructor (input, init = {}) {
if (input === kInit) { if (input === kConstruct) {
return return
} }
@ -64462,8 +64548,10 @@ class Request {
urlList: [...request.urlList] urlList: [...request.urlList]
}) })
const initHasKey = Object.keys(init).length !== 0
// 13. If init is not empty, then: // 13. If init is not empty, then:
if (Object.keys(init).length > 0) { if (initHasKey) {
// 1. If requests mode is "navigate", then set it to "same-origin". // 1. If requests mode is "navigate", then set it to "same-origin".
if (request.mode === 'navigate') { if (request.mode === 'navigate') {
request.mode = 'same-origin' request.mode = 'same-origin'
@ -64578,7 +64666,7 @@ class Request {
} }
// 23. If init["integrity"] exists, then set requests integrity metadata to it. // 23. If init["integrity"] exists, then set requests integrity metadata to it.
if (init.integrity !== undefined && init.integrity != null) { if (init.integrity != null) {
request.integrity = String(init.integrity) request.integrity = String(init.integrity)
} }
@ -64594,16 +64682,16 @@ class Request {
// 2. If method is not a method or method is a forbidden method, then // 2. If method is not a method or method is a forbidden method, then
// throw a TypeError. // throw a TypeError.
if (!isValidHTTPToken(init.method)) { if (!isValidHTTPToken(method)) {
throw TypeError(`'${init.method}' is not a valid HTTP method.`) throw new TypeError(`'${method}' is not a valid HTTP method.`)
} }
if (forbiddenMethodsSet.has(method.toUpperCase())) { if (forbiddenMethodsSet.has(method.toUpperCase())) {
throw TypeError(`'${init.method}' HTTP method is unsupported.`) throw new TypeError(`'${method}' HTTP method is unsupported.`)
} }
// 3. Normalize method. // 3. Normalize method.
method = normalizeMethod(init.method) method = normalizeMethodRecord[method] ?? normalizeMethod(method)
// 4. Set requests method to method. // 4. Set requests method to method.
request.method = method request.method = method
@ -64674,7 +64762,7 @@ class Request {
// 30. Set thiss headers to a new Headers object with thiss relevant // 30. Set thiss headers to a new Headers object with thiss relevant
// Realm, whose header list is requests header list and guard is // Realm, whose header list is requests header list and guard is
// "request". // "request".
this[kHeaders] = new Headers() this[kHeaders] = new Headers(kConstruct)
this[kHeaders][kHeadersList] = request.headersList this[kHeaders][kHeadersList] = request.headersList
this[kHeaders][kGuard] = 'request' this[kHeaders][kGuard] = 'request'
this[kHeaders][kRealm] = this[kRealm] this[kHeaders][kRealm] = this[kRealm]
@ -64694,25 +64782,25 @@ class Request {
} }
// 32. If init is not empty, then: // 32. If init is not empty, then:
if (Object.keys(init).length !== 0) { if (initHasKey) {
/** @type {HeadersList} */
const headersList = this[kHeaders][kHeadersList]
// 1. Let headers be a copy of thiss headers and its associated header // 1. Let headers be a copy of thiss headers and its associated header
// list. // list.
let headers = new Headers(this[kHeaders])
// 2. If init["headers"] exists, then set headers to init["headers"]. // 2. If init["headers"] exists, then set headers to init["headers"].
if (init.headers !== undefined) { const headers = init.headers !== undefined ? init.headers : new HeadersList(headersList)
headers = init.headers
}
// 3. Empty thiss headerss header list. // 3. Empty thiss headerss header list.
this[kHeaders][kHeadersList].clear() headersList.clear()
// 4. If headers is a Headers object, then for each header in its header // 4. If headers is a Headers object, then for each header in its header
// list, append headers name/headers value to thiss headers. // list, append headers name/headers value to thiss headers.
if (headers.constructor.name === 'Headers') { if (headers instanceof HeadersList) {
for (const [key, val] of headers) { for (const [key, val] of headers) {
this[kHeaders].append(key, val) headersList.append(key, val)
} }
// Note: Copy the `set-cookie` meta-data.
headersList.cookies = headers.cookies
} else { } else {
// 5. Otherwise, fill thiss headers with headers. // 5. Otherwise, fill thiss headers with headers.
fillHeaders(this[kHeaders], headers) fillHeaders(this[kHeaders], headers)
@ -65001,10 +65089,10 @@ class Request {
// 3. Let clonedRequestObject be the result of creating a Request object, // 3. Let clonedRequestObject be the result of creating a Request object,
// given clonedRequest, thiss headerss guard, and thiss relevant Realm. // given clonedRequest, thiss headerss guard, and thiss relevant Realm.
const clonedRequestObject = new Request(kInit) const clonedRequestObject = new Request(kConstruct)
clonedRequestObject[kState] = clonedRequest clonedRequestObject[kState] = clonedRequest
clonedRequestObject[kRealm] = this[kRealm] clonedRequestObject[kRealm] = this[kRealm]
clonedRequestObject[kHeaders] = new Headers() clonedRequestObject[kHeaders] = new Headers(kConstruct)
clonedRequestObject[kHeaders][kHeadersList] = clonedRequest.headersList clonedRequestObject[kHeaders][kHeadersList] = clonedRequest.headersList
clonedRequestObject[kHeaders][kGuard] = this[kHeaders][kGuard] clonedRequestObject[kHeaders][kGuard] = this[kHeaders][kGuard]
clonedRequestObject[kHeaders][kRealm] = this[kHeaders][kRealm] clonedRequestObject[kHeaders][kRealm] = this[kHeaders][kRealm]
@ -65254,7 +65342,7 @@ const { webidl } = __nccwpck_require__(1744)
const { FormData } = __nccwpck_require__(2015) const { FormData } = __nccwpck_require__(2015)
const { getGlobalOrigin } = __nccwpck_require__(1246) const { getGlobalOrigin } = __nccwpck_require__(1246)
const { URLSerializer } = __nccwpck_require__(685) const { URLSerializer } = __nccwpck_require__(685)
const { kHeadersList } = __nccwpck_require__(2785) const { kHeadersList, kConstruct } = __nccwpck_require__(2785)
const assert = __nccwpck_require__(9491) const assert = __nccwpck_require__(9491)
const { types } = __nccwpck_require__(3837) const { types } = __nccwpck_require__(3837)
@ -65375,7 +65463,7 @@ class Response {
// 2. Set thiss headers to a new Headers object with thiss relevant // 2. Set thiss headers to a new Headers object with thiss relevant
// Realm, whose header list is thiss responses header list and guard // Realm, whose header list is thiss responses header list and guard
// is "response". // is "response".
this[kHeaders] = new Headers() this[kHeaders] = new Headers(kConstruct)
this[kHeaders][kGuard] = 'response' this[kHeaders][kGuard] = 'response'
this[kHeaders][kHeadersList] = this[kState].headersList this[kHeaders][kHeadersList] = this[kState].headersList
this[kHeaders][kRealm] = this[kRealm] this[kHeaders][kRealm] = this[kRealm]
@ -65745,11 +65833,7 @@ webidl.converters.XMLHttpRequestBodyInit = function (V) {
return webidl.converters.Blob(V, { strict: false }) return webidl.converters.Blob(V, { strict: false })
} }
if ( if (types.isArrayBuffer(V) || types.isTypedArray(V) || types.isDataView(V)) {
types.isAnyArrayBuffer(V) ||
types.isTypedArray(V) ||
types.isDataView(V)
) {
return webidl.converters.BufferSource(V) return webidl.converters.BufferSource(V)
} }
@ -65935,52 +66019,57 @@ function isValidReasonPhrase (statusText) {
return true return true
} }
function isTokenChar (c) { /**
return !( * @see https://tools.ietf.org/html/rfc7230#section-3.2.6
c >= 0x7f || * @param {number} c
c <= 0x20 || */
c === '(' || function isTokenCharCode (c) {
c === ')' || switch (c) {
c === '<' || case 0x22:
c === '>' || case 0x28:
c === '@' || case 0x29:
c === ',' || case 0x2c:
c === ';' || case 0x2f:
c === ':' || case 0x3a:
c === '\\' || case 0x3b:
c === '"' || case 0x3c:
c === '/' || case 0x3d:
c === '[' || case 0x3e:
c === ']' || case 0x3f:
c === '?' || case 0x40:
c === '=' || case 0x5b:
c === '{' || case 0x5c:
c === '}' case 0x5d:
) case 0x7b:
case 0x7d:
// DQUOTE and "(),/:;<=>?@[\]{}"
return false
default:
// VCHAR %x21-7E
return c >= 0x21 && c <= 0x7e
}
} }
// See RFC 7230, Section 3.2.6. /**
// https://github.com/chromium/chromium/blob/d7da0240cae77824d1eda25745c4022757499131/third_party/blink/renderer/platform/network/http_parsers.cc#L321 * @param {string} characters
*/
function isValidHTTPToken (characters) { function isValidHTTPToken (characters) {
if (!characters || typeof characters !== 'string') { if (characters.length === 0) {
return false return false
} }
for (let i = 0; i < characters.length; ++i) { for (let i = 0; i < characters.length; ++i) {
const c = characters.charCodeAt(i) if (!isTokenCharCode(characters.charCodeAt(i))) {
if (c > 0x7f || !isTokenChar(c)) {
return false return false
} }
} }
return true return true
} }
// https://fetch.spec.whatwg.org/#header-name /**
// https://github.com/chromium/chromium/blob/b3d37e6f94f87d59e44662d6078f6a12de845d17/net/http/http_util.cc#L342 * @see https://fetch.spec.whatwg.org/#header-name
* @param {string} potentialValue
*/
function isValidHeaderName (potentialValue) { function isValidHeaderName (potentialValue) {
if (potentialValue.length === 0) {
return false
}
return isValidHTTPToken(potentialValue) return isValidHTTPToken(potentialValue)
} }
@ -66525,11 +66614,30 @@ function isCancelled (fetchParams) {
fetchParams.controller.state === 'terminated' fetchParams.controller.state === 'terminated'
} }
// https://fetch.spec.whatwg.org/#concept-method-normalize const normalizeMethodRecord = {
delete: 'DELETE',
DELETE: 'DELETE',
get: 'GET',
GET: 'GET',
head: 'HEAD',
HEAD: 'HEAD',
options: 'OPTIONS',
OPTIONS: 'OPTIONS',
post: 'POST',
POST: 'POST',
put: 'PUT',
PUT: 'PUT'
}
// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`.
Object.setPrototypeOf(normalizeMethodRecord, null)
/**
* @see https://fetch.spec.whatwg.org/#concept-method-normalize
* @param {string} method
*/
function normalizeMethod (method) { function normalizeMethod (method) {
return /^(DELETE|GET|HEAD|OPTIONS|POST|PUT)$/i.test(method) return normalizeMethodRecord[method.toLowerCase()] ?? method
? method.toUpperCase()
: method
} }
// https://infra.spec.whatwg.org/#serialize-a-javascript-value-to-a-json-string // https://infra.spec.whatwg.org/#serialize-a-javascript-value-to-a-json-string
@ -66874,7 +66982,8 @@ module.exports = {
urlIsLocal, urlIsLocal,
urlHasHttpsScheme, urlHasHttpsScheme,
urlIsHttpHttpsScheme, urlIsHttpHttpsScheme,
readAllBytes readAllBytes,
normalizeMethodRecord
} }
@ -67313,12 +67422,10 @@ webidl.converters.ByteString = function (V) {
// 2. If the value of any element of x is greater than // 2. If the value of any element of x is greater than
// 255, then throw a TypeError. // 255, then throw a TypeError.
for (let index = 0; index < x.length; index++) { for (let index = 0; index < x.length; index++) {
const charCode = x.charCodeAt(index) if (x.charCodeAt(index) > 255) {
if (charCode > 255) {
throw new TypeError( throw new TypeError(
'Cannot convert argument to a ByteString because the character at ' + 'Cannot convert argument to a ByteString because the character at ' +
`index ${index} has a value of ${charCode} which is greater than 255.` `index ${index} has a value of ${x.charCodeAt(index)} which is greater than 255.`
) )
} }
} }
@ -68995,6 +69102,349 @@ function cleanRequestHeaders (headers, removeContent, unknownOrigin) {
module.exports = RedirectHandler module.exports = RedirectHandler
/***/ }),
/***/ 2286:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
const assert = __nccwpck_require__(9491)
const { kRetryHandlerDefaultRetry } = __nccwpck_require__(2785)
const { RequestRetryError } = __nccwpck_require__(8045)
const { isDisturbed, parseHeaders, parseRangeHeader } = __nccwpck_require__(3983)
function calculateRetryAfterHeader (retryAfter) {
const current = Date.now()
const diff = new Date(retryAfter).getTime() - current
return diff
}
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 ?? {}
this.dispatch = handlers.dispatch
this.handler = handlers.handler
this.opts = dispatchOpts
this.abort = null
this.aborted = false
this.retryOpts = {
retry: retryFn ?? RetryHandler[kRetryHandlerDefaultRetry],
retryAfter: retryAfter ?? true,
maxTimeout: maxTimeout ?? 30 * 1000, // 30s,
timeout: 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'
]
}
this.retryCount = 0
this.start = 0
this.end = null
this.etag = null
this.resume = null
// Handle possible onConnect duplication
this.handler.onConnect(reason => {
this.aborted = true
if (this.abort) {
this.abort(reason)
} else {
this.reason = reason
}
})
}
onRequestSent () {
if (this.handler.onRequestSent) {
this.handler.onRequestSent()
}
}
onUpgrade (statusCode, headers, socket) {
if (this.handler.onUpgrade) {
this.handler.onUpgrade(statusCode, headers, socket)
}
}
onConnect (abort) {
if (this.aborted) {
abort(this.reason)
} else {
this.abort = abort
}
}
onBodySent (chunk) {
if (this.handler.onBodySent) return this.handler.onBodySent(chunk)
}
static [kRetryHandlerDefaultRetry] (err, { state, opts }, cb) {
const { statusCode, code, headers } = err
const { method, retryOptions } = opts
const {
maxRetries,
timeout,
maxTimeout,
timeoutFactor,
statusCodes,
errorCodes,
methods
} = retryOptions
let { counter, currentTimeout } = state
currentTimeout =
currentTimeout != null && currentTimeout > 0 ? currentTimeout : timeout
// Any code that is not a Undici's originated and allowed to retry
if (
code &&
code !== 'UND_ERR_REQ_RETRY' &&
code !== 'UND_ERR_SOCKET' &&
!errorCodes.includes(code)
) {
cb(err)
return
}
// 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
}
// 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
}
// If we reached the max number of retries
if (counter > maxRetries) {
cb(err)
return
}
let retryAfterHeader = headers != null && headers['retry-after']
if (retryAfterHeader) {
retryAfterHeader = Number(retryAfterHeader)
retryAfterHeader = isNaN(retryAfterHeader)
? calculateRetryAfterHeader(retryAfterHeader)
: retryAfterHeader * 1e3 // Retry-After is in seconds
}
const retryTimeout =
retryAfterHeader > 0
? Math.min(retryAfterHeader, maxTimeout)
: Math.min(currentTimeout * timeoutFactor ** counter, maxTimeout)
state.currentTimeout = retryTimeout
setTimeout(() => cb(null), retryTimeout)
}
onHeaders (statusCode, rawHeaders, resume, statusMessage) {
const headers = parseHeaders(rawHeaders)
this.retryCount += 1
if (statusCode >= 300) {
this.abort(
new RequestRetryError('Request failed', statusCode, {
headers,
count: this.retryCount
})
)
return false
}
// Checkpoint for resume from where we left it
if (this.resume != null) {
this.resume = null
if (statusCode !== 206) {
return true
}
const contentRange = parseRangeHeader(headers['content-range'])
// If no content range
if (!contentRange) {
this.abort(
new RequestRetryError('Content-Range mismatch', statusCode, {
headers,
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,
count: this.retryCount
})
)
return false
}
const { start, size, end = size } = contentRange
assert(this.start === start, 'content-range mismatch')
assert(this.end == null || this.end === end, 'content-range mismatch')
this.resume = resume
return true
}
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
)
}
const { start, size, end = size } = range
assert(
start != null && Number.isFinite(start) && this.start !== start,
'content-range mismatch'
)
assert(Number.isFinite(start))
assert(
end != null && Number.isFinite(end) && this.end !== end,
'invalid content-length'
)
this.start = start
this.end = end
}
// 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) : null
}
assert(Number.isFinite(this.start))
assert(
this.end == null || Number.isFinite(this.end),
'invalid content-length'
)
this.resume = resume
this.etag = headers.etag != null ? headers.etag : null
return this.handler.onHeaders(
statusCode,
rawHeaders,
resume,
statusMessage
)
}
const err = new RequestRetryError('Request failed', statusCode, {
headers,
count: this.retryCount
})
this.abort(err)
return false
}
onData (chunk) {
this.start += chunk.length
return this.handler.onData(chunk)
}
onComplete (rawTrailers) {
this.retryCount = 0
return this.handler.onComplete(rawTrailers)
}
onError (err) {
if (this.aborted || isDisturbed(this.opts.body)) {
return this.handler.onError(err)
}
this.retryOpts.retry(
err,
{
state: { counter: this.retryCount++, currentTimeout: this.retryAfter },
opts: { retryOptions: this.retryOpts, ...this.opts }
},
onRetry.bind(this)
)
function onRetry (err) {
if (err != null || this.aborted || isDisturbed(this.opts.body)) {
return this.handler.onError(err)
}
if (this.start !== 0) {
this.opts = {
...this.opts,
headers: {
...this.opts.headers,
range: `bytes=${this.start}-${this.end ?? ''}`
}
}
}
try {
this.dispatch(this.opts, this)
} catch (err) {
this.handler.onError(err)
}
}
}
}
module.exports = RetryHandler
/***/ }), /***/ }),
/***/ 8861: /***/ 8861:
@ -70917,6 +71367,9 @@ class ProxyAgent extends DispatcherBase {
this[kProxyTls] = opts.proxyTls this[kProxyTls] = opts.proxyTls
this[kProxyHeaders] = opts.headers || {} this[kProxyHeaders] = opts.headers || {}
const resolvedUrl = new URL(opts.uri)
const { origin, port, host, username, password } = resolvedUrl
if (opts.auth && opts.token) { if (opts.auth && opts.token) {
throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token') throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token')
} else if (opts.auth) { } else if (opts.auth) {
@ -70924,11 +71377,10 @@ class ProxyAgent extends DispatcherBase {
this[kProxyHeaders]['proxy-authorization'] = `Basic ${opts.auth}` this[kProxyHeaders]['proxy-authorization'] = `Basic ${opts.auth}`
} else if (opts.token) { } else if (opts.token) {
this[kProxyHeaders]['proxy-authorization'] = 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 resolvedUrl = new URL(opts.uri)
const { origin, port, host } = resolvedUrl
const connect = buildConnector({ ...opts.proxyTls }) const connect = buildConnector({ ...opts.proxyTls })
this[kConnectEndpoint] = buildConnector({ ...opts.requestTls }) this[kConnectEndpoint] = buildConnector({ ...opts.requestTls })
this[kClient] = clientFactory(resolvedUrl, { connect }) this[kClient] = clientFactory(resolvedUrl, { connect })
@ -70952,7 +71404,7 @@ class ProxyAgent extends DispatcherBase {
}) })
if (statusCode !== 200) { if (statusCode !== 200) {
socket.on('error', () => {}).destroy() socket.on('error', () => {}).destroy()
callback(new RequestAbortedError('Proxy response !== 200 when HTTP Tunneling')) callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`))
} }
if (opts.protocol !== 'https:') { if (opts.protocol !== 'https:') {
callback(null, socket) callback(null, socket)

989
dist/setup/index.js vendored
View File

@ -319,7 +319,8 @@ function createHttpClient() {
return new http_client_1.HttpClient('actions/cache', [bearerCredentialHandler], getRequestOptions()); return new http_client_1.HttpClient('actions/cache', [bearerCredentialHandler], getRequestOptions());
} }
function getCacheVersion(paths, compressionMethod, enableCrossOsArchive = false) { function getCacheVersion(paths, compressionMethod, enableCrossOsArchive = false) {
const components = paths; // don't pass changes upstream
const components = paths.slice();
// Add compression method to cache version to restore // Add compression method to cache version to restore
// compressed cache as per compression method // compressed cache as per compression method
if (compressionMethod) { if (compressionMethod) {
@ -608,26 +609,21 @@ function resolvePaths(patterns) {
implicitDescendants: false implicitDescendants: false
}); });
try { try {
for (var _e = true, _f = __asyncValues(globber.globGenerator()), _g; _g = yield _f.next(), _a = _g.done, !_a;) { for (var _e = true, _f = __asyncValues(globber.globGenerator()), _g; _g = yield _f.next(), _a = _g.done, !_a; _e = true) {
_c = _g.value; _c = _g.value;
_e = false; _e = false;
try { const file = _c;
const file = _c; const relativeFile = path
const relativeFile = path .relative(workspace, file)
.relative(workspace, file) .replace(new RegExp(`\\${path.sep}`, 'g'), '/');
.replace(new RegExp(`\\${path.sep}`, 'g'), '/'); core.debug(`Matched: ${relativeFile}`);
core.debug(`Matched: ${relativeFile}`); // Paths are made relative so the tar entries are all relative to the root of the workspace.
// Paths are made relative so the tar entries are all relative to the root of the workspace. if (relativeFile === '') {
if (relativeFile === '') { // path.relative returns empty string if workspace and file are equal
// path.relative returns empty string if workspace and file are equal paths.push('.');
paths.push('.');
}
else {
paths.push(`${relativeFile}`);
}
} }
finally { else {
_e = true; paths.push(`${relativeFile}`);
} }
} }
} }
@ -711,7 +707,10 @@ function assertDefined(name, value) {
exports.assertDefined = assertDefined; exports.assertDefined = assertDefined;
function isGhes() { function isGhes() {
const ghUrl = new URL(process.env['GITHUB_SERVER_URL'] || 'https://github.com'); const ghUrl = new URL(process.env['GITHUB_SERVER_URL'] || 'https://github.com');
return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM'; const hostname = ghUrl.hostname.trimEnd().toUpperCase();
const isGitHubHost = hostname === 'GITHUB.COM';
const isGheHost = hostname.endsWith('.GHE.COM') || hostname.endsWith('.GHE.LOCALHOST');
return !isGitHubHost && !isGheHost;
} }
exports.isGhes = isGhes; exports.isGhes = isGhes;
//# sourceMappingURL=cacheUtils.js.map //# sourceMappingURL=cacheUtils.js.map
@ -729,7 +728,7 @@ var CacheFilename;
(function (CacheFilename) { (function (CacheFilename) {
CacheFilename["Gzip"] = "cache.tgz"; CacheFilename["Gzip"] = "cache.tgz";
CacheFilename["Zstd"] = "cache.tzst"; CacheFilename["Zstd"] = "cache.tzst";
})(CacheFilename = exports.CacheFilename || (exports.CacheFilename = {})); })(CacheFilename || (exports.CacheFilename = CacheFilename = {}));
var CompressionMethod; var CompressionMethod;
(function (CompressionMethod) { (function (CompressionMethod) {
CompressionMethod["Gzip"] = "gzip"; CompressionMethod["Gzip"] = "gzip";
@ -737,12 +736,12 @@ var CompressionMethod;
// This enum is for earlier version of zstd that does not have --long support // This enum is for earlier version of zstd that does not have --long support
CompressionMethod["ZstdWithoutLong"] = "zstd-without-long"; CompressionMethod["ZstdWithoutLong"] = "zstd-without-long";
CompressionMethod["Zstd"] = "zstd"; CompressionMethod["Zstd"] = "zstd";
})(CompressionMethod = exports.CompressionMethod || (exports.CompressionMethod = {})); })(CompressionMethod || (exports.CompressionMethod = CompressionMethod = {}));
var ArchiveToolType; var ArchiveToolType;
(function (ArchiveToolType) { (function (ArchiveToolType) {
ArchiveToolType["GNU"] = "gnu"; ArchiveToolType["GNU"] = "gnu";
ArchiveToolType["BSD"] = "bsd"; ArchiveToolType["BSD"] = "bsd";
})(ArchiveToolType = exports.ArchiveToolType || (exports.ArchiveToolType = {})); })(ArchiveToolType || (exports.ArchiveToolType = ArchiveToolType = {}));
// The default number of retry attempts. // The default number of retry attempts.
exports.DefaultRetryAttempts = 2; exports.DefaultRetryAttempts = 2;
// The default delay in milliseconds between retry attempts. // The default delay in milliseconds between retry attempts.
@ -8551,7 +8550,7 @@ class HttpClient {
if (this._keepAlive && useProxy) { if (this._keepAlive && useProxy) {
agent = this._proxyAgent; agent = this._proxyAgent;
} }
if (this._keepAlive && !useProxy) { if (!useProxy) {
agent = this._agent; agent = this._agent;
} }
// if agent is already assigned use that agent. // if agent is already assigned use that agent.
@ -8583,16 +8582,12 @@ class HttpClient {
agent = tunnelAgent(agentOptions); agent = tunnelAgent(agentOptions);
this._proxyAgent = agent; this._proxyAgent = agent;
} }
// if reusing agent across request and tunneling agent isn't assigned create a new agent // if tunneling agent isn't assigned create a new agent
if (this._keepAlive && !agent) { if (!agent) {
const options = { keepAlive: this._keepAlive, maxSockets }; const options = { keepAlive: this._keepAlive, maxSockets };
agent = usingSsl ? new https.Agent(options) : new http.Agent(options); agent = usingSsl ? new https.Agent(options) : new http.Agent(options);
this._agent = agent; this._agent = agent;
} }
// if not using private agent and tunnel agent isn't setup then use global agent
if (!agent) {
agent = usingSsl ? https.globalAgent : http.globalAgent;
}
if (usingSsl && this._ignoreSslError) { if (usingSsl && this._ignoreSslError) {
// we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process
// http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options
@ -57734,35 +57729,43 @@ const coerce = (version, options) => {
let match = null let match = null
if (!options.rtl) { if (!options.rtl) {
match = version.match(re[t.COERCE]) match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE])
} else { } else {
// Find the right-most coercible string that does not share // Find the right-most coercible string that does not share
// a terminus with a more left-ward coercible string. // 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' // 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 // Walk through the string checking with a /g regexp
// Manually set the index so as to pick up overlapping matches. // 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 // 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. // coercible string can be more right-ward without the same terminus.
const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL]
let next let next
while ((next = re[t.COERCERTL].exec(version)) && while ((next = coerceRtlRegex.exec(version)) &&
(!match || match.index + match[0].length !== version.length) (!match || match.index + match[0].length !== version.length)
) { ) {
if (!match || if (!match ||
next.index + next[0].length !== match.index + match[0].length) { next.index + next[0].length !== match.index + match[0].length) {
match = next match = next
} }
re[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length
} }
// leave it in a clean state // leave it in a clean state
re[t.COERCERTL].lastIndex = -1 coerceRtlRegex.lastIndex = -1
} }
if (match === null) { if (match === null) {
return null return null
} }
return parse(`${match[2]}.${match[3] || '0'}.${match[4] || '0'}`, options) 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 module.exports = coerce
@ -58454,12 +58457,17 @@ createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`)
// Coercion. // Coercion.
// Extract anything that could conceivably be a part of a valid semver // Extract anything that could conceivably be a part of a valid semver
createToken('COERCE', `${'(^|[^\\d])' + createToken('COERCEPLAIN', `${'(^|[^\\d])' +
'(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` + '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +
`(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + `(?:\\.(\\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])`) `(?:$|[^\\d])`)
createToken('COERCERTL', src[t.COERCE], true) createToken('COERCERTL', src[t.COERCE], true)
createToken('COERCERTLFULL', src[t.COERCEFULL], true)
// Tilde ranges. // Tilde ranges.
// Meaning is "reasonably at or greater than" // Meaning is "reasonably at or greater than"
@ -60831,6 +60839,7 @@ const MockAgent = __nccwpck_require__(6771)
const MockPool = __nccwpck_require__(6193) const MockPool = __nccwpck_require__(6193)
const mockErrors = __nccwpck_require__(888) const mockErrors = __nccwpck_require__(888)
const ProxyAgent = __nccwpck_require__(7858) const ProxyAgent = __nccwpck_require__(7858)
const RetryHandler = __nccwpck_require__(2286)
const { getGlobalDispatcher, setGlobalDispatcher } = __nccwpck_require__(1892) const { getGlobalDispatcher, setGlobalDispatcher } = __nccwpck_require__(1892)
const DecoratorHandler = __nccwpck_require__(6930) const DecoratorHandler = __nccwpck_require__(6930)
const RedirectHandler = __nccwpck_require__(2860) const RedirectHandler = __nccwpck_require__(2860)
@ -60852,6 +60861,7 @@ module.exports.Pool = Pool
module.exports.BalancedPool = BalancedPool module.exports.BalancedPool = BalancedPool
module.exports.Agent = Agent module.exports.Agent = Agent
module.exports.ProxyAgent = ProxyAgent module.exports.ProxyAgent = ProxyAgent
module.exports.RetryHandler = RetryHandler
module.exports.DecoratorHandler = DecoratorHandler module.exports.DecoratorHandler = DecoratorHandler
module.exports.RedirectHandler = RedirectHandler module.exports.RedirectHandler = RedirectHandler
@ -61752,6 +61762,7 @@ function request (opts, callback) {
} }
module.exports = request module.exports = request
module.exports.RequestHandler = RequestHandler
/***/ }), /***/ }),
@ -62134,6 +62145,8 @@ const kBody = Symbol('kBody')
const kAbort = Symbol('abort') const kAbort = Symbol('abort')
const kContentType = Symbol('kContentType') const kContentType = Symbol('kContentType')
const noop = () => {}
module.exports = class BodyReadable extends Readable { module.exports = class BodyReadable extends Readable {
constructor ({ constructor ({
resume, resume,
@ -62267,37 +62280,50 @@ module.exports = class BodyReadable extends Readable {
return this[kBody] return this[kBody]
} }
async dump (opts) { dump (opts) {
let limit = opts && Number.isFinite(opts.limit) ? opts.limit : 262144 let limit = opts && Number.isFinite(opts.limit) ? opts.limit : 262144
const signal = opts && opts.signal const signal = opts && opts.signal
const abortFn = () => {
this.destroy()
}
let signalListenerCleanup
if (signal) { if (signal) {
if (typeof signal !== 'object' || !('aborted' in signal)) { try {
throw new InvalidArgumentError('signal must be an AbortSignal') if (typeof signal !== 'object' || !('aborted' in signal)) {
} throw new InvalidArgumentError('signal must be an AbortSignal')
util.throwIfAborted(signal)
signalListenerCleanup = util.addAbortListener(signal, abortFn)
}
try {
for await (const chunk of this) {
util.throwIfAborted(signal)
limit -= Buffer.byteLength(chunk)
if (limit < 0) {
return
} }
} util.throwIfAborted(signal)
} catch { } catch (err) {
util.throwIfAborted(signal) return Promise.reject(err)
} finally {
if (typeof signalListenerCleanup === 'function') {
signalListenerCleanup()
} else if (signalListenerCleanup) {
signalListenerCleanup[Symbol.dispose]()
} }
} }
if (this.closed) {
return Promise.resolve(null)
}
return new Promise((resolve, reject) => {
const signalListenerCleanup = signal
? util.addAbortListener(signal, () => {
this.destroy()
})
: noop
this
.on('close', function () {
signalListenerCleanup()
if (signal && signal.aborted) {
reject(signal.reason || Object.assign(new Error('The operation was aborted'), { name: 'AbortError' }))
} else {
resolve(null)
}
})
.on('error', noop)
.on('data', function (chunk) {
limit -= chunk.length
if (limit <= 0) {
this.destroy()
}
})
.resume()
})
} }
} }
@ -63677,13 +63703,13 @@ module.exports = {
/***/ }), /***/ }),
/***/ 9174: /***/ 9174:
/***/ ((module) => { /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict"; "use strict";
module.exports = { module.exports = {
kConstruct: Symbol('constructable') kConstruct: (__nccwpck_require__(2785).kConstruct)
} }
@ -64669,11 +64695,9 @@ class Parser {
socket[kReset] = true socket[kReset] = true
} }
let pause const pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false
try {
pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false if (request.aborted) {
} catch (err) {
util.destroy(socket, err)
return -1 return -1
} }
@ -64720,13 +64744,8 @@ class Parser {
this.bytesRead += buf.length this.bytesRead += buf.length
try { if (request.onData(buf) === false) {
if (request.onData(buf) === false) { return constants.ERROR.PAUSED
return constants.ERROR.PAUSED
}
} catch (err) {
util.destroy(socket, err)
return -1
} }
} }
@ -64767,11 +64786,7 @@ class Parser {
return -1 return -1
} }
try { request.onComplete(headers)
request.onComplete(headers)
} catch (err) {
errorRequest(client, request, err)
}
client[kQueue][client[kRunningIdx]++] = null client[kQueue][client[kRunningIdx]++] = null
@ -64935,7 +64950,7 @@ async function connect (client) {
const idx = hostname.indexOf(']') const idx = hostname.indexOf(']')
assert(idx !== -1) assert(idx !== -1)
const ip = hostname.substr(1, idx - 1) const ip = hostname.substring(1, idx)
assert(net.isIP(ip)) assert(net.isIP(ip))
hostname = ip hostname = ip
@ -65434,6 +65449,7 @@ function writeH2 (client, session, request) {
return false return false
} }
/** @type {import('node:http2').ClientHttp2Stream} */
let stream let stream
const h2State = client[kHTTP2SessionState] const h2State = client[kHTTP2SessionState]
@ -65529,14 +65545,10 @@ function writeH2 (client, session, request) {
const shouldEndStream = method === 'GET' || method === 'HEAD' const shouldEndStream = method === 'GET' || method === 'HEAD'
if (expectContinue) { if (expectContinue) {
headers[HTTP2_HEADER_EXPECT] = '100-continue' headers[HTTP2_HEADER_EXPECT] = '100-continue'
/**
* @type {import('node:http2').ClientHttp2Stream}
*/
stream = session.request(headers, { endStream: shouldEndStream, signal }) stream = session.request(headers, { endStream: shouldEndStream, signal })
stream.once('continue', writeBodyH2) stream.once('continue', writeBodyH2)
} else { } else {
/** @type {import('node:http2').ClientHttp2Stream} */
stream = session.request(headers, { stream = session.request(headers, {
endStream: shouldEndStream, endStream: shouldEndStream,
signal signal
@ -65548,7 +65560,9 @@ function writeH2 (client, session, request) {
++h2State.openStreams ++h2State.openStreams
stream.once('response', headers => { stream.once('response', headers => {
if (request.onHeaders(Number(headers[HTTP2_HEADER_STATUS]), headers, stream.resume.bind(stream), '') === false) { const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers
if (request.onHeaders(Number(statusCode), realHeaders, stream.resume.bind(stream), '') === false) {
stream.pause() stream.pause()
} }
}) })
@ -65558,13 +65572,17 @@ function writeH2 (client, session, request) {
}) })
stream.on('data', (chunk) => { stream.on('data', (chunk) => {
if (request.onData(chunk) === false) stream.pause() if (request.onData(chunk) === false) {
stream.pause()
}
}) })
stream.once('close', () => { stream.once('close', () => {
h2State.openStreams -= 1 h2State.openStreams -= 1
// TODO(HTTP/2): unref only if current streams count is 0 // TODO(HTTP/2): unref only if current streams count is 0
if (h2State.openStreams === 0) session.unref() if (h2State.openStreams === 0) {
session.unref()
}
}) })
stream.once('error', function (err) { stream.once('error', function (err) {
@ -65724,7 +65742,11 @@ function writeStream ({ h2stream, body, client, request, socket, contentLength,
} }
} }
const onAbort = function () { const onAbort = function () {
onFinished(new RequestAbortedError()) if (finished) {
return
}
const err = new RequestAbortedError()
queueMicrotask(() => onFinished(err))
} }
const onFinished = function (err) { const onFinished = function (err) {
if (finished) { if (finished) {
@ -67329,6 +67351,19 @@ class ResponseExceededMaxSizeError extends UndiciError {
} }
} }
class RequestRetryError extends UndiciError {
constructor (message, code, { headers, data }) {
super(message)
Error.captureStackTrace(this, RequestRetryError)
this.name = 'RequestRetryError'
this.message = message || 'Request retry error'
this.code = 'UND_ERR_REQ_RETRY'
this.statusCode = code
this.data = data
this.headers = headers
}
}
module.exports = { module.exports = {
HTTPParserError, HTTPParserError,
UndiciError, UndiciError,
@ -67348,7 +67383,8 @@ module.exports = {
NotSupportedError, NotSupportedError,
ResponseContentLengthMismatchError, ResponseContentLengthMismatchError,
BalancedPoolMissingUpstreamError, BalancedPoolMissingUpstreamError,
ResponseExceededMaxSizeError ResponseExceededMaxSizeError,
RequestRetryError
} }
@ -67590,9 +67626,9 @@ class Request {
onBodySent (chunk) { onBodySent (chunk) {
if (this[kHandler].onBodySent) { if (this[kHandler].onBodySent) {
try { try {
this[kHandler].onBodySent(chunk) return this[kHandler].onBodySent(chunk)
} catch (err) { } catch (err) {
this.onError(err) this.abort(err)
} }
} }
} }
@ -67604,9 +67640,9 @@ class Request {
if (this[kHandler].onRequestSent) { if (this[kHandler].onRequestSent) {
try { try {
this[kHandler].onRequestSent() return this[kHandler].onRequestSent()
} catch (err) { } catch (err) {
this.onError(err) this.abort(err)
} }
} }
} }
@ -67631,14 +67667,23 @@ class Request {
channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }) channels.headers.publish({ request: this, response: { statusCode, headers, statusText } })
} }
return this[kHandler].onHeaders(statusCode, headers, resume, statusText) try {
return this[kHandler].onHeaders(statusCode, headers, resume, statusText)
} catch (err) {
this.abort(err)
}
} }
onData (chunk) { onData (chunk) {
assert(!this.aborted) assert(!this.aborted)
assert(!this.completed) assert(!this.completed)
return this[kHandler].onData(chunk) try {
return this[kHandler].onData(chunk)
} catch (err) {
this.abort(err)
return false
}
} }
onUpgrade (statusCode, headers, socket) { onUpgrade (statusCode, headers, socket) {
@ -67657,7 +67702,13 @@ class Request {
if (channels.trailers.hasSubscribers) { if (channels.trailers.hasSubscribers) {
channels.trailers.publish({ request: this, trailers }) channels.trailers.publish({ request: this, trailers })
} }
return this[kHandler].onComplete(trailers)
try {
return this[kHandler].onComplete(trailers)
} catch (err) {
// TODO (fix): This might be a bad idea?
this.onError(err)
}
} }
onError (error) { onError (error) {
@ -67671,6 +67722,7 @@ class Request {
return return
} }
this.aborted = true this.aborted = true
return this[kHandler].onError(error) return this[kHandler].onError(error)
} }
@ -67907,7 +67959,9 @@ module.exports = {
kHTTP2BuildRequest: Symbol('http2 build request'), kHTTP2BuildRequest: Symbol('http2 build request'),
kHTTP1BuildRequest: Symbol('http1 build request'), kHTTP1BuildRequest: Symbol('http1 build request'),
kHTTP2CopyHeaders: Symbol('http2 copy headers'), kHTTP2CopyHeaders: Symbol('http2 copy headers'),
kHTTPConnVersion: Symbol('http connection version') kHTTPConnVersion: Symbol('http connection version'),
kRetryHandlerDefaultRetry: Symbol('retry agent default retry'),
kConstruct: Symbol('constructable')
} }
@ -68044,13 +68098,13 @@ function getHostname (host) {
const idx = host.indexOf(']') const idx = host.indexOf(']')
assert(idx !== -1) assert(idx !== -1)
return host.substr(1, idx - 1) return host.substring(1, idx)
} }
const idx = host.indexOf(':') const idx = host.indexOf(':')
if (idx === -1) return host if (idx === -1) return host
return host.substr(0, idx) return host.substring(0, idx)
} }
// IP addresses are not valid server names per RFC6066 // IP addresses are not valid server names per RFC6066
@ -68147,7 +68201,7 @@ function parseHeaders (headers, obj = {}) {
if (!val) { if (!val) {
if (Array.isArray(headers[i + 1])) { if (Array.isArray(headers[i + 1])) {
obj[key] = headers[i + 1] obj[key] = headers[i + 1].map(x => x.toString('utf8'))
} else { } else {
obj[key] = headers[i + 1].toString('utf8') obj[key] = headers[i + 1].toString('utf8')
} }
@ -68350,16 +68404,7 @@ function throwIfAborted (signal) {
} }
} }
let events
function addAbortListener (signal, listener) { function addAbortListener (signal, listener) {
if (typeof Symbol.dispose === 'symbol') {
if (!events) {
events = __nccwpck_require__(2361)
}
if (typeof events.addAbortListener === 'function' && 'aborted' in signal) {
return events.addAbortListener(signal, listener)
}
}
if ('addEventListener' in signal) { if ('addEventListener' in signal) {
signal.addEventListener('abort', listener, { once: true }) signal.addEventListener('abort', listener, { once: true })
return () => signal.removeEventListener('abort', listener) return () => signal.removeEventListener('abort', listener)
@ -68383,6 +68428,21 @@ function toUSVString (val) {
return `${val}` return `${val}`
} }
// 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
}
const kEnumerableProperty = Object.create(null) const kEnumerableProperty = Object.create(null)
kEnumerableProperty.enumerable = true kEnumerableProperty.enumerable = true
@ -68416,9 +68476,11 @@ module.exports = {
buildURL, buildURL,
throwIfAborted, throwIfAborted,
addAbortListener, addAbortListener,
parseRangeHeader,
nodeMajor, nodeMajor,
nodeMinor, nodeMinor,
nodeHasAutoSelectFamily: nodeMajor > 18 || (nodeMajor === 18 && nodeMinor >= 13) nodeHasAutoSelectFamily: nodeMajor > 18 || (nodeMajor === 18 && nodeMinor >= 13),
safeHTTPMethods: ['GET', 'HEAD', 'OPTIONS', 'TRACE']
} }
@ -69547,17 +69609,14 @@ function dataURLProcessor (dataURL) {
* @param {boolean} excludeFragment * @param {boolean} excludeFragment
*/ */
function URLSerializer (url, excludeFragment = false) { function URLSerializer (url, excludeFragment = false) {
const href = url.href
if (!excludeFragment) { if (!excludeFragment) {
return href return url.href
} }
const hash = href.lastIndexOf('#') const href = url.href
if (hash === -1) { const hashLength = url.hash.length
return href
} return hashLength === 0 ? href : href.substring(0, href.length - hashLength)
return href.slice(0, hash)
} }
// https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points // https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points
@ -70741,7 +70800,7 @@ module.exports = {
const { kHeadersList } = __nccwpck_require__(2785) const { kHeadersList, kConstruct } = __nccwpck_require__(2785)
const { kGuard } = __nccwpck_require__(5861) const { kGuard } = __nccwpck_require__(5861)
const { kEnumerableProperty } = __nccwpck_require__(3983) const { kEnumerableProperty } = __nccwpck_require__(3983)
const { const {
@ -70755,6 +70814,13 @@ const assert = __nccwpck_require__(9491)
const kHeadersMap = Symbol('headers map') const kHeadersMap = Symbol('headers map')
const kHeadersSortedMap = Symbol('headers map sorted') const kHeadersSortedMap = Symbol('headers map sorted')
/**
* @param {number} code
*/
function isHTTPWhiteSpaceCharCode (code) {
return code === 0x00a || code === 0x00d || code === 0x009 || code === 0x020
}
/** /**
* @see https://fetch.spec.whatwg.org/#concept-header-value-normalize * @see https://fetch.spec.whatwg.org/#concept-header-value-normalize
* @param {string} potentialValue * @param {string} potentialValue
@ -70763,12 +70829,12 @@ function headerValueNormalize (potentialValue) {
// To normalize a byte sequence potentialValue, remove // To normalize a byte sequence potentialValue, remove
// any leading and trailing HTTP whitespace bytes from // any leading and trailing HTTP whitespace bytes from
// potentialValue. // potentialValue.
let i = 0; let j = potentialValue.length
// Trimming the end with `.replace()` and a RegExp is typically subject to while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(j - 1))) --j
// ReDoS. This is safer and faster. while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(i))) ++i
let i = potentialValue.length
while (/[\r\n\t ]/.test(potentialValue.charAt(--i))); return i === 0 && j === potentialValue.length ? potentialValue : potentialValue.substring(i, j)
return potentialValue.slice(0, i + 1).replace(/^[\r\n\t ]+/, '')
} }
function fill (headers, object) { function fill (headers, object) {
@ -70777,7 +70843,8 @@ function fill (headers, object) {
// 1. If object is a sequence, then for each header in object: // 1. If object is a sequence, then for each header in object:
// Note: webidl conversion to array has already been done. // Note: webidl conversion to array has already been done.
if (Array.isArray(object)) { if (Array.isArray(object)) {
for (const header of object) { for (let i = 0; i < object.length; ++i) {
const header = object[i]
// 1. If header does not contain exactly two items, then throw a TypeError. // 1. If header does not contain exactly two items, then throw a TypeError.
if (header.length !== 2) { if (header.length !== 2) {
throw webidl.errors.exception({ throw webidl.errors.exception({
@ -70787,15 +70854,16 @@ function fill (headers, object) {
} }
// 2. Append (headers first item, headers second item) to headers. // 2. Append (headers first item, headers second item) to headers.
headers.append(header[0], header[1]) appendHeader(headers, header[0], header[1])
} }
} else if (typeof object === 'object' && object !== null) { } else if (typeof object === 'object' && object !== null) {
// Note: null should throw // Note: null should throw
// 2. Otherwise, object is a record, then for each key → value in object, // 2. Otherwise, object is a record, then for each key → value in object,
// append (key, value) to headers // append (key, value) to headers
for (const [key, value] of Object.entries(object)) { const keys = Object.keys(object)
headers.append(key, value) for (let i = 0; i < keys.length; ++i) {
appendHeader(headers, keys[i], object[keys[i]])
} }
} else { } else {
throw webidl.errors.conversionFailed({ throw webidl.errors.conversionFailed({
@ -70806,6 +70874,50 @@ function fill (headers, object) {
} }
} }
/**
* @see https://fetch.spec.whatwg.org/#concept-headers-append
*/
function appendHeader (headers, name, value) {
// 1. Normalize value.
value = headerValueNormalize(value)
// 2. If name is not a header name or value is not a
// header value, then throw a TypeError.
if (!isValidHeaderName(name)) {
throw webidl.errors.invalidArgument({
prefix: 'Headers.append',
value: name,
type: 'header name'
})
} else if (!isValidHeaderValue(value)) {
throw webidl.errors.invalidArgument({
prefix: 'Headers.append',
value,
type: 'header value'
})
}
// 3. If headerss guard is "immutable", then throw a TypeError.
// 4. Otherwise, if headerss guard is "request" and name is a
// forbidden header name, return.
// Note: undici does not implement forbidden header names
if (headers[kGuard] === 'immutable') {
throw new TypeError('immutable')
} else if (headers[kGuard] === 'request-no-cors') {
// 5. Otherwise, if headerss guard is "request-no-cors":
// TODO
}
// 6. Otherwise, if headerss guard is "response" and name is a
// forbidden response-header name, return.
// 7. Append (name, value) to headerss header list.
return headers[kHeadersList].append(name, value)
// 8. If headerss guard is "request-no-cors", then remove
// privileged no-CORS request headers from headers
}
class HeadersList { class HeadersList {
/** @type {[string, string][]|null} */ /** @type {[string, string][]|null} */
cookies = null cookies = null
@ -70814,7 +70926,7 @@ class HeadersList {
if (init instanceof HeadersList) { if (init instanceof HeadersList) {
this[kHeadersMap] = new Map(init[kHeadersMap]) this[kHeadersMap] = new Map(init[kHeadersMap])
this[kHeadersSortedMap] = init[kHeadersSortedMap] this[kHeadersSortedMap] = init[kHeadersSortedMap]
this.cookies = init.cookies this.cookies = init.cookies === null ? null : [...init.cookies]
} else { } else {
this[kHeadersMap] = new Map(init) this[kHeadersMap] = new Map(init)
this[kHeadersSortedMap] = null this[kHeadersSortedMap] = null
@ -70876,7 +70988,7 @@ class HeadersList {
// the first such header to value and remove the // the first such header to value and remove the
// others. // others.
// 2. Otherwise, append header (name, value) to list. // 2. Otherwise, append header (name, value) to list.
return this[kHeadersMap].set(lowercaseName, { name, value }) this[kHeadersMap].set(lowercaseName, { name, value })
} }
// https://fetch.spec.whatwg.org/#concept-header-list-delete // https://fetch.spec.whatwg.org/#concept-header-list-delete
@ -70889,20 +71001,18 @@ class HeadersList {
this.cookies = null this.cookies = null
} }
return this[kHeadersMap].delete(name) this[kHeadersMap].delete(name)
} }
// https://fetch.spec.whatwg.org/#concept-header-list-get // https://fetch.spec.whatwg.org/#concept-header-list-get
get (name) { get (name) {
// 1. If list does not contain name, then return null. const value = this[kHeadersMap].get(name.toLowerCase())
if (!this.contains(name)) {
return null
}
// 1. If list does not contain name, then return null.
// 2. Return the values of all headers in list whose name // 2. Return the values of all headers in list whose name
// is a byte-case-insensitive match for name, // is a byte-case-insensitive match for name,
// separated from each other by 0x2C 0x20, in order. // separated from each other by 0x2C 0x20, in order.
return this[kHeadersMap].get(name.toLowerCase())?.value ?? null return value === undefined ? null : value.value
} }
* [Symbol.iterator] () { * [Symbol.iterator] () {
@ -70928,6 +71038,9 @@ class HeadersList {
// https://fetch.spec.whatwg.org/#headers-class // https://fetch.spec.whatwg.org/#headers-class
class Headers { class Headers {
constructor (init = undefined) { constructor (init = undefined) {
if (init === kConstruct) {
return
}
this[kHeadersList] = new HeadersList() this[kHeadersList] = new HeadersList()
// The new Headers(init) constructor steps are: // The new Headers(init) constructor steps are:
@ -70951,43 +71064,7 @@ class Headers {
name = webidl.converters.ByteString(name) name = webidl.converters.ByteString(name)
value = webidl.converters.ByteString(value) value = webidl.converters.ByteString(value)
// 1. Normalize value. return appendHeader(this, name, value)
value = headerValueNormalize(value)
// 2. If name is not a header name or value is not a
// header value, then throw a TypeError.
if (!isValidHeaderName(name)) {
throw webidl.errors.invalidArgument({
prefix: 'Headers.append',
value: name,
type: 'header name'
})
} else if (!isValidHeaderValue(value)) {
throw webidl.errors.invalidArgument({
prefix: 'Headers.append',
value,
type: 'header value'
})
}
// 3. If headerss guard is "immutable", then throw a TypeError.
// 4. Otherwise, if headerss guard is "request" and name is a
// forbidden header name, return.
// Note: undici does not implement forbidden header names
if (this[kGuard] === 'immutable') {
throw new TypeError('immutable')
} else if (this[kGuard] === 'request-no-cors') {
// 5. Otherwise, if headerss guard is "request-no-cors":
// TODO
}
// 6. Otherwise, if headerss guard is "response" and name is a
// forbidden response-header name, return.
// 7. Append (name, value) to headerss header list.
// 8. If headerss guard is "request-no-cors", then remove
// privileged no-CORS request headers from headers
return this[kHeadersList].append(name, value)
} }
// https://fetch.spec.whatwg.org/#dom-headers-delete // https://fetch.spec.whatwg.org/#dom-headers-delete
@ -71032,7 +71109,7 @@ class Headers {
// 7. Delete name from thiss header list. // 7. Delete name from thiss header list.
// 8. If thiss guard is "request-no-cors", then remove // 8. If thiss guard is "request-no-cors", then remove
// privileged no-CORS request headers from this. // privileged no-CORS request headers from this.
return this[kHeadersList].delete(name) this[kHeadersList].delete(name)
} }
// https://fetch.spec.whatwg.org/#dom-headers-get // https://fetch.spec.whatwg.org/#dom-headers-get
@ -71125,7 +71202,7 @@ class Headers {
// 7. Set (name, value) in thiss header list. // 7. Set (name, value) in thiss header list.
// 8. If thiss guard is "request-no-cors", then remove // 8. If thiss guard is "request-no-cors", then remove
// privileged no-CORS request headers from this // privileged no-CORS request headers from this
return this[kHeadersList].set(name, value) this[kHeadersList].set(name, value)
} }
// https://fetch.spec.whatwg.org/#dom-headers-getsetcookie // https://fetch.spec.whatwg.org/#dom-headers-getsetcookie
@ -71161,7 +71238,8 @@ class Headers {
const cookies = this[kHeadersList].cookies const cookies = this[kHeadersList].cookies
// 3. For each name of names: // 3. For each name of names:
for (const [name, value] of names) { for (let i = 0; i < names.length; ++i) {
const [name, value] = names[i]
// 1. If name is `set-cookie`, then: // 1. If name is `set-cookie`, then:
if (name === 'set-cookie') { if (name === 'set-cookie') {
// 1. Let values be a list of all values of headers in list whose name // 1. Let values be a list of all values of headers in list whose name
@ -71169,8 +71247,8 @@ class Headers {
// 2. For each value of values: // 2. For each value of values:
// 1. Append (name, value) to headers. // 1. Append (name, value) to headers.
for (const value of cookies) { for (let j = 0; j < cookies.length; ++j) {
headers.push([name, value]) headers.push([name, cookies[j]])
} }
} else { } else {
// 2. Otherwise: // 2. Otherwise:
@ -71194,6 +71272,12 @@ class Headers {
keys () { keys () {
webidl.brandCheck(this, Headers) webidl.brandCheck(this, Headers)
if (this[kGuard] === 'immutable') {
const value = this[kHeadersSortedMap]
return makeIterator(() => value, 'Headers',
'key')
}
return makeIterator( return makeIterator(
() => [...this[kHeadersSortedMap].values()], () => [...this[kHeadersSortedMap].values()],
'Headers', 'Headers',
@ -71204,6 +71288,12 @@ class Headers {
values () { values () {
webidl.brandCheck(this, Headers) webidl.brandCheck(this, Headers)
if (this[kGuard] === 'immutable') {
const value = this[kHeadersSortedMap]
return makeIterator(() => value, 'Headers',
'value')
}
return makeIterator( return makeIterator(
() => [...this[kHeadersSortedMap].values()], () => [...this[kHeadersSortedMap].values()],
'Headers', 'Headers',
@ -71214,6 +71304,12 @@ class Headers {
entries () { entries () {
webidl.brandCheck(this, Headers) webidl.brandCheck(this, Headers)
if (this[kGuard] === 'immutable') {
const value = this[kHeadersSortedMap]
return makeIterator(() => value, 'Headers',
'key+value')
}
return makeIterator( return makeIterator(
() => [...this[kHeadersSortedMap].values()], () => [...this[kHeadersSortedMap].values()],
'Headers', 'Headers',
@ -71585,7 +71681,7 @@ function finalizeAndReportTiming (response, initiatorType = 'other') {
} }
// 8. If responses timing allow passed flag is not set, then: // 8. If responses timing allow passed flag is not set, then:
if (!timingInfo.timingAllowPassed) { if (!response.timingAllowPassed) {
// 1. Set timingInfo to a the result of creating an opaque timing info for timingInfo. // 1. Set timingInfo to a the result of creating an opaque timing info for timingInfo.
timingInfo = createOpaqueTimingInfo({ timingInfo = createOpaqueTimingInfo({
startTime: timingInfo.startTime startTime: timingInfo.startTime
@ -72502,6 +72598,9 @@ function httpRedirectFetch (fetchParams, response) {
// https://fetch.spec.whatwg.org/#cors-non-wildcard-request-header-name // https://fetch.spec.whatwg.org/#cors-non-wildcard-request-header-name
request.headersList.delete('authorization') request.headersList.delete('authorization')
// https://fetch.spec.whatwg.org/#authentication-entries
request.headersList.delete('proxy-authorization', true)
// "Cookie" and "Host" are forbidden request-headers, which undici doesn't implement. // "Cookie" and "Host" are forbidden request-headers, which undici doesn't implement.
request.headersList.delete('cookie') request.headersList.delete('cookie')
request.headersList.delete('host') request.headersList.delete('host')
@ -73256,7 +73355,7 @@ async function httpNetworkFetch (
path: url.pathname + url.search, path: url.pathname + url.search,
origin: url.origin, origin: url.origin,
method: request.method, method: request.method,
body: fetchParams.controller.dispatcher.isMockActive ? request.body && request.body.source : body, body: fetchParams.controller.dispatcher.isMockActive ? request.body && (request.body.source || request.body.stream) : body,
headers: request.headersList.entries, headers: request.headersList.entries,
maxRedirections: 0, maxRedirections: 0,
upgrade: request.mode === 'websocket' ? 'websocket' : undefined upgrade: request.mode === 'websocket' ? 'websocket' : undefined
@ -73301,7 +73400,7 @@ async function httpNetworkFetch (
location = val location = val
} }
headers.append(key, val) headers[kHeadersList].append(key, val)
} }
} else { } else {
const keys = Object.keys(headersList) const keys = Object.keys(headersList)
@ -73315,7 +73414,7 @@ async function httpNetworkFetch (
location = val location = val
} }
headers.append(key, val) headers[kHeadersList].append(key, val)
} }
} }
@ -73419,7 +73518,7 @@ async function httpNetworkFetch (
const key = headersList[n + 0].toString('latin1') const key = headersList[n + 0].toString('latin1')
const val = headersList[n + 1].toString('latin1') const val = headersList[n + 1].toString('latin1')
headers.append(key, val) headers[kHeadersList].append(key, val)
} }
resolve({ resolve({
@ -73462,7 +73561,8 @@ const {
isValidHTTPToken, isValidHTTPToken,
sameOrigin, sameOrigin,
normalizeMethod, normalizeMethod,
makePolicyContainer makePolicyContainer,
normalizeMethodRecord
} = __nccwpck_require__(2538) } = __nccwpck_require__(2538)
const { const {
forbiddenMethodsSet, forbiddenMethodsSet,
@ -73479,13 +73579,12 @@ const { kHeaders, kSignal, kState, kGuard, kRealm } = __nccwpck_require__(5861)
const { webidl } = __nccwpck_require__(1744) const { webidl } = __nccwpck_require__(1744)
const { getGlobalOrigin } = __nccwpck_require__(1246) const { getGlobalOrigin } = __nccwpck_require__(1246)
const { URLSerializer } = __nccwpck_require__(685) const { URLSerializer } = __nccwpck_require__(685)
const { kHeadersList } = __nccwpck_require__(2785) const { kHeadersList, kConstruct } = __nccwpck_require__(2785)
const assert = __nccwpck_require__(9491) const assert = __nccwpck_require__(9491)
const { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = __nccwpck_require__(2361) const { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = __nccwpck_require__(2361)
let TransformStream = globalThis.TransformStream let TransformStream = globalThis.TransformStream
const kInit = Symbol('init')
const kAbortController = Symbol('abortController') const kAbortController = Symbol('abortController')
const requestFinalizer = new FinalizationRegistry(({ signal, abort }) => { const requestFinalizer = new FinalizationRegistry(({ signal, abort }) => {
@ -73496,7 +73595,7 @@ const requestFinalizer = new FinalizationRegistry(({ signal, abort }) => {
class Request { class Request {
// https://fetch.spec.whatwg.org/#dom-request // https://fetch.spec.whatwg.org/#dom-request
constructor (input, init = {}) { constructor (input, init = {}) {
if (input === kInit) { if (input === kConstruct) {
return return
} }
@ -73635,8 +73734,10 @@ class Request {
urlList: [...request.urlList] urlList: [...request.urlList]
}) })
const initHasKey = Object.keys(init).length !== 0
// 13. If init is not empty, then: // 13. If init is not empty, then:
if (Object.keys(init).length > 0) { if (initHasKey) {
// 1. If requests mode is "navigate", then set it to "same-origin". // 1. If requests mode is "navigate", then set it to "same-origin".
if (request.mode === 'navigate') { if (request.mode === 'navigate') {
request.mode = 'same-origin' request.mode = 'same-origin'
@ -73751,7 +73852,7 @@ class Request {
} }
// 23. If init["integrity"] exists, then set requests integrity metadata to it. // 23. If init["integrity"] exists, then set requests integrity metadata to it.
if (init.integrity !== undefined && init.integrity != null) { if (init.integrity != null) {
request.integrity = String(init.integrity) request.integrity = String(init.integrity)
} }
@ -73767,16 +73868,16 @@ class Request {
// 2. If method is not a method or method is a forbidden method, then // 2. If method is not a method or method is a forbidden method, then
// throw a TypeError. // throw a TypeError.
if (!isValidHTTPToken(init.method)) { if (!isValidHTTPToken(method)) {
throw TypeError(`'${init.method}' is not a valid HTTP method.`) throw new TypeError(`'${method}' is not a valid HTTP method.`)
} }
if (forbiddenMethodsSet.has(method.toUpperCase())) { if (forbiddenMethodsSet.has(method.toUpperCase())) {
throw TypeError(`'${init.method}' HTTP method is unsupported.`) throw new TypeError(`'${method}' HTTP method is unsupported.`)
} }
// 3. Normalize method. // 3. Normalize method.
method = normalizeMethod(init.method) method = normalizeMethodRecord[method] ?? normalizeMethod(method)
// 4. Set requests method to method. // 4. Set requests method to method.
request.method = method request.method = method
@ -73847,7 +73948,7 @@ class Request {
// 30. Set thiss headers to a new Headers object with thiss relevant // 30. Set thiss headers to a new Headers object with thiss relevant
// Realm, whose header list is requests header list and guard is // Realm, whose header list is requests header list and guard is
// "request". // "request".
this[kHeaders] = new Headers() this[kHeaders] = new Headers(kConstruct)
this[kHeaders][kHeadersList] = request.headersList this[kHeaders][kHeadersList] = request.headersList
this[kHeaders][kGuard] = 'request' this[kHeaders][kGuard] = 'request'
this[kHeaders][kRealm] = this[kRealm] this[kHeaders][kRealm] = this[kRealm]
@ -73867,25 +73968,25 @@ class Request {
} }
// 32. If init is not empty, then: // 32. If init is not empty, then:
if (Object.keys(init).length !== 0) { if (initHasKey) {
/** @type {HeadersList} */
const headersList = this[kHeaders][kHeadersList]
// 1. Let headers be a copy of thiss headers and its associated header // 1. Let headers be a copy of thiss headers and its associated header
// list. // list.
let headers = new Headers(this[kHeaders])
// 2. If init["headers"] exists, then set headers to init["headers"]. // 2. If init["headers"] exists, then set headers to init["headers"].
if (init.headers !== undefined) { const headers = init.headers !== undefined ? init.headers : new HeadersList(headersList)
headers = init.headers
}
// 3. Empty thiss headerss header list. // 3. Empty thiss headerss header list.
this[kHeaders][kHeadersList].clear() headersList.clear()
// 4. If headers is a Headers object, then for each header in its header // 4. If headers is a Headers object, then for each header in its header
// list, append headers name/headers value to thiss headers. // list, append headers name/headers value to thiss headers.
if (headers.constructor.name === 'Headers') { if (headers instanceof HeadersList) {
for (const [key, val] of headers) { for (const [key, val] of headers) {
this[kHeaders].append(key, val) headersList.append(key, val)
} }
// Note: Copy the `set-cookie` meta-data.
headersList.cookies = headers.cookies
} else { } else {
// 5. Otherwise, fill thiss headers with headers. // 5. Otherwise, fill thiss headers with headers.
fillHeaders(this[kHeaders], headers) fillHeaders(this[kHeaders], headers)
@ -74174,10 +74275,10 @@ class Request {
// 3. Let clonedRequestObject be the result of creating a Request object, // 3. Let clonedRequestObject be the result of creating a Request object,
// given clonedRequest, thiss headerss guard, and thiss relevant Realm. // given clonedRequest, thiss headerss guard, and thiss relevant Realm.
const clonedRequestObject = new Request(kInit) const clonedRequestObject = new Request(kConstruct)
clonedRequestObject[kState] = clonedRequest clonedRequestObject[kState] = clonedRequest
clonedRequestObject[kRealm] = this[kRealm] clonedRequestObject[kRealm] = this[kRealm]
clonedRequestObject[kHeaders] = new Headers() clonedRequestObject[kHeaders] = new Headers(kConstruct)
clonedRequestObject[kHeaders][kHeadersList] = clonedRequest.headersList clonedRequestObject[kHeaders][kHeadersList] = clonedRequest.headersList
clonedRequestObject[kHeaders][kGuard] = this[kHeaders][kGuard] clonedRequestObject[kHeaders][kGuard] = this[kHeaders][kGuard]
clonedRequestObject[kHeaders][kRealm] = this[kHeaders][kRealm] clonedRequestObject[kHeaders][kRealm] = this[kHeaders][kRealm]
@ -74427,7 +74528,7 @@ const { webidl } = __nccwpck_require__(1744)
const { FormData } = __nccwpck_require__(2015) const { FormData } = __nccwpck_require__(2015)
const { getGlobalOrigin } = __nccwpck_require__(1246) const { getGlobalOrigin } = __nccwpck_require__(1246)
const { URLSerializer } = __nccwpck_require__(685) const { URLSerializer } = __nccwpck_require__(685)
const { kHeadersList } = __nccwpck_require__(2785) const { kHeadersList, kConstruct } = __nccwpck_require__(2785)
const assert = __nccwpck_require__(9491) const assert = __nccwpck_require__(9491)
const { types } = __nccwpck_require__(3837) const { types } = __nccwpck_require__(3837)
@ -74548,7 +74649,7 @@ class Response {
// 2. Set thiss headers to a new Headers object with thiss relevant // 2. Set thiss headers to a new Headers object with thiss relevant
// Realm, whose header list is thiss responses header list and guard // Realm, whose header list is thiss responses header list and guard
// is "response". // is "response".
this[kHeaders] = new Headers() this[kHeaders] = new Headers(kConstruct)
this[kHeaders][kGuard] = 'response' this[kHeaders][kGuard] = 'response'
this[kHeaders][kHeadersList] = this[kState].headersList this[kHeaders][kHeadersList] = this[kState].headersList
this[kHeaders][kRealm] = this[kRealm] this[kHeaders][kRealm] = this[kRealm]
@ -74918,11 +75019,7 @@ webidl.converters.XMLHttpRequestBodyInit = function (V) {
return webidl.converters.Blob(V, { strict: false }) return webidl.converters.Blob(V, { strict: false })
} }
if ( if (types.isArrayBuffer(V) || types.isTypedArray(V) || types.isDataView(V)) {
types.isAnyArrayBuffer(V) ||
types.isTypedArray(V) ||
types.isDataView(V)
) {
return webidl.converters.BufferSource(V) return webidl.converters.BufferSource(V)
} }
@ -75108,52 +75205,57 @@ function isValidReasonPhrase (statusText) {
return true return true
} }
function isTokenChar (c) { /**
return !( * @see https://tools.ietf.org/html/rfc7230#section-3.2.6
c >= 0x7f || * @param {number} c
c <= 0x20 || */
c === '(' || function isTokenCharCode (c) {
c === ')' || switch (c) {
c === '<' || case 0x22:
c === '>' || case 0x28:
c === '@' || case 0x29:
c === ',' || case 0x2c:
c === ';' || case 0x2f:
c === ':' || case 0x3a:
c === '\\' || case 0x3b:
c === '"' || case 0x3c:
c === '/' || case 0x3d:
c === '[' || case 0x3e:
c === ']' || case 0x3f:
c === '?' || case 0x40:
c === '=' || case 0x5b:
c === '{' || case 0x5c:
c === '}' case 0x5d:
) case 0x7b:
case 0x7d:
// DQUOTE and "(),/:;<=>?@[\]{}"
return false
default:
// VCHAR %x21-7E
return c >= 0x21 && c <= 0x7e
}
} }
// See RFC 7230, Section 3.2.6. /**
// https://github.com/chromium/chromium/blob/d7da0240cae77824d1eda25745c4022757499131/third_party/blink/renderer/platform/network/http_parsers.cc#L321 * @param {string} characters
*/
function isValidHTTPToken (characters) { function isValidHTTPToken (characters) {
if (!characters || typeof characters !== 'string') { if (characters.length === 0) {
return false return false
} }
for (let i = 0; i < characters.length; ++i) { for (let i = 0; i < characters.length; ++i) {
const c = characters.charCodeAt(i) if (!isTokenCharCode(characters.charCodeAt(i))) {
if (c > 0x7f || !isTokenChar(c)) {
return false return false
} }
} }
return true return true
} }
// https://fetch.spec.whatwg.org/#header-name /**
// https://github.com/chromium/chromium/blob/b3d37e6f94f87d59e44662d6078f6a12de845d17/net/http/http_util.cc#L342 * @see https://fetch.spec.whatwg.org/#header-name
* @param {string} potentialValue
*/
function isValidHeaderName (potentialValue) { function isValidHeaderName (potentialValue) {
if (potentialValue.length === 0) {
return false
}
return isValidHTTPToken(potentialValue) return isValidHTTPToken(potentialValue)
} }
@ -75698,11 +75800,30 @@ function isCancelled (fetchParams) {
fetchParams.controller.state === 'terminated' fetchParams.controller.state === 'terminated'
} }
// https://fetch.spec.whatwg.org/#concept-method-normalize const normalizeMethodRecord = {
delete: 'DELETE',
DELETE: 'DELETE',
get: 'GET',
GET: 'GET',
head: 'HEAD',
HEAD: 'HEAD',
options: 'OPTIONS',
OPTIONS: 'OPTIONS',
post: 'POST',
POST: 'POST',
put: 'PUT',
PUT: 'PUT'
}
// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`.
Object.setPrototypeOf(normalizeMethodRecord, null)
/**
* @see https://fetch.spec.whatwg.org/#concept-method-normalize
* @param {string} method
*/
function normalizeMethod (method) { function normalizeMethod (method) {
return /^(DELETE|GET|HEAD|OPTIONS|POST|PUT)$/i.test(method) return normalizeMethodRecord[method.toLowerCase()] ?? method
? method.toUpperCase()
: method
} }
// https://infra.spec.whatwg.org/#serialize-a-javascript-value-to-a-json-string // https://infra.spec.whatwg.org/#serialize-a-javascript-value-to-a-json-string
@ -76047,7 +76168,8 @@ module.exports = {
urlIsLocal, urlIsLocal,
urlHasHttpsScheme, urlHasHttpsScheme,
urlIsHttpHttpsScheme, urlIsHttpHttpsScheme,
readAllBytes readAllBytes,
normalizeMethodRecord
} }
@ -76486,12 +76608,10 @@ webidl.converters.ByteString = function (V) {
// 2. If the value of any element of x is greater than // 2. If the value of any element of x is greater than
// 255, then throw a TypeError. // 255, then throw a TypeError.
for (let index = 0; index < x.length; index++) { for (let index = 0; index < x.length; index++) {
const charCode = x.charCodeAt(index) if (x.charCodeAt(index) > 255) {
if (charCode > 255) {
throw new TypeError( throw new TypeError(
'Cannot convert argument to a ByteString because the character at ' + 'Cannot convert argument to a ByteString because the character at ' +
`index ${index} has a value of ${charCode} which is greater than 255.` `index ${index} has a value of ${x.charCodeAt(index)} which is greater than 255.`
) )
} }
} }
@ -78168,6 +78288,349 @@ function cleanRequestHeaders (headers, removeContent, unknownOrigin) {
module.exports = RedirectHandler module.exports = RedirectHandler
/***/ }),
/***/ 2286:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
const assert = __nccwpck_require__(9491)
const { kRetryHandlerDefaultRetry } = __nccwpck_require__(2785)
const { RequestRetryError } = __nccwpck_require__(8045)
const { isDisturbed, parseHeaders, parseRangeHeader } = __nccwpck_require__(3983)
function calculateRetryAfterHeader (retryAfter) {
const current = Date.now()
const diff = new Date(retryAfter).getTime() - current
return diff
}
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 ?? {}
this.dispatch = handlers.dispatch
this.handler = handlers.handler
this.opts = dispatchOpts
this.abort = null
this.aborted = false
this.retryOpts = {
retry: retryFn ?? RetryHandler[kRetryHandlerDefaultRetry],
retryAfter: retryAfter ?? true,
maxTimeout: maxTimeout ?? 30 * 1000, // 30s,
timeout: 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'
]
}
this.retryCount = 0
this.start = 0
this.end = null
this.etag = null
this.resume = null
// Handle possible onConnect duplication
this.handler.onConnect(reason => {
this.aborted = true
if (this.abort) {
this.abort(reason)
} else {
this.reason = reason
}
})
}
onRequestSent () {
if (this.handler.onRequestSent) {
this.handler.onRequestSent()
}
}
onUpgrade (statusCode, headers, socket) {
if (this.handler.onUpgrade) {
this.handler.onUpgrade(statusCode, headers, socket)
}
}
onConnect (abort) {
if (this.aborted) {
abort(this.reason)
} else {
this.abort = abort
}
}
onBodySent (chunk) {
if (this.handler.onBodySent) return this.handler.onBodySent(chunk)
}
static [kRetryHandlerDefaultRetry] (err, { state, opts }, cb) {
const { statusCode, code, headers } = err
const { method, retryOptions } = opts
const {
maxRetries,
timeout,
maxTimeout,
timeoutFactor,
statusCodes,
errorCodes,
methods
} = retryOptions
let { counter, currentTimeout } = state
currentTimeout =
currentTimeout != null && currentTimeout > 0 ? currentTimeout : timeout
// Any code that is not a Undici's originated and allowed to retry
if (
code &&
code !== 'UND_ERR_REQ_RETRY' &&
code !== 'UND_ERR_SOCKET' &&
!errorCodes.includes(code)
) {
cb(err)
return
}
// 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
}
// 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
}
// If we reached the max number of retries
if (counter > maxRetries) {
cb(err)
return
}
let retryAfterHeader = headers != null && headers['retry-after']
if (retryAfterHeader) {
retryAfterHeader = Number(retryAfterHeader)
retryAfterHeader = isNaN(retryAfterHeader)
? calculateRetryAfterHeader(retryAfterHeader)
: retryAfterHeader * 1e3 // Retry-After is in seconds
}
const retryTimeout =
retryAfterHeader > 0
? Math.min(retryAfterHeader, maxTimeout)
: Math.min(currentTimeout * timeoutFactor ** counter, maxTimeout)
state.currentTimeout = retryTimeout
setTimeout(() => cb(null), retryTimeout)
}
onHeaders (statusCode, rawHeaders, resume, statusMessage) {
const headers = parseHeaders(rawHeaders)
this.retryCount += 1
if (statusCode >= 300) {
this.abort(
new RequestRetryError('Request failed', statusCode, {
headers,
count: this.retryCount
})
)
return false
}
// Checkpoint for resume from where we left it
if (this.resume != null) {
this.resume = null
if (statusCode !== 206) {
return true
}
const contentRange = parseRangeHeader(headers['content-range'])
// If no content range
if (!contentRange) {
this.abort(
new RequestRetryError('Content-Range mismatch', statusCode, {
headers,
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,
count: this.retryCount
})
)
return false
}
const { start, size, end = size } = contentRange
assert(this.start === start, 'content-range mismatch')
assert(this.end == null || this.end === end, 'content-range mismatch')
this.resume = resume
return true
}
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
)
}
const { start, size, end = size } = range
assert(
start != null && Number.isFinite(start) && this.start !== start,
'content-range mismatch'
)
assert(Number.isFinite(start))
assert(
end != null && Number.isFinite(end) && this.end !== end,
'invalid content-length'
)
this.start = start
this.end = end
}
// 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) : null
}
assert(Number.isFinite(this.start))
assert(
this.end == null || Number.isFinite(this.end),
'invalid content-length'
)
this.resume = resume
this.etag = headers.etag != null ? headers.etag : null
return this.handler.onHeaders(
statusCode,
rawHeaders,
resume,
statusMessage
)
}
const err = new RequestRetryError('Request failed', statusCode, {
headers,
count: this.retryCount
})
this.abort(err)
return false
}
onData (chunk) {
this.start += chunk.length
return this.handler.onData(chunk)
}
onComplete (rawTrailers) {
this.retryCount = 0
return this.handler.onComplete(rawTrailers)
}
onError (err) {
if (this.aborted || isDisturbed(this.opts.body)) {
return this.handler.onError(err)
}
this.retryOpts.retry(
err,
{
state: { counter: this.retryCount++, currentTimeout: this.retryAfter },
opts: { retryOptions: this.retryOpts, ...this.opts }
},
onRetry.bind(this)
)
function onRetry (err) {
if (err != null || this.aborted || isDisturbed(this.opts.body)) {
return this.handler.onError(err)
}
if (this.start !== 0) {
this.opts = {
...this.opts,
headers: {
...this.opts.headers,
range: `bytes=${this.start}-${this.end ?? ''}`
}
}
}
try {
this.dispatch(this.opts, this)
} catch (err) {
this.handler.onError(err)
}
}
}
}
module.exports = RetryHandler
/***/ }), /***/ }),
/***/ 8861: /***/ 8861:
@ -80090,6 +80553,9 @@ class ProxyAgent extends DispatcherBase {
this[kProxyTls] = opts.proxyTls this[kProxyTls] = opts.proxyTls
this[kProxyHeaders] = opts.headers || {} this[kProxyHeaders] = opts.headers || {}
const resolvedUrl = new URL(opts.uri)
const { origin, port, host, username, password } = resolvedUrl
if (opts.auth && opts.token) { if (opts.auth && opts.token) {
throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token') throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token')
} else if (opts.auth) { } else if (opts.auth) {
@ -80097,11 +80563,10 @@ class ProxyAgent extends DispatcherBase {
this[kProxyHeaders]['proxy-authorization'] = `Basic ${opts.auth}` this[kProxyHeaders]['proxy-authorization'] = `Basic ${opts.auth}`
} else if (opts.token) { } else if (opts.token) {
this[kProxyHeaders]['proxy-authorization'] = 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 resolvedUrl = new URL(opts.uri)
const { origin, port, host } = resolvedUrl
const connect = buildConnector({ ...opts.proxyTls }) const connect = buildConnector({ ...opts.proxyTls })
this[kConnectEndpoint] = buildConnector({ ...opts.requestTls }) this[kConnectEndpoint] = buildConnector({ ...opts.requestTls })
this[kClient] = clientFactory(resolvedUrl, { connect }) this[kClient] = clientFactory(resolvedUrl, { connect })
@ -80125,7 +80590,7 @@ class ProxyAgent extends DispatcherBase {
}) })
if (statusCode !== 200) { if (statusCode !== 200) {
socket.on('error', () => {}).destroy() socket.on('error', () => {}).destroy()
callback(new RequestAbortedError('Proxy response !== 200 when HTTP Tunneling')) callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`))
} }
if (opts.protocol !== 'https:') { if (opts.protocol !== 'https:') {
callback(null, socket) callback(null, socket)
@ -89895,8 +90360,8 @@ class PoetryCache extends cache_distributor_1.default {
this.poetryProjects = poetryProjects; this.poetryProjects = poetryProjects;
} }
getCacheGlobalDirectories() { getCacheGlobalDirectories() {
var _a, e_1, _b, _c;
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
var _a, e_1, _b, _c;
// Same virtualenvs path may appear for different projects, hence we use a Set // Same virtualenvs path may appear for different projects, hence we use a Set
const paths = new Set(); const paths = new Set();
const globber = yield glob.create(this.patterns); const globber = yield glob.create(this.patterns);
@ -90339,8 +90804,8 @@ function binDir(installDir) {
} }
} }
function useCpythonVersion(version, architecture, updateEnvironment, checkLatest, allowPreReleases) { function useCpythonVersion(version, architecture, updateEnvironment, checkLatest, allowPreReleases) {
var _a;
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
var _a;
let manifest = null; let manifest = null;
const desugaredVersionSpec = desugarDevVersion(version); const desugaredVersionSpec = desugarDevVersion(version);
let semanticVersionSpec = pythonVersionToSemantic(desugaredVersionSpec, allowPreReleases); let semanticVersionSpec = pythonVersionToSemantic(desugaredVersionSpec, allowPreReleases);
@ -91113,8 +91578,8 @@ function resolveVersionInput() {
return versions; return versions;
} }
function run() { function run() {
var _a;
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
var _a;
if (utils_1.IS_MAC) { if (utils_1.IS_MAC) {
process.env['AGENT_TOOLSDIRECTORY'] = '/Users/runner/hostedtoolcache'; process.env['AGENT_TOOLSDIRECTORY'] = '/Users/runner/hostedtoolcache';
} }

138
package-lock.json generated
View File

@ -9,32 +9,32 @@
"version": "5.0.0", "version": "5.0.0",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@actions/cache": "^3.0.4", "@actions/cache": "^3.2.4",
"@actions/core": "^1.10.0", "@actions/core": "^1.10.0",
"@actions/exec": "^1.1.0", "@actions/exec": "^1.1.0",
"@actions/glob": "^0.4.0", "@actions/glob": "^0.4.0",
"@actions/http-client": "^2.2.0", "@actions/http-client": "^2.2.1",
"@actions/io": "^1.0.2", "@actions/io": "^1.0.2",
"@actions/tool-cache": "^2.0.1", "@actions/tool-cache": "^2.0.1",
"@iarna/toml": "^2.2.5", "@iarna/toml": "^2.2.5",
"semver": "^7.5.2" "semver": "^7.6.0"
}, },
"devDependencies": { "devDependencies": {
"@types/jest": "^29.5.6", "@types/jest": "^29.5.12",
"@types/node": "^20.9.1", "@types/node": "^20.11.25",
"@types/semver": "^7.1.0", "@types/semver": "^7.5.8",
"@typescript-eslint/eslint-plugin": "^5.54.0", "@typescript-eslint/eslint-plugin": "^5.54.0",
"@typescript-eslint/parser": "^5.54.0", "@typescript-eslint/parser": "^5.54.0",
"@vercel/ncc": "^0.38.0", "@vercel/ncc": "^0.38.0",
"eslint": "^8.35.0", "eslint": "^8.57.0",
"eslint-config-prettier": "^8.6.0", "eslint-config-prettier": "^8.6.0",
"eslint-plugin-jest": "^27.2.1", "eslint-plugin-jest": "^27.9.0",
"eslint-plugin-node": "^11.1.0", "eslint-plugin-node": "^11.1.0",
"jest": "^29.7.0", "jest": "^29.7.0",
"jest-circus": "^29.7.0", "jest-circus": "^29.7.0",
"prettier": "^2.8.4", "prettier": "^2.8.4",
"ts-jest": "^29.1.1", "ts-jest": "^29.1.2",
"typescript": "^5.2.2" "typescript": "^5.4.2"
} }
}, },
"node_modules/@aashutoshrathi/word-wrap": { "node_modules/@aashutoshrathi/word-wrap": {
@ -47,9 +47,9 @@
} }
}, },
"node_modules/@actions/cache": { "node_modules/@actions/cache": {
"version": "3.2.2", "version": "3.2.4",
"resolved": "https://registry.npmjs.org/@actions/cache/-/cache-3.2.2.tgz", "resolved": "https://registry.npmjs.org/@actions/cache/-/cache-3.2.4.tgz",
"integrity": "sha512-6D0Jq5JrLZRQ3VApeQwQkkV20ZZXjXsHNYXd9VjNUdi9E0h93wESpxfMJ2JWLCUCgHNLcfY0v3GjNM+2FdRMlg==", "integrity": "sha512-RuHnwfcDagtX+37s0ZWy7clbOfnZ7AlDJQ7k/9rzt2W4Gnwde3fa/qjSjVuz4vLcLIpc7fUob27CMrqiWZytYA==",
"dependencies": { "dependencies": {
"@actions/core": "^1.10.0", "@actions/core": "^1.10.0",
"@actions/exec": "^1.0.1", "@actions/exec": "^1.0.1",
@ -59,7 +59,7 @@
"@azure/abort-controller": "^1.1.0", "@azure/abort-controller": "^1.1.0",
"@azure/ms-rest-js": "^2.6.0", "@azure/ms-rest-js": "^2.6.0",
"@azure/storage-blob": "^12.13.0", "@azure/storage-blob": "^12.13.0",
"semver": "^6.1.0", "semver": "^6.3.1",
"uuid": "^3.3.3" "uuid": "^3.3.3"
} }
}, },
@ -115,9 +115,9 @@
} }
}, },
"node_modules/@actions/http-client": { "node_modules/@actions/http-client": {
"version": "2.2.0", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.0.tgz", "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.1.tgz",
"integrity": "sha512-q+epW0trjVUUHboliPb4UF9g2msf+w61b32tAkFEwL/IwP0DQWgbCMM0Hbe3e3WXSKz5VcUXbzJQgy8Hkra/Lg==", "integrity": "sha512-KhC/cZsq7f8I4LfZSJKgCvEwfkE8o1538VoBeoGzokVLLnbFDEAdFD3UhoMklxo2un9NJVBdANOresx7vTHlHw==",
"dependencies": { "dependencies": {
"tunnel": "^0.0.6", "tunnel": "^0.0.6",
"undici": "^5.25.4" "undici": "^5.25.4"
@ -1011,9 +1011,9 @@
} }
}, },
"node_modules/@eslint/eslintrc": { "node_modules/@eslint/eslintrc": {
"version": "2.1.3", "version": "2.1.4",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
"integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"ajv": "^6.12.4", "ajv": "^6.12.4",
@ -1034,9 +1034,9 @@
} }
}, },
"node_modules/@eslint/js": { "node_modules/@eslint/js": {
"version": "8.53.0", "version": "8.57.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
"integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0" "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@ -1051,13 +1051,13 @@
} }
}, },
"node_modules/@humanwhocodes/config-array": { "node_modules/@humanwhocodes/config-array": {
"version": "0.11.13", "version": "0.11.14",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
"integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@humanwhocodes/object-schema": "^2.0.1", "@humanwhocodes/object-schema": "^2.0.2",
"debug": "^4.1.1", "debug": "^4.3.1",
"minimatch": "^3.0.5" "minimatch": "^3.0.5"
}, },
"engines": { "engines": {
@ -1078,9 +1078,9 @@
} }
}, },
"node_modules/@humanwhocodes/object-schema": { "node_modules/@humanwhocodes/object-schema": {
"version": "2.0.1", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz",
"integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==",
"dev": true "dev": true
}, },
"node_modules/@iarna/toml": { "node_modules/@iarna/toml": {
@ -1664,9 +1664,9 @@
} }
}, },
"node_modules/@types/jest": { "node_modules/@types/jest": {
"version": "29.5.8", "version": "29.5.12",
"resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.8.tgz", "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz",
"integrity": "sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==", "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"expect": "^29.0.0", "expect": "^29.0.0",
@ -1680,9 +1680,9 @@
"dev": true "dev": true
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "20.9.1", "version": "20.11.25",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.1.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.25.tgz",
"integrity": "sha512-HhmzZh5LSJNS5O8jQKpJ/3ZcrrlG6L70hpGqMIAoM9YVD0YBRNWYsfwcXq8VnSjlNpCpgLzMXdiPo+dxcvSmiA==", "integrity": "sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==",
"dependencies": { "dependencies": {
"undici-types": "~5.26.4" "undici-types": "~5.26.4"
} }
@ -1710,9 +1710,9 @@
} }
}, },
"node_modules/@types/semver": { "node_modules/@types/semver": {
"version": "7.5.5", "version": "7.5.8",
"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
"integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
"dev": true "dev": true
}, },
"node_modules/@types/stack-utils": { "node_modules/@types/stack-utils": {
@ -1959,9 +1959,9 @@
} }
}, },
"node_modules/acorn": { "node_modules/acorn": {
"version": "8.11.2", "version": "8.11.3",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
"integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
"dev": true, "dev": true,
"bin": { "bin": {
"acorn": "bin/acorn" "acorn": "bin/acorn"
@ -2620,16 +2620,16 @@
} }
}, },
"node_modules/eslint": { "node_modules/eslint": {
"version": "8.53.0", "version": "8.57.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
"integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1", "@eslint-community/regexpp": "^4.6.1",
"@eslint/eslintrc": "^2.1.3", "@eslint/eslintrc": "^2.1.4",
"@eslint/js": "8.53.0", "@eslint/js": "8.57.0",
"@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/config-array": "^0.11.14",
"@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8", "@nodelib/fs.walk": "^1.2.8",
"@ungap/structured-clone": "^1.2.0", "@ungap/structured-clone": "^1.2.0",
@ -2706,9 +2706,9 @@
} }
}, },
"node_modules/eslint-plugin-jest": { "node_modules/eslint-plugin-jest": {
"version": "27.6.0", "version": "27.9.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.0.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz",
"integrity": "sha512-MTlusnnDMChbElsszJvrwD1dN3x6nZl//s4JD23BxB6MgR66TZlL064su24xEIS3VACfAoHV1vgyMgPw8nkdng==", "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/utils": "^5.10.0" "@typescript-eslint/utils": "^5.10.0"
@ -2717,7 +2717,7 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0" "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}, },
"peerDependencies": { "peerDependencies": {
"@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0", "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0",
"eslint": "^7.0.0 || ^8.0.0", "eslint": "^7.0.0 || ^8.0.0",
"jest": "*" "jest": "*"
}, },
@ -3225,9 +3225,9 @@
} }
}, },
"node_modules/globals": { "node_modules/globals": {
"version": "13.23.0", "version": "13.24.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
"integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"type-fest": "^0.20.2" "type-fest": "^0.20.2"
@ -4901,9 +4901,9 @@
"integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA=="
}, },
"node_modules/semver": { "node_modules/semver": {
"version": "7.5.4", "version": "7.6.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
"dependencies": { "dependencies": {
"lru-cache": "^6.0.0" "lru-cache": "^6.0.0"
}, },
@ -5164,9 +5164,9 @@
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
}, },
"node_modules/ts-jest": { "node_modules/ts-jest": {
"version": "29.1.1", "version": "29.1.2",
"resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz",
"integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"bs-logger": "0.x", "bs-logger": "0.x",
@ -5182,7 +5182,7 @@
"ts-jest": "cli.js" "ts-jest": "cli.js"
}, },
"engines": { "engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0" "node": "^16.10.0 || ^18.0.0 || >=20.0.0"
}, },
"peerDependencies": { "peerDependencies": {
"@babel/core": ">=7.0.0-beta.0 <8", "@babel/core": ">=7.0.0-beta.0 <8",
@ -5274,9 +5274,9 @@
} }
}, },
"node_modules/typescript": { "node_modules/typescript": {
"version": "5.2.2", "version": "5.4.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz",
"integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==",
"dev": true, "dev": true,
"bin": { "bin": {
"tsc": "bin/tsc", "tsc": "bin/tsc",
@ -5287,9 +5287,9 @@
} }
}, },
"node_modules/undici": { "node_modules/undici": {
"version": "5.27.2", "version": "5.28.3",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.27.2.tgz", "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz",
"integrity": "sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==", "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==",
"dependencies": { "dependencies": {
"@fastify/busboy": "^2.0.0" "@fastify/busboy": "^2.0.0"
}, },

View File

@ -25,31 +25,31 @@
"author": "GitHub", "author": "GitHub",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@actions/cache": "^3.0.4", "@actions/cache": "^3.2.4",
"@actions/core": "^1.10.0", "@actions/core": "^1.10.0",
"@actions/exec": "^1.1.0", "@actions/exec": "^1.1.0",
"@actions/glob": "^0.4.0", "@actions/glob": "^0.4.0",
"@actions/http-client": "^2.2.0", "@actions/http-client": "^2.2.1",
"@actions/io": "^1.0.2", "@actions/io": "^1.0.2",
"@actions/tool-cache": "^2.0.1", "@actions/tool-cache": "^2.0.1",
"@iarna/toml": "^2.2.5", "@iarna/toml": "^2.2.5",
"semver": "^7.5.2" "semver": "^7.6.0"
}, },
"devDependencies": { "devDependencies": {
"@types/jest": "^29.5.6", "@types/jest": "^29.5.12",
"@types/node": "^20.9.1", "@types/node": "^20.11.25",
"@types/semver": "^7.1.0", "@types/semver": "^7.5.8",
"@typescript-eslint/eslint-plugin": "^5.54.0", "@typescript-eslint/eslint-plugin": "^5.54.0",
"@typescript-eslint/parser": "^5.54.0", "@typescript-eslint/parser": "^5.54.0",
"@vercel/ncc": "^0.38.0", "@vercel/ncc": "^0.38.0",
"eslint": "^8.35.0", "eslint": "^8.57.0",
"eslint-config-prettier": "^8.6.0", "eslint-config-prettier": "^8.6.0",
"eslint-plugin-jest": "^27.2.1", "eslint-plugin-jest": "^27.9.0",
"eslint-plugin-node": "^11.1.0", "eslint-plugin-node": "^11.1.0",
"jest": "^29.7.0", "jest": "^29.7.0",
"jest-circus": "^29.7.0", "jest-circus": "^29.7.0",
"prettier": "^2.8.4", "prettier": "^2.8.4",
"ts-jest": "^29.1.1", "ts-jest": "^29.1.2",
"typescript": "^5.2.2" "typescript": "^5.4.2"
} }
} }