From 673558501cbd714488b6d1fb99265b4693ef9a9d Mon Sep 17 00:00:00 2001 From: "Node.js GitHub Bot" Date: Tue, 14 Oct 2025 02:03:28 +0100 Subject: [PATCH 01/83] deps: update googletest to 279f847 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/60219 Reviewed-By: Michaël Zasso Reviewed-By: Luigi Pinca Reviewed-By: Colin Ihrig Reviewed-By: Chengzhong Wu Reviewed-By: Chemi Atlow --- deps/googletest/include/gtest/gtest-matchers.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deps/googletest/include/gtest/gtest-matchers.h b/deps/googletest/include/gtest/gtest-matchers.h index 93643dba1d3a07..bd8dfe999d3681 100644 --- a/deps/googletest/include/gtest/gtest-matchers.h +++ b/deps/googletest/include/gtest/gtest-matchers.h @@ -296,12 +296,12 @@ class MatcherBase : private MatcherDescriberInterface { return *this; } - MatcherBase(MatcherBase&& other) + MatcherBase(MatcherBase&& other) noexcept : vtable_(other.vtable_), buffer_(other.buffer_) { other.vtable_ = nullptr; } - MatcherBase& operator=(MatcherBase&& other) { + MatcherBase& operator=(MatcherBase&& other) noexcept { if (this == &other) return *this; Destroy(); vtable_ = other.vtable_; From 42729f07eea850c2e4cf2ca8c68a9a74b1a5b5cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Zasso?= Date: Tue, 14 Oct 2025 08:46:20 +0200 Subject: [PATCH 02/83] src: stop using deprecated v8::Context::GetIsolate Refs: https://github.com/nodejs/node/commit/5623194a6b16192084d2753a80c350c4ae3dec24 PR-URL: https://github.com/nodejs/node/pull/60223 Reviewed-By: James M Snell Reviewed-By: Chengzhong Wu Reviewed-By: Darshan Sen Reviewed-By: Anna Henningsen Reviewed-By: Luigi Pinca Reviewed-By: Colin Ihrig Reviewed-By: Chemi Atlow --- src/util-inl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util-inl.h b/src/util-inl.h index 4e9c4fea85d12e..d07bceb425f008 100644 --- a/src/util-inl.h +++ b/src/util-inl.h @@ -359,7 +359,7 @@ v8::MaybeLocal ToV8Value(v8::Local context, v8::MaybeLocal ToV8Value(v8::Local context, std::u16string_view str, v8::Isolate* isolate) { - if (isolate == nullptr) isolate = context->GetIsolate(); + if (isolate == nullptr) isolate = v8::Isolate::GetCurrent(); if (str.length() >= static_cast(v8::String::kMaxLength)) [[unlikely]] { // V8 only has a TODO comment about adding an exception when the maximum From 8c8525cf93e978a40b44055fd84e415b8df2733d Mon Sep 17 00:00:00 2001 From: Artur Gawlik Date: Tue, 14 Oct 2025 08:46:29 +0200 Subject: [PATCH 03/83] doc: fix not working code example in vm docs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/60224 Reviewed-By: Chengzhong Wu Reviewed-By: Luigi Pinca Reviewed-By: Colin Ihrig Reviewed-By: Ulises Gascón --- doc/api/vm.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/api/vm.md b/doc/api/vm.md index b8c112cf51a954..92892f49cd9693 100644 --- a/doc/api/vm.md +++ b/doc/api/vm.md @@ -485,8 +485,8 @@ function resolveAndLinkDependencies(module) { // The "secret" variable refers to the global variable we added to // "contextifiedObject" when creating the context. export default secret; - `, { context: referencingModule.context }); - moduleMap.set(specifier, linkedModule); + `, { context: module.context }); + moduleMap.set(specifier, requestedModule); // Resolve the dependencies of the new module as well. resolveAndLinkDependencies(requestedModule); } @@ -566,8 +566,8 @@ const contextifiedObject = vm.createContext({ // The "secret" variable refers to the global variable we added to // "contextifiedObject" when creating the context. export default secret; - `, { context: referencingModule.context }); - moduleMap.set(specifier, linkedModule); + `, { context: module.context }); + moduleMap.set(specifier, requestedModule); // Resolve the dependencies of the new module as well. resolveAndLinkDependencies(requestedModule); } From 64fc625bf964ee4126c214d88000ffff20ba6bf1 Mon Sep 17 00:00:00 2001 From: Shima Ryuhei <65934663+islandryu@users.noreply.github.com> Date: Tue, 14 Oct 2025 16:06:15 +0900 Subject: [PATCH 04/83] inspector: support handshake response for websocket inspection PR-URL: https://github.com/nodejs/node/pull/60225 Reviewed-By: Chengzhong Wu Reviewed-By: Darshan Sen Reviewed-By: Colin Ihrig --- lib/internal/inspector/network_undici.js | 10 ++-------- test/common/websocket-server.js | 3 +++ test/parallel/test-inspector-network-websocket.js | 12 ++++++++++++ 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/lib/internal/inspector/network_undici.js b/lib/internal/inspector/network_undici.js index b3f4f750d0ef19..a80af196587de4 100644 --- a/lib/internal/inspector/network_undici.js +++ b/lib/internal/inspector/network_undici.js @@ -209,23 +209,17 @@ function onClientResponseFinish({ request }) { // TODO: Move Network.webSocketCreated to the actual creation time of the WebSocket. // undici:websocket:open fires when the connection is established, but this results // in an inaccurate stack trace. -function onWebSocketOpen({ websocket }) { +function onWebSocketOpen({ websocket, handshakeResponse }) { websocket[kInspectorRequestId] = getNextRequestId(); const url = websocket.url.toString(); Network.webSocketCreated({ requestId: websocket[kInspectorRequestId], url, }); - // TODO: Use handshake response data from undici diagnostics when available. - // https://github.com/nodejs/undici/pull/4396 Network.webSocketHandshakeResponseReceived({ requestId: websocket[kInspectorRequestId], timestamp: getMonotonicTime(), - response: { - status: 101, - statusText: 'Switching Protocols', - headers: {}, - }, + response: handshakeResponse, }); } diff --git a/test/common/websocket-server.js b/test/common/websocket-server.js index 7f2447396972f7..f120d3bf71bb03 100644 --- a/test/common/websocket-server.js +++ b/test/common/websocket-server.js @@ -9,10 +9,12 @@ class WebSocketServer { constructor({ port = 0, server, + customHandleUpgradeHeaders = [], }) { this.port = port; this.server = server || http.createServer(); this.clients = new Set(); + this.customHandleUpgradeHeaders = customHandleUpgradeHeaders; this.server.on('upgrade', this.handleUpgrade.bind(this)); } @@ -36,6 +38,7 @@ class WebSocketServer { 'Upgrade: websocket', 'Connection: Upgrade', `Sec-WebSocket-Accept: ${acceptKey}`, + ...this.customHandleUpgradeHeaders, ]; socket.write(responseHeaders.join('\r\n') + '\r\n\r\n'); diff --git a/test/parallel/test-inspector-network-websocket.js b/test/parallel/test-inspector-network-websocket.js index 8f0d4cb75dc674..f0fc6a8216b5c5 100644 --- a/test/parallel/test-inspector-network-websocket.js +++ b/test/parallel/test-inspector-network-websocket.js @@ -29,8 +29,15 @@ function findFrameInInitiator(regex, initiator) { async function test() { await session.post('Network.enable'); + + const CUSTOM_HEADER_NAME = 'X-Custom-Header'; + const CUSTOM_HEADER_VALUE = 'CustomHeaderValue'; + const server = new WebSocketServer({ responseError: true, + customHandleUpgradeHeaders: [ + `${CUSTOM_HEADER_NAME}: ${CUSTOM_HEADER_VALUE}`, + ] }); await server.start(); const url = `ws://127.0.0.1:${server.port}/`; @@ -49,6 +56,11 @@ async function test() { assert.strictEqual(message.params.requestId, requestId); assert.strictEqual(message.params.response.status, 101); assert.strictEqual(message.params.response.statusText, 'Switching Protocols'); + assert.strictEqual(message.params.response.headers.upgrade, 'websocket'); + assert.strictEqual(message.params.response.headers.connection, 'Upgrade'); + assert.ok(message.params.response.headers['sec-websocket-accept']); + assert.ok(message.params.response.headers['sec-websocket-accept'].length > 0); + assert.strictEqual(message.params.response.headers[CUSTOM_HEADER_NAME.toLowerCase()], CUSTOM_HEADER_VALUE); assert.strictEqual(typeof message.params.timestamp, 'number'); socket.close(); })); From 4395fe14b9002171defd4fb896adbd2bf4d93d13 Mon Sep 17 00:00:00 2001 From: Rafael Gonzaga Date: Tue, 14 Oct 2025 09:17:53 -0300 Subject: [PATCH 05/83] http: add optimizeEmptyRequests server option MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: RafaelGSS Co-Authored-By: RafaelGSS PR-URL: https://github.com/nodejs/node/pull/59778 Reviewed-By: Robert Nagy Reviewed-By: Tim Perry Reviewed-By: Gerhard Stöbich Reviewed-By: Matteo Collina Reviewed-By: James M Snell Reviewed-By: Yagiz Nizipli --- doc/api/http.md | 8 ++ lib/_http_incoming.js | 9 +++ lib/_http_server.js | 24 ++++++ ...est-http-server-optimize-empty-requests.js | 77 +++++++++++++++++++ 4 files changed, 118 insertions(+) create mode 100644 test/parallel/test-http-server-optimize-empty-requests.js diff --git a/doc/api/http.md b/doc/api/http.md index b11f5a974d635d..9e475c05cc889c 100644 --- a/doc/api/http.md +++ b/doc/api/http.md @@ -3555,6 +3555,9 @@ Found'`. -* `err` {Error} +* `err` {any} The `'error'` event is emitted if the worker thread throws an uncaught exception. In that case, the worker is terminated. From f4372044917ce97ac38e4214f8046fc3b57365a9 Mon Sep 17 00:00:00 2001 From: Marco Ippolito Date: Thu, 9 Oct 2025 17:12:25 +0200 Subject: [PATCH 43/83] src: add watch config namespace PR-URL: https://github.com/nodejs/node/pull/60178 Reviewed-By: Pietro Marchini Reviewed-By: Chemi Atlow --- doc/api/cli.md | 3 ++ doc/node-config-schema.json | 29 ++++++++++++ lib/internal/main/watch_mode.js | 21 ++++++--- src/node_options.cc | 16 ++++--- src/node_options.h | 3 +- test/sequential/test-watch-mode.mjs | 69 +++++++++++++++++++++++++++++ 6 files changed, 130 insertions(+), 11 deletions(-) diff --git a/doc/api/cli.md b/doc/api/cli.md index 874879d8748d6d..bbbf5cf2fd08ed 100644 --- a/doc/api/cli.md +++ b/doc/api/cli.md @@ -1022,6 +1022,9 @@ in the `$schema` must be replaced with the version of Node.js you are using. }, "testRunner": { "test-isolation": "process" + }, + "watch": { + "watch-preserve-output": true } } ``` diff --git a/doc/node-config-schema.json b/doc/node-config-schema.json index 99c031199fbc1e..3f7d6a93de270d 100644 --- a/doc/node-config-schema.json +++ b/doc/node-config-schema.json @@ -734,6 +734,35 @@ "type": "boolean" } } + }, + "watch": { + "type": "object", + "additionalProperties": false, + "properties": { + "watch": { + "type": "boolean" + }, + "watch-kill-signal": { + "type": "string" + }, + "watch-path": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string", + "minItems": 1 + }, + "type": "array" + } + ] + }, + "watch-preserve-output": { + "type": "boolean" + } + } } }, "type": "object" diff --git a/lib/internal/main/watch_mode.js b/lib/internal/main/watch_mode.js index 37d126f1257b3e..bf70f7606f5e03 100644 --- a/lib/internal/main/watch_mode.js +++ b/lib/internal/main/watch_mode.js @@ -1,6 +1,7 @@ 'use strict'; const { ArrayPrototypeForEach, + ArrayPrototypeIncludes, ArrayPrototypeJoin, ArrayPrototypeMap, ArrayPrototypePush, @@ -17,7 +18,7 @@ const { triggerUncaughtException, exitCodes: { kNoFailure }, } = internalBinding('errors'); -const { getOptionValue } = require('internal/options'); +const { getOptionValue, getOptionsAsFlagsFromBinding } = require('internal/options'); const { FilesWatcher } = require('internal/watch_mode/files_watcher'); const { green, blue, red, white, clear } = require('internal/util/colors'); const { convertToValidSignal } = require('internal/util'); @@ -40,14 +41,14 @@ const kCommand = ArrayPrototypeSlice(process.argv, 1); const kCommandStr = inspect(ArrayPrototypeJoin(kCommand, ' ')); const argsWithoutWatchOptions = []; - -for (let i = 0; i < process.execArgv.length; i++) { - const arg = process.execArgv[i]; +const argsFromBinding = getOptionsAsFlagsFromBinding(); +for (let i = 0; i < argsFromBinding.length; i++) { + const arg = argsFromBinding[i]; if (StringPrototypeStartsWith(arg, '--watch=')) { continue; } if (arg === '--watch') { - const nextArg = process.execArgv[i + 1]; + const nextArg = argsFromBinding[i + 1]; if (nextArg && nextArg[0] !== '-') { // If `--watch` doesn't include `=` and the next // argument is not a flag then it is interpreted as @@ -66,6 +67,16 @@ for (let i = 0; i < process.execArgv.length; i++) { } continue; } + if (StringPrototypeStartsWith(arg, '--experimental-config-file')) { + if (!ArrayPrototypeIncludes(arg, '=')) { + // Skip the flag and the next argument (the config file path) + i++; + } + continue; + } + if (arg === '--experimental-default-config-file') { + continue; + } ArrayPrototypePush(argsWithoutWatchOptions, arg); } diff --git a/src/node_options.cc b/src/node_options.cc index 5ee878e97d44d9..687cbd5398535f 100644 --- a/src/node_options.cc +++ b/src/node_options.cc @@ -250,7 +250,7 @@ void EnvironmentOptions::CheckOptions(std::vector* errors, } else if (test_runner_force_exit) { errors->push_back("either --watch or --test-force-exit " "can be used, not both"); - } else if (!test_runner && (argv->size() < 1 || (*argv)[1].empty())) { + } else if (!test_runner && watch_mode_paths.empty() && argv->size() < 1) { errors->push_back("--watch requires specifying a file"); } @@ -1021,20 +1021,26 @@ EnvironmentOptionsParser::EnvironmentOptionsParser() { AddOption("--watch", "run in watch mode", &EnvironmentOptions::watch_mode, - kAllowedInEnvvar); + kAllowedInEnvvar, + false, + OptionNamespaces::kWatchNamespace); AddOption("--watch-path", "path to watch", &EnvironmentOptions::watch_mode_paths, - kAllowedInEnvvar); + kAllowedInEnvvar, + OptionNamespaces::kWatchNamespace); AddOption("--watch-kill-signal", "kill signal to send to the process on watch mode restarts" "(default: SIGTERM)", &EnvironmentOptions::watch_mode_kill_signal, - kAllowedInEnvvar); + kAllowedInEnvvar, + OptionNamespaces::kWatchNamespace); AddOption("--watch-preserve-output", "preserve outputs on watch mode restart", &EnvironmentOptions::watch_mode_preserve_output, - kAllowedInEnvvar); + kAllowedInEnvvar, + false, + OptionNamespaces::kWatchNamespace); Implies("--watch-path", "--watch"); AddOption("--check", "syntax check script without executing", diff --git a/src/node_options.h b/src/node_options.h index e1b633a067fb09..c9c41ae81b1897 100644 --- a/src/node_options.h +++ b/src/node_options.h @@ -415,7 +415,8 @@ std::vector MapAvailableNamespaces(); // Define all namespace entries #define OPTION_NAMESPACE_LIST(V) \ V(kNoNamespace, "") \ - V(kTestRunnerNamespace, "testRunner") + V(kTestRunnerNamespace, "testRunner") \ + V(kWatchNamespace, "watch") enum class OptionNamespaces { #define V(name, _) name, diff --git a/test/sequential/test-watch-mode.mjs b/test/sequential/test-watch-mode.mjs index f0a7d62e560821..b0318f3505c66a 100644 --- a/test/sequential/test-watch-mode.mjs +++ b/test/sequential/test-watch-mode.mjs @@ -791,4 +791,73 @@ process.on('message', (message) => { `Completed running ${inspect(file)}. Waiting for file changes before restarting...`, ]); }); + + it('should watch changes to a file from config file', async () => { + const file = createTmpFile(); + const configFile = createTmpFile(JSON.stringify({ watch: { 'watch': true } }), '.json'); + const { stderr, stdout } = await runWriteSucceed({ + file, watchedFile: file, args: ['--experimental-config-file', configFile, file], options: { + timeout: 10000 + } + }); + + assert.strictEqual(stderr, ''); + assert.deepStrictEqual(stdout, [ + 'running', + `Completed running ${inspect(file)}. Waiting for file changes before restarting...`, + `Restarting ${inspect(file)}`, + 'running', + `Completed running ${inspect(file)}. Waiting for file changes before restarting...`, + ]); + }); + + it('should watch changes to a file with watch-path from config file', { + skip: !supportsRecursive, + }, async () => { + const dir = tmpdir.resolve('subdir4'); + mkdirSync(dir); + const file = createTmpFile(); + const watchedFile = createTmpFile('', '.js', dir); + const configFile = createTmpFile(JSON.stringify({ watch: { 'watch-path': [dir] } }), '.json', dir); + + const args = ['--experimental-config-file', configFile, file]; + const { stderr, stdout } = await runWriteSucceed({ file, watchedFile, args }); + + assert.strictEqual(stderr, ''); + assert.deepStrictEqual(stdout, [ + 'running', + `Completed running ${inspect(file)}. Waiting for file changes before restarting...`, + `Restarting ${inspect(file)}`, + 'running', + `Completed running ${inspect(file)}. Waiting for file changes before restarting...`, + ]); + assert.strictEqual(stderr, ''); + }); + + it('should watch changes to a file from default config file', async () => { + const dir = tmpdir.resolve('subdir5'); + mkdirSync(dir); + + const file = createTmpFile('console.log("running");', '.js', dir); + writeFileSync(path.join(dir, 'node.config.json'), JSON.stringify({ watch: { 'watch': true } })); + + const { stderr, stdout } = await runWriteSucceed({ + file, + watchedFile: file, + args: ['--experimental-default-config-file', file], + options: { + timeout: 10000, + cwd: dir + } + }); + + assert.strictEqual(stderr, ''); + assert.deepStrictEqual(stdout, [ + 'running', + `Completed running ${inspect(file)}. Waiting for file changes before restarting...`, + `Restarting ${inspect(file)}`, + 'running', + `Completed running ${inspect(file)}. Waiting for file changes before restarting...`, + ]); + }); }); From 4a86016e8660176e08fd8231c1788154f81fafdf Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Mon, 20 Oct 2025 20:14:39 +0200 Subject: [PATCH 44/83] util: use more defensive code when inspecting error objects PR-URL: https://github.com/nodejs/node/pull/60139 Fixes: https://github.com/nodejs/node/issues/60107 Reviewed-By: Chengzhong Wu --- lib/internal/util.js | 3 +- lib/internal/util/inspect.js | 85 ++++++++++++++++++++++-------- test/parallel/test-util-inspect.js | 25 +++++++++ 3 files changed, 89 insertions(+), 24 deletions(-) diff --git a/lib/internal/util.js b/lib/internal/util.js index 6f9c43c26f0dc9..0b1fa03cf1fab0 100644 --- a/lib/internal/util.js +++ b/lib/internal/util.js @@ -8,6 +8,7 @@ const { Error, ErrorCaptureStackTrace, FunctionPrototypeCall, + FunctionPrototypeSymbolHasInstance, NumberParseInt, ObjectDefineProperties, ObjectDefineProperty, @@ -96,7 +97,7 @@ function isError(e) { // An error could be an instance of Error while not being a native error // or could be from a different realm and not be instance of Error but still // be a native error. - return isNativeError(e) || e instanceof Error; + return isNativeError(e) || FunctionPrototypeSymbolHasInstance(Error, e); } // Keep a list of deprecation codes that have been warned on so we only warn on diff --git a/lib/internal/util/inspect.js b/lib/internal/util/inspect.js index fac1e406acdd4d..a00355b2dc21aa 100644 --- a/lib/internal/util/inspect.js +++ b/lib/internal/util/inspect.js @@ -72,6 +72,7 @@ const { ObjectPrototype, ObjectPrototypeHasOwnProperty, ObjectPrototypePropertyIsEnumerable, + ObjectPrototypeToString, ObjectSeal, ObjectSetPrototypeOf, Promise, @@ -1720,13 +1721,19 @@ function getDuplicateErrorFrameRanges(frames) { } function getStackString(ctx, error) { - if (error.stack) { - if (typeof error.stack === 'string') { - return error.stack; + let stack; + try { + stack = error.stack; + } catch { + // If stack is getter that throws, we ignore the error. + } + if (stack) { + if (typeof stack === 'string') { + return stack; } ctx.seen.push(error); ctx.indentationLvl += 4; - const result = formatValue(ctx, error.stack); + const result = formatValue(ctx, stack); ctx.indentationLvl -= 4; ctx.seen.pop(); return `${ErrorPrototypeToString(error)}\n ${result}`; @@ -1822,18 +1829,6 @@ function improveStack(stack, constructor, name, tag) { return stack; } -function removeDuplicateErrorKeys(ctx, keys, err, stack) { - if (!ctx.showHidden && keys.length !== 0) { - for (const name of ['name', 'message', 'stack']) { - const index = ArrayPrototypeIndexOf(keys, name); - // Only hide the property if it's a string and if it's part of the original stack - if (index !== -1 && (typeof err[name] !== 'string' || StringPrototypeIncludes(stack, err[name]))) { - ArrayPrototypeSplice(keys, index, 1); - } - } - } -} - function markNodeModules(ctx, line) { let tempLine = ''; let lastPos = 0; @@ -1916,10 +1911,49 @@ function safeGetCWD() { } function formatError(err, constructor, tag, ctx, keys) { - const name = err.name != null ? err.name : 'Error'; - let stack = getStackString(ctx, err); + let message, name, stack; + try { + stack = getStackString(ctx, err); + } catch { + return ObjectPrototypeToString(err); + } - removeDuplicateErrorKeys(ctx, keys, err, stack); + let messageIsGetterThatThrows = false; + try { + message = err.message; + } catch { + messageIsGetterThatThrows = true; + } + let nameIsGetterThatThrows = false; + try { + name = err.name; + } catch { + nameIsGetterThatThrows = true; + } + + if (!ctx.showHidden && keys.length !== 0) { + const index = ArrayPrototypeIndexOf(keys, 'stack'); + if (index !== -1) { + ArrayPrototypeSplice(keys, index, 1); + } + + if (!messageIsGetterThatThrows) { + const index = ArrayPrototypeIndexOf(keys, 'message'); + // Only hide the property if it's a string and if it's part of the original stack + if (index !== -1 && (typeof message !== 'string' || StringPrototypeIncludes(stack, message))) { + ArrayPrototypeSplice(keys, index, 1); + } + } + + if (!nameIsGetterThatThrows) { + const index = ArrayPrototypeIndexOf(keys, 'name'); + // Only hide the property if it's a string and if it's part of the original stack + if (index !== -1 && (typeof name !== 'string' || StringPrototypeIncludes(stack, name))) { + ArrayPrototypeSplice(keys, index, 1); + } + } + } + name ??= 'Error'; if ('cause' in err && (keys.length === 0 || !ArrayPrototypeIncludes(keys, 'cause'))) { @@ -1927,17 +1961,22 @@ function formatError(err, constructor, tag, ctx, keys) { } // Print errors aggregated into AggregateError - if (ArrayIsArray(err.errors) && + try { + const errors = err.errors; + if (ArrayIsArray(errors) && (keys.length === 0 || !ArrayPrototypeIncludes(keys, 'errors'))) { - ArrayPrototypePush(keys, 'errors'); + ArrayPrototypePush(keys, 'errors'); + } + } catch { + // If errors is a getter that throws, we ignore the error. } stack = improveStack(stack, constructor, name, tag); // Ignore the error message if it's contained in the stack. - let pos = (err.message && StringPrototypeIndexOf(stack, err.message)) || -1; + let pos = (message && StringPrototypeIndexOf(stack, message)) || -1; if (pos !== -1) - pos += err.message.length; + pos += message.length; // Wrap the error in brackets in case it has no stack trace. const stackStart = StringPrototypeIndexOf(stack, '\n at', pos); if (stackStart === -1) { diff --git a/test/parallel/test-util-inspect.js b/test/parallel/test-util-inspect.js index 8e19ba3fe9dca9..ce44c29c4e8219 100644 --- a/test/parallel/test-util-inspect.js +++ b/test/parallel/test-util-inspect.js @@ -3716,3 +3716,28 @@ ${error.stack.split('\n').slice(1).join('\n')}`, assert.strictEqual(inspect(error), '[Error: foo\n [Error: bar\n [Circular *1]]]'); } + +{ + Object.defineProperty(Error, Symbol.hasInstance, + { __proto__: null, value: common.mustNotCall(), configurable: true }); + const error = new Error(); + + const throwingGetter = { + __proto__: null, + get() { + throw error; + }, + configurable: true, + enumerable: true, + }; + + Object.defineProperties(error, { + name: throwingGetter, + stack: throwingGetter, + cause: throwingGetter, + }); + + assert.strictEqual(inspect(error), `[object Error] {\n stack: [Getter/Setter],\n name: [Getter],\n cause: [Getter]\n}`); + assert.match(inspect(DOMException.prototype), /^\[object DOMException\] \{/); + delete Error[Symbol.hasInstance]; +} From a02897e157db8f0d14aac612ee6dcbbf9bec18ce Mon Sep 17 00:00:00 2001 From: "Node.js GitHub Bot" Date: Mon, 20 Oct 2025 19:30:41 +0100 Subject: [PATCH 45/83] meta: move one or more collaborators to emeritus MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/60325 Reviewed-By: Michaël Zasso Reviewed-By: Marco Ippolito Reviewed-By: Colin Ihrig Reviewed-By: Moshe Atlow Reviewed-By: Antoine du Hamel Reviewed-By: Luigi Pinca Reviewed-By: Matteo Collina --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 281420dfc89c23..e7f4d7ba2b4792 100644 --- a/README.md +++ b/README.md @@ -323,8 +323,6 @@ For information about the governance of the Node.js project, see **Erick Wendel** <> (he/him) * [Ethan-Arrowood](https://github.com/Ethan-Arrowood) - **Ethan Arrowood** <> (he/him) -* [F3n67u](https://github.com/F3n67u) - - **Feng Yu** <> (he/him) * [fhinkel](https://github.com/fhinkel) - **Franziska Hinkelmann** <> (she/her) * [Flarna](https://github.com/Flarna) - @@ -527,6 +525,8 @@ For information about the governance of the Node.js project, see **Eugene Ostroukhov** <> * [evanlucas](https://github.com/evanlucas) - **Evan Lucas** <> (he/him) +* [F3n67u](https://github.com/F3n67u) - + **Feng Yu** <> (he/him) * [firedfox](https://github.com/firedfox) - **Daniel Wang** <> * [Fishrock123](https://github.com/Fishrock123) - @@ -751,8 +751,6 @@ maintaining the Node.js project. **Oliver Medhurst** <> (they/them) * [daeyeon](https://github.com/daeyeon) - **Daeyeon Jeong** <> (he/him) -* [F3n67u](https://github.com/F3n67u) - - **Feng Yu** <> (he/him) * [gireeshpunathil](https://github.com/gireeshpunathil) - **Gireesh Punathil** <> (he/him) * [gurgunday](https://github.com/gurgunday) - From 8596891a719e1a82eaf28b2ee78059947ffc26da Mon Sep 17 00:00:00 2001 From: "Node.js GitHub Bot" Date: Tue, 21 Oct 2025 01:44:16 +0100 Subject: [PATCH 46/83] deps: update inspector_protocol to af7f5a8173fdbc29f0835ec94395932e328b PR-URL: https://github.com/nodejs/node/pull/60312 Reviewed-By: Colin Ihrig Reviewed-By: Chengzhong Wu --- deps/inspector_protocol/README.node | 2 +- deps/inspector_protocol/crdtp/cbor.cc | 4 +- deps/inspector_protocol/crdtp/cbor_test.cc | 64 ++++++++--------- deps/inspector_protocol/crdtp/json.cc | 70 +++++++++++++------ deps/inspector_protocol/crdtp/json_test.cc | 13 ++-- .../inspector_protocol/crdtp/protocol_core.cc | 2 +- deps/inspector_protocol/crdtp/protocol_core.h | 7 +- deps/inspector_protocol/crdtp/span.h | 40 ++--------- deps/inspector_protocol/crdtp/span_test.cc | 6 ++ .../lib/Values_cpp.template | 2 +- deps/inspector_protocol/pdl.py | 12 ++++ 11 files changed, 116 insertions(+), 106 deletions(-) diff --git a/deps/inspector_protocol/README.node b/deps/inspector_protocol/README.node index af4618cd6160e5..f37ddb9e9280b6 100644 --- a/deps/inspector_protocol/README.node +++ b/deps/inspector_protocol/README.node @@ -2,7 +2,7 @@ Name: inspector protocol Short Name: inspector_protocol URL: https://chromium.googlesource.com/deps/inspector_protocol/ Version: 0 -Revision: 69d69ddf3aa698b171886551a4a672c5af1ad902 +Revision: af7f5a8173fdbc29f0835ec94395932e328b2ea2 License: BSD License File: LICENSE Security Critical: no diff --git a/deps/inspector_protocol/crdtp/cbor.cc b/deps/inspector_protocol/crdtp/cbor.cc index 801c1708022763..dc52549c55a6fe 100644 --- a/deps/inspector_protocol/crdtp/cbor.cc +++ b/deps/inspector_protocol/crdtp/cbor.cc @@ -833,7 +833,7 @@ void ParseUTF16String(CBORTokenizer* tokenizer, ParserHandler* out) { span rep = tokenizer->GetString16WireRep(); for (size_t ii = 0; ii < rep.size(); ii += 2) value.push_back((rep[ii + 1] << 8) | rep[ii]); - out->HandleString16(span(value.data(), value.size())); + out->HandleString16(value); tokenizer->Next(); } @@ -1037,7 +1037,7 @@ void ParseCBOR(span bytes, ParserHandler* out) { Status AppendString8EntryToCBORMap(span string8_key, span string8_value, std::vector* cbor) { - span bytes(cbor->data(), cbor->size()); + span bytes(*cbor); CBORTokenizer tokenizer(bytes); if (tokenizer.TokenTag() == CBORTokenTag::ERROR_VALUE) return tokenizer.Status(); diff --git a/deps/inspector_protocol/crdtp/cbor_test.cc b/deps/inspector_protocol/crdtp/cbor_test.cc index 058cd787d6416b..2d3689e730047c 100644 --- a/deps/inspector_protocol/crdtp/cbor_test.cc +++ b/deps/inspector_protocol/crdtp/cbor_test.cc @@ -349,7 +349,7 @@ TEST(EncodeDecodeString16Test, RoundtripsHelloWorld) { std::array msg{ {'H', 'e', 'l', 'l', 'o', ',', ' ', 0xd83c, 0xdf0e, '.'}}; std::vector encoded; - EncodeString16(span(msg.data(), msg.size()), &encoded); + EncodeString16(msg, &encoded); // This will be encoded as BYTE_STRING of length 20, so the 20 is encoded in // the additional info part of the initial byte. Payload is two bytes for each // UTF16 character. @@ -384,7 +384,7 @@ TEST(EncodeDecodeString16Test, Roundtrips500) { for (uint16_t ii = 0; ii < 250; ++ii) two_fifty.push_back(ii); std::vector encoded; - EncodeString16(span(two_fifty.data(), two_fifty.size()), &encoded); + EncodeString16(two_fifty, &encoded); EXPECT_EQ(3u + 250u * 2, encoded.size()); // Now check the first three bytes: // Major type: 2 (BYTE_STRING) @@ -501,7 +501,7 @@ TEST(EncodeFromLatin1Test, ConvertsToUTF8IfNeeded) { TEST(EncodeFromUTF16Test, ConvertsToUTF8IfEasy) { std::vector ascii = {'e', 'a', 's', 'y'}; std::vector encoded; - EncodeFromUTF16(span(ascii.data(), ascii.size()), &encoded); + EncodeFromUTF16(ascii, &encoded); CBORTokenizer tokenizer(SpanFrom(encoded)); EXPECT_EQ(CBORTokenTag::STRING8, tokenizer.TokenTag()); @@ -518,7 +518,7 @@ TEST(EncodeFromUTF16Test, EncodesAsString16IfNeeded) { std::vector msg = {'H', 'e', 'l', 'l', 'o', ',', ' ', 0xd83c, 0xdf0e, '.'}; std::vector encoded; - EncodeFromUTF16(span(msg.data(), msg.size()), &encoded); + EncodeFromUTF16(msg, &encoded); CBORTokenizer tokenizer(SpanFrom(encoded)); EXPECT_EQ(CBORTokenTag::STRING16, tokenizer.TokenTag()); @@ -535,7 +535,7 @@ TEST(EncodeDecodeBinaryTest, RoundtripsHelloWorld) { std::vector binary = {'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '.'}; std::vector encoded; - EncodeBinary(span(binary.data(), binary.size()), &encoded); + EncodeBinary(binary, &encoded); // So, on the wire we see that the binary blob travels unmodified. EXPECT_THAT( encoded, @@ -699,7 +699,7 @@ TEST(JSONToCBOREncoderTest, SevenBitStrings) { Status status; std::unique_ptr encoder = NewCBOREncoder(&encoded, &status); std::vector utf16 = {'f', 'o', 'o'}; - encoder->HandleString16(span(utf16.data(), utf16.size())); + encoder->HandleString16(utf16); EXPECT_THAT(status, StatusIsOk()); // Here we assert that indeed, seven bit strings are represented as // bytes on the wire, "foo" is just "foo". @@ -771,7 +771,7 @@ TEST(JsonCborRoundtrip, EncodingDecoding) { std::string decoded; std::unique_ptr json_encoder = json::NewJSONEncoder(&decoded, &status); - ParseCBOR(span(encoded.data(), encoded.size()), json_encoder.get()); + ParseCBOR(encoded, json_encoder.get()); EXPECT_THAT(status, StatusIsOk()); EXPECT_EQ(json, decoded); } @@ -791,7 +791,7 @@ TEST(JsonCborRoundtrip, MoreRoundtripExamples) { std::string decoded; std::unique_ptr json_writer = json::NewJSONEncoder(&decoded, &status); - ParseCBOR(span(encoded.data(), encoded.size()), json_writer.get()); + ParseCBOR(encoded, json_writer.get()); EXPECT_THAT(status, StatusIsOk()); EXPECT_EQ(json, decoded); } @@ -842,7 +842,7 @@ TEST(ParseCBORTest, ParseEmptyCBORMessage) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(in.data(), in.size()), json_writer.get()); + ParseCBOR(in, json_writer.get()); EXPECT_THAT(status, StatusIsOk()); EXPECT_EQ("{}", out); } @@ -866,7 +866,7 @@ TEST(ParseCBORTest, ParseCBORHelloWorld) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIsOk()); EXPECT_EQ("{\"msg\":\"Hello, \\ud83c\\udf0e.\"}", out); } @@ -887,7 +887,7 @@ TEST(ParseCBORTest, UTF8IsSupportedInKeys) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIsOk()); EXPECT_EQ("{\"\\ud83c\\udf0e\":\"\\u263e\"}", out); } @@ -898,7 +898,7 @@ TEST(ParseCBORTest, NoInputError) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(in.data(), in.size()), json_writer.get()); + ParseCBOR(in, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_UNEXPECTED_EOF_IN_ENVELOPE, 0u)); EXPECT_EQ("", out); } @@ -914,7 +914,7 @@ TEST(ParseCBORTest, UnexpectedEofExpectedValueError) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_UNEXPECTED_EOF_EXPECTED_VALUE, bytes.size())); EXPECT_EQ("", out); @@ -932,7 +932,7 @@ TEST(ParseCBORTest, UnexpectedEofInArrayError) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_UNEXPECTED_EOF_IN_ARRAY, bytes.size())); EXPECT_EQ("", out); @@ -947,7 +947,7 @@ TEST(ParseCBORTest, UnexpectedEofInMapError) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_UNEXPECTED_EOF_IN_MAP, 7u)); EXPECT_EQ("", out); } @@ -963,7 +963,7 @@ TEST(ParseCBORTest, EnvelopeEncodingLegacy) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIsOk()); EXPECT_EQ(out, "{\"foo\":42}"); } @@ -980,7 +980,7 @@ TEST(ParseCBORTest, EnvelopeEncodingBySpec) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIsOk()); EXPECT_EQ(out, "{\"foo\":42}"); } @@ -991,7 +991,7 @@ TEST(ParseCBORTest, NoEmptyEnvelopesAllowed) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_MAP_OR_ARRAY_EXPECTED_IN_ENVELOPE, bytes.size())); EXPECT_EQ("", out); @@ -1021,7 +1021,7 @@ TEST(ParseCBORTest, OnlyMapsAndArraysSupportedInsideEnvelopes) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_MAP_OR_ARRAY_EXPECTED_IN_ENVELOPE, error_pos)); EXPECT_EQ("", out); @@ -1038,7 +1038,7 @@ TEST(ParseCBORTest, InvalidMapKeyError) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_INVALID_MAP_KEY, 7u)); EXPECT_EQ("", out); } @@ -1068,7 +1068,7 @@ TEST(ParseCBORTest, StackLimitExceededError) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIsOk()); EXPECT_EQ("{\"key\":{\"key\":{\"key\":\"innermost_value\"}}}", out); } @@ -1078,7 +1078,7 @@ TEST(ParseCBORTest, StackLimitExceededError) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIsOk()); } @@ -1097,7 +1097,7 @@ TEST(ParseCBORTest, StackLimitExceededError) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_STACK_LIMIT_EXCEEDED, opening_segment_size * 301)); } @@ -1107,7 +1107,7 @@ TEST(ParseCBORTest, StackLimitExceededError) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_STACK_LIMIT_EXCEEDED, opening_segment_size * 301)); } @@ -1126,7 +1126,7 @@ TEST(ParseCBORTest, UnsupportedValueError) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_UNSUPPORTED_VALUE, error_pos)); EXPECT_EQ("", out); } @@ -1148,7 +1148,7 @@ TEST(ParseCBORTest, InvalidString16Error) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_INVALID_STRING16, error_pos)); EXPECT_EQ("", out); } @@ -1167,7 +1167,7 @@ TEST(ParseCBORTest, InvalidString8Error) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_INVALID_STRING8, error_pos)); EXPECT_EQ("", out); } @@ -1188,7 +1188,7 @@ TEST(ParseCBORTest, InvalidBinaryError) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_INVALID_BINARY, error_pos)); EXPECT_EQ("", out); } @@ -1208,7 +1208,7 @@ TEST(ParseCBORTest, InvalidDoubleError) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_INVALID_DOUBLE, error_pos)); EXPECT_EQ("", out); } @@ -1228,7 +1228,7 @@ TEST(ParseCBORTest, InvalidSignedError) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_INVALID_INT32, error_pos)); EXPECT_EQ("", out); } @@ -1250,7 +1250,7 @@ TEST(ParseCBORTest, TrailingJunk) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_TRAILING_JUNK, error_pos)); EXPECT_EQ("", out); } @@ -1272,7 +1272,7 @@ TEST(ParseCBORTest, EnvelopeContentsLengthMismatch) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_ENVELOPE_CONTENTS_LENGTH_MISMATCH, bytes.size())); EXPECT_EQ("", out); diff --git a/deps/inspector_protocol/crdtp/json.cc b/deps/inspector_protocol/crdtp/json.cc index 479f9ba51875ab..bc3b8a6d9093c7 100644 --- a/deps/inspector_protocol/crdtp/json.cc +++ b/deps/inspector_protocol/crdtp/json.cc @@ -149,23 +149,31 @@ class JSONEncoder : public ParserHandler { Emit('"'); for (const uint16_t ch : chars) { if (ch == '"') { - Emit('\\'); Emit('"'); + Emit('\\'); + Emit('"'); } else if (ch == '\\') { - Emit('\\'); Emit('\\'); + Emit('\\'); + Emit('\\'); } else if (ch >= 32 && ch <= 127) { Emit(ch); } else if (ch == '\n') { - Emit('\\'); Emit('n'); + Emit('\\'); + Emit('n'); } else if (ch == '\r') { - Emit('\\'); Emit('r'); + Emit('\\'); + Emit('r'); } else if (ch == '\t') { - Emit('\\'); Emit('t'); + Emit('\\'); + Emit('t'); } else if (ch == '\b') { - Emit('\\'); Emit('b'); + Emit('\\'); + Emit('b'); } else if (ch == '\f') { - Emit('\\'); Emit('f'); + Emit('\\'); + Emit('f'); } else { - Emit('\\'); Emit('u'); + Emit('\\'); + Emit('u'); PrintHex(ch, out_); } } @@ -177,26 +185,42 @@ class JSONEncoder : public ParserHandler { return; state_.top().StartElement(out_); Emit('"'); + // Fast path for input strings that can be emitted as-is. + if (std::all_of(chars.begin(), chars.end(), [](uint8_t c) { + return c != '"' && c != '\\' && c >= 32 && c <= 127; + })) { + Emit(chars); + Emit('"'); + return; + } for (size_t ii = 0; ii < chars.size(); ++ii) { uint8_t c = chars[ii]; if (c == '"') { - Emit('\\'); Emit('"'); + Emit('\\'); + Emit('"'); } else if (c == '\\') { - Emit('\\'); Emit('\\'); + Emit('\\'); + Emit('\\'); } else if (c >= 32 && c <= 127) { Emit(c); } else if (c == '\n') { - Emit('\\'); Emit('n'); + Emit('\\'); + Emit('n'); } else if (c == '\r') { - Emit('\\'); Emit('r'); + Emit('\\'); + Emit('r'); } else if (c == '\t') { - Emit('\\'); Emit('t'); + Emit('\\'); + Emit('t'); } else if (c == '\b') { - Emit('\\'); Emit('b'); + Emit('\\'); + Emit('b'); } else if (c == '\f') { - Emit('\\'); Emit('f'); + Emit('\\'); + Emit('f'); } else if (c < 32) { - Emit('\\'); Emit('u'); + Emit('\\'); + Emit('u'); PrintHex(static_cast(c), out_); } else { // Inspect the leading byte to figure out how long the utf8 @@ -330,10 +354,11 @@ class JSONEncoder : public ParserHandler { if (!status_->ok()) return; state_.top().StartElement(out_); - if (value) + if (value) { Emit("true"); - else + } else { Emit("false"); + } } void HandleNull() override { @@ -351,13 +376,16 @@ class JSONEncoder : public ParserHandler { private: inline void Emit(char c) { out_->push_back(c); } - template + template inline void Emit(const char (&str)[N]) { out_->insert(out_->end(), str, str + N - 1); } inline void Emit(const std::string& str) { out_->insert(out_->end(), str.begin(), str.end()); } + inline void Emit(const span& bytes) { + out_->insert(out_->end(), bytes.begin(), bytes.end()); + } C* out_; Status* status_; @@ -882,7 +910,7 @@ class JsonParser { HandleError(Error::JSON_PARSER_INVALID_STRING, token_start); return; } - handler_->HandleString16(span(value.data(), value.size())); + handler_->HandleString16(value); break; } case ArrayBegin: { @@ -929,7 +957,7 @@ class JsonParser { HandleError(Error::JSON_PARSER_INVALID_STRING, token_start); return; } - handler_->HandleString16(span(key.data(), key.size())); + handler_->HandleString16(key); start = token_end; token = ParseToken(start, end, &token_start, &token_end); diff --git a/deps/inspector_protocol/crdtp/json_test.cc b/deps/inspector_protocol/crdtp/json_test.cc index 08f65e48a20147..13566ac8b92f61 100644 --- a/deps/inspector_protocol/crdtp/json_test.cc +++ b/deps/inspector_protocol/crdtp/json_test.cc @@ -90,7 +90,7 @@ TEST(JsonEncoder, EscapesLoneHighSurrogates) { std::string out; Status status; std::unique_ptr writer = NewJSONEncoder(&out, &status); - writer->HandleString16(span(chars.data(), chars.size())); + writer->HandleString16(chars); EXPECT_EQ("\"a\\ud800b\\udadac\\udbffd\"", out); } @@ -103,7 +103,7 @@ TEST(JsonEncoder, EscapesLoneLowSurrogates) { std::string out; Status status; std::unique_ptr writer = NewJSONEncoder(&out, &status); - writer->HandleString16(span(chars.data(), chars.size())); + writer->HandleString16(chars); EXPECT_EQ("\"a\\udc00b\\udedec\\udfffd\"", out); } @@ -114,7 +114,7 @@ TEST(JsonEncoder, EscapesFFFF) { std::string out; Status status; std::unique_ptr writer = NewJSONEncoder(&out, &status); - writer->HandleString16(span(chars.data(), chars.size())); + writer->HandleString16(chars); EXPECT_EQ("\"abc\\uffffd\"", out); } @@ -123,7 +123,7 @@ TEST(JsonEncoder, Passes0x7FString8) { std::string out; Status status; std::unique_ptr writer = NewJSONEncoder(&out, &status); - writer->HandleString8(span(chars.data(), chars.size())); + writer->HandleString8(chars); EXPECT_EQ( "\"a\x7f" "b\"", @@ -135,7 +135,7 @@ TEST(JsonEncoder, Passes0x7FString16) { std::string out; Status status; std::unique_ptr writer = NewJSONEncoder(&out, &status); - writer->HandleString16(span(chars16.data(), chars16.size())); + writer->HandleString16(chars16); EXPECT_EQ( "\"a\x7f" "b\"", @@ -737,8 +737,7 @@ TYPED_TEST(ConvertJSONToCBORTest, RoundTripValidJson16) { '"', ':', '[', '1', ',', '2', ',', '3', ']', '}'}; std::vector cbor; { - Status status = - ConvertJSONToCBOR(span(json16.data(), json16.size()), &cbor); + Status status = ConvertJSONToCBOR(json16, &cbor); EXPECT_THAT(status, StatusIsOk()); } TypeParam roundtrip_json; diff --git a/deps/inspector_protocol/crdtp/protocol_core.cc b/deps/inspector_protocol/crdtp/protocol_core.cc index 69773593ded162..dc483ac5ad0896 100644 --- a/deps/inspector_protocol/crdtp/protocol_core.cc +++ b/deps/inspector_protocol/crdtp/protocol_core.cc @@ -12,7 +12,7 @@ namespace crdtp { DeserializerState::DeserializerState(std::vector bytes) : storage_(new std::vector(std::move(bytes))), - tokenizer_(span(storage_->data(), storage_->size())) {} + tokenizer_(*storage_) {} DeserializerState::DeserializerState(Storage storage, span span) : storage_(std::move(storage)), tokenizer_(span) {} diff --git a/deps/inspector_protocol/crdtp/protocol_core.h b/deps/inspector_protocol/crdtp/protocol_core.h index f8283367773a42..b111746253aaf3 100644 --- a/deps/inspector_protocol/crdtp/protocol_core.h +++ b/deps/inspector_protocol/crdtp/protocol_core.h @@ -219,8 +219,7 @@ struct CRDTP_EXPORT ProtocolTypeTraits { template struct ProtocolTypeTraits> { - static bool Deserialize(DeserializerState* state, - std::optional* value) { + static bool Deserialize(DeserializerState* state, std::optional* value) { T res; if (!ProtocolTypeTraits::Deserialize(state, &res)) return false; @@ -341,9 +340,7 @@ template bool ConvertProtocolValue(const F& from, T* to) { std::vector bytes; ProtocolTypeTraits::Serialize(from, &bytes); - auto deserializer = - DeferredMessage::FromSpan(span(bytes.data(), bytes.size())) - ->MakeDeserializer(); + auto deserializer = DeferredMessage::FromSpan(bytes)->MakeDeserializer(); return ProtocolTypeTraits::Deserialize(&deserializer, to); } diff --git a/deps/inspector_protocol/crdtp/span.h b/deps/inspector_protocol/crdtp/span.h index c2b5b02d9a1832..40471f20aa88a2 100644 --- a/deps/inspector_protocol/crdtp/span.h +++ b/deps/inspector_protocol/crdtp/span.h @@ -7,49 +7,17 @@ #include #include -#include +#include #include +#include #include "export.h" namespace crdtp { -// ============================================================================= -// span - sequence of bytes -// ============================================================================= -// This template is similar to std::span, which will be included in C++20. +// crdtp::span is a std::span which always holds const elements. template -class span { - public: - using index_type = size_t; - - constexpr span() : data_(nullptr), size_(0) {} - constexpr span(const T* data, index_type size) : data_(data), size_(size) {} - - constexpr const T* data() const { return data_; } - - constexpr const T* begin() const { return data_; } - constexpr const T* end() const { return data_ + size_; } - - constexpr const T& operator[](index_type idx) const { return data_[idx]; } - - constexpr span subspan(index_type offset, index_type count) const { - return span(data_ + offset, count); - } - - constexpr span subspan(index_type offset) const { - return span(data_ + offset, size_ - offset); - } - - constexpr bool empty() const { return size_ == 0; } - - constexpr index_type size() const { return size_; } - constexpr index_type size_bytes() const { return size_ * sizeof(T); } - - private: - const T* data_; - index_type size_; -}; +using span = std::span; template constexpr span MakeSpan(const char (&str)[N]) { diff --git a/deps/inspector_protocol/crdtp/span_test.cc b/deps/inspector_protocol/crdtp/span_test.cc index e562f4ea6feed9..2845a3b889fcc3 100644 --- a/deps/inspector_protocol/crdtp/span_test.cc +++ b/deps/inspector_protocol/crdtp/span_test.cc @@ -85,6 +85,12 @@ TEST(SpanFromTest, FromVectorUint8AndUint16) { EXPECT_EQ(bar.size(), bar_span.size()); } +TEST(SpanFromTest, FromVectorImplicit) { + std::vector foo = {'f', 'o', 'o'}; + span foo_span(foo); + EXPECT_EQ(foo.size(), foo_span.size()); +} + TEST(SpanComparisons, ByteWiseLexicographicalOrder) { // Compare the empty span. EXPECT_FALSE(SpanLessThan(span(), span())); diff --git a/deps/inspector_protocol/lib/Values_cpp.template b/deps/inspector_protocol/lib/Values_cpp.template index 0c409295d52ae3..abeee79e5c3a05 100644 --- a/deps/inspector_protocol/lib/Values_cpp.template +++ b/deps/inspector_protocol/lib/Values_cpp.template @@ -300,7 +300,7 @@ namespace { // transcodes to UTF8 if needed. void EncodeString(const String& s, std::vector* out) { if (StringUtil::CharacterCount(s) == 0) { - cbor::EncodeString8(span(nullptr, 0), out); // Empty string. + cbor::EncodeString8(span(), out); // Empty string. } else if (StringUtil::CharactersLatin1(s)) { cbor::EncodeFromLatin1(span(StringUtil::CharactersLatin1(s), StringUtil::CharacterCount(s)), diff --git a/deps/inspector_protocol/pdl.py b/deps/inspector_protocol/pdl.py index 6b448c07443c7e..20f505ea81e34e 100644 --- a/deps/inspector_protocol/pdl.py +++ b/deps/inspector_protocol/pdl.py @@ -86,6 +86,18 @@ def parse(data, file_name, map_binary_to_string=False): protocol['domains'].append(domain) continue + match = re.compile( + r'^include (.*)').match(line) + if match: + included_filename = match.group(1) + if path.isabs(included_filename): + raise Exception("Only relative paths are supported in include's") + resolved_path = path.normpath(path.join(path.dirname(file_name), included_filename)) + with open(resolved_path, 'r') as file: + included_data = parse(file.read(), resolved_path, map_binary_to_string) + protocol['domains'].extend(included_data['domains']) + continue + match = re.compile(r'^ depends on ([^\s]+)').match(line) if match: if 'dependencies' not in domain: From aacfc0d212049da9fbc313c0ea03382d61b84ce9 Mon Sep 17 00:00:00 2001 From: "Node.js GitHub Bot" Date: Tue, 21 Oct 2025 01:44:25 +0100 Subject: [PATCH 47/83] deps: update corepack to 0.34.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/60314 Reviewed-By: Antoine du Hamel Reviewed-By: Michaël Zasso --- deps/corepack/CHANGELOG.md | 8 + deps/corepack/dist/lib/corepack.cjs | 6239 +++++++++++++-------------- deps/corepack/package.json | 6 +- 3 files changed, 3127 insertions(+), 3126 deletions(-) diff --git a/deps/corepack/CHANGELOG.md b/deps/corepack/CHANGELOG.md index fdf937785ca5d4..61ad4b5379818c 100644 --- a/deps/corepack/CHANGELOG.md +++ b/deps/corepack/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [0.34.1](https://github.com/nodejs/corepack/compare/v0.34.0...v0.34.1) (2025-10-17) + + +### Bug Fixes + +* incorrect registry origin check ([#743](https://github.com/nodejs/corepack/issues/743)) ([cc840b2](https://github.com/nodejs/corepack/commit/cc840b2d232a29c225d2436d350640f0035ed28b)) +* update package manager versions ([#728](https://github.com/nodejs/corepack/issues/728)) ([78ce029](https://github.com/nodejs/corepack/commit/78ce0297a9152bb5c68f724821a9a0095b408334)) + ## [0.34.0](https://github.com/nodejs/corepack/compare/v0.33.0...v0.34.0) (2025-07-19) diff --git a/deps/corepack/dist/lib/corepack.cjs b/deps/corepack/dist/lib/corepack.cjs index 78fb4372832e3b..8a5add55f0083c 100644 --- a/deps/corepack/dist/lib/corepack.cjs +++ b/deps/corepack/dist/lib/corepack.cjs @@ -15,11 +15,11 @@ var __export = (target, all) => { for (var name2 in all) __defProp(target, name2, { get: all[name2], enumerable: true }); }; -var __copyProps = (to, from, except, desc) => { +var __copyProps = (to, from, except, desc2) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + __defProp(to, key, { get: () => from[key], enumerable: !(desc2 = __getOwnPropDesc(from, key)) || desc2.enumerable }); } return to; }; @@ -604,12 +604,12 @@ function as(value, validator, { coerce = false, errors: storeErrors, throw: thro } function fn(validators, fn2) { const isValidArgList = isTuple(validators); - return (...args) => { + return ((...args) => { const check = isValidArgList(args); if (!check) throw new TypeAssertionError(); return fn2(...args); - }; + }); } function hasMinLength(length) { return makeValidator({ @@ -1090,18 +1090,20 @@ var require_node = __commonJS({ } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/internal/debug.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/debug.js var require_debug = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/internal/debug.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/debug.js"(exports2, module2) { + "use strict"; var debug2 = typeof process === "object" && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args) => console.error("SEMVER", ...args) : () => { }; module2.exports = debug2; } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/internal/constants.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/constants.js var require_constants = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/internal/constants.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/constants.js"(exports2, module2) { + "use strict"; var SEMVER_SPEC_VERSION = "2.0.0"; var MAX_LENGTH = 256; var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || /* istanbul ignore next */ @@ -1130,9 +1132,10 @@ var require_constants = __commonJS({ } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/internal/re.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/re.js var require_re = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/internal/re.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/re.js"(exports2, module2) { + "use strict"; var { MAX_SAFE_COMPONENT_LENGTH, MAX_SAFE_BUILD_LENGTH, @@ -1173,8 +1176,8 @@ var require_re = __commonJS({ createToken("NONNUMERICIDENTIFIER", `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`); createToken("MAINVERSION", `(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})`); createToken("MAINVERSIONLOOSE", `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})`); - createToken("PRERELEASEIDENTIFIER", `(?:${src[t.NUMERICIDENTIFIER]}|${src[t.NONNUMERICIDENTIFIER]})`); - createToken("PRERELEASEIDENTIFIERLOOSE", `(?:${src[t.NUMERICIDENTIFIERLOOSE]}|${src[t.NONNUMERICIDENTIFIER]})`); + createToken("PRERELEASEIDENTIFIER", `(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIER]})`); + createToken("PRERELEASEIDENTIFIERLOOSE", `(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIERLOOSE]})`); createToken("PRERELEASE", `(?:-(${src[t.PRERELEASEIDENTIFIER]}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`); createToken("PRERELEASELOOSE", `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`); createToken("BUILDIDENTIFIER", `${LETTERDASHNUMBER}+`); @@ -1217,9 +1220,10 @@ var require_re = __commonJS({ } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/internal/parse-options.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/parse-options.js var require_parse_options = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/internal/parse-options.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/parse-options.js"(exports2, module2) { + "use strict"; var looseOption = Object.freeze({ loose: true }); var emptyOpts = Object.freeze({}); var parseOptions = (options) => { @@ -1235,11 +1239,15 @@ var require_parse_options = __commonJS({ } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/internal/identifiers.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/identifiers.js var require_identifiers = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/internal/identifiers.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/identifiers.js"(exports2, module2) { + "use strict"; var numeric = /^[0-9]+$/; var compareIdentifiers = (a, b) => { + if (typeof a === "number" && typeof b === "number") { + return a === b ? 0 : a < b ? -1 : 1; + } const anum = numeric.test(a); const bnum = numeric.test(b); if (anum && bnum) { @@ -1256,40 +1264,41 @@ var require_identifiers = __commonJS({ } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/classes/semver.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/classes/semver.js var require_semver = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/classes/semver.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/classes/semver.js"(exports2, module2) { + "use strict"; var debug2 = require_debug(); var { MAX_LENGTH, MAX_SAFE_INTEGER } = require_constants(); - var { safeRe: re, safeSrc: src, t } = require_re(); + var { safeRe: re, t } = require_re(); var parseOptions = require_parse_options(); var { compareIdentifiers } = require_identifiers(); var SemVer3 = class _SemVer { - constructor(version3, options) { + constructor(version2, options) { options = parseOptions(options); - if (version3 instanceof _SemVer) { - if (version3.loose === !!options.loose && version3.includePrerelease === !!options.includePrerelease) { - return version3; + if (version2 instanceof _SemVer) { + if (version2.loose === !!options.loose && version2.includePrerelease === !!options.includePrerelease) { + return version2; } else { - version3 = version3.version; + version2 = version2.version; } - } else if (typeof version3 !== "string") { - throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version3}".`); + } else if (typeof version2 !== "string") { + throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version2}".`); } - if (version3.length > MAX_LENGTH) { + if (version2.length > MAX_LENGTH) { throw new TypeError( `version is longer than ${MAX_LENGTH} characters` ); } - debug2("SemVer", version3, options); + debug2("SemVer", version2, options); this.options = options; this.loose = !!options.loose; this.includePrerelease = !!options.includePrerelease; - const m = version3.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]); + const m = version2.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]); if (!m) { - throw new TypeError(`Invalid Version: ${version3}`); + throw new TypeError(`Invalid Version: ${version2}`); } - this.raw = version3; + this.raw = version2; this.major = +m[1]; this.minor = +m[2]; this.patch = +m[3]; @@ -1345,7 +1354,25 @@ var require_semver = __commonJS({ if (!(other instanceof _SemVer)) { other = new _SemVer(other, this.options); } - return compareIdentifiers(this.major, other.major) || compareIdentifiers(this.minor, other.minor) || compareIdentifiers(this.patch, other.patch); + if (this.major < other.major) { + return -1; + } + if (this.major > other.major) { + return 1; + } + if (this.minor < other.minor) { + return -1; + } + if (this.minor > other.minor) { + return 1; + } + if (this.patch < other.patch) { + return -1; + } + if (this.patch > other.patch) { + return 1; + } + return 0; } comparePre(other) { if (!(other instanceof _SemVer)) { @@ -1406,8 +1433,7 @@ var require_semver = __commonJS({ throw new Error("invalid increment argument: identifier is empty"); } if (identifier) { - const r = new RegExp(`^${this.options.loose ? src[t.PRERELEASELOOSE] : src[t.PRERELEASE]}$`); - const match = `-${identifier}`.match(r); + const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE]); if (!match || match[1] !== identifier) { throw new Error(`invalid identifier: ${identifier}`); } @@ -1517,34 +1543,37 @@ var require_semver = __commonJS({ } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/compare.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/compare.js var require_compare = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/compare.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/compare.js"(exports2, module2) { + "use strict"; var SemVer3 = require_semver(); var compare = (a, b, loose) => new SemVer3(a, loose).compare(new SemVer3(b, loose)); module2.exports = compare; } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/rcompare.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/rcompare.js var require_rcompare = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/rcompare.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/rcompare.js"(exports2, module2) { + "use strict"; var compare = require_compare(); var rcompare = (a, b, loose) => compare(b, a, loose); module2.exports = rcompare; } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/parse.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/parse.js var require_parse = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/parse.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/parse.js"(exports2, module2) { + "use strict"; var SemVer3 = require_semver(); - var parse5 = (version3, options, throwErrors = false) => { - if (version3 instanceof SemVer3) { - return version3; + var parse4 = (version2, options, throwErrors = false) => { + if (version2 instanceof SemVer3) { + return version2; } try { - return new SemVer3(version3, options); + return new SemVer3(version2, options); } catch (er) { if (!throwErrors) { return null; @@ -1552,25 +1581,27 @@ var require_parse = __commonJS({ throw er; } }; - module2.exports = parse5; + module2.exports = parse4; } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/valid.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/valid.js var require_valid = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/valid.js"(exports2, module2) { - var parse5 = require_parse(); - var valid = (version3, options) => { - const v = parse5(version3, options); + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/valid.js"(exports2, module2) { + "use strict"; + var parse4 = require_parse(); + var valid = (version2, options) => { + const v = parse4(version2, options); return v ? v.version : null; }; module2.exports = valid; } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/internal/lrucache.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/lrucache.js var require_lrucache = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/internal/lrucache.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/lrucache.js"(exports2, module2) { + "use strict"; var LRUCache = class { constructor() { this.max = 1e3; @@ -1605,63 +1636,70 @@ var require_lrucache = __commonJS({ } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/eq.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/eq.js var require_eq = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/eq.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/eq.js"(exports2, module2) { + "use strict"; var compare = require_compare(); var eq = (a, b, loose) => compare(a, b, loose) === 0; module2.exports = eq; } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/neq.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/neq.js var require_neq = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/neq.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/neq.js"(exports2, module2) { + "use strict"; var compare = require_compare(); var neq = (a, b, loose) => compare(a, b, loose) !== 0; module2.exports = neq; } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/gt.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/gt.js var require_gt = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/gt.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/gt.js"(exports2, module2) { + "use strict"; var compare = require_compare(); var gt = (a, b, loose) => compare(a, b, loose) > 0; module2.exports = gt; } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/gte.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/gte.js var require_gte = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/gte.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/gte.js"(exports2, module2) { + "use strict"; var compare = require_compare(); var gte = (a, b, loose) => compare(a, b, loose) >= 0; module2.exports = gte; } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/lt.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/lt.js var require_lt = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/lt.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/lt.js"(exports2, module2) { + "use strict"; var compare = require_compare(); var lt = (a, b, loose) => compare(a, b, loose) < 0; module2.exports = lt; } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/lte.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/lte.js var require_lte = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/lte.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/lte.js"(exports2, module2) { + "use strict"; var compare = require_compare(); var lte = (a, b, loose) => compare(a, b, loose) <= 0; module2.exports = lte; } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/cmp.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/cmp.js var require_cmp = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/cmp.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/cmp.js"(exports2, module2) { + "use strict"; var eq = require_eq(); var neq = require_neq(); var gt = require_gt(); @@ -1708,9 +1746,10 @@ var require_cmp = __commonJS({ } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/classes/comparator.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/classes/comparator.js var require_comparator = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/classes/comparator.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/classes/comparator.js"(exports2, module2) { + "use strict"; var ANY = Symbol("SemVer ANY"); var Comparator = class _Comparator { static get ANY() { @@ -1756,19 +1795,19 @@ var require_comparator = __commonJS({ toString() { return this.value; } - test(version3) { - debug2("Comparator.test", version3, this.options.loose); - if (this.semver === ANY || version3 === ANY) { + test(version2) { + debug2("Comparator.test", version2, this.options.loose); + if (this.semver === ANY || version2 === ANY) { return true; } - if (typeof version3 === "string") { + if (typeof version2 === "string") { try { - version3 = new SemVer3(version3, this.options); + version2 = new SemVer3(version2, this.options); } catch (er) { return false; } } - return cmp(version3, this.operator, this.semver, this.options); + return cmp(version2, this.operator, this.semver, this.options); } intersects(comp, options) { if (!(comp instanceof _Comparator)) { @@ -1820,9 +1859,10 @@ var require_comparator = __commonJS({ } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/classes/range.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/classes/range.js var require_range = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/classes/range.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/classes/range.js"(exports2, module2) { + "use strict"; var SPACE_CHARACTERS = /\s+/g; var Range3 = class _Range { constructor(range, options) { @@ -1891,7 +1931,7 @@ var require_range = __commonJS({ parseRange(range) { const memoOpts = (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) | (this.options.loose && FLAG_LOOSE); const memoKey = memoOpts + ":" + range; - const cached = cache.get(memoKey); + const cached = cache2.get(memoKey); if (cached) { return cached; } @@ -1925,7 +1965,7 @@ var require_range = __commonJS({ rangeMap.delete(""); } const result = [...rangeMap.values()]; - cache.set(memoKey, result); + cache2.set(memoKey, result); return result; } intersects(range, options) { @@ -1943,19 +1983,19 @@ var require_range = __commonJS({ }); } // if ANY of the sets match ALL of its comparators, then pass - test(version3) { - if (!version3) { + test(version2) { + if (!version2) { return false; } - if (typeof version3 === "string") { + if (typeof version2 === "string") { try { - version3 = new SemVer3(version3, this.options); + version2 = new SemVer3(version2, this.options); } catch (er) { return false; } } for (let i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version3, this.options)) { + if (testSet(this.set[i], version2, this.options)) { return true; } } @@ -1964,7 +2004,7 @@ var require_range = __commonJS({ }; module2.exports = Range3; var LRU = require_lrucache(); - var cache = new LRU(); + var cache2 = new LRU(); var parseOptions = require_parse_options(); var Comparator = require_comparator(); var debug2 = require_debug(); @@ -1992,6 +2032,7 @@ var require_range = __commonJS({ return result; }; var parseComparator = (comp, options) => { + comp = comp.replace(re[t.BUILD], ""); debug2("comp", comp, options); comp = replaceCarets(comp, options); debug2("caret", comp); @@ -2169,13 +2210,13 @@ var require_range = __commonJS({ } return `${from} ${to}`.trim(); }; - var testSet = (set, version3, options) => { + var testSet = (set, version2, options) => { for (let i = 0; i < set.length; i++) { - if (!set[i].test(version3)) { + if (!set[i].test(version2)) { return false; } } - if (version3.prerelease.length && !options.includePrerelease) { + if (version2.prerelease.length && !options.includePrerelease) { for (let i = 0; i < set.length; i++) { debug2(set[i].semver); if (set[i].semver === Comparator.ANY) { @@ -2183,7 +2224,7 @@ var require_range = __commonJS({ } if (set[i].semver.prerelease.length > 0) { const allowed = set[i].semver; - if (allowed.major === version3.major && allowed.minor === version3.minor && allowed.patch === version3.patch) { + if (allowed.major === version2.major && allowed.minor === version2.minor && allowed.patch === version2.patch) { return true; } } @@ -2195,9 +2236,10 @@ var require_range = __commonJS({ } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/ranges/valid.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/ranges/valid.js var require_valid2 = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/ranges/valid.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/ranges/valid.js"(exports2, module2) { + "use strict"; var Range3 = require_range(); var validRange = (range, options) => { try { @@ -2223,7 +2265,7 @@ var require_ms = __commonJS({ options = options || {}; var type = typeof val; if (type === "string" && val.length > 0) { - return parse5(val); + return parse4(val); } else if (type === "number" && isFinite(val)) { return options.long ? fmtLong(val) : fmtShort(val); } @@ -2231,7 +2273,7 @@ var require_ms = __commonJS({ "val is not a non-empty string or a valid number. val=" + JSON.stringify(val) ); }; - function parse5(str) { + function parse4(str) { str = String(str); if (str.length > 100) { return; @@ -2326,9 +2368,9 @@ var require_ms = __commonJS({ } }); -// .yarn/__virtual__/debug-virtual-f48feae4da/0/cache/debug-npm-4.4.0-f6efe76023-db94f1a182.zip/node_modules/debug/src/common.js +// .yarn/__virtual__/debug-virtual-436baa457e/0/cache/debug-npm-4.4.3-0105c6123a-d79136ec6c.zip/node_modules/debug/src/common.js var require_common = __commonJS({ - ".yarn/__virtual__/debug-virtual-f48feae4da/0/cache/debug-npm-4.4.0-f6efe76023-db94f1a182.zip/node_modules/debug/src/common.js"(exports2, module2) { + ".yarn/__virtual__/debug-virtual-436baa457e/0/cache/debug-npm-4.4.3-0105c6123a-d79136ec6c.zip/node_modules/debug/src/common.js"(exports2, module2) { function setup(env2) { createDebug.debug = createDebug; createDebug.default = createDebug; @@ -2429,7 +2471,7 @@ var require_common = __commonJS({ createDebug.namespaces = namespaces; createDebug.names = []; createDebug.skips = []; - const split = (typeof namespaces === "string" ? namespaces : "").trim().replace(" ", ",").split(",").filter(Boolean); + const split = (typeof namespaces === "string" ? namespaces : "").trim().replace(/\s+/g, ",").split(",").filter(Boolean); for (const ns of split) { if (ns[0] === "-") { createDebug.skips.push(ns.slice(1)); @@ -2503,9 +2545,9 @@ var require_common = __commonJS({ } }); -// .yarn/__virtual__/debug-virtual-f48feae4da/0/cache/debug-npm-4.4.0-f6efe76023-db94f1a182.zip/node_modules/debug/src/browser.js +// .yarn/__virtual__/debug-virtual-436baa457e/0/cache/debug-npm-4.4.3-0105c6123a-d79136ec6c.zip/node_modules/debug/src/browser.js var require_browser = __commonJS({ - ".yarn/__virtual__/debug-virtual-f48feae4da/0/cache/debug-npm-4.4.0-f6efe76023-db94f1a182.zip/node_modules/debug/src/browser.js"(exports2, module2) { + ".yarn/__virtual__/debug-virtual-436baa457e/0/cache/debug-npm-4.4.3-0105c6123a-d79136ec6c.zip/node_modules/debug/src/browser.js"(exports2, module2) { exports2.formatArgs = formatArgs; exports2.save = save; exports2.load = load; @@ -2647,7 +2689,7 @@ var require_browser = __commonJS({ function load() { let r; try { - r = exports2.storage.getItem("debug"); + r = exports2.storage.getItem("debug") || exports2.storage.getItem("DEBUG"); } catch (error) { } if (!r && typeof process !== "undefined" && "env" in process) { @@ -2673,7 +2715,7 @@ var require_browser = __commonJS({ } }); -// .yarn/cache/supports-color-npm-10.0.0-6cd1bb42a6-0e7884dfd0.zip/node_modules/supports-color/index.js +// .yarn/cache/supports-color-npm-10.2.2-e43ac15f9f-fb28dd7e0c.zip/node_modules/supports-color/index.js var supports_color_exports = {}; __export(supports_color_exports, { createSupportsColor: () => createSupportsColor, @@ -2767,11 +2809,17 @@ function _supportsColor(haveStream, { streamIsTTY, sniffFlags = true } = {}) { if (env.TERM === "xterm-kitty") { return 3; } + if (env.TERM === "xterm-ghostty") { + return 3; + } + if (env.TERM === "wezterm") { + return 3; + } if ("TERM_PROGRAM" in env) { - const version3 = Number.parseInt((env.TERM_PROGRAM_VERSION || "").split(".")[0], 10); + const version2 = Number.parseInt((env.TERM_PROGRAM_VERSION || "").split(".")[0], 10); switch (env.TERM_PROGRAM) { case "iTerm.app": { - return version3 >= 3 ? 3 : 2; + return version2 >= 3 ? 3 : 2; } case "Apple_Terminal": { return 2; @@ -2798,7 +2846,7 @@ function createSupportsColor(stream, options = {}) { } var import_node_process, import_node_os, import_node_tty, env, flagForceColor, supportsColor, supports_color_default; var init_supports_color = __esm({ - ".yarn/cache/supports-color-npm-10.0.0-6cd1bb42a6-0e7884dfd0.zip/node_modules/supports-color/index.js"() { + ".yarn/cache/supports-color-npm-10.2.2-e43ac15f9f-fb28dd7e0c.zip/node_modules/supports-color/index.js"() { import_node_process = __toESM(require("node:process"), 1); import_node_os = __toESM(require("node:os"), 1); import_node_tty = __toESM(require("node:tty"), 1); @@ -2816,9 +2864,9 @@ var init_supports_color = __esm({ } }); -// .yarn/__virtual__/debug-virtual-f48feae4da/0/cache/debug-npm-4.4.0-f6efe76023-db94f1a182.zip/node_modules/debug/src/node.js +// .yarn/__virtual__/debug-virtual-436baa457e/0/cache/debug-npm-4.4.3-0105c6123a-d79136ec6c.zip/node_modules/debug/src/node.js var require_node2 = __commonJS({ - ".yarn/__virtual__/debug-virtual-f48feae4da/0/cache/debug-npm-4.4.0-f6efe76023-db94f1a182.zip/node_modules/debug/src/node.js"(exports2, module2) { + ".yarn/__virtual__/debug-virtual-436baa457e/0/cache/debug-npm-4.4.3-0105c6123a-d79136ec6c.zip/node_modules/debug/src/node.js"(exports2, module2) { var tty2 = require("tty"); var util = require("util"); exports2.init = init; @@ -2990,9 +3038,9 @@ var require_node2 = __commonJS({ } }); -// .yarn/__virtual__/debug-virtual-f48feae4da/0/cache/debug-npm-4.4.0-f6efe76023-db94f1a182.zip/node_modules/debug/src/index.js +// .yarn/__virtual__/debug-virtual-436baa457e/0/cache/debug-npm-4.4.3-0105c6123a-d79136ec6c.zip/node_modules/debug/src/index.js var require_src = __commonJS({ - ".yarn/__virtual__/debug-virtual-f48feae4da/0/cache/debug-npm-4.4.0-f6efe76023-db94f1a182.zip/node_modules/debug/src/index.js"(exports2, module2) { + ".yarn/__virtual__/debug-virtual-436baa457e/0/cache/debug-npm-4.4.3-0105c6123a-d79136ec6c.zip/node_modules/debug/src/index.js"(exports2, module2) { if (typeof process === "undefined" || process.type === "renderer" || process.browser === true || process.__nwjs) { module2.exports = require_browser(); } else { @@ -3071,17 +3119,23 @@ var require_proxy_from_env = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/errors.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/errors.js var require_errors = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/errors.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/errors.js"(exports2, module2) { "use strict"; + var kUndiciError = Symbol.for("undici.error.UND_ERR"); var UndiciError = class extends Error { constructor(message) { super(message); this.name = "UndiciError"; this.code = "UND_ERR"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kUndiciError] === true; + } + [kUndiciError] = true; }; + var kConnectTimeoutError = Symbol.for("undici.error.UND_ERR_CONNECT_TIMEOUT"); var ConnectTimeoutError = class extends UndiciError { constructor(message) { super(message); @@ -3089,7 +3143,12 @@ var require_errors = __commonJS({ this.message = message || "Connect Timeout Error"; this.code = "UND_ERR_CONNECT_TIMEOUT"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kConnectTimeoutError] === true; + } + [kConnectTimeoutError] = true; }; + var kHeadersTimeoutError = Symbol.for("undici.error.UND_ERR_HEADERS_TIMEOUT"); var HeadersTimeoutError = class extends UndiciError { constructor(message) { super(message); @@ -3097,7 +3156,12 @@ var require_errors = __commonJS({ this.message = message || "Headers Timeout Error"; this.code = "UND_ERR_HEADERS_TIMEOUT"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kHeadersTimeoutError] === true; + } + [kHeadersTimeoutError] = true; }; + var kHeadersOverflowError = Symbol.for("undici.error.UND_ERR_HEADERS_OVERFLOW"); var HeadersOverflowError = class extends UndiciError { constructor(message) { super(message); @@ -3105,7 +3169,12 @@ var require_errors = __commonJS({ this.message = message || "Headers Overflow Error"; this.code = "UND_ERR_HEADERS_OVERFLOW"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kHeadersOverflowError] === true; + } + [kHeadersOverflowError] = true; }; + var kBodyTimeoutError = Symbol.for("undici.error.UND_ERR_BODY_TIMEOUT"); var BodyTimeoutError = class extends UndiciError { constructor(message) { super(message); @@ -3113,7 +3182,12 @@ var require_errors = __commonJS({ this.message = message || "Body Timeout Error"; this.code = "UND_ERR_BODY_TIMEOUT"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kBodyTimeoutError] === true; + } + [kBodyTimeoutError] = true; }; + var kResponseStatusCodeError = Symbol.for("undici.error.UND_ERR_RESPONSE_STATUS_CODE"); var ResponseStatusCodeError = class extends UndiciError { constructor(message, statusCode, headers, body) { super(message); @@ -3125,7 +3199,12 @@ var require_errors = __commonJS({ this.statusCode = statusCode; this.headers = headers; } + static [Symbol.hasInstance](instance) { + return instance && instance[kResponseStatusCodeError] === true; + } + [kResponseStatusCodeError] = true; }; + var kInvalidArgumentError = Symbol.for("undici.error.UND_ERR_INVALID_ARG"); var InvalidArgumentError = class extends UndiciError { constructor(message) { super(message); @@ -3133,7 +3212,12 @@ var require_errors = __commonJS({ this.message = message || "Invalid Argument Error"; this.code = "UND_ERR_INVALID_ARG"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kInvalidArgumentError] === true; + } + [kInvalidArgumentError] = true; }; + var kInvalidReturnValueError = Symbol.for("undici.error.UND_ERR_INVALID_RETURN_VALUE"); var InvalidReturnValueError = class extends UndiciError { constructor(message) { super(message); @@ -3141,14 +3225,25 @@ var require_errors = __commonJS({ this.message = message || "Invalid Return Value Error"; this.code = "UND_ERR_INVALID_RETURN_VALUE"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kInvalidReturnValueError] === true; + } + [kInvalidReturnValueError] = true; }; + var kAbortError = Symbol.for("undici.error.UND_ERR_ABORT"); var AbortError = class extends UndiciError { constructor(message) { super(message); this.name = "AbortError"; this.message = message || "The operation was aborted"; + this.code = "UND_ERR_ABORT"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kAbortError] === true; + } + [kAbortError] = true; }; + var kRequestAbortedError = Symbol.for("undici.error.UND_ERR_ABORTED"); var RequestAbortedError = class extends AbortError { constructor(message) { super(message); @@ -3156,7 +3251,12 @@ var require_errors = __commonJS({ this.message = message || "Request aborted"; this.code = "UND_ERR_ABORTED"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kRequestAbortedError] === true; + } + [kRequestAbortedError] = true; }; + var kInformationalError = Symbol.for("undici.error.UND_ERR_INFO"); var InformationalError = class extends UndiciError { constructor(message) { super(message); @@ -3164,7 +3264,12 @@ var require_errors = __commonJS({ this.message = message || "Request information"; this.code = "UND_ERR_INFO"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kInformationalError] === true; + } + [kInformationalError] = true; }; + var kRequestContentLengthMismatchError = Symbol.for("undici.error.UND_ERR_REQ_CONTENT_LENGTH_MISMATCH"); var RequestContentLengthMismatchError = class extends UndiciError { constructor(message) { super(message); @@ -3172,7 +3277,12 @@ var require_errors = __commonJS({ this.message = message || "Request body length does not match content-length header"; this.code = "UND_ERR_REQ_CONTENT_LENGTH_MISMATCH"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kRequestContentLengthMismatchError] === true; + } + [kRequestContentLengthMismatchError] = true; }; + var kResponseContentLengthMismatchError = Symbol.for("undici.error.UND_ERR_RES_CONTENT_LENGTH_MISMATCH"); var ResponseContentLengthMismatchError = class extends UndiciError { constructor(message) { super(message); @@ -3180,7 +3290,12 @@ var require_errors = __commonJS({ this.message = message || "Response body length does not match content-length header"; this.code = "UND_ERR_RES_CONTENT_LENGTH_MISMATCH"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kResponseContentLengthMismatchError] === true; + } + [kResponseContentLengthMismatchError] = true; }; + var kClientDestroyedError = Symbol.for("undici.error.UND_ERR_DESTROYED"); var ClientDestroyedError = class extends UndiciError { constructor(message) { super(message); @@ -3188,7 +3303,12 @@ var require_errors = __commonJS({ this.message = message || "The client is destroyed"; this.code = "UND_ERR_DESTROYED"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kClientDestroyedError] === true; + } + [kClientDestroyedError] = true; }; + var kClientClosedError = Symbol.for("undici.error.UND_ERR_CLOSED"); var ClientClosedError = class extends UndiciError { constructor(message) { super(message); @@ -3196,7 +3316,12 @@ var require_errors = __commonJS({ this.message = message || "The client is closed"; this.code = "UND_ERR_CLOSED"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kClientClosedError] === true; + } + [kClientClosedError] = true; }; + var kSocketError = Symbol.for("undici.error.UND_ERR_SOCKET"); var SocketError = class extends UndiciError { constructor(message, socket) { super(message); @@ -3205,7 +3330,12 @@ var require_errors = __commonJS({ this.code = "UND_ERR_SOCKET"; this.socket = socket; } + static [Symbol.hasInstance](instance) { + return instance && instance[kSocketError] === true; + } + [kSocketError] = true; }; + var kNotSupportedError = Symbol.for("undici.error.UND_ERR_NOT_SUPPORTED"); var NotSupportedError = class extends UndiciError { constructor(message) { super(message); @@ -3213,7 +3343,12 @@ var require_errors = __commonJS({ this.message = message || "Not supported error"; this.code = "UND_ERR_NOT_SUPPORTED"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kNotSupportedError] === true; + } + [kNotSupportedError] = true; }; + var kBalancedPoolMissingUpstreamError = Symbol.for("undici.error.UND_ERR_BPL_MISSING_UPSTREAM"); var BalancedPoolMissingUpstreamError = class extends UndiciError { constructor(message) { super(message); @@ -3221,7 +3356,12 @@ var require_errors = __commonJS({ this.message = message || "No upstream has been added to the BalancedPool"; this.code = "UND_ERR_BPL_MISSING_UPSTREAM"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kBalancedPoolMissingUpstreamError] === true; + } + [kBalancedPoolMissingUpstreamError] = true; }; + var kHTTPParserError = Symbol.for("undici.error.UND_ERR_HTTP_PARSER"); var HTTPParserError = class extends Error { constructor(message, code2, data) { super(message); @@ -3229,7 +3369,12 @@ var require_errors = __commonJS({ this.code = code2 ? `HPE_${code2}` : void 0; this.data = data ? data.toString() : void 0; } + static [Symbol.hasInstance](instance) { + return instance && instance[kHTTPParserError] === true; + } + [kHTTPParserError] = true; }; + var kResponseExceededMaxSizeError = Symbol.for("undici.error.UND_ERR_RES_EXCEEDED_MAX_SIZE"); var ResponseExceededMaxSizeError = class extends UndiciError { constructor(message) { super(message); @@ -3237,7 +3382,12 @@ var require_errors = __commonJS({ this.message = message || "Response content exceeded max size"; this.code = "UND_ERR_RES_EXCEEDED_MAX_SIZE"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kResponseExceededMaxSizeError] === true; + } + [kResponseExceededMaxSizeError] = true; }; + var kRequestRetryError = Symbol.for("undici.error.UND_ERR_REQ_RETRY"); var RequestRetryError = class extends UndiciError { constructor(message, code2, { headers, data }) { super(message); @@ -3248,7 +3398,12 @@ var require_errors = __commonJS({ this.data = data; this.headers = headers; } + static [Symbol.hasInstance](instance) { + return instance && instance[kRequestRetryError] === true; + } + [kRequestRetryError] = true; }; + var kResponseError = Symbol.for("undici.error.UND_ERR_RESPONSE"); var ResponseError = class extends UndiciError { constructor(message, code2, { headers, data }) { super(message); @@ -3259,7 +3414,12 @@ var require_errors = __commonJS({ this.data = data; this.headers = headers; } + static [Symbol.hasInstance](instance) { + return instance && instance[kResponseError] === true; + } + [kResponseError] = true; }; + var kSecureProxyConnectionError = Symbol.for("undici.error.UND_ERR_PRX_TLS"); var SecureProxyConnectionError = class extends UndiciError { constructor(cause, message, options) { super(message, { cause, ...options ?? {} }); @@ -3268,6 +3428,10 @@ var require_errors = __commonJS({ this.code = "UND_ERR_PRX_TLS"; this.cause = cause; } + static [Symbol.hasInstance](instance) { + return instance && instance[kSecureProxyConnectionError] === true; + } + [kSecureProxyConnectionError] = true; }; module2.exports = { AbortError, @@ -3297,9 +3461,9 @@ var require_errors = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/symbols.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/symbols.js var require_symbols = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/symbols.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/symbols.js"(exports2, module2) { module2.exports = { kClose: Symbol("close"), kDestroy: Symbol("destroy"), @@ -3370,9 +3534,9 @@ var require_symbols = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/constants.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/constants.js var require_constants2 = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/constants.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/constants.js"(exports2, module2) { "use strict"; var headerNameLowerCasedRecord = {}; var wellknownHeaderNames = [ @@ -3485,9 +3649,9 @@ var require_constants2 = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/tree.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/tree.js var require_tree = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/tree.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/tree.js"(exports2, module2) { "use strict"; var { wellknownHeaderNames, @@ -3625,9 +3789,9 @@ var require_tree = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/util.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/util.js var require_util = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/util.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/util.js"(exports2, module2) { "use strict"; var assert5 = require("node:assert"); var { kDestroyed, kBodyUsed, kListeners, kBody } = require_symbols(); @@ -4131,9 +4295,9 @@ var require_util = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/readable.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/readable.js var require_readable = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/readable.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/readable.js"(exports2, module2) { "use strict"; var assert5 = require("node:assert"); var { Readable: Readable2 } = require("node:stream"); @@ -4146,7 +4310,7 @@ var require_readable = __commonJS({ var kAbort = Symbol("kAbort"); var kContentType = Symbol("kContentType"); var kContentLength = Symbol("kContentLength"); - var noop2 = () => { + var noop3 = () => { }; var BodyReadable = class extends Readable2 { constructor({ @@ -4263,7 +4427,7 @@ var require_readable = __commonJS({ if (this._readableState.closeEmitted) { return null; } - return await new Promise((resolve2, reject) => { + return await new Promise((resolve, reject) => { if (this[kContentLength] > limit) { this.destroy(new AbortError()); } @@ -4276,9 +4440,9 @@ var require_readable = __commonJS({ if (signal?.aborted) { reject(signal.reason ?? new AbortError()); } else { - resolve2(null); + resolve(null); } - }).on("error", noop2).on("data", function(chunk) { + }).on("error", noop3).on("data", function(chunk) { limit -= chunk.length; if (limit <= 0) { this.destroy(); @@ -4295,7 +4459,7 @@ var require_readable = __commonJS({ } async function consume(stream, type) { assert5(!stream[kConsume]); - return new Promise((resolve2, reject) => { + return new Promise((resolve, reject) => { if (isUnusable(stream)) { const rState = stream._readableState; if (rState.destroyed && rState.closeEmitted === false) { @@ -4312,7 +4476,7 @@ var require_readable = __commonJS({ stream[kConsume] = { type, stream, - resolve: resolve2, + resolve, reject, length: 0, body: [] @@ -4382,18 +4546,18 @@ var require_readable = __commonJS({ return buffer; } function consumeEnd(consume2) { - const { type, body, resolve: resolve2, stream, length } = consume2; + const { type, body, resolve, stream, length } = consume2; try { if (type === "text") { - resolve2(chunksDecode(body, length)); + resolve(chunksDecode(body, length)); } else if (type === "json") { - resolve2(JSON.parse(chunksDecode(body, length))); + resolve(JSON.parse(chunksDecode(body, length))); } else if (type === "arrayBuffer") { - resolve2(chunksConcat(body, length).buffer); + resolve(chunksConcat(body, length).buffer); } else if (type === "blob") { - resolve2(new Blob(body, { type: stream[kContentType] })); + resolve(new Blob(body, { type: stream[kContentType] })); } else if (type === "bytes") { - resolve2(chunksConcat(body, length)); + resolve(chunksConcat(body, length)); } consumeFinish(consume2); } catch (err) { @@ -4424,9 +4588,9 @@ var require_readable = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/util.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/util.js var require_util2 = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/util.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/util.js"(exports2, module2) { var assert5 = require("node:assert"); var { ResponseStatusCodeError @@ -4485,9 +4649,9 @@ var require_util2 = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/api-request.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-request.js var require_api_request = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/api-request.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-request.js"(exports2, module2) { "use strict"; var assert5 = require("node:assert"); var { Readable: Readable2 } = require_readable(); @@ -4650,9 +4814,9 @@ var require_api_request = __commonJS({ }; function request(opts, callback) { if (callback === void 0) { - return new Promise((resolve2, reject) => { + return new Promise((resolve, reject) => { request.call(this, opts, (err, data) => { - return err ? reject(err) : resolve2(data); + return err ? reject(err) : resolve(data); }); }); } @@ -4671,9 +4835,9 @@ var require_api_request = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/abort-signal.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/abort-signal.js var require_abort_signal = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/abort-signal.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/abort-signal.js"(exports2, module2) { var { addAbortListener } = require_util(); var { RequestAbortedError } = require_errors(); var kListener = Symbol("kListener"); @@ -4722,9 +4886,9 @@ var require_abort_signal = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/api-stream.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-stream.js var require_api_stream = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/api-stream.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-stream.js"(exports2, module2) { "use strict"; var assert5 = require("node:assert"); var { finished, PassThrough } = require("node:stream"); @@ -4875,9 +5039,9 @@ var require_api_stream = __commonJS({ }; function stream(opts, factory, callback) { if (callback === void 0) { - return new Promise((resolve2, reject) => { + return new Promise((resolve, reject) => { stream.call(this, opts, factory, (err, data) => { - return err ? reject(err) : resolve2(data); + return err ? reject(err) : resolve(data); }); }); } @@ -4895,9 +5059,9 @@ var require_api_stream = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/api-pipeline.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-pipeline.js var require_api_pipeline = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/api-pipeline.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-pipeline.js"(exports2, module2) { "use strict"; var { Readable: Readable2, @@ -5095,9 +5259,9 @@ var require_api_pipeline = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/api-upgrade.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-upgrade.js var require_api_upgrade = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/api-upgrade.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-upgrade.js"(exports2, module2) { "use strict"; var { InvalidArgumentError, SocketError } = require_errors(); var { AsyncResource } = require("node:async_hooks"); @@ -5162,9 +5326,9 @@ var require_api_upgrade = __commonJS({ }; function upgrade(opts, callback) { if (callback === void 0) { - return new Promise((resolve2, reject) => { + return new Promise((resolve, reject) => { upgrade.call(this, opts, (err, data) => { - return err ? reject(err) : resolve2(data); + return err ? reject(err) : resolve(data); }); }); } @@ -5187,9 +5351,9 @@ var require_api_upgrade = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/api-connect.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-connect.js var require_api_connect = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/api-connect.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-connect.js"(exports2, module2) { "use strict"; var assert5 = require("node:assert"); var { AsyncResource } = require("node:async_hooks"); @@ -5256,9 +5420,9 @@ var require_api_connect = __commonJS({ }; function connect(opts, callback) { if (callback === void 0) { - return new Promise((resolve2, reject) => { + return new Promise((resolve, reject) => { connect.call(this, opts, (err, data) => { - return err ? reject(err) : resolve2(data); + return err ? reject(err) : resolve(data); }); }); } @@ -5277,9 +5441,9 @@ var require_api_connect = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/index.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/index.js var require_api = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/index.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/index.js"(exports2, module2) { "use strict"; module2.exports.request = require_api_request(); module2.exports.stream = require_api_stream(); @@ -5289,9 +5453,9 @@ var require_api = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/dispatcher.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/dispatcher.js var require_dispatcher = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/dispatcher.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/dispatcher.js"(exports2, module2) { "use strict"; var EventEmitter2 = require("node:events"); var Dispatcher = class extends EventEmitter2 { @@ -5344,9 +5508,9 @@ var require_dispatcher = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/dispatcher-base.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/dispatcher-base.js var require_dispatcher_base = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/dispatcher-base.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/dispatcher-base.js"(exports2, module2) { "use strict"; var Dispatcher = require_dispatcher(); var { @@ -5388,9 +5552,9 @@ var require_dispatcher_base = __commonJS({ } close(callback) { if (callback === void 0) { - return new Promise((resolve2, reject) => { + return new Promise((resolve, reject) => { this.close((err, data) => { - return err ? reject(err) : resolve2(data); + return err ? reject(err) : resolve(data); }); }); } @@ -5428,12 +5592,12 @@ var require_dispatcher_base = __commonJS({ err = null; } if (callback === void 0) { - return new Promise((resolve2, reject) => { + return new Promise((resolve, reject) => { this.destroy(err, (err2, data) => { return err2 ? ( /* istanbul ignore next: should never error */ reject(err2) - ) : resolve2(data); + ) : resolve(data); }); }); } @@ -5505,9 +5669,9 @@ var require_dispatcher_base = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/fixed-queue.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/fixed-queue.js var require_fixed_queue = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/fixed-queue.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/fixed-queue.js"(exports2, module2) { "use strict"; var kSize = 2048; var kMask = kSize - 1; @@ -5562,9 +5726,9 @@ var require_fixed_queue = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/pool-stats.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/pool-stats.js var require_pool_stats = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/pool-stats.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/pool-stats.js"(exports2, module2) { var { kFree, kConnected, kPending, kQueued, kRunning, kSize } = require_symbols(); var kPool = Symbol("pool"); var PoolStats = class { @@ -5594,9 +5758,9 @@ var require_pool_stats = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/pool-base.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/pool-base.js var require_pool_base = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/pool-base.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/pool-base.js"(exports2, module2) { "use strict"; var DispatcherBase = require_dispatcher_base(); var FixedQueue = require_fixed_queue(); @@ -5689,8 +5853,8 @@ var require_pool_base = __commonJS({ if (this[kQueue].isEmpty()) { await Promise.all(this[kClients].map((c) => c.close())); } else { - await new Promise((resolve2) => { - this[kClosedResolve] = resolve2; + await new Promise((resolve) => { + this[kClosedResolve] = resolve; }); } } @@ -5749,9 +5913,9 @@ var require_pool_base = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/diagnostics.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/diagnostics.js var require_diagnostics = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/diagnostics.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/diagnostics.js"(exports2, module2) { "use strict"; var diagnosticsChannel = require("node:diagnostics_channel"); var util = require("node:util"); @@ -5782,36 +5946,36 @@ var require_diagnostics = __commonJS({ const debuglog = fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog; diagnosticsChannel.channel("undici:client:beforeConnect").subscribe((evt) => { const { - connectParams: { version: version3, protocol, port, host } + connectParams: { version: version2, protocol, port, host } } = evt; debuglog( "connecting to %s using %s%s", `${host}${port ? `:${port}` : ""}`, protocol, - version3 + version2 ); }); diagnosticsChannel.channel("undici:client:connected").subscribe((evt) => { const { - connectParams: { version: version3, protocol, port, host } + connectParams: { version: version2, protocol, port, host } } = evt; debuglog( "connected to %s using %s%s", `${host}${port ? `:${port}` : ""}`, protocol, - version3 + version2 ); }); diagnosticsChannel.channel("undici:client:connectError").subscribe((evt) => { const { - connectParams: { version: version3, protocol, port, host }, + connectParams: { version: version2, protocol, port, host }, error } = evt; debuglog( "connection to %s using %s%s errored - %s", `${host}${port ? `:${port}` : ""}`, protocol, - version3, + version2, error.message ); }); @@ -5860,31 +6024,31 @@ var require_diagnostics = __commonJS({ const debuglog = undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog; diagnosticsChannel.channel("undici:client:beforeConnect").subscribe((evt) => { const { - connectParams: { version: version3, protocol, port, host } + connectParams: { version: version2, protocol, port, host } } = evt; debuglog( "connecting to %s%s using %s%s", host, port ? `:${port}` : "", protocol, - version3 + version2 ); }); diagnosticsChannel.channel("undici:client:connected").subscribe((evt) => { const { - connectParams: { version: version3, protocol, port, host } + connectParams: { version: version2, protocol, port, host } } = evt; debuglog( "connected to %s%s using %s%s", host, port ? `:${port}` : "", protocol, - version3 + version2 ); }); diagnosticsChannel.channel("undici:client:connectError").subscribe((evt) => { const { - connectParams: { version: version3, protocol, port, host }, + connectParams: { version: version2, protocol, port, host }, error } = evt; debuglog( @@ -5892,7 +6056,7 @@ var require_diagnostics = __commonJS({ host, port ? `:${port}` : "", protocol, - version3, + version2, error.message ); }); @@ -5934,9 +6098,9 @@ var require_diagnostics = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/request.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/request.js var require_request = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/request.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/request.js"(exports2, module2) { "use strict"; var { InvalidArgumentError, @@ -6258,9 +6422,9 @@ var require_request = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/util/timers.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/util/timers.js var require_timers = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/util/timers.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/util/timers.js"(exports2, module2) { "use strict"; var fastNow = 0; var RESOLUTION_MS = 1e3; @@ -6489,16 +6653,16 @@ var require_timers = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/connect.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/connect.js var require_connect = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/connect.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/connect.js"(exports2, module2) { "use strict"; var net = require("node:net"); var assert5 = require("node:assert"); var util = require_util(); var { InvalidArgumentError, ConnectTimeoutError } = require_errors(); var timers = require_timers(); - function noop2() { + function noop3() { } var tls; var SessionCache; @@ -6623,7 +6787,7 @@ var require_connect = __commonJS({ } var setupConnectTimeout = process.platform === "win32" ? (socketWeakRef, opts) => { if (!opts.timeout) { - return noop2; + return noop3; } let s1 = null; let s2 = null; @@ -6639,7 +6803,7 @@ var require_connect = __commonJS({ }; } : (socketWeakRef, opts) => { if (!opts.timeout) { - return noop2; + return noop3; } let s1 = null; const fastTimer = timers.setFastTimeout(() => { @@ -6669,9 +6833,9 @@ var require_connect = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/llhttp/utils.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/llhttp/utils.js var require_utils = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/llhttp/utils.js"(exports2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/llhttp/utils.js"(exports2) { "use strict"; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.enumToMap = void 0; @@ -6689,9 +6853,9 @@ var require_utils = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/llhttp/constants.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/llhttp/constants.js var require_constants3 = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/llhttp/constants.js"(exports2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/llhttp/constants.js"(exports2) { "use strict"; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.SPECIAL_HEADERS = exports2.HEADER_STATE = exports2.MINOR = exports2.MAJOR = exports2.CONNECTION_TOKEN_CHARS = exports2.HEADER_CHARS = exports2.TOKEN = exports2.STRICT_TOKEN = exports2.HEX = exports2.URL_CHAR = exports2.STRICT_URL_CHAR = exports2.USERINFO_CHARS = exports2.MARK = exports2.ALPHANUM = exports2.NUM = exports2.HEX_MAP = exports2.NUM_MAP = exports2.ALPHA = exports2.FINISH = exports2.H_METHOD_MAP = exports2.METHOD_MAP = exports2.METHODS_RTSP = exports2.METHODS_ICE = exports2.METHODS_HTTP = exports2.METHODS = exports2.LENIENT_FLAGS = exports2.FLAGS = exports2.TYPE = exports2.ERROR = void 0; @@ -7010,27 +7174,27 @@ var require_constants3 = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/llhttp/llhttp-wasm.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/llhttp/llhttp-wasm.js var require_llhttp_wasm = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/llhttp/llhttp-wasm.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/llhttp/llhttp-wasm.js"(exports2, module2) { "use strict"; var { Buffer: Buffer3 } = require("node:buffer"); module2.exports = Buffer3.from("AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAy0sBQYAAAIAAAAAAAACAQIAAgICAAADAAAAAAMDAwMBAQEBAQEBAQEAAAIAAAAEBQFwARISBQMBAAIGCAF/AUGA1AQLB9EFIgZtZW1vcnkCAAtfaW5pdGlhbGl6ZQAIGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAtsbGh0dHBfaW5pdAAJGGxsaHR0cF9zaG91bGRfa2VlcF9hbGl2ZQAvDGxsaHR0cF9hbGxvYwALBm1hbGxvYwAxC2xsaHR0cF9mcmVlAAwEZnJlZQAMD2xsaHR0cF9nZXRfdHlwZQANFWxsaHR0cF9nZXRfaHR0cF9tYWpvcgAOFWxsaHR0cF9nZXRfaHR0cF9taW5vcgAPEWxsaHR0cF9nZXRfbWV0aG9kABAWbGxodHRwX2dldF9zdGF0dXNfY29kZQAREmxsaHR0cF9nZXRfdXBncmFkZQASDGxsaHR0cF9yZXNldAATDmxsaHR0cF9leGVjdXRlABQUbGxodHRwX3NldHRpbmdzX2luaXQAFQ1sbGh0dHBfZmluaXNoABYMbGxodHRwX3BhdXNlABcNbGxodHRwX3Jlc3VtZQAYG2xsaHR0cF9yZXN1bWVfYWZ0ZXJfdXBncmFkZQAZEGxsaHR0cF9nZXRfZXJybm8AGhdsbGh0dHBfZ2V0X2Vycm9yX3JlYXNvbgAbF2xsaHR0cF9zZXRfZXJyb3JfcmVhc29uABwUbGxodHRwX2dldF9lcnJvcl9wb3MAHRFsbGh0dHBfZXJybm9fbmFtZQAeEmxsaHR0cF9tZXRob2RfbmFtZQAfEmxsaHR0cF9zdGF0dXNfbmFtZQAgGmxsaHR0cF9zZXRfbGVu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PgtBhwEMPQtBiAEMPAtBiQEMOwtBigEMOgtBiwEMOQtBjAEMOAtBjQEMNwtBjgEMNgtBjwEMNQtBkAEMNAtBkQEMMwtBkgEMMgtBkwEMMQtBlAEMMAtBlQEMLwtBlgEMLgtBlwEMLQtBmAEMLAtBmQEMKwtBmgEMKgtBmwEMKQtBnAEMKAtBnQEMJwtBngEMJgtBnwEMJQtBoAEMJAtBoQEMIwtBogEMIgtBowEMIQtBpAEMIAtBpQEMHwtBpgEMHgtBpwEMHQtBqAEMHAtBqQEMGwtBqgEMGgtBqwEMGQtBrAEMGAtBrQEMFwtBrgEMFgtBAQwVC0GvAQwUC0GwAQwTC0GxAQwSC0GzAQwRC0GyAQwQC0G0AQwPC0G1AQwOC0G2AQwNC0G3AQwMC0G4AQwLC0G5AQwKC0G6AQwJC0G7AQwIC0HGAQwHC0G8AQwGC0G9AQwFC0G+AQwEC0G/AQwDC0HAAQwCC0HCAQwBC0HBAQshAwNAAkACQAJAAkACQAJAAkACQAJAIAICfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAgJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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iQEhAwykAgtBASABLQAAQd8ARw1nGiABQQFqIQEMXgtBigEhAyABIARGDaICIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgNAIAEtAAAgAEGMzwBqLQAARw1kIABBAUYN+gEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMogILQYsBIQMgASAERg2hAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGOzwBqLQAARw1kIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyiAgsgAkEANgIAIAZBAWohAUECDGULQYwBIQMgASAERg2gAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHwzwBqLQAARw1jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyhAgsgAkEANgIAIAZBAWohAUEfDGQLQY0BIQMgASAERg2fAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHyzwBqLQAARw1iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAygAgsgAkEANgIAIAZBAWohAUEJDGMLIAEgBEYEQEGOASEDDJ8CCwJAAkAgAS0AAEHJAGsOBwBiYmJiYgFiCyABQQFqIQFB+AAhAwyGAgsgAUEBaiEBQfkAIQMMhQILQY8BIQMgASAERg2dAiACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGRzwBqLQAARw1gIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyeAgsgAkEANgIAIAZBAWohAUEYDGELQZABIQMgASAERg2cAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGXzwBqLQAARw1fIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAydAgsgAkEANgIAIAZBAWohAUEXDGALQZEBIQMgASAERg2bAiACKAIAIgAgBCABa2ohBSABIABrQQZqIQYCQANAIAEtAAAgAEGazwBqLQAARw1eIABBBkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAycAgsgAkEANgIAIAZBAWohAUEV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JSIARQ0RIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMtAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0gIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMswELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0iIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMsgELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0OIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMsQELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0dIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMsAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0fIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMrwELIABBP0cNASABQQFqCyEBQQUhAwyUAQtBACEDIAJBADYCHCACIAE2AhQgAkH9EjYCECACQQc2AgwMrAELIAJBADYCHCACIAE2AhQgAkHcCDYCECACQQc2AgxBACEDDKsBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNByACQeUANgIcIAIgATYCFCACIAA2AgxBACEDDKoBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNFiACQdMANgIcIAIgATYCFCACIAA2AgxBACEDDKkBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNGCACQdIANgIcIAIgATYCFCACIAA2AgxBACEDDKgBCyACQQA2AhwgAiABNgIUIAJBxgo2AhAgAkEHNgIMQQAhAwynAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQMgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwymAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRIgAkHTADYCHCACIAE2AhQgAiAANgIMQQAhAwylAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRQgAkHSADYCHCACIAE2AhQgAiAANgIMQQAhAwykAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQAgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwyjAQtB1QAhAwyJAQsgAEEVRwRAIAJBADYCHCACIAE2AhQgAkG5DTYCECACQRo2AgxB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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB5ABrDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0HhJw8LQaQhDwtByywPC0H+MQ8LQcAkDwtBqyQPC0GNKA8LQeImDwtBgDAPC0G5Lw8LQdckDwtB7x8PC0HhHw8LQfofDwtB8iAPC0GoLw8LQa4yDwtBiDAPC0HsJw8LQYIiDwtBjh0PC0HQLg8LQcojDwtBxTIPC0HfHA8LQdIcDwtBxCAPC0HXIA8LQaIfDwtB7S4PC0GrMA8LQdQlDwtBzC4PC0H6Lg8LQfwrDwtB0jAPC0HxHQ8LQbsgDwtB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CABB3AgLii1JbnZhbGlkIGNoYXIgaW4gdXJsIHF1ZXJ5AFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fYm9keQBDb250ZW50LUxlbmd0aCBvdmVyZmxvdwBDaHVuayBzaXplIG92ZXJmbG93AFJlc3BvbnNlIG92ZXJmbG93AEludmFsaWQgbWV0aG9kIGZvciBIVFRQL3gueCByZXF1ZXN0AEludmFsaWQgbWV0aG9kIGZvciBSVFNQL3gueCByZXF1ZXN0AEV4cGVjdGVkIFNPVVJDRSBtZXRob2QgZm9yIElDRS94LnggcmVxdWVzdABJbnZhbGlkIGNoYXIgaW4gdXJsIGZyYWdtZW50IHN0YXJ0AEV4cGVjdGVkIGRvdABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3N0YXR1cwBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zAFVzZXIgY2FsbGJhY2sgZXJyb3IAYG9uX3Jlc2V0YCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfaGVhZGVyYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9iZWdpbmAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3N0YXR1c19jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3ZlcnNpb25fY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl91cmxfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl92YWx1ZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXRob2RfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfZmllbGRfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fbmFtZWAgY2FsbGJhY2sgZXJyb3IAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzZXJ2ZXIASW52YWxpZCBoZWFkZXIgdmFsdWUgY2hhcgBJbnZhbGlkIGhlYWRlciBmaWVsZCBjaGFyAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fdmVyc2lvbgBJbnZhbGlkIG1pbm9yIHZlcnNpb24ASW52YWxpZCBtYWpvciB2ZXJzaW9uAEV4cGVjdGVkIHNwYWNlIGFmdGVyIHZlcnNpb24ARXhwZWN0ZWQgQ1JMRiBhZnRlciB2ZXJzaW9uAEludmFsaWQgSFRUUCB2ZXJzaW9uAEludmFsaWQgaGVhZGVyIHRva2VuAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fdXJsAEludmFsaWQgY2hhcmFjdGVycyBpbiB1cmwAVW5leHBlY3RlZCBzdGFydCBjaGFyIGluIHVybABEb3VibGUgQCBpbiB1cmwARW1wdHkgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyYWN0ZXIgaW4gQ29udGVudC1MZW5ndGgARHVwbGljYXRlIENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhciBpbiB1cmwgcGF0aABDb250ZW50LUxlbmd0aCBjYW4ndCBiZSBwcmVzZW50IHdpdGggVHJhbnNmZXItRW5jb2RpbmcASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgc2l6ZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2hlYWRlcl92YWx1ZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZSB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlZCB2YWx1ZQBQYXVzZWQgYnkgb25faGVhZGVyc19jb21wbGV0ZQBJbnZhbGlkIEVPRiBzdGF0ZQBvbl9yZXNldCBwYXVzZQBvbl9jaHVua19oZWFkZXIgcGF1c2UAb25fbWVzc2FnZV9iZWdpbiBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fdmFsdWUgcGF1c2UAb25fc3RhdHVzX2NvbXBsZXRlIHBhdXNlAG9uX3ZlcnNpb25fY29tcGxldGUgcGF1c2UAb25fdXJsX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl92YWx1ZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXNzYWdlX2NvbXBsZXRlIHBhdXNlAG9uX21ldGhvZF9jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfZmllbGRfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUgcGF1c2UAVW5leHBlY3RlZCBzcGFjZSBhZnRlciBzdGFydCBsaW5lAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBuYW1lAFBhdXNlIG9uIENPTk5FQ1QvVXBncmFkZQBQYXVzZSBvbiBQUkkvVXBncmFkZQBFeHBlY3RlZCBIVFRQLzIgQ29ubmVjdGlvbiBQcmVmYWNlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fbWV0aG9kAEV4cGVjdGVkIHNwYWNlIGFmdGVyIG1ldGhvZABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2hlYWRlcl9maWVsZABQYXVzZWQASW52YWxpZCB3b3JkIGVuY291bnRlcmVkAEludmFsaWQgbWV0aG9kIGVuY291bnRlcmVkAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2NoZW1hAFJlcXVlc3QgaGFzIGludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYABTV0lUQ0hfUFJPWFkAVVNFX1BST1hZAE1LQUNUSVZJVFkAVU5QUk9DRVNTQUJMRV9FTlRJVFkAQ09QWQBNT1ZFRF9QRVJNQU5FTlRMWQBUT09fRUFSTFkATk9USUZZAEZBSUxFRF9ERVBFTkRFTkNZAEJBRF9HQVRFV0FZAFBMQVkAUFVUAENIRUNLT1VUAEdBVEVXQVlfVElNRU9VVABSRVFVRVNUX1RJTUVPVVQATkVUV09SS19DT05ORUNUX1RJTUVPVVQAQ09OTkVDVElPTl9USU1FT1VUAExPR0lOX1RJTUVPVVQATkVUV09SS19SRUFEX1RJTUVPVVQAUE9TVABNSVNESVJFQ1RFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX0xPQURfQkFMQU5DRURfUkVRVUVTVABCQURfUkVRVUVTVABIVFRQX1JFUVVFU1RfU0VOVF9UT19IVFRQU19QT1JUAFJFUE9SVABJTV9BX1RFQVBPVABSRVNFVF9DT05URU5UAE5PX0NPTlRFTlQAUEFSVElBTF9DT05URU5UAEhQRV9JTlZBTElEX0NPTlNUQU5UAEhQRV9DQl9SRVNFVABHRVQASFBFX1NUUklDVABDT05GTElDVABURU1QT1JBUllfUkVESVJFQ1QAUEVSTUFORU5UX1JFRElSRUNUAENPTk5FQ1QATVVMVElfU1RBVFVTAEhQRV9JTlZBTElEX1NUQVRVUwBUT09fTUFOWV9SRVFVRVNUUwBFQVJMWV9ISU5UUwBVTkFWQUlMQUJMRV9GT1JfTEVHQUxfUkVBU09OUwBPUFRJT05TAFNXSVRDSElOR19QUk9UT0NPTFMAVkFSSUFOVF9BTFNPX05FR09USUFURVMATVVMVElQTEVfQ0hPSUNFUwBJTlRFUk5BTF9TRVJWRVJfRVJST1IAV0VCX1NFUlZFUl9VTktOT1dOX0VSUk9SAFJBSUxHVU5fRVJST1IASURFTlRJVFlfUFJPVklERVJfQVVUSEVOVElDQVRJT05fRVJST1IAU1NMX0NFUlRJRklDQVRFX0VSUk9SAElOVkFMSURfWF9GT1JXQVJERURfRk9SAFNFVF9QQVJBTUVURVIAR0VUX1BBUkFNRVRFUgBIUEVfVVNFUgBTRUVfT1RIRVIASFBFX0NCX0NIVU5LX0hFQURFUgBNS0NBTEVOREFSAFNFVFVQAFdFQl9TRVJWRVJfSVNfRE9XTgBURUFSRE9XTgBIUEVfQ0xPU0VEX0NPTk5FQ1RJT04ASEVVUklTVElDX0VYUElSQVRJT04ARElTQ09OTkVDVEVEX09QRVJBVElPTgBOT05fQVVUSE9SSVRBVElWRV9JTkZPUk1BVElPTgBIUEVfSU5WQUxJRF9WRVJTSU9OAEhQRV9DQl9NRVNTQUdFX0JFR0lOAFNJVEVfSVNfRlJPWkVOAEhQRV9JTlZBTElEX0hFQURFUl9UT0tFTgBJTlZBTElEX1RPS0VOAEZPUkJJRERFTgBFTkhBTkNFX1lPVVJfQ0FMTQBIUEVfSU5WQUxJRF9VUkwAQkxPQ0tFRF9CWV9QQVJFTlRBTF9DT05UUk9MAE1LQ09MAEFDTABIUEVfSU5URVJOQUwAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRV9VTk9GRklDSUFMAEhQRV9PSwBVTkxJTksAVU5MT0NLAFBSSQBSRVRSWV9XSVRIAEhQRV9JTlZBTElEX0NPTlRFTlRfTEVOR1RIAEhQRV9VTkVYUEVDVEVEX0NPTlRFTlRfTEVOR1RIAEZMVVNIAFBST1BQQVRDSABNLVNFQVJDSABVUklfVE9PX0xPTkcAUFJPQ0VTU0lORwBNSVNDRUxMQU5FT1VTX1BFUlNJU1RFTlRfV0FSTklORwBNSVNDRUxMQU5FT1VTX1dBUk5JTkcASFBFX0lOVkFMSURfVFJBTlNGRVJfRU5DT0RJTkcARXhwZWN0ZWQgQ1JMRgBIUEVfSU5WQUxJRF9DSFVOS19TSVpFAE1PVkUAQ09OVElOVUUASFBFX0NCX1NUQVRVU19DT01QTEVURQBIUEVfQ0JfSEVBREVSU19DT01QTEVURQBIUEVfQ0JfVkVSU0lPTl9DT01QTEVURQBIUEVfQ0JfVVJMX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19DT01QTEVURQBIUEVfQ0JfSEVBREVSX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9OQU1FX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAEhQRV9DQl9NRVRIT0RfQ09NUExFVEUASFBFX0NCX0hFQURFUl9GSUVMRF9DT01QTEVURQBERUxFVEUASFBFX0lOVkFMSURfRU9GX1NUQVRFAElOVkFMSURfU1NMX0NFUlRJRklDQVRFAFBBVVNFAE5PX1JFU1BPTlNFAFVOU1VQUE9SVEVEX01FRElBX1RZUEUAR09ORQBOT1RfQUNDRVBUQUJMRQBTRVJWSUNFX1VOQVZBSUxBQkxFAFJBTkdFX05PVF9TQVRJU0ZJQUJMRQBPUklHSU5fSVNfVU5SRUFDSEFCTEUAUkVTUE9OU0VfSVNfU1RBTEUAUFVSR0UATUVSR0UAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRQBSRVFVRVNUX0hFQURFUl9UT09fTEFSR0UAUEFZTE9BRF9UT09fTEFSR0UASU5TVUZGSUNJRU5UX1NUT1JBR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UASFBFX1VORVhQRUNURURfU1BBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABOT1RfRk9VTkQAUFJPUEZJTkQAVU5CSU5EAFJFQklORABVTkFVVEhPUklaRUQATUVUSE9EX05PVF9BTExPV0VEAEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEAEFMUkVBRFlfUkVQT1JURUQAQUNDRVBURUQATk9UX0lNUExFTUVOVEVEAExPT1BfREVURUNURUQASFBFX0NSX0VYUEVDVEVEAEhQRV9MRl9FWFBFQ1RFRABDUkVBVEVEAElNX1VTRUQASFBFX1BBVVNFRABUSU1FT1VUX09DQ1VSRUQAUEFZTUVOVF9SRVFVSVJFRABQUkVDT05ESVRJT05fUkVRVUlSRUQAUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRABMRU5HVEhfUkVRVUlSRUQAU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEAFVQR1JBREVfUkVRVUlSRUQAUEFHRV9FWFBJUkVEAFBSRUNPTkRJVElPTl9GQUlMRUQARVhQRUNUQVRJT05fRkFJTEVEAFJFVkFMSURBVElPTl9GQUlMRUQAU1NMX0hBTkRTSEFLRV9GQUlMRUQATE9DS0VEAFRSQU5TRk9STUFUSU9OX0FQUExJRUQATk9UX01PRElGSUVEAE5PVF9FWFRFTkRFRABCQU5EV0lEVEhfTElNSVRfRVhDRUVERUQAU0lURV9JU19PVkVSTE9BREVEAEhFQUQARXhwZWN0ZWQgSFRUUC8AAF4TAAAmEwAAMBAAAPAXAACdEwAAFRIAADkXAADwEgAAChAAAHUSAACtEgAAghMAAE8UAAB/EAAAoBUAACMUAACJEgAAixQAAE0VAADUEQAAzxQAABAYAADJFgAA3BYAAMERAADgFwAAuxQAAHQUAAB8FQAA5RQAAAgXAAAfEAAAZRUAAKMUAAAoFQAAAhUAAJkVAAAsEAAAixkAAE8PAADUDgAAahAAAM4QAAACFwAAiQ4AAG4TAAAcEwAAZhQAAFYXAADBEwAAzRMAAGwTAABoFwAAZhcAAF8XAAAiEwAAzg8AAGkOAADYDgAAYxYAAMsTAACqDgAAKBcAACYXAADFEwAAXRYAAOgRAABnEwAAZRMAAPIWAABzEwAAHRcAAPkWAADzEQAAzw4AAM4VAAAMEgAAsxEAAKURAABhEAAAMhcAALsTAEH5NQsBAQBBkDYL4AEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB/TcLAQEAQZE4C14CAwICAgICAAACAgACAgACAgICAgICAgICAAQAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAEH9OQsBAQBBkToLXgIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAQfA7Cw1sb3NlZWVwLWFsaXZlAEGJPAsBAQBBoDwL4AEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBiT4LAQEAQaA+C+cBAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAEGwwAALXwEBAAEBAQEBAAABAQABAQABAQEBAQEBAQEBAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAEGQwgALIWVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgBBwMIACy1yYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AQfnCAAsFAQIAAQMAQZDDAAvgAQQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAEH5xAALBQECAAEDAEGQxQAL4AEEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+cYACwQBAAABAEGRxwAL3wEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAEH6yAALBAEAAAIAQZDJAAtfAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAQfrKAAsEAQAAAQBBkMsACwEBAEGqywALQQIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEH6zAALBAEAAAEAQZDNAAsBAQBBms0ACwYCAAAAAAIAQbHNAAs6AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBB8M4AC5YBTk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRU9SRElSRUNUT1JUUkNIUEFSQU1FVEVSVVJDRUJTQ1JJQkVBUkRPV05BQ0VJTkROS0NLVUJTQ1JJQkVIVFRQL0FEVFAv", "base64"); } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js var require_llhttp_simd_wasm = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js"(exports2, module2) { "use strict"; var { Buffer: Buffer3 } = require("node:buffer"); module2.exports = Buffer3.from("AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAy0sBQYAAAIAAAAAAAACAQIAAgICAAADAAAAAAMDAwMBAQEBAQEBAQEAAAIAAAAEBQFwARISBQMBAAIGCAF/AUGA1AQLB9EFIgZtZW1vcnkCAAtfaW5pdGlhbGl6ZQAIGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAtsbGh0dHBfaW5pdAAJGGxsaHR0cF9zaG91bGRfa2VlcF9hbGl2ZQAvDGxsaHR0cF9hbGxvYwALBm1hbGxvYwAxC2xsaHR0cF9mcmVlAAwEZnJlZQAMD2xsaHR0cF9nZXRfdHlwZQANFWxsaHR0cF9nZXRfaHR0cF9tYWpvcgAOFWxsaHR0cF9nZXRfaHR0cF9taW5vcgAPEWxsaHR0cF9nZXRfbWV0aG9kABAWbGxodHRwX2dldF9zdGF0dXNfY29kZQAREmxsaHR0cF9nZXRfdXBncmFkZQASDGxsaHR0cF9yZXNldAATDmxsaHR0cF9leGVjdXRlABQUbGxodHRwX3NldHRpbmdzX2luaXQAFQ1sbGh0dHBfZmluaXNoABYMbGxodHRwX3BhdXNlABcNbGxodHRwX3Jlc3VtZQAYG2xsaHR0cF9yZXN1bWVfYWZ0ZXJfdXBncmFkZQAZEGxsaHR0cF9nZXRfZXJybm8AGhdsbGh0dHBfZ2V0X2Vycm9yX3JlYXNvbgAbF2xsaHR0cF9zZXRfZXJyb3JfcmVhc29uABwUbGxodHRwX2dldF9lcnJvcl9wb3MAHRFsbGh0dHBfZXJybm9fbmFtZQAeEmxsaHR0cF9tZXRob2RfbmFtZQAfEmxsaHR0cF9zdGF0dXNfbmFtZQAgGmxsaHR0cF9zZXRfbGVu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PgtBhwEMPQtBiAEMPAtBiQEMOwtBigEMOgtBiwEMOQtBjAEMOAtBjQEMNwtBjgEMNgtBjwEMNQtBkAEMNAtBkQEMMwtBkgEMMgtBkwEMMQtBlAEMMAtBlQEMLwtBlgEMLgtBlwEMLQtBmAEMLAtBmQEMKwtBmgEMKgtBmwEMKQtBnAEMKAtBnQEMJwtBngEMJgtBnwEMJQtBoAEMJAtBoQEMIwtBogEMIgtBowEMIQtBpAEMIAtBpQEMHwtBpgEMHgtBpwEMHQtBqAEMHAtBqQEMGwtBqgEMGgtBqwEMGQtBrAEMGAtBrQEMFwtBrgEMFgtBAQwVC0GvAQwUC0GwAQwTC0GxAQwSC0GzAQwRC0GyAQwQC0G0AQwPC0G1AQwOC0G2AQwNC0G3AQwMC0G4AQwLC0G5AQwKC0G6AQwJC0G7AQwIC0HGAQwHC0G8AQwGC0G9AQwFC0G+AQwEC0G/AQwDC0HAAQwCC0HCAQwBC0HBAQshAwNAAkACQAJAAkACQAJAAkACQAJAIAICfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAgJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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iQEhAwykAgtBASABLQAAQd8ARw1nGiABQQFqIQEMXgtBigEhAyABIARGDaICIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgNAIAEtAAAgAEGMzwBqLQAARw1kIABBAUYN+gEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMogILQYsBIQMgASAERg2hAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGOzwBqLQAARw1kIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyiAgsgAkEANgIAIAZBAWohAUECDGULQYwBIQMgASAERg2gAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHwzwBqLQAARw1jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyhAgsgAkEANgIAIAZBAWohAUEfDGQLQY0BIQMgASAERg2fAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHyzwBqLQAARw1iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAygAgsgAkEANgIAIAZBAWohAUEJDGMLIAEgBEYEQEGOASEDDJ8CCwJAAkAgAS0AAEHJAGsOBwBiYmJiYgFiCyABQQFqIQFB+AAhAwyGAgsgAUEBaiEBQfkAIQMMhQILQY8BIQMgASAERg2dAiACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGRzwBqLQAARw1gIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyeAgsgAkEANgIAIAZBAWohAUEYDGELQZABIQMgASAERg2cAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGXzwBqLQAARw1fIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAydAgsgAkEANgIAIAZBAWohAUEXDGALQZEBIQMgASAERg2bAiACKAIAIgAgBCABa2ohBSABIABrQQZqIQYCQANAIAEtAAAgAEGazwBqLQAARw1eIABBBkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAycAgsgAkEANgIAIAZBAWohAUEVDF8LQZIBIQMgASAERg2aAiACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGhzwBqLQAARw1dIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAybAgsgAkEANgIAIAZBAWohAUEeDF4LIAEgBEYEQEGTASEDDJoCCyABLQAAQcwARw1bIAFBAWohAUEKDF0LIAEgBEYEQEGUASEDDJkCCwJAAkAgAS0AAEHBAGsODwBcXFxcXFxcXFxcXFxcAVwLIAFBAWohAUH+ACEDDIACCyABQQFqIQFB/wAhAwz/AQsgASAERgRAQZUBIQMMmAILAkACQCABLQAAQcEAaw4DAFsBWwsgAUEBaiEBQf0AIQMM/wELIAFBAWohAUGAASEDDP4BC0GWASEDIAEgBEYNlgIgAigCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABBp88Aai0AAEcNWSAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMlwILIAJBADYCACAGQQFqIQFBCwxaCyABIARGBEBBlwEhAwyWAgsCQAJAAkACQCABLQAAQS1rDiMAW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1sBW1tbW1sCW1tbA1sLIAFBAWohAUH7ACEDDP8BCyABQQFqIQFB/AAhAwz+AQsgAUEBaiEBQYEBIQMM/QELIAFBAWohAUGCASEDDPwBC0GYASEDIAEgBEYNlAIgAigCACIAIAQgAWtqIQUgASAAa0EEaiEGAkADQCABLQAAIABBqc8Aai0AAEcNVyAAQQRGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMlQILIAJBADYCACAGQQFqIQFBGQxYC0GZASEDIAEgBEYNkwIgAigCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABBrs8Aai0AAEcNViAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMlAILIAJBADYCACAGQQFqIQFBBgxXC0GaASEDIAEgBEYNkgIgAigCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABBtM8Aai0AAEcNVSAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMkwILIAJBADYCACAGQQFqIQFBHAxWC0GbASEDIAEgBEYNkQIgAigCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABBts8Aai0AAEcNVCAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMkgILIAJBADYCACAGQQFqIQFBJwxVCyABIARGBEBBnAEhAwyRAgsCQAJAIAEtAABB1ABrDgIAAVQLIAFBAWohAUGGASEDDPgBCyABQQFqIQFBhwEhAwz3AQtBnQEhAyABIARGDY8CIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQbjPAGotAABHDVIgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAiAFNgIADJACCyACQQA2AgAgBkEBaiEBQSYMUwtBngEhAyABIARGDY4CIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQbrPAGotAABHDVEgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAiAFNgIADI8CCyACQQA2AgAgBkEBaiEBQQMMUgtBnwEhAyABIARGDY0CIAIoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQe3PAGotAABHDVAgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAiAFNgIADI4CCyACQQA2AgAgBkEBaiEBQQwMUQtBoAEhAyABIARGDYwCIAIoAgAiACAEIAFraiEFIAEgAGtBA2ohBgJAA0AgAS0AACAAQbzPAGotAABHDU8gAEEDRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAiAFNgIADI0CCyACQQA2AgAgBkEBaiEBQQ0MUAsgASAERgRAQaEBIQMMjAILAkACQCABLQAAQcYAaw4LAE9PT09PT09PTwFPCyABQQFqIQFBiwEhAwzzAQsgAUEBaiEBQYwBIQMM8gELIAEgBEYEQEGiASEDDIsCCyABLQAAQdAARw1MIAFBAWohAQxGCyABIARGBEBBowEhAwyKAgsCQAJAIAEtAABByQBrDgcBTU1NTU0ATQsgAUEBaiEBQY4BIQMM8QELIAFBAWohAUEiDE0LQaQBIQMgASAERg2IAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHAzwBqLQAARw1LIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyJAgsgAkEANgIAIAZBAWohAUEdDEwLIAEgBEYEQEGlASEDDIgCCwJAAkAgAS0AAEHSAGsOAwBLAUsLIAFBAWohAUGQASEDDO8BCyABQQFqIQFBBAxLCyABIARGBEBBpgEhAwyHAgsCQAJAAkACQAJAIAEtAABBwQBrDhUATU1NTU1NTU1NTQFNTQJNTQNNTQRNCyABQQFqIQFBiAEhAwzxAQsgAUEBaiEBQYkBIQMM8AELIAFBAWohAUGKASEDDO8BCyABQQFqIQFBjwEhAwzuAQsgAUEBaiEBQZEBIQMM7QELQacBIQMgASAERg2FAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEHtzwBqLQAARw1IIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyGAgsgAkEANgIAIAZBAWohAUERDEkLQagBIQMgASAERg2EAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEHCzwBqLQAARw1HIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyFAgsgAkEANgIAIAZBAWohAUEsDEgLQakBIQMgASAERg2DAiACKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANAIAEtAAAgAEHFzwBqLQAARw1GIABBBEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyEAgsgAkEANgIAIAZBAWohAUErDEcLQaoBIQMgASAERg2CAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEHKzwBqLQAARw1FIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyDAgsgAkEANgIAIAZBAWohAUEUDEYLIAEgBEYEQEGrASEDDIICCwJAAkACQAJAIAEtAABBwgBrDg8AAQJHR0dHR0dHR0dHRwNHCyABQQFqIQFBkwEhAwzrAQsgAUEBaiEBQZQBIQMM6gELIAFBAWohAUGVASEDDOkBCyABQQFqIQFBlgEhAwzoAQsgASAERgRAQawBIQMMgQILIAEtAABBxQBHDUIgAUEBaiEBDD0LQa0BIQMgASAERg3/ASACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEHNzwBqLQAARw1CIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyAAgsgAkEANgIAIAZBAWohAUEODEMLIAEgBEYEQEGuASEDDP8BCyABLQAAQdAARw1AIAFBAWohAUElDEILQa8BIQMgASAERg39ASACKAIAIgAgBCABa2ohBSABIABrQQhqIQYCQANAIAEtAAAgAEHQzwBqLQAARw1AIABBCEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAz+AQsgAkEANgIAIAZBAWohAUEqDEELIAEgBEYEQEGwASEDDP0BCwJAAkAgAS0AAEHVAGsOCwBAQEBAQEBAQEABQAsgAUEBaiEBQZoBIQMM5AELIAFBAWohAUGbASEDDOMBCyABIARGBEBBsQEhAwz8AQsCQAJAIAEtAABBwQBrDhQAPz8/Pz8/Pz8/Pz8/Pz8/Pz8/AT8LIAFBAWohAUGZASEDDOMBCyABQQFqIQFBnAEhAwziAQtBsgEhAyABIARGDfoBIAIoAgAiACAEIAFraiEFIAEgAGtBA2ohBgJAA0AgAS0AACAAQdnPAGotAABHDT0gAEEDRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAiAFNgIADPsBCyACQQA2AgAgBkEBaiEBQSEMPgtBswEhAyABIARGDfkBIAIoAgAiACAEIAFraiEFIAEgAGtBBmohBgJAA0AgAS0AACAAQd3PAGotAABHDTwgAEEGRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAiAFNgIADPoBCyACQQA2AgAgBkEBaiEBQRoMPQsgASAERgRAQbQBIQMM+QELAkACQAJAIAEtAABBxQBrDhEAPT09PT09PT09AT09PT09Aj0LIAFBAWohAUGdASEDDOEBCyABQQFqIQFBngEhAwzgAQsgAUEBaiEBQZ8BIQMM3wELQbUBIQMgASAERg33ASACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEHkzwBqLQAARw06IABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAz4AQsgAkEANgIAIAZBAWohAUEoDDsLQbYBIQMgASAERg32ASACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEHqzwBqLQAARw05IABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAz3AQsgAkEANgIAIAZBAWohAUEHDDoLIAEgBEYEQEG3ASEDDPYBCwJAAkAgAS0AAEHFAGsODgA5OTk5OTk5OTk5OTkBOQsgAUEBaiEBQaEBIQMM3QELIAFBAWohAUGiASEDDNwBC0G4ASEDIAEgBEYN9AEgAigCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABB7c8Aai0AAEcNNyAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAM9QELIAJBADYCACAGQQFqIQFBEgw4C0G5ASEDIAEgBEYN8wEgAigCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABB8M8Aai0AAEcNNiAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAM9AELIAJBADYCACAGQQFqIQFBIAw3C0G6ASEDIAEgBEYN8gEgAigCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABB8s8Aai0AAEcNNSAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAM8wELIAJBADYCACAGQQFqIQFBDww2CyABIARGBEBBuwEhAwzyAQsCQAJAIAEtAABByQBrDgcANTU1NTUBNQsgAUEBaiEBQaUBIQMM2QELIAFBAWohAUGmASEDDNgBC0G8ASEDIAEgBEYN8AEgAigCACIAIAQgAWtqIQUgASAAa0EHaiEGAkADQCABLQAAIABB9M8Aai0AAEcNMyAAQQdGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAM8QELIAJBADYCACAGQQFqIQFBGww0CyABIARGBEBBvQEhAwzwAQsCQAJAAkAgAS0AAEHCAGsOEgA0NDQ0NDQ0NDQBNDQ0NDQ0AjQLIAFBAWohAUGkASEDDNgBCyABQQFqIQFBpwEhAwzXAQsgAUEBaiEBQagBIQMM1gELIAEgBEYEQEG+ASEDDO8BCyABLQAAQc4ARw0wIAFBAWohAQwsCyABIARGBEBBvwEhAwzuAQsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABLQAAQcEAaw4VAAECAz8EBQY/Pz8HCAkKCz8MDQ4PPwsgAUEBaiEBQegAIQMM4wELIAFBAWohAUHpACEDDOIBCyABQQFqIQFB7gAhAwzhAQsgAUEBaiEBQfIAIQMM4AELIAFBAWohAUHzACEDDN8BCyABQQFqIQFB9gAhAwzeAQsgAUEBaiEBQfcAIQMM3QELIAFBAWohAUH6ACEDDNwBCyABQQFqIQFBgwEhAwzbAQsgAUEBaiEBQYQBIQMM2gELIAFBAWohAUGFASEDDNkBCyABQQFqIQFBkgEhAwzYAQsgAUEBaiEBQZgBIQMM1wELIAFBAWohAUGgASEDDNYBCyABQQFqIQFBowEhAwzVAQsgAUEBaiEBQaoBIQMM1AELIAEgBEcEQCACQRA2AgggAiABNgIEQasBIQMM1AELQcABIQMM7AELQQAhAAJAIAIoAjgiA0UNACADKAI0IgNFDQAgAiADEQAAIQALIABFDV4gAEEVRw0HIAJB0QA2AhwgAiABNgIUIAJBsBc2AhAgAkEVNgIMQQAhAwzrAQsgAUEBaiABIARHDQgaQcIBIQMM6gELA0ACQCABLQAAQQprDgQIAAALAAsgBCABQQFqIgFHDQALQcMBIQMM6QELIAEgBEcEQCACQRE2AgggAiABNgIEQQEhAwzQAQtBxAEhAwzoAQsgASAERgRAQcUBIQMM6AELAkACQCABLQAAQQprDgQBKCgAKAsgAUEBagwJCyABQQFqDAULIAEgBEYEQEHGASEDDOcBCwJAAkAgAS0AAEEKaw4XAQsLAQsLCwsLCwsLCwsLCwsLCwsLCwALCyABQQFqIQELQbABIQMMzQELIAEgBEYEQEHIASEDDOYBCyABLQAAQSBHDQkgAkEAOwEyIAFBAWohAUGzASEDDMwBCwNAIAEhAAJAIAEgBEcEQCABLQAAQTBrQf8BcSIDQQpJDQEMJwtBxwEhAwzmAQsCQCACLwEyIgFBmTNLDQAgAiABQQpsIgU7ATIgBUH+/wNxIANB//8Dc0sNACAAQQFqIQEgAiADIAVqIgM7ATIgA0H//wNxQegHSQ0BCwtBACEDIAJBADYCHCACQcEJNgIQIAJBDTYCDCACIABBAWo2AhQM5AELIAJBADYCHCACIAE2AhQgAkHwDDYCECACQRs2AgxBACEDDOMBCyACKAIEIQAgAkEANgIEIAIgACABECYiAA0BIAFBAWoLIQFBrQEhAwzIAQsgAkHBATYCHCACIAA2AgwgAiABQQFqNgIUQQAhAwzgAQsgAigCBCEAIAJBADYCBCACIAAgARAmIgANASABQQFqCyEBQa4BIQMMxQELIAJBwgE2AhwgAiAANgIMIAIgAUEBajYCFEEAIQMM3QELIAJBADYCHCACIAE2AhQgAkGXCzYCECACQQ02AgxBACEDDNwBCyACQQA2AhwgAiABNgIUIAJB4xA2AhAgAkEJNgIMQQAhAwzbAQsgAkECOgAoDKwBC0EAIQMgAkEANgIcIAJBrws2AhAgAkECNgIMIAIgAUEBajYCFAzZAQtBAiEDDL8BC0ENIQMMvgELQSYhAwy9AQtBFSEDDLwBC0EWIQMMuwELQRghAwy6AQtBHCEDDLkBC0EdIQMMuAELQSAhAwy3AQtBISEDDLYBC0EjIQMMtQELQcYAIQMMtAELQS4hAwyzAQtBPSEDDLIBC0HLACEDDLEBC0HOACEDDLABC0HYACEDDK8BC0HZACEDDK4BC0HbACEDDK0BC0HxACEDDKwBC0H0ACEDDKsBC0GNASEDDKoBC0GXASEDDKkBC0GpASEDDKgBC0GvASEDDKcBC0GxASEDDKYBCyACQQA2AgALQQAhAyACQQA2AhwgAiABNgIUIAJB8Rs2AhAgAkEGNgIMDL0BCyACQQA2AgAgBkEBaiEBQSQLOgApIAIoAgQhACACQQA2AgQgAiAAIAEQJyIARQRAQeUAIQMMowELIAJB+QA2AhwgAiABNgIUIAIgADYCDEEAIQMMuwELIABBFUcEQCACQQA2AhwgAiABNgIUIAJBzA42AhAgAkEgNgIMQQAhAwy7AQsgAkH4ADYCHCACIAE2AhQgAkHKGDYCECACQRU2AgxBACEDDLoBCyACQQA2AhwgAiABNgIUIAJBjhs2AhAgAkEGNgIMQQAhAwy5AQsgAkEANgIcIAIgATYCFCACQf4RNgIQIAJBBzYCDEEAIQMMuAELIAJBADYCHCACIAE2AhQgAkGMHDYCECACQQc2AgxBACEDDLcBCyACQQA2AhwgAiABNgIUIAJBww82AhAgAkEHNgIMQQAhAwy2AQsgAkEANgIcIAIgATYCFCACQcMPNgIQIAJBBzYCDEEAIQMMtQELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0RIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMtAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0gIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMswELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0iIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMsgELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0OIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMsQELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0dIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMsAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0fIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMrwELIABBP0cNASABQQFqCyEBQQUhAwyUAQtBACEDIAJBADYCHCACIAE2AhQgAkH9EjYCECACQQc2AgwMrAELIAJBADYCHCACIAE2AhQgAkHcCDYCECACQQc2AgxBACEDDKsBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNByACQeUANgIcIAIgATYCFCACIAA2AgxBACEDDKoBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNFiACQdMANgIcIAIgATYCFCACIAA2AgxBACEDDKkBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNGCACQdIANgIcIAIgATYCFCACIAA2AgxBACEDDKgBCyACQQA2AhwgAiABNgIUIAJBxgo2AhAgAkEHNgIMQQAhAwynAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQMgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwymAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRIgAkHTADYCHCACIAE2AhQgAiAANgIMQQAhAwylAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRQgAkHSADYCHCACIAE2AhQgAiAANgIMQQAhAwykAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQAgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwyjAQtB1QAhAwyJAQsgAEEVRwRAIAJBADYCHCACIAE2AhQgAkG5DTYCECACQRo2AgxB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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB5ABrDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0HhJw8LQaQhDwtByywPC0H+MQ8LQcAkDwtBqyQPC0GNKA8LQeImDwtBgDAPC0G5Lw8LQdckDwtB7x8PC0HhHw8LQfofDwtB8iAPC0GoLw8LQa4yDwtBiDAPC0HsJw8LQYIiDwtBjh0PC0HQLg8LQcojDwtBxTIPC0HfHA8LQdIcDwtBxCAPC0HXIA8LQaIfDwtB7S4PC0GrMA8LQdQlDwtBzC4PC0H6Lg8LQfwrDwtB0jAPC0HxHQ8LQbsgDwtB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AAADAEGUCAsFBAAAAAUAQaQICwkGAAAABwAAAAgAQdwIC4otSW52YWxpZCBjaGFyIGluIHVybCBxdWVyeQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2JvZHkAQ29udGVudC1MZW5ndGggb3ZlcmZsb3cAQ2h1bmsgc2l6ZSBvdmVyZmxvdwBSZXNwb25zZSBvdmVyZmxvdwBJbnZhbGlkIG1ldGhvZCBmb3IgSFRUUC94LnggcmVxdWVzdABJbnZhbGlkIG1ldGhvZCBmb3IgUlRTUC94LnggcmVxdWVzdABFeHBlY3RlZCBTT1VSQ0UgbWV0aG9kIGZvciBJQ0UveC54IHJlcXVlc3QASW52YWxpZCBjaGFyIGluIHVybCBmcmFnbWVudCBzdGFydABFeHBlY3RlZCBkb3QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9zdGF0dXMASW52YWxpZCByZXNwb25zZSBzdGF0dXMASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucwBVc2VyIGNhbGxiYWNrIGVycm9yAGBvbl9yZXNldGAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2hlYWRlcmAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfYmVnaW5gIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwBB+TULAQEAQZA2C+ABAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQf03CwEBAEGROAteAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgBB/TkLAQEAQZE6C14CAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAEHwOwsNbG9zZWVlcC1hbGl2ZQBBiTwLAQEAQaA8C+ABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQYk+CwEBAEGgPgvnAQEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZABBsMAAC18BAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQBBkMIACyFlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AQcDCAAstcmFuc2Zlci1lbmNvZGluZ3BncmFkZQ0KDQoNClNNDQoNClRUUC9DRS9UU1AvAEH5wgALBQECAAEDAEGQwwAL4AEEAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+cQACwUBAgABAwBBkMUAC+ABBAEBBQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQfnGAAsEAQAAAQBBkccAC98BAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+sgACwQBAAACAEGQyQALXwMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAEH6ygALBAEAAAEAQZDLAAsBAQBBqssAC0ECAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBB+swACwQBAAABAEGQzQALAQEAQZrNAAsGAgAAAAACAEGxzQALOgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQfDOAAuWAU5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw==", "base64"); } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/constants.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/constants.js var require_constants4 = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/constants.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/constants.js"(exports2, module2) { "use strict"; var corsSafeListedMethods = ( /** @type {const} */ @@ -7246,9 +7410,9 @@ var require_constants4 = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/global.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/global.js var require_global = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/global.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/global.js"(exports2, module2) { "use strict"; var globalOrigin = Symbol.for("undici.globalOrigin.1"); function getGlobalOrigin() { @@ -7282,9 +7446,9 @@ var require_global = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/data-url.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/data-url.js var require_data_url = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/data-url.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/data-url.js"(exports2, module2) { "use strict"; var assert5 = require("node:assert"); var encoder = new TextEncoder(); @@ -7634,9 +7798,9 @@ var require_data_url = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/webidl.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/webidl.js var require_webidl = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/webidl.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/webidl.js"(exports2, module2) { "use strict"; var { types, inspect } = require("node:util"); var { markAsUncloneable } = require("node:worker_threads"); @@ -7839,8 +8003,8 @@ var require_webidl = __commonJS({ } const keys = Reflect.ownKeys(O); for (const key of keys) { - const desc = Reflect.getOwnPropertyDescriptor(O, key); - if (desc?.enumerable) { + const desc2 = Reflect.getOwnPropertyDescriptor(O, key); + if (desc2?.enumerable) { const typedKey = keyConverter(key, prefix, argument); const typedValue = valueConverter(O[key], prefix, argument); result[typedKey] = typedValue; @@ -8053,9 +8217,9 @@ var require_webidl = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/util.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/util.js var require_util3 = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/util.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/util.js"(exports2, module2) { "use strict"; var { Transform } = require("node:stream"); var zlib = require("node:zlib"); @@ -8453,8 +8617,8 @@ var require_util3 = __commonJS({ function createDeferredPromise() { let res; let rej; - const promise = new Promise((resolve2, reject) => { - res = resolve2; + const promise = new Promise((resolve, reject) => { + res = resolve; rej = reject; }); return { promise, resolve: res, reject: rej }; @@ -8923,9 +9087,9 @@ var require_util3 = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/symbols.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/symbols.js var require_symbols2 = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/symbols.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/symbols.js"(exports2, module2) { "use strict"; module2.exports = { kUrl: Symbol("url"), @@ -8937,9 +9101,9 @@ var require_symbols2 = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/file.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/file.js var require_file = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/file.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/file.js"(exports2, module2) { "use strict"; var { Blob: Blob2, File } = require("node:buffer"); var { kState } = require_symbols2(); @@ -9000,9 +9164,9 @@ var require_file = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/formdata.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/formdata.js var require_formdata = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/formdata.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/formdata.js"(exports2, module2) { "use strict"; var { isBlobLike, iteratorMixin } = require_util3(); var { kState } = require_symbols2(); @@ -9147,9 +9311,9 @@ var require_formdata = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/formdata-parser.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/formdata-parser.js var require_formdata_parser = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/formdata-parser.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/formdata-parser.js"(exports2, module2) { "use strict"; var { isUSVString, bufferToLowerCasedHeaderName } = require_util(); var { utf8DecodeBytes } = require_util3(); @@ -9398,9 +9562,9 @@ var require_formdata_parser = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/body.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/body.js var require_body = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/body.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/body.js"(exports2, module2) { "use strict"; var util = require_util(); var { @@ -9430,7 +9594,7 @@ var require_body = __commonJS({ random = (max) => Math.floor(Math.random(max)); } var textEncoder = new TextEncoder(); - function noop2() { + function noop3() { } var hasFinalizationRegistry = globalThis.FinalizationRegistry && process.version.indexOf("v18") !== 0; var streamRegistry; @@ -9438,7 +9602,7 @@ var require_body = __commonJS({ streamRegistry = new FinalizationRegistry((weakRef) => { const stream = weakRef.deref(); if (stream && !stream.locked && !isDisturbed(stream) && !isErrored(stream)) { - stream.cancel("Response object has been garbage collected").catch(noop2); + stream.cancel("Response object has been garbage collected").catch(noop3); } }); } @@ -9508,7 +9672,8 @@ Content-Type: ${value.type || "application/octet-stream"}\r } } } - const chunk = textEncoder.encode(`--${boundary}--`); + const chunk = textEncoder.encode(`--${boundary}--\r +`); blobParts.push(chunk); length += chunk.byteLength; if (hasUnknownSizeValue) { @@ -9586,9 +9751,6 @@ Content-Type: ${value.type || "application/octet-stream"}\r } function cloneBody(instance, body) { const [out1, out2] = body.stream.tee(); - if (hasFinalizationRegistry) { - streamRegistry.register(instance, new WeakRef(out1)); - } body.stream = out1; return { stream: out2, @@ -9714,9 +9876,9 @@ Content-Type: ${value.type || "application/octet-stream"}\r } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/client-h1.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/client-h1.js var require_client_h1 = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/client-h1.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/client-h1.js"(exports2, module2) { "use strict"; var assert5 = require("node:assert"); var util = require_util(); @@ -10597,12 +10759,12 @@ upgrade: ${upgrade}\r cb(); } } - const waitForDrain = () => new Promise((resolve2, reject) => { + const waitForDrain = () => new Promise((resolve, reject) => { assert5(callback === null); if (socket[kError]) { reject(socket[kError]); } else { - callback = resolve2; + callback = resolve; } }); socket.on("close", onDrain).on("drain", onDrain); @@ -10734,9 +10896,9 @@ ${len.toString(16)}\r } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/client-h2.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/client-h2.js var require_client_h2 = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/client-h2.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/client-h2.js"(exports2, module2) { "use strict"; var assert5 = require("node:assert"); var { pipeline } = require("node:stream"); @@ -11239,12 +11401,12 @@ var require_client_h2 = __commonJS({ cb(); } } - const waitForDrain = () => new Promise((resolve2, reject) => { + const waitForDrain = () => new Promise((resolve, reject) => { assert5(callback === null); if (socket[kError]) { reject(socket[kError]); } else { - callback = resolve2; + callback = resolve; } }); h2stream.on("close", onDrain).on("drain", onDrain); @@ -11275,9 +11437,9 @@ var require_client_h2 = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/handler/redirect-handler.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/handler/redirect-handler.js var require_redirect_handler = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/handler/redirect-handler.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/handler/redirect-handler.js"(exports2, module2) { "use strict"; var util = require_util(); var { kBodyUsed } = require_symbols(); @@ -11434,9 +11596,9 @@ var require_redirect_handler = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/interceptor/redirect-interceptor.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/interceptor/redirect-interceptor.js var require_redirect_interceptor = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/interceptor/redirect-interceptor.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/interceptor/redirect-interceptor.js"(exports2, module2) { "use strict"; var RedirectHandler = require_redirect_handler(); function createRedirectInterceptor({ maxRedirections: defaultMaxRedirections }) { @@ -11456,9 +11618,9 @@ var require_redirect_interceptor = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/client.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/client.js var require_client = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/client.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/client.js"(exports2, module2) { "use strict"; var assert5 = require("node:assert"); var net = require("node:net"); @@ -11519,7 +11681,7 @@ var require_client = __commonJS({ var connectH2 = require_client_h2(); var deprecatedInterceptorWarned = false; var kClosedResolve = Symbol("kClosedResolve"); - var noop2 = () => { + var noop3 = () => { }; function getPipelining(client) { return client[kPipelining] ?? client[kHTTPContext]?.defaultPipelining ?? 1; @@ -11721,16 +11883,16 @@ var require_client = __commonJS({ return this[kNeedDrain] < 2; } async [kClose]() { - return new Promise((resolve2) => { + return new Promise((resolve) => { if (this[kSize]) { - this[kClosedResolve] = resolve2; + this[kClosedResolve] = resolve; } else { - resolve2(null); + resolve(null); } }); } async [kDestroy](err) { - return new Promise((resolve2) => { + return new Promise((resolve) => { const requests = this[kQueue].splice(this[kPendingIdx]); for (let i = 0; i < requests.length; i++) { const request = requests[i]; @@ -11741,7 +11903,7 @@ var require_client = __commonJS({ this[kClosedResolve](); this[kClosedResolve] = null; } - resolve2(null); + resolve(null); }; if (this[kHTTPContext]) { this[kHTTPContext].destroy(err, callback); @@ -11792,7 +11954,7 @@ var require_client = __commonJS({ }); } try { - const socket = await new Promise((resolve2, reject) => { + const socket = await new Promise((resolve, reject) => { client[kConnector]({ host, hostname, @@ -11804,19 +11966,19 @@ var require_client = __commonJS({ if (err) { reject(err); } else { - resolve2(socket2); + resolve(socket2); } }); }); if (client.destroyed) { - util.destroy(socket.on("error", noop2), new ClientDestroyedError()); + util.destroy(socket.on("error", noop3), new ClientDestroyedError()); return; } assert5(socket); try { client[kHTTPContext] = socket.alpnProtocol === "h2" ? await connectH2(client, socket) : await connectH1(client, socket); } catch (err) { - socket.destroy().on("error", noop2); + socket.destroy().on("error", noop3); throw err; } client[kConnecting] = false; @@ -11956,9 +12118,9 @@ var require_client = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/pool.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/pool.js var require_pool = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/pool.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/pool.js"(exports2, module2) { "use strict"; var { PoolBase, @@ -12021,6 +12183,14 @@ var require_pool = __commonJS({ this[kOptions] = { ...util.deepClone(options), connect, allowH2 }; this[kOptions].interceptors = options.interceptors ? { ...options.interceptors } : void 0; this[kFactory] = factory; + this.on("connectionError", (origin2, targets, error) => { + for (const target of targets) { + const idx = this[kClients].indexOf(target); + if (idx !== -1) { + this[kClients].splice(idx, 1); + } + } + }); } [kGetDispatcher]() { for (const client of this[kClients]) { @@ -12039,9 +12209,9 @@ var require_pool = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/agent.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/agent.js var require_agent = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/agent.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/agent.js"(exports2, module2) { "use strict"; var { InvalidArgumentError } = require_errors(); var { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = require_symbols(); @@ -12136,30 +12306,83 @@ var require_agent = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/proxy-agent.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/proxy-agent.js var require_proxy_agent = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/proxy-agent.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/proxy-agent.js"(exports2, module2) { "use strict"; - var { kProxy, kClose, kDestroy, kInterceptors } = require_symbols(); + var { kProxy, kClose, kDestroy, kDispatch, kInterceptors } = require_symbols(); var { URL: URL2 } = require("node:url"); var Agent = require_agent(); var Pool = require_pool(); var DispatcherBase = require_dispatcher_base(); var { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError } = require_errors(); var buildConnector = require_connect(); + var Client = require_client(); var kAgent = Symbol("proxy agent"); var kClient = Symbol("proxy client"); var kProxyHeaders = Symbol("proxy headers"); var kRequestTls = Symbol("request tls settings"); var kProxyTls = Symbol("proxy tls settings"); var kConnectEndpoint = Symbol("connect endpoint function"); + var kTunnelProxy = Symbol("tunnel proxy"); function defaultProtocolPort(protocol) { return protocol === "https:" ? 443 : 80; } function defaultFactory(origin, opts) { return new Pool(origin, opts); } - var noop2 = () => { + var noop3 = () => { + }; + function defaultAgentFactory(origin, opts) { + if (opts.connections === 1) { + return new Client(origin, opts); + } + return new Pool(origin, opts); + } + var Http1ProxyWrapper = class extends DispatcherBase { + #client; + constructor(proxyUrl, { headers = {}, connect, factory }) { + super(); + if (!proxyUrl) { + throw new InvalidArgumentError("Proxy URL is mandatory"); + } + this[kProxyHeaders] = headers; + if (factory) { + this.#client = factory(proxyUrl, { connect }); + } else { + this.#client = new Client(proxyUrl, { connect }); + } + } + [kDispatch](opts, handler) { + const onHeaders = handler.onHeaders; + handler.onHeaders = function(statusCode, data, resume) { + if (statusCode === 407) { + if (typeof handler.onError === "function") { + handler.onError(new InvalidArgumentError("Proxy Authentication Required (407)")); + } + return; + } + if (onHeaders) onHeaders.call(this, statusCode, data, resume); + }; + const { + origin, + path: path16 = "/", + headers = {} + } = opts; + opts.path = origin + path16; + if (!("host" in headers) && !("Host" in headers)) { + const { host } = new URL2(origin); + headers.host = host; + } + opts.headers = { ...this[kProxyHeaders], ...headers }; + return this.#client[kDispatch](opts, handler); + } + async [kClose]() { + return this.#client.close(); + } + async [kDestroy](err) { + return this.#client.destroy(err); + } }; var ProxyAgent2 = class extends DispatcherBase { constructor(opts) { @@ -12171,6 +12394,7 @@ var require_proxy_agent = __commonJS({ if (typeof clientFactory !== "function") { throw new InvalidArgumentError("Proxy opts.clientFactory must be a function."); } + const { proxyTunnel = true } = opts; const url = this.#getUrl(opts); const { href, origin, port, protocol, username, password, hostname: proxyHostname } = url; this[kProxy] = { uri: href, protocol }; @@ -12178,6 +12402,7 @@ var require_proxy_agent = __commonJS({ this[kRequestTls] = opts.requestTls; this[kProxyTls] = opts.proxyTls; this[kProxyHeaders] = opts.headers || {}; + this[kTunnelProxy] = proxyTunnel; if (opts.auth && opts.token) { throw new InvalidArgumentError("opts.auth cannot be used in combination with opts.token"); } else if (opts.auth) { @@ -12189,9 +12414,22 @@ var require_proxy_agent = __commonJS({ } const connect = buildConnector({ ...opts.proxyTls }); this[kConnectEndpoint] = buildConnector({ ...opts.requestTls }); + const agentFactory = opts.factory || defaultAgentFactory; + const factory = (origin2, options) => { + const { protocol: protocol2 } = new URL2(origin2); + if (!this[kTunnelProxy] && protocol2 === "http:" && this[kProxy].protocol === "http:") { + return new Http1ProxyWrapper(this[kProxy].uri, { + headers: this[kProxyHeaders], + connect, + factory: agentFactory + }); + } + return agentFactory(origin2, options); + }; this[kClient] = clientFactory(url, { connect }); this[kAgent] = new Agent({ ...opts, + factory, connect: async (opts2, callback) => { let requestedPath = opts2.host; if (!opts2.port) { @@ -12210,7 +12448,7 @@ var require_proxy_agent = __commonJS({ servername: this[kProxyTls]?.servername || proxyHostname }); if (statusCode !== 200) { - socket.on("error", noop2).destroy(); + socket.on("error", noop3).destroy(); callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`)); } if (opts2.protocol !== "https:") { @@ -13023,10 +13261,10 @@ var init_esm = __esm({ * Return a void Promise that resolves once the stream ends. */ async promise() { - return new Promise((resolve2, reject) => { + return new Promise((resolve, reject) => { this.on(DESTROYED, () => reject(new Error("stream destroyed"))); this.on("error", (er) => reject(er)); - this.on("end", () => resolve2()); + this.on("end", () => resolve()); }); } /** @@ -13050,7 +13288,7 @@ var init_esm = __esm({ return Promise.resolve({ done: false, value: res }); if (this[EOF]) return stop(); - let resolve2; + let resolve; let reject; const onerr = (er) => { this.off("data", ondata); @@ -13064,19 +13302,19 @@ var init_esm = __esm({ this.off("end", onend); this.off(DESTROYED, ondestroy); this.pause(); - resolve2({ value, done: !!this[EOF] }); + resolve({ value, done: !!this[EOF] }); }; const onend = () => { this.off("error", onerr); this.off("data", ondata); this.off(DESTROYED, ondestroy); stop(); - resolve2({ done: true, value: void 0 }); + resolve({ done: true, value: void 0 }); }; const ondestroy = () => onerr(new Error("stream destroyed")); return new Promise((res2, rej) => { reject = rej; - resolve2 = res2; + resolve = res2; this.once(DESTROYED, ondestroy); this.once("error", onerr); this.once("end", onend); @@ -13562,10 +13800,10 @@ var init_esm2 = __esm({ } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/options.js +// .yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/options.js var argmap, isSyncFile, isAsyncFile, isSyncNoFile, isAsyncNoFile, dealiasKey, dealias; var init_options = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/options.js"() { + ".yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/options.js"() { argmap = /* @__PURE__ */ new Map([ ["C", "cwd"], ["f", "file"], @@ -13615,10 +13853,10 @@ var init_options = __esm({ } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/make-command.js +// .yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/make-command.js var makeCommand; var init_make_command = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/make-command.js"() { + ".yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/make-command.js"() { init_options(); makeCommand = (syncFile, asyncFile, syncNoFile, asyncNoFile, validate) => { return Object.assign((opt_ = [], entries, cb) => { @@ -13670,10 +13908,10 @@ var init_make_command = __esm({ } }); -// .yarn/cache/minizlib-npm-3.0.1-4bdabd978f-82f8bf70da.zip/node_modules/minizlib/dist/esm/constants.js +// .yarn/cache/minizlib-npm-3.1.0-6680befdba-5aad75ab00.zip/node_modules/minizlib/dist/esm/constants.js var import_zlib, realZlibConstants, constants; var init_constants = __esm({ - ".yarn/cache/minizlib-npm-3.0.1-4bdabd978f-82f8bf70da.zip/node_modules/minizlib/dist/esm/constants.js"() { + ".yarn/cache/minizlib-npm-3.1.0-6680befdba-5aad75ab00.zip/node_modules/minizlib/dist/esm/constants.js"() { import_zlib = __toESM(require("zlib"), 1); realZlibConstants = import_zlib.default.constants || { ZLIB_VERNUM: 4736 }; constants = Object.freeze(Object.assign(/* @__PURE__ */ Object.create(null), { @@ -13787,29 +14025,35 @@ var init_constants = __esm({ } }); -// .yarn/cache/minizlib-npm-3.0.1-4bdabd978f-82f8bf70da.zip/node_modules/minizlib/dist/esm/index.js -var import_assert2, import_buffer, import_zlib2, OriginalBufferConcat, _superWrite, ZlibError, _flushFlag, ZlibBase, Zlib, Gzip, Unzip, Brotli, BrotliCompress, BrotliDecompress; +// .yarn/cache/minizlib-npm-3.1.0-6680befdba-5aad75ab00.zip/node_modules/minizlib/dist/esm/index.js +var import_assert2, import_buffer, realZlib2, OriginalBufferConcat, desc, noop, passthroughBufferConcat, _superWrite, ZlibError, _flushFlag, ZlibBase, Zlib, Gzip, Unzip, Brotli, BrotliCompress, BrotliDecompress, Zstd, ZstdCompress, ZstdDecompress; var init_esm3 = __esm({ - ".yarn/cache/minizlib-npm-3.0.1-4bdabd978f-82f8bf70da.zip/node_modules/minizlib/dist/esm/index.js"() { + ".yarn/cache/minizlib-npm-3.1.0-6680befdba-5aad75ab00.zip/node_modules/minizlib/dist/esm/index.js"() { import_assert2 = __toESM(require("assert"), 1); import_buffer = require("buffer"); init_esm(); - import_zlib2 = __toESM(require("zlib"), 1); + realZlib2 = __toESM(require("zlib"), 1); init_constants(); init_constants(); OriginalBufferConcat = import_buffer.Buffer.concat; + desc = Object.getOwnPropertyDescriptor(import_buffer.Buffer, "concat"); + noop = (args) => args; + passthroughBufferConcat = desc?.writable === true || desc?.set !== void 0 ? (makeNoOp) => { + import_buffer.Buffer.concat = makeNoOp ? noop : OriginalBufferConcat; + } : (_) => { + }; _superWrite = Symbol("_superWrite"); ZlibError = class extends Error { code; errno; - constructor(err) { - super("zlib: " + err.message); + constructor(err, origin) { + super("zlib: " + err.message, { cause: err }); this.code = err.code; this.errno = err.errno; if (!this.code) this.code = "ZLIB_ERROR"; this.message = "zlib: " + err.message; - Error.captureStackTrace(this, this.constructor); + Error.captureStackTrace(this, origin ?? this.constructor); } get name() { return "ZlibError"; @@ -13842,10 +14086,13 @@ var init_esm3 = __esm({ this.#flushFlag = opts.flush ?? 0; this.#finishFlushFlag = opts.finishFlush ?? 0; this.#fullFlushFlag = opts.fullFlushFlag ?? 0; + if (typeof realZlib2[mode] !== "function") { + throw new TypeError("Compression method not supported: " + mode); + } try { - this.#handle = new import_zlib2.default[mode](opts); + this.#handle = new realZlib2[mode](opts); } catch (er) { - throw new ZlibError(er); + throw new ZlibError(er, this.constructor); } this.#onError = (err) => { if (this.#sawError) @@ -13919,15 +14166,15 @@ var init_esm3 = __esm({ const originalClose = this.#handle.close; this.#handle.close = () => { }; - import_buffer.Buffer.concat = (args) => args; + passthroughBufferConcat(true); let result = void 0; try { const flushFlag = typeof chunk[_flushFlag] === "number" ? chunk[_flushFlag] : this.#flushFlag; result = this.#handle._processChunk(chunk, flushFlag); - import_buffer.Buffer.concat = OriginalBufferConcat; + passthroughBufferConcat(false); } catch (err) { - import_buffer.Buffer.concat = OriginalBufferConcat; - this.#onError(new ZlibError(err)); + passthroughBufferConcat(false); + this.#onError(new ZlibError(err, this.write)); } finally { if (this.#handle) { ; @@ -13938,7 +14185,7 @@ var init_esm3 = __esm({ } } if (this.#handle) - this.#handle.on("error", (er) => this.#onError(new ZlibError(er))); + this.#handle.on("error", (er) => this.#onError(new ZlibError(er, this.write))); let writeReturn; if (result) { if (Array.isArray(result) && result.length > 0) { @@ -14038,1382 +14285,1041 @@ var init_esm3 = __esm({ super(opts, "BrotliDecompress"); } }; + Zstd = class extends ZlibBase { + constructor(opts, mode) { + opts = opts || {}; + opts.flush = opts.flush || constants.ZSTD_e_continue; + opts.finishFlush = opts.finishFlush || constants.ZSTD_e_end; + opts.fullFlushFlag = constants.ZSTD_e_flush; + super(opts, mode); + } + }; + ZstdCompress = class extends Zstd { + constructor(opts) { + super(opts, "ZstdCompress"); + } + }; + ZstdDecompress = class extends Zstd { + constructor(opts) { + super(opts, "ZstdDecompress"); + } + }; } }); -// .yarn/cache/yallist-npm-5.0.0-8732dd9f1c-a499c81ce6.zip/node_modules/yallist/dist/esm/index.js -function insertAfter(self2, node, value) { - const prev = node; - const next = node ? node.next : self2.head; - const inserted = new Node(value, prev, next, self2); - if (inserted.next === void 0) { - self2.tail = inserted; - } - if (inserted.prev === void 0) { - self2.head = inserted; - } - self2.length++; - return inserted; -} -function push(self2, item) { - self2.tail = new Node(item, self2.tail, void 0, self2); - if (!self2.head) { - self2.head = self2.tail; - } - self2.length++; -} -function unshift(self2, item) { - self2.head = new Node(item, void 0, self2.head, self2); - if (!self2.tail) { - self2.tail = self2.head; - } - self2.length++; -} -var Yallist, Node; -var init_esm4 = __esm({ - ".yarn/cache/yallist-npm-5.0.0-8732dd9f1c-a499c81ce6.zip/node_modules/yallist/dist/esm/index.js"() { - Yallist = class _Yallist { - tail; - head; - length = 0; - static create(list2 = []) { - return new _Yallist(list2); +// .yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/large-numbers.js +var encode, encodePositive, encodeNegative, parse, twos, pos, onesComp, twosComp; +var init_large_numbers = __esm({ + ".yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/large-numbers.js"() { + encode = (num, buf) => { + if (!Number.isSafeInteger(num)) { + throw Error("cannot encode number outside of javascript safe integer range"); + } else if (num < 0) { + encodeNegative(num, buf); + } else { + encodePositive(num, buf); } - constructor(list2 = []) { - for (const item of list2) { - this.push(item); - } + return buf; + }; + encodePositive = (num, buf) => { + buf[0] = 128; + for (var i = buf.length; i > 1; i--) { + buf[i - 1] = num & 255; + num = Math.floor(num / 256); } - *[Symbol.iterator]() { - for (let walker = this.head; walker; walker = walker.next) { - yield walker.value; + }; + encodeNegative = (num, buf) => { + buf[0] = 255; + var flipped = false; + num = num * -1; + for (var i = buf.length; i > 1; i--) { + var byte = num & 255; + num = Math.floor(num / 256); + if (flipped) { + buf[i - 1] = onesComp(byte); + } else if (byte === 0) { + buf[i - 1] = 0; + } else { + flipped = true; + buf[i - 1] = twosComp(byte); } } - removeNode(node) { - if (node.list !== this) { - throw new Error("removing node which does not belong to this list"); - } - const next = node.next; - const prev = node.prev; - if (next) { - next.prev = prev; - } - if (prev) { - prev.next = next; - } - if (node === this.head) { - this.head = next; - } - if (node === this.tail) { - this.tail = prev; - } - this.length--; - node.next = void 0; - node.prev = void 0; - node.list = void 0; - return next; + }; + parse = (buf) => { + const pre = buf[0]; + const value = pre === 128 ? pos(buf.subarray(1, buf.length)) : pre === 255 ? twos(buf) : null; + if (value === null) { + throw Error("invalid base256 encoding"); } - unshiftNode(node) { - if (node === this.head) { - return; - } - if (node.list) { - node.list.removeNode(node); - } - const head = this.head; - node.list = this; - node.next = head; - if (head) { - head.prev = node; + if (!Number.isSafeInteger(value)) { + throw Error("parsed number outside of javascript safe integer range"); + } + return value; + }; + twos = (buf) => { + var len = buf.length; + var sum = 0; + var flipped = false; + for (var i = len - 1; i > -1; i--) { + var byte = Number(buf[i]); + var f; + if (flipped) { + f = onesComp(byte); + } else if (byte === 0) { + f = byte; + } else { + flipped = true; + f = twosComp(byte); } - this.head = node; - if (!this.tail) { - this.tail = node; + if (f !== 0) { + sum -= f * Math.pow(256, len - i - 1); } - this.length++; } - pushNode(node) { - if (node === this.tail) { - return; - } - if (node.list) { - node.list.removeNode(node); - } - const tail = this.tail; - node.list = this; - node.prev = tail; - if (tail) { - tail.next = node; - } - this.tail = node; - if (!this.head) { - this.head = node; + return sum; + }; + pos = (buf) => { + var len = buf.length; + var sum = 0; + for (var i = len - 1; i > -1; i--) { + var byte = Number(buf[i]); + if (byte !== 0) { + sum += byte * Math.pow(256, len - i - 1); } - this.length++; } - push(...args) { - for (let i = 0, l = args.length; i < l; i++) { - push(this, args[i]); + return sum; + }; + onesComp = (byte) => (255 ^ byte) & 255; + twosComp = (byte) => (255 ^ byte) + 1 & 255; + } +}); + +// .yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/types.js +var isCode, name, code; +var init_types = __esm({ + ".yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/types.js"() { + isCode = (c) => name.has(c); + name = /* @__PURE__ */ new Map([ + ["0", "File"], + // same as File + ["", "OldFile"], + ["1", "Link"], + ["2", "SymbolicLink"], + // Devices and FIFOs aren't fully supported + // they are parsed, but skipped when unpacking + ["3", "CharacterDevice"], + ["4", "BlockDevice"], + ["5", "Directory"], + ["6", "FIFO"], + // same as File + ["7", "ContiguousFile"], + // pax headers + ["g", "GlobalExtendedHeader"], + ["x", "ExtendedHeader"], + // vendor-specific stuff + // skip + ["A", "SolarisACL"], + // like 5, but with data, which should be skipped + ["D", "GNUDumpDir"], + // metadata only, skip + ["I", "Inode"], + // data = link path of next file + ["K", "NextFileHasLongLinkpath"], + // data = path of next file + ["L", "NextFileHasLongPath"], + // skip + ["M", "ContinuationFile"], + // like L + ["N", "OldGnuLongPath"], + // skip + ["S", "SparseFile"], + // skip + ["V", "TapeVolumeHeader"], + // like x + ["X", "OldExtendedHeader"] + ]); + code = new Map(Array.from(name).map((kv) => [kv[1], kv[0]])); + } +}); + +// .yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/header.js +var import_node_path, Header, splitPrefix, decString, decDate, numToDate, decNumber, nanUndef, decSmallNumber, MAXNUM, encNumber, encSmallNumber, octalString, padOctal, encDate, NULLS, encString; +var init_header = __esm({ + ".yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/header.js"() { + import_node_path = require("node:path"); + init_large_numbers(); + init_types(); + Header = class { + cksumValid = false; + needPax = false; + nullBlock = false; + block; + path; + mode; + uid; + gid; + size; + cksum; + #type = "Unsupported"; + linkpath; + uname; + gname; + devmaj = 0; + devmin = 0; + atime; + ctime; + mtime; + charset; + comment; + constructor(data, off = 0, ex, gex) { + if (Buffer.isBuffer(data)) { + this.decode(data, off || 0, ex, gex); + } else if (data) { + this.#slurp(data); } - return this.length; } - unshift(...args) { - for (var i = 0, l = args.length; i < l; i++) { - unshift(this, args[i]); + decode(buf, off, ex, gex) { + if (!off) { + off = 0; } - return this.length; - } - pop() { - if (!this.tail) { - return void 0; + if (!buf || !(buf.length >= off + 512)) { + throw new Error("need 512 bytes for header"); } - const res = this.tail.value; - const t = this.tail; - this.tail = this.tail.prev; - if (this.tail) { - this.tail.next = void 0; - } else { - this.head = void 0; + this.path = decString(buf, off, 100); + this.mode = decNumber(buf, off + 100, 8); + this.uid = decNumber(buf, off + 108, 8); + this.gid = decNumber(buf, off + 116, 8); + this.size = decNumber(buf, off + 124, 12); + this.mtime = decDate(buf, off + 136, 12); + this.cksum = decNumber(buf, off + 148, 12); + if (gex) + this.#slurp(gex, true); + if (ex) + this.#slurp(ex); + const t = decString(buf, off + 156, 1); + if (isCode(t)) { + this.#type = t || "0"; } - t.list = void 0; - this.length--; - return res; - } - shift() { - if (!this.head) { - return void 0; + if (this.#type === "0" && this.path.slice(-1) === "/") { + this.#type = "5"; } - const res = this.head.value; - const h = this.head; - this.head = this.head.next; - if (this.head) { - this.head.prev = void 0; - } else { - this.tail = void 0; + if (this.#type === "5") { + this.size = 0; } - h.list = void 0; - this.length--; - return res; - } - forEach(fn2, thisp) { - thisp = thisp || this; - for (let walker = this.head, i = 0; !!walker; i++) { - fn2.call(thisp, walker.value, i, this); - walker = walker.next; + this.linkpath = decString(buf, off + 157, 100); + if (buf.subarray(off + 257, off + 265).toString() === "ustar\x0000") { + this.uname = decString(buf, off + 265, 32); + this.gname = decString(buf, off + 297, 32); + this.devmaj = decNumber(buf, off + 329, 8) ?? 0; + this.devmin = decNumber(buf, off + 337, 8) ?? 0; + if (buf[off + 475] !== 0) { + const prefix = decString(buf, off + 345, 155); + this.path = prefix + "/" + this.path; + } else { + const prefix = decString(buf, off + 345, 130); + if (prefix) { + this.path = prefix + "/" + this.path; + } + this.atime = decDate(buf, off + 476, 12); + this.ctime = decDate(buf, off + 488, 12); + } } - } - forEachReverse(fn2, thisp) { - thisp = thisp || this; - for (let walker = this.tail, i = this.length - 1; !!walker; i--) { - fn2.call(thisp, walker.value, i, this); - walker = walker.prev; + let sum = 8 * 32; + for (let i = off; i < off + 148; i++) { + sum += buf[i]; } - } - get(n) { - let i = 0; - let walker = this.head; - for (; !!walker && i < n; i++) { - walker = walker.next; + for (let i = off + 156; i < off + 512; i++) { + sum += buf[i]; } - if (i === n && !!walker) { - return walker.value; + this.cksumValid = sum === this.cksum; + if (this.cksum === void 0 && sum === 8 * 32) { + this.nullBlock = true; } } - getReverse(n) { - let i = 0; - let walker = this.tail; - for (; !!walker && i < n; i++) { - walker = walker.prev; - } - if (i === n && !!walker) { - return walker.value; - } + #slurp(ex, gex = false) { + Object.assign(this, Object.fromEntries(Object.entries(ex).filter(([k, v]) => { + return !(v === null || v === void 0 || k === "path" && gex || k === "linkpath" && gex || k === "global"); + }))); } - map(fn2, thisp) { - thisp = thisp || this; - const res = new _Yallist(); - for (let walker = this.head; !!walker; ) { - res.push(fn2.call(thisp, walker.value, this)); - walker = walker.next; + encode(buf, off = 0) { + if (!buf) { + buf = this.block = Buffer.alloc(512); } - return res; - } - mapReverse(fn2, thisp) { - thisp = thisp || this; - var res = new _Yallist(); - for (let walker = this.tail; !!walker; ) { - res.push(fn2.call(thisp, walker.value, this)); - walker = walker.prev; + if (this.#type === "Unsupported") { + this.#type = "0"; } - return res; - } - reduce(fn2, initial) { - let acc; - let walker = this.head; - if (arguments.length > 1) { - acc = initial; - } else if (this.head) { - walker = this.head.next; - acc = this.head.value; - } else { - throw new TypeError("Reduce of empty list with no initial value"); + if (!(buf.length >= off + 512)) { + throw new Error("need 512 bytes for header"); } - for (var i = 0; !!walker; i++) { - acc = fn2(acc, walker.value, i); - walker = walker.next; - } - return acc; - } - reduceReverse(fn2, initial) { - let acc; - let walker = this.tail; - if (arguments.length > 1) { - acc = initial; - } else if (this.tail) { - walker = this.tail.prev; - acc = this.tail.value; + const prefixSize = this.ctime || this.atime ? 130 : 155; + const split = splitPrefix(this.path || "", prefixSize); + const path16 = split[0]; + const prefix = split[1]; + this.needPax = !!split[2]; + this.needPax = encString(buf, off, 100, path16) || this.needPax; + this.needPax = encNumber(buf, off + 100, 8, this.mode) || this.needPax; + this.needPax = encNumber(buf, off + 108, 8, this.uid) || this.needPax; + this.needPax = encNumber(buf, off + 116, 8, this.gid) || this.needPax; + this.needPax = encNumber(buf, off + 124, 12, this.size) || this.needPax; + this.needPax = encDate(buf, off + 136, 12, this.mtime) || this.needPax; + buf[off + 156] = this.#type.charCodeAt(0); + this.needPax = encString(buf, off + 157, 100, this.linkpath) || this.needPax; + buf.write("ustar\x0000", off + 257, 8); + this.needPax = encString(buf, off + 265, 32, this.uname) || this.needPax; + this.needPax = encString(buf, off + 297, 32, this.gname) || this.needPax; + this.needPax = encNumber(buf, off + 329, 8, this.devmaj) || this.needPax; + this.needPax = encNumber(buf, off + 337, 8, this.devmin) || this.needPax; + this.needPax = encString(buf, off + 345, prefixSize, prefix) || this.needPax; + if (buf[off + 475] !== 0) { + this.needPax = encString(buf, off + 345, 155, prefix) || this.needPax; } else { - throw new TypeError("Reduce of empty list with no initial value"); - } - for (let i = this.length - 1; !!walker; i--) { - acc = fn2(acc, walker.value, i); - walker = walker.prev; - } - return acc; - } - toArray() { - const arr = new Array(this.length); - for (let i = 0, walker = this.head; !!walker; i++) { - arr[i] = walker.value; - walker = walker.next; - } - return arr; - } - toArrayReverse() { - const arr = new Array(this.length); - for (let i = 0, walker = this.tail; !!walker; i++) { - arr[i] = walker.value; - walker = walker.prev; - } - return arr; - } - slice(from = 0, to = this.length) { - if (to < 0) { - to += this.length; - } - if (from < 0) { - from += this.length; - } - const ret = new _Yallist(); - if (to < from || to < 0) { - return ret; - } - if (from < 0) { - from = 0; - } - if (to > this.length) { - to = this.length; + this.needPax = encString(buf, off + 345, 130, prefix) || this.needPax; + this.needPax = encDate(buf, off + 476, 12, this.atime) || this.needPax; + this.needPax = encDate(buf, off + 488, 12, this.ctime) || this.needPax; } - let walker = this.head; - let i = 0; - for (i = 0; !!walker && i < from; i++) { - walker = walker.next; + let sum = 8 * 32; + for (let i = off; i < off + 148; i++) { + sum += buf[i]; } - for (; !!walker && i < to; i++, walker = walker.next) { - ret.push(walker.value); + for (let i = off + 156; i < off + 512; i++) { + sum += buf[i]; } - return ret; + this.cksum = sum; + encNumber(buf, off + 148, 8, this.cksum); + this.cksumValid = true; + return this.needPax; } - sliceReverse(from = 0, to = this.length) { - if (to < 0) { - to += this.length; - } - if (from < 0) { - from += this.length; - } - const ret = new _Yallist(); - if (to < from || to < 0) { - return ret; - } - if (from < 0) { - from = 0; - } - if (to > this.length) { - to = this.length; - } - let i = this.length; - let walker = this.tail; - for (; !!walker && i > to; i--) { - walker = walker.prev; - } - for (; !!walker && i > from; i--, walker = walker.prev) { - ret.push(walker.value); - } - return ret; + get type() { + return this.#type === "Unsupported" ? this.#type : name.get(this.#type); } - splice(start, deleteCount = 0, ...nodes) { - if (start > this.length) { - start = this.length - 1; - } - if (start < 0) { - start = this.length + start; - } - let walker = this.head; - for (let i = 0; !!walker && i < start; i++) { - walker = walker.next; - } - const ret = []; - for (let i = 0; !!walker && i < deleteCount; i++) { - ret.push(walker.value); - walker = this.removeNode(walker); - } - if (!walker) { - walker = this.tail; - } else if (walker !== this.tail) { - walker = walker.prev; - } - for (const v of nodes) { - walker = insertAfter(this, walker, v); - } - return ret; + get typeKey() { + return this.#type; } - reverse() { - const head = this.head; - const tail = this.tail; - for (let walker = head; !!walker; walker = walker.prev) { - const p = walker.prev; - walker.prev = walker.next; - walker.next = p; + set type(type) { + const c = String(code.get(type)); + if (isCode(c) || c === "Unsupported") { + this.#type = c; + } else if (isCode(type)) { + this.#type = type; + } else { + throw new TypeError("invalid entry type: " + type); } - this.head = tail; - this.tail = head; - return this; } }; - Node = class { - list; - next; - prev; - value; - constructor(value, prev, next, list2) { - this.list = list2; - this.value = value; - if (prev) { - prev.next = this; - this.prev = prev; - } else { - this.prev = void 0; - } - if (next) { - next.prev = this; - this.next = next; - } else { - this.next = void 0; + splitPrefix = (p, prefixSize) => { + const pathSize = 100; + let pp = p; + let prefix = ""; + let ret = void 0; + const root = import_node_path.posix.parse(p).root || "."; + if (Buffer.byteLength(pp) < pathSize) { + ret = [pp, prefix, false]; + } else { + prefix = import_node_path.posix.dirname(pp); + pp = import_node_path.posix.basename(pp); + do { + if (Buffer.byteLength(pp) <= pathSize && Buffer.byteLength(prefix) <= prefixSize) { + ret = [pp, prefix, false]; + } else if (Buffer.byteLength(pp) > pathSize && Buffer.byteLength(prefix) <= prefixSize) { + ret = [pp.slice(0, pathSize - 1), prefix, true]; + } else { + pp = import_node_path.posix.join(import_node_path.posix.basename(prefix), pp); + prefix = import_node_path.posix.dirname(prefix); + } + } while (prefix !== root && ret === void 0); + if (!ret) { + ret = [p.slice(0, pathSize - 1), "", true]; } } + return ret; + }; + decString = (buf, off, size) => buf.subarray(off, off + size).toString("utf8").replace(/\0.*/, ""); + decDate = (buf, off, size) => numToDate(decNumber(buf, off, size)); + numToDate = (num) => num === void 0 ? void 0 : new Date(num * 1e3); + decNumber = (buf, off, size) => Number(buf[off]) & 128 ? parse(buf.subarray(off, off + size)) : decSmallNumber(buf, off, size); + nanUndef = (value) => isNaN(value) ? void 0 : value; + decSmallNumber = (buf, off, size) => nanUndef(parseInt(buf.subarray(off, off + size).toString("utf8").replace(/\0.*$/, "").trim(), 8)); + MAXNUM = { + 12: 8589934591, + 8: 2097151 }; + encNumber = (buf, off, size, num) => num === void 0 ? false : num > MAXNUM[size] || num < 0 ? (encode(num, buf.subarray(off, off + size)), true) : (encSmallNumber(buf, off, size, num), false); + encSmallNumber = (buf, off, size, num) => buf.write(octalString(num, size), off, size, "ascii"); + octalString = (num, size) => padOctal(Math.floor(num).toString(8), size); + padOctal = (str, size) => (str.length === size - 1 ? str : new Array(size - str.length - 1).join("0") + str + " ") + "\0"; + encDate = (buf, off, size, date) => date === void 0 ? false : encNumber(buf, off, size, date.getTime() / 1e3); + NULLS = new Array(156).join("\0"); + encString = (buf, off, size, str) => str === void 0 ? false : (buf.write(str + NULLS, off, size, "utf8"), str.length !== Buffer.byteLength(str) || str.length > size); } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/large-numbers.js -var encode, encodePositive, encodeNegative, parse, twos, pos, onesComp, twosComp; -var init_large_numbers = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/large-numbers.js"() { - encode = (num, buf) => { - if (!Number.isSafeInteger(num)) { - throw Error("cannot encode number outside of javascript safe integer range"); - } else if (num < 0) { - encodeNegative(num, buf); - } else { - encodePositive(num, buf); - } - return buf; - }; - encodePositive = (num, buf) => { - buf[0] = 128; - for (var i = buf.length; i > 1; i--) { - buf[i - 1] = num & 255; - num = Math.floor(num / 256); - } - }; - encodeNegative = (num, buf) => { - buf[0] = 255; - var flipped = false; - num = num * -1; - for (var i = buf.length; i > 1; i--) { - var byte = num & 255; - num = Math.floor(num / 256); - if (flipped) { - buf[i - 1] = onesComp(byte); - } else if (byte === 0) { - buf[i - 1] = 0; - } else { - flipped = true; - buf[i - 1] = twosComp(byte); - } +// .yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/pax.js +var import_node_path2, Pax, merge, parseKV, parseKVLine; +var init_pax = __esm({ + ".yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/pax.js"() { + import_node_path2 = require("node:path"); + init_header(); + Pax = class _Pax { + atime; + mtime; + ctime; + charset; + comment; + gid; + uid; + gname; + uname; + linkpath; + dev; + ino; + nlink; + path; + size; + mode; + global; + constructor(obj, global2 = false) { + this.atime = obj.atime; + this.charset = obj.charset; + this.comment = obj.comment; + this.ctime = obj.ctime; + this.dev = obj.dev; + this.gid = obj.gid; + this.global = global2; + this.gname = obj.gname; + this.ino = obj.ino; + this.linkpath = obj.linkpath; + this.mtime = obj.mtime; + this.nlink = obj.nlink; + this.path = obj.path; + this.size = obj.size; + this.uid = obj.uid; + this.uname = obj.uname; } - }; - parse = (buf) => { - const pre = buf[0]; - const value = pre === 128 ? pos(buf.subarray(1, buf.length)) : pre === 255 ? twos(buf) : null; - if (value === null) { - throw Error("invalid base256 encoding"); + encode() { + const body = this.encodeBody(); + if (body === "") { + return Buffer.allocUnsafe(0); + } + const bodyLen = Buffer.byteLength(body); + const bufLen = 512 * Math.ceil(1 + bodyLen / 512); + const buf = Buffer.allocUnsafe(bufLen); + for (let i = 0; i < 512; i++) { + buf[i] = 0; + } + new Header({ + // XXX split the path + // then the path should be PaxHeader + basename, but less than 99, + // prepend with the dirname + /* c8 ignore start */ + path: ("PaxHeader/" + (0, import_node_path2.basename)(this.path ?? "")).slice(0, 99), + /* c8 ignore stop */ + mode: this.mode || 420, + uid: this.uid, + gid: this.gid, + size: bodyLen, + mtime: this.mtime, + type: this.global ? "GlobalExtendedHeader" : "ExtendedHeader", + linkpath: "", + uname: this.uname || "", + gname: this.gname || "", + devmaj: 0, + devmin: 0, + atime: this.atime, + ctime: this.ctime + }).encode(buf); + buf.write(body, 512, bodyLen, "utf8"); + for (let i = bodyLen + 512; i < buf.length; i++) { + buf[i] = 0; + } + return buf; } - if (!Number.isSafeInteger(value)) { - throw Error("parsed number outside of javascript safe integer range"); + encodeBody() { + return this.encodeField("path") + this.encodeField("ctime") + this.encodeField("atime") + this.encodeField("dev") + this.encodeField("ino") + this.encodeField("nlink") + this.encodeField("charset") + this.encodeField("comment") + this.encodeField("gid") + this.encodeField("gname") + this.encodeField("linkpath") + this.encodeField("mtime") + this.encodeField("size") + this.encodeField("uid") + this.encodeField("uname"); } - return value; - }; - twos = (buf) => { - var len = buf.length; - var sum = 0; - var flipped = false; - for (var i = len - 1; i > -1; i--) { - var byte = Number(buf[i]); - var f; - if (flipped) { - f = onesComp(byte); - } else if (byte === 0) { - f = byte; - } else { - flipped = true; - f = twosComp(byte); + encodeField(field) { + if (this[field] === void 0) { + return ""; } - if (f !== 0) { - sum -= f * Math.pow(256, len - i - 1); + const r = this[field]; + const v = r instanceof Date ? r.getTime() / 1e3 : r; + const s = " " + (field === "dev" || field === "ino" || field === "nlink" ? "SCHILY." : "") + field + "=" + v + "\n"; + const byteLen = Buffer.byteLength(s); + let digits = Math.floor(Math.log(byteLen) / Math.log(10)) + 1; + if (byteLen + digits >= Math.pow(10, digits)) { + digits += 1; } + const len = digits + byteLen; + return len + s; + } + static parse(str, ex, g = false) { + return new _Pax(merge(parseKV(str), ex), g); } - return sum; }; - pos = (buf) => { - var len = buf.length; - var sum = 0; - for (var i = len - 1; i > -1; i--) { - var byte = Number(buf[i]); - if (byte !== 0) { - sum += byte * Math.pow(256, len - i - 1); - } + merge = (a, b) => b ? Object.assign({}, b, a) : a; + parseKV = (str) => str.replace(/\n$/, "").split("\n").reduce(parseKVLine, /* @__PURE__ */ Object.create(null)); + parseKVLine = (set, line) => { + const n = parseInt(line, 10); + if (n !== Buffer.byteLength(line) + 1) { + return set; } - return sum; + line = line.slice((n + " ").length); + const kv = line.split("="); + const r = kv.shift(); + if (!r) { + return set; + } + const k = r.replace(/^SCHILY\.(dev|ino|nlink)/, "$1"); + const v = kv.join("="); + set[k] = /^([A-Z]+\.)?([mac]|birth|creation)time$/.test(k) ? new Date(Number(v) * 1e3) : /^[0-9]+$/.test(v) ? +v : v; + return set; }; - onesComp = (byte) => (255 ^ byte) & 255; - twosComp = (byte) => (255 ^ byte) + 1 & 255; } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/types.js -var isCode, name, code; -var init_types = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/types.js"() { - isCode = (c) => name.has(c); - name = /* @__PURE__ */ new Map([ - ["0", "File"], - // same as File - ["", "OldFile"], - ["1", "Link"], - ["2", "SymbolicLink"], - // Devices and FIFOs aren't fully supported - // they are parsed, but skipped when unpacking - ["3", "CharacterDevice"], - ["4", "BlockDevice"], - ["5", "Directory"], - ["6", "FIFO"], - // same as File - ["7", "ContiguousFile"], - // pax headers - ["g", "GlobalExtendedHeader"], - ["x", "ExtendedHeader"], - // vendor-specific stuff - // skip - ["A", "SolarisACL"], - // like 5, but with data, which should be skipped - ["D", "GNUDumpDir"], - // metadata only, skip - ["I", "Inode"], - // data = link path of next file - ["K", "NextFileHasLongLinkpath"], - // data = path of next file - ["L", "NextFileHasLongPath"], - // skip - ["M", "ContinuationFile"], - // like L - ["N", "OldGnuLongPath"], - // skip - ["S", "SparseFile"], - // skip - ["V", "TapeVolumeHeader"], - // like x - ["X", "OldExtendedHeader"] - ]); - code = new Map(Array.from(name).map((kv) => [kv[1], kv[0]])); +// .yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/normalize-windows-path.js +var platform, normalizeWindowsPath; +var init_normalize_windows_path = __esm({ + ".yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/normalize-windows-path.js"() { + platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; + normalizeWindowsPath = platform !== "win32" ? (p) => p : (p) => p && p.replace(/\\/g, "/"); } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/header.js -var import_node_path, Header, splitPrefix, decString, decDate, numToDate, decNumber, nanUndef, decSmallNumber, MAXNUM, encNumber, encSmallNumber, octalString, padOctal, encDate, NULLS, encString; -var init_header = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/header.js"() { - import_node_path = require("node:path"); - init_large_numbers(); - init_types(); - Header = class { - cksumValid = false; - needPax = false; - nullBlock = false; - block; +// .yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/read-entry.js +var ReadEntry; +var init_read_entry = __esm({ + ".yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/read-entry.js"() { + init_esm(); + init_normalize_windows_path(); + ReadEntry = class extends Minipass { + extended; + globalExtended; + header; + startBlockSize; + blockRemain; + remain; + type; + meta = false; + ignore = false; path; mode; uid; gid; - size; - cksum; - #type = "Unsupported"; - linkpath; uname; gname; - devmaj = 0; - devmin = 0; + size = 0; + mtime; atime; ctime; - mtime; - charset; - comment; - constructor(data, off = 0, ex, gex) { - if (Buffer.isBuffer(data)) { - this.decode(data, off || 0, ex, gex); - } else if (data) { - this.#slurp(data); - } - } - decode(buf, off, ex, gex) { - if (!off) { - off = 0; - } - if (!buf || !(buf.length >= off + 512)) { - throw new Error("need 512 bytes for header"); - } - this.path = decString(buf, off, 100); - this.mode = decNumber(buf, off + 100, 8); - this.uid = decNumber(buf, off + 108, 8); - this.gid = decNumber(buf, off + 116, 8); - this.size = decNumber(buf, off + 124, 12); - this.mtime = decDate(buf, off + 136, 12); - this.cksum = decNumber(buf, off + 148, 12); - if (gex) - this.#slurp(gex, true); - if (ex) - this.#slurp(ex); - const t = decString(buf, off + 156, 1); - if (isCode(t)) { - this.#type = t || "0"; + linkpath; + dev; + ino; + nlink; + invalid = false; + absolute; + unsupported = false; + constructor(header, ex, gex) { + super({}); + this.pause(); + this.extended = ex; + this.globalExtended = gex; + this.header = header; + this.remain = header.size ?? 0; + this.startBlockSize = 512 * Math.ceil(this.remain / 512); + this.blockRemain = this.startBlockSize; + this.type = header.type; + switch (this.type) { + case "File": + case "OldFile": + case "Link": + case "SymbolicLink": + case "CharacterDevice": + case "BlockDevice": + case "Directory": + case "FIFO": + case "ContiguousFile": + case "GNUDumpDir": + break; + case "NextFileHasLongLinkpath": + case "NextFileHasLongPath": + case "OldGnuLongPath": + case "GlobalExtendedHeader": + case "ExtendedHeader": + case "OldExtendedHeader": + this.meta = true; + break; + // NOTE: gnutar and bsdtar treat unrecognized types as 'File' + // it may be worth doing the same, but with a warning. + default: + this.ignore = true; } - if (this.#type === "0" && this.path.slice(-1) === "/") { - this.#type = "5"; + if (!header.path) { + throw new Error("no path provided for tar.ReadEntry"); } - if (this.#type === "5") { - this.size = 0; + this.path = normalizeWindowsPath(header.path); + this.mode = header.mode; + if (this.mode) { + this.mode = this.mode & 4095; } - this.linkpath = decString(buf, off + 157, 100); - if (buf.subarray(off + 257, off + 265).toString() === "ustar\x0000") { - this.uname = decString(buf, off + 265, 32); - this.gname = decString(buf, off + 297, 32); - this.devmaj = decNumber(buf, off + 329, 8) ?? 0; - this.devmin = decNumber(buf, off + 337, 8) ?? 0; - if (buf[off + 475] !== 0) { - const prefix = decString(buf, off + 345, 155); - this.path = prefix + "/" + this.path; - } else { - const prefix = decString(buf, off + 345, 130); - if (prefix) { - this.path = prefix + "/" + this.path; - } - this.atime = decDate(buf, off + 476, 12); - this.ctime = decDate(buf, off + 488, 12); - } + this.uid = header.uid; + this.gid = header.gid; + this.uname = header.uname; + this.gname = header.gname; + this.size = this.remain; + this.mtime = header.mtime; + this.atime = header.atime; + this.ctime = header.ctime; + this.linkpath = header.linkpath ? normalizeWindowsPath(header.linkpath) : void 0; + this.uname = header.uname; + this.gname = header.gname; + if (ex) { + this.#slurp(ex); } - let sum = 8 * 32; - for (let i = off; i < off + 148; i++) { - sum += buf[i]; + if (gex) { + this.#slurp(gex, true); } - for (let i = off + 156; i < off + 512; i++) { - sum += buf[i]; + } + write(data) { + const writeLen = data.length; + if (writeLen > this.blockRemain) { + throw new Error("writing more to entry than is appropriate"); } - this.cksumValid = sum === this.cksum; - if (this.cksum === void 0 && sum === 8 * 32) { - this.nullBlock = true; + const r = this.remain; + const br = this.blockRemain; + this.remain = Math.max(0, r - writeLen); + this.blockRemain = Math.max(0, br - writeLen); + if (this.ignore) { + return true; } + if (r >= writeLen) { + return super.write(data); + } + return super.write(data.subarray(0, r)); } #slurp(ex, gex = false) { + if (ex.path) + ex.path = normalizeWindowsPath(ex.path); + if (ex.linkpath) + ex.linkpath = normalizeWindowsPath(ex.linkpath); Object.assign(this, Object.fromEntries(Object.entries(ex).filter(([k, v]) => { - return !(v === null || v === void 0 || k === "path" && gex || k === "linkpath" && gex || k === "global"); + return !(v === null || v === void 0 || k === "path" && gex); }))); } - encode(buf, off = 0) { - if (!buf) { - buf = this.block = Buffer.alloc(512); - } - if (this.#type === "Unsupported") { - this.#type = "0"; - } - if (!(buf.length >= off + 512)) { - throw new Error("need 512 bytes for header"); - } - const prefixSize = this.ctime || this.atime ? 130 : 155; - const split = splitPrefix(this.path || "", prefixSize); - const path16 = split[0]; - const prefix = split[1]; - this.needPax = !!split[2]; - this.needPax = encString(buf, off, 100, path16) || this.needPax; - this.needPax = encNumber(buf, off + 100, 8, this.mode) || this.needPax; - this.needPax = encNumber(buf, off + 108, 8, this.uid) || this.needPax; - this.needPax = encNumber(buf, off + 116, 8, this.gid) || this.needPax; - this.needPax = encNumber(buf, off + 124, 12, this.size) || this.needPax; - this.needPax = encDate(buf, off + 136, 12, this.mtime) || this.needPax; - buf[off + 156] = this.#type.charCodeAt(0); - this.needPax = encString(buf, off + 157, 100, this.linkpath) || this.needPax; - buf.write("ustar\x0000", off + 257, 8); - this.needPax = encString(buf, off + 265, 32, this.uname) || this.needPax; - this.needPax = encString(buf, off + 297, 32, this.gname) || this.needPax; - this.needPax = encNumber(buf, off + 329, 8, this.devmaj) || this.needPax; - this.needPax = encNumber(buf, off + 337, 8, this.devmin) || this.needPax; - this.needPax = encString(buf, off + 345, prefixSize, prefix) || this.needPax; - if (buf[off + 475] !== 0) { - this.needPax = encString(buf, off + 345, 155, prefix) || this.needPax; - } else { - this.needPax = encString(buf, off + 345, 130, prefix) || this.needPax; - this.needPax = encDate(buf, off + 476, 12, this.atime) || this.needPax; - this.needPax = encDate(buf, off + 488, 12, this.ctime) || this.needPax; - } - let sum = 8 * 32; - for (let i = off; i < off + 148; i++) { - sum += buf[i]; - } - for (let i = off + 156; i < off + 512; i++) { - sum += buf[i]; - } - this.cksum = sum; - encNumber(buf, off + 148, 8, this.cksum); - this.cksumValid = true; - return this.needPax; - } - get type() { - return this.#type === "Unsupported" ? this.#type : name.get(this.#type); + }; + } +}); + +// .yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/warn-method.js +var warnMethod; +var init_warn_method = __esm({ + ".yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/warn-method.js"() { + warnMethod = (self2, code2, message, data = {}) => { + if (self2.file) { + data.file = self2.file; } - get typeKey() { - return this.#type; + if (self2.cwd) { + data.cwd = self2.cwd; } - set type(type) { - const c = String(code.get(type)); - if (isCode(c) || c === "Unsupported") { - this.#type = c; - } else if (isCode(type)) { - this.#type = type; - } else { - throw new TypeError("invalid entry type: " + type); + data.code = message instanceof Error && message.code || code2; + data.tarCode = code2; + if (!self2.strict && data.recoverable !== false) { + if (message instanceof Error) { + data = Object.assign(message, data); + message = message.message; } - } - }; - splitPrefix = (p, prefixSize) => { - const pathSize = 100; - let pp = p; - let prefix = ""; - let ret = void 0; - const root = import_node_path.posix.parse(p).root || "."; - if (Buffer.byteLength(pp) < pathSize) { - ret = [pp, prefix, false]; + self2.emit("warn", code2, message, data); + } else if (message instanceof Error) { + self2.emit("error", Object.assign(message, data)); } else { - prefix = import_node_path.posix.dirname(pp); - pp = import_node_path.posix.basename(pp); - do { - if (Buffer.byteLength(pp) <= pathSize && Buffer.byteLength(prefix) <= prefixSize) { - ret = [pp, prefix, false]; - } else if (Buffer.byteLength(pp) > pathSize && Buffer.byteLength(prefix) <= prefixSize) { - ret = [pp.slice(0, pathSize - 1), prefix, true]; - } else { - pp = import_node_path.posix.join(import_node_path.posix.basename(prefix), pp); - prefix = import_node_path.posix.dirname(prefix); - } - } while (prefix !== root && ret === void 0); - if (!ret) { - ret = [p.slice(0, pathSize - 1), "", true]; - } + self2.emit("error", Object.assign(new Error(`${code2}: ${message}`), data)); } - return ret; - }; - decString = (buf, off, size) => buf.subarray(off, off + size).toString("utf8").replace(/\0.*/, ""); - decDate = (buf, off, size) => numToDate(decNumber(buf, off, size)); - numToDate = (num) => num === void 0 ? void 0 : new Date(num * 1e3); - decNumber = (buf, off, size) => Number(buf[off]) & 128 ? parse(buf.subarray(off, off + size)) : decSmallNumber(buf, off, size); - nanUndef = (value) => isNaN(value) ? void 0 : value; - decSmallNumber = (buf, off, size) => nanUndef(parseInt(buf.subarray(off, off + size).toString("utf8").replace(/\0.*$/, "").trim(), 8)); - MAXNUM = { - 12: 8589934591, - 8: 2097151 }; - encNumber = (buf, off, size, num) => num === void 0 ? false : num > MAXNUM[size] || num < 0 ? (encode(num, buf.subarray(off, off + size)), true) : (encSmallNumber(buf, off, size, num), false); - encSmallNumber = (buf, off, size, num) => buf.write(octalString(num, size), off, size, "ascii"); - octalString = (num, size) => padOctal(Math.floor(num).toString(8), size); - padOctal = (str, size) => (str.length === size - 1 ? str : new Array(size - str.length - 1).join("0") + str + " ") + "\0"; - encDate = (buf, off, size, date) => date === void 0 ? false : encNumber(buf, off, size, date.getTime() / 1e3); - NULLS = new Array(156).join("\0"); - encString = (buf, off, size, str) => str === void 0 ? false : (buf.write(str + NULLS, off, size, "utf8"), str.length !== Buffer.byteLength(str) || str.length > size); } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/pax.js -var import_node_path2, Pax, merge, parseKV, parseKVLine; -var init_pax = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/pax.js"() { - import_node_path2 = require("node:path"); +// .yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/parse.js +var import_events3, maxMetaEntrySize, gzipHeader, zstdHeader, ZIP_HEADER_LEN, STATE, WRITEENTRY, READENTRY, NEXTENTRY, PROCESSENTRY, EX, GEX, META, EMITMETA, BUFFER2, QUEUE, ENDED, EMITTEDEND, EMIT, UNZIP, CONSUMECHUNK, CONSUMECHUNKSUB, CONSUMEBODY, CONSUMEMETA, CONSUMEHEADER, CONSUMING, BUFFERCONCAT, MAYBEEND, WRITING, ABORTED2, DONE, SAW_VALID_ENTRY, SAW_NULL_BLOCK, SAW_EOF, CLOSESTREAM, noop2, Parser; +var init_parse = __esm({ + ".yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/parse.js"() { + import_events3 = require("events"); + init_esm3(); init_header(); - Pax = class _Pax { - atime; - mtime; - ctime; - charset; - comment; - gid; - uid; - gname; - uname; - linkpath; - dev; - ino; - nlink; - path; - size; - mode; - global; - constructor(obj, global2 = false) { - this.atime = obj.atime; - this.charset = obj.charset; - this.comment = obj.comment; - this.ctime = obj.ctime; - this.dev = obj.dev; - this.gid = obj.gid; - this.global = global2; - this.gname = obj.gname; - this.ino = obj.ino; - this.linkpath = obj.linkpath; - this.mtime = obj.mtime; - this.nlink = obj.nlink; - this.path = obj.path; - this.size = obj.size; - this.uid = obj.uid; - this.uname = obj.uname; - } - encode() { - const body = this.encodeBody(); - if (body === "") { - return Buffer.allocUnsafe(0); + init_pax(); + init_read_entry(); + init_warn_method(); + maxMetaEntrySize = 1024 * 1024; + gzipHeader = Buffer.from([31, 139]); + zstdHeader = Buffer.from([40, 181, 47, 253]); + ZIP_HEADER_LEN = Math.max(gzipHeader.length, zstdHeader.length); + STATE = Symbol("state"); + WRITEENTRY = Symbol("writeEntry"); + READENTRY = Symbol("readEntry"); + NEXTENTRY = Symbol("nextEntry"); + PROCESSENTRY = Symbol("processEntry"); + EX = Symbol("extendedHeader"); + GEX = Symbol("globalExtendedHeader"); + META = Symbol("meta"); + EMITMETA = Symbol("emitMeta"); + BUFFER2 = Symbol("buffer"); + QUEUE = Symbol("queue"); + ENDED = Symbol("ended"); + EMITTEDEND = Symbol("emittedEnd"); + EMIT = Symbol("emit"); + UNZIP = Symbol("unzip"); + CONSUMECHUNK = Symbol("consumeChunk"); + CONSUMECHUNKSUB = Symbol("consumeChunkSub"); + CONSUMEBODY = Symbol("consumeBody"); + CONSUMEMETA = Symbol("consumeMeta"); + CONSUMEHEADER = Symbol("consumeHeader"); + CONSUMING = Symbol("consuming"); + BUFFERCONCAT = Symbol("bufferConcat"); + MAYBEEND = Symbol("maybeEnd"); + WRITING = Symbol("writing"); + ABORTED2 = Symbol("aborted"); + DONE = Symbol("onDone"); + SAW_VALID_ENTRY = Symbol("sawValidEntry"); + SAW_NULL_BLOCK = Symbol("sawNullBlock"); + SAW_EOF = Symbol("sawEOF"); + CLOSESTREAM = Symbol("closeStream"); + noop2 = () => true; + Parser = class extends import_events3.EventEmitter { + file; + strict; + maxMetaEntrySize; + filter; + brotli; + zstd; + writable = true; + readable = false; + [QUEUE] = []; + [BUFFER2]; + [READENTRY]; + [WRITEENTRY]; + [STATE] = "begin"; + [META] = ""; + [EX]; + [GEX]; + [ENDED] = false; + [UNZIP]; + [ABORTED2] = false; + [SAW_VALID_ENTRY]; + [SAW_NULL_BLOCK] = false; + [SAW_EOF] = false; + [WRITING] = false; + [CONSUMING] = false; + [EMITTEDEND] = false; + constructor(opt = {}) { + super(); + this.file = opt.file || ""; + this.on(DONE, () => { + if (this[STATE] === "begin" || this[SAW_VALID_ENTRY] === false) { + this.warn("TAR_BAD_ARCHIVE", "Unrecognized archive format"); + } + }); + if (opt.ondone) { + this.on(DONE, opt.ondone); + } else { + this.on(DONE, () => { + this.emit("prefinish"); + this.emit("finish"); + this.emit("end"); + }); } - const bodyLen = Buffer.byteLength(body); - const bufLen = 512 * Math.ceil(1 + bodyLen / 512); - const buf = Buffer.allocUnsafe(bufLen); - for (let i = 0; i < 512; i++) { - buf[i] = 0; + this.strict = !!opt.strict; + this.maxMetaEntrySize = opt.maxMetaEntrySize || maxMetaEntrySize; + this.filter = typeof opt.filter === "function" ? opt.filter : noop2; + const isTBR = opt.file && (opt.file.endsWith(".tar.br") || opt.file.endsWith(".tbr")); + this.brotli = !(opt.gzip || opt.zstd) && opt.brotli !== void 0 ? opt.brotli : isTBR ? void 0 : false; + const isTZST = opt.file && (opt.file.endsWith(".tar.zst") || opt.file.endsWith(".tzst")); + this.zstd = !(opt.gzip || opt.brotli) && opt.zstd !== void 0 ? opt.zstd : isTZST ? true : void 0; + this.on("end", () => this[CLOSESTREAM]()); + if (typeof opt.onwarn === "function") { + this.on("warn", opt.onwarn); } - new Header({ - // XXX split the path - // then the path should be PaxHeader + basename, but less than 99, - // prepend with the dirname - /* c8 ignore start */ - path: ("PaxHeader/" + (0, import_node_path2.basename)(this.path ?? "")).slice(0, 99), - /* c8 ignore stop */ - mode: this.mode || 420, - uid: this.uid, - gid: this.gid, - size: bodyLen, - mtime: this.mtime, - type: this.global ? "GlobalExtendedHeader" : "ExtendedHeader", - linkpath: "", - uname: this.uname || "", - gname: this.gname || "", - devmaj: 0, - devmin: 0, - atime: this.atime, - ctime: this.ctime - }).encode(buf); - buf.write(body, 512, bodyLen, "utf8"); - for (let i = bodyLen + 512; i < buf.length; i++) { - buf[i] = 0; + if (typeof opt.onReadEntry === "function") { + this.on("entry", opt.onReadEntry); } - return buf; } - encodeBody() { - return this.encodeField("path") + this.encodeField("ctime") + this.encodeField("atime") + this.encodeField("dev") + this.encodeField("ino") + this.encodeField("nlink") + this.encodeField("charset") + this.encodeField("comment") + this.encodeField("gid") + this.encodeField("gname") + this.encodeField("linkpath") + this.encodeField("mtime") + this.encodeField("size") + this.encodeField("uid") + this.encodeField("uname"); + warn(code2, message, data = {}) { + warnMethod(this, code2, message, data); } - encodeField(field) { - if (this[field] === void 0) { - return ""; + [CONSUMEHEADER](chunk, position) { + if (this[SAW_VALID_ENTRY] === void 0) { + this[SAW_VALID_ENTRY] = false; } - const r = this[field]; - const v = r instanceof Date ? r.getTime() / 1e3 : r; - const s = " " + (field === "dev" || field === "ino" || field === "nlink" ? "SCHILY." : "") + field + "=" + v + "\n"; - const byteLen = Buffer.byteLength(s); - let digits = Math.floor(Math.log(byteLen) / Math.log(10)) + 1; - if (byteLen + digits >= Math.pow(10, digits)) { - digits += 1; + let header; + try { + header = new Header(chunk, position, this[EX], this[GEX]); + } catch (er) { + return this.warn("TAR_ENTRY_INVALID", er); + } + if (header.nullBlock) { + if (this[SAW_NULL_BLOCK]) { + this[SAW_EOF] = true; + if (this[STATE] === "begin") { + this[STATE] = "header"; + } + this[EMIT]("eof"); + } else { + this[SAW_NULL_BLOCK] = true; + this[EMIT]("nullBlock"); + } + } else { + this[SAW_NULL_BLOCK] = false; + if (!header.cksumValid) { + this.warn("TAR_ENTRY_INVALID", "checksum failure", { header }); + } else if (!header.path) { + this.warn("TAR_ENTRY_INVALID", "path is required", { header }); + } else { + const type = header.type; + if (/^(Symbolic)?Link$/.test(type) && !header.linkpath) { + this.warn("TAR_ENTRY_INVALID", "linkpath required", { + header + }); + } else if (!/^(Symbolic)?Link$/.test(type) && !/^(Global)?ExtendedHeader$/.test(type) && header.linkpath) { + this.warn("TAR_ENTRY_INVALID", "linkpath forbidden", { + header + }); + } else { + const entry = this[WRITEENTRY] = new ReadEntry(header, this[EX], this[GEX]); + if (!this[SAW_VALID_ENTRY]) { + if (entry.remain) { + const onend = () => { + if (!entry.invalid) { + this[SAW_VALID_ENTRY] = true; + } + }; + entry.on("end", onend); + } else { + this[SAW_VALID_ENTRY] = true; + } + } + if (entry.meta) { + if (entry.size > this.maxMetaEntrySize) { + entry.ignore = true; + this[EMIT]("ignoredEntry", entry); + this[STATE] = "ignore"; + entry.resume(); + } else if (entry.size > 0) { + this[META] = ""; + entry.on("data", (c) => this[META] += c); + this[STATE] = "meta"; + } + } else { + this[EX] = void 0; + entry.ignore = entry.ignore || !this.filter(entry.path, entry); + if (entry.ignore) { + this[EMIT]("ignoredEntry", entry); + this[STATE] = entry.remain ? "ignore" : "header"; + entry.resume(); + } else { + if (entry.remain) { + this[STATE] = "body"; + } else { + this[STATE] = "header"; + entry.end(); + } + if (!this[READENTRY]) { + this[QUEUE].push(entry); + this[NEXTENTRY](); + } else { + this[QUEUE].push(entry); + } + } + } + } + } } - const len = digits + byteLen; - return len + s; } - static parse(str, ex, g = false) { - return new _Pax(merge(parseKV(str), ex), g); + [CLOSESTREAM]() { + queueMicrotask(() => this.emit("close")); } - }; - merge = (a, b) => b ? Object.assign({}, b, a) : a; - parseKV = (str) => str.replace(/\n$/, "").split("\n").reduce(parseKVLine, /* @__PURE__ */ Object.create(null)); - parseKVLine = (set, line) => { - const n = parseInt(line, 10); - if (n !== Buffer.byteLength(line) + 1) { - return set; - } - line = line.slice((n + " ").length); - const kv = line.split("="); - const r = kv.shift(); - if (!r) { - return set; - } - const k = r.replace(/^SCHILY\.(dev|ino|nlink)/, "$1"); - const v = kv.join("="); - set[k] = /^([A-Z]+\.)?([mac]|birth|creation)time$/.test(k) ? new Date(Number(v) * 1e3) : /^[0-9]+$/.test(v) ? +v : v; - return set; - }; - } -}); - -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/normalize-windows-path.js -var platform, normalizeWindowsPath; -var init_normalize_windows_path = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/normalize-windows-path.js"() { - platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; - normalizeWindowsPath = platform !== "win32" ? (p) => p : (p) => p && p.replace(/\\/g, "/"); - } -}); - -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/read-entry.js -var ReadEntry; -var init_read_entry = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/read-entry.js"() { - init_esm(); - init_normalize_windows_path(); - ReadEntry = class extends Minipass { - extended; - globalExtended; - header; - startBlockSize; - blockRemain; - remain; - type; - meta = false; - ignore = false; - path; - mode; - uid; - gid; - uname; - gname; - size = 0; - mtime; - atime; - ctime; - linkpath; - dev; - ino; - nlink; - invalid = false; - absolute; - unsupported = false; - constructor(header, ex, gex) { - super({}); - this.pause(); - this.extended = ex; - this.globalExtended = gex; - this.header = header; - this.remain = header.size ?? 0; - this.startBlockSize = 512 * Math.ceil(this.remain / 512); - this.blockRemain = this.startBlockSize; - this.type = header.type; - switch (this.type) { - case "File": - case "OldFile": - case "Link": - case "SymbolicLink": - case "CharacterDevice": - case "BlockDevice": - case "Directory": - case "FIFO": - case "ContiguousFile": - case "GNUDumpDir": - break; - case "NextFileHasLongLinkpath": - case "NextFileHasLongPath": - case "OldGnuLongPath": - case "GlobalExtendedHeader": - case "ExtendedHeader": - case "OldExtendedHeader": - this.meta = true; - break; - // NOTE: gnutar and bsdtar treat unrecognized types as 'File' - // it may be worth doing the same, but with a warning. - default: - this.ignore = true; - } - if (!header.path) { - throw new Error("no path provided for tar.ReadEntry"); - } - this.path = normalizeWindowsPath(header.path); - this.mode = header.mode; - if (this.mode) { - this.mode = this.mode & 4095; - } - this.uid = header.uid; - this.gid = header.gid; - this.uname = header.uname; - this.gname = header.gname; - this.size = this.remain; - this.mtime = header.mtime; - this.atime = header.atime; - this.ctime = header.ctime; - this.linkpath = header.linkpath ? normalizeWindowsPath(header.linkpath) : void 0; - this.uname = header.uname; - this.gname = header.gname; - if (ex) { - this.#slurp(ex); + [PROCESSENTRY](entry) { + let go = true; + if (!entry) { + this[READENTRY] = void 0; + go = false; + } else if (Array.isArray(entry)) { + const [ev, ...args] = entry; + this.emit(ev, ...args); + } else { + this[READENTRY] = entry; + this.emit("entry", entry); + if (!entry.emittedEnd) { + entry.on("end", () => this[NEXTENTRY]()); + go = false; + } } - if (gex) { - this.#slurp(gex, true); + return go; + } + [NEXTENTRY]() { + do { + } while (this[PROCESSENTRY](this[QUEUE].shift())); + if (!this[QUEUE].length) { + const re = this[READENTRY]; + const drainNow = !re || re.flowing || re.size === re.remain; + if (drainNow) { + if (!this[WRITING]) { + this.emit("drain"); + } + } else { + re.once("drain", () => this.emit("drain")); + } } } - write(data) { - const writeLen = data.length; - if (writeLen > this.blockRemain) { - throw new Error("writing more to entry than is appropriate"); + [CONSUMEBODY](chunk, position) { + const entry = this[WRITEENTRY]; + if (!entry) { + throw new Error("attempt to consume body without entry??"); } - const r = this.remain; - const br = this.blockRemain; - this.remain = Math.max(0, r - writeLen); - this.blockRemain = Math.max(0, br - writeLen); - if (this.ignore) { - return true; + const br = entry.blockRemain ?? 0; + const c = br >= chunk.length && position === 0 ? chunk : chunk.subarray(position, position + br); + entry.write(c); + if (!entry.blockRemain) { + this[STATE] = "header"; + this[WRITEENTRY] = void 0; + entry.end(); } - if (r >= writeLen) { - return super.write(data); + return c.length; + } + [CONSUMEMETA](chunk, position) { + const entry = this[WRITEENTRY]; + const ret = this[CONSUMEBODY](chunk, position); + if (!this[WRITEENTRY] && entry) { + this[EMITMETA](entry); } - return super.write(data.subarray(0, r)); + return ret; } - #slurp(ex, gex = false) { - if (ex.path) - ex.path = normalizeWindowsPath(ex.path); - if (ex.linkpath) - ex.linkpath = normalizeWindowsPath(ex.linkpath); - Object.assign(this, Object.fromEntries(Object.entries(ex).filter(([k, v]) => { - return !(v === null || v === void 0 || k === "path" && gex); - }))); + [EMIT](ev, data, extra) { + if (!this[QUEUE].length && !this[READENTRY]) { + this.emit(ev, data, extra); + } else { + this[QUEUE].push([ev, data, extra]); + } } - }; - } -}); - -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/warn-method.js -var warnMethod; -var init_warn_method = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/warn-method.js"() { - warnMethod = (self2, code2, message, data = {}) => { - if (self2.file) { - data.file = self2.file; + [EMITMETA](entry) { + this[EMIT]("meta", this[META]); + switch (entry.type) { + case "ExtendedHeader": + case "OldExtendedHeader": + this[EX] = Pax.parse(this[META], this[EX], false); + break; + case "GlobalExtendedHeader": + this[GEX] = Pax.parse(this[META], this[GEX], true); + break; + case "NextFileHasLongPath": + case "OldGnuLongPath": { + const ex = this[EX] ?? /* @__PURE__ */ Object.create(null); + this[EX] = ex; + ex.path = this[META].replace(/\0.*/, ""); + break; + } + case "NextFileHasLongLinkpath": { + const ex = this[EX] || /* @__PURE__ */ Object.create(null); + this[EX] = ex; + ex.linkpath = this[META].replace(/\0.*/, ""); + break; + } + /* c8 ignore start */ + default: + throw new Error("unknown meta: " + entry.type); + } } - if (self2.cwd) { - data.cwd = self2.cwd; + abort(error) { + this[ABORTED2] = true; + this.emit("abort", error); + this.warn("TAR_ABORT", error, { recoverable: false }); } - data.code = message instanceof Error && message.code || code2; - data.tarCode = code2; - if (!self2.strict && data.recoverable !== false) { - if (message instanceof Error) { - data = Object.assign(message, data); - message = message.message; + write(chunk, encoding, cb) { + if (typeof encoding === "function") { + cb = encoding; + encoding = void 0; } - self2.emit("warn", code2, message, data); - } else if (message instanceof Error) { - self2.emit("error", Object.assign(message, data)); - } else { - self2.emit("error", Object.assign(new Error(`${code2}: ${message}`), data)); - } - }; - } -}); - -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/parse.js -var import_events3, maxMetaEntrySize, gzipHeader, STATE, WRITEENTRY, READENTRY, NEXTENTRY, PROCESSENTRY, EX, GEX, META, EMITMETA, BUFFER2, QUEUE, ENDED, EMITTEDEND, EMIT, UNZIP, CONSUMECHUNK, CONSUMECHUNKSUB, CONSUMEBODY, CONSUMEMETA, CONSUMEHEADER, CONSUMING, BUFFERCONCAT, MAYBEEND, WRITING, ABORTED2, DONE, SAW_VALID_ENTRY, SAW_NULL_BLOCK, SAW_EOF, CLOSESTREAM, noop, Parser; -var init_parse = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/parse.js"() { - import_events3 = require("events"); - init_esm3(); - init_esm4(); - init_header(); - init_pax(); - init_read_entry(); - init_warn_method(); - maxMetaEntrySize = 1024 * 1024; - gzipHeader = Buffer.from([31, 139]); - STATE = Symbol("state"); - WRITEENTRY = Symbol("writeEntry"); - READENTRY = Symbol("readEntry"); - NEXTENTRY = Symbol("nextEntry"); - PROCESSENTRY = Symbol("processEntry"); - EX = Symbol("extendedHeader"); - GEX = Symbol("globalExtendedHeader"); - META = Symbol("meta"); - EMITMETA = Symbol("emitMeta"); - BUFFER2 = Symbol("buffer"); - QUEUE = Symbol("queue"); - ENDED = Symbol("ended"); - EMITTEDEND = Symbol("emittedEnd"); - EMIT = Symbol("emit"); - UNZIP = Symbol("unzip"); - CONSUMECHUNK = Symbol("consumeChunk"); - CONSUMECHUNKSUB = Symbol("consumeChunkSub"); - CONSUMEBODY = Symbol("consumeBody"); - CONSUMEMETA = Symbol("consumeMeta"); - CONSUMEHEADER = Symbol("consumeHeader"); - CONSUMING = Symbol("consuming"); - BUFFERCONCAT = Symbol("bufferConcat"); - MAYBEEND = Symbol("maybeEnd"); - WRITING = Symbol("writing"); - ABORTED2 = Symbol("aborted"); - DONE = Symbol("onDone"); - SAW_VALID_ENTRY = Symbol("sawValidEntry"); - SAW_NULL_BLOCK = Symbol("sawNullBlock"); - SAW_EOF = Symbol("sawEOF"); - CLOSESTREAM = Symbol("closeStream"); - noop = () => true; - Parser = class extends import_events3.EventEmitter { - file; - strict; - maxMetaEntrySize; - filter; - brotli; - writable = true; - readable = false; - [QUEUE] = new Yallist(); - [BUFFER2]; - [READENTRY]; - [WRITEENTRY]; - [STATE] = "begin"; - [META] = ""; - [EX]; - [GEX]; - [ENDED] = false; - [UNZIP]; - [ABORTED2] = false; - [SAW_VALID_ENTRY]; - [SAW_NULL_BLOCK] = false; - [SAW_EOF] = false; - [WRITING] = false; - [CONSUMING] = false; - [EMITTEDEND] = false; - constructor(opt = {}) { - super(); - this.file = opt.file || ""; - this.on(DONE, () => { - if (this[STATE] === "begin" || this[SAW_VALID_ENTRY] === false) { - this.warn("TAR_BAD_ARCHIVE", "Unrecognized archive format"); - } - }); - if (opt.ondone) { - this.on(DONE, opt.ondone); - } else { - this.on(DONE, () => { - this.emit("prefinish"); - this.emit("finish"); - this.emit("end"); - }); - } - this.strict = !!opt.strict; - this.maxMetaEntrySize = opt.maxMetaEntrySize || maxMetaEntrySize; - this.filter = typeof opt.filter === "function" ? opt.filter : noop; - const isTBR = opt.file && (opt.file.endsWith(".tar.br") || opt.file.endsWith(".tbr")); - this.brotli = !opt.gzip && opt.brotli !== void 0 ? opt.brotli : isTBR ? void 0 : false; - this.on("end", () => this[CLOSESTREAM]()); - if (typeof opt.onwarn === "function") { - this.on("warn", opt.onwarn); - } - if (typeof opt.onReadEntry === "function") { - this.on("entry", opt.onReadEntry); - } - } - warn(code2, message, data = {}) { - warnMethod(this, code2, message, data); - } - [CONSUMEHEADER](chunk, position) { - if (this[SAW_VALID_ENTRY] === void 0) { - this[SAW_VALID_ENTRY] = false; + if (typeof chunk === "string") { + chunk = Buffer.from( + chunk, + /* c8 ignore next */ + typeof encoding === "string" ? encoding : "utf8" + ); } - let header; - try { - header = new Header(chunk, position, this[EX], this[GEX]); - } catch (er) { - return this.warn("TAR_ENTRY_INVALID", er); + if (this[ABORTED2]) { + cb?.(); + return false; } - if (header.nullBlock) { - if (this[SAW_NULL_BLOCK]) { - this[SAW_EOF] = true; - if (this[STATE] === "begin") { - this[STATE] = "header"; + const needSniff = this[UNZIP] === void 0 || this.brotli === void 0 && this[UNZIP] === false; + if (needSniff && chunk) { + if (this[BUFFER2]) { + chunk = Buffer.concat([this[BUFFER2], chunk]); + this[BUFFER2] = void 0; + } + if (chunk.length < ZIP_HEADER_LEN) { + this[BUFFER2] = chunk; + cb?.(); + return true; + } + for (let i = 0; this[UNZIP] === void 0 && i < gzipHeader.length; i++) { + if (chunk[i] !== gzipHeader[i]) { + this[UNZIP] = false; } - this[EMIT]("eof"); - } else { - this[SAW_NULL_BLOCK] = true; - this[EMIT]("nullBlock"); } - } else { - this[SAW_NULL_BLOCK] = false; - if (!header.cksumValid) { - this.warn("TAR_ENTRY_INVALID", "checksum failure", { header }); - } else if (!header.path) { - this.warn("TAR_ENTRY_INVALID", "path is required", { header }); - } else { - const type = header.type; - if (/^(Symbolic)?Link$/.test(type) && !header.linkpath) { - this.warn("TAR_ENTRY_INVALID", "linkpath required", { - header - }); - } else if (!/^(Symbolic)?Link$/.test(type) && !/^(Global)?ExtendedHeader$/.test(type) && header.linkpath) { - this.warn("TAR_ENTRY_INVALID", "linkpath forbidden", { - header - }); - } else { - const entry = this[WRITEENTRY] = new ReadEntry(header, this[EX], this[GEX]); - if (!this[SAW_VALID_ENTRY]) { - if (entry.remain) { - const onend = () => { - if (!entry.invalid) { - this[SAW_VALID_ENTRY] = true; - } - }; - entry.on("end", onend); - } else { - this[SAW_VALID_ENTRY] = true; - } + let isZstd = false; + if (this[UNZIP] === false && this.zstd !== false) { + isZstd = true; + for (let i = 0; i < zstdHeader.length; i++) { + if (chunk[i] !== zstdHeader[i]) { + isZstd = false; + break; } - if (entry.meta) { - if (entry.size > this.maxMetaEntrySize) { - entry.ignore = true; - this[EMIT]("ignoredEntry", entry); - this[STATE] = "ignore"; - entry.resume(); - } else if (entry.size > 0) { - this[META] = ""; - entry.on("data", (c) => this[META] += c); - this[STATE] = "meta"; - } + } + } + const maybeBrotli = this.brotli === void 0 && !isZstd; + if (this[UNZIP] === false && maybeBrotli) { + if (chunk.length < 512) { + if (this[ENDED]) { + this.brotli = true; } else { - this[EX] = void 0; - entry.ignore = entry.ignore || !this.filter(entry.path, entry); - if (entry.ignore) { - this[EMIT]("ignoredEntry", entry); - this[STATE] = entry.remain ? "ignore" : "header"; - entry.resume(); - } else { - if (entry.remain) { - this[STATE] = "body"; - } else { - this[STATE] = "header"; - entry.end(); - } - if (!this[READENTRY]) { - this[QUEUE].push(entry); - this[NEXTENTRY](); - } else { - this[QUEUE].push(entry); - } - } + this[BUFFER2] = chunk; + cb?.(); + return true; + } + } else { + try { + new Header(chunk.subarray(0, 512)); + this.brotli = false; + } catch (_) { + this.brotli = true; } } } + if (this[UNZIP] === void 0 || this[UNZIP] === false && (this.brotli || isZstd)) { + const ended = this[ENDED]; + this[ENDED] = false; + this[UNZIP] = this[UNZIP] === void 0 ? new Unzip({}) : isZstd ? new ZstdDecompress({}) : new BrotliDecompress({}); + this[UNZIP].on("data", (chunk2) => this[CONSUMECHUNK](chunk2)); + this[UNZIP].on("error", (er) => this.abort(er)); + this[UNZIP].on("end", () => { + this[ENDED] = true; + this[CONSUMECHUNK](); + }); + this[WRITING] = true; + const ret2 = !!this[UNZIP][ended ? "end" : "write"](chunk); + this[WRITING] = false; + cb?.(); + return ret2; + } } - } - [CLOSESTREAM]() { - queueMicrotask(() => this.emit("close")); - } - [PROCESSENTRY](entry) { - let go = true; - if (!entry) { - this[READENTRY] = void 0; - go = false; - } else if (Array.isArray(entry)) { - const [ev, ...args] = entry; - this.emit(ev, ...args); + this[WRITING] = true; + if (this[UNZIP]) { + this[UNZIP].write(chunk); } else { - this[READENTRY] = entry; - this.emit("entry", entry); - if (!entry.emittedEnd) { - entry.on("end", () => this[NEXTENTRY]()); - go = false; - } + this[CONSUMECHUNK](chunk); } - return go; - } - [NEXTENTRY]() { - do { - } while (this[PROCESSENTRY](this[QUEUE].shift())); - if (!this[QUEUE].length) { - const re = this[READENTRY]; - const drainNow = !re || re.flowing || re.size === re.remain; - if (drainNow) { - if (!this[WRITING]) { - this.emit("drain"); - } - } else { - re.once("drain", () => this.emit("drain")); - } - } - } - [CONSUMEBODY](chunk, position) { - const entry = this[WRITEENTRY]; - if (!entry) { - throw new Error("attempt to consume body without entry??"); - } - const br = entry.blockRemain ?? 0; - const c = br >= chunk.length && position === 0 ? chunk : chunk.subarray(position, position + br); - entry.write(c); - if (!entry.blockRemain) { - this[STATE] = "header"; - this[WRITEENTRY] = void 0; - entry.end(); - } - return c.length; - } - [CONSUMEMETA](chunk, position) { - const entry = this[WRITEENTRY]; - const ret = this[CONSUMEBODY](chunk, position); - if (!this[WRITEENTRY] && entry) { - this[EMITMETA](entry); - } - return ret; - } - [EMIT](ev, data, extra) { - if (!this[QUEUE].length && !this[READENTRY]) { - this.emit(ev, data, extra); - } else { - this[QUEUE].push([ev, data, extra]); - } - } - [EMITMETA](entry) { - this[EMIT]("meta", this[META]); - switch (entry.type) { - case "ExtendedHeader": - case "OldExtendedHeader": - this[EX] = Pax.parse(this[META], this[EX], false); - break; - case "GlobalExtendedHeader": - this[GEX] = Pax.parse(this[META], this[GEX], true); - break; - case "NextFileHasLongPath": - case "OldGnuLongPath": { - const ex = this[EX] ?? /* @__PURE__ */ Object.create(null); - this[EX] = ex; - ex.path = this[META].replace(/\0.*/, ""); - break; - } - case "NextFileHasLongLinkpath": { - const ex = this[EX] || /* @__PURE__ */ Object.create(null); - this[EX] = ex; - ex.linkpath = this[META].replace(/\0.*/, ""); - break; - } - /* c8 ignore start */ - default: - throw new Error("unknown meta: " + entry.type); - } - } - abort(error) { - this[ABORTED2] = true; - this.emit("abort", error); - this.warn("TAR_ABORT", error, { recoverable: false }); - } - write(chunk, encoding, cb) { - if (typeof encoding === "function") { - cb = encoding; - encoding = void 0; - } - if (typeof chunk === "string") { - chunk = Buffer.from( - chunk, - /* c8 ignore next */ - typeof encoding === "string" ? encoding : "utf8" - ); - } - if (this[ABORTED2]) { - cb?.(); - return false; - } - const needSniff = this[UNZIP] === void 0 || this.brotli === void 0 && this[UNZIP] === false; - if (needSniff && chunk) { - if (this[BUFFER2]) { - chunk = Buffer.concat([this[BUFFER2], chunk]); - this[BUFFER2] = void 0; - } - if (chunk.length < gzipHeader.length) { - this[BUFFER2] = chunk; - cb?.(); - return true; - } - for (let i = 0; this[UNZIP] === void 0 && i < gzipHeader.length; i++) { - if (chunk[i] !== gzipHeader[i]) { - this[UNZIP] = false; - } - } - const maybeBrotli = this.brotli === void 0; - if (this[UNZIP] === false && maybeBrotli) { - if (chunk.length < 512) { - if (this[ENDED]) { - this.brotli = true; - } else { - this[BUFFER2] = chunk; - cb?.(); - return true; - } - } else { - try { - new Header(chunk.subarray(0, 512)); - this.brotli = false; - } catch (_) { - this.brotli = true; - } - } - } - if (this[UNZIP] === void 0 || this[UNZIP] === false && this.brotli) { - const ended = this[ENDED]; - this[ENDED] = false; - this[UNZIP] = this[UNZIP] === void 0 ? new Unzip({}) : new BrotliDecompress({}); - this[UNZIP].on("data", (chunk2) => this[CONSUMECHUNK](chunk2)); - this[UNZIP].on("error", (er) => this.abort(er)); - this[UNZIP].on("end", () => { - this[ENDED] = true; - this[CONSUMECHUNK](); - }); - this[WRITING] = true; - const ret2 = !!this[UNZIP][ended ? "end" : "write"](chunk); - this[WRITING] = false; - cb?.(); - return ret2; - } - } - this[WRITING] = true; - if (this[UNZIP]) { - this[UNZIP].write(chunk); - } else { - this[CONSUMECHUNK](chunk); - } - this[WRITING] = false; - const ret = this[QUEUE].length ? false : this[READENTRY] ? this[READENTRY].flowing : true; - if (!ret && !this[QUEUE].length) { - this[READENTRY]?.once("drain", () => this.emit("drain")); - } - cb?.(); - return ret; + this[WRITING] = false; + const ret = this[QUEUE].length ? false : this[READENTRY] ? this[READENTRY].flowing : true; + if (!ret && !this[QUEUE].length) { + this[READENTRY]?.once("drain", () => this.emit("drain")); + } + cb?.(); + return ret; } [BUFFERCONCAT](c) { if (c && !this[ABORTED2]) { @@ -15516,7 +15422,7 @@ var init_parse = __esm({ this[UNZIP].end(); } else { this[ENDED] = true; - if (this.brotli === void 0) + if (this.brotli === void 0 || this.zstd === void 0) chunk = chunk || Buffer.alloc(0); if (chunk) this.write(chunk); @@ -15529,10 +15435,10 @@ var init_parse = __esm({ } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/strip-trailing-slashes.js +// .yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/strip-trailing-slashes.js var stripTrailingSlashes; var init_strip_trailing_slashes = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/strip-trailing-slashes.js"() { + ".yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/strip-trailing-slashes.js"() { stripTrailingSlashes = (str) => { let i = str.length - 1; let slashesStart = -1; @@ -15545,7 +15451,7 @@ var init_strip_trailing_slashes = __esm({ } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/list.js +// .yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/list.js var list_exports = {}; __export(list_exports, { filesFilter: () => filesFilter, @@ -15553,7 +15459,7 @@ __export(list_exports, { }); var import_node_fs, import_path2, onReadEntryFunction, filesFilter, listFileSync, listFile, list; var init_list = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/list.js"() { + ".yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/list.js"() { init_esm2(); import_node_fs = __toESM(require("node:fs"), 1); import_path2 = require("path"); @@ -15593,15 +15499,17 @@ var init_list = __esm({ const file = opt.file; let fd; try { - const stat2 = import_node_fs.default.statSync(file); + fd = import_node_fs.default.openSync(file, "r"); + const stat = import_node_fs.default.fstatSync(fd); const readSize = opt.maxReadSize || 16 * 1024 * 1024; - if (stat2.size < readSize) { - p.end(import_node_fs.default.readFileSync(file)); + if (stat.size < readSize) { + const buf = Buffer.allocUnsafe(stat.size); + import_node_fs.default.readSync(fd, buf, 0, stat.size, 0); + p.end(buf); } else { let pos2 = 0; const buf = Buffer.allocUnsafe(readSize); - fd = import_node_fs.default.openSync(file, "r"); - while (pos2 < stat2.size) { + while (pos2 < stat.size) { const bytesRead = import_node_fs.default.readSync(fd, buf, 0, readSize, pos2); pos2 += bytesRead; p.write(buf.subarray(0, bytesRead)); @@ -15618,22 +15526,22 @@ var init_list = __esm({ } }; listFile = (opt, _files) => { - const parse5 = new Parser(opt); + const parse4 = new Parser(opt); const readSize = opt.maxReadSize || 16 * 1024 * 1024; const file = opt.file; - const p = new Promise((resolve2, reject) => { - parse5.on("error", reject); - parse5.on("end", resolve2); - import_node_fs.default.stat(file, (er, stat2) => { + const p = new Promise((resolve, reject) => { + parse4.on("error", reject); + parse4.on("end", resolve); + import_node_fs.default.stat(file, (er, stat) => { if (er) { reject(er); } else { const stream = new ReadStream(file, { readSize, - size: stat2.size + size: stat.size }); stream.on("error", reject); - stream.pipe(parse5); + stream.pipe(parse4); } }); }); @@ -15648,10 +15556,10 @@ var init_list = __esm({ } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/get-write-flag.js +// .yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/get-write-flag.js var import_fs3, platform2, isWindows, O_CREAT, O_TRUNC, O_WRONLY, UV_FS_O_FILEMAP, fMapEnabled, fMapLimit, fMapFlag, getWriteFlag; var init_get_write_flag = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/get-write-flag.js"() { + ".yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/get-write-flag.js"() { import_fs3 = __toESM(require("fs"), 1); platform2 = process.env.__FAKE_PLATFORM__ || process.platform; isWindows = platform2 === "win32"; @@ -15666,7 +15574,7 @@ var init_get_write_flag = __esm({ // .yarn/cache/chownr-npm-3.0.0-5275e85d25-43925b8770.zip/node_modules/chownr/dist/esm/index.js var import_node_fs2, import_node_path3, lchownSync, chown, chownrKid, chownr, chownrKidSync, chownrSync; -var init_esm5 = __esm({ +var init_esm4 = __esm({ ".yarn/cache/chownr-npm-3.0.0-5275e85d25-43925b8770.zip/node_modules/chownr/dist/esm/index.js"() { import_node_fs2 = __toESM(require("node:fs"), 1); import_node_path3 = __toESM(require("node:path"), 1); @@ -15747,277 +15655,10 @@ var init_esm5 = __esm({ } }); -// .yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-9f2b975e92.zip/node_modules/mkdirp/dist/mjs/opts-arg.js -var import_fs4, optsArg; -var init_opts_arg = __esm({ - ".yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-9f2b975e92.zip/node_modules/mkdirp/dist/mjs/opts-arg.js"() { - import_fs4 = require("fs"); - optsArg = (opts) => { - if (!opts) { - opts = { mode: 511 }; - } else if (typeof opts === "object") { - opts = { mode: 511, ...opts }; - } else if (typeof opts === "number") { - opts = { mode: opts }; - } else if (typeof opts === "string") { - opts = { mode: parseInt(opts, 8) }; - } else { - throw new TypeError("invalid options argument"); - } - const resolved = opts; - const optsFs = opts.fs || {}; - opts.mkdir = opts.mkdir || optsFs.mkdir || import_fs4.mkdir; - opts.mkdirAsync = opts.mkdirAsync ? opts.mkdirAsync : async (path16, options) => { - return new Promise((res, rej) => resolved.mkdir(path16, options, (er, made) => er ? rej(er) : res(made))); - }; - opts.stat = opts.stat || optsFs.stat || import_fs4.stat; - opts.statAsync = opts.statAsync ? opts.statAsync : async (path16) => new Promise((res, rej) => resolved.stat(path16, (err, stats) => err ? rej(err) : res(stats))); - opts.statSync = opts.statSync || optsFs.statSync || import_fs4.statSync; - opts.mkdirSync = opts.mkdirSync || optsFs.mkdirSync || import_fs4.mkdirSync; - return resolved; - }; - } -}); - -// .yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-9f2b975e92.zip/node_modules/mkdirp/dist/mjs/mkdirp-manual.js -var import_path3, mkdirpManualSync, mkdirpManual; -var init_mkdirp_manual = __esm({ - ".yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-9f2b975e92.zip/node_modules/mkdirp/dist/mjs/mkdirp-manual.js"() { - import_path3 = require("path"); - init_opts_arg(); - mkdirpManualSync = (path16, options, made) => { - const parent = (0, import_path3.dirname)(path16); - const opts = { ...optsArg(options), recursive: false }; - if (parent === path16) { - try { - return opts.mkdirSync(path16, opts); - } catch (er) { - const fer = er; - if (fer && fer.code !== "EISDIR") { - throw er; - } - return; - } - } - try { - opts.mkdirSync(path16, opts); - return made || path16; - } catch (er) { - const fer = er; - if (fer && fer.code === "ENOENT") { - return mkdirpManualSync(path16, opts, mkdirpManualSync(parent, opts, made)); - } - if (fer && fer.code !== "EEXIST" && fer && fer.code !== "EROFS") { - throw er; - } - try { - if (!opts.statSync(path16).isDirectory()) - throw er; - } catch (_) { - throw er; - } - } - }; - mkdirpManual = Object.assign(async (path16, options, made) => { - const opts = optsArg(options); - opts.recursive = false; - const parent = (0, import_path3.dirname)(path16); - if (parent === path16) { - return opts.mkdirAsync(path16, opts).catch((er) => { - const fer = er; - if (fer && fer.code !== "EISDIR") { - throw er; - } - }); - } - return opts.mkdirAsync(path16, opts).then(() => made || path16, async (er) => { - const fer = er; - if (fer && fer.code === "ENOENT") { - return mkdirpManual(parent, opts).then((made2) => mkdirpManual(path16, opts, made2)); - } - if (fer && fer.code !== "EEXIST" && fer.code !== "EROFS") { - throw er; - } - return opts.statAsync(path16).then((st) => { - if (st.isDirectory()) { - return made; - } else { - throw er; - } - }, () => { - throw er; - }); - }); - }, { sync: mkdirpManualSync }); - } -}); - -// .yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-9f2b975e92.zip/node_modules/mkdirp/dist/mjs/find-made.js -var import_path4, findMade, findMadeSync; -var init_find_made = __esm({ - ".yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-9f2b975e92.zip/node_modules/mkdirp/dist/mjs/find-made.js"() { - import_path4 = require("path"); - findMade = async (opts, parent, path16) => { - if (path16 === parent) { - return; - } - return opts.statAsync(parent).then( - (st) => st.isDirectory() ? path16 : void 0, - // will fail later - // will fail later - (er) => { - const fer = er; - return fer && fer.code === "ENOENT" ? findMade(opts, (0, import_path4.dirname)(parent), parent) : void 0; - } - ); - }; - findMadeSync = (opts, parent, path16) => { - if (path16 === parent) { - return void 0; - } - try { - return opts.statSync(parent).isDirectory() ? path16 : void 0; - } catch (er) { - const fer = er; - return fer && fer.code === "ENOENT" ? findMadeSync(opts, (0, import_path4.dirname)(parent), parent) : void 0; - } - }; - } -}); - -// .yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-9f2b975e92.zip/node_modules/mkdirp/dist/mjs/mkdirp-native.js -var import_path5, mkdirpNativeSync, mkdirpNative; -var init_mkdirp_native = __esm({ - ".yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-9f2b975e92.zip/node_modules/mkdirp/dist/mjs/mkdirp-native.js"() { - import_path5 = require("path"); - init_find_made(); - init_mkdirp_manual(); - init_opts_arg(); - mkdirpNativeSync = (path16, options) => { - const opts = optsArg(options); - opts.recursive = true; - const parent = (0, import_path5.dirname)(path16); - if (parent === path16) { - return opts.mkdirSync(path16, opts); - } - const made = findMadeSync(opts, path16); - try { - opts.mkdirSync(path16, opts); - return made; - } catch (er) { - const fer = er; - if (fer && fer.code === "ENOENT") { - return mkdirpManualSync(path16, opts); - } else { - throw er; - } - } - }; - mkdirpNative = Object.assign(async (path16, options) => { - const opts = { ...optsArg(options), recursive: true }; - const parent = (0, import_path5.dirname)(path16); - if (parent === path16) { - return await opts.mkdirAsync(path16, opts); - } - return findMade(opts, path16).then((made) => opts.mkdirAsync(path16, opts).then((m) => made || m).catch((er) => { - const fer = er; - if (fer && fer.code === "ENOENT") { - return mkdirpManual(path16, opts); - } else { - throw er; - } - })); - }, { sync: mkdirpNativeSync }); - } -}); - -// .yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-9f2b975e92.zip/node_modules/mkdirp/dist/mjs/path-arg.js -var import_path6, platform3, pathArg; -var init_path_arg = __esm({ - ".yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-9f2b975e92.zip/node_modules/mkdirp/dist/mjs/path-arg.js"() { - import_path6 = require("path"); - platform3 = process.env.__TESTING_MKDIRP_PLATFORM__ || process.platform; - pathArg = (path16) => { - if (/\0/.test(path16)) { - throw Object.assign(new TypeError("path must be a string without null bytes"), { - path: path16, - code: "ERR_INVALID_ARG_VALUE" - }); - } - path16 = (0, import_path6.resolve)(path16); - if (platform3 === "win32") { - const badWinChars = /[*|"<>?:]/; - const { root } = (0, import_path6.parse)(path16); - if (badWinChars.test(path16.substring(root.length))) { - throw Object.assign(new Error("Illegal characters in path."), { - path: path16, - code: "EINVAL" - }); - } - } - return path16; - }; - } -}); - -// .yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-9f2b975e92.zip/node_modules/mkdirp/dist/mjs/use-native.js -var import_fs5, version2, versArr, hasNative, useNativeSync, useNative; -var init_use_native = __esm({ - ".yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-9f2b975e92.zip/node_modules/mkdirp/dist/mjs/use-native.js"() { - import_fs5 = require("fs"); - init_opts_arg(); - version2 = process.env.__TESTING_MKDIRP_NODE_VERSION__ || process.version; - versArr = version2.replace(/^v/, "").split("."); - hasNative = +versArr[0] > 10 || +versArr[0] === 10 && +versArr[1] >= 12; - useNativeSync = !hasNative ? () => false : (opts) => optsArg(opts).mkdirSync === import_fs5.mkdirSync; - useNative = Object.assign(!hasNative ? () => false : (opts) => optsArg(opts).mkdir === import_fs5.mkdir, { - sync: useNativeSync - }); - } -}); - -// .yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-9f2b975e92.zip/node_modules/mkdirp/dist/mjs/index.js -var mkdirpSync, mkdirp; -var init_mjs = __esm({ - ".yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-9f2b975e92.zip/node_modules/mkdirp/dist/mjs/index.js"() { - init_mkdirp_manual(); - init_mkdirp_native(); - init_opts_arg(); - init_path_arg(); - init_use_native(); - init_mkdirp_manual(); - init_mkdirp_native(); - init_use_native(); - mkdirpSync = (path16, opts) => { - path16 = pathArg(path16); - const resolved = optsArg(opts); - return useNativeSync(resolved) ? mkdirpNativeSync(path16, resolved) : mkdirpManualSync(path16, resolved); - }; - mkdirp = Object.assign(async (path16, opts) => { - path16 = pathArg(path16); - const resolved = optsArg(opts); - return useNative(resolved) ? mkdirpNative(path16, resolved) : mkdirpManual(path16, resolved); - }, { - mkdirpSync, - mkdirpNative, - mkdirpNativeSync, - mkdirpManual, - mkdirpManualSync, - sync: mkdirpSync, - native: mkdirpNative, - nativeSync: mkdirpNativeSync, - manual: mkdirpManual, - manualSync: mkdirpManualSync, - useNative, - useNativeSync - }); - } -}); - -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/cwd-error.js +// .yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/cwd-error.js var CwdError; var init_cwd_error = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/cwd-error.js"() { + ".yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/cwd-error.js"() { CwdError = class extends Error { path; code; @@ -16034,10 +15675,10 @@ var init_cwd_error = __esm({ } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/symlink-error.js +// .yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/symlink-error.js var SymlinkError; var init_symlink_error = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/symlink-error.js"() { + ".yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/symlink-error.js"() { SymlinkError = class extends Error { path; symlink; @@ -16055,28 +15696,26 @@ var init_symlink_error = __esm({ } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/mkdir.js -var import_fs6, import_node_path4, cGet, cSet, checkCwd, mkdir3, mkdir_, onmkdir, checkCwdSync, mkdirSync4; +// .yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/mkdir.js +var import_node_fs3, import_promises, import_node_path4, checkCwd, mkdir, mkdir_, onmkdir, checkCwdSync, mkdirSync2; var init_mkdir = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/mkdir.js"() { - init_esm5(); - import_fs6 = __toESM(require("fs"), 1); - init_mjs(); + ".yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/mkdir.js"() { + init_esm4(); + import_node_fs3 = __toESM(require("node:fs"), 1); + import_promises = __toESM(require("node:fs/promises"), 1); import_node_path4 = __toESM(require("node:path"), 1); init_cwd_error(); init_normalize_windows_path(); init_symlink_error(); - cGet = (cache, key) => cache.get(normalizeWindowsPath(key)); - cSet = (cache, key, val) => cache.set(normalizeWindowsPath(key), val); checkCwd = (dir, cb) => { - import_fs6.default.stat(dir, (er, st) => { + import_node_fs3.default.stat(dir, (er, st) => { if (er || !st.isDirectory()) { er = new CwdError(dir, er?.code || "ENOTDIR"); } cb(er); }); }; - mkdir3 = (dir, opt, cb) => { + mkdir = (dir, opt, cb) => { dir = normalizeWindowsPath(dir); const umask = opt.umask ?? 18; const mode = opt.mode | 448; @@ -16086,30 +15725,25 @@ var init_mkdir = __esm({ const doChown = typeof uid === "number" && typeof gid === "number" && (uid !== opt.processUid || gid !== opt.processGid); const preserve = opt.preserve; const unlink = opt.unlink; - const cache = opt.cache; const cwd = normalizeWindowsPath(opt.cwd); const done = (er, created) => { if (er) { cb(er); } else { - cSet(cache, dir, true); if (created && doChown) { chownr(created, uid, gid, (er2) => done(er2)); } else if (needChmod) { - import_fs6.default.chmod(dir, mode, cb); + import_node_fs3.default.chmod(dir, mode, cb); } else { cb(); } } }; - if (cache && cGet(cache, dir) === true) { - return done(); - } if (dir === cwd) { return checkCwd(dir, done); } if (preserve) { - return mkdirp(dir, { mode }).then( + return import_promises.default.mkdir(dir, { mode, recursive: true }).then( (made) => done(null, made ?? void 0), // oh, ts done @@ -16117,33 +15751,30 @@ var init_mkdir = __esm({ } const sub = normalizeWindowsPath(import_node_path4.default.relative(cwd, dir)); const parts = sub.split("/"); - mkdir_(cwd, parts, mode, cache, unlink, cwd, void 0, done); + mkdir_(cwd, parts, mode, unlink, cwd, void 0, done); }; - mkdir_ = (base, parts, mode, cache, unlink, cwd, created, cb) => { + mkdir_ = (base, parts, mode, unlink, cwd, created, cb) => { if (!parts.length) { return cb(null, created); } const p = parts.shift(); const part = normalizeWindowsPath(import_node_path4.default.resolve(base + "/" + p)); - if (cGet(cache, part)) { - return mkdir_(part, parts, mode, cache, unlink, cwd, created, cb); - } - import_fs6.default.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb)); + import_node_fs3.default.mkdir(part, mode, onmkdir(part, parts, mode, unlink, cwd, created, cb)); }; - onmkdir = (part, parts, mode, cache, unlink, cwd, created, cb) => (er) => { + onmkdir = (part, parts, mode, unlink, cwd, created, cb) => (er) => { if (er) { - import_fs6.default.lstat(part, (statEr, st) => { + import_node_fs3.default.lstat(part, (statEr, st) => { if (statEr) { statEr.path = statEr.path && normalizeWindowsPath(statEr.path); cb(statEr); } else if (st.isDirectory()) { - mkdir_(part, parts, mode, cache, unlink, cwd, created, cb); + mkdir_(part, parts, mode, unlink, cwd, created, cb); } else if (unlink) { - import_fs6.default.unlink(part, (er2) => { + import_node_fs3.default.unlink(part, (er2) => { if (er2) { return cb(er2); } - import_fs6.default.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb)); + import_node_fs3.default.mkdir(part, mode, onmkdir(part, parts, mode, unlink, cwd, created, cb)); }); } else if (st.isSymbolicLink()) { return cb(new SymlinkError(part, part + "/" + parts.join("/"))); @@ -16153,14 +15784,14 @@ var init_mkdir = __esm({ }); } else { created = created || part; - mkdir_(part, parts, mode, cache, unlink, cwd, created, cb); + mkdir_(part, parts, mode, unlink, cwd, created, cb); } }; checkCwdSync = (dir) => { let ok = false; let code2 = void 0; try { - ok = import_fs6.default.statSync(dir).isDirectory(); + ok = import_node_fs3.default.statSync(dir).isDirectory(); } catch (er) { code2 = er?.code; } finally { @@ -16169,7 +15800,7 @@ var init_mkdir = __esm({ } } }; - mkdirSync4 = (dir, opt) => { + mkdirSync2 = (dir, opt) => { dir = normalizeWindowsPath(dir); const umask = opt.umask ?? 18; const mode = opt.mode | 448; @@ -16179,49 +15810,38 @@ var init_mkdir = __esm({ const doChown = typeof uid === "number" && typeof gid === "number" && (uid !== opt.processUid || gid !== opt.processGid); const preserve = opt.preserve; const unlink = opt.unlink; - const cache = opt.cache; const cwd = normalizeWindowsPath(opt.cwd); const done = (created2) => { - cSet(cache, dir, true); if (created2 && doChown) { chownrSync(created2, uid, gid); } if (needChmod) { - import_fs6.default.chmodSync(dir, mode); + import_node_fs3.default.chmodSync(dir, mode); } }; - if (cache && cGet(cache, dir) === true) { - return done(); - } if (dir === cwd) { checkCwdSync(cwd); return done(); } if (preserve) { - return done(mkdirpSync(dir, mode) ?? void 0); + return done(import_node_fs3.default.mkdirSync(dir, { mode, recursive: true }) ?? void 0); } const sub = normalizeWindowsPath(import_node_path4.default.relative(cwd, dir)); const parts = sub.split("/"); let created = void 0; for (let p = parts.shift(), part = cwd; p && (part += "/" + p); p = parts.shift()) { part = normalizeWindowsPath(import_node_path4.default.resolve(part)); - if (cGet(cache, part)) { - continue; - } try { - import_fs6.default.mkdirSync(part, mode); + import_node_fs3.default.mkdirSync(part, mode); created = created || part; - cSet(cache, part, true); } catch (er) { - const st = import_fs6.default.lstatSync(part); + const st = import_node_fs3.default.lstatSync(part); if (st.isDirectory()) { - cSet(cache, part, true); continue; } else if (unlink) { - import_fs6.default.unlinkSync(part); - import_fs6.default.mkdirSync(part, mode); + import_node_fs3.default.unlinkSync(part); + import_node_fs3.default.mkdirSync(part, mode); created = created || part; - cSet(cache, part, true); continue; } else if (st.isSymbolicLink()) { return new SymlinkError(part, part + "/" + parts.join("/")); @@ -16233,45 +15853,30 @@ var init_mkdir = __esm({ } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/normalize-unicode.js -var normalizeCache, hasOwnProperty, normalizeUnicode; -var init_normalize_unicode = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/normalize-unicode.js"() { - normalizeCache = /* @__PURE__ */ Object.create(null); - ({ hasOwnProperty } = Object.prototype); - normalizeUnicode = (s) => { - if (!hasOwnProperty.call(normalizeCache, s)) { - normalizeCache[s] = s.normalize("NFD"); - } - return normalizeCache[s]; - }; - } -}); - -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/strip-absolute-path.js -var import_node_path5, isAbsolute, parse4, stripAbsolutePath; +// .yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/strip-absolute-path.js +var import_node_path5, isAbsolute, parse3, stripAbsolutePath; var init_strip_absolute_path = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/strip-absolute-path.js"() { + ".yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/strip-absolute-path.js"() { import_node_path5 = require("node:path"); - ({ isAbsolute, parse: parse4 } = import_node_path5.win32); + ({ isAbsolute, parse: parse3 } = import_node_path5.win32); stripAbsolutePath = (path16) => { let r = ""; - let parsed = parse4(path16); + let parsed = parse3(path16); while (isAbsolute(path16) || parsed.root) { const root = path16.charAt(0) === "/" && path16.slice(0, 4) !== "//?/" ? "/" : parsed.root; path16 = path16.slice(root.length); r += root; - parsed = parse4(path16); + parsed = parse3(path16); } return [r, path16]; }; } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/winchars.js +// .yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/winchars.js var raw, win, toWin, toRaw, encode2, decode; var init_winchars = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/winchars.js"() { + ".yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/winchars.js"() { raw = ["|", "<", ">", "?", ":"]; win = raw.map((char) => String.fromCharCode(61440 + char.charCodeAt(0))); toWin = new Map(raw.map((char, i) => [char, win[i]])); @@ -16281,15 +15886,44 @@ var init_winchars = __esm({ } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/path-reservations.js -var import_node_path6, platform4, isWindows2, getDirs, PathReservations; -var init_path_reservations = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/path-reservations.js"() { +// .yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/normalize-unicode.js +var normalizeCache, MAX, cache, normalizeUnicode; +var init_normalize_unicode = __esm({ + ".yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/normalize-unicode.js"() { + normalizeCache = /* @__PURE__ */ Object.create(null); + MAX = 1e4; + cache = /* @__PURE__ */ new Set(); + normalizeUnicode = (s) => { + if (!cache.has(s)) { + normalizeCache[s] = s.normalize("NFD"); + } else { + cache.delete(s); + } + cache.add(s); + const ret = normalizeCache[s]; + let i = cache.size - MAX; + if (i > MAX / 10) { + for (const s2 of cache) { + cache.delete(s2); + delete normalizeCache[s2]; + if (--i <= 0) + break; + } + } + return ret; + }; + } +}); + +// .yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/path-reservations.js +var import_node_path6, platform3, isWindows2, getDirs, PathReservations; +var init_path_reservations = __esm({ + ".yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/path-reservations.js"() { import_node_path6 = require("node:path"); init_normalize_unicode(); init_strip_trailing_slashes(); - platform4 = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; - isWindows2 = platform4 === "win32"; + platform3 = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; + isWindows2 = platform3 === "win32"; getDirs = (path16) => { const dirs = path16.split("/").slice(0, -1).reduce((set, path17) => { const s = set[set.length - 1]; @@ -16421,28 +16055,25 @@ var init_path_reservations = __esm({ } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/unpack.js -var import_node_assert, import_node_crypto, import_node_fs3, import_node_path7, ONENTRY, CHECKFS, CHECKFS2, PRUNECACHE, ISREUSABLE, MAKEFS, FILE, DIRECTORY, LINK, SYMLINK, HARDLINK, UNSUPPORTED, CHECKPATH, MKDIR, ONERROR, PENDING, PEND, UNPEND, ENDED2, MAYBECLOSE, SKIP, DOCHOWN, UID, GID, CHECKED_CWD, platform5, isWindows3, DEFAULT_MAX_DEPTH, unlinkFile, unlinkFileSync, uint32, cacheKeyNormalize, pruneCache, dropCache, Unpack, callSync, UnpackSync; +// .yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/unpack.js +var import_node_assert, import_node_crypto, import_node_fs4, import_node_path7, ONENTRY, CHECKFS, CHECKFS2, ISREUSABLE, MAKEFS, FILE, DIRECTORY, LINK, SYMLINK, HARDLINK, UNSUPPORTED, CHECKPATH, MKDIR, ONERROR, PENDING, PEND, UNPEND, ENDED2, MAYBECLOSE, SKIP, DOCHOWN, UID, GID, CHECKED_CWD, platform4, isWindows3, DEFAULT_MAX_DEPTH, unlinkFile, unlinkFileSync, uint32, Unpack, callSync, UnpackSync; var init_unpack = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/unpack.js"() { + ".yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/unpack.js"() { init_esm2(); import_node_assert = __toESM(require("node:assert"), 1); import_node_crypto = require("node:crypto"); - import_node_fs3 = __toESM(require("node:fs"), 1); + import_node_fs4 = __toESM(require("node:fs"), 1); import_node_path7 = __toESM(require("node:path"), 1); init_get_write_flag(); init_mkdir(); - init_normalize_unicode(); init_normalize_windows_path(); init_parse(); init_strip_absolute_path(); - init_strip_trailing_slashes(); init_winchars(); init_path_reservations(); ONENTRY = Symbol("onEntry"); CHECKFS = Symbol("checkFs"); CHECKFS2 = Symbol("checkFs2"); - PRUNECACHE = Symbol("pruneCache"); ISREUSABLE = Symbol("isReusable"); MAKEFS = Symbol("makeFs"); FILE = Symbol("file"); @@ -16464,45 +16095,30 @@ var init_unpack = __esm({ UID = Symbol("uid"); GID = Symbol("gid"); CHECKED_CWD = Symbol("checkedCwd"); - platform5 = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; - isWindows3 = platform5 === "win32"; + platform4 = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; + isWindows3 = platform4 === "win32"; DEFAULT_MAX_DEPTH = 1024; unlinkFile = (path16, cb) => { if (!isWindows3) { - return import_node_fs3.default.unlink(path16, cb); + return import_node_fs4.default.unlink(path16, cb); } const name2 = path16 + ".DELETE." + (0, import_node_crypto.randomBytes)(16).toString("hex"); - import_node_fs3.default.rename(path16, name2, (er) => { + import_node_fs4.default.rename(path16, name2, (er) => { if (er) { return cb(er); } - import_node_fs3.default.unlink(name2, cb); + import_node_fs4.default.unlink(name2, cb); }); }; unlinkFileSync = (path16) => { if (!isWindows3) { - return import_node_fs3.default.unlinkSync(path16); + return import_node_fs4.default.unlinkSync(path16); } const name2 = path16 + ".DELETE." + (0, import_node_crypto.randomBytes)(16).toString("hex"); - import_node_fs3.default.renameSync(path16, name2); - import_node_fs3.default.unlinkSync(name2); + import_node_fs4.default.renameSync(path16, name2); + import_node_fs4.default.unlinkSync(name2); }; uint32 = (a, b, c) => a !== void 0 && a === a >>> 0 ? a : b !== void 0 && b === b >>> 0 ? b : c; - cacheKeyNormalize = (path16) => stripTrailingSlashes(normalizeWindowsPath(normalizeUnicode(path16))).toLowerCase(); - pruneCache = (cache, abs) => { - abs = cacheKeyNormalize(abs); - for (const path16 of cache.keys()) { - const pnorm = cacheKeyNormalize(path16); - if (pnorm === abs || pnorm.indexOf(abs + "/") === 0) { - cache.delete(path16); - } - } - }; - dropCache = (cache) => { - for (const key of cache.keys()) { - cache.delete(key); - } - }; Unpack = class extends Parser { [ENDED2] = false; [CHECKED_CWD] = false; @@ -16511,7 +16127,6 @@ var init_unpack = __esm({ transform; writable = true; readable = false; - dirCache; uid; gid; setOwner; @@ -16540,7 +16155,6 @@ var init_unpack = __esm({ }; super(opt); this.transform = opt.transform; - this.dirCache = opt.dirCache || /* @__PURE__ */ new Map(); this.chmod = !!opt.chmod; if (typeof opt.uid === "number" || typeof opt.gid === "number") { if (typeof opt.uid !== "number" || typeof opt.gid !== "number") { @@ -16701,7 +16315,7 @@ var init_unpack = __esm({ } } [MKDIR](dir, mode, cb) { - mkdir3(normalizeWindowsPath(dir), { + mkdir(normalizeWindowsPath(dir), { uid: this.uid, gid: this.gid, processUid: this.processUid, @@ -16709,7 +16323,6 @@ var init_unpack = __esm({ umask: this.processUmask, preserve: this.preservePaths, unlink: this.unlink, - cache: this.dirCache, cwd: this.cwd, mode }, cb); @@ -16733,7 +16346,7 @@ var init_unpack = __esm({ }); stream.on("error", (er) => { if (stream.fd) { - import_node_fs3.default.close(stream.fd, () => { + import_node_fs4.default.close(stream.fd, () => { }); } stream.write = () => true; @@ -16744,7 +16357,7 @@ var init_unpack = __esm({ const done = (er) => { if (er) { if (stream.fd) { - import_node_fs3.default.close(stream.fd, () => { + import_node_fs4.default.close(stream.fd, () => { }); } this[ONERROR](er, entry); @@ -16753,7 +16366,7 @@ var init_unpack = __esm({ } if (--actions === 0) { if (stream.fd !== void 0) { - import_node_fs3.default.close(stream.fd, (er2) => { + import_node_fs4.default.close(stream.fd, (er2) => { if (er2) { this[ONERROR](er2, entry); } else { @@ -16771,14 +16384,14 @@ var init_unpack = __esm({ actions++; const atime = entry.atime || /* @__PURE__ */ new Date(); const mtime = entry.mtime; - import_node_fs3.default.futimes(fd, atime, mtime, (er) => er ? import_node_fs3.default.utimes(abs, atime, mtime, (er2) => done(er2 && er)) : done()); + import_node_fs4.default.futimes(fd, atime, mtime, (er) => er ? import_node_fs4.default.utimes(abs, atime, mtime, (er2) => done(er2 && er)) : done()); } if (typeof fd === "number" && this[DOCHOWN](entry)) { actions++; const uid = this[UID](entry); const gid = this[GID](entry); if (typeof uid === "number" && typeof gid === "number") { - import_node_fs3.default.fchown(fd, uid, gid, (er) => er ? import_node_fs3.default.chown(abs, uid, gid, (er2) => done(er2 && er)) : done()); + import_node_fs4.default.fchown(fd, uid, gid, (er) => er ? import_node_fs4.default.chown(abs, uid, gid, (er2) => done(er2 && er)) : done()); } } done(); @@ -16811,11 +16424,11 @@ var init_unpack = __esm({ }; if (entry.mtime && !this.noMtime) { actions++; - import_node_fs3.default.utimes(String(entry.absolute), entry.atime || /* @__PURE__ */ new Date(), entry.mtime, done); + import_node_fs4.default.utimes(String(entry.absolute), entry.atime || /* @__PURE__ */ new Date(), entry.mtime, done); } if (this[DOCHOWN](entry)) { actions++; - import_node_fs3.default.chown(String(entry.absolute), Number(this[UID](entry)), Number(this[GID](entry)), done); + import_node_fs4.default.chown(String(entry.absolute), Number(this[UID](entry)), Number(this[GID](entry)), done); } done(); }); @@ -16858,17 +16471,8 @@ var init_unpack = __esm({ } this.reservations.reserve(paths, (done) => this[CHECKFS2](entry, done)); } - [PRUNECACHE](entry) { - if (entry.type === "SymbolicLink") { - dropCache(this.dirCache); - } else if (entry.type !== "Directory") { - pruneCache(this.dirCache, String(entry.absolute)); - } - } [CHECKFS2](entry, fullyDone) { - this[PRUNECACHE](entry); const done = (er) => { - this[PRUNECACHE](entry); fullyDone(er); }; const checkCwd2 = () => { @@ -16899,7 +16503,7 @@ var init_unpack = __esm({ afterMakeParent(); }; const afterMakeParent = () => { - import_node_fs3.default.lstat(String(entry.absolute), (lstatEr, st) => { + import_node_fs4.default.lstat(String(entry.absolute), (lstatEr, st) => { if (st && (this.keep || /* c8 ignore next */ this.newer && st.mtime > (entry.mtime ?? st.mtime))) { this[SKIP](entry); @@ -16916,10 +16520,10 @@ var init_unpack = __esm({ if (!needChmod) { return afterChmod(); } - return import_node_fs3.default.chmod(String(entry.absolute), Number(entry.mode), afterChmod); + return import_node_fs4.default.chmod(String(entry.absolute), Number(entry.mode), afterChmod); } if (entry.absolute !== this.cwd) { - return import_node_fs3.default.rmdir(String(entry.absolute), (er) => this[MAKEFS](er ?? null, entry, done)); + return import_node_fs4.default.rmdir(String(entry.absolute), (er) => this[MAKEFS](er ?? null, entry, done)); } } if (entry.absolute === this.cwd) { @@ -16955,7 +16559,7 @@ var init_unpack = __esm({ } } [LINK](entry, linkpath, link, done) { - import_node_fs3.default[link](linkpath, String(entry.absolute), (er) => { + import_node_fs4.default[link](linkpath, String(entry.absolute), (er) => { if (er) { this[ONERROR](er, entry); } else { @@ -16980,7 +16584,6 @@ var init_unpack = __esm({ }); } [CHECKFS](entry) { - this[PRUNECACHE](entry); if (!this[CHECKED_CWD]) { const er2 = this[MKDIR](this.cwd, this.dmode); if (er2) { @@ -16997,7 +16600,7 @@ var init_unpack = __esm({ } } } - const [lstatEr, st] = callSync(() => import_node_fs3.default.lstatSync(String(entry.absolute))); + const [lstatEr, st] = callSync(() => import_node_fs4.default.lstatSync(String(entry.absolute))); if (st && (this.keep || /* c8 ignore next */ this.newer && st.mtime > (entry.mtime ?? st.mtime))) { return this[SKIP](entry); @@ -17009,11 +16612,11 @@ var init_unpack = __esm({ if (entry.type === "Directory") { const needChmod = this.chmod && entry.mode && (st.mode & 4095) !== entry.mode; const [er3] = needChmod ? callSync(() => { - import_node_fs3.default.chmodSync(String(entry.absolute), Number(entry.mode)); + import_node_fs4.default.chmodSync(String(entry.absolute), Number(entry.mode)); }) : []; return this[MAKEFS](er3, entry); } - const [er2] = callSync(() => import_node_fs3.default.rmdirSync(String(entry.absolute))); + const [er2] = callSync(() => import_node_fs4.default.rmdirSync(String(entry.absolute))); this[MAKEFS](er2, entry); } const [er] = entry.absolute === this.cwd ? [] : callSync(() => unlinkFileSync(String(entry.absolute))); @@ -17024,7 +16627,7 @@ var init_unpack = __esm({ const oner = (er) => { let closeError; try { - import_node_fs3.default.closeSync(fd); + import_node_fs4.default.closeSync(fd); } catch (e) { closeError = e; } @@ -17035,7 +16638,7 @@ var init_unpack = __esm({ }; let fd; try { - fd = import_node_fs3.default.openSync(String(entry.absolute), getWriteFlag(entry.size), mode); + fd = import_node_fs4.default.openSync(String(entry.absolute), getWriteFlag(entry.size), mode); } catch (er) { return oner(er); } @@ -17046,7 +16649,7 @@ var init_unpack = __esm({ } tx.on("data", (chunk) => { try { - import_node_fs3.default.writeSync(fd, chunk, 0, chunk.length); + import_node_fs4.default.writeSync(fd, chunk, 0, chunk.length); } catch (er) { oner(er); } @@ -17057,10 +16660,10 @@ var init_unpack = __esm({ const atime = entry.atime || /* @__PURE__ */ new Date(); const mtime = entry.mtime; try { - import_node_fs3.default.futimesSync(fd, atime, mtime); + import_node_fs4.default.futimesSync(fd, atime, mtime); } catch (futimeser) { try { - import_node_fs3.default.utimesSync(String(entry.absolute), atime, mtime); + import_node_fs4.default.utimesSync(String(entry.absolute), atime, mtime); } catch (utimeser) { er = futimeser; } @@ -17070,10 +16673,10 @@ var init_unpack = __esm({ const uid = this[UID](entry); const gid = this[GID](entry); try { - import_node_fs3.default.fchownSync(fd, Number(uid), Number(gid)); + import_node_fs4.default.fchownSync(fd, Number(uid), Number(gid)); } catch (fchowner) { try { - import_node_fs3.default.chownSync(String(entry.absolute), Number(uid), Number(gid)); + import_node_fs4.default.chownSync(String(entry.absolute), Number(uid), Number(gid)); } catch (chowner) { er = er || fchowner; } @@ -17092,13 +16695,13 @@ var init_unpack = __esm({ } if (entry.mtime && !this.noMtime) { try { - import_node_fs3.default.utimesSync(String(entry.absolute), entry.atime || /* @__PURE__ */ new Date(), entry.mtime); + import_node_fs4.default.utimesSync(String(entry.absolute), entry.atime || /* @__PURE__ */ new Date(), entry.mtime); } catch (er2) { } } if (this[DOCHOWN](entry)) { try { - import_node_fs3.default.chownSync(String(entry.absolute), Number(this[UID](entry)), Number(this[GID](entry))); + import_node_fs4.default.chownSync(String(entry.absolute), Number(this[UID](entry)), Number(this[GID](entry))); } catch (er2) { } } @@ -17107,7 +16710,7 @@ var init_unpack = __esm({ } [MKDIR](dir, mode) { try { - return mkdirSync4(normalizeWindowsPath(dir), { + return mkdirSync2(normalizeWindowsPath(dir), { uid: this.uid, gid: this.gid, processUid: this.processUid, @@ -17115,7 +16718,6 @@ var init_unpack = __esm({ umask: this.processUmask, preserve: this.preservePaths, unlink: this.unlink, - cache: this.dirCache, cwd: this.cwd, mode }); @@ -17126,7 +16728,7 @@ var init_unpack = __esm({ [LINK](entry, linkpath, link, done) { const ls = `${link}Sync`; try { - import_node_fs3.default[ls](linkpath, String(entry.absolute)); + import_node_fs4.default[ls](linkpath, String(entry.absolute)); done(); entry.resume(); } catch (er) { @@ -17137,27 +16739,27 @@ var init_unpack = __esm({ } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/extract.js +// .yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/extract.js var extract_exports = {}; __export(extract_exports, { extract: () => extract }); -var import_node_fs4, extractFileSync, extractFile, extract; +var import_node_fs5, extractFileSync, extractFile, extract; var init_extract = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/extract.js"() { + ".yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/extract.js"() { init_esm2(); - import_node_fs4 = __toESM(require("node:fs"), 1); + import_node_fs5 = __toESM(require("node:fs"), 1); init_list(); init_make_command(); init_unpack(); extractFileSync = (opt) => { const u = new UnpackSync(opt); const file = opt.file; - const stat2 = import_node_fs4.default.statSync(file); + const stat = import_node_fs5.default.statSync(file); const readSize = opt.maxReadSize || 16 * 1024 * 1024; const stream = new ReadStreamSync(file, { readSize, - size: stat2.size + size: stat.size }); stream.pipe(u); }; @@ -17165,16 +16767,16 @@ var init_extract = __esm({ const u = new Unpack(opt); const readSize = opt.maxReadSize || 16 * 1024 * 1024; const file = opt.file; - const p = new Promise((resolve2, reject) => { + const p = new Promise((resolve, reject) => { u.on("error", reject); - u.on("close", resolve2); - import_node_fs4.default.stat(file, (er, stat2) => { + u.on("close", resolve); + import_node_fs5.default.stat(file, (er, stat) => { if (er) { reject(er); } else { const stream = new ReadStream(file, { readSize, - size: stat2.size + size: stat.size }); stream.on("error", reject); stream.pipe(u); @@ -17200,7 +16802,7 @@ var require_v8_compile_cache = __commonJS({ var path16 = require("path"); var vm = require("vm"); var os3 = require("os"); - var hasOwnProperty2 = Object.prototype.hasOwnProperty; + var hasOwnProperty = Object.prototype.hasOwnProperty; var FileSystemBlobStore = class { constructor(directory, prefix) { const name2 = prefix ? slashEscape(prefix + ".") : ""; @@ -17211,19 +16813,19 @@ var require_v8_compile_cache = __commonJS({ this._load(); } has(key, invalidationKey) { - if (hasOwnProperty2.call(this._memoryBlobs, key)) { + if (hasOwnProperty.call(this._memoryBlobs, key)) { return this._invalidationKeys[key] === invalidationKey; - } else if (hasOwnProperty2.call(this._storedMap, key)) { + } else if (hasOwnProperty.call(this._storedMap, key)) { return this._storedMap[key][0] === invalidationKey; } return false; } get(key, invalidationKey) { - if (hasOwnProperty2.call(this._memoryBlobs, key)) { + if (hasOwnProperty.call(this._memoryBlobs, key)) { if (this._invalidationKeys[key] === invalidationKey) { return this._memoryBlobs[key]; } - } else if (hasOwnProperty2.call(this._storedMap, key)) { + } else if (hasOwnProperty.call(this._storedMap, key)) { const mapping = this._storedMap[key]; if (mapping[0] === invalidationKey) { return this._storedBlob.slice(mapping[1], mapping[2]); @@ -17236,15 +16838,15 @@ var require_v8_compile_cache = __commonJS({ this._dirty = true; } delete(key) { - if (hasOwnProperty2.call(this._memoryBlobs, key)) { + if (hasOwnProperty.call(this._memoryBlobs, key)) { this._dirty = true; delete this._memoryBlobs[key]; } - if (hasOwnProperty2.call(this._invalidationKeys, key)) { + if (hasOwnProperty.call(this._invalidationKeys, key)) { this._dirty = true; delete this._invalidationKeys[key]; } - if (hasOwnProperty2.call(this._storedMap, key)) { + if (hasOwnProperty.call(this._storedMap, key)) { this._dirty = true; delete this._storedMap[key]; } @@ -17257,7 +16859,7 @@ var require_v8_compile_cache = __commonJS({ const blobToStore = Buffer.concat(dump[0]); const mapToStore = JSON.stringify(dump[1]); try { - mkdirpSync2(this._directory); + mkdirpSync(this._directory); fs17.writeFileSync(this._lockFilename, "LOCK", { flag: "wx" }); } catch (error) { return false; @@ -17297,7 +16899,7 @@ var require_v8_compile_cache = __commonJS({ push2(key, invalidationKey, buffer); } for (const key of Object.keys(this._storedMap)) { - if (hasOwnProperty2.call(newMap, key)) continue; + if (hasOwnProperty.call(newMap, key)) continue; const mapping = this._storedMap[key]; const buffer = this._storedBlob.slice(mapping[1], mapping[2]); push2(key, mapping[0], buffer); @@ -17322,21 +16924,21 @@ var require_v8_compile_cache = __commonJS({ function require2(id) { return mod.require(id); } - function resolve2(request, options) { + function resolve(request, options) { return Module2._resolveFilename(request, mod, false, options); } - require2.resolve = resolve2; + require2.resolve = resolve; if (hasRequireResolvePaths) { - resolve2.paths = function paths(request) { + resolve.paths = function paths(request) { return Module2._resolveLookupPaths(request, mod, true); }; } require2.main = process.mainModule; require2.extensions = Module2._extensions; require2.cache = Module2._cache; - const dirname5 = path16.dirname(filename); + const dirname2 = path16.dirname(filename); const compiledWrapper = self2._moduleCompile(filename, content); - const args = [mod.exports, require2, mod, filename, dirname5, process, global, Buffer]; + const args = [mod.exports, require2, mod, filename, dirname2, process, global, Buffer]; return compiledWrapper.apply(mod.exports, args); }; } @@ -17387,7 +16989,7 @@ var require_v8_compile_cache = __commonJS({ return compiledWrapper; } }; - function mkdirpSync2(p_) { + function mkdirpSync(p_) { _mkdirpSync(path16.resolve(p_), 511); } function _mkdirpSync(p, mode) { @@ -17399,8 +17001,8 @@ var require_v8_compile_cache = __commonJS({ _mkdirpSync(p); } else { try { - const stat2 = fs17.statSync(p); - if (!stat2.isDirectory()) { + const stat = fs17.statSync(p); + if (!stat.isDirectory()) { throw err0; } } catch (err1) { @@ -17429,10 +17031,10 @@ var require_v8_compile_cache = __commonJS({ if (v8_compile_cache_cache_dir) { return v8_compile_cache_cache_dir; } - const dirname5 = typeof process.getuid === "function" ? "v8-compile-cache-" + process.getuid() : "v8-compile-cache"; + const dirname2 = typeof process.getuid === "function" ? "v8-compile-cache-" + process.getuid() : "v8-compile-cache"; const arch = process.arch; - const version3 = typeof process.versions.v8 === "string" ? process.versions.v8 : typeof process.versions.chakracore === "string" ? "chakracore-" + process.versions.chakracore : "node-" + process.version; - const cacheDir = path16.join(os3.tmpdir(), dirname5, arch, version3); + const version2 = typeof process.versions.v8 === "string" ? process.versions.v8 : typeof process.versions.chakracore === "string" ? "chakracore-" + process.versions.chakracore : "node-" + process.version; + const cacheDir = path16.join(os3.tmpdir(), dirname2, arch, version2); return cacheDir; } function getMainName() { @@ -17456,7 +17058,7 @@ var require_v8_compile_cache = __commonJS({ module2.exports.__TEST__ = { FileSystemBlobStore, NativeCompileCache, - mkdirpSync: mkdirpSync2, + mkdirpSync, slashEscape, supportsCachedData, getCacheDir, @@ -17465,17 +17067,18 @@ var require_v8_compile_cache = __commonJS({ } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/satisfies.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/satisfies.js var require_satisfies = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/satisfies.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/satisfies.js"(exports2, module2) { + "use strict"; var Range3 = require_range(); - var satisfies = (version3, range, options) => { + var satisfies = (version2, range, options) => { try { range = new Range3(range, options); } catch (er) { return false; } - return range.test(version3); + return range.test(version2); }; module2.exports = satisfies; } @@ -17513,8 +17116,8 @@ var require_posix = __commonJS({ } }; exports2.sync = sync; - var checkStat = (stat2, options) => stat2.isFile() && checkMode(stat2, options); - var checkMode = (stat2, options) => { + var checkStat = (stat, options) => stat.isFile() && checkMode(stat, options); + var checkMode = (stat, options) => { const myUid = options.uid ?? process.getuid?.(); const myGroups = options.groups ?? process.getgroups?.() ?? []; const myGid = options.gid ?? process.getgid?.() ?? myGroups[0]; @@ -17522,9 +17125,9 @@ var require_posix = __commonJS({ throw new Error("cannot get uid or gid"); } const groups = /* @__PURE__ */ new Set([myGid, ...myGroups]); - const mod = stat2.mode; - const uid = stat2.uid; - const gid = stat2.gid; + const mod = stat.mode; + const uid = stat.uid; + const gid = stat.gid; const u = parseInt("100", 8); const g = parseInt("010", 8); const o = parseInt("001", 8); @@ -17581,7 +17184,7 @@ var require_win32 = __commonJS({ } return false; }; - var checkStat = (stat2, path16, options) => stat2.isFile() && checkPathExt(path16, options); + var checkStat = (stat, path16, options) => stat.isFile() && checkPathExt(path16, options); } }); @@ -17597,22 +17200,22 @@ var require_options = __commonJS({ var require_cjs = __commonJS({ ".yarn/cache/isexe-npm-3.1.1-9c0061eead-9ec2576540.zip/node_modules/isexe/dist/cjs/index.js"(exports2) { "use strict"; - var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? (function(o, m, k, k2) { if (k2 === void 0) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { + var desc2 = Object.getOwnPropertyDescriptor(m, k); + if (!desc2 || ("get" in desc2 ? !m.__esModule : desc2.writable || desc2.configurable)) { + desc2 = { enumerable: true, get: function() { return m[k]; } }; } - Object.defineProperty(o, k2, desc); - } : function(o, m, k, k2) { + Object.defineProperty(o, k2, desc2); + }) : (function(o, m, k, k2) { if (k2 === void 0) k2 = k; o[k2] = m[k]; - }); - var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + })); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { + }) : function(o, v) { o["default"] = v; }); var __importStar = exports2 && exports2.__importStar || function(mod) { @@ -17634,8 +17237,8 @@ var require_cjs = __commonJS({ var win322 = __importStar(require_win32()); exports2.win32 = win322; __exportStar(require_options(), exports2); - var platform6 = process.env._ISEXE_TEST_PLATFORM_ || process.platform; - var impl = platform6 === "win32" ? win322 : posix; + var platform5 = process.env._ISEXE_TEST_PLATFORM_ || process.platform; + var impl = platform5 === "win32" ? win322 : posix; exports2.isexe = impl.isexe; exports2.sync = impl.sync; } @@ -17774,7 +17377,7 @@ var require_polyfills = __commonJS({ var constants2 = require("constants"); var origCwd = process.cwd; var cwd = null; - var platform6 = process.env.GRACEFUL_FS_PLATFORM || process.platform; + var platform5 = process.env.GRACEFUL_FS_PLATFORM || process.platform; process.cwd = function() { if (!cwd) cwd = origCwd.call(process); @@ -17833,8 +17436,8 @@ var require_polyfills = __commonJS({ fs17.lchownSync = function() { }; } - if (platform6 === "win32") { - fs17.rename = typeof fs17.rename !== "function" ? fs17.rename : function(fs$rename) { + if (platform5 === "win32") { + fs17.rename = typeof fs17.rename !== "function" ? fs17.rename : (function(fs$rename) { function rename(from, to, cb) { var start = Date.now(); var backoff = 0; @@ -17857,9 +17460,9 @@ var require_polyfills = __commonJS({ } if (Object.setPrototypeOf) Object.setPrototypeOf(rename, fs$rename); return rename; - }(fs17.rename); + })(fs17.rename); } - fs17.read = typeof fs17.read !== "function" ? fs17.read : function(fs$read) { + fs17.read = typeof fs17.read !== "function" ? fs17.read : (function(fs$read) { function read(fd, buffer, offset, length, position, callback_) { var callback; if (callback_ && typeof callback_ === "function") { @@ -17876,8 +17479,8 @@ var require_polyfills = __commonJS({ } if (Object.setPrototypeOf) Object.setPrototypeOf(read, fs$read); return read; - }(fs17.read); - fs17.readSync = typeof fs17.readSync !== "function" ? fs17.readSync : /* @__PURE__ */ function(fs$readSync) { + })(fs17.read); + fs17.readSync = typeof fs17.readSync !== "function" ? fs17.readSync : /* @__PURE__ */ (function(fs$readSync) { return function(fd, buffer, offset, length, position) { var eagCounter = 0; while (true) { @@ -17892,7 +17495,7 @@ var require_polyfills = __commonJS({ } } }; - }(fs17.readSync); + })(fs17.readSync); function patchLchmod(fs18) { fs18.lchmod = function(path16, mode, callback) { fs18.open( @@ -18192,7 +17795,7 @@ var require_graceful_fs = __commonJS({ gracefulQueue = "___graceful-fs.queue"; previousSymbol = "___graceful-fs.previous"; } - function noop2() { + function noop3() { } function publishQueue(context, queue2) { Object.defineProperty(context, gracefulQueue, { @@ -18201,7 +17804,7 @@ var require_graceful_fs = __commonJS({ } }); } - var debug2 = noop2; + var debug2 = noop3; if (util.debuglog) debug2 = util.debuglog("gfs4"); else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || "")) @@ -18213,7 +17816,7 @@ var require_graceful_fs = __commonJS({ if (!fs17[gracefulQueue]) { queue = global[gracefulQueue] || []; publishQueue(fs17, queue); - fs17.close = function(fs$close) { + fs17.close = (function(fs$close) { function close(fd, cb) { return fs$close.call(fs17, fd, function(err) { if (!err) { @@ -18227,8 +17830,8 @@ var require_graceful_fs = __commonJS({ value: fs$close }); return close; - }(fs17.close); - fs17.closeSync = function(fs$closeSync) { + })(fs17.close); + fs17.closeSync = (function(fs$closeSync) { function closeSync(fd) { fs$closeSync.apply(fs17, arguments); resetQueue(); @@ -18237,7 +17840,7 @@ var require_graceful_fs = __commonJS({ value: fs$closeSync }); return closeSync; - }(fs17.closeSync); + })(fs17.closeSync); if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || "")) { process.on("exit", function() { debug2(fs17[gracefulQueue]); @@ -18455,1072 +18058,1446 @@ var require_graceful_fs = __commonJS({ else return WriteStream2.apply(Object.create(WriteStream2.prototype), arguments); } - function WriteStream$open() { - var that = this; - open(that.path, that.flags, that.mode, function(err, fd) { - if (err) { - that.destroy(); - that.emit("error", err); - } else { - that.fd = fd; - that.emit("open", fd); - } - }); + function WriteStream$open() { + var that = this; + open(that.path, that.flags, that.mode, function(err, fd) { + if (err) { + that.destroy(); + that.emit("error", err); + } else { + that.fd = fd; + that.emit("open", fd); + } + }); + } + function createReadStream(path16, options) { + return new fs18.ReadStream(path16, options); + } + function createWriteStream(path16, options) { + return new fs18.WriteStream(path16, options); + } + var fs$open = fs18.open; + fs18.open = open; + function open(path16, flags, mode, cb) { + if (typeof mode === "function") + cb = mode, mode = null; + return go$open(path16, flags, mode, cb); + function go$open(path17, flags2, mode2, cb2, startTime) { + return fs$open(path17, flags2, mode2, function(err, fd) { + if (err && (err.code === "EMFILE" || err.code === "ENFILE")) + enqueue([go$open, [path17, flags2, mode2, cb2], err, startTime || Date.now(), Date.now()]); + else { + if (typeof cb2 === "function") + cb2.apply(this, arguments); + } + }); + } + } + return fs18; + } + function enqueue(elem) { + debug2("ENQUEUE", elem[0].name, elem[1]); + fs17[gracefulQueue].push(elem); + retry(); + } + var retryTimer; + function resetQueue() { + var now = Date.now(); + for (var i = 0; i < fs17[gracefulQueue].length; ++i) { + if (fs17[gracefulQueue][i].length > 2) { + fs17[gracefulQueue][i][3] = now; + fs17[gracefulQueue][i][4] = now; + } + } + retry(); + } + function retry() { + clearTimeout(retryTimer); + retryTimer = void 0; + if (fs17[gracefulQueue].length === 0) + return; + var elem = fs17[gracefulQueue].shift(); + var fn2 = elem[0]; + var args = elem[1]; + var err = elem[2]; + var startTime = elem[3]; + var lastTime = elem[4]; + if (startTime === void 0) { + debug2("RETRY", fn2.name, args); + fn2.apply(null, args); + } else if (Date.now() - startTime >= 6e4) { + debug2("TIMEOUT", fn2.name, args); + var cb = args.pop(); + if (typeof cb === "function") + cb.call(null, err); + } else { + var sinceAttempt = Date.now() - lastTime; + var sinceStart = Math.max(lastTime - startTime, 1); + var desiredDelay = Math.min(sinceStart * 1.2, 100); + if (sinceAttempt >= desiredDelay) { + debug2("RETRY", fn2.name, args); + fn2.apply(null, args.concat([startTime])); + } else { + fs17[gracefulQueue].push(elem); + } + } + if (retryTimer === void 0) { + retryTimer = setTimeout(retry, 0); + } + } + } +}); + +// .yarn/cache/@zkochan-cmd-shim-npm-6.0.0-97792a7373-ba1442ba1e.zip/node_modules/@zkochan/cmd-shim/index.js +var require_cmd_shim = __commonJS({ + ".yarn/cache/@zkochan-cmd-shim-npm-6.0.0-97792a7373-ba1442ba1e.zip/node_modules/@zkochan/cmd-shim/index.js"(exports2, module2) { + "use strict"; + cmdShim2.ifExists = cmdShimIfExists; + var util_1 = require("util"); + var path16 = require("path"); + var isWindows4 = require_is_windows(); + var CMD_EXTENSION = require_cmd_extension(); + var shebangExpr = /^#!\s*(?:\/usr\/bin\/env(?:\s+-S\s*)?)?\s*([^ \t]+)(.*)$/; + var DEFAULT_OPTIONS = { + // Create PowerShell file by default if the option hasn't been specified + createPwshFile: true, + createCmdFile: isWindows4(), + fs: require_graceful_fs() + }; + var extensionToProgramMap = /* @__PURE__ */ new Map([ + [".js", "node"], + [".cjs", "node"], + [".mjs", "node"], + [".cmd", "cmd"], + [".bat", "cmd"], + [".ps1", "pwsh"], + [".sh", "sh"] + ]); + function ingestOptions(opts) { + const opts_ = { ...DEFAULT_OPTIONS, ...opts }; + const fs17 = opts_.fs; + opts_.fs_ = { + chmod: fs17.chmod ? (0, util_1.promisify)(fs17.chmod) : (async () => { + }), + mkdir: (0, util_1.promisify)(fs17.mkdir), + readFile: (0, util_1.promisify)(fs17.readFile), + stat: (0, util_1.promisify)(fs17.stat), + unlink: (0, util_1.promisify)(fs17.unlink), + writeFile: (0, util_1.promisify)(fs17.writeFile) + }; + return opts_; + } + async function cmdShim2(src, to, opts) { + const opts_ = ingestOptions(opts); + await cmdShim_(src, to, opts_); + } + function cmdShimIfExists(src, to, opts) { + return cmdShim2(src, to, opts).catch(() => { + }); + } + function rm(path17, opts) { + return opts.fs_.unlink(path17).catch(() => { + }); + } + async function cmdShim_(src, to, opts) { + const srcRuntimeInfo = await searchScriptRuntime(src, opts); + await writeShimsPreCommon(to, opts); + return writeAllShims(src, to, srcRuntimeInfo, opts); + } + function writeShimsPreCommon(target, opts) { + return opts.fs_.mkdir(path16.dirname(target), { recursive: true }); + } + function writeAllShims(src, to, srcRuntimeInfo, opts) { + const opts_ = ingestOptions(opts); + const generatorAndExts = [{ generator: generateShShim, extension: "" }]; + if (opts_.createCmdFile) { + generatorAndExts.push({ generator: generateCmdShim, extension: CMD_EXTENSION }); + } + if (opts_.createPwshFile) { + generatorAndExts.push({ generator: generatePwshShim, extension: ".ps1" }); + } + return Promise.all(generatorAndExts.map((generatorAndExt) => writeShim(src, to + generatorAndExt.extension, srcRuntimeInfo, generatorAndExt.generator, opts_))); + } + function writeShimPre(target, opts) { + return rm(target, opts); + } + function writeShimPost(target, opts) { + return chmodShim(target, opts); + } + async function searchScriptRuntime(target, opts) { + try { + const data = await opts.fs_.readFile(target, "utf8"); + const firstLine = data.trim().split(/\r*\n/)[0]; + const shebang = firstLine.match(shebangExpr); + if (!shebang) { + const targetExtension = path16.extname(target).toLowerCase(); + return { + // undefined if extension is unknown but it's converted to null. + program: extensionToProgramMap.get(targetExtension) || null, + additionalArgs: "" + }; + } + return { + program: shebang[1], + additionalArgs: shebang[2] + }; + } catch (err) { + if (!isWindows4() || err.code !== "ENOENT") + throw err; + if (await opts.fs_.stat(`${target}${getExeExtension()}`)) { + return { + program: null, + additionalArgs: "" + }; + } + throw err; + } + } + function getExeExtension() { + let cmdExtension; + if (process.env.PATHEXT) { + cmdExtension = process.env.PATHEXT.split(path16.delimiter).find((ext) => ext.toLowerCase() === ".exe"); + } + return cmdExtension || ".exe"; + } + async function writeShim(src, to, srcRuntimeInfo, generateShimScript, opts) { + const defaultArgs = opts.preserveSymlinks ? "--preserve-symlinks" : ""; + const args = [srcRuntimeInfo.additionalArgs, defaultArgs].filter((arg) => arg).join(" "); + opts = Object.assign({}, opts, { + prog: srcRuntimeInfo.program, + args + }); + await writeShimPre(to, opts); + await opts.fs_.writeFile(to, generateShimScript(src, to, opts), "utf8"); + return writeShimPost(to, opts); + } + function generateCmdShim(src, to, opts) { + const shTarget = path16.relative(path16.dirname(to), src); + let target = shTarget.split("/").join("\\"); + const quotedPathToTarget = path16.isAbsolute(target) ? `"${target}"` : `"%~dp0\\${target}"`; + let longProg; + let prog = opts.prog; + let args = opts.args || ""; + const nodePath = normalizePathEnvVar(opts.nodePath).win32; + const prependToPath = normalizePathEnvVar(opts.prependToPath).win32; + if (!prog) { + prog = quotedPathToTarget; + args = ""; + target = ""; + } else if (prog === "node" && opts.nodeExecPath) { + prog = `"${opts.nodeExecPath}"`; + target = quotedPathToTarget; + } else { + longProg = `"%~dp0\\${prog}.exe"`; + target = quotedPathToTarget; + } + let progArgs = opts.progArgs ? `${opts.progArgs.join(` `)} ` : ""; + let cmd = "@SETLOCAL\r\n"; + if (prependToPath) { + cmd += `@SET "PATH=${prependToPath}:%PATH%"\r +`; + } + if (nodePath) { + cmd += `@IF NOT DEFINED NODE_PATH (\r + @SET "NODE_PATH=${nodePath}"\r +) ELSE (\r + @SET "NODE_PATH=${nodePath};%NODE_PATH%"\r +)\r +`; + } + if (longProg) { + cmd += `@IF EXIST ${longProg} (\r + ${longProg} ${args} ${target} ${progArgs}%*\r +) ELSE (\r + @SET PATHEXT=%PATHEXT:;.JS;=;%\r + ${prog} ${args} ${target} ${progArgs}%*\r +)\r +`; + } else { + cmd += `@${prog} ${args} ${target} ${progArgs}%*\r +`; + } + return cmd; + } + function generateShShim(src, to, opts) { + let shTarget = path16.relative(path16.dirname(to), src); + let shProg = opts.prog && opts.prog.split("\\").join("/"); + let shLongProg; + shTarget = shTarget.split("\\").join("/"); + const quotedPathToTarget = path16.isAbsolute(shTarget) ? `"${shTarget}"` : `"$basedir/${shTarget}"`; + let args = opts.args || ""; + const shNodePath = normalizePathEnvVar(opts.nodePath).posix; + if (!shProg) { + shProg = quotedPathToTarget; + args = ""; + shTarget = ""; + } else if (opts.prog === "node" && opts.nodeExecPath) { + shProg = `"${opts.nodeExecPath}"`; + shTarget = quotedPathToTarget; + } else { + shLongProg = `"$basedir/${opts.prog}"`; + shTarget = quotedPathToTarget; + } + let progArgs = opts.progArgs ? `${opts.progArgs.join(` `)} ` : ""; + let sh = `#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')") + +case \`uname\` in + *CYGWIN*) basedir=\`cygpath -w "$basedir"\`;; +esac + +`; + if (opts.prependToPath) { + sh += `export PATH="${opts.prependToPath}:$PATH" +`; + } + if (shNodePath) { + sh += `if [ -z "$NODE_PATH" ]; then + export NODE_PATH="${shNodePath}" +else + export NODE_PATH="${shNodePath}:$NODE_PATH" +fi +`; + } + if (shLongProg) { + sh += `if [ -x ${shLongProg} ]; then + exec ${shLongProg} ${args} ${shTarget} ${progArgs}"$@" +else + exec ${shProg} ${args} ${shTarget} ${progArgs}"$@" +fi +`; + } else { + sh += `${shProg} ${args} ${shTarget} ${progArgs}"$@" +exit $? +`; + } + return sh; + } + function generatePwshShim(src, to, opts) { + let shTarget = path16.relative(path16.dirname(to), src); + const shProg = opts.prog && opts.prog.split("\\").join("/"); + let pwshProg = shProg && `"${shProg}$exe"`; + let pwshLongProg; + shTarget = shTarget.split("\\").join("/"); + const quotedPathToTarget = path16.isAbsolute(shTarget) ? `"${shTarget}"` : `"$basedir/${shTarget}"`; + let args = opts.args || ""; + let normalizedNodePathEnvVar = normalizePathEnvVar(opts.nodePath); + const nodePath = normalizedNodePathEnvVar.win32; + const shNodePath = normalizedNodePathEnvVar.posix; + let normalizedPrependPathEnvVar = normalizePathEnvVar(opts.prependToPath); + const prependPath = normalizedPrependPathEnvVar.win32; + const shPrependPath = normalizedPrependPathEnvVar.posix; + if (!pwshProg) { + pwshProg = quotedPathToTarget; + args = ""; + shTarget = ""; + } else if (opts.prog === "node" && opts.nodeExecPath) { + pwshProg = `"${opts.nodeExecPath}"`; + shTarget = quotedPathToTarget; + } else { + pwshLongProg = `"$basedir/${opts.prog}$exe"`; + shTarget = quotedPathToTarget; + } + let progArgs = opts.progArgs ? `${opts.progArgs.join(` `)} ` : ""; + let pwsh = `#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +${nodePath || prependPath ? '$pathsep=":"\n' : ""}${nodePath ? `$env_node_path=$env:NODE_PATH +$new_node_path="${nodePath}" +` : ""}${prependPath ? `$env_path=$env:PATH +$prepend_path="${prependPath}" +` : ""}if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + # Fix case when both the Windows and Linux builds of Node + # are installed in the same directory + $exe=".exe" +${nodePath || prependPath ? ' $pathsep=";"\n' : ""}}`; + if (shNodePath || shPrependPath) { + pwsh += ` else { +${shNodePath ? ` $new_node_path="${shNodePath}" +` : ""}${shPrependPath ? ` $prepend_path="${shPrependPath}" +` : ""}} +`; + } + if (shNodePath) { + pwsh += `if ([string]::IsNullOrEmpty($env_node_path)) { + $env:NODE_PATH=$new_node_path +} else { + $env:NODE_PATH="$new_node_path$pathsep$env_node_path" +} +`; + } + if (opts.prependToPath) { + pwsh += ` +$env:PATH="$prepend_path$pathsep$env:PATH" +`; + } + if (pwshLongProg) { + pwsh += ` +$ret=0 +if (Test-Path ${pwshLongProg}) { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & ${pwshLongProg} ${args} ${shTarget} ${progArgs}$args + } else { + & ${pwshLongProg} ${args} ${shTarget} ${progArgs}$args + } + $ret=$LASTEXITCODE +} else { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & ${pwshProg} ${args} ${shTarget} ${progArgs}$args + } else { + & ${pwshProg} ${args} ${shTarget} ${progArgs}$args + } + $ret=$LASTEXITCODE +} +${nodePath ? "$env:NODE_PATH=$env_node_path\n" : ""}${prependPath ? "$env:PATH=$env_path\n" : ""}exit $ret +`; + } else { + pwsh += ` +# Support pipeline input +if ($MyInvocation.ExpectingInput) { + $input | & ${pwshProg} ${args} ${shTarget} ${progArgs}$args +} else { + & ${pwshProg} ${args} ${shTarget} ${progArgs}$args +} +${nodePath ? "$env:NODE_PATH=$env_node_path\n" : ""}${prependPath ? "$env:PATH=$env_path\n" : ""}exit $LASTEXITCODE +`; + } + return pwsh; + } + function chmodShim(to, opts) { + return opts.fs_.chmod(to, 493); + } + function normalizePathEnvVar(nodePath) { + if (!nodePath || !nodePath.length) { + return { + win32: "", + posix: "" + }; } - function createReadStream(path16, options) { - return new fs18.ReadStream(path16, options); + let split = typeof nodePath === "string" ? nodePath.split(path16.delimiter) : Array.from(nodePath); + let result = {}; + for (let i = 0; i < split.length; i++) { + const win322 = split[i].split("/").join("\\"); + const posix = isWindows4() ? split[i].split("\\").join("/").replace(/^([^:\\/]*):/, (_, $1) => `/mnt/${$1.toLowerCase()}`) : split[i]; + result.win32 = result.win32 ? `${result.win32};${win322}` : win322; + result.posix = result.posix ? `${result.posix}:${posix}` : posix; + result[i] = { win32: win322, posix }; } - function createWriteStream(path16, options) { - return new fs18.WriteStream(path16, options); + return result; + } + module2.exports = cmdShim2; + } +}); + +// .yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/mode-fix.js +var modeFix; +var init_mode_fix = __esm({ + ".yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/mode-fix.js"() { + modeFix = (mode, isDir, portable) => { + mode &= 4095; + if (portable) { + mode = (mode | 384) & ~18; } - var fs$open = fs18.open; - fs18.open = open; - function open(path16, flags, mode, cb) { - if (typeof mode === "function") - cb = mode, mode = null; - return go$open(path16, flags, mode, cb); - function go$open(path17, flags2, mode2, cb2, startTime) { - return fs$open(path17, flags2, mode2, function(err, fd) { - if (err && (err.code === "EMFILE" || err.code === "ENFILE")) - enqueue([go$open, [path17, flags2, mode2, cb2], err, startTime || Date.now(), Date.now()]); - else { - if (typeof cb2 === "function") - cb2.apply(this, arguments); - } - }); + if (isDir) { + if (mode & 256) { + mode |= 64; } - } - return fs18; - } - function enqueue(elem) { - debug2("ENQUEUE", elem[0].name, elem[1]); - fs17[gracefulQueue].push(elem); - retry(); - } - var retryTimer; - function resetQueue() { - var now = Date.now(); - for (var i = 0; i < fs17[gracefulQueue].length; ++i) { - if (fs17[gracefulQueue][i].length > 2) { - fs17[gracefulQueue][i][3] = now; - fs17[gracefulQueue][i][4] = now; + if (mode & 32) { + mode |= 8; } - } - retry(); - } - function retry() { - clearTimeout(retryTimer); - retryTimer = void 0; - if (fs17[gracefulQueue].length === 0) - return; - var elem = fs17[gracefulQueue].shift(); - var fn2 = elem[0]; - var args = elem[1]; - var err = elem[2]; - var startTime = elem[3]; - var lastTime = elem[4]; - if (startTime === void 0) { - debug2("RETRY", fn2.name, args); - fn2.apply(null, args); - } else if (Date.now() - startTime >= 6e4) { - debug2("TIMEOUT", fn2.name, args); - var cb = args.pop(); - if (typeof cb === "function") - cb.call(null, err); - } else { - var sinceAttempt = Date.now() - lastTime; - var sinceStart = Math.max(lastTime - startTime, 1); - var desiredDelay = Math.min(sinceStart * 1.2, 100); - if (sinceAttempt >= desiredDelay) { - debug2("RETRY", fn2.name, args); - fn2.apply(null, args.concat([startTime])); - } else { - fs17[gracefulQueue].push(elem); + if (mode & 4) { + mode |= 1; } } - if (retryTimer === void 0) { - retryTimer = setTimeout(retry, 0); - } - } + return mode; + }; } }); -// .yarn/cache/@zkochan-cmd-shim-npm-6.0.0-97792a7373-ba1442ba1e.zip/node_modules/@zkochan/cmd-shim/index.js -var require_cmd_shim = __commonJS({ - ".yarn/cache/@zkochan-cmd-shim-npm-6.0.0-97792a7373-ba1442ba1e.zip/node_modules/@zkochan/cmd-shim/index.js"(exports2, module2) { - "use strict"; - cmdShim2.ifExists = cmdShimIfExists; - var util_1 = require("util"); - var path16 = require("path"); - var isWindows4 = require_is_windows(); - var CMD_EXTENSION = require_cmd_extension(); - var shebangExpr = /^#!\s*(?:\/usr\/bin\/env(?:\s+-S\s*)?)?\s*([^ \t]+)(.*)$/; - var DEFAULT_OPTIONS = { - // Create PowerShell file by default if the option hasn't been specified - createPwshFile: true, - createCmdFile: isWindows4(), - fs: require_graceful_fs() +// .yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/write-entry.js +var import_fs11, import_path9, prefixPath, maxReadSize, PROCESS, FILE2, DIRECTORY2, SYMLINK2, HARDLINK2, HEADER, READ2, LSTAT, ONLSTAT, ONREAD, ONREADLINK, OPENFILE, ONOPENFILE, CLOSE, MODE, AWAITDRAIN, ONDRAIN, PREFIX, WriteEntry, WriteEntrySync, WriteEntryTar, getType; +var init_write_entry = __esm({ + ".yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/write-entry.js"() { + import_fs11 = __toESM(require("fs"), 1); + init_esm(); + import_path9 = __toESM(require("path"), 1); + init_header(); + init_mode_fix(); + init_normalize_windows_path(); + init_options(); + init_pax(); + init_strip_absolute_path(); + init_strip_trailing_slashes(); + init_warn_method(); + init_winchars(); + prefixPath = (path16, prefix) => { + if (!prefix) { + return normalizeWindowsPath(path16); + } + path16 = normalizeWindowsPath(path16).replace(/^\.(\/|$)/, ""); + return stripTrailingSlashes(prefix) + "/" + path16; }; - var extensionToProgramMap = /* @__PURE__ */ new Map([ - [".js", "node"], - [".cjs", "node"], - [".mjs", "node"], - [".cmd", "cmd"], - [".bat", "cmd"], - [".ps1", "pwsh"], - [".sh", "sh"] - ]); - function ingestOptions(opts) { - const opts_ = { ...DEFAULT_OPTIONS, ...opts }; - const fs17 = opts_.fs; - opts_.fs_ = { - chmod: fs17.chmod ? (0, util_1.promisify)(fs17.chmod) : async () => { - }, - mkdir: (0, util_1.promisify)(fs17.mkdir), - readFile: (0, util_1.promisify)(fs17.readFile), - stat: (0, util_1.promisify)(fs17.stat), - unlink: (0, util_1.promisify)(fs17.unlink), - writeFile: (0, util_1.promisify)(fs17.writeFile) - }; - return opts_; - } - async function cmdShim2(src, to, opts) { - const opts_ = ingestOptions(opts); - await cmdShim_(src, to, opts_); - } - function cmdShimIfExists(src, to, opts) { - return cmdShim2(src, to, opts).catch(() => { - }); - } - function rm(path17, opts) { - return opts.fs_.unlink(path17).catch(() => { - }); - } - async function cmdShim_(src, to, opts) { - const srcRuntimeInfo = await searchScriptRuntime(src, opts); - await writeShimsPreCommon(to, opts); - return writeAllShims(src, to, srcRuntimeInfo, opts); - } - function writeShimsPreCommon(target, opts) { - return opts.fs_.mkdir(path16.dirname(target), { recursive: true }); - } - function writeAllShims(src, to, srcRuntimeInfo, opts) { - const opts_ = ingestOptions(opts); - const generatorAndExts = [{ generator: generateShShim, extension: "" }]; - if (opts_.createCmdFile) { - generatorAndExts.push({ generator: generateCmdShim, extension: CMD_EXTENSION }); + maxReadSize = 16 * 1024 * 1024; + PROCESS = Symbol("process"); + FILE2 = Symbol("file"); + DIRECTORY2 = Symbol("directory"); + SYMLINK2 = Symbol("symlink"); + HARDLINK2 = Symbol("hardlink"); + HEADER = Symbol("header"); + READ2 = Symbol("read"); + LSTAT = Symbol("lstat"); + ONLSTAT = Symbol("onlstat"); + ONREAD = Symbol("onread"); + ONREADLINK = Symbol("onreadlink"); + OPENFILE = Symbol("openfile"); + ONOPENFILE = Symbol("onopenfile"); + CLOSE = Symbol("close"); + MODE = Symbol("mode"); + AWAITDRAIN = Symbol("awaitDrain"); + ONDRAIN = Symbol("ondrain"); + PREFIX = Symbol("prefix"); + WriteEntry = class extends Minipass { + path; + portable; + myuid = process.getuid && process.getuid() || 0; + // until node has builtin pwnam functions, this'll have to do + myuser = process.env.USER || ""; + maxReadSize; + linkCache; + statCache; + preservePaths; + cwd; + strict; + mtime; + noPax; + noMtime; + prefix; + fd; + blockLen = 0; + blockRemain = 0; + buf; + pos = 0; + remain = 0; + length = 0; + offset = 0; + win32; + absolute; + header; + type; + linkpath; + stat; + onWriteEntry; + #hadError = false; + constructor(p, opt_ = {}) { + const opt = dealias(opt_); + super(); + this.path = normalizeWindowsPath(p); + this.portable = !!opt.portable; + this.maxReadSize = opt.maxReadSize || maxReadSize; + this.linkCache = opt.linkCache || /* @__PURE__ */ new Map(); + this.statCache = opt.statCache || /* @__PURE__ */ new Map(); + this.preservePaths = !!opt.preservePaths; + this.cwd = normalizeWindowsPath(opt.cwd || process.cwd()); + this.strict = !!opt.strict; + this.noPax = !!opt.noPax; + this.noMtime = !!opt.noMtime; + this.mtime = opt.mtime; + this.prefix = opt.prefix ? normalizeWindowsPath(opt.prefix) : void 0; + this.onWriteEntry = opt.onWriteEntry; + if (typeof opt.onwarn === "function") { + this.on("warn", opt.onwarn); + } + let pathWarn = false; + if (!this.preservePaths) { + const [root, stripped] = stripAbsolutePath(this.path); + if (root && typeof stripped === "string") { + this.path = stripped; + pathWarn = root; + } + } + this.win32 = !!opt.win32 || process.platform === "win32"; + if (this.win32) { + this.path = decode(this.path.replace(/\\/g, "/")); + p = p.replace(/\\/g, "/"); + } + this.absolute = normalizeWindowsPath(opt.absolute || import_path9.default.resolve(this.cwd, p)); + if (this.path === "") { + this.path = "./"; + } + if (pathWarn) { + this.warn("TAR_ENTRY_INFO", `stripping ${pathWarn} from absolute path`, { + entry: this, + path: pathWarn + this.path + }); + } + const cs = this.statCache.get(this.absolute); + if (cs) { + this[ONLSTAT](cs); + } else { + this[LSTAT](); + } } - if (opts_.createPwshFile) { - generatorAndExts.push({ generator: generatePwshShim, extension: ".ps1" }); + warn(code2, message, data = {}) { + return warnMethod(this, code2, message, data); } - return Promise.all(generatorAndExts.map((generatorAndExt) => writeShim(src, to + generatorAndExt.extension, srcRuntimeInfo, generatorAndExt.generator, opts_))); - } - function writeShimPre(target, opts) { - return rm(target, opts); - } - function writeShimPost(target, opts) { - return chmodShim(target, opts); - } - async function searchScriptRuntime(target, opts) { - try { - const data = await opts.fs_.readFile(target, "utf8"); - const firstLine = data.trim().split(/\r*\n/)[0]; - const shebang = firstLine.match(shebangExpr); - if (!shebang) { - const targetExtension = path16.extname(target).toLowerCase(); - return { - // undefined if extension is unknown but it's converted to null. - program: extensionToProgramMap.get(targetExtension) || null, - additionalArgs: "" - }; - } - return { - program: shebang[1], - additionalArgs: shebang[2] - }; - } catch (err) { - if (!isWindows4() || err.code !== "ENOENT") - throw err; - if (await opts.fs_.stat(`${target}${getExeExtension()}`)) { - return { - program: null, - additionalArgs: "" - }; + emit(ev, ...data) { + if (ev === "error") { + this.#hadError = true; } - throw err; + return super.emit(ev, ...data); } - } - function getExeExtension() { - let cmdExtension; - if (process.env.PATHEXT) { - cmdExtension = process.env.PATHEXT.split(path16.delimiter).find((ext) => ext.toLowerCase() === ".exe"); + [LSTAT]() { + import_fs11.default.lstat(this.absolute, (er, stat) => { + if (er) { + return this.emit("error", er); + } + this[ONLSTAT](stat); + }); } - return cmdExtension || ".exe"; - } - async function writeShim(src, to, srcRuntimeInfo, generateShimScript, opts) { - const defaultArgs = opts.preserveSymlinks ? "--preserve-symlinks" : ""; - const args = [srcRuntimeInfo.additionalArgs, defaultArgs].filter((arg) => arg).join(" "); - opts = Object.assign({}, opts, { - prog: srcRuntimeInfo.program, - args - }); - await writeShimPre(to, opts); - await opts.fs_.writeFile(to, generateShimScript(src, to, opts), "utf8"); - return writeShimPost(to, opts); - } - function generateCmdShim(src, to, opts) { - const shTarget = path16.relative(path16.dirname(to), src); - let target = shTarget.split("/").join("\\"); - const quotedPathToTarget = path16.isAbsolute(target) ? `"${target}"` : `"%~dp0\\${target}"`; - let longProg; - let prog = opts.prog; - let args = opts.args || ""; - const nodePath = normalizePathEnvVar(opts.nodePath).win32; - const prependToPath = normalizePathEnvVar(opts.prependToPath).win32; - if (!prog) { - prog = quotedPathToTarget; - args = ""; - target = ""; - } else if (prog === "node" && opts.nodeExecPath) { - prog = `"${opts.nodeExecPath}"`; - target = quotedPathToTarget; - } else { - longProg = `"%~dp0\\${prog}.exe"`; - target = quotedPathToTarget; + [ONLSTAT](stat) { + this.statCache.set(this.absolute, stat); + this.stat = stat; + if (!stat.isFile()) { + stat.size = 0; + } + this.type = getType(stat); + this.emit("stat", stat); + this[PROCESS](); } - let progArgs = opts.progArgs ? `${opts.progArgs.join(` `)} ` : ""; - let cmd = "@SETLOCAL\r\n"; - if (prependToPath) { - cmd += `@SET "PATH=${prependToPath}:%PATH%"\r -`; + [PROCESS]() { + switch (this.type) { + case "File": + return this[FILE2](); + case "Directory": + return this[DIRECTORY2](); + case "SymbolicLink": + return this[SYMLINK2](); + // unsupported types are ignored. + default: + return this.end(); + } } - if (nodePath) { - cmd += `@IF NOT DEFINED NODE_PATH (\r - @SET "NODE_PATH=${nodePath}"\r -) ELSE (\r - @SET "NODE_PATH=${nodePath};%NODE_PATH%"\r -)\r -`; + [MODE](mode) { + return modeFix(mode, this.type === "Directory", this.portable); } - if (longProg) { - cmd += `@IF EXIST ${longProg} (\r - ${longProg} ${args} ${target} ${progArgs}%*\r -) ELSE (\r - @SET PATHEXT=%PATHEXT:;.JS;=;%\r - ${prog} ${args} ${target} ${progArgs}%*\r -)\r -`; - } else { - cmd += `@${prog} ${args} ${target} ${progArgs}%*\r -`; + [PREFIX](path16) { + return prefixPath(path16, this.prefix); } - return cmd; - } - function generateShShim(src, to, opts) { - let shTarget = path16.relative(path16.dirname(to), src); - let shProg = opts.prog && opts.prog.split("\\").join("/"); - let shLongProg; - shTarget = shTarget.split("\\").join("/"); - const quotedPathToTarget = path16.isAbsolute(shTarget) ? `"${shTarget}"` : `"$basedir/${shTarget}"`; - let args = opts.args || ""; - const shNodePath = normalizePathEnvVar(opts.nodePath).posix; - if (!shProg) { - shProg = quotedPathToTarget; - args = ""; - shTarget = ""; - } else if (opts.prog === "node" && opts.nodeExecPath) { - shProg = `"${opts.nodeExecPath}"`; - shTarget = quotedPathToTarget; - } else { - shLongProg = `"$basedir/${opts.prog}"`; - shTarget = quotedPathToTarget; + [HEADER]() { + if (!this.stat) { + throw new Error("cannot write header before stat"); + } + if (this.type === "Directory" && this.portable) { + this.noMtime = true; + } + this.onWriteEntry?.(this); + this.header = new Header({ + path: this[PREFIX](this.path), + // only apply the prefix to hard links. + linkpath: this.type === "Link" && this.linkpath !== void 0 ? this[PREFIX](this.linkpath) : this.linkpath, + // only the permissions and setuid/setgid/sticky bitflags + // not the higher-order bits that specify file type + mode: this[MODE](this.stat.mode), + uid: this.portable ? void 0 : this.stat.uid, + gid: this.portable ? void 0 : this.stat.gid, + size: this.stat.size, + mtime: this.noMtime ? void 0 : this.mtime || this.stat.mtime, + /* c8 ignore next */ + type: this.type === "Unsupported" ? void 0 : this.type, + uname: this.portable ? void 0 : this.stat.uid === this.myuid ? this.myuser : "", + atime: this.portable ? void 0 : this.stat.atime, + ctime: this.portable ? void 0 : this.stat.ctime + }); + if (this.header.encode() && !this.noPax) { + super.write(new Pax({ + atime: this.portable ? void 0 : this.header.atime, + ctime: this.portable ? void 0 : this.header.ctime, + gid: this.portable ? void 0 : this.header.gid, + mtime: this.noMtime ? void 0 : this.mtime || this.header.mtime, + path: this[PREFIX](this.path), + linkpath: this.type === "Link" && this.linkpath !== void 0 ? this[PREFIX](this.linkpath) : this.linkpath, + size: this.header.size, + uid: this.portable ? void 0 : this.header.uid, + uname: this.portable ? void 0 : this.header.uname, + dev: this.portable ? void 0 : this.stat.dev, + ino: this.portable ? void 0 : this.stat.ino, + nlink: this.portable ? void 0 : this.stat.nlink + }).encode()); + } + const block = this.header?.block; + if (!block) { + throw new Error("failed to encode header"); + } + super.write(block); } - let progArgs = opts.progArgs ? `${opts.progArgs.join(` `)} ` : ""; - let sh = `#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')") - -case \`uname\` in - *CYGWIN*) basedir=\`cygpath -w "$basedir"\`;; -esac - -`; - if (opts.prependToPath) { - sh += `export PATH="${opts.prependToPath}:$PATH" -`; + [DIRECTORY2]() { + if (!this.stat) { + throw new Error("cannot create directory entry without stat"); + } + if (this.path.slice(-1) !== "/") { + this.path += "/"; + } + this.stat.size = 0; + this[HEADER](); + this.end(); } - if (shNodePath) { - sh += `if [ -z "$NODE_PATH" ]; then - export NODE_PATH="${shNodePath}" -else - export NODE_PATH="${shNodePath}:$NODE_PATH" -fi -`; + [SYMLINK2]() { + import_fs11.default.readlink(this.absolute, (er, linkpath) => { + if (er) { + return this.emit("error", er); + } + this[ONREADLINK](linkpath); + }); } - if (shLongProg) { - sh += `if [ -x ${shLongProg} ]; then - exec ${shLongProg} ${args} ${shTarget} ${progArgs}"$@" -else - exec ${shProg} ${args} ${shTarget} ${progArgs}"$@" -fi -`; - } else { - sh += `${shProg} ${args} ${shTarget} ${progArgs}"$@" -exit $? -`; + [ONREADLINK](linkpath) { + this.linkpath = normalizeWindowsPath(linkpath); + this[HEADER](); + this.end(); } - return sh; - } - function generatePwshShim(src, to, opts) { - let shTarget = path16.relative(path16.dirname(to), src); - const shProg = opts.prog && opts.prog.split("\\").join("/"); - let pwshProg = shProg && `"${shProg}$exe"`; - let pwshLongProg; - shTarget = shTarget.split("\\").join("/"); - const quotedPathToTarget = path16.isAbsolute(shTarget) ? `"${shTarget}"` : `"$basedir/${shTarget}"`; - let args = opts.args || ""; - let normalizedNodePathEnvVar = normalizePathEnvVar(opts.nodePath); - const nodePath = normalizedNodePathEnvVar.win32; - const shNodePath = normalizedNodePathEnvVar.posix; - let normalizedPrependPathEnvVar = normalizePathEnvVar(opts.prependToPath); - const prependPath = normalizedPrependPathEnvVar.win32; - const shPrependPath = normalizedPrependPathEnvVar.posix; - if (!pwshProg) { - pwshProg = quotedPathToTarget; - args = ""; - shTarget = ""; - } else if (opts.prog === "node" && opts.nodeExecPath) { - pwshProg = `"${opts.nodeExecPath}"`; - shTarget = quotedPathToTarget; - } else { - pwshLongProg = `"$basedir/${opts.prog}$exe"`; - shTarget = quotedPathToTarget; + [HARDLINK2](linkpath) { + if (!this.stat) { + throw new Error("cannot create link entry without stat"); + } + this.type = "Link"; + this.linkpath = normalizeWindowsPath(import_path9.default.relative(this.cwd, linkpath)); + this.stat.size = 0; + this[HEADER](); + this.end(); } - let progArgs = opts.progArgs ? `${opts.progArgs.join(` `)} ` : ""; - let pwsh = `#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -${nodePath || prependPath ? '$pathsep=":"\n' : ""}${nodePath ? `$env_node_path=$env:NODE_PATH -$new_node_path="${nodePath}" -` : ""}${prependPath ? `$env_path=$env:PATH -$prepend_path="${prependPath}" -` : ""}if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -${nodePath || prependPath ? ' $pathsep=";"\n' : ""}}`; - if (shNodePath || shPrependPath) { - pwsh += ` else { -${shNodePath ? ` $new_node_path="${shNodePath}" -` : ""}${shPrependPath ? ` $prepend_path="${shPrependPath}" -` : ""}} -`; + [FILE2]() { + if (!this.stat) { + throw new Error("cannot create file entry without stat"); + } + if (this.stat.nlink > 1) { + const linkKey = `${this.stat.dev}:${this.stat.ino}`; + const linkpath = this.linkCache.get(linkKey); + if (linkpath?.indexOf(this.cwd) === 0) { + return this[HARDLINK2](linkpath); + } + this.linkCache.set(linkKey, this.absolute); + } + this[HEADER](); + if (this.stat.size === 0) { + return this.end(); + } + this[OPENFILE](); } - if (shNodePath) { - pwsh += `if ([string]::IsNullOrEmpty($env_node_path)) { - $env:NODE_PATH=$new_node_path -} else { - $env:NODE_PATH="$new_node_path$pathsep$env_node_path" -} -`; + [OPENFILE]() { + import_fs11.default.open(this.absolute, "r", (er, fd) => { + if (er) { + return this.emit("error", er); + } + this[ONOPENFILE](fd); + }); } - if (opts.prependToPath) { - pwsh += ` -$env:PATH="$prepend_path$pathsep$env:PATH" -`; + [ONOPENFILE](fd) { + this.fd = fd; + if (this.#hadError) { + return this[CLOSE](); + } + if (!this.stat) { + throw new Error("should stat before calling onopenfile"); + } + this.blockLen = 512 * Math.ceil(this.stat.size / 512); + this.blockRemain = this.blockLen; + const bufLen = Math.min(this.blockLen, this.maxReadSize); + this.buf = Buffer.allocUnsafe(bufLen); + this.offset = 0; + this.pos = 0; + this.remain = this.stat.size; + this.length = this.buf.length; + this[READ2](); } - if (pwshLongProg) { - pwsh += ` -$ret=0 -if (Test-Path ${pwshLongProg}) { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & ${pwshLongProg} ${args} ${shTarget} ${progArgs}$args - } else { - & ${pwshLongProg} ${args} ${shTarget} ${progArgs}$args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & ${pwshProg} ${args} ${shTarget} ${progArgs}$args - } else { - & ${pwshProg} ${args} ${shTarget} ${progArgs}$args - } - $ret=$LASTEXITCODE -} -${nodePath ? "$env:NODE_PATH=$env_node_path\n" : ""}${prependPath ? "$env:PATH=$env_path\n" : ""}exit $ret -`; - } else { - pwsh += ` -# Support pipeline input -if ($MyInvocation.ExpectingInput) { - $input | & ${pwshProg} ${args} ${shTarget} ${progArgs}$args -} else { - & ${pwshProg} ${args} ${shTarget} ${progArgs}$args -} -${nodePath ? "$env:NODE_PATH=$env_node_path\n" : ""}${prependPath ? "$env:PATH=$env_path\n" : ""}exit $LASTEXITCODE -`; + [READ2]() { + const { fd, buf, offset, length, pos: pos2 } = this; + if (fd === void 0 || buf === void 0) { + throw new Error("cannot read file without first opening"); + } + import_fs11.default.read(fd, buf, offset, length, pos2, (er, bytesRead) => { + if (er) { + return this[CLOSE](() => this.emit("error", er)); + } + this[ONREAD](bytesRead); + }); } - return pwsh; - } - function chmodShim(to, opts) { - return opts.fs_.chmod(to, 493); - } - function normalizePathEnvVar(nodePath) { - if (!nodePath || !nodePath.length) { - return { - win32: "", - posix: "" - }; + /* c8 ignore start */ + [CLOSE](cb = () => { + }) { + if (this.fd !== void 0) + import_fs11.default.close(this.fd, cb); } - let split = typeof nodePath === "string" ? nodePath.split(path16.delimiter) : Array.from(nodePath); - let result = {}; - for (let i = 0; i < split.length; i++) { - const win322 = split[i].split("/").join("\\"); - const posix = isWindows4() ? split[i].split("\\").join("/").replace(/^([^:\\/]*):/, (_, $1) => `/mnt/${$1.toLowerCase()}`) : split[i]; - result.win32 = result.win32 ? `${result.win32};${win322}` : win322; - result.posix = result.posix ? `${result.posix}:${posix}` : posix; - result[i] = { win32: win322, posix }; + [ONREAD](bytesRead) { + if (bytesRead <= 0 && this.remain > 0) { + const er = Object.assign(new Error("encountered unexpected EOF"), { + path: this.absolute, + syscall: "read", + code: "EOF" + }); + return this[CLOSE](() => this.emit("error", er)); + } + if (bytesRead > this.remain) { + const er = Object.assign(new Error("did not encounter expected EOF"), { + path: this.absolute, + syscall: "read", + code: "EOF" + }); + return this[CLOSE](() => this.emit("error", er)); + } + if (!this.buf) { + throw new Error("should have created buffer prior to reading"); + } + if (bytesRead === this.remain) { + for (let i = bytesRead; i < this.length && bytesRead < this.blockRemain; i++) { + this.buf[i + this.offset] = 0; + bytesRead++; + this.remain++; + } + } + const chunk = this.offset === 0 && bytesRead === this.buf.length ? this.buf : this.buf.subarray(this.offset, this.offset + bytesRead); + const flushed = this.write(chunk); + if (!flushed) { + this[AWAITDRAIN](() => this[ONDRAIN]()); + } else { + this[ONDRAIN](); + } } - return result; - } - module2.exports = cmdShim2; - } -}); - -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/mode-fix.js -var modeFix; -var init_mode_fix = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/mode-fix.js"() { - modeFix = (mode, isDir, portable) => { - mode &= 4095; - if (portable) { - mode = (mode | 384) & ~18; + [AWAITDRAIN](cb) { + this.once("drain", cb); + } + write(chunk, encoding, cb) { + if (typeof encoding === "function") { + cb = encoding; + encoding = void 0; + } + if (typeof chunk === "string") { + chunk = Buffer.from(chunk, typeof encoding === "string" ? encoding : "utf8"); + } + if (this.blockRemain < chunk.length) { + const er = Object.assign(new Error("writing more data than expected"), { + path: this.absolute + }); + return this.emit("error", er); + } + this.remain -= chunk.length; + this.blockRemain -= chunk.length; + this.pos += chunk.length; + this.offset += chunk.length; + return super.write(chunk, null, cb); } - if (isDir) { - if (mode & 256) { - mode |= 64; + [ONDRAIN]() { + if (!this.remain) { + if (this.blockRemain) { + super.write(Buffer.alloc(this.blockRemain)); + } + return this[CLOSE]((er) => er ? this.emit("error", er) : this.end()); } - if (mode & 32) { - mode |= 8; + if (!this.buf) { + throw new Error("buffer lost somehow in ONDRAIN"); } - if (mode & 4) { - mode |= 1; + if (this.offset >= this.length) { + this.buf = Buffer.allocUnsafe(Math.min(this.blockRemain, this.buf.length)); + this.offset = 0; } + this.length = this.buf.length - this.offset; + this[READ2](); } - return mode; }; - } -}); - -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/write-entry.js -var import_fs14, import_path13, prefixPath, maxReadSize, PROCESS, FILE2, DIRECTORY2, SYMLINK2, HARDLINK2, HEADER, READ2, LSTAT, ONLSTAT, ONREAD, ONREADLINK, OPENFILE, ONOPENFILE, CLOSE, MODE, AWAITDRAIN, ONDRAIN, PREFIX, WriteEntry, WriteEntrySync, WriteEntryTar, getType; -var init_write_entry = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/write-entry.js"() { - import_fs14 = __toESM(require("fs"), 1); - init_esm(); - import_path13 = __toESM(require("path"), 1); - init_header(); - init_mode_fix(); - init_normalize_windows_path(); - init_options(); - init_pax(); - init_strip_absolute_path(); - init_strip_trailing_slashes(); - init_warn_method(); - init_winchars(); - prefixPath = (path16, prefix) => { - if (!prefix) { - return normalizeWindowsPath(path16); + WriteEntrySync = class extends WriteEntry { + sync = true; + [LSTAT]() { + this[ONLSTAT](import_fs11.default.lstatSync(this.absolute)); + } + [SYMLINK2]() { + this[ONREADLINK](import_fs11.default.readlinkSync(this.absolute)); + } + [OPENFILE]() { + this[ONOPENFILE](import_fs11.default.openSync(this.absolute, "r")); + } + [READ2]() { + let threw = true; + try { + const { fd, buf, offset, length, pos: pos2 } = this; + if (fd === void 0 || buf === void 0) { + throw new Error("fd and buf must be set in READ method"); + } + const bytesRead = import_fs11.default.readSync(fd, buf, offset, length, pos2); + this[ONREAD](bytesRead); + threw = false; + } finally { + if (threw) { + try { + this[CLOSE](() => { + }); + } catch (er) { + } + } + } + } + [AWAITDRAIN](cb) { + cb(); + } + /* c8 ignore start */ + [CLOSE](cb = () => { + }) { + if (this.fd !== void 0) + import_fs11.default.closeSync(this.fd); + cb(); } - path16 = normalizeWindowsPath(path16).replace(/^\.(\/|$)/, ""); - return stripTrailingSlashes(prefix) + "/" + path16; }; - maxReadSize = 16 * 1024 * 1024; - PROCESS = Symbol("process"); - FILE2 = Symbol("file"); - DIRECTORY2 = Symbol("directory"); - SYMLINK2 = Symbol("symlink"); - HARDLINK2 = Symbol("hardlink"); - HEADER = Symbol("header"); - READ2 = Symbol("read"); - LSTAT = Symbol("lstat"); - ONLSTAT = Symbol("onlstat"); - ONREAD = Symbol("onread"); - ONREADLINK = Symbol("onreadlink"); - OPENFILE = Symbol("openfile"); - ONOPENFILE = Symbol("onopenfile"); - CLOSE = Symbol("close"); - MODE = Symbol("mode"); - AWAITDRAIN = Symbol("awaitDrain"); - ONDRAIN = Symbol("ondrain"); - PREFIX = Symbol("prefix"); - WriteEntry = class extends Minipass { - path; - portable; - myuid = process.getuid && process.getuid() || 0; - // until node has builtin pwnam functions, this'll have to do - myuser = process.env.USER || ""; - maxReadSize; - linkCache; - statCache; - preservePaths; - cwd; - strict; - mtime; - noPax; - noMtime; - prefix; - fd; + WriteEntryTar = class extends Minipass { blockLen = 0; blockRemain = 0; - buf; + buf = 0; pos = 0; remain = 0; length = 0; - offset = 0; - win32; - absolute; - header; + preservePaths; + portable; + strict; + noPax; + noMtime; + readEntry; type; + prefix; + path; + mode; + uid; + gid; + uname; + gname; + header; + mtime; + atime; + ctime; linkpath; - stat; + size; onWriteEntry; - #hadError = false; - constructor(p, opt_ = {}) { + warn(code2, message, data = {}) { + return warnMethod(this, code2, message, data); + } + constructor(readEntry, opt_ = {}) { const opt = dealias(opt_); super(); - this.path = normalizeWindowsPath(p); - this.portable = !!opt.portable; - this.maxReadSize = opt.maxReadSize || maxReadSize; - this.linkCache = opt.linkCache || /* @__PURE__ */ new Map(); - this.statCache = opt.statCache || /* @__PURE__ */ new Map(); this.preservePaths = !!opt.preservePaths; - this.cwd = normalizeWindowsPath(opt.cwd || process.cwd()); + this.portable = !!opt.portable; this.strict = !!opt.strict; this.noPax = !!opt.noPax; this.noMtime = !!opt.noMtime; - this.mtime = opt.mtime; - this.prefix = opt.prefix ? normalizeWindowsPath(opt.prefix) : void 0; this.onWriteEntry = opt.onWriteEntry; - if (typeof opt.onwarn === "function") { - this.on("warn", opt.onwarn); - } - let pathWarn = false; - if (!this.preservePaths) { - const [root, stripped] = stripAbsolutePath(this.path); - if (root && typeof stripped === "string") { - this.path = stripped; - pathWarn = root; - } - } - this.win32 = !!opt.win32 || process.platform === "win32"; - if (this.win32) { - this.path = decode(this.path.replace(/\\/g, "/")); - p = p.replace(/\\/g, "/"); - } - this.absolute = normalizeWindowsPath(opt.absolute || import_path13.default.resolve(this.cwd, p)); - if (this.path === "") { - this.path = "./"; - } - if (pathWarn) { - this.warn("TAR_ENTRY_INFO", `stripping ${pathWarn} from absolute path`, { - entry: this, - path: pathWarn + this.path - }); - } - const cs = this.statCache.get(this.absolute); - if (cs) { - this[ONLSTAT](cs); - } else { - this[LSTAT](); - } - } - warn(code2, message, data = {}) { - return warnMethod(this, code2, message, data); - } - emit(ev, ...data) { - if (ev === "error") { - this.#hadError = true; - } - return super.emit(ev, ...data); - } - [LSTAT]() { - import_fs14.default.lstat(this.absolute, (er, stat2) => { - if (er) { - return this.emit("error", er); - } - this[ONLSTAT](stat2); - }); - } - [ONLSTAT](stat2) { - this.statCache.set(this.absolute, stat2); - this.stat = stat2; - if (!stat2.isFile()) { - stat2.size = 0; + this.readEntry = readEntry; + const { type } = readEntry; + if (type === "Unsupported") { + throw new Error("writing entry that should be ignored"); } - this.type = getType(stat2); - this.emit("stat", stat2); - this[PROCESS](); - } - [PROCESS]() { - switch (this.type) { - case "File": - return this[FILE2](); - case "Directory": - return this[DIRECTORY2](); - case "SymbolicLink": - return this[SYMLINK2](); - // unsupported types are ignored. - default: - return this.end(); + this.type = type; + if (this.type === "Directory" && this.portable) { + this.noMtime = true; } - } - [MODE](mode) { - return modeFix(mode, this.type === "Directory", this.portable); - } - [PREFIX](path16) { - return prefixPath(path16, this.prefix); - } - [HEADER]() { - if (!this.stat) { - throw new Error("cannot write header before stat"); + this.prefix = opt.prefix; + this.path = normalizeWindowsPath(readEntry.path); + this.mode = readEntry.mode !== void 0 ? this[MODE](readEntry.mode) : void 0; + this.uid = this.portable ? void 0 : readEntry.uid; + this.gid = this.portable ? void 0 : readEntry.gid; + this.uname = this.portable ? void 0 : readEntry.uname; + this.gname = this.portable ? void 0 : readEntry.gname; + this.size = readEntry.size; + this.mtime = this.noMtime ? void 0 : opt.mtime || readEntry.mtime; + this.atime = this.portable ? void 0 : readEntry.atime; + this.ctime = this.portable ? void 0 : readEntry.ctime; + this.linkpath = readEntry.linkpath !== void 0 ? normalizeWindowsPath(readEntry.linkpath) : void 0; + if (typeof opt.onwarn === "function") { + this.on("warn", opt.onwarn); } - if (this.type === "Directory" && this.portable) { - this.noMtime = true; + let pathWarn = false; + if (!this.preservePaths) { + const [root, stripped] = stripAbsolutePath(this.path); + if (root && typeof stripped === "string") { + this.path = stripped; + pathWarn = root; + } } + this.remain = readEntry.size; + this.blockRemain = readEntry.startBlockSize; this.onWriteEntry?.(this); this.header = new Header({ path: this[PREFIX](this.path), - // only apply the prefix to hard links. linkpath: this.type === "Link" && this.linkpath !== void 0 ? this[PREFIX](this.linkpath) : this.linkpath, // only the permissions and setuid/setgid/sticky bitflags // not the higher-order bits that specify file type - mode: this[MODE](this.stat.mode), - uid: this.portable ? void 0 : this.stat.uid, - gid: this.portable ? void 0 : this.stat.gid, - size: this.stat.size, - mtime: this.noMtime ? void 0 : this.mtime || this.stat.mtime, - /* c8 ignore next */ - type: this.type === "Unsupported" ? void 0 : this.type, - uname: this.portable ? void 0 : this.stat.uid === this.myuid ? this.myuser : "", - atime: this.portable ? void 0 : this.stat.atime, - ctime: this.portable ? void 0 : this.stat.ctime + mode: this.mode, + uid: this.portable ? void 0 : this.uid, + gid: this.portable ? void 0 : this.gid, + size: this.size, + mtime: this.noMtime ? void 0 : this.mtime, + type: this.type, + uname: this.portable ? void 0 : this.uname, + atime: this.portable ? void 0 : this.atime, + ctime: this.portable ? void 0 : this.ctime }); + if (pathWarn) { + this.warn("TAR_ENTRY_INFO", `stripping ${pathWarn} from absolute path`, { + entry: this, + path: pathWarn + this.path + }); + } if (this.header.encode() && !this.noPax) { super.write(new Pax({ - atime: this.portable ? void 0 : this.header.atime, - ctime: this.portable ? void 0 : this.header.ctime, - gid: this.portable ? void 0 : this.header.gid, - mtime: this.noMtime ? void 0 : this.mtime || this.header.mtime, + atime: this.portable ? void 0 : this.atime, + ctime: this.portable ? void 0 : this.ctime, + gid: this.portable ? void 0 : this.gid, + mtime: this.noMtime ? void 0 : this.mtime, path: this[PREFIX](this.path), linkpath: this.type === "Link" && this.linkpath !== void 0 ? this[PREFIX](this.linkpath) : this.linkpath, - size: this.header.size, - uid: this.portable ? void 0 : this.header.uid, - uname: this.portable ? void 0 : this.header.uname, - dev: this.portable ? void 0 : this.stat.dev, - ino: this.portable ? void 0 : this.stat.ino, - nlink: this.portable ? void 0 : this.stat.nlink + size: this.size, + uid: this.portable ? void 0 : this.uid, + uname: this.portable ? void 0 : this.uname, + dev: this.portable ? void 0 : this.readEntry.dev, + ino: this.portable ? void 0 : this.readEntry.ino, + nlink: this.portable ? void 0 : this.readEntry.nlink }).encode()); } - const block = this.header?.block; - if (!block) { + const b = this.header?.block; + if (!b) throw new Error("failed to encode header"); + super.write(b); + readEntry.pipe(this); + } + [PREFIX](path16) { + return prefixPath(path16, this.prefix); + } + [MODE](mode) { + return modeFix(mode, this.type === "Directory", this.portable); + } + write(chunk, encoding, cb) { + if (typeof encoding === "function") { + cb = encoding; + encoding = void 0; } - super.write(block); + if (typeof chunk === "string") { + chunk = Buffer.from(chunk, typeof encoding === "string" ? encoding : "utf8"); + } + const writeLen = chunk.length; + if (writeLen > this.blockRemain) { + throw new Error("writing more to entry than is appropriate"); + } + this.blockRemain -= writeLen; + return super.write(chunk, cb); } - [DIRECTORY2]() { - if (!this.stat) { - throw new Error("cannot create directory entry without stat"); + end(chunk, encoding, cb) { + if (this.blockRemain) { + super.write(Buffer.alloc(this.blockRemain)); } - if (this.path.slice(-1) !== "/") { - this.path += "/"; + if (typeof chunk === "function") { + cb = chunk; + encoding = void 0; + chunk = void 0; } - this.stat.size = 0; - this[HEADER](); - this.end(); + if (typeof encoding === "function") { + cb = encoding; + encoding = void 0; + } + if (typeof chunk === "string") { + chunk = Buffer.from(chunk, encoding ?? "utf8"); + } + if (cb) + this.once("finish", cb); + chunk ? super.end(chunk, cb) : super.end(cb); + return this; } - [SYMLINK2]() { - import_fs14.default.readlink(this.absolute, (er, linkpath) => { - if (er) { - return this.emit("error", er); - } - this[ONREADLINK](linkpath); - }); + }; + getType = (stat) => stat.isFile() ? "File" : stat.isDirectory() ? "Directory" : stat.isSymbolicLink() ? "SymbolicLink" : "Unsupported"; + } +}); + +// .yarn/cache/yallist-npm-5.0.0-8732dd9f1c-a499c81ce6.zip/node_modules/yallist/dist/esm/index.js +function insertAfter(self2, node, value) { + const prev = node; + const next = node ? node.next : self2.head; + const inserted = new Node(value, prev, next, self2); + if (inserted.next === void 0) { + self2.tail = inserted; + } + if (inserted.prev === void 0) { + self2.head = inserted; + } + self2.length++; + return inserted; +} +function push(self2, item) { + self2.tail = new Node(item, self2.tail, void 0, self2); + if (!self2.head) { + self2.head = self2.tail; + } + self2.length++; +} +function unshift(self2, item) { + self2.head = new Node(item, void 0, self2.head, self2); + if (!self2.tail) { + self2.tail = self2.head; + } + self2.length++; +} +var Yallist, Node; +var init_esm5 = __esm({ + ".yarn/cache/yallist-npm-5.0.0-8732dd9f1c-a499c81ce6.zip/node_modules/yallist/dist/esm/index.js"() { + Yallist = class _Yallist { + tail; + head; + length = 0; + static create(list2 = []) { + return new _Yallist(list2); } - [ONREADLINK](linkpath) { - this.linkpath = normalizeWindowsPath(linkpath); - this[HEADER](); - this.end(); + constructor(list2 = []) { + for (const item of list2) { + this.push(item); + } } - [HARDLINK2](linkpath) { - if (!this.stat) { - throw new Error("cannot create link entry without stat"); + *[Symbol.iterator]() { + for (let walker = this.head; walker; walker = walker.next) { + yield walker.value; } - this.type = "Link"; - this.linkpath = normalizeWindowsPath(import_path13.default.relative(this.cwd, linkpath)); - this.stat.size = 0; - this[HEADER](); - this.end(); } - [FILE2]() { - if (!this.stat) { - throw new Error("cannot create file entry without stat"); + removeNode(node) { + if (node.list !== this) { + throw new Error("removing node which does not belong to this list"); } - if (this.stat.nlink > 1) { - const linkKey = `${this.stat.dev}:${this.stat.ino}`; - const linkpath = this.linkCache.get(linkKey); - if (linkpath?.indexOf(this.cwd) === 0) { - return this[HARDLINK2](linkpath); - } - this.linkCache.set(linkKey, this.absolute); + const next = node.next; + const prev = node.prev; + if (next) { + next.prev = prev; } - this[HEADER](); - if (this.stat.size === 0) { - return this.end(); + if (prev) { + prev.next = next; } - this[OPENFILE](); - } - [OPENFILE]() { - import_fs14.default.open(this.absolute, "r", (er, fd) => { - if (er) { - return this.emit("error", er); - } - this[ONOPENFILE](fd); - }); - } - [ONOPENFILE](fd) { - this.fd = fd; - if (this.#hadError) { - return this[CLOSE](); + if (node === this.head) { + this.head = next; } - if (!this.stat) { - throw new Error("should stat before calling onopenfile"); + if (node === this.tail) { + this.tail = prev; } - this.blockLen = 512 * Math.ceil(this.stat.size / 512); - this.blockRemain = this.blockLen; - const bufLen = Math.min(this.blockLen, this.maxReadSize); - this.buf = Buffer.allocUnsafe(bufLen); - this.offset = 0; - this.pos = 0; - this.remain = this.stat.size; - this.length = this.buf.length; - this[READ2](); + this.length--; + node.next = void 0; + node.prev = void 0; + node.list = void 0; + return next; } - [READ2]() { - const { fd, buf, offset, length, pos: pos2 } = this; - if (fd === void 0 || buf === void 0) { - throw new Error("cannot read file without first opening"); + unshiftNode(node) { + if (node === this.head) { + return; + } + if (node.list) { + node.list.removeNode(node); + } + const head = this.head; + node.list = this; + node.next = head; + if (head) { + head.prev = node; + } + this.head = node; + if (!this.tail) { + this.tail = node; } - import_fs14.default.read(fd, buf, offset, length, pos2, (er, bytesRead) => { - if (er) { - return this[CLOSE](() => this.emit("error", er)); - } - this[ONREAD](bytesRead); - }); - } - /* c8 ignore start */ - [CLOSE](cb = () => { - }) { - if (this.fd !== void 0) - import_fs14.default.close(this.fd, cb); + this.length++; } - [ONREAD](bytesRead) { - if (bytesRead <= 0 && this.remain > 0) { - const er = Object.assign(new Error("encountered unexpected EOF"), { - path: this.absolute, - syscall: "read", - code: "EOF" - }); - return this[CLOSE](() => this.emit("error", er)); - } - if (bytesRead > this.remain) { - const er = Object.assign(new Error("did not encounter expected EOF"), { - path: this.absolute, - syscall: "read", - code: "EOF" - }); - return this[CLOSE](() => this.emit("error", er)); + pushNode(node) { + if (node === this.tail) { + return; } - if (!this.buf) { - throw new Error("should have created buffer prior to reading"); + if (node.list) { + node.list.removeNode(node); } - if (bytesRead === this.remain) { - for (let i = bytesRead; i < this.length && bytesRead < this.blockRemain; i++) { - this.buf[i + this.offset] = 0; - bytesRead++; - this.remain++; - } + const tail = this.tail; + node.list = this; + node.prev = tail; + if (tail) { + tail.next = node; } - const chunk = this.offset === 0 && bytesRead === this.buf.length ? this.buf : this.buf.subarray(this.offset, this.offset + bytesRead); - const flushed = this.write(chunk); - if (!flushed) { - this[AWAITDRAIN](() => this[ONDRAIN]()); - } else { - this[ONDRAIN](); + this.tail = node; + if (!this.head) { + this.head = node; } + this.length++; } - [AWAITDRAIN](cb) { - this.once("drain", cb); + push(...args) { + for (let i = 0, l = args.length; i < l; i++) { + push(this, args[i]); + } + return this.length; } - write(chunk, encoding, cb) { - if (typeof encoding === "function") { - cb = encoding; - encoding = void 0; + unshift(...args) { + for (var i = 0, l = args.length; i < l; i++) { + unshift(this, args[i]); } - if (typeof chunk === "string") { - chunk = Buffer.from(chunk, typeof encoding === "string" ? encoding : "utf8"); + return this.length; + } + pop() { + if (!this.tail) { + return void 0; } - if (this.blockRemain < chunk.length) { - const er = Object.assign(new Error("writing more data than expected"), { - path: this.absolute - }); - return this.emit("error", er); + const res = this.tail.value; + const t = this.tail; + this.tail = this.tail.prev; + if (this.tail) { + this.tail.next = void 0; + } else { + this.head = void 0; } - this.remain -= chunk.length; - this.blockRemain -= chunk.length; - this.pos += chunk.length; - this.offset += chunk.length; - return super.write(chunk, null, cb); + t.list = void 0; + this.length--; + return res; } - [ONDRAIN]() { - if (!this.remain) { - if (this.blockRemain) { - super.write(Buffer.alloc(this.blockRemain)); - } - return this[CLOSE]((er) => er ? this.emit("error", er) : this.end()); - } - if (!this.buf) { - throw new Error("buffer lost somehow in ONDRAIN"); + shift() { + if (!this.head) { + return void 0; } - if (this.offset >= this.length) { - this.buf = Buffer.allocUnsafe(Math.min(this.blockRemain, this.buf.length)); - this.offset = 0; + const res = this.head.value; + const h = this.head; + this.head = this.head.next; + if (this.head) { + this.head.prev = void 0; + } else { + this.tail = void 0; } - this.length = this.buf.length - this.offset; - this[READ2](); - } - }; - WriteEntrySync = class extends WriteEntry { - sync = true; - [LSTAT]() { - this[ONLSTAT](import_fs14.default.lstatSync(this.absolute)); - } - [SYMLINK2]() { - this[ONREADLINK](import_fs14.default.readlinkSync(this.absolute)); + h.list = void 0; + this.length--; + return res; } - [OPENFILE]() { - this[ONOPENFILE](import_fs14.default.openSync(this.absolute, "r")); + forEach(fn2, thisp) { + thisp = thisp || this; + for (let walker = this.head, i = 0; !!walker; i++) { + fn2.call(thisp, walker.value, i, this); + walker = walker.next; + } } - [READ2]() { - let threw = true; - try { - const { fd, buf, offset, length, pos: pos2 } = this; - if (fd === void 0 || buf === void 0) { - throw new Error("fd and buf must be set in READ method"); - } - const bytesRead = import_fs14.default.readSync(fd, buf, offset, length, pos2); - this[ONREAD](bytesRead); - threw = false; - } finally { - if (threw) { - try { - this[CLOSE](() => { - }); - } catch (er) { - } - } + forEachReverse(fn2, thisp) { + thisp = thisp || this; + for (let walker = this.tail, i = this.length - 1; !!walker; i--) { + fn2.call(thisp, walker.value, i, this); + walker = walker.prev; } } - [AWAITDRAIN](cb) { - cb(); + get(n) { + let i = 0; + let walker = this.head; + for (; !!walker && i < n; i++) { + walker = walker.next; + } + if (i === n && !!walker) { + return walker.value; + } } - /* c8 ignore start */ - [CLOSE](cb = () => { - }) { - if (this.fd !== void 0) - import_fs14.default.closeSync(this.fd); - cb(); + getReverse(n) { + let i = 0; + let walker = this.tail; + for (; !!walker && i < n; i++) { + walker = walker.prev; + } + if (i === n && !!walker) { + return walker.value; + } } - }; - WriteEntryTar = class extends Minipass { - blockLen = 0; - blockRemain = 0; - buf = 0; - pos = 0; - remain = 0; - length = 0; - preservePaths; - portable; - strict; - noPax; - noMtime; - readEntry; - type; - prefix; - path; - mode; - uid; - gid; - uname; - gname; - header; - mtime; - atime; - ctime; - linkpath; - size; - onWriteEntry; - warn(code2, message, data = {}) { - return warnMethod(this, code2, message, data); + map(fn2, thisp) { + thisp = thisp || this; + const res = new _Yallist(); + for (let walker = this.head; !!walker; ) { + res.push(fn2.call(thisp, walker.value, this)); + walker = walker.next; + } + return res; } - constructor(readEntry, opt_ = {}) { - const opt = dealias(opt_); - super(); - this.preservePaths = !!opt.preservePaths; - this.portable = !!opt.portable; - this.strict = !!opt.strict; - this.noPax = !!opt.noPax; - this.noMtime = !!opt.noMtime; - this.onWriteEntry = opt.onWriteEntry; - this.readEntry = readEntry; - const { type } = readEntry; - if (type === "Unsupported") { - throw new Error("writing entry that should be ignored"); + mapReverse(fn2, thisp) { + thisp = thisp || this; + var res = new _Yallist(); + for (let walker = this.tail; !!walker; ) { + res.push(fn2.call(thisp, walker.value, this)); + walker = walker.prev; } - this.type = type; - if (this.type === "Directory" && this.portable) { - this.noMtime = true; + return res; + } + reduce(fn2, initial) { + let acc; + let walker = this.head; + if (arguments.length > 1) { + acc = initial; + } else if (this.head) { + walker = this.head.next; + acc = this.head.value; + } else { + throw new TypeError("Reduce of empty list with no initial value"); } - this.prefix = opt.prefix; - this.path = normalizeWindowsPath(readEntry.path); - this.mode = readEntry.mode !== void 0 ? this[MODE](readEntry.mode) : void 0; - this.uid = this.portable ? void 0 : readEntry.uid; - this.gid = this.portable ? void 0 : readEntry.gid; - this.uname = this.portable ? void 0 : readEntry.uname; - this.gname = this.portable ? void 0 : readEntry.gname; - this.size = readEntry.size; - this.mtime = this.noMtime ? void 0 : opt.mtime || readEntry.mtime; - this.atime = this.portable ? void 0 : readEntry.atime; - this.ctime = this.portable ? void 0 : readEntry.ctime; - this.linkpath = readEntry.linkpath !== void 0 ? normalizeWindowsPath(readEntry.linkpath) : void 0; - if (typeof opt.onwarn === "function") { - this.on("warn", opt.onwarn); + for (var i = 0; !!walker; i++) { + acc = fn2(acc, walker.value, i); + walker = walker.next; } - let pathWarn = false; - if (!this.preservePaths) { - const [root, stripped] = stripAbsolutePath(this.path); - if (root && typeof stripped === "string") { - this.path = stripped; - pathWarn = root; - } + return acc; + } + reduceReverse(fn2, initial) { + let acc; + let walker = this.tail; + if (arguments.length > 1) { + acc = initial; + } else if (this.tail) { + walker = this.tail.prev; + acc = this.tail.value; + } else { + throw new TypeError("Reduce of empty list with no initial value"); } - this.remain = readEntry.size; - this.blockRemain = readEntry.startBlockSize; - this.onWriteEntry?.(this); - this.header = new Header({ - path: this[PREFIX](this.path), - linkpath: this.type === "Link" && this.linkpath !== void 0 ? this[PREFIX](this.linkpath) : this.linkpath, - // only the permissions and setuid/setgid/sticky bitflags - // not the higher-order bits that specify file type - mode: this.mode, - uid: this.portable ? void 0 : this.uid, - gid: this.portable ? void 0 : this.gid, - size: this.size, - mtime: this.noMtime ? void 0 : this.mtime, - type: this.type, - uname: this.portable ? void 0 : this.uname, - atime: this.portable ? void 0 : this.atime, - ctime: this.portable ? void 0 : this.ctime - }); - if (pathWarn) { - this.warn("TAR_ENTRY_INFO", `stripping ${pathWarn} from absolute path`, { - entry: this, - path: pathWarn + this.path - }); + for (let i = this.length - 1; !!walker; i--) { + acc = fn2(acc, walker.value, i); + walker = walker.prev; } - if (this.header.encode() && !this.noPax) { - super.write(new Pax({ - atime: this.portable ? void 0 : this.atime, - ctime: this.portable ? void 0 : this.ctime, - gid: this.portable ? void 0 : this.gid, - mtime: this.noMtime ? void 0 : this.mtime, - path: this[PREFIX](this.path), - linkpath: this.type === "Link" && this.linkpath !== void 0 ? this[PREFIX](this.linkpath) : this.linkpath, - size: this.size, - uid: this.portable ? void 0 : this.uid, - uname: this.portable ? void 0 : this.uname, - dev: this.portable ? void 0 : this.readEntry.dev, - ino: this.portable ? void 0 : this.readEntry.ino, - nlink: this.portable ? void 0 : this.readEntry.nlink - }).encode()); + return acc; + } + toArray() { + const arr = new Array(this.length); + for (let i = 0, walker = this.head; !!walker; i++) { + arr[i] = walker.value; + walker = walker.next; } - const b = this.header?.block; - if (!b) - throw new Error("failed to encode header"); - super.write(b); - readEntry.pipe(this); + return arr; } - [PREFIX](path16) { - return prefixPath(path16, this.prefix); + toArrayReverse() { + const arr = new Array(this.length); + for (let i = 0, walker = this.tail; !!walker; i++) { + arr[i] = walker.value; + walker = walker.prev; + } + return arr; } - [MODE](mode) { - return modeFix(mode, this.type === "Directory", this.portable); + slice(from = 0, to = this.length) { + if (to < 0) { + to += this.length; + } + if (from < 0) { + from += this.length; + } + const ret = new _Yallist(); + if (to < from || to < 0) { + return ret; + } + if (from < 0) { + from = 0; + } + if (to > this.length) { + to = this.length; + } + let walker = this.head; + let i = 0; + for (i = 0; !!walker && i < from; i++) { + walker = walker.next; + } + for (; !!walker && i < to; i++, walker = walker.next) { + ret.push(walker.value); + } + return ret; } - write(chunk, encoding, cb) { - if (typeof encoding === "function") { - cb = encoding; - encoding = void 0; + sliceReverse(from = 0, to = this.length) { + if (to < 0) { + to += this.length; } - if (typeof chunk === "string") { - chunk = Buffer.from(chunk, typeof encoding === "string" ? encoding : "utf8"); + if (from < 0) { + from += this.length; } - const writeLen = chunk.length; - if (writeLen > this.blockRemain) { - throw new Error("writing more to entry than is appropriate"); + const ret = new _Yallist(); + if (to < from || to < 0) { + return ret; } - this.blockRemain -= writeLen; - return super.write(chunk, cb); + if (from < 0) { + from = 0; + } + if (to > this.length) { + to = this.length; + } + let i = this.length; + let walker = this.tail; + for (; !!walker && i > to; i--) { + walker = walker.prev; + } + for (; !!walker && i > from; i--, walker = walker.prev) { + ret.push(walker.value); + } + return ret; } - end(chunk, encoding, cb) { - if (this.blockRemain) { - super.write(Buffer.alloc(this.blockRemain)); + splice(start, deleteCount = 0, ...nodes) { + if (start > this.length) { + start = this.length - 1; } - if (typeof chunk === "function") { - cb = chunk; - encoding = void 0; - chunk = void 0; + if (start < 0) { + start = this.length + start; } - if (typeof encoding === "function") { - cb = encoding; - encoding = void 0; + let walker = this.head; + for (let i = 0; !!walker && i < start; i++) { + walker = walker.next; } - if (typeof chunk === "string") { - chunk = Buffer.from(chunk, encoding ?? "utf8"); + const ret = []; + for (let i = 0; !!walker && i < deleteCount; i++) { + ret.push(walker.value); + walker = this.removeNode(walker); } - if (cb) - this.once("finish", cb); - chunk ? super.end(chunk, cb) : super.end(cb); + if (!walker) { + walker = this.tail; + } else if (walker !== this.tail) { + walker = walker.prev; + } + for (const v of nodes) { + walker = insertAfter(this, walker, v); + } + return ret; + } + reverse() { + const head = this.head; + const tail = this.tail; + for (let walker = head; !!walker; walker = walker.prev) { + const p = walker.prev; + walker.prev = walker.next; + walker.next = p; + } + this.head = tail; + this.tail = head; return this; } }; - getType = (stat2) => stat2.isFile() ? "File" : stat2.isDirectory() ? "Directory" : stat2.isSymbolicLink() ? "SymbolicLink" : "Unsupported"; + Node = class { + list; + next; + prev; + value; + constructor(value, prev, next, list2) { + this.list = list2; + this.value = value; + if (prev) { + prev.next = this; + this.prev = prev; + } else { + this.prev = void 0; + } + if (next) { + next.prev = this; + this.next = next; + } else { + this.next = void 0; + } + } + }; } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/pack.js -var import_fs15, import_path14, PackJob, EOF2, ONSTAT, ENDED3, QUEUE2, CURRENT, PROCESS2, PROCESSING, PROCESSJOB, JOBS, JOBDONE, ADDFSENTRY, ADDTARENTRY, STAT, READDIR, ONREADDIR, PIPE, ENTRY, ENTRYOPT, WRITEENTRYCLASS, WRITE, ONDRAIN2, Pack, PackSync; +// .yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/pack.js +var import_fs12, import_path10, PackJob, EOF2, ONSTAT, ENDED3, QUEUE2, CURRENT, PROCESS2, PROCESSING, PROCESSJOB, JOBS, JOBDONE, ADDFSENTRY, ADDTARENTRY, STAT, READDIR, ONREADDIR, PIPE, ENTRY, ENTRYOPT, WRITEENTRYCLASS, WRITE, ONDRAIN2, Pack, PackSync; var init_pack = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/pack.js"() { - import_fs15 = __toESM(require("fs"), 1); + ".yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/pack.js"() { + import_fs12 = __toESM(require("fs"), 1); init_write_entry(); init_esm(); init_esm3(); - init_esm4(); + init_esm5(); init_read_entry(); init_warn_method(); - import_path14 = __toESM(require("path"), 1); + import_path10 = __toESM(require("path"), 1); init_normalize_windows_path(); PackJob = class { path; @@ -19579,6 +19556,14 @@ var init_pack = __esm({ jobs; [WRITEENTRYCLASS]; onWriteEntry; + // Note: we actually DO need a linked list here, because we + // shift() to update the head of the list where we start, but still + // while that happens, need to know what the next item in the queue + // will be. Since we do multiple jobs in parallel, it's not as simple + // as just an Array.shift(), since that would lose the information about + // the next job in the list. We could add a .next field on the PackJob + // class, but then we'd have to be tracking the tail of the queue the + // whole time, and Yallist just does that for us anyway. [QUEUE2]; [JOBS] = 0; [PROCESSING] = false; @@ -19602,9 +19587,9 @@ var init_pack = __esm({ this.on("warn", opt.onwarn); } this.portable = !!opt.portable; - if (opt.gzip || opt.brotli) { - if (opt.gzip && opt.brotli) { - throw new TypeError("gzip and brotli are mutually exclusive"); + if (opt.gzip || opt.brotli || opt.zstd) { + if ((opt.gzip ? 1 : 0) + (opt.brotli ? 1 : 0) + (opt.zstd ? 1 : 0) > 1) { + throw new TypeError("gzip, brotli, zstd are mutually exclusive"); } if (opt.gzip) { if (typeof opt.gzip !== "object") { @@ -19621,6 +19606,12 @@ var init_pack = __esm({ } this.zip = new BrotliCompress(opt.brotli); } + if (opt.zstd) { + if (typeof opt.zstd !== "object") { + opt.zstd = {}; + } + this.zip = new ZstdCompress(opt.zstd); + } if (!this.zip) throw new Error("impossible"); const zip = this.zip; @@ -19680,7 +19671,7 @@ var init_pack = __esm({ return this.flowing; } [ADDTARENTRY](p) { - const absolute = normalizeWindowsPath(import_path14.default.resolve(this.cwd, p.path)); + const absolute = normalizeWindowsPath(import_path10.default.resolve(this.cwd, p.path)); if (!this.filter(p.path, p)) { p.resume(); } else { @@ -19693,28 +19684,28 @@ var init_pack = __esm({ this[PROCESS2](); } [ADDFSENTRY](p) { - const absolute = normalizeWindowsPath(import_path14.default.resolve(this.cwd, p)); + const absolute = normalizeWindowsPath(import_path10.default.resolve(this.cwd, p)); this[QUEUE2].push(new PackJob(p, absolute)); this[PROCESS2](); } [STAT](job) { job.pending = true; this[JOBS] += 1; - const stat2 = this.follow ? "stat" : "lstat"; - import_fs15.default[stat2](job.absolute, (er, stat3) => { + const stat = this.follow ? "stat" : "lstat"; + import_fs12.default[stat](job.absolute, (er, stat2) => { job.pending = false; this[JOBS] -= 1; if (er) { this.emit("error", er); } else { - this[ONSTAT](job, stat3); + this[ONSTAT](job, stat2); } }); } - [ONSTAT](job, stat2) { - this.statCache.set(job.absolute, stat2); - job.stat = stat2; - if (!this.filter(job.path, stat2)) { + [ONSTAT](job, stat) { + this.statCache.set(job.absolute, stat); + job.stat = stat; + if (!this.filter(job.path, stat)) { job.ignore = true; } this[PROCESS2](); @@ -19722,7 +19713,7 @@ var init_pack = __esm({ [READDIR](job) { job.pending = true; this[JOBS] += 1; - import_fs15.default.readdir(job.absolute, (er, entries) => { + import_fs12.default.readdir(job.absolute, (er, entries) => { job.pending = false; this[JOBS] -= 1; if (er) { @@ -19893,11 +19884,11 @@ var init_pack = __esm({ resume() { } [STAT](job) { - const stat2 = this.follow ? "statSync" : "lstatSync"; - this[ONSTAT](job, import_fs15.default[stat2](job.absolute)); + const stat = this.follow ? "statSync" : "lstatSync"; + this[ONSTAT](job, import_fs12.default[stat](job.absolute)); } [READDIR](job) { - this[ONREADDIR](job, import_fs15.default.readdirSync(job.absolute)); + this[ONREADDIR](job, import_fs12.default.readdirSync(job.absolute)); } // gotta get it all in this tick [PIPE](job) { @@ -19926,14 +19917,14 @@ var init_pack = __esm({ } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/create.js +// .yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/create.js var create_exports = {}; __export(create_exports, { create: () => create }); var import_node_path8, createFileSync, createFile, addFilesSync, addFilesAsync, createSync, createAsync, create; var init_create = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/create.js"() { + ".yarn/cache/tar-npm-7.5.1-7b414f7fec-0dad0596a6.zip/node_modules/tar/dist/esm/create.js"() { init_esm2(); import_node_path8 = __toESM(require("node:path"), 1); init_list(); @@ -20011,9 +20002,10 @@ var init_create = __esm({ } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/major.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/major.js var require_major = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/major.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/major.js"(exports2, module2) { + "use strict"; var SemVer3 = require_semver(); var major = (a, loose) => new SemVer3(a, loose).major; module2.exports = major; @@ -21683,11 +21675,11 @@ function String2(descriptor, ...args) { } // package.json -var version = "0.34.0"; +var version = "0.34.1"; // sources/Engine.ts -var import_fs9 = __toESM(require("fs")); -var import_path9 = __toESM(require("path")); +var import_fs6 = __toESM(require("fs")); +var import_path5 = __toESM(require("path")); var import_process3 = __toESM(require("process")); var import_rcompare = __toESM(require_rcompare()); var import_valid3 = __toESM(require_valid()); @@ -21697,7 +21689,7 @@ var import_valid4 = __toESM(require_valid2()); var config_default = { definitions: { npm: { - default: "11.4.2+sha1.6f1519a03f7e04023a957a22b812832d0c4a4b33", + default: "11.6.2+sha1.2af8ff1f23b279df1e5289db7c70cfedd0fe18c5", fetchLatestFrom: { type: "npm", package: "npm" @@ -21734,7 +21726,7 @@ var config_default = { } }, pnpm: { - default: "10.13.1+sha1.aa8c167c4509c97519542ef77a09e4b8ab59fb6a", + default: "10.18.3+sha1.0202a20aaa3d7ba8bc29b50d95efe1a34dd95773", fetchLatestFrom: { type: "npm", package: "pnpm" @@ -21798,7 +21790,7 @@ var config_default = { package: "yarn" }, transparent: { - default: "4.9.2+sha224.b8e0b161ae590950fbda696e6f3ca071362768e5280c5fbfdadf064b", + default: "4.10.3+sha224.6020b3cdcdfbd7dbc24b7a7b75d58a249ce36068a8bf97d39aa8cc6d", commands: [ [ "yarn", @@ -21881,14 +21873,14 @@ var config_default = { // sources/corepackUtils.ts var import_crypto2 = require("crypto"); var import_events4 = require("events"); -var import_fs7 = __toESM(require("fs")); +var import_fs4 = __toESM(require("fs")); var import_module = __toESM(require("module")); -var import_path7 = __toESM(require("path")); +var import_path3 = __toESM(require("path")); var import_range = __toESM(require_range()); var import_semver = __toESM(require_semver()); var import_lt = __toESM(require_lt()); var import_parse3 = __toESM(require_parse()); -var import_promises = require("timers/promises"); +var import_promises2 = require("timers/promises"); // sources/debugUtils.ts var import_debug = __toESM(require_src()); @@ -21945,7 +21937,7 @@ var DEFAULT_HEADERS = { [`Accept`]: `application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8` }; var DEFAULT_NPM_REGISTRY_URL = `https://registry.npmjs.org`; -async function fetchAsJson2(packageName, version3) { +async function fetchAsJson2(packageName, version2) { const npmRegistryUrl = process.env.COREPACK_NPM_REGISTRY || DEFAULT_NPM_REGISTRY_URL; if (process.env.COREPACK_ENABLE_NETWORK === `0`) throw new UsageError(`Network access disabled by the environment; can't reach npm repository ${npmRegistryUrl}`); @@ -21956,9 +21948,9 @@ async function fetchAsJson2(packageName, version3) { const encodedCreds = Buffer.from(`${process.env.COREPACK_NPM_USERNAME}:${process.env.COREPACK_NPM_PASSWORD}`, `utf8`).toString(`base64`); headers.authorization = `Basic ${encodedCreds}`; } - return fetchAsJson(`${npmRegistryUrl}/${packageName}${version3 ? `/${version3}` : ``}`, { headers }); + return fetchAsJson(`${npmRegistryUrl}/${packageName}${version2 ? `/${version2}` : ``}`, { headers }); } -function verifySignature({ signatures, integrity, packageName, version: version3 }) { +function verifySignature({ signatures, integrity, packageName, version: version2 }) { if (!Array.isArray(signatures) || !signatures.length) throw new Error(`No compatible signature found in package metadata`); const { npm: trustedKeys } = process.env.COREPACK_INTEGRITY_KEYS ? JSON.parse(process.env.COREPACK_INTEGRITY_KEYS) : config_default.keys; let signature; @@ -21972,7 +21964,7 @@ function verifySignature({ signatures, integrity, packageName, version: version3 } if (signature?.sig == null) throw new UsageError(`The package was not signed by any trusted keys: ${JSON.stringify({ signatures, trustedKeys }, void 0, 2)}`); const verifier = (0, import_crypto.createVerify)(`SHA256`); - verifier.end(`${packageName}@${version3}:${integrity}`); + verifier.end(`${packageName}@${version2}:${integrity}`); const valid = verifier.verify( `-----BEGIN PUBLIC KEY----- ${key} @@ -21986,12 +21978,12 @@ ${key} } async function fetchLatestStableVersion(packageName) { const metadata = await fetchAsJson2(packageName, `latest`); - const { version: version3, dist: { integrity, signatures, shasum } } = metadata; + const { version: version2, dist: { integrity, signatures, shasum } } = metadata; if (!shouldSkipIntegrityCheck()) { try { verifySignature({ packageName, - version: version3, + version: version2, integrity, signatures }); @@ -21999,7 +21991,7 @@ async function fetchLatestStableVersion(packageName) { throw new Error(`Corepack cannot download the latest stable version of ${packageName}; you can disable signature verification by setting COREPACK_INTEGRITY_CHECK to 0 in your env, or instruct Corepack to use the latest stable release known by this version of Corepack by setting COREPACK_USE_LATEST to 0`, { cause }); } } - return `${version3}+${integrity ? `sha512.${Buffer.from(integrity.slice(7), `base64`).toString(`hex`)}` : `sha1.${shasum}`}`; + return `${version2}+${integrity ? `sha512.${Buffer.from(integrity.slice(7), `base64`).toString(`hex`)}` : `sha1.${shasum}`}`; } async function fetchAvailableTags(packageName) { const metadata = await fetchAsJson2(packageName); @@ -22009,11 +22001,11 @@ async function fetchAvailableVersions(packageName) { const metadata = await fetchAsJson2(packageName); return Object.keys(metadata.versions); } -async function fetchTarballURLAndSignature(packageName, version3) { - const versionMetadata = await fetchAsJson2(packageName, version3); +async function fetchTarballURLAndSignature(packageName, version2) { + const versionMetadata = await fetchAsJson2(packageName, version2); const { tarball, signatures, integrity } = versionMetadata.dist; if (tarball === void 0 || !tarball.startsWith(`http`)) - throw new Error(`${packageName}@${version3} does not have a valid tarball.`); + throw new Error(`${packageName}@${version2} does not have a valid tarball.`); return { tarball, signatures, integrity }; } @@ -22034,7 +22026,8 @@ async function fetch(input, init) { }; input.username = input.password = ``; } - if (input.origin === (process.env.COREPACK_NPM_REGISTRY || DEFAULT_NPM_REGISTRY_URL) && process.env.COREPACK_NPM_TOKEN) { + const registry = process.env.COREPACK_NPM_TOKEN && new URL(process.env.COREPACK_NPM_REGISTRY || DEFAULT_NPM_REGISTRY_URL); + if (registry && input.origin === registry.origin) { headers = { ...headers, authorization: `Bearer ${process.env.COREPACK_NPM_TOKEN}` @@ -22156,10 +22149,10 @@ async function fetchAvailableVersions2(spec) { } } async function findInstalledVersion(installTarget, descriptor) { - const installFolder = import_path7.default.join(installTarget, descriptor.name); + const installFolder = import_path3.default.join(installTarget, descriptor.name); let cacheDirectory; try { - cacheDirectory = await import_fs7.default.promises.opendir(installFolder); + cacheDirectory = await import_fs4.default.promises.opendir(installFolder); } catch (error) { if (error.code === `ENOENT`) { return null; @@ -22207,7 +22200,7 @@ async function download(installTarget, url, algo, binPath = null) { log(`Downloading to ${tmpFolder}`); const stream = await fetchUrlStream(url); const parsedUrl = new URL(url); - const ext = import_path7.default.posix.extname(parsedUrl.pathname); + const ext = import_path3.default.posix.extname(parsedUrl.pathname); let outputFile = null; let sendTo; if (ext === `.tgz`) { @@ -22221,15 +22214,15 @@ async function download(installTarget, url, algo, binPath = null) { } : void 0 }); } else if (ext === `.js`) { - outputFile = import_path7.default.join(tmpFolder, import_path7.default.posix.basename(parsedUrl.pathname)); - sendTo = import_fs7.default.createWriteStream(outputFile); + outputFile = import_path3.default.join(tmpFolder, import_path3.default.posix.basename(parsedUrl.pathname)); + sendTo = import_fs4.default.createWriteStream(outputFile); } stream.pipe(sendTo); let hash = !binPath ? stream.pipe((0, import_crypto2.createHash)(algo)) : null; await (0, import_events4.once)(sendTo, `finish`); if (binPath) { - const downloadedBin = import_path7.default.join(tmpFolder, binPath); - outputFile = import_path7.default.join(tmpFolder, import_path7.default.basename(downloadedBin)); + const downloadedBin = import_path3.default.join(tmpFolder, binPath); + outputFile = import_path3.default.join(tmpFolder, import_path3.default.basename(downloadedBin)); try { await renameSafe(downloadedBin, outputFile); } catch (err) { @@ -22237,7 +22230,7 @@ async function download(installTarget, url, algo, binPath = null) { throw new Error(`Cannot locate '${binPath}' in downloaded tarball`, { cause: err }); throw err; } - const fileStream = import_fs7.default.createReadStream(outputFile); + const fileStream = import_fs4.default.createReadStream(outputFile); hash = fileStream.pipe((0, import_crypto2.createHash)(algo)); await (0, import_events4.once)(fileStream, `close`); } @@ -22250,11 +22243,11 @@ async function download(installTarget, url, algo, binPath = null) { async function installVersion(installTarget, locator, { spec }) { const locatorIsASupportedPackageManager = isSupportedPackageManagerLocator(locator); const locatorReference = locatorIsASupportedPackageManager ? (0, import_parse3.default)(locator.reference) : parseURLReference(locator); - const { version: version3, build } = locatorReference; - const installFolder = import_path7.default.join(installTarget, locator.name, version3); + const { version: version2, build } = locatorReference; + const installFolder = import_path3.default.join(installTarget, locator.name, version2); try { - const corepackFile = import_path7.default.join(installFolder, `.corepack`); - const corepackContent = await import_fs7.default.promises.readFile(corepackFile, `utf8`); + const corepackFile = import_path3.default.join(installFolder, `.corepack`); + const corepackContent = await import_fs4.default.promises.readFile(corepackFile, `utf8`); const corepackData = JSON.parse(corepackContent); log(`Reusing ${locator.name}@${locator.reference} found in ${installFolder}`); return { @@ -22272,11 +22265,11 @@ async function installVersion(installTarget, locator, { spec }) { let integrity; let binPath = null; if (locatorIsASupportedPackageManager) { - url = spec.url.replace(`{}`, version3); + url = spec.url.replace(`{}`, version2); if (process.env.COREPACK_NPM_REGISTRY) { const registry = getRegistryFromPackageManagerSpec(spec); if (registry.type === `npm`) { - ({ tarball: url, signatures, integrity } = await fetchTarballURLAndSignature(registry.package, version3)); + ({ tarball: url, signatures, integrity } = await fetchTarballURLAndSignature(registry.package, version2)); if (registry.bin) { binPath = registry.bin; } @@ -22287,7 +22280,7 @@ async function installVersion(installTarget, locator, { spec }) { ); } } else { - url = decodeURIComponent(version3); + url = decodeURIComponent(version2); if (process.env.COREPACK_NPM_REGISTRY && url.startsWith(DEFAULT_NPM_REGISTRY_URL)) { url = url.replace( DEFAULT_NPM_REGISTRY_URL, @@ -22295,7 +22288,7 @@ async function installVersion(installTarget, locator, { spec }) { ); } } - log(`Installing ${locator.name}@${version3} from ${url}`); + log(`Installing ${locator.name}@${version2} from ${url}`); const algo = build[0] ?? `sha512`; const { tmpFolder, outputFile, hash: actualHash } = await download(installTarget, url, algo, binPath); let bin; @@ -22310,7 +22303,7 @@ async function installVersion(installTarget, locator, { spec }) { if (locatorIsASupportedPackageManager && isValidBinSpec(spec.bin)) { bin = spec.bin; } else { - const { name: packageName, bin: packageBin } = require(import_path7.default.join(tmpFolder, `package.json`)); + const { name: packageName, bin: packageBin } = require(import_path3.default.join(tmpFolder, `package.json`)); if (typeof packageBin === `string`) { bin = { [packageName]: packageBin }; } else if (isValidBinSpec(packageBin)) { @@ -22324,27 +22317,27 @@ async function installVersion(installTarget, locator, { spec }) { const registry = getRegistryFromPackageManagerSpec(spec); if (registry.type === `npm` && !registry.bin && !shouldSkipIntegrityCheck()) { if (signatures == null || integrity == null) - ({ signatures, integrity } = await fetchTarballURLAndSignature(registry.package, version3)); - verifySignature({ signatures, integrity, packageName: registry.package, version: version3 }); + ({ signatures, integrity } = await fetchTarballURLAndSignature(registry.package, version2)); + verifySignature({ signatures, integrity, packageName: registry.package, version: version2 }); build[1] = Buffer.from(integrity.slice(`sha512-`.length), `base64`).toString(`hex`); } } if (build[1] && actualHash !== build[1]) throw new Error(`Mismatch hashes. Expected ${build[1]}, got ${actualHash}`); const serializedHash = `${algo}.${actualHash}`; - await import_fs7.default.promises.writeFile(import_path7.default.join(tmpFolder, `.corepack`), JSON.stringify({ + await import_fs4.default.promises.writeFile(import_path3.default.join(tmpFolder, `.corepack`), JSON.stringify({ locator, bin, hash: serializedHash })); - await import_fs7.default.promises.mkdir(import_path7.default.dirname(installFolder), { recursive: true }); + await import_fs4.default.promises.mkdir(import_path3.default.dirname(installFolder), { recursive: true }); try { await renameSafe(tmpFolder, installFolder); } catch (err) { if (err.code === `ENOTEMPTY` || // On Windows the error code is EPERM so we check if it is a directory - err.code === `EPERM` && (await import_fs7.default.promises.stat(installFolder)).isDirectory()) { + err.code === `EPERM` && (await import_fs4.default.promises.stat(installFolder)).isDirectory()) { log(`Another instance of corepack installed ${locator.name}@${locator.reference}`); - await import_fs7.default.promises.rm(tmpFolder, { recursive: true, force: true }); + await import_fs4.default.promises.rm(tmpFolder, { recursive: true, force: true }); } else { throw err; } @@ -22371,18 +22364,18 @@ async function renameSafe(oldPath, newPath) { if (process.platform === `win32`) { await renameUnderWindows(oldPath, newPath); } else { - await import_fs7.default.promises.rename(oldPath, newPath); + await import_fs4.default.promises.rename(oldPath, newPath); } } async function renameUnderWindows(oldPath, newPath) { const retries = 5; for (let i = 0; i < retries; i++) { try { - await import_fs7.default.promises.rename(oldPath, newPath); + await import_fs4.default.promises.rename(oldPath, newPath); break; } catch (err) { if ((err.code === `ENOENT` || err.code === `EPERM`) && i < retries - 1) { - await (0, import_promises.setTimeout)(100 * 2 ** i); + await (0, import_promises2.setTimeout)(100 * 2 ** i); continue; } else { throw err; @@ -22396,15 +22389,15 @@ async function runVersion(locator, installSpec, binName, args) { if (Array.isArray(bin)) { if (bin.some((name2) => name2 === binName)) { const parsedUrl = new URL(installSpec.spec.url); - const ext = import_path7.default.posix.extname(parsedUrl.pathname); + const ext = import_path3.default.posix.extname(parsedUrl.pathname); if (ext === `.js`) { - binPath = import_path7.default.join(installSpec.location, import_path7.default.posix.basename(parsedUrl.pathname)); + binPath = import_path3.default.join(installSpec.location, import_path3.default.posix.basename(parsedUrl.pathname)); } } } else { for (const [name2, dest] of Object.entries(bin)) { if (name2 === binName) { - binPath = import_path7.default.join(installSpec.location, dest); + binPath = import_path3.default.join(installSpec.location, dest); break; } } @@ -22416,7 +22409,7 @@ async function runVersion(locator, installSpec, binName, args) { await Promise.resolve().then(() => __toESM(require_v8_compile_cache())); } } - process.env.COREPACK_ROOT = import_path7.default.dirname(require.resolve("corepack/package.json")); + process.env.COREPACK_ROOT = import_path3.default.dirname(require.resolve("corepack/package.json")); process.argv = [ process.execPath, binPath, @@ -22436,18 +22429,18 @@ function shouldSkipIntegrityCheck() { // sources/semverUtils.ts var import_range2 = __toESM(require_range()); var import_semver2 = __toESM(require_semver()); -function satisfiesWithPrereleases(version3, range, loose = false) { +function satisfiesWithPrereleases(version2, range, loose = false) { let semverRange; try { semverRange = new import_range2.default(range, loose); } catch (err) { return false; } - if (!version3) + if (!version2) return false; let semverVersion; try { - semverVersion = new import_semver2.default(version3, semverRange.loose); + semverVersion = new import_semver2.default(version2, semverRange.loose); if (semverVersion.prerelease) { semverVersion.prerelease = []; } @@ -22465,8 +22458,8 @@ function satisfiesWithPrereleases(version3, range, loose = false) { } // sources/specUtils.ts -var import_fs8 = __toESM(require("fs")); -var import_path8 = __toESM(require("path")); +var import_fs5 = __toESM(require("fs")); +var import_path4 = __toESM(require("path")); var import_satisfies = __toESM(require_satisfies()); var import_valid = __toESM(require_valid()); var import_valid2 = __toESM(require_valid2()); @@ -22585,24 +22578,24 @@ function parsePackageJSON(packageJSONContent) { console.warn(`! Corepack does not currently support array values for devEngines.packageManager`); return pm; } - const { name: name2, version: version3, onFail } = packageManager; + const { name: name2, version: version2, onFail } = packageManager; if (typeof name2 !== `string` || name2.includes(`@`)) { warnOrThrow(`The value of devEngines.packageManager.name ${JSON.stringify(name2)} is not a supported string value`, onFail); return pm; } - if (version3 != null && (typeof version3 !== `string` || !(0, import_valid2.default)(version3))) { - warnOrThrow(`The value of devEngines.packageManager.version ${JSON.stringify(version3)} is not a valid semver range`, onFail); + if (version2 != null && (typeof version2 !== `string` || !(0, import_valid2.default)(version2))) { + warnOrThrow(`The value of devEngines.packageManager.version ${JSON.stringify(version2)} is not a valid semver range`, onFail); return pm; } - log(`devEngines.packageManager defines that ${name2}@${version3} is the local package manager`); + log(`devEngines.packageManager defines that ${name2}@${version2} is the local package manager`); if (pm) { if (!pm.startsWith?.(`${name2}@`)) warnOrThrow(`"packageManager" field is set to ${JSON.stringify(pm)} which does not match the "devEngines.packageManager" field set to ${JSON.stringify(name2)}`, onFail); - else if (version3 != null && !(0, import_satisfies.default)(pm.slice(packageManager.name.length + 1), version3)) - warnOrThrow(`"packageManager" field is set to ${JSON.stringify(pm)} which does not match the value defined in "devEngines.packageManager" for ${JSON.stringify(name2)} of ${JSON.stringify(version3)}`, onFail); + else if (version2 != null && !(0, import_satisfies.default)(pm.slice(packageManager.name.length + 1), version2)) + warnOrThrow(`"packageManager" field is set to ${JSON.stringify(pm)} which does not match the value defined in "devEngines.packageManager" for ${JSON.stringify(name2)} of ${JSON.stringify(version2)}`, onFail); return pm; } - return `${name2}@${version3 ?? `*`}`; + return `${name2}@${version2 ?? `*`}`; } return pm; } @@ -22614,13 +22607,13 @@ async function setLocalPackageManager(cwd, info) { warnOrThrow(`The requested version of ${info.locator.name}@${info.locator.reference} does not match the devEngines specification (${range.name}@${range.range})`, range.onFail); } } - const content = lookup.type !== `NoProject` ? await import_fs8.default.promises.readFile(lookup.target, `utf8`) : ``; + const content = lookup.type !== `NoProject` ? await import_fs5.default.promises.readFile(lookup.target, `utf8`) : ``; const { data, indent } = readPackageJson(content); const previousPackageManager = data.packageManager ?? (range ? `${range.name}@${range.range}` : `unknown`); data.packageManager = `${info.locator.name}@${info.locator.reference}`; const newContent = normalizeLineEndings(content, `${JSON.stringify(data, null, indent)} `); - await import_fs8.default.promises.writeFile(lookup.target, newContent, `utf8`); + await import_fs5.default.promises.writeFile(lookup.target, newContent, `utf8`); return { previousPackageManager }; @@ -22631,14 +22624,14 @@ async function loadSpec(initialCwd) { let selection = null; while (nextCwd !== currCwd && (!selection || !selection.data.packageManager)) { currCwd = nextCwd; - nextCwd = import_path8.default.dirname(currCwd); + nextCwd = import_path4.default.dirname(currCwd); if (nodeModulesRegExp.test(currCwd)) continue; - const manifestPath = import_path8.default.join(currCwd, `package.json`); + const manifestPath = import_path4.default.join(currCwd, `package.json`); log(`Checking ${manifestPath}`); let content; try { - content = await import_fs8.default.promises.readFile(manifestPath, `utf8`); + content = await import_fs5.default.promises.readFile(manifestPath, `utf8`); } catch (err) { if (err?.code === `ENOENT`) continue; throw err; @@ -22649,9 +22642,9 @@ async function loadSpec(initialCwd) { } catch { } if (typeof data !== `object` || data === null) - throw new UsageError(`Invalid package.json in ${import_path8.default.relative(initialCwd, manifestPath)}`); + throw new UsageError(`Invalid package.json in ${import_path4.default.relative(initialCwd, manifestPath)}`); let localEnv; - const envFilePath2 = import_path8.default.resolve(currCwd, process.env.COREPACK_ENV_FILE ?? `.corepack.env`); + const envFilePath2 = import_path4.default.resolve(currCwd, process.env.COREPACK_ENV_FILE ?? `.corepack.env`); if (process.env.COREPACK_ENV_FILE == `0`) { log(`Skipping env file as configured with COREPACK_ENV_FILE`); localEnv = process.env; @@ -22662,7 +22655,7 @@ async function loadSpec(initialCwd) { log(`Checking ${envFilePath2}`); try { localEnv = { - ...Object.fromEntries(Object.entries((0, import_util.parseEnv)(await import_fs8.default.promises.readFile(envFilePath2, `utf8`))).filter((e) => e[0].startsWith(`COREPACK_`))), + ...Object.fromEntries(Object.entries((0, import_util.parseEnv)(await import_fs5.default.promises.readFile(envFilePath2, `utf8`))).filter((e) => e[0].startsWith(`COREPACK_`))), ...process.env }; log(`Successfully loaded env file found at ${envFilePath2}`); @@ -22676,7 +22669,7 @@ async function loadSpec(initialCwd) { selection = { data, manifestPath, localEnv, envFilePath: envFilePath2 }; } if (selection === null) - return { type: `NoProject`, target: import_path8.default.join(initialCwd, `package.json`) }; + return { type: `NoProject`, target: import_path4.default.join(initialCwd, `package.json`) }; let envFilePath; if (selection.localEnv !== process.env) { envFilePath = selection.envFilePath; @@ -22696,20 +22689,20 @@ async function loadSpec(initialCwd) { onFail: selection.data.devEngines.packageManager.onFail }, // Lazy-loading it so we do not throw errors on commands that do not need valid spec. - getSpec: () => parseSpec(rawPmSpec, import_path8.default.relative(initialCwd, selection.manifestPath)) + getSpec: () => parseSpec(rawPmSpec, import_path4.default.relative(initialCwd, selection.manifestPath)) }; } // sources/Engine.ts function getLastKnownGoodFilePath() { - const lkg = import_path9.default.join(getCorepackHomeFolder(), `lastKnownGood.json`); + const lkg = import_path5.default.join(getCorepackHomeFolder(), `lastKnownGood.json`); log(`LastKnownGood file would be located at ${lkg}`); return lkg; } async function getLastKnownGood() { let raw2; try { - raw2 = await import_fs9.default.promises.readFile(getLastKnownGoodFilePath(), `utf8`); + raw2 = await import_fs6.default.promises.readFile(getLastKnownGoodFilePath(), `utf8`); } catch (err) { if (err?.code === `ENOENT`) { log(`No LastKnownGood version found in Corepack home.`); @@ -22742,8 +22735,8 @@ async function getLastKnownGood() { async function createLastKnownGoodFile(lastKnownGood) { const content = `${JSON.stringify(lastKnownGood, null, 2)} `; - await import_fs9.default.promises.mkdir(getCorepackHomeFolder(), { recursive: true }); - await import_fs9.default.promises.writeFile(getLastKnownGoodFilePath(), content, `utf8`); + await import_fs6.default.promises.mkdir(getCorepackHomeFolder(), { recursive: true }); + await import_fs6.default.promises.writeFile(getLastKnownGoodFilePath(), content, `utf8`); } function getLastKnownGoodFromFileContent(lastKnownGood, packageManager) { if (Object.hasOwn(lastKnownGood, packageManager)) @@ -22908,7 +22901,7 @@ var Engine = class { console.error(`! The local project doesn't define a 'packageManager' field. Corepack will now add one referencing ${installSpec.locator.name}@${installSpec.locator.reference}.`); console.error(`! For more details about this field, consult the documentation at https://nodejs.org/api/packages.html#packagemanager`); console.error(); - await setLocalPackageManager(import_path9.default.dirname(result.target), installSpec); + await setLocalPackageManager(import_path5.default.dirname(result.target), installSpec); } log(`Falling back to ${fallbackDescriptor.name}@${fallbackDescriptor.range} in the absence of "packageManager" field in ${result.target}`); return fallbackDescriptor; @@ -22999,7 +22992,7 @@ var Engine = class { const packageManagerSpec = definition.ranges[range]; const registry = getRegistryFromPackageManagerSpec(packageManagerSpec); const versions2 = await fetchAvailableVersions2(registry); - return versions2.filter((version3) => satisfiesWithPrereleases(version3, finalDescriptor.range)); + return versions2.filter((version2) => satisfiesWithPrereleases(version2, finalDescriptor.range)); })); const highestVersion = [...new Set(versions.flat())].sort(import_rcompare.default); if (highestVersion.length === 0) @@ -23009,7 +23002,7 @@ var Engine = class { }; // sources/commands/Cache.ts -var import_fs10 = __toESM(require("fs")); +var import_fs7 = __toESM(require("fs")); var CacheCommand = class extends Command { static paths = [ [`cache`, `clean`], @@ -23022,13 +23015,13 @@ var CacheCommand = class extends Command { ` }); async execute() { - await import_fs10.default.promises.rm(getInstallFolder(), { recursive: true, force: true }); + await import_fs7.default.promises.rm(getInstallFolder(), { recursive: true, force: true }); } }; // sources/commands/Disable.ts -var import_fs11 = __toESM(require("fs")); -var import_path10 = __toESM(require("path")); +var import_fs8 = __toESM(require("fs")); +var import_path6 = __toESM(require("path")); var import_which = __toESM(require_lib()); var DisableCommand = class extends Command { static paths = [ @@ -23059,7 +23052,7 @@ var DisableCommand = class extends Command { async execute() { let installDirectory = this.installDirectory; if (typeof installDirectory === `undefined`) - installDirectory = import_path10.default.dirname(await (0, import_which.default)(`corepack`)); + installDirectory = import_path6.default.dirname(await (0, import_which.default)(`corepack`)); const names = this.names.length === 0 ? SupportedPackageManagerSetWithoutNpm : this.names; const allBinNames = []; for (const name2 of new Set(names)) { @@ -23072,13 +23065,13 @@ var DisableCommand = class extends Command { await Promise.all(allBinNames.map(removeLink)); } async removePosixLink(installDirectory, binName) { - const file = import_path10.default.join(installDirectory, binName); + const file = import_path6.default.join(installDirectory, binName); try { - if (binName.includes(`yarn`) && isYarnSwitchPath(await import_fs11.default.promises.realpath(file))) { + if (binName.includes(`yarn`) && isYarnSwitchPath(await import_fs8.default.promises.realpath(file))) { console.warn(`${binName} is already installed in ${file} and points to a Yarn Switch install - skipping`); return; } - await import_fs11.default.promises.unlink(file); + await import_fs8.default.promises.unlink(file); } catch (err) { if (err.code !== `ENOENT`) { throw err; @@ -23087,9 +23080,9 @@ var DisableCommand = class extends Command { } async removeWin32Link(installDirectory, binName) { for (const ext of [``, `.ps1`, `.cmd`]) { - const file = import_path10.default.join(installDirectory, `${binName}${ext}`); + const file = import_path6.default.join(installDirectory, `${binName}${ext}`); try { - await import_fs11.default.promises.unlink(file); + await import_fs8.default.promises.unlink(file); } catch (err) { if (err.code !== `ENOENT`) { throw err; @@ -23101,8 +23094,8 @@ var DisableCommand = class extends Command { // sources/commands/Enable.ts var import_cmd_shim = __toESM(require_cmd_shim()); -var import_fs12 = __toESM(require("fs")); -var import_path11 = __toESM(require("path")); +var import_fs9 = __toESM(require("fs")); +var import_path7 = __toESM(require("path")); var import_which2 = __toESM(require_lib()); var EnableCommand = class extends Command { static paths = [ @@ -23133,11 +23126,11 @@ var EnableCommand = class extends Command { async execute() { let installDirectory = this.installDirectory; if (typeof installDirectory === `undefined`) - installDirectory = import_path11.default.dirname(await (0, import_which2.default)(`corepack`)); - installDirectory = import_fs12.default.realpathSync(installDirectory); + installDirectory = import_path7.default.dirname(await (0, import_which2.default)(`corepack`)); + installDirectory = import_fs9.default.realpathSync(installDirectory); const manifestPath = require.resolve("corepack/package.json"); - const distFolder = import_path11.default.join(import_path11.default.dirname(manifestPath), `dist`); - if (!import_fs12.default.existsSync(distFolder)) + const distFolder = import_path7.default.join(import_path7.default.dirname(manifestPath), `dist`); + if (!import_fs9.default.existsSync(distFolder)) throw new Error(`Assertion failed: The stub folder doesn't exist`); const names = this.names.length === 0 ? SupportedPackageManagerSetWithoutNpm : this.names; const allBinNames = []; @@ -23151,33 +23144,33 @@ var EnableCommand = class extends Command { await Promise.all(allBinNames.map(generateLink)); } async generatePosixLink(installDirectory, distFolder, binName) { - const file = import_path11.default.join(installDirectory, binName); - const symlink = import_path11.default.relative(installDirectory, import_path11.default.join(distFolder, `${binName}.js`)); - if (import_fs12.default.existsSync(file)) { - const currentSymlink = await import_fs12.default.promises.readlink(file); - if (binName.includes(`yarn`) && isYarnSwitchPath(await import_fs12.default.promises.realpath(file))) { + const file = import_path7.default.join(installDirectory, binName); + const symlink = import_path7.default.relative(installDirectory, import_path7.default.join(distFolder, `${binName}.js`)); + if (import_fs9.default.existsSync(file)) { + const currentSymlink = await import_fs9.default.promises.readlink(file); + if (binName.includes(`yarn`) && isYarnSwitchPath(await import_fs9.default.promises.realpath(file))) { console.warn(`${binName} is already installed in ${file} and points to a Yarn Switch install - skipping`); return; } if (currentSymlink !== symlink) { - await import_fs12.default.promises.unlink(file); + await import_fs9.default.promises.unlink(file); } else { return; } } - await import_fs12.default.promises.symlink(symlink, file); + await import_fs9.default.promises.symlink(symlink, file); } async generateWin32Link(installDirectory, distFolder, binName) { - const file = import_path11.default.join(installDirectory, binName); - await (0, import_cmd_shim.default)(import_path11.default.join(distFolder, `${binName}.js`), file, { + const file = import_path7.default.join(installDirectory, binName); + await (0, import_cmd_shim.default)(import_path7.default.join(distFolder, `${binName}.js`), file, { createCmdFile: true }); } }; // sources/commands/InstallGlobal.ts -var import_fs13 = __toESM(require("fs")); -var import_path12 = __toESM(require("path")); +var import_fs10 = __toESM(require("fs")); +var import_path8 = __toESM(require("path")); // sources/commands/Base.ts var BaseCommand = class extends Command { @@ -23244,7 +23237,7 @@ var InstallGlobalCommand = class extends BaseCommand { throw new UsageError(`No package managers specified`); await Promise.all(this.args.map((arg) => { if (arg.endsWith(`.tgz`)) { - return this.installFromTarball(import_path12.default.resolve(this.context.cwd, arg)); + return this.installFromTarball(import_path8.default.resolve(this.context.cwd, arg)); } else { return this.installFromDescriptor(parseSpec(arg, `CLI arguments`, { enforceExactVersion: false })); } @@ -23295,7 +23288,7 @@ var InstallGlobalCommand = class extends BaseCommand { if (!isSupportedPackageManager(name2)) throw new UsageError(`Unsupported package manager '${name2}'`); this.log({ name: name2, reference }); - await import_fs13.default.promises.mkdir(installFolder, { recursive: true }); + await import_fs10.default.promises.mkdir(installFolder, { recursive: true }); await tarX({ file: p, cwd: installFolder }, [`${name2}/${reference}`]); if (!this.cacheOnly) { await this.context.engine.activatePackageManager({ name: name2, reference }); @@ -23334,8 +23327,8 @@ var InstallLocalCommand = class extends BaseCommand { }; // sources/commands/Pack.ts -var import_promises2 = require("fs/promises"); -var import_path15 = __toESM(require("path")); +var import_promises3 = require("fs/promises"); +var import_path11 = __toESM(require("path")); var PackCommand = class extends BaseCommand { static paths = [ [`pack`] @@ -23376,17 +23369,17 @@ var PackCommand = class extends BaseCommand { installLocations.push(packageManagerInfo.location); } const baseInstallFolder = getInstallFolder(); - const outputPath = import_path15.default.resolve(this.context.cwd, this.output ?? `corepack.tgz`); + const outputPath = import_path11.default.resolve(this.context.cwd, this.output ?? `corepack.tgz`); if (!this.json) { this.context.stdout.write(` `); - this.context.stdout.write(`Packing the selected tools in ${import_path15.default.basename(outputPath)}... + this.context.stdout.write(`Packing the selected tools in ${import_path11.default.basename(outputPath)}... `); } const { create: tarC } = await Promise.resolve().then(() => (init_create(), create_exports)); - await (0, import_promises2.mkdir)(baseInstallFolder, { recursive: true }); - await tarC({ gzip: true, cwd: baseInstallFolder, file: import_path15.default.resolve(outputPath) }, installLocations.map((location) => { - return import_path15.default.relative(baseInstallFolder, location); + await (0, import_promises3.mkdir)(baseInstallFolder, { recursive: true }); + await tarC({ gzip: true, cwd: baseInstallFolder, file: import_path11.default.resolve(outputPath) }, installLocations.map((location) => { + return import_path11.default.relative(baseInstallFolder, location); })); if (this.json) { this.context.stdout.write(`${JSON.stringify(outputPath)} @@ -23477,8 +23470,8 @@ var UseCommand = class extends BaseCommand { }; // sources/commands/deprecated/Hydrate.ts -var import_promises3 = require("fs/promises"); -var import_path16 = __toESM(require("path")); +var import_promises4 = require("fs/promises"); +var import_path12 = __toESM(require("path")); var HydrateCommand = class extends Command { static paths = [ [`hydrate`] @@ -23489,7 +23482,7 @@ var HydrateCommand = class extends Command { fileName = options_exports.String(); async execute() { const installFolder = getInstallFolder(); - const fileName = import_path16.default.resolve(this.context.cwd, this.fileName); + const fileName = import_path12.default.resolve(this.context.cwd, this.fileName); const archiveEntries = /* @__PURE__ */ new Map(); let hasShortEntries = false; const { list: tarT } = await Promise.resolve().then(() => (init_list(), list_exports)); @@ -23517,7 +23510,7 @@ var HydrateCommand = class extends Command { else this.context.stdout.write(`Hydrating ${name2}@${reference}... `); - await (0, import_promises3.mkdir)(installFolder, { recursive: true }); + await (0, import_promises4.mkdir)(installFolder, { recursive: true }); await tarX({ file: fileName, cwd: installFolder }, [`${name2}/${reference}`]); if (this.activate) { await this.context.engine.activatePackageManager({ name: name2, reference }); @@ -23530,8 +23523,8 @@ var HydrateCommand = class extends Command { }; // sources/commands/deprecated/Prepare.ts -var import_promises4 = require("fs/promises"); -var import_path17 = __toESM(require("path")); +var import_promises5 = require("fs/promises"); +var import_path13 = __toESM(require("path")); var PrepareCommand = class extends Command { static paths = [ [`prepare`] @@ -23585,14 +23578,14 @@ var PrepareCommand = class extends Command { if (this.output) { const outputName = typeof this.output === `string` ? this.output : `corepack.tgz`; const baseInstallFolder = getInstallFolder(); - const outputPath = import_path17.default.resolve(this.context.cwd, outputName); + const outputPath = import_path13.default.resolve(this.context.cwd, outputName); if (!this.json) - this.context.stdout.write(`Packing the selected tools in ${import_path17.default.basename(outputPath)}... + this.context.stdout.write(`Packing the selected tools in ${import_path13.default.basename(outputPath)}... `); const { create: tarC } = await Promise.resolve().then(() => (init_create(), create_exports)); - await (0, import_promises4.mkdir)(baseInstallFolder, { recursive: true }); - await tarC({ gzip: true, cwd: baseInstallFolder, file: import_path17.default.resolve(outputPath) }, installLocations.map((location) => { - return import_path17.default.relative(baseInstallFolder, location); + await (0, import_promises5.mkdir)(baseInstallFolder, { recursive: true }); + await tarC({ gzip: true, cwd: baseInstallFolder, file: import_path13.default.resolve(outputPath) }, installLocations.map((location) => { + return import_path13.default.relative(baseInstallFolder, location); })); if (this.json) { this.context.stdout.write(`${JSON.stringify(outputPath)} diff --git a/deps/corepack/package.json b/deps/corepack/package.json index baa2a678c8b092..245fc175913e42 100644 --- a/deps/corepack/package.json +++ b/deps/corepack/package.json @@ -1,6 +1,6 @@ { "name": "corepack", - "version": "0.34.0", + "version": "0.34.1", "homepage": "https://github.com/nodejs/corepack#readme", "bugs": { "url": "https://github.com/nodejs/corepack/issues" @@ -16,7 +16,7 @@ "./package.json": "./package.json" }, "license": "MIT", - "packageManager": "yarn@4.9.0+sha224.dce6c5df199861784bd9b0eecb2a228df97e3f18a02b1bb75ff98383", + "packageManager": "yarn@4.10.3+sha224.6020b3cdcdfbd7dbc24b7a7b75d58a249ce36068a8bf97d39aa8cc6d", "devDependencies": { "@types/debug": "^4.1.5", "@types/node": "^20.4.6", @@ -37,7 +37,7 @@ "tar": "^7.4.0", "tsx": "^4.16.2", "typescript": "^5.7.3", - "undici": "^6.19.2", + "undici": "^6.21.2", "v8-compile-cache": "^2.3.0", "vitest": "^3.0.5", "which": "^5.0.0" From 931028400eb27591b761839524574bbab088b7f3 Mon Sep 17 00:00:00 2001 From: Jacob Nichols <32579287+ZenMasterJacob20011@users.noreply.github.com> Date: Tue, 21 Oct 2025 05:21:33 -0500 Subject: [PATCH 48/83] build: use call command when calling python configure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/60098 Reviewed-By: Marco Ippolito Reviewed-By: Stefan Stojanovic Reviewed-By: Ulises Gascón --- vcbuild.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vcbuild.bat b/vcbuild.bat index ece8f222ad8f68..672479614c54d0 100644 --- a/vcbuild.bat +++ b/vcbuild.bat @@ -353,7 +353,7 @@ del .gyp_configure_stamp 2> NUL @rem Generate the VS project. echo configure %configure_flags% echo %configure_flags%> .used_configure_flags -python configure %configure_flags% +call python configure %configure_flags% if errorlevel 1 goto create-msvs-files-failed if not exist node.sln goto create-msvs-files-failed set project_generated=1 From 6e8b029a21950433f68bd88b991fc26508422b4b Mon Sep 17 00:00:00 2001 From: Chengzhong Wu Date: Tue, 21 Oct 2025 23:50:12 +0100 Subject: [PATCH 49/83] tools: limit inspector protocol PR title length MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Antoine du Hamel PR-URL: https://github.com/nodejs/node/pull/60324 Refs: https://github.com/nodejs/node/pull/60312 Reviewed-By: Colin Ihrig Reviewed-By: Michaël Zasso Reviewed-By: Ulises Gascón Reviewed-By: Antoine du Hamel Reviewed-By: Marco Ippolito Reviewed-By: Luigi Pinca Reviewed-By: Rafael Gonzaga Reviewed-By: Yagiz Nizipli --- tools/dep_updaters/update-inspector-protocol.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/dep_updaters/update-inspector-protocol.sh b/tools/dep_updaters/update-inspector-protocol.sh index 713b7e14c4d28d..8637647b23fcb1 100755 --- a/tools/dep_updaters/update-inspector-protocol.sh +++ b/tools/dep_updaters/update-inspector-protocol.sh @@ -37,7 +37,7 @@ python "$BASE_DIR/tools/inspector_protocol/roll.py" \ --node_src_downstream "$BASE_DIR" \ --force -NEW_VERSION=$(grep "Revision:" "$DEPS_DIR/inspector_protocol/README.node" | sed -n "s/^Revision: \(\\w*\)/\1/p") +NEW_VERSION=$(grep "Revision:" "$DEPS_DIR/inspector_protocol/README.node" | sed -n 's/^Revision: \([[:xdigit:]]\{36\}\).*$/\1/p') # Update the version number on maintaining-dependencies.md # and print the new version as the last line of the script as we need From 063fbd87d3e4517a0fb7d0ca074fa783c411f237 Mon Sep 17 00:00:00 2001 From: Stefan Stojanovic Date: Wed, 22 Oct 2025 08:38:18 +0200 Subject: [PATCH 50/83] msi: fix WiX warnings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refs: https://github.com/nodejs/build/issues/4130 PR-URL: https://github.com/nodejs/node/pull/60251 Fixes: https://github.com/nodejs/build/issues/4130 Reviewed-By: Richard Lau Reviewed-By: Michaël Zasso Reviewed-By: Colin Ihrig Reviewed-By: Luigi Pinca --- tools/msvs/msi/nodemsi/nodemsi.wixproj | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/tools/msvs/msi/nodemsi/nodemsi.wixproj b/tools/msvs/msi/nodemsi/nodemsi.wixproj index 0e220b9dd51739..4170e53cf738f5 100644 --- a/tools/msvs/msi/nodemsi/nodemsi.wixproj +++ b/tools/msvs/msi/nodemsi/nodemsi.wixproj @@ -1,5 +1,5 @@ - - + + Debug x64 @@ -36,20 +36,24 @@ - - - + + + - + - - move "$(TargetDir)en-us\$(TargetFileName)" "$(TargetPath)" - move "$(TargetDir)en-us\$(TargetPdbFileName)" "$(TargetPdbPath)" - + + + + From 3d89331496e448306fb62ab03cd388d63193999a Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Wed, 22 Oct 2025 13:05:39 +0200 Subject: [PATCH 51/83] test_runner: use module.registerHooks in module mocks Migrate away from module.register(). This no longer needs to deal with the worker synchronization. PR-URL: https://github.com/nodejs/node/pull/60326 Reviewed-By: Marco Ippolito Reviewed-By: Chemi Atlow Reviewed-By: Yagiz Nizipli Reviewed-By: Geoffrey Booth --- lib/internal/test_runner/coverage.js | 2 +- lib/internal/test_runner/mock/loader.js | 90 ++++-------------- lib/internal/test_runner/mock/mock.js | 92 +++++++------------ .../test-permission-dc-worker-threads.js | 19 ---- test/parallel/test-runner-module-mocking.js | 41 --------- 5 files changed, 54 insertions(+), 190 deletions(-) delete mode 100644 test/parallel/test-permission-dc-worker-threads.js diff --git a/lib/internal/test_runner/coverage.js b/lib/internal/test_runner/coverage.js index 80811dffb1e1d0..8fa9c872568d1e 100644 --- a/lib/internal/test_runner/coverage.js +++ b/lib/internal/test_runner/coverage.js @@ -37,7 +37,7 @@ const { }, } = require('internal/errors'); const { matchGlobPattern } = require('internal/fs/glob'); -const { kMockSearchParam } = require('internal/test_runner/mock/mock'); +const { constants: { kMockSearchParam } } = require('internal/test_runner/mock/loader'); const kCoverageFileRegex = /^coverage-(\d+)-(\d{13})-(\d+)\.json$/; const kIgnoreRegex = /\/\* node:coverage ignore next (?\d+ )?\*\//; diff --git a/lib/internal/test_runner/mock/loader.js b/lib/internal/test_runner/mock/loader.js index ddde5599df509a..a7a22539be3093 100644 --- a/lib/internal/test_runner/mock/loader.js +++ b/lib/internal/test_runner/mock/loader.js @@ -1,77 +1,24 @@ 'use strict'; const { - AtomicsNotify, - AtomicsStore, JSONStringify, SafeMap, } = primordials; -const { - kBadExportsMessage, - kMockSearchParam, - kMockSuccess, - kMockExists, - kMockUnknownMessage, -} = require('internal/test_runner/mock/mock'); + +const kMockSearchParam = 'node-test-mock'; +const kBadExportsMessage = 'Cannot create mock because named exports ' + + 'cannot be applied to the provided default export.'; + const { URL, URLParse } = require('internal/url'); let debug = require('internal/util/debuglog').debuglog('test_runner', (fn) => { debug = fn; }); -// TODO(cjihrig): The mocks need to be thread aware because the exports are -// evaluated on the thread that creates the mock. Before marking this API as -// stable, one of the following issues needs to be implemented: -// https://github.com/nodejs/node/issues/49472 -// or https://github.com/nodejs/node/issues/52219 - const mocks = new SafeMap(); -async function initialize(data) { - data?.port.on('message', ({ type, payload }) => { - debug('mock loader received message type "%s" with payload %o', type, payload); - - if (type === 'node:test:register') { - const { baseURL } = payload; - const mock = mocks.get(baseURL); - - if (mock?.active) { - debug('already mocking "%s"', baseURL); - sendAck(payload.ack, kMockExists); - return; - } - - const localVersion = mock?.localVersion ?? 0; - - debug('new mock version %d for "%s"', localVersion, baseURL); - mocks.set(baseURL, { - __proto__: null, - active: true, - cache: payload.cache, - exportNames: payload.exportNames, - format: payload.format, - hasDefaultExport: payload.hasDefaultExport, - localVersion, - url: baseURL, - }); - sendAck(payload.ack); - } else if (type === 'node:test:unregister') { - const mock = mocks.get(payload.baseURL); - - if (mock !== undefined) { - mock.active = false; - mock.localVersion++; - } - - sendAck(payload.ack); - } else { - sendAck(payload.ack, kMockUnknownMessage); - } - }); -} - -async function resolve(specifier, context, nextResolve) { +function resolve(specifier, context, nextResolve) { debug('resolve hook entry, specifier = "%s", context = %o', specifier, context); - const nextResolveResult = await nextResolve(specifier, context); + const nextResolveResult = nextResolve(specifier, context); const mockSpecifier = nextResolveResult.url; const mock = mocks.get(mockSpecifier); @@ -95,7 +42,7 @@ async function resolve(specifier, context, nextResolve) { return { __proto__: null, url: href, format: nextResolveResult.format }; } -async function load(url, context, nextLoad) { +function load(url, context, nextLoad) { debug('load hook entry, url = "%s", context = %o', url, context); const parsedURL = URLParse(url); if (parsedURL) { @@ -105,7 +52,7 @@ async function load(url, context, nextLoad) { const baseURL = parsedURL ? parsedURL.href : url; const mock = mocks.get(baseURL); - const original = await nextLoad(url, context); + const original = nextLoad(url, context); debug('load hook, mock = %o', mock); if (mock?.active !== true) { return original; @@ -130,14 +77,14 @@ async function load(url, context, nextLoad) { __proto__: null, format, shortCircuit: true, - source: await createSourceFromMock(mock, format), + source: createSourceFromMock(mock, format), }; debug('load hook finished, result = %o', result); return result; } -async function createSourceFromMock(mock, format) { +function createSourceFromMock(mock, format) { // Create mock implementation from provided exports. const { exportNames, hasDefaultExport, url } = mock; const useESM = format === 'module' || format === 'module-typescript'; @@ -196,9 +143,12 @@ if (module.exports === null || typeof module.exports !== 'object') { return source; } -function sendAck(buf, status = kMockSuccess) { - AtomicsStore(buf, 0, status); - AtomicsNotify(buf, 0); -} - -module.exports = { initialize, load, resolve }; +module.exports = { + hooks: { __proto__: null, load, resolve }, + mocks, + constants: { + __proto__: null, + kBadExportsMessage, + kMockSearchParam, + }, +}; diff --git a/lib/internal/test_runner/mock/mock.js b/lib/internal/test_runner/mock/mock.js index 8a63c7757d1752..fac97e51b6a2cf 100644 --- a/lib/internal/test_runner/mock/mock.js +++ b/lib/internal/test_runner/mock/mock.js @@ -2,12 +2,9 @@ const { ArrayPrototypePush, ArrayPrototypeSlice, - AtomicsStore, - AtomicsWait, Error, FunctionPrototypeBind, FunctionPrototypeCall, - Int32Array, ObjectDefineProperty, ObjectGetOwnPropertyDescriptor, ObjectGetPrototypeOf, @@ -19,9 +16,6 @@ const { SafeMap, StringPrototypeSlice, StringPrototypeStartsWith, - globalThis: { - SharedArrayBuffer, - }, } = primordials; const { codes: { @@ -54,19 +48,10 @@ const { validateOneOf, } = require('internal/validators'); const { MockTimers } = require('internal/test_runner/mock/mock_timers'); -const { strictEqual, notStrictEqual } = require('assert'); const { Module } = require('internal/modules/cjs/loader'); -const { MessageChannel } = require('worker_threads'); const { _load, _nodeModulePaths, _resolveFilename, isBuiltin } = Module; function kDefaultFunction() {} const enableModuleMocking = getOptionValue('--experimental-test-module-mocks'); -const kMockSearchParam = 'node-test-mock'; -const kMockSuccess = 1; -const kMockExists = 2; -const kMockUnknownMessage = 3; -const kWaitTimeout = 5_000; -const kBadExportsMessage = 'Cannot create mock because named exports ' + - 'cannot be applied to the provided default export.'; const kSupportedFormats = [ 'builtin', 'commonjs-typescript', @@ -76,6 +61,11 @@ const kSupportedFormats = [ 'module', ]; let sharedModuleState; +const { + hooks: mockHooks, + mocks, + constants: { kBadExportsMessage, kMockSearchParam }, +} = require('internal/test_runner/mock/loader'); class MockFunctionContext { #calls; @@ -201,8 +191,8 @@ class MockModuleContext { hasDefaultExport, namedExports, sharedState, + specifier, }) { - const ack = new Int32Array(new SharedArrayBuffer(4)); const config = { __proto__: null, cache, @@ -218,7 +208,6 @@ class MockModuleContext { this.#sharedState = sharedState; this.#restore = { __proto__: null, - ack, baseURL, cached: fullPath in Module._cache, format, @@ -226,20 +215,29 @@ class MockModuleContext { value: Module._cache[fullPath], }; - sharedState.loaderPort.postMessage({ - __proto__: null, - type: 'node:test:register', - payload: { + const mock = mocks.get(baseURL); + + if (mock?.active) { + debug('already mocking "%s"', baseURL); + throw new ERR_INVALID_STATE( + `Cannot mock '${specifier}'. The module is already mocked.`, + ); + } else { + const localVersion = mock?.localVersion ?? 0; + + debug('new mock version %d for "%s"', localVersion, baseURL); + mocks.set(baseURL, { __proto__: null, - ack, - baseURL, + url: baseURL, cache, exportNames: ObjectKeys(namedExports), hasDefaultExport, format, - }, - }); - waitForAck(ack); + localVersion, + active: true, + }); + } + delete Module._cache[fullPath]; sharedState.mockExports.set(baseURL, { __proto__: null, @@ -261,17 +259,12 @@ class MockModuleContext { Module._cache[this.#restore.fullPath] = this.#restore.value; } - AtomicsStore(this.#restore.ack, 0, 0); - this.#sharedState.loaderPort.postMessage({ - __proto__: null, - type: 'node:test:unregister', - payload: { - __proto__: null, - ack: this.#restore.ack, - baseURL: this.#restore.baseURL, - }, - }); - waitForAck(this.#restore.ack); + const mock = mocks.get(this.#restore.baseURL); + + if (mock !== undefined) { + mock.active = false; + mock.localVersion++; + } this.#sharedState.mockMap.delete(this.#restore.baseURL); this.#sharedState.mockMap.delete(this.#restore.fullPath); @@ -654,7 +647,7 @@ class MockTracker { const hasFileProtocol = StringPrototypeStartsWith(filename, 'file://'); const caller = hasFileProtocol ? filename : pathToFileURL(filename).href; const { format, url } = sharedState.moduleLoader.resolveSync( - mockSpecifier, caller, null, + mockSpecifier, caller, kEmptyObject, ); debug('module mock, url = "%s", format = "%s", caller = "%s"', url, format, caller); if (format) { // Format is not yet known for ambiguous files when detection is enabled. @@ -828,20 +821,13 @@ function setupSharedModuleState() { if (sharedModuleState === undefined) { const { mock } = require('test'); const mockExports = new SafeMap(); - const { port1, port2 } = new MessageChannel(); + const { registerHooks } = require('internal/modules/customization_hooks'); const moduleLoader = esmLoader.getOrInitializeCascadedLoader(); - moduleLoader.register( - 'internal/test_runner/mock/loader', - 'node:', - { __proto__: null, port: port2 }, - [port2], - true, - ); + registerHooks(mockHooks); sharedModuleState = { __proto__: null, - loaderPort: port1, mockExports, mockMap: new SafeMap(), moduleLoader, @@ -941,13 +927,6 @@ function findMethodOnPrototypeChain(instance, methodName) { return descriptor; } -function waitForAck(buf) { - const result = AtomicsWait(buf, 0, 0, kWaitTimeout); - - notStrictEqual(result, 'timed-out', 'test mocking synchronization failed'); - strictEqual(buf[0], kMockSuccess); -} - function ensureNodeScheme(specifier) { if (!StringPrototypeStartsWith(specifier, 'node:')) { return `node:${specifier}`; @@ -962,10 +941,5 @@ if (!enableModuleMocking) { module.exports = { ensureNodeScheme, - kBadExportsMessage, - kMockSearchParam, - kMockSuccess, - kMockExists, - kMockUnknownMessage, MockTracker, }; diff --git a/test/parallel/test-permission-dc-worker-threads.js b/test/parallel/test-permission-dc-worker-threads.js deleted file mode 100644 index 4fdb566f9e1701..00000000000000 --- a/test/parallel/test-permission-dc-worker-threads.js +++ /dev/null @@ -1,19 +0,0 @@ -// Flags: --permission --allow-fs-read=* --experimental-test-module-mocks -'use strict'; - -const common = require('../common'); -const assert = require('node:assert'); - -{ - const diagnostics_channel = require('node:diagnostics_channel'); - diagnostics_channel.subscribe('worker_threads', common.mustNotCall()); - const { mock } = require('node:test'); - - // Module mocking should throw instead of posting to worker_threads dc - assert.throws(() => { - mock.module('node:path'); - }, common.expectsError({ - code: 'ERR_ACCESS_DENIED', - permission: 'WorkerThreads', - })); -} diff --git a/test/parallel/test-runner-module-mocking.js b/test/parallel/test-runner-module-mocking.js index 89e08a9e22a362..dcb6f84597fe71 100644 --- a/test/parallel/test-runner-module-mocking.js +++ b/test/parallel/test-runner-module-mocking.js @@ -679,44 +679,3 @@ test('wrong import syntax should throw error after module mocking', async () => assert.match(stderr, /Error \[ERR_MODULE_NOT_FOUND\]: Cannot find module/); assert.strictEqual(code, 1); }); - -test('should throw ERR_ACCESS_DENIED when permission model is enabled', async (t) => { - const cwd = fixtures.path('test-runner'); - const fixture = fixtures.path('test-runner', 'mock-nm.js'); - const args = [ - '--permission', - '--allow-fs-read=*', - '--experimental-test-module-mocks', - fixture, - ]; - const { - code, - stdout, - } = await common.spawnPromisified(process.execPath, args, { cwd }); - - assert.strictEqual(code, 1); - assert.match(stdout, /Error: Access to this API has been restricted/); - assert.match(stdout, /permission: 'WorkerThreads'/); -}); - -test('should work when --allow-worker is passed and permission model is enabled', async (t) => { - const cwd = fixtures.path('test-runner'); - const fixture = fixtures.path('test-runner', 'mock-nm.js'); - const args = [ - '--permission', - '--allow-fs-read=*', - '--allow-worker', - '--experimental-test-module-mocks', - fixture, - ]; - const { - code, - stdout, - stderr, - signal, - } = await common.spawnPromisified(process.execPath, args, { cwd }); - - assert.strictEqual(code, 0, stderr); - assert.strictEqual(signal, null); - assert.match(stdout, /pass 1/, stderr); -}); From 6bacb6555a881988e41701e517323148bc782354 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerhard=20St=C3=B6bich?= Date: Wed, 22 Oct 2025 16:43:22 +0200 Subject: [PATCH 52/83] doc, module: change async customization hooks to experimental There is ongoing work to replace async customization hooks by a synchronous variant. As a result bugs/design flaws or the async variant (thread leak, overhead) are not addressed. Adapt stability index to avoid wrong assumptions they might move to stable. Refs: https://github.com/nodejs/loaders/issues/201 Refs: https://github.com/nodejs/loaders/pull/198 PR-URL: https://github.com/nodejs/node/pull/60302 Reviewed-By: Matteo Collina Reviewed-By: Colin Ihrig Reviewed-By: Jacob Smith Reviewed-By: Joyee Cheung Reviewed-By: Marco Ippolito Reviewed-By: Darshan Sen --- doc/api/module.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/api/module.md b/doc/api/module.md index fa85d13cbbf069..a687e7a2732ced 100644 --- a/doc/api/module.md +++ b/doc/api/module.md @@ -608,8 +608,7 @@ changes: -> Stability: 1.2 - Release candidate (asynchronous version) -> Stability: 1.1 - Active development (synchronous version) +> Stability: 1.1 - Active development There are two types of module customization hooks that are currently supported: From 6de2407c44f6e807111b1cf70509839f371ad749 Mon Sep 17 00:00:00 2001 From: xiaocainiao633 <1770329881@qq.com> Date: Wed, 22 Oct 2025 23:16:32 +0800 Subject: [PATCH 53/83] test: fix small compile warning in test_network_requests_buffer.cc PR-URL: https://github.com/nodejs/node/pull/60281 Reviewed-By: Colin Ihrig Reviewed-By: Luigi Pinca Reviewed-By: Chengzhong Wu --- test/cctest/inspector/test_network_requests_buffer.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cctest/inspector/test_network_requests_buffer.cc b/test/cctest/inspector/test_network_requests_buffer.cc index 4f02ffb51e29b1..40461e95ff490e 100644 --- a/test/cctest/inspector/test_network_requests_buffer.cc +++ b/test/cctest/inspector/test_network_requests_buffer.cc @@ -168,7 +168,7 @@ TEST(RequestsBuffer, EnforceLimit) { buffer.find("4")->second.push_request_data_blob( protocol::Binary::fromSpan(kDummyData, 10)); // "3" and "4" are kept. - EXPECT_EQ(buffer.total_buffer_size(), 15); + EXPECT_EQ(buffer.total_buffer_size(), 15u); } EXPECT_FALSE(buffer.contains("1")); From e8fdd8d2e8393e2b2cd5de934e34ea6ea6ab58af Mon Sep 17 00:00:00 2001 From: "Node.js GitHub Bot" Date: Wed, 22 Oct 2025 16:16:45 +0100 Subject: [PATCH 54/83] tools: update gyp-next to 0.20.5 PR-URL: https://github.com/nodejs/node/pull/60313 Reviewed-By: Colin Ihrig Reviewed-By: Luigi Pinca Reviewed-By: Chengzhong Wu --- tools/gyp/CHANGELOG.md | 8 ++++++++ tools/gyp/pylib/gyp/generator/android.py | 2 +- tools/gyp/pylib/gyp/generator/compile_commands_json.py | 2 +- tools/gyp/pylib/gyp/generator/gypd.py | 2 +- tools/gyp/pylib/gyp/generator/make.py | 2 +- tools/gyp/pylib/gyp/generator/msvs.py | 6 +++--- tools/gyp/pylib/gyp/generator/xcode.py | 8 ++++---- tools/gyp/pylib/gyp/input.py | 2 +- tools/gyp/pylib/gyp/xcode_emulation.py | 8 +++++--- tools/gyp/pylib/gyp/xcode_ninja.py | 2 +- tools/gyp/pylib/gyp/xcodeproj_file.py | 10 +++++----- tools/gyp/pyproject.toml | 2 +- tools/gyp/tools/graphviz.py | 6 +++--- 13 files changed, 35 insertions(+), 25 deletions(-) diff --git a/tools/gyp/CHANGELOG.md b/tools/gyp/CHANGELOG.md index 69449c0d8049e7..74dbc82832719c 100644 --- a/tools/gyp/CHANGELOG.md +++ b/tools/gyp/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [0.20.5](https://github.com/nodejs/gyp-next/compare/v0.20.4...v0.20.5) (2025-10-13) + + +### Bug Fixes + +* Fix ruff v0.13.0 adds ruff rule RUF059 ([bd4491a](https://github.com/nodejs/gyp-next/commit/bd4491a3ba641eeb040b785bbce367f72c3baf19)) +* handle `None` case in xcode_emulation regexes ([#311](https://github.com/nodejs/gyp-next/issues/311)) ([b21ee31](https://github.com/nodejs/gyp-next/commit/b21ee3150eea9fc1a8811e910e5ba64f42e1fb77)) + ## [0.20.4](https://github.com/nodejs/gyp-next/compare/v0.20.3...v0.20.4) (2025-08-25) diff --git a/tools/gyp/pylib/gyp/generator/android.py b/tools/gyp/pylib/gyp/generator/android.py index cfc0681f6bb049..5d5cae2afbf668 100644 --- a/tools/gyp/pylib/gyp/generator/android.py +++ b/tools/gyp/pylib/gyp/generator/android.py @@ -378,7 +378,7 @@ def WriteRules(self, rules, extra_sources, extra_outputs): inputs = rule.get("inputs") for rule_source in rule.get("rule_sources", []): (rule_source_dirname, rule_source_basename) = os.path.split(rule_source) - (rule_source_root, rule_source_ext) = os.path.splitext( + (rule_source_root, _rule_source_ext) = os.path.splitext( rule_source_basename ) diff --git a/tools/gyp/pylib/gyp/generator/compile_commands_json.py b/tools/gyp/pylib/gyp/generator/compile_commands_json.py index bebb1303154e16..1361aeca48d0cd 100644 --- a/tools/gyp/pylib/gyp/generator/compile_commands_json.py +++ b/tools/gyp/pylib/gyp/generator/compile_commands_json.py @@ -100,7 +100,7 @@ def resolve(filename): def GenerateOutput(target_list, target_dicts, data, params): per_config_commands = {} for qualified_target, target in target_dicts.items(): - build_file, target_name, toolset = gyp.common.ParseQualifiedTarget( + build_file, _target_name, _toolset = gyp.common.ParseQualifiedTarget( qualified_target ) if IsMac(params): diff --git a/tools/gyp/pylib/gyp/generator/gypd.py b/tools/gyp/pylib/gyp/generator/gypd.py index 3c70b81fd25625..89af24a201b101 100644 --- a/tools/gyp/pylib/gyp/generator/gypd.py +++ b/tools/gyp/pylib/gyp/generator/gypd.py @@ -73,7 +73,7 @@ def GenerateOutput(target_list, target_dicts, data, params): output_files = {} for qualified_target in target_list: - [input_file, target] = gyp.common.ParseQualifiedTarget(qualified_target)[0:2] + [input_file, _target] = gyp.common.ParseQualifiedTarget(qualified_target)[0:2] if input_file[-4:] != ".gyp": continue diff --git a/tools/gyp/pylib/gyp/generator/make.py b/tools/gyp/pylib/gyp/generator/make.py index 1f0995718b59b7..5f30f39fc503e5 100644 --- a/tools/gyp/pylib/gyp/generator/make.py +++ b/tools/gyp/pylib/gyp/generator/make.py @@ -1169,7 +1169,7 @@ def WriteRules( for rule_source in rule.get("rule_sources", []): dirs = set() (rule_source_dirname, rule_source_basename) = os.path.split(rule_source) - (rule_source_root, rule_source_ext) = os.path.splitext( + (rule_source_root, _rule_source_ext) = os.path.splitext( rule_source_basename ) diff --git a/tools/gyp/pylib/gyp/generator/msvs.py b/tools/gyp/pylib/gyp/generator/msvs.py index 3b258ee8f395e7..0f14c055049add 100644 --- a/tools/gyp/pylib/gyp/generator/msvs.py +++ b/tools/gyp/pylib/gyp/generator/msvs.py @@ -1666,7 +1666,7 @@ def _HandlePreCompiledHeaders(p, sources, spec): p.AddFileConfig( source, _ConfigFullName(config_name, config), {}, tools=[tool] ) - basename, extension = os.path.splitext(source) + _basename, extension = os.path.splitext(source) if extension == ".c": extensions_excluded_from_precompile = [".cc", ".cpp", ".cxx"] else: @@ -1677,7 +1677,7 @@ def DisableForSourceTree(source_tree): if isinstance(source, MSVSProject.Filter): DisableForSourceTree(source.contents) else: - basename, extension = os.path.splitext(source) + _basename, extension = os.path.splitext(source) if extension in extensions_excluded_from_precompile: for config_name, config in spec["configurations"].items(): tool = MSVSProject.Tool( @@ -3579,7 +3579,7 @@ def _AddSources2( # If the precompiled header is generated by a C source, # we must not try to use it for C++ sources, # and vice versa. - basename, extension = os.path.splitext(precompiled_source) + _basename, extension = os.path.splitext(precompiled_source) if extension == ".c": extensions_excluded_from_precompile = [ ".cc", diff --git a/tools/gyp/pylib/gyp/generator/xcode.py b/tools/gyp/pylib/gyp/generator/xcode.py index 8e05657961fe98..db4b45d1a04d25 100644 --- a/tools/gyp/pylib/gyp/generator/xcode.py +++ b/tools/gyp/pylib/gyp/generator/xcode.py @@ -531,7 +531,7 @@ def AddSourceToTarget(source, type, pbxp, xct): library_extensions = ["a", "dylib", "framework", "o"] basename = posixpath.basename(source) - (root, ext) = posixpath.splitext(basename) + (_root, ext) = posixpath.splitext(basename) if ext: ext = ext[1:].lower() @@ -696,7 +696,7 @@ def GenerateOutput(target_list, target_dicts, data, params): xcode_targets = {} xcode_target_to_target_dict = {} for qualified_target in target_list: - [build_file, target_name, toolset] = gyp.common.ParseQualifiedTarget( + [build_file, target_name, _toolset] = gyp.common.ParseQualifiedTarget( qualified_target ) @@ -1215,7 +1215,7 @@ def GenerateOutput(target_list, target_dicts, data, params): # Add "sources". for source in spec.get("sources", []): - (source_root, source_extension) = posixpath.splitext(source) + (_source_root, source_extension) = posixpath.splitext(source) if source_extension[1:] not in rules_by_ext: # AddSourceToTarget will add the file to a root group if it's not # already there. @@ -1227,7 +1227,7 @@ def GenerateOutput(target_list, target_dicts, data, params): # it's a bundle of any type. if is_bundle: for resource in tgt_mac_bundle_resources: - (resource_root, resource_extension) = posixpath.splitext(resource) + (_resource_root, resource_extension) = posixpath.splitext(resource) if resource_extension[1:] not in rules_by_ext: AddResourceToTarget(resource, pbxp, xct) else: diff --git a/tools/gyp/pylib/gyp/input.py b/tools/gyp/pylib/gyp/input.py index 4965ff1571c73c..f3a5e168f2075d 100644 --- a/tools/gyp/pylib/gyp/input.py +++ b/tools/gyp/pylib/gyp/input.py @@ -2757,7 +2757,7 @@ def ValidateRulesInTarget(target, target_dict, extra_sources_for_rules): source_keys.extend(extra_sources_for_rules) for source_key in source_keys: for source in target_dict.get(source_key, []): - (source_root, source_extension) = os.path.splitext(source) + (_source_root, source_extension) = os.path.splitext(source) if source_extension.startswith("."): source_extension = source_extension[1:] if source_extension == rule_extension: diff --git a/tools/gyp/pylib/gyp/xcode_emulation.py b/tools/gyp/pylib/gyp/xcode_emulation.py index 192a523529fddd..d13eaa9af240b7 100644 --- a/tools/gyp/pylib/gyp/xcode_emulation.py +++ b/tools/gyp/pylib/gyp/xcode_emulation.py @@ -1534,18 +1534,20 @@ def CLTVersion(): FROM_XCODE_PKG_ID = "com.apple.pkg.DeveloperToolsCLI" MAVERICKS_PKG_ID = "com.apple.pkg.CLTools_Executables" - regex = re.compile("version: (?P.+)") + regex = re.compile(r"version: (?P.+)") for key in [MAVERICKS_PKG_ID, STANDALONE_PKG_ID, FROM_XCODE_PKG_ID]: try: output = GetStdout(["/usr/sbin/pkgutil", "--pkg-info", key]) - return re.search(regex, output).groupdict()["version"] + if m := re.search(regex, output): + return m.groupdict()["version"] except (GypError, OSError): continue regex = re.compile(r"Command Line Tools for Xcode\s+(?P\S+)") try: output = GetStdout(["/usr/sbin/softwareupdate", "--history"]) - return re.search(regex, output).groupdict()["version"] + if m := re.search(regex, output): + return m.groupdict()["version"] except (GypError, OSError): return None diff --git a/tools/gyp/pylib/gyp/xcode_ninja.py b/tools/gyp/pylib/gyp/xcode_ninja.py index 1a97a06c51d9f5..a133fdbe8b4f58 100644 --- a/tools/gyp/pylib/gyp/xcode_ninja.py +++ b/tools/gyp/pylib/gyp/xcode_ninja.py @@ -22,7 +22,7 @@ def _WriteWorkspace(main_gyp, sources_gyp, params): """Create a workspace to wrap main and sources gyp paths.""" - (build_file_root, build_file_ext) = os.path.splitext(main_gyp) + (build_file_root, _build_file_ext) = os.path.splitext(main_gyp) workspace_path = build_file_root + ".xcworkspace" options = params["options"] if options.generator_output: diff --git a/tools/gyp/pylib/gyp/xcodeproj_file.py b/tools/gyp/pylib/gyp/xcodeproj_file.py index 11e2be07372230..cb467470d3044b 100644 --- a/tools/gyp/pylib/gyp/xcodeproj_file.py +++ b/tools/gyp/pylib/gyp/xcodeproj_file.py @@ -487,7 +487,7 @@ def Children(self): children = [] for property, attributes in self._schema.items(): - (is_list, property_type, is_strong) = attributes[0:3] + (is_list, _property_type, is_strong) = attributes[0:3] if is_strong and property in self._properties: if not is_list: children.append(self._properties[property]) @@ -913,7 +913,7 @@ def VerifyHasRequiredProperties(self): # TODO(mark): A stronger verification mechanism is needed. Some # subclasses need to perform validation beyond what the schema can enforce. for property, attributes in self._schema.items(): - (is_list, property_type, is_strong, is_required) = attributes[0:4] + (_is_list, _property_type, _is_strong, is_required) = attributes[0:4] if is_required and property not in self._properties: raise KeyError(self.__class__.__name__ + " requires " + property) @@ -923,7 +923,7 @@ def _SetDefaultsFromSchema(self): defaults = {} for property, attributes in self._schema.items(): - (is_list, property_type, is_strong, is_required) = attributes[0:4] + (_is_list, _property_type, _is_strong, is_required) = attributes[0:4] if ( is_required and len(attributes) >= 5 @@ -1616,7 +1616,7 @@ def __init__(self, properties=None, id=None, parent=None): prop_name = "lastKnownFileType" else: basename = posixpath.basename(self._properties["path"]) - (root, ext) = posixpath.splitext(basename) + (_root, ext) = posixpath.splitext(basename) # Check the map using a lowercase extension. # TODO(mark): Maybe it should try with the original case first and fall # back to lowercase, in case there are any instances where case @@ -2010,7 +2010,7 @@ def Name(self): return "Frameworks" def FileGroup(self, path): - (root, ext) = posixpath.splitext(path) + (_root, ext) = posixpath.splitext(path) if ext != "": ext = ext[1:].lower() if ext == "o": diff --git a/tools/gyp/pyproject.toml b/tools/gyp/pyproject.toml index 3a029c4fc5140c..adc82c3350151f 100644 --- a/tools/gyp/pyproject.toml +++ b/tools/gyp/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "gyp-next" -version = "0.20.4" +version = "0.20.5" authors = [ { name="Node.js contributors", email="ryzokuken@disroot.org" }, ] diff --git a/tools/gyp/tools/graphviz.py b/tools/gyp/tools/graphviz.py index ed1c7ab3cd10b5..65f78011b583c0 100755 --- a/tools/gyp/tools/graphviz.py +++ b/tools/gyp/tools/graphviz.py @@ -47,7 +47,7 @@ def WriteGraph(edges): # Bucket targets by file. files = collections.defaultdict(list) for src, dst in edges.items(): - build_file, target_name, toolset = ParseTarget(src) + build_file, target_name, _toolset = ParseTarget(src) files[build_file].append(src) print("digraph D {") @@ -62,14 +62,14 @@ def WriteGraph(edges): # If there's only one node for this file, simplify # the display by making it a box without an internal node. target = targets[0] - build_file, target_name, toolset = ParseTarget(target) + build_file, target_name, _toolset = ParseTarget(target) print(f' "{target}" [shape=box, label="{filename}\\n{target_name}"]') else: # Group multiple nodes together in a subgraph. print(' subgraph "cluster_%s" {' % filename) print(' label = "%s"' % filename) for target in targets: - build_file, target_name, toolset = ParseTarget(target) + build_file, target_name, _toolset = ParseTarget(target) print(f' "{target}" [label="{target_name}"]') print(" }") From 064c8c5cfd8ee588628df8dadc42235eccbe3e3f Mon Sep 17 00:00:00 2001 From: Jimmy Leung <43258070+hkleungai@users.noreply.github.com> Date: Thu, 23 Oct 2025 02:43:07 +0800 Subject: [PATCH 55/83] doc: add missing CAA type to dns.resolveAny() & dnsPromises.resolveAny() The AnyTraits::Parse() method in cares_wrap.cc will "Parse CAA records" as the code comment suggests. The tables in doc should indicate this as well. PR-URL: https://github.com/nodejs/node/pull/58899 Reviewed-By: Tim Perry Reviewed-By: Ethan Arrowood Reviewed-By: Luigi Pinca --- doc/api/dns.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/api/dns.md b/doc/api/dns.md index 61846f6f621014..b2e350bfc6caa6 100644 --- a/doc/api/dns.md +++ b/doc/api/dns.md @@ -540,6 +540,7 @@ will be present on the object: | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | | `'A'` | `address`/`ttl` | | `'AAAA'` | `address`/`ttl` | +| `'CAA'` | Refer to [`dns.resolveCaa()`][] | | `'CNAME'` | `value` | | `'MX'` | Refer to [`dns.resolveMx()`][] | | `'NAPTR'` | Refer to [`dns.resolveNaptr()`][] | @@ -1309,6 +1310,7 @@ present on the object: | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | | `'A'` | `address`/`ttl` | | `'AAAA'` | `address`/`ttl` | +| `'CAA'` | Refer to [`dnsPromises.resolveCaa()`][] | | `'CNAME'` | `value` | | `'MX'` | Refer to [`dnsPromises.resolveMx()`][] | | `'NAPTR'` | Refer to [`dnsPromises.resolveNaptr()`][] | From 2d48d17696d5b3bcf89156b80bd62999490e3e0c Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Thu, 23 Oct 2025 15:42:23 +0200 Subject: [PATCH 56/83] module: refactor and clarify async loader hook customizations - This updates the comments that assume loader hooks must be async - Differentiate the sync/async loader hook paths in naming `#customizations` is now `#asyncLoaderHooks` to make it clear it's from the async APIs. - Differentiate the paths running on the loader hook thread (affects the loading of async other loader hooks and are async) v.s. paths on the main thread calling out to code on the loader hook thread (do not handle loading of other async loader hooks, and can be sync by blocking). - `Hooks` is now `AsyncLoaderHooksOnLoaderHookWorker` - `CustomizedModuleLoader` is now `AsyncLoaderHooksProxiedToLoaderHookWorker` and moved into `lib/internal/modules/esm/hooks.js` as it implements the same interface as `AsyncLoaderHooksOnLoaderHookWorker` - `HooksProxy` is now `AsyncLoaderHookWorker` - Adjust the JSDoc accordingly - Clarify the "loader worker" as the "async loader hook worker" i.e. when there's no _async_ loader hook registered, there won't be this worker, to avoid the misconception that this worker is spawned unconditionally. - The code run on the loader hook worker to process `--experimental-loader` is moved into `lib/internal/modules/esm/worker.js` for clarity. - The initialization configuration `forceDefaultLoader` is split into `shouldSpawnLoaderHookWorker` and `shouldPreloadModules` as those can be separate. - `--experimental-vm-modules` is now processed during pre-execution and no longer part of the initialization of the built-in ESM loader, as it only exposes the vm APIs of ESM, and is unrelated to built-in ESM loading. PR-URL: https://github.com/nodejs/node/pull/60278 Reviewed-By: Geoffrey Booth --- lib/internal/main/worker_thread.js | 22 +- lib/internal/modules/esm/hooks.js | 148 ++++++++++- lib/internal/modules/esm/loader.js | 279 +++++++------------- lib/internal/modules/esm/utils.js | 62 +---- lib/internal/modules/esm/worker.js | 64 ++++- lib/internal/modules/run_main.js | 2 +- lib/internal/process/pre_execution.js | 75 +++--- test/es-module/test-esm-loader-modulemap.js | 2 +- test/parallel/test-bootstrap-modules.js | 10 +- 9 files changed, 355 insertions(+), 309 deletions(-) diff --git a/lib/internal/main/worker_thread.js b/lib/internal/main/worker_thread.js index 62dc44cf34b739..1e28a3452220e9 100644 --- a/lib/internal/main/worker_thread.js +++ b/lib/internal/main/worker_thread.js @@ -11,7 +11,6 @@ const { ObjectDefineProperty, PromisePrototypeThen, RegExpPrototypeExec, - SafeWeakMap, globalThis: { SharedArrayBuffer, }, @@ -19,7 +18,7 @@ const { const { prepareWorkerThreadExecution, - setupUserModules, + initializeModuleLoaders, markBootstrapComplete, } = require('internal/process/pre_execution'); @@ -138,11 +137,13 @@ port.on('message', (message) => { workerIo.sharedCwdCounter = cwdCounter; } - const isLoaderWorker = - doEval === 'internal' && - filename === require('internal/modules/esm/utils').loaderWorkerId; - // Disable custom loaders in loader worker. - setupUserModules(isLoaderWorker); + const isLoaderHookWorker = (filename === 'internal/modules/esm/worker' && doEval === 'internal'); + if (!isLoaderHookWorker) { + // If we are in the loader hook worker, delay the module loader initializations until + // initializeAsyncLoaderHooksOnLoaderHookWorker() which needs to run preloads + // after the asynchronous loader hooks are registered. + initializeModuleLoaders({ shouldSpawnLoaderHookWorker: true, shouldPreloadModules: true }); + } if (!hasStdin) process.stdin.push(null); @@ -152,9 +153,10 @@ port.on('message', (message) => { port.postMessage({ type: UP_AND_RUNNING }); switch (doEval) { case 'internal': { - // Create this WeakMap in js-land because V8 has no C++ API for WeakMap. - internalBinding('module_wrap').callbackMap = new SafeWeakMap(); - require(filename)(workerData, publicPort); + // Currently the only user of internal eval is the async loader hook thread. + assert(isLoaderHookWorker, `Unexpected internal eval ${filename}`); + const setupModuleWorker = require('internal/modules/esm/worker'); + setupModuleWorker(workerData, publicPort); break; } diff --git a/lib/internal/modules/esm/hooks.js b/lib/internal/modules/esm/hooks.js index e3ba5fa86252f5..cc66d47a43b704 100644 --- a/lib/internal/modules/esm/hooks.js +++ b/lib/internal/modules/esm/hooks.js @@ -54,7 +54,6 @@ const { } = require('internal/modules/esm/resolve'); const { getDefaultConditions, - loaderWorkerId, } = require('internal/modules/esm/utils'); const { deserializeError } = require('internal/error_serdes'); const { @@ -105,7 +104,39 @@ function defineImportAssertionAlias(context) { // [2] `validate...()`s throw the wrong error -class Hooks { +/** + * @typedef {{ format: ModuleFormat, source: ModuleSource }} LoadResult + */ + +/** + * @typedef {{ format: ModuleFormat, url: string, importAttributes: Record }} ResolveResult + */ + +/** + * Interface for classes that implement asynchronous loader hooks that can be attached to the ModuleLoader + * via `ModuleLoader.#setAsyncLoaderHooks()`. + * @typedef {object} AsyncLoaderHooks + * @property {boolean} allowImportMetaResolve Whether to allow the use of `import.meta.resolve`. + * @property {(url: string, context: object, defaultLoad: Function) => Promise} load + * Calling the asynchronous `load` hook asynchronously. + * @property {(url: string, context: object, defaultLoad: Function) => LoadResult} loadSync + * Calling the asynchronous `load` hook synchronously. + * @property {(originalSpecifier: string, parentURL: string, + * importAttributes: Record) => Promise} resolve + * Calling the asynchronous `resolve` hook asynchronously. + * @property {(originalSpecifier: string, parentURL: string, + * importAttributes: Record) => ResolveResult} resolveSync + * Calling the asynchronous `resolve` hook synchronously. + * @property {(specifier: string, parentURL: string) => any} register Register asynchronous loader hooks + * @property {() => void} waitForLoaderHookInitialization Force loading of hooks. + */ + +/** + * @implements {AsyncLoaderHooks} + * Instances of this class run directly on the loader hook worker thread and customize the module + * loading of the hooks worker itself. + */ +class AsyncLoaderHooksOnLoaderHookWorker { #chains = { /** * Phase 1 of 2 in ESM loading. @@ -452,7 +483,7 @@ class Hooks { }; } - forceLoadHooks() { + waitForLoaderHookInitialization() { // No-op } @@ -462,14 +493,20 @@ class Hooks { return meta; } } -ObjectSetPrototypeOf(Hooks.prototype, null); +ObjectSetPrototypeOf(AsyncLoaderHooksOnLoaderHookWorker.prototype, null); /** - * There may be multiple instances of Hooks/HooksProxy, but there is only 1 Internal worker, so - * there is only 1 MessageChannel. + * There is only one loader hook thread for each non-loader-hook worker thread + * (i.e. the non-loader-hook thread and any worker threads that are not loader hook workers themselves), + * so there is only 1 MessageChannel. */ let MessageChannel; -class HooksProxy { + +/** + * Abstraction over a worker thread that runs the asynchronous module loader hooks. + * Instances of this class run on the non-loader-hook thread and communicate with the loader hooks worker thread. + */ +class AsyncLoaderHookWorker { /** * Shared memory. Always use Atomics method to read or write to it. * @type {Int32Array} @@ -503,7 +540,7 @@ class HooksProxy { const lock = new SharedArrayBuffer(SHARED_MEMORY_BYTE_LENGTH); this.#lock = new Int32Array(lock); - this.#worker = new InternalWorker(loaderWorkerId, { + this.#worker = new InternalWorker('internal/modules/esm/worker', { stderr: false, stdin: false, stdout: false, @@ -644,7 +681,7 @@ class HooksProxy { this.#importMetaInitializer(meta, context, loader); } } -ObjectSetPrototypeOf(HooksProxy.prototype, null); +ObjectSetPrototypeOf(AsyncLoaderHookWorker.prototype, null); // TODO(JakobJingleheimer): Remove this when loaders go "stable". let globalPreloadWarningWasEmitted = false; @@ -757,6 +794,95 @@ function nextHookFactory(current, meta, { validateArgs, validateOutput }) { ); } +/** + * @type {AsyncLoaderHookWorker} + * Worker instance used to run async loader hooks in a separate thread. This is a singleton for each + * non-loader-hook worker thread (i.e. the main thread and any worker threads that are not + * loader hook workers themselves). + */ +let asyncLoaderHookWorker; +/** + * Get the AsyncLoaderHookWorker instance. If it is not defined, then create a new one. + * @returns {AsyncLoaderHookWorker} + */ +function getAsyncLoaderHookWorker() { + asyncLoaderHookWorker ??= new AsyncLoaderHookWorker(); + return asyncLoaderHookWorker; +} + +/** + * @implements {AsyncLoaderHooks} + * Instances of this class are created in the non-loader-hook thread and communicate with the worker thread + * spawned to run the async loader hooks. + */ +class AsyncLoaderHooksProxiedToLoaderHookWorker { + + allowImportMetaResolve = true; + + /** + * Instantiate a module loader that uses user-provided custom loader hooks. + */ + constructor() { + getAsyncLoaderHookWorker(); + } + + /** + * Register some loader specifier. + * @param {string} originalSpecifier The specified URL path of the loader to + * be registered. + * @param {string} parentURL The parent URL from where the loader will be + * registered if using it package name as specifier + * @param {any} [data] Arbitrary data to be passed from the custom loader + * (user-land) to the worker. + * @param {any[]} [transferList] Objects in `data` that are changing ownership + * @param {boolean} [isInternal] For internal loaders that should not be publicly exposed. + * @returns {{ format: string, url: URL['href'] }} + */ + register(originalSpecifier, parentURL, data, transferList, isInternal) { + return asyncLoaderHookWorker.makeSyncRequest('register', transferList, originalSpecifier, parentURL, + data, isInternal); + } + + /** + * Resolve the location of the module. + * @param {string} originalSpecifier The specified URL path of the module to + * be resolved. + * @param {string} [parentURL] The URL path of the module's parent. + * @param {ImportAttributes} importAttributes Attributes from the import + * statement or expression. + * @returns {{ format: string, url: URL['href'] }} + */ + resolve(originalSpecifier, parentURL, importAttributes) { + return asyncLoaderHookWorker.makeAsyncRequest('resolve', undefined, originalSpecifier, parentURL, importAttributes); + } + + resolveSync(originalSpecifier, parentURL, importAttributes) { + // This happens only as a result of `import.meta.resolve` calls, which must be sync per spec. + return asyncLoaderHookWorker.makeSyncRequest('resolve', undefined, originalSpecifier, parentURL, importAttributes); + } + + /** + * Provide source that is understood by one of Node's translators. + * @param {URL['href']} url The URL/path of the module to be loaded + * @param {object} [context] Metadata about the module + * @returns {Promise<{ format: ModuleFormat, source: ModuleSource }>} + */ + load(url, context) { + return asyncLoaderHookWorker.makeAsyncRequest('load', undefined, url, context); + } + loadSync(url, context) { + return asyncLoaderHookWorker.makeSyncRequest('load', undefined, url, context); + } + + importMetaInitialize(meta, context, loader) { + asyncLoaderHookWorker.importMetaInitialize(meta, context, loader); + } + + waitForLoaderHookInitialization() { + asyncLoaderHookWorker.waitForWorker(); + } +} -exports.Hooks = Hooks; -exports.HooksProxy = HooksProxy; +exports.AsyncLoaderHooksProxiedToLoaderHookWorker = AsyncLoaderHooksProxiedToLoaderHookWorker; +exports.AsyncLoaderHooksOnLoaderHookWorker = AsyncLoaderHooksOnLoaderHookWorker; +exports.AsyncLoaderHookWorker = AsyncLoaderHookWorker; diff --git a/lib/internal/modules/esm/loader.js b/lib/internal/modules/esm/loader.js index 9cb02f05c8d28a..d536d8215c93ab 100644 --- a/lib/internal/modules/esm/loader.js +++ b/lib/internal/modules/esm/loader.js @@ -34,7 +34,7 @@ const { kEmptyObject } = require('internal/util'); const { compileSourceTextModule, getDefaultConditions, - forceDefaultLoader, + shouldSpawnLoaderHookWorker, } = require('internal/modules/esm/utils'); const { kImplicitTypeAttribute } = require('internal/modules/esm/assert'); const { @@ -51,10 +51,10 @@ const { urlToFilename, } = require('internal/modules/helpers'); const { - resolveHooks, - resolveWithHooks, - loadHooks, - loadWithHooks, + resolveHooks: syncResolveHooks, + resolveWithHooks: resolveWithSyncHooks, + loadHooks: syncLoadHooks, + loadWithHooks: loadWithSyncHooks, validateLoadSloppy, } = require('internal/modules/customization_hooks'); let defaultResolve, defaultLoadSync, importMetaInitializer; @@ -69,7 +69,7 @@ let debug = require('internal/util/debuglog').debuglog('esm', (fn) => { const { isPromise } = require('internal/util/types'); /** - * @typedef {import('./hooks.js').HooksProxy} HooksProxy + * @typedef {import('./hooks.js').AsyncLoaderHookWorker} AsyncLoaderHookWorker * @typedef {import('./module_job.js').ModuleJobBase} ModuleJobBase * @typedef {import('url').URL} URL */ @@ -123,14 +123,6 @@ function getRaceMessage(filename, parentFilename) { return raceMessage; } -/** - * @type {HooksProxy} - * Multiple loader instances exist for various, specific reasons (see code comments at site). - * In order to maintain consistency, we use a single worker (sandbox), which must sit apart of an - * individual loader instance. - */ -let hooksProxy; - /** * @typedef {import('../cjs/loader.js').Module} CJSModule */ @@ -152,9 +144,17 @@ let hooksProxy; */ /** - * This class covers the base machinery of module loading. To add custom - * behavior you can pass a customizations object and this object will be - * used to do the loading/resolving/registration process. + * @typedef {import('./hooks.js').AsyncLoaderHooks} AsyncLoaderHooks + * @typedef {import('./hooks.js').AsyncLoaderHooksOnLoaderHookWorker} AsyncLoaderHooksOnLoaderHookWorker + * @typedef {import('./hooks.js').AsyncLoaderHooksProxiedToLoaderHookWorker} AsyncLoaderHooksProxiedToLoaderHookWorker + */ + +/** + * This class covers the base machinery of module loading. There are two types of loader hooks: + * 1. Asynchronous loader hooks, which are run in a separate loader hook worker thread. + * This is configured in #asyncLoaderHooks. + * 2. Synchronous loader hooks, which are run in-thread. This is shared with the CJS loader and is + * stored in the cross-module syncResolveHooks and syncLoadHooks arrays. */ class ModuleLoader { /** @@ -185,73 +185,44 @@ class ModuleLoader { allowImportMetaResolve; /** - * Customizations to pass requests to. - * @type {import('./hooks.js').Hooks} - * Note that this value _MUST_ be set with `setCustomizations` - * because it needs to copy `customizations.allowImportMetaResolve` + * Asynchronous loader hooks to pass requests to. + * + * Note that this value _MUST_ be set with `#setAsyncLoaderHooks` + * because it needs to copy `#asyncLoaderHooks.allowImportMetaResolve` * to this property and failure to do so will cause undefined * behavior when invoking `import.meta.resolve`. - * @see {ModuleLoader.setCustomizations} - * @type {CustomizedModuleLoader} + * + * When the ModuleLoader is created on a loader hook thread, this is + * {@link AsyncLoaderHooksOnLoaderHookWorker}, and its methods directly call out + * to loader methods. Otherwise, this is {@link AsyncLoaderHooksProxiedToLoaderHookWorker}, + * and its methods post messages to the loader thread and possibly block on it. + * @see {ModuleLoader.#setAsyncLoaderHooks} + * @type {AsyncLoaderHooks} */ - #customizations; + #asyncLoaderHooks; - constructor(customizations) { - this.setCustomizations(customizations); + constructor(asyncLoaderHooks) { + this.#setAsyncLoaderHooks(asyncLoaderHooks); } /** - * Change the currently activate customizations for this module - * loader to be the provided `customizations`. + * Change the currently activate async loader hooks for this module + * loader to be the provided `AsyncLoaderHooks`. * * If present, this class customizes its core functionality to the - * `customizations` object, including registration, loading, and resolving. + * `AsyncLoaderHooks` object, including registration, loading, and resolving. * There are some responsibilities that this class _always_ takes - * care of, like validating outputs, so that the customizations object + * care of, like validating outputs, so that the AsyncLoaderHooks object * does not have to do so. * - * The customizations object has the shape: - * - * ```ts - * interface LoadResult { - * format: ModuleFormat; - * source: ModuleSource; - * } - * - * interface ResolveResult { - * format: string; - * url: URL['href']; - * } - * - * interface Customizations { - * allowImportMetaResolve: boolean; - * load(url: string, context: object): Promise - * resolve( - * originalSpecifier: - * string, parentURL: string, - * importAttributes: Record - * ): Promise - * resolveSync( - * originalSpecifier: - * string, parentURL: string, - * importAttributes: Record - * ) ResolveResult; - * register(specifier: string, parentURL: string): any; - * forceLoadHooks(): void; - * } - * ``` - * - * Note that this class _also_ implements the `Customizations` - * interface, as does `CustomizedModuleLoader` and `Hooks`. - * * Calling this function alters how modules are loaded and should be * invoked with care. - * @param {CustomizedModuleLoader} customizations + * @param {AsyncLoaderHooks} asyncLoaderHooks */ - setCustomizations(customizations) { - this.#customizations = customizations; - if (customizations) { - this.allowImportMetaResolve = customizations.allowImportMetaResolve; + #setAsyncLoaderHooks(asyncLoaderHooks) { + this.#asyncLoaderHooks = asyncLoaderHooks; + if (asyncLoaderHooks) { + this.allowImportMetaResolve = asyncLoaderHooks.allowImportMetaResolve; } else { this.allowImportMetaResolve = true; } @@ -707,18 +678,18 @@ class ModuleLoader { } /** - * @see {@link CustomizedModuleLoader.register} + * @see {@link AsyncLoaderHooks.register} * @returns {any} */ register(specifier, parentURL, data, transferList, isInternal) { - if (!this.#customizations) { - // `CustomizedModuleLoader` is defined at the bottom of this file and - // available well before this line is ever invoked. This is here in - // order to preserve the git diff instead of moving the class. - // eslint-disable-next-line no-use-before-define - this.setCustomizations(new CustomizedModuleLoader()); + if (!this.#asyncLoaderHooks) { + // On the loader hook worker thread, the #asyncLoaderHooks must already have been initialized + // to be an instance of AsyncLoaderHooksOnLoaderHookWorker, so this branch can only ever + // be hit on a non-loader-hook thread that will talk to the loader hook worker thread. + const { AsyncLoaderHooksProxiedToLoaderHookWorker } = require('internal/modules/esm/hooks'); + this.#setAsyncLoaderHooks(new AsyncLoaderHooksProxiedToLoaderHookWorker()); } - return this.#customizations.register(`${specifier}`, `${parentURL}`, data, transferList, isInternal); + return this.#asyncLoaderHooks.register(`${specifier}`, `${parentURL}`, data, transferList, isInternal); } /** @@ -733,12 +704,12 @@ class ModuleLoader { */ resolve(specifier, parentURL, importAttributes) { specifier = `${specifier}`; - if (resolveHooks.length) { + if (syncResolveHooks.length) { // Has module.registerHooks() hooks, use the synchronous variant that can handle both hooks. return this.resolveSync(specifier, parentURL, importAttributes); } - if (this.#customizations) { // Only has module.register hooks. - return this.#customizations.resolve(specifier, parentURL, importAttributes); + if (this.#asyncLoaderHooks) { // Only has module.register hooks. + return this.#asyncLoaderHooks.resolve(specifier, parentURL, importAttributes); } return this.#cachedDefaultResolve(specifier, { __proto__: null, @@ -796,8 +767,8 @@ class ModuleLoader { * @returns {{ format: string, url: string }} */ #resolveAndMaybeBlockOnLoaderThread(specifier, context) { - if (this.#customizations) { - return this.#customizations.resolveSync(specifier, context.parentURL, context.importAttributes); + if (this.#asyncLoaderHooks) { + return this.#asyncLoaderHooks.resolveSync(specifier, context.parentURL, context.importAttributes); } return this.#cachedDefaultResolve(specifier, context); } @@ -817,10 +788,10 @@ class ModuleLoader { */ resolveSync(specifier, parentURL, importAttributes = { __proto__: null }) { specifier = `${specifier}`; - if (resolveHooks.length) { + if (syncResolveHooks.length) { // Has module.registerHooks() hooks, chain the asynchronous hooks in the default step. - return resolveWithHooks(specifier, parentURL, importAttributes, this.#defaultConditions, - this.#resolveAndMaybeBlockOnLoaderThread.bind(this)); + return resolveWithSyncHooks(specifier, parentURL, importAttributes, this.#defaultConditions, + this.#resolveAndMaybeBlockOnLoaderThread.bind(this)); } return this.#resolveAndMaybeBlockOnLoaderThread(specifier, { __proto__: null, @@ -838,12 +809,12 @@ class ModuleLoader { * @returns {Promise<{ format: ModuleFormat, source: ModuleSource }> | { format: ModuleFormat, source: ModuleSource }} */ load(url, context) { - if (loadHooks.length) { + if (syncLoadHooks.length) { // Has module.registerHooks() hooks, use the synchronous variant that can handle both hooks. return this.#loadSync(url, context); } - if (this.#customizations) { - return this.#customizations.load(url, context); + if (this.#asyncLoaderHooks) { + return this.#asyncLoaderHooks.load(url, context); } defaultLoadSync ??= require('internal/modules/esm/load').defaultLoadSync; @@ -858,8 +829,8 @@ class ModuleLoader { * @returns {{ format: ModuleFormat, source: ModuleSource }} */ #loadAndMaybeBlockOnLoaderThread(url, context) { - if (this.#customizations) { - return this.#customizations.loadSync(url, context); + if (this.#asyncLoaderHooks) { + return this.#asyncLoaderHooks.loadSync(url, context); } defaultLoadSync ??= require('internal/modules/esm/load').defaultLoadSync; return defaultLoadSync(url, context); @@ -877,12 +848,12 @@ class ModuleLoader { * @returns {{ format: ModuleFormat, source: ModuleSource }} */ #loadSync(url, context) { - if (loadHooks.length) { + if (syncLoadHooks.length) { // Has module.registerHooks() hooks, chain the asynchronous hooks in the default step. // TODO(joyeecheung): construct the ModuleLoadContext in the loaders directly instead // of converting them from plain objects in the hooks. - return loadWithHooks(url, context.format, context.importAttributes, this.#defaultConditions, - this.#loadAndMaybeBlockOnLoaderThread.bind(this), validateLoadSloppy); + return loadWithSyncHooks(url, context.format, context.importAttributes, this.#defaultConditions, + this.#loadAndMaybeBlockOnLoaderThread.bind(this), validateLoadSloppy); } return this.#loadAndMaybeBlockOnLoaderThread(url, context); } @@ -894,8 +865,8 @@ class ModuleLoader { } importMetaInitialize(meta, context) { - if (this.#customizations) { - return this.#customizations.importMetaInitialize(meta, context, this); + if (this.#asyncLoaderHooks) { + return this.#asyncLoaderHooks.importMetaInitialize(meta, context, this); } importMetaInitializer ??= require('internal/modules/esm/initialize_import_meta').initializeImportMeta; meta = importMetaInitializer(meta, context, this); @@ -903,94 +874,29 @@ class ModuleLoader { } /** + * Block until the async loader hooks have been initialized. + * * No-op when no hooks have been supplied. */ - forceLoadHooks() { - this.#customizations?.forceLoadHooks(); + waitForAsyncLoaderHookInitialization() { + this.#asyncLoaderHooks?.waitForLoaderHookInitialization(); } } ObjectSetPrototypeOf(ModuleLoader.prototype, null); -class CustomizedModuleLoader { - - allowImportMetaResolve = true; - - /** - * Instantiate a module loader that uses user-provided custom loader hooks. - */ - constructor() { - getHooksProxy(); - } - - /** - * Register some loader specifier. - * @param {string} originalSpecifier The specified URL path of the loader to - * be registered. - * @param {string} parentURL The parent URL from where the loader will be - * registered if using it package name as specifier - * @param {any} [data] Arbitrary data to be passed from the custom loader - * (user-land) to the worker. - * @param {any[]} [transferList] Objects in `data` that are changing ownership - * @param {boolean} [isInternal] For internal loaders that should not be publicly exposed. - * @returns {{ format: string, url: URL['href'] }} - */ - register(originalSpecifier, parentURL, data, transferList, isInternal) { - return hooksProxy.makeSyncRequest('register', transferList, originalSpecifier, parentURL, data, isInternal); - } - - /** - * Resolve the location of the module. - * @param {string} originalSpecifier The specified URL path of the module to - * be resolved. - * @param {string} [parentURL] The URL path of the module's parent. - * @param {ImportAttributes} importAttributes Attributes from the import - * statement or expression. - * @returns {{ format: string, url: URL['href'] }} - */ - resolve(originalSpecifier, parentURL, importAttributes) { - return hooksProxy.makeAsyncRequest('resolve', undefined, originalSpecifier, parentURL, importAttributes); - } - - resolveSync(originalSpecifier, parentURL, importAttributes) { - // This happens only as a result of `import.meta.resolve` calls, which must be sync per spec. - return hooksProxy.makeSyncRequest('resolve', undefined, originalSpecifier, parentURL, importAttributes); - } - - /** - * Provide source that is understood by one of Node's translators. - * @param {URL['href']} url The URL/path of the module to be loaded - * @param {object} [context] Metadata about the module - * @returns {Promise<{ format: ModuleFormat, source: ModuleSource }>} - */ - load(url, context) { - return hooksProxy.makeAsyncRequest('load', undefined, url, context); - } - loadSync(url, context) { - return hooksProxy.makeSyncRequest('load', undefined, url, context); - } - - importMetaInitialize(meta, context, loader) { - hooksProxy.importMetaInitialize(meta, context, loader); - } - - forceLoadHooks() { - hooksProxy.waitForWorker(); - } -} - let emittedLoaderFlagWarning = false; /** * A loader instance is used as the main entry point for loading ES modules. Currently, this is a singleton; there is * only one used for loading the main module and everything in its dependency graph, though separate instances of this * class might be instantiated as part of bootstrap for other purposes. + * @param {AsyncLoaderHooksOnLoaderHookWorker|undefined} [asyncLoaderHooks] + * Only provided when run on the loader hook thread. * @returns {ModuleLoader} */ -function createModuleLoader() { - let customizations = null; - // Don't spawn a new worker if custom loaders are disabled. For instance, if - // we're already in a worker thread created by instantiating - // CustomizedModuleLoader; doing so would cause an infinite loop. - if (!forceDefaultLoader()) { +function createModuleLoader(asyncLoaderHooks) { + // Don't spawn a new loader hook worker if we are already in a loader hook worker to avoid infinite recursion. + if (shouldSpawnLoaderHookWorker()) { + assert(asyncLoaderHooks === undefined, 'asyncLoaderHooks should only be provided on the loader hook thread itself'); const userLoaderPaths = getOptionValue('--experimental-loader'); if (userLoaderPaths.length > 0) { if (!emittedLoaderFlagWarning) { @@ -1012,44 +918,37 @@ function createModuleLoader() { ); emittedLoaderFlagWarning = true; } - customizations = new CustomizedModuleLoader(); + const { AsyncLoaderHooksProxiedToLoaderHookWorker } = require('internal/modules/esm/hooks'); + asyncLoaderHooks = new AsyncLoaderHooksProxiedToLoaderHookWorker(); } } - return new ModuleLoader(customizations); -} - - -/** - * Get the HooksProxy instance. If it is not defined, then create a new one. - * @returns {HooksProxy} - */ -function getHooksProxy() { - if (!hooksProxy) { - const { HooksProxy } = require('internal/modules/esm/hooks'); - hooksProxy = new HooksProxy(); - } - - return hooksProxy; + return new ModuleLoader(asyncLoaderHooks); } let cascadedLoader; /** * This is a singleton ESM loader that integrates the loader hooks, if any. - * It it used by other internal built-ins when they need to load ESM code + * It it used by other internal built-ins when they need to load user-land ESM code * while also respecting hooks. * When built-ins need access to this loader, they should do * require('internal/module/esm/loader').getOrInitializeCascadedLoader() * lazily only right before the loader is actually needed, and don't do it * in the top-level, to avoid circular dependencies. + * @param {AsyncLoaderHooksOnLoaderHookWorker|undefined} [asyncLoaderHooks] + * Only provided when run on the loader hook thread. * @returns {ModuleLoader} */ -function getOrInitializeCascadedLoader() { - cascadedLoader ??= createModuleLoader(); +function getOrInitializeCascadedLoader(asyncLoaderHooks) { + cascadedLoader ??= createModuleLoader(asyncLoaderHooks); return cascadedLoader; } +function isCascadedLoaderInitialized() { + return cascadedLoader !== undefined; +} + /** * Register a single loader programmatically. * @param {string|URL} specifier @@ -1094,7 +993,7 @@ function register(specifier, parentURL = undefined, options) { module.exports = { createModuleLoader, - getHooksProxy, getOrInitializeCascadedLoader, + isCascadedLoaderInitialized, register, }; diff --git a/lib/internal/modules/esm/utils.js b/lib/internal/modules/esm/utils.js index 4a4279459341e8..a9076a7ae94128 100644 --- a/lib/internal/modules/esm/utils.js +++ b/lib/internal/modules/esm/utils.js @@ -35,13 +35,8 @@ const { ERR_INVALID_ARG_VALUE, } = require('internal/errors').codes; const { getOptionValue } = require('internal/options'); -const { - loadPreloadModules, - initializeFrozenIntrinsics, -} = require('internal/process/pre_execution'); const { emitExperimentalWarning, - getCWDURL, kEmptyObject, } = require('internal/util'); const assert = require('internal/assert'); @@ -283,15 +278,14 @@ async function importModuleDynamicallyCallback(referrerSymbol, specifier, phase, throw new ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING(); } -let _forceDefaultLoader = false; +let _shouldSpawnLoaderHookWorker = true; /** * Initializes handling of ES modules. - * This is configured during pre-execution. Specifically it's set to true for - * the loader worker in internal/main/worker_thread.js. - * @param {boolean} [forceDefaultLoader] - A boolean indicating disabling custom loaders. + * @param {boolean} [shouldSpawnLoaderHookWorker] Whether the custom loader worker + * should be spawned later. */ -function initializeESM(forceDefaultLoader = false) { - _forceDefaultLoader = forceDefaultLoader; +function initializeESM(shouldSpawnLoaderHookWorker = true) { + _shouldSpawnLoaderHookWorker = shouldSpawnLoaderHookWorker; initializeDefaultConditions(); // Setup per-realm callbacks that locate data or callbacks that we keep // track of for different ESM modules. @@ -300,46 +294,12 @@ function initializeESM(forceDefaultLoader = false) { } /** - * Determine whether custom loaders are disabled and it is forced to use the - * default loader. + * Determine whether the custom loader worker should be spawned when initializing + * the singleton ESM loader. * @returns {boolean} */ -function forceDefaultLoader() { - return _forceDefaultLoader; -} - -/** - * Register module customization hooks. - * @returns {Promise} - */ -async function initializeHooks() { - const customLoaderURLs = getOptionValue('--experimental-loader'); - - const { Hooks } = require('internal/modules/esm/hooks'); - const cascadedLoader = require('internal/modules/esm/loader').getOrInitializeCascadedLoader(); - - const hooks = new Hooks(); - cascadedLoader.setCustomizations(hooks); - - // We need the loader customizations to be set _before_ we start invoking - // `--require`, otherwise loops can happen because a `--require` script - // might call `register(...)` before we've installed ourselves. These - // global values are magically set in `setupUserModules` just for us and - // we call them in the correct order. - // N.B. This block appears here specifically in order to ensure that - // `--require` calls occur before `--loader` ones do. - loadPreloadModules(); - initializeFrozenIntrinsics(); - - const parentURL = getCWDURL().href; - for (let i = 0; i < customLoaderURLs.length; i++) { - await hooks.register( - customLoaderURLs[i], - parentURL, - ); - } - - return hooks; +function shouldSpawnLoaderHookWorker() { + return _shouldSpawnLoaderHookWorker; } /** @@ -375,10 +335,8 @@ function compileSourceTextModule(url, source, cascadedLoader, context = kEmptyOb module.exports = { registerModule, initializeESM, - initializeHooks, getDefaultConditions, getConditionsSet, - loaderWorkerId: 'internal/modules/esm/worker', - forceDefaultLoader, + shouldSpawnLoaderHookWorker, compileSourceTextModule, }; diff --git a/lib/internal/modules/esm/worker.js b/lib/internal/modules/esm/worker.js index 6624b740d0a98b..fa5fa87d20efb1 100644 --- a/lib/internal/modules/esm/worker.js +++ b/lib/internal/modules/esm/worker.js @@ -21,12 +21,63 @@ const { isTypedArray, } = require('util/types'); +const { getOptionValue } = require('internal/options'); +const { + loadPreloadModules, + initializeModuleLoaders, + initializeFrozenIntrinsics, +} = require('internal/process/pre_execution'); const { receiveMessageOnPort } = require('internal/worker/io'); const { WORKER_TO_MAIN_THREAD_NOTIFICATION, } = require('internal/modules/esm/shared_constants'); -const { initializeHooks } = require('internal/modules/esm/utils'); const { isMarkedAsUntransferable } = require('internal/buffer'); +const { getCWDURL } = require('internal/util'); +const { isCascadedLoaderInitialized, getOrInitializeCascadedLoader } = require('internal/modules/esm/loader'); +const { AsyncLoaderHooksOnLoaderHookWorker } = require('internal/modules/esm/hooks'); + +/** + * Register asynchronus module loader customization hooks. This should only be run in the loader + * hooks worker. In a non-loader-hooks thread, if any asynchronous loader hook is registered, the + * ModuleLoader#asyncLoaderHooks are initialized to be AsyncLoaderHooksProxiedToLoaderHookWorker + * which posts the messages to the async loader hook worker thread. + * When no asynchronous loader hook is registered, the loader hook worker is not spawned and module + * loading is entiredly done in-thread. + * @returns {Promise} + */ +async function initializeAsyncLoaderHooksOnLoaderHookWorker() { + const customLoaderURLs = getOptionValue('--experimental-loader'); + + // The worker thread spawned for handling asynchronous loader hooks should not + // further spawn other hook threads or there will be an infinite recursion. + const shouldSpawnLoaderHookWorker = false; + // The worker thread for async loader hooks will preload user modules itself in + // initializeAsyncLoaderHooksOnLoaderHookWorker(). + const shouldPreloadModules = false; + initializeModuleLoaders({ shouldSpawnLoaderHookWorker, shouldPreloadModules }); + + assert(!isCascadedLoaderInitialized(), + 'ModuleLoader should be initialized in initializeAsyncLoaderHooksOnLoaderHookWorker()'); + const asyncLoaderHooks = new AsyncLoaderHooksOnLoaderHookWorker(); + getOrInitializeCascadedLoader(asyncLoaderHooks); + + // We need the async loader hooks to be set _before_ we start invoking + // `--require`, otherwise loops can happen because a `--require` script + // might call `register(...)` before we've installed ourselves. These + // global values are magically set in `initializeModuleLoaders` just for us and + // we call them in the correct order. + // N.B. This block appears here specifically in order to ensure that + // `--require` calls occur before `--loader` ones do. + loadPreloadModules(); + initializeFrozenIntrinsics(); + + const parentURL = getCWDURL().href; + for (let i = 0; i < customLoaderURLs.length; i++) { + await asyncLoaderHooks.register(customLoaderURLs[i], parentURL); + } + + return asyncLoaderHooks; +} /** * Transfers an ArrayBuffer, TypedArray, or DataView to a worker thread. @@ -82,7 +133,7 @@ function wrapMessage(status, body) { } /** - * Initializes a worker thread for a customized module loader. + * Initializes the loader hooks worker thread with customized asynchronous module loading hooks. * @param {SharedArrayBuffer} lock - The lock used to synchronize communication between the worker and the main thread. * @param {MessagePort} syncCommPort - The message port used for synchronous communication between the worker and the * main thread. @@ -90,7 +141,7 @@ function wrapMessage(status, body) { * @returns {Promise} A promise that resolves when the worker thread has been initialized. */ async function customizedModuleWorker(lock, syncCommPort, errorHandler) { - let hooks; + let asyncLoaderHooks; let initializationError; let hasInitializationError = false; @@ -106,9 +157,8 @@ async function customizedModuleWorker(lock, syncCommPort, errorHandler) { }; } - try { - hooks = await initializeHooks(); + asyncLoaderHooks = await initializeAsyncLoaderHooksOnLoaderHookWorker(); } catch (exception) { // If there was an error while parsing and executing a user loader, for example if because a // loader contained a syntax error, then we need to send the error to the main thread so it can @@ -178,7 +228,7 @@ async function customizedModuleWorker(lock, syncCommPort, errorHandler) { // the main thread. let hasError = false; let shouldRemoveGlobalErrorHandler = false; - assert(typeof hooks[method] === 'function'); + assert(typeof asyncLoaderHooks[method] === 'function', `${method} is not implemented in the loader worker`); if (port == null && !hasUncaughtExceptionCaptureCallback()) { // When receiving sync messages, we want to unlock the main thread when there's an exception. process.on('uncaughtException', errorHandler); @@ -198,7 +248,7 @@ async function customizedModuleWorker(lock, syncCommPort, errorHandler) { let response; try { - response = await ReflectApply(hooks[method], hooks, args); + response = await ReflectApply(asyncLoaderHooks[method], asyncLoaderHooks, args); } catch (exception) { hasError = true; response = exception; diff --git a/lib/internal/modules/run_main.js b/lib/internal/modules/run_main.js index 2a9ef56d156808..d337eeca801b9c 100644 --- a/lib/internal/modules/run_main.js +++ b/lib/internal/modules/run_main.js @@ -96,7 +96,7 @@ async function asyncRunEntryPointWithESMLoader(callback) { await cascadedLoader.import(userImports[i], parentURL, kEmptyObject); } } else { - cascadedLoader.forceLoadHooks(); + cascadedLoader.waitForAsyncLoaderHookInitialization(); } await callback(cascadedLoader); } catch (err) { diff --git a/lib/internal/process/pre_execution.js b/lib/internal/process/pre_execution.js index f93b7dae1bca9b..76ec7d821cb4cc 100644 --- a/lib/internal/process/pre_execution.js +++ b/lib/internal/process/pre_execution.js @@ -47,6 +47,8 @@ function prepareMainThreadExecution(expandArgv1 = false, initializeModules = tru expandArgv1, initializeModules, isMainThread: true, + shouldSpawnLoaderHookWorker: initializeModules, + shouldPreloadModules: initializeModules, }); } @@ -55,15 +57,20 @@ function prepareTestRunnerMainExecution(loadUserModules = true) { expandArgv1: false, initializeModules: true, isMainThread: true, - forceDefaultLoader: !loadUserModules, + shouldSpawnLoaderHookWorker: loadUserModules, + shouldPreloadModules: loadUserModules, }); } function prepareWorkerThreadExecution() { prepareExecution({ expandArgv1: false, - initializeModules: false, isMainThread: false, + // Module loader initialization in workers are delayed until the worker thread + // is ready for execution. + initializeModules: false, + shouldSpawnLoaderHookWorker: false, + shouldPreloadModules: false, }); } @@ -74,7 +81,7 @@ function prepareShadowRealmExecution() { setupDebugEnv(); // Disable custom loaders in ShadowRealm. - setupUserModules(true); + initializeModuleLoaders({ shouldSpawnLoaderHookWorker: false, shouldPreloadModules: false }); const { privateSymbols: { host_defined_option_symbol, @@ -96,7 +103,7 @@ function prepareShadowRealmExecution() { } function prepareExecution(options) { - const { expandArgv1, initializeModules, isMainThread, forceDefaultLoader } = options; + const { expandArgv1, initializeModules, isMainThread, shouldSpawnLoaderHookWorker, shouldPreloadModules } = options; refreshRuntimeOptions(); @@ -154,8 +161,9 @@ function prepareExecution(options) { assert(!initializeModules); } + setupVmModules(); if (initializeModules) { - setupUserModules(forceDefaultLoader); + initializeModuleLoaders({ shouldSpawnLoaderHookWorker, shouldPreloadModules }); } // This has to be done after the user module loader is initialized, @@ -165,6 +173,21 @@ function prepareExecution(options) { return mainEntry; } +function setupVmModules() { + // Patch the vm module when --experimental-vm-modules is on. + // Please update the comments in vm.js when this block changes. + // TODO(joyeecheung): move this to vm.js? + if (getOptionValue('--experimental-vm-modules')) { + const { + Module, SourceTextModule, SyntheticModule, + } = require('internal/vm/module'); + const vm = require('vm'); + vm.Module = Module; + vm.SourceTextModule = SourceTextModule; + vm.SyntheticModule = SyntheticModule; + } +} + function setupHttpProxy() { // This normalized from both --use-env-proxy and NODE_USE_ENV_PROXY settings. if (!getOptionValue('--use-env-proxy')) { @@ -186,22 +209,32 @@ function setupHttpProxy() { // existing libraries that sets the global dispatcher or monkey patches the global agent. } -function setupUserModules(forceDefaultLoader = false) { - initializeCJSLoader(); - initializeESMLoader(forceDefaultLoader); +function initializeModuleLoaders(options) { + const { shouldSpawnLoaderHookWorker, shouldPreloadModules } = options; + // Initialize certain special module.Module properties and the CJS conditions. + const { initializeCJS } = require('internal/modules/cjs/loader'); + initializeCJS(); + // Initialize the ESM loader and a few module callbacks. + // If shouldSpawnLoaderHookWorker is true, later when the ESM loader is instantiated on-demand, + // it will spawn a loader worker thread to handle async custom loader hooks. + const { initializeESM } = require('internal/modules/esm/utils'); + initializeESM(shouldSpawnLoaderHookWorker); + const { hasStartedUserCJSExecution, hasStartedUserESMExecution, } = require('internal/modules/helpers'); + // At this point, no user module has been executed yet. assert(!hasStartedUserCJSExecution()); assert(!hasStartedUserESMExecution()); + if (getEmbedderOptions().hasEmbedderPreload) { runEmbedderPreload(); } // Do not enable preload modules if custom loaders are disabled. // For example, loader workers are responsible for doing this themselves. // And preload modules are not supported in ShadowRealm as well. - if (!forceDefaultLoader) { + if (shouldPreloadModules) { loadPreloadModules(); } // Need to be done after --require setup. @@ -638,28 +671,6 @@ function initializePermission() { } } -function initializeCJSLoader() { - const { initializeCJS } = require('internal/modules/cjs/loader'); - initializeCJS(); -} - -function initializeESMLoader(forceDefaultLoader) { - const { initializeESM } = require('internal/modules/esm/utils'); - initializeESM(forceDefaultLoader); - - // Patch the vm module when --experimental-vm-modules is on. - // Please update the comments in vm.js when this block changes. - if (getOptionValue('--experimental-vm-modules')) { - const { - Module, SourceTextModule, SyntheticModule, - } = require('internal/vm/module'); - const vm = require('vm'); - vm.Module = Module; - vm.SourceTextModule = SourceTextModule; - vm.SyntheticModule = SyntheticModule; - } -} - function initializeSourceMapsHandlers() { const { setSourceMapsSupport, @@ -729,7 +740,7 @@ function getHeapSnapshotFilename(diagnosticDir) { } module.exports = { - setupUserModules, + initializeModuleLoaders, prepareMainThreadExecution, prepareWorkerThreadExecution, prepareShadowRealmExecution, diff --git a/test/es-module/test-esm-loader-modulemap.js b/test/es-module/test-esm-loader-modulemap.js index 83125fce738139..f581c7f507640e 100644 --- a/test/es-module/test-esm-loader-modulemap.js +++ b/test/es-module/test-esm-loader-modulemap.js @@ -16,7 +16,7 @@ const jsonModuleDataUrl = 'data:application/json,""'; const stubJsModule = createDynamicModule([], ['default'], jsModuleDataUrl); const stubJsonModule = createDynamicModule([], ['default'], jsonModuleDataUrl); -const loader = createModuleLoader(false); +const loader = createModuleLoader(); const jsModuleJob = new ModuleJob(loader, stubJsModule.module, undefined, () => new Promise(() => {})); const jsonModuleJob = new ModuleJob(loader, stubJsonModule.module, diff --git a/test/parallel/test-bootstrap-modules.js b/test/parallel/test-bootstrap-modules.js index a66a3ec9ce360f..b050f5bffde04a 100644 --- a/test/parallel/test-bootstrap-modules.js +++ b/test/parallel/test-bootstrap-modules.js @@ -107,15 +107,15 @@ expected.beforePreExec = new Set([ 'NativeModule internal/modules/typescript', 'NativeModule internal/data_url', 'NativeModule internal/mime', -]); - -expected.atRunTime = new Set([ + 'NativeModule internal/modules/esm/utils', 'Internal Binding worker', 'NativeModule internal/modules/run_main', 'NativeModule internal/net', 'NativeModule internal/dns/utils', +]); + +expected.atRunTime = new Set([ 'NativeModule internal/process/pre_execution', - 'NativeModule internal/modules/esm/utils', ]); const { isMainThread } = require('worker_threads'); @@ -173,7 +173,7 @@ if (common.hasIntl) { if (process.features.inspector) { expected.beforePreExec.add('Internal Binding inspector'); expected.beforePreExec.add('NativeModule internal/util/inspector'); - expected.atRunTime.add('NativeModule internal/inspector_async_hook'); + expected.beforePreExec.add('NativeModule internal/inspector_async_hook'); } // This is loaded if the test is run with NODE_V8_COVERAGE. From 22fa6bd28be97caa221870482ee48362373744ea Mon Sep 17 00:00:00 2001 From: SRAVANI GUNDEPALLI <88590399+sravani1510@users.noreply.github.com> Date: Fri, 24 Oct 2025 11:10:29 +0530 Subject: [PATCH 57/83] build: ibmi follow aix visibility PR-URL: https://github.com/nodejs/node/pull/60360 Reviewed-By: Richard Lau Reviewed-By: Abdirahim Musse Reviewed-By: Colin Ihrig Reviewed-By: Luigi Pinca --- tools/v8_gypfiles/v8.gyp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/v8_gypfiles/v8.gyp b/tools/v8_gypfiles/v8.gyp index 5acb8169c692fd..c3ec7e3ee92bfc 100644 --- a/tools/v8_gypfiles/v8.gyp +++ b/tools/v8_gypfiles/v8.gyp @@ -50,7 +50,7 @@ # including unnecessary internal symbols, which may lead to run-time fixups. # This is not done on AIX where symbols are exported by tools/create_expfile.sh # see https://github.com/nodejs/node/pull/56290#issuecomment-2582703109 - ['OS!="aix"', { + ['OS!="aix" and OS!="os400"', { 'defines': [ 'BUILDING_V8_SHARED', # Make V8_EXPORT visible. ] @@ -65,7 +65,7 @@ 'GCC_SYMBOLS_PRIVATE_EXTERN': 'YES', # -fvisibility=hidden 'GCC_INLINES_ARE_PRIVATE_EXTERN': 'YES' # -fvisibility-inlines-hidden }, - }, 'OS!="aix" and (OS!="win" or clang==1)', { + }, '(OS!="aix" and OS!="os400") and (OS!="win" or clang==1)', { 'cflags': [ '-fvisibility=hidden', '-fvisibility-inlines-hidden' From 563e1317f36d0309dd788d31e44d26c40e2e6780 Mon Sep 17 00:00:00 2001 From: Deokjin Kim Date: Fri, 24 Oct 2025 15:27:18 +0900 Subject: [PATCH 58/83] doc: remove unnecessary statement of web storage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For now, web storage is enabled by default. Refs: https://github.com/nodejs/node/pull/57666 PR-URL: https://github.com/nodejs/node/pull/60363 Reviewed-By: Richard Lau Reviewed-By: Colin Ihrig Reviewed-By: Luigi Pinca Reviewed-By: Ulises Gascón --- doc/api/globals.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/api/globals.md b/doc/api/globals.md index aba6e8cf37d519..be609bf9eb3fc2 100644 --- a/doc/api/globals.md +++ b/doc/api/globals.md @@ -1105,8 +1105,7 @@ added: v0.0.1 added: v22.4.0 --> -> Stability: 1.0 - Early development. Enable this API with the -> \[`--experimental-webstorage`]\[] CLI flag. +> Stability: 1.0 - Early development. A browser-compatible implementation of {Storage}. Disable this API with the [`--no-webstorage`][] (or its alias `--no-experimental-webstorage`) CLI flag. From 0b38de3e9e3aa2f58b608b706bc4c185e7072b72 Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Fri, 24 Oct 2025 11:12:46 +0200 Subject: [PATCH 59/83] test: put helper in test-runner-output into common PR-URL: https://github.com/nodejs/node/pull/60330 Refs: https://github.com/nodejs/node/issues/55390 Reviewed-By: Chemi Atlow Reviewed-By: Luigi Pinca Reviewed-By: Moshe Atlow Reviewed-By: Pietro Marchini --- test/common/assertSnapshot.js | 99 +++++ test/parallel/test-runner-output.mjs | 358 ------------------ test/test-runner/test-output-abort-hooks.mjs | 11 + .../test-output-abort-runs-after-hook.mjs | 12 + test/test-runner/test-output-abort-suite.mjs | 11 + test/test-runner/test-output-abort.mjs | 11 + .../test-output-arbitrary-output-colored.mjs | 27 ++ .../test-output-arbitrary-output.mjs | 12 + .../test-output-assertion-color-tty.mjs | 17 + .../test-output-async-test-scheduling.mjs | 12 + ...fore-and-after-each-too-many-listeners.mjs | 12 + ...r-each-with-timeout-too-many-listeners.mjs | 12 + .../test-output-coverage-failure.mjs | 16 + .../test-output-coverage-short-filename.mjs | 19 + ...put-coverage-width-100-uncovered-lines.mjs | 16 + .../test-output-coverage-width-100.mjs | 16 + ...put-coverage-width-150-uncovered-lines.mjs | 16 + .../test-output-coverage-width-150.mjs | 16 + .../test-output-coverage-width-40.mjs | 16 + .../test-output-coverage-width-80-color.mjs | 21 + ...overage-width-80-uncovered-lines-color.mjs | 21 + ...tput-coverage-width-80-uncovered-lines.mjs | 16 + .../test-output-coverage-width-80.mjs | 16 + ...overage-width-infinity-uncovered-lines.mjs | 16 + .../test-output-coverage-width-infinity.mjs | 16 + .../test-output-coverage-with-mock.mjs | 25 ++ .../test-output-default-output.mjs | 11 + test/test-runner/test-output-describe-it.mjs | 11 + .../test-output-describe-nested.mjs | 11 + .../test-output-dot-output-custom-columns.mjs | 12 + test/test-runner/test-output-dot-reporter.mjs | 10 + test/test-runner/test-output-eval-dot.mjs | 10 + test/test-runner/test-output-eval-spec.mjs | 10 + test/test-runner/test-output-eval-tap.mjs | 10 + ...st-output-filtered-suite-delayed-build.mjs | 12 + .../test-output-filtered-suite-order.mjs | 12 + .../test-output-filtered-suite-throws.mjs | 12 + test/test-runner/test-output-force-exit.mjs | 10 + ...tput-global-after-should-fail-the-test.mjs | 12 + ...test-output-global-hooks-with-no-tests.mjs | 12 + .../test-output-hooks-spec-reporter.mjs | 11 + .../test-output-hooks-with-no-global-test.mjs | 12 + test/test-runner/test-output-hooks.mjs | 11 + .../test-output-junit-reporter.mjs | 11 + .../test-runner/test-output-lcov-reporter.mjs | 14 + .../test-output-name-and-skip-patterns.mjs | 12 + .../test-output-name-pattern-with-only.mjs | 12 + test/test-runner/test-output-name-pattern.mjs | 11 + test/test-runner/test-output-no-refs.mjs | 11 + test/test-runner/test-output-no-tests.mjs | 11 + ...est-output-non-tty-forced-color-output.mjs | 11 + test/test-runner/test-output-only-tests.mjs | 11 + test/test-runner/test-output-output-cli.mjs | 10 + test/test-runner/test-output-output.mjs | 11 + .../test-output-skip-each-hooks.mjs | 11 + test/test-runner/test-output-skip-pattern.mjs | 11 + .../test-output-source-mapped-locations.mjs | 12 + .../test-output-spec-reporter-cli.mjs | 11 + .../test-output-spec-reporter-successful.mjs | 11 + .../test-runner/test-output-spec-reporter.mjs | 10 + .../test-output-suite-skip-hooks.mjs | 11 + test/test-runner/test-output-tap-escape.mjs | 17 + ...gnostic-warning-without-test-only-flag.mjs | 12 + .../test-output-test-runner-plan-timeout.mjs | 12 + .../test-output-test-runner-plan.mjs | 12 + .../test-output-test-runner-watch-spec.mjs | 11 + ...est-output-test-timeout-flag-with-test.mjs | 13 + .../test-output-test-timeout-flag.mjs | 12 + .../test-output-timeout-in-before-each.mjs | 12 + .../test-output-typescript-coverage.mjs | 25 ++ ...st-output-unfinished-suite-async-error.mjs | 12 + test/test-runner/test-runner.status | 7 + test/test-runner/testcfg.py | 6 + 73 files changed, 1024 insertions(+), 358 deletions(-) delete mode 100644 test/parallel/test-runner-output.mjs create mode 100644 test/test-runner/test-output-abort-hooks.mjs create mode 100644 test/test-runner/test-output-abort-runs-after-hook.mjs create mode 100644 test/test-runner/test-output-abort-suite.mjs create mode 100644 test/test-runner/test-output-abort.mjs create mode 100644 test/test-runner/test-output-arbitrary-output-colored.mjs create mode 100644 test/test-runner/test-output-arbitrary-output.mjs create mode 100644 test/test-runner/test-output-assertion-color-tty.mjs create mode 100644 test/test-runner/test-output-async-test-scheduling.mjs create mode 100644 test/test-runner/test-output-before-and-after-each-too-many-listeners.mjs create mode 100644 test/test-runner/test-output-before-and-after-each-with-timeout-too-many-listeners.mjs create mode 100644 test/test-runner/test-output-coverage-failure.mjs create mode 100644 test/test-runner/test-output-coverage-short-filename.mjs create mode 100644 test/test-runner/test-output-coverage-width-100-uncovered-lines.mjs create mode 100644 test/test-runner/test-output-coverage-width-100.mjs create mode 100644 test/test-runner/test-output-coverage-width-150-uncovered-lines.mjs create mode 100644 test/test-runner/test-output-coverage-width-150.mjs create mode 100644 test/test-runner/test-output-coverage-width-40.mjs create mode 100644 test/test-runner/test-output-coverage-width-80-color.mjs create mode 100644 test/test-runner/test-output-coverage-width-80-uncovered-lines-color.mjs create mode 100644 test/test-runner/test-output-coverage-width-80-uncovered-lines.mjs create mode 100644 test/test-runner/test-output-coverage-width-80.mjs create mode 100644 test/test-runner/test-output-coverage-width-infinity-uncovered-lines.mjs create mode 100644 test/test-runner/test-output-coverage-width-infinity.mjs create mode 100644 test/test-runner/test-output-coverage-with-mock.mjs create mode 100644 test/test-runner/test-output-default-output.mjs create mode 100644 test/test-runner/test-output-describe-it.mjs create mode 100644 test/test-runner/test-output-describe-nested.mjs create mode 100644 test/test-runner/test-output-dot-output-custom-columns.mjs create mode 100644 test/test-runner/test-output-dot-reporter.mjs create mode 100644 test/test-runner/test-output-eval-dot.mjs create mode 100644 test/test-runner/test-output-eval-spec.mjs create mode 100644 test/test-runner/test-output-eval-tap.mjs create mode 100644 test/test-runner/test-output-filtered-suite-delayed-build.mjs create mode 100644 test/test-runner/test-output-filtered-suite-order.mjs create mode 100644 test/test-runner/test-output-filtered-suite-throws.mjs create mode 100644 test/test-runner/test-output-force-exit.mjs create mode 100644 test/test-runner/test-output-global-after-should-fail-the-test.mjs create mode 100644 test/test-runner/test-output-global-hooks-with-no-tests.mjs create mode 100644 test/test-runner/test-output-hooks-spec-reporter.mjs create mode 100644 test/test-runner/test-output-hooks-with-no-global-test.mjs create mode 100644 test/test-runner/test-output-hooks.mjs create mode 100644 test/test-runner/test-output-junit-reporter.mjs create mode 100644 test/test-runner/test-output-lcov-reporter.mjs create mode 100644 test/test-runner/test-output-name-and-skip-patterns.mjs create mode 100644 test/test-runner/test-output-name-pattern-with-only.mjs create mode 100644 test/test-runner/test-output-name-pattern.mjs create mode 100644 test/test-runner/test-output-no-refs.mjs create mode 100644 test/test-runner/test-output-no-tests.mjs create mode 100644 test/test-runner/test-output-non-tty-forced-color-output.mjs create mode 100644 test/test-runner/test-output-only-tests.mjs create mode 100644 test/test-runner/test-output-output-cli.mjs create mode 100644 test/test-runner/test-output-output.mjs create mode 100644 test/test-runner/test-output-skip-each-hooks.mjs create mode 100644 test/test-runner/test-output-skip-pattern.mjs create mode 100644 test/test-runner/test-output-source-mapped-locations.mjs create mode 100644 test/test-runner/test-output-spec-reporter-cli.mjs create mode 100644 test/test-runner/test-output-spec-reporter-successful.mjs create mode 100644 test/test-runner/test-output-spec-reporter.mjs create mode 100644 test/test-runner/test-output-suite-skip-hooks.mjs create mode 100644 test/test-runner/test-output-tap-escape.mjs create mode 100644 test/test-runner/test-output-test-diagnostic-warning-without-test-only-flag.mjs create mode 100644 test/test-runner/test-output-test-runner-plan-timeout.mjs create mode 100644 test/test-runner/test-output-test-runner-plan.mjs create mode 100644 test/test-runner/test-output-test-runner-watch-spec.mjs create mode 100644 test/test-runner/test-output-test-timeout-flag-with-test.mjs create mode 100644 test/test-runner/test-output-test-timeout-flag.mjs create mode 100644 test/test-runner/test-output-timeout-in-before-each.mjs create mode 100644 test/test-runner/test-output-typescript-coverage.mjs create mode 100644 test/test-runner/test-output-unfinished-suite-async-error.mjs create mode 100644 test/test-runner/test-runner.status create mode 100644 test/test-runner/testcfg.py diff --git a/test/common/assertSnapshot.js b/test/common/assertSnapshot.js index 16509f12ee89fc..0e350cd1dac6fa 100644 --- a/test/common/assertSnapshot.js +++ b/test/common/assertSnapshot.js @@ -4,6 +4,7 @@ const path = require('node:path'); const test = require('node:test'); const fs = require('node:fs/promises'); const assert = require('node:assert/strict'); +const { hostname } = require('node:os'); const stackFramesRegexp = /(?<=\n)(\s+)((.+?)\s+\()?(?:\(?(.+?):(\d+)(?::(\d+))?)\)?(\s+\{)?(\[\d+m)?(\n|$)/g; const windowNewlineRegexp = /\r/g; @@ -100,6 +101,97 @@ async function spawnAndAssert(filename, transform = (x) => x, { tty = false, ... await assertSnapshot(transform(`${stdout}${stderr}`), filename); } +function replaceTestDuration(str) { + return str + .replaceAll(/duration_ms: [0-9.]+/g, 'duration_ms: *') + .replaceAll(/duration_ms [0-9.]+/g, 'duration_ms *'); +} + +const root = path.resolve(__dirname, '..', '..'); +const color = '(\\[\\d+m)'; +const stackTraceBasePath = new RegExp(`${color}\\(${root.replaceAll(/[\\^$*+?.()|[\]{}]/g, '\\$&')}/?${color}(.*)${color}\\)`, 'g'); + +function replaceSpecDuration(str) { + return str + .replaceAll(/[0-9.]+ms/g, '*ms') + .replaceAll(/duration_ms [0-9.]+/g, 'duration_ms *') + .replace(stackTraceBasePath, '$3'); +} + +function replaceJunitDuration(str) { + return str + .replaceAll(/time="[0-9.]+"/g, 'time="*"') + .replaceAll(/duration_ms [0-9.]+/g, 'duration_ms *') + .replaceAll(`hostname="${hostname()}"`, 'hostname="HOSTNAME"') + .replaceAll(/file="[^"]*"/g, 'file="*"') + .replace(stackTraceBasePath, '$3'); +} + +function removeWindowsPathEscaping(str) { + return common.isWindows ? str.replaceAll(/\\\\/g, '\\') : str; +} + +function replaceTestLocationLine(str) { + return str.replaceAll(/(js:)(\d+)(:\d+)/g, '$1(LINE)$3'); +} + +// The Node test coverage returns results for all files called by the test. This +// will make the output file change if files like test/common/index.js change. +// This transform picks only the first line and then the lines from the test +// file. +function pickTestFileFromLcov(str) { + const lines = str.split(/\n/); + const firstLineOfTestFile = lines.findIndex( + (line) => line.startsWith('SF:') && line.trim().endsWith('output.js'), + ); + const lastLineOfTestFile = lines.findIndex( + (line, index) => index > firstLineOfTestFile && line.trim() === 'end_of_record', + ); + return ( + lines[0] + '\n' + lines.slice(firstLineOfTestFile, lastLineOfTestFile + 1).join('\n') + '\n' + ); +} + +const defaultTransform = transform( + replaceWindowsLineEndings, + replaceStackTrace, + removeWindowsPathEscaping, + transformProjectRoot(), + replaceWindowsPaths, + replaceTestDuration, + replaceTestLocationLine, +); +const specTransform = transform( + replaceSpecDuration, + replaceWindowsLineEndings, + replaceStackTrace, + replaceWindowsPaths, +); +const junitTransform = transform( + replaceJunitDuration, + replaceWindowsLineEndings, + replaceStackTrace, + replaceWindowsPaths, +); +const lcovTransform = transform( + replaceWindowsLineEndings, + replaceStackTrace, + transformProjectRoot(), + replaceWindowsPaths, + pickTestFileFromLcov, +); + +function ensureCwdIsProjectRoot() { + if (process.cwd() !== root) { + process.chdir(root); + } +} + +function canColorize() { + // Loading it lazily to avoid breaking `NODE_REGENERATE_SNAPSHOTS`. + return require('internal/tty').getColorDepth() > 2; +} + module.exports = { assertSnapshot, getSnapshotPath, @@ -111,4 +203,11 @@ module.exports = { spawnAndAssert, transform, transformProjectRoot, + replaceTestDuration, + defaultTransform, + specTransform, + junitTransform, + lcovTransform, + ensureCwdIsProjectRoot, + canColorize, }; diff --git a/test/parallel/test-runner-output.mjs b/test/parallel/test-runner-output.mjs deleted file mode 100644 index f854447c4526b1..00000000000000 --- a/test/parallel/test-runner-output.mjs +++ /dev/null @@ -1,358 +0,0 @@ -// Flags: --expose-internals -import * as common from '../common/index.mjs'; -import * as fixtures from '../common/fixtures.mjs'; -import * as snapshot from '../common/assertSnapshot.js'; -import { describe, it } from 'node:test'; -import { hostname } from 'node:os'; -import { chdir, cwd } from 'node:process'; -import { fileURLToPath } from 'node:url'; - -const skipForceColors = - process.config.variables.icu_gyp_path !== 'tools/icu/icu-generic.gyp' || - process.config.variables.node_shared_openssl; - -// We're using dynamic import here to not break `NODE_REGENERATE_SNAPSHOTS`. -const canColorize = (await import('internal/tty')).default.getColorDepth() > 2; -const skipCoverageColors = !canColorize; - -function replaceTestDuration(str) { - return str - .replaceAll(/duration_ms: [0-9.]+/g, 'duration_ms: *') - .replaceAll(/duration_ms [0-9.]+/g, 'duration_ms *'); -} - -const root = fileURLToPath(new URL('../..', import.meta.url)).slice(0, -1); - -const color = '(\\[\\d+m)'; -const stackTraceBasePath = new RegExp(`${color}\\(${root.replaceAll(/[\\^$*+?.()|[\]{}]/g, '\\$&')}/?${color}(.*)${color}\\)`, 'g'); - -function replaceSpecDuration(str) { - return str - .replaceAll(/[0-9.]+ms/g, '*ms') - .replaceAll(/duration_ms [0-9.]+/g, 'duration_ms *') - .replace(stackTraceBasePath, '$3'); -} - -function replaceJunitDuration(str) { - return str - .replaceAll(/time="[0-9.]+"/g, 'time="*"') - .replaceAll(/duration_ms [0-9.]+/g, 'duration_ms *') - .replaceAll(`hostname="${hostname()}"`, 'hostname="HOSTNAME"') - .replaceAll(/file="[^"]*"/g, 'file="*"') - .replace(stackTraceBasePath, '$3'); -} - -function removeWindowsPathEscaping(str) { - return common.isWindows ? str.replaceAll(/\\\\/g, '\\') : str; -} - -function replaceTestLocationLine(str) { - return str.replaceAll(/(js:)(\d+)(:\d+)/g, '$1(LINE)$3'); -} - -// The Node test coverage returns results for all files called by the test. This -// will make the output file change if files like test/common/index.js change. -// This transform picks only the first line and then the lines from the test -// file. -function pickTestFileFromLcov(str) { - const lines = str.split(/\n/); - const firstLineOfTestFile = lines.findIndex( - (line) => line.startsWith('SF:') && line.trim().endsWith('output.js') - ); - const lastLineOfTestFile = lines.findIndex( - (line, index) => index > firstLineOfTestFile && line.trim() === 'end_of_record' - ); - return ( - lines[0] + '\n' + lines.slice(firstLineOfTestFile, lastLineOfTestFile + 1).join('\n') + '\n' - ); -} - -const defaultTransform = snapshot.transform( - snapshot.replaceWindowsLineEndings, - snapshot.replaceStackTrace, - removeWindowsPathEscaping, - snapshot.transformProjectRoot(), - snapshot.replaceWindowsPaths, - replaceTestDuration, - replaceTestLocationLine, -); -const specTransform = snapshot.transform( - replaceSpecDuration, - snapshot.replaceWindowsLineEndings, - snapshot.replaceStackTrace, - snapshot.replaceWindowsPaths, -); -const junitTransform = snapshot.transform( - replaceJunitDuration, - snapshot.replaceWindowsLineEndings, - snapshot.replaceStackTrace, - snapshot.replaceWindowsPaths, -); -const lcovTransform = snapshot.transform( - snapshot.replaceWindowsLineEndings, - snapshot.replaceStackTrace, - snapshot.transformProjectRoot(), - snapshot.replaceWindowsPaths, - pickTestFileFromLcov -); - - -const tests = [ - { name: 'test-runner/output/abort.js', flags: ['--test-reporter=tap'] }, - { - name: 'test-runner/output/abort-runs-after-hook.js', - flags: ['--test-reporter=tap'], - }, - { name: 'test-runner/output/abort_suite.js', flags: ['--test-reporter=tap'] }, - { name: 'test-runner/output/abort_hooks.js', flags: ['--test-reporter=tap'] }, - { name: 'test-runner/output/describe_it.js', flags: ['--test-reporter=tap'] }, - { - name: 'test-runner/output/describe_nested.js', - flags: ['--test-reporter=tap'], - }, - { name: 'test-runner/output/eval_dot.js', transform: specTransform }, - { name: 'test-runner/output/eval_spec.js', transform: specTransform }, - { name: 'test-runner/output/eval_tap.js' }, - { - name: 'test-runner/output/filtered-suite-delayed-build.js', - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/filtered-suite-order.mjs', - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/filtered-suite-throws.js', - flags: ['--test-reporter=tap'], - }, - { name: 'test-runner/output/hooks.js', flags: ['--test-reporter=tap'] }, - { name: 'test-runner/output/hooks_spec_reporter.js', transform: specTransform }, - { name: 'test-runner/output/skip-each-hooks.js', transform: specTransform }, - { name: 'test-runner/output/suite-skip-hooks.js', transform: specTransform }, - { - name: 'test-runner/output/timeout_in_before_each_should_not_affect_further_tests.js', - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/test-timeout-flag.js', - flags: [ - '--test-reporter=tap', - '--test-timeout=100', - ], - }, - // --test-timeout should work with or without --test flag - { - name: 'test-runner/output/test-timeout-flag.js', - flags: [ - '--test-reporter=tap', - '--test-timeout=100', - '--test', - ], - }, - { - name: 'test-runner/output/hooks-with-no-global-test.js', - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/global-hooks-with-no-tests.js', - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/before-and-after-each-too-many-listeners.js', - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/before-and-after-each-with-timeout-too-many-listeners.js', - flags: ['--test-reporter=tap'], - }, - { name: 'test-runner/output/force_exit.js', transform: specTransform }, - { - name: 'test-runner/output/global_after_should_fail_the_test.js', - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/no_refs.js', - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/no_tests.js', - flags: ['--test-reporter=tap'], - }, - { name: 'test-runner/output/only_tests.js', flags: ['--test-reporter=tap'] }, - { name: 'test-runner/output/dot_reporter.js', transform: specTransform }, - { name: 'test-runner/output/junit_reporter.js', transform: junitTransform }, - { name: 'test-runner/output/spec_reporter_successful.js', transform: specTransform }, - { name: 'test-runner/output/spec_reporter.js', transform: specTransform }, - { name: 'test-runner/output/spec_reporter_cli.js', transform: specTransform }, - { - name: 'test-runner/output/source_mapped_locations.mjs', - flags: ['--test-reporter=tap'], - }, - process.features.inspector ? - { - name: 'test-runner/output/lcov_reporter.js', - transform: lcovTransform - } : - false, - { name: 'test-runner/output/output.js', flags: ['--test-reporter=tap'] }, - { name: 'test-runner/output/output_cli.js' }, - { - name: 'test-runner/output/name_and_skip_patterns.js', - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/name_pattern.js', - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/name_pattern_with_only.js', - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/skip_pattern.js', - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/unfinished-suite-async-error.js', - flags: ['--test-reporter=tap'], - }, - { name: 'test-runner/output/default_output.js', transform: specTransform, tty: true }, - { - name: 'test-runner/output/arbitrary-output.js', - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/non-tty-forced-color-output.js', - transform: specTransform, - }, - canColorize ? { - name: 'test-runner/output/assertion-color-tty.mjs', - flags: ['--test', '--stack-trace-limit=0'], - transform: specTransform, - tty: true, - } : false, - { - name: 'test-runner/output/async-test-scheduling.mjs', - flags: ['--test-reporter=tap'], - }, - !skipForceColors ? { - name: 'test-runner/output/arbitrary-output-colored.js', - transform: snapshot.transform(specTransform, replaceTestDuration), tty: true - } : false, - { name: 'test-runner/output/dot_output_custom_columns.js', transform: specTransform, tty: true }, - { - name: 'test-runner/output/tap_escape.js', - transform: snapshot.transform( - snapshot.replaceWindowsLineEndings, - replaceTestDuration, - ), - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/test-runner-plan.js', - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/test-runner-watch-spec.mjs', - transform: specTransform, - }, - { - name: 'test-runner/output/test-runner-plan-timeout.js', - flags: ['--test-reporter=tap', '--test-force-exit'], - }, - process.features.inspector ? { - name: 'test-runner/output/coverage_failure.js', - flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'], - } : false, - { - name: 'test-runner/output/test-diagnostic-warning-without-test-only-flag.js', - flags: ['--test', '--test-reporter=tap'], - }, - process.features.inspector ? { - name: 'test-runner/output/coverage-width-40.mjs', - flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'], - } : false, - process.features.inspector ? { - name: 'test-runner/output/coverage-width-80.mjs', - flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'], - } : false, - process.features.inspector && !skipCoverageColors ? { - name: 'test-runner/output/coverage-width-80-color.mjs', - flags: ['--test-coverage-exclude=!test/**'], - transform: specTransform, - tty: true - } : false, - process.features.inspector ? { - name: 'test-runner/output/coverage-width-100.mjs', - flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'], - } : false, - process.features.inspector ? { - name: 'test-runner/output/coverage-width-150.mjs', - flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'], - } : false, - process.features.inspector ? { - name: 'test-runner/output/coverage-width-infinity.mjs', - flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'], - } : false, - process.features.inspector ? { - name: 'test-runner/output/coverage-width-80-uncovered-lines.mjs', - flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'], - } : false, - process.features.inspector ? { - name: 'test-runner/output/coverage-width-100-uncovered-lines.mjs', - flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'], - } : false, - process.features.inspector && !skipCoverageColors ? { - name: 'test-runner/output/coverage-width-80-uncovered-lines-color.mjs', - flags: ['--test-coverage-exclude=!test/**'], - transform: specTransform, - tty: true - } : false, - process.features.inspector ? { - name: 'test-runner/output/coverage-width-150-uncovered-lines.mjs', - flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'], - } : false, - process.features.inspector ? { - name: 'test-runner/output/coverage-width-infinity-uncovered-lines.mjs', - flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'], - } : false, - process.features.inspector ? { - name: 'test-runner/output/coverage-short-filename.mjs', - flags: ['--test-reporter=tap', '--test-coverage-exclude=../output/**'], - cwd: fixtures.path('test-runner/coverage-snap'), - } : false, - process.features.inspector ? { - name: 'test-runner/output/typescript-coverage.mts', - flags: ['--disable-warning=ExperimentalWarning', - '--test-reporter=tap', - '--experimental-transform-types', - '--experimental-test-module-mocks', - '--experimental-test-coverage', - '--test-coverage-exclude=!test/**'] - } : false, - process.features.inspector ? { - name: 'test-runner/output/coverage-with-mock.mjs', - flags: ['--disable-warning=ExperimentalWarning', - '--test-reporter=tap', - '--experimental-transform-types', - '--experimental-test-module-mocks', - '--experimental-test-coverage', - '--test-coverage-exclude=!test/**'] - } : false, -] -.filter(Boolean) -.map(({ flags, name, tty, transform, cwd }) => ({ - name, - fn: common.mustCall(async () => { - await snapshot.spawnAndAssert(fixtures.path(name), transform ?? defaultTransform, { tty, flags, cwd }); - }), -})); - -if (cwd() !== root) { - chdir(root); -} -describe('test runner output', { concurrency: true }, () => { - for (const { name, fn } of tests) { - it(name, fn); - } -}); diff --git a/test/test-runner/test-output-abort-hooks.mjs b/test/test-runner/test-output-abort-hooks.mjs new file mode 100644 index 00000000000000..2bb1898c5cc7bd --- /dev/null +++ b/test/test-runner/test-output-abort-hooks.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/abort_hooks.js matches test-runner/output/abort_hooks.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/abort_hooks.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-abort-runs-after-hook.mjs b/test/test-runner/test-output-abort-runs-after-hook.mjs new file mode 100644 index 00000000000000..e8716bb08333f7 --- /dev/null +++ b/test/test-runner/test-output-abort-runs-after-hook.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/abort-runs-after-hook.js matches +// test-runner/output/abort-runs-after-hook.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/abort-runs-after-hook.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-abort-suite.mjs b/test/test-runner/test-output-abort-suite.mjs new file mode 100644 index 00000000000000..c3f1b4625b4f5f --- /dev/null +++ b/test/test-runner/test-output-abort-suite.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/abort_suite.js matches test-runner/output/abort_suite.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/abort_suite.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-abort.mjs b/test/test-runner/test-output-abort.mjs new file mode 100644 index 00000000000000..b361bc68035824 --- /dev/null +++ b/test/test-runner/test-output-abort.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/abort.js matches test-runner/output/abort.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/abort.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-arbitrary-output-colored.mjs b/test/test-runner/test-output-arbitrary-output-colored.mjs new file mode 100644 index 00000000000000..77a13d8890430e --- /dev/null +++ b/test/test-runner/test-output-arbitrary-output-colored.mjs @@ -0,0 +1,27 @@ +// Test that the output of test-runner/output/arbitrary-output-colored.js matches +// test-runner/output/arbitrary-output-colored.snapshot +import * as common from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { + spawnAndAssert, + specTransform, + replaceTestDuration, + transform, + ensureCwdIsProjectRoot, +} from '../common/assertSnapshot.js'; + +const skipForceColors = + process.config.variables.icu_gyp_path !== 'tools/icu/icu-generic.gyp' || + process.config.variables.node_shared_openssl; + +if (skipForceColors) { + // https://github.com/nodejs/node/pull/48057 + common.skip('Forced colors not supported in this build'); +} + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/arbitrary-output-colored.js'), + transform(specTransform, replaceTestDuration), + { tty: true }, +); diff --git a/test/test-runner/test-output-arbitrary-output.mjs b/test/test-runner/test-output-arbitrary-output.mjs new file mode 100644 index 00000000000000..d7626bb01856fa --- /dev/null +++ b/test/test-runner/test-output-arbitrary-output.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/arbitrary-output.js matches +// test-runner/output/arbitrary-output.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/arbitrary-output.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-assertion-color-tty.mjs b/test/test-runner/test-output-assertion-color-tty.mjs new file mode 100644 index 00000000000000..102b397c815746 --- /dev/null +++ b/test/test-runner/test-output-assertion-color-tty.mjs @@ -0,0 +1,17 @@ +// Flags: --expose-internals +// Test that the output of test-runner/output/assertion-color-tty.mjs matches +// test-runner/output/assertion-color-tty.snapshot +import * as common from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, canColorize, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +if (!canColorize()) { + common.skip('TTY colors not supported'); +} + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/assertion-color-tty.mjs'), + specTransform, + { flags: ['--test', '--stack-trace-limit=0'], tty: true }, +); diff --git a/test/test-runner/test-output-async-test-scheduling.mjs b/test/test-runner/test-output-async-test-scheduling.mjs new file mode 100644 index 00000000000000..5903619f7e1266 --- /dev/null +++ b/test/test-runner/test-output-async-test-scheduling.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/async-test-scheduling.mjs matches +// test-runner/output/async-test-scheduling.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/async-test-scheduling.mjs'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-before-and-after-each-too-many-listeners.mjs b/test/test-runner/test-output-before-and-after-each-too-many-listeners.mjs new file mode 100644 index 00000000000000..bcaec70b17276a --- /dev/null +++ b/test/test-runner/test-output-before-and-after-each-too-many-listeners.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/before-and-after-each-too-many-listeners.js matches +// test-runner/output/before-and-after-each-too-many-listeners.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/before-and-after-each-too-many-listeners.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-before-and-after-each-with-timeout-too-many-listeners.mjs b/test/test-runner/test-output-before-and-after-each-with-timeout-too-many-listeners.mjs new file mode 100644 index 00000000000000..7804692911aeda --- /dev/null +++ b/test/test-runner/test-output-before-and-after-each-with-timeout-too-many-listeners.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/before-and-after-each-with-timeout-too-many-listeners.js matches +// test-runner/output/before-and-after-each-with-timeout-too-many-listeners.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/before-and-after-each-with-timeout-too-many-listeners.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-coverage-failure.mjs b/test/test-runner/test-output-coverage-failure.mjs new file mode 100644 index 00000000000000..fc171db3ef4627 --- /dev/null +++ b/test/test-runner/test-output-coverage-failure.mjs @@ -0,0 +1,16 @@ +// Test that the output of test-runner/output/coverage_failure.js matches +// test-runner/output/coverage_failure.snapshot +import * as common from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +if (!process.features.inspector) { + common.skip('inspector support required'); +} + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/coverage_failure.js'), + defaultTransform, + { flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'] }, +); diff --git a/test/test-runner/test-output-coverage-short-filename.mjs b/test/test-runner/test-output-coverage-short-filename.mjs new file mode 100644 index 00000000000000..04d673f530689f --- /dev/null +++ b/test/test-runner/test-output-coverage-short-filename.mjs @@ -0,0 +1,19 @@ +// Test that the output of test-runner/output/coverage-short-filename.mjs matches +// test-runner/output/coverage-short-filename.snapshot +import * as common from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +if (!process.features.inspector) { + common.skip('inspector support required'); +} + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/coverage-short-filename.mjs'), + defaultTransform, + { + flags: ['--test-reporter=tap', '--test-coverage-exclude=../output/**'], + cwd: fixtures.path('test-runner/coverage-snap'), + }, +); diff --git a/test/test-runner/test-output-coverage-width-100-uncovered-lines.mjs b/test/test-runner/test-output-coverage-width-100-uncovered-lines.mjs new file mode 100644 index 00000000000000..dd7e1a9c455fbe --- /dev/null +++ b/test/test-runner/test-output-coverage-width-100-uncovered-lines.mjs @@ -0,0 +1,16 @@ +// Test that the output of test-runner/output/coverage-width-100-uncovered-lines.mjs matches +// test-runner/output/coverage-width-100-uncovered-lines.snapshot +import * as common from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +if (!process.features.inspector) { + common.skip('inspector support required'); +} + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/coverage-width-100-uncovered-lines.mjs'), + defaultTransform, + { flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'] }, +); diff --git a/test/test-runner/test-output-coverage-width-100.mjs b/test/test-runner/test-output-coverage-width-100.mjs new file mode 100644 index 00000000000000..515e1d4e02cac4 --- /dev/null +++ b/test/test-runner/test-output-coverage-width-100.mjs @@ -0,0 +1,16 @@ +// Test that the output of test-runner/output/coverage-width-100.mjs matches +// test-runner/output/coverage-width-100.snapshot +import * as common from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +if (!process.features.inspector) { + common.skip('inspector support required'); +} + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/coverage-width-100.mjs'), + defaultTransform, + { flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'] }, +); diff --git a/test/test-runner/test-output-coverage-width-150-uncovered-lines.mjs b/test/test-runner/test-output-coverage-width-150-uncovered-lines.mjs new file mode 100644 index 00000000000000..a09aa303c8cc73 --- /dev/null +++ b/test/test-runner/test-output-coverage-width-150-uncovered-lines.mjs @@ -0,0 +1,16 @@ +// Test that the output of test-runner/output/coverage-width-150-uncovered-lines.mjs matches +// test-runner/output/coverage-width-150-uncovered-lines.snapshot +import * as common from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +if (!process.features.inspector) { + common.skip('inspector support required'); +} + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/coverage-width-150-uncovered-lines.mjs'), + defaultTransform, + { flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'] }, +); diff --git a/test/test-runner/test-output-coverage-width-150.mjs b/test/test-runner/test-output-coverage-width-150.mjs new file mode 100644 index 00000000000000..077483de649f11 --- /dev/null +++ b/test/test-runner/test-output-coverage-width-150.mjs @@ -0,0 +1,16 @@ +// Test that the output of test-runner/output/coverage-width-150.mjs matches +// test-runner/output/coverage-width-150.snapshot +import * as common from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +if (!process.features.inspector) { + common.skip('inspector support required'); +} + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/coverage-width-150.mjs'), + defaultTransform, + { flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'] }, +); diff --git a/test/test-runner/test-output-coverage-width-40.mjs b/test/test-runner/test-output-coverage-width-40.mjs new file mode 100644 index 00000000000000..2fa862ac48e65b --- /dev/null +++ b/test/test-runner/test-output-coverage-width-40.mjs @@ -0,0 +1,16 @@ +// Test that the output of test-runner/output/coverage-width-40.mjs matches +// test-runner/output/coverage-width-40.snapshot +import * as common from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +if (!process.features.inspector) { + common.skip('inspector support required'); +} + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/coverage-width-40.mjs'), + defaultTransform, + { flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'] }, +); diff --git a/test/test-runner/test-output-coverage-width-80-color.mjs b/test/test-runner/test-output-coverage-width-80-color.mjs new file mode 100644 index 00000000000000..97d11c2a48a584 --- /dev/null +++ b/test/test-runner/test-output-coverage-width-80-color.mjs @@ -0,0 +1,21 @@ +// Flags: --expose-internals +// Test that the output of test-runner/output/coverage-width-80-color.mjs matches +// test-runner/output/coverage-width-80-color.snapshot +import * as common from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, canColorize, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +if (!process.features.inspector) { + common.skip('inspector support required'); +} + +if (!canColorize()) { + common.skip('TTY colors not supported'); +} + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/coverage-width-80-color.mjs'), + specTransform, + { flags: ['--test-coverage-exclude=!test/**'], tty: true }, +); diff --git a/test/test-runner/test-output-coverage-width-80-uncovered-lines-color.mjs b/test/test-runner/test-output-coverage-width-80-uncovered-lines-color.mjs new file mode 100644 index 00000000000000..1b2cb29620d6ff --- /dev/null +++ b/test/test-runner/test-output-coverage-width-80-uncovered-lines-color.mjs @@ -0,0 +1,21 @@ +// Flags: --expose-internals +// Test that the output of test-runner/output/coverage-width-80-uncovered-lines-color.mjs matches +// test-runner/output/coverage-width-80-uncovered-lines-color.snapshot +import * as common from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, canColorize, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +if (!process.features.inspector) { + common.skip('inspector support required'); +} + +if (!canColorize()) { + common.skip('TTY colors not supported'); +} + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/coverage-width-80-uncovered-lines-color.mjs'), + specTransform, + { flags: ['--test-coverage-exclude=!test/**'], tty: true }, +); diff --git a/test/test-runner/test-output-coverage-width-80-uncovered-lines.mjs b/test/test-runner/test-output-coverage-width-80-uncovered-lines.mjs new file mode 100644 index 00000000000000..39cc7d9403c96a --- /dev/null +++ b/test/test-runner/test-output-coverage-width-80-uncovered-lines.mjs @@ -0,0 +1,16 @@ +// Test that the output of test-runner/output/coverage-width-80-uncovered-lines.mjs matches +// test-runner/output/coverage-width-80-uncovered-lines.snapshot +import * as common from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +if (!process.features.inspector) { + common.skip('inspector support required'); +} + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/coverage-width-80-uncovered-lines.mjs'), + defaultTransform, + { flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'] }, +); diff --git a/test/test-runner/test-output-coverage-width-80.mjs b/test/test-runner/test-output-coverage-width-80.mjs new file mode 100644 index 00000000000000..dabf7644726b43 --- /dev/null +++ b/test/test-runner/test-output-coverage-width-80.mjs @@ -0,0 +1,16 @@ +// Test that the output of test-runner/output/coverage-width-80.mjs matches +// test-runner/output/coverage-width-80.snapshot +import * as common from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +if (!process.features.inspector) { + common.skip('inspector support required'); +} + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/coverage-width-80.mjs'), + defaultTransform, + { flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'] }, +); diff --git a/test/test-runner/test-output-coverage-width-infinity-uncovered-lines.mjs b/test/test-runner/test-output-coverage-width-infinity-uncovered-lines.mjs new file mode 100644 index 00000000000000..b75bec1e04ec37 --- /dev/null +++ b/test/test-runner/test-output-coverage-width-infinity-uncovered-lines.mjs @@ -0,0 +1,16 @@ +// Test that the output of test-runner/output/coverage-width-infinity-uncovered-lines.mjs matches +// test-runner/output/coverage-width-infinity-uncovered-lines.snapshot +import * as common from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +if (!process.features.inspector) { + common.skip('inspector support required'); +} + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/coverage-width-infinity-uncovered-lines.mjs'), + defaultTransform, + { flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'] }, +); diff --git a/test/test-runner/test-output-coverage-width-infinity.mjs b/test/test-runner/test-output-coverage-width-infinity.mjs new file mode 100644 index 00000000000000..f586ff9ab159d0 --- /dev/null +++ b/test/test-runner/test-output-coverage-width-infinity.mjs @@ -0,0 +1,16 @@ +// Test that the output of test-runner/output/coverage-width-infinity.mjs matches +// test-runner/output/coverage-width-infinity.snapshot +import * as common from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +if (!process.features.inspector) { + common.skip('inspector support required'); +} + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/coverage-width-infinity.mjs'), + defaultTransform, + { flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'] }, +); diff --git a/test/test-runner/test-output-coverage-with-mock.mjs b/test/test-runner/test-output-coverage-with-mock.mjs new file mode 100644 index 00000000000000..f489451e184d6d --- /dev/null +++ b/test/test-runner/test-output-coverage-with-mock.mjs @@ -0,0 +1,25 @@ +// Test that the output of test-runner/output/coverage-with-mock.mjs matches +// test-runner/output/coverage-with-mock.snapshot +import * as common from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +if (!process.features.inspector) { + common.skip('inspector support required'); +} + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/coverage-with-mock.mjs'), + defaultTransform, + { + flags: [ + '--disable-warning=ExperimentalWarning', + '--test-reporter=tap', + '--experimental-transform-types', + '--experimental-test-module-mocks', + '--experimental-test-coverage', + '--test-coverage-exclude=!test/**', + ], + }, +); diff --git a/test/test-runner/test-output-default-output.mjs b/test/test-runner/test-output-default-output.mjs new file mode 100644 index 00000000000000..96ae139902755e --- /dev/null +++ b/test/test-runner/test-output-default-output.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/default_output.js matches test-runner/output/default_output.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/default_output.js'), + specTransform, + { tty: true }, +); diff --git a/test/test-runner/test-output-describe-it.mjs b/test/test-runner/test-output-describe-it.mjs new file mode 100644 index 00000000000000..219951d5aec75e --- /dev/null +++ b/test/test-runner/test-output-describe-it.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/describe_it.js matches test-runner/output/describe_it.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/describe_it.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-describe-nested.mjs b/test/test-runner/test-output-describe-nested.mjs new file mode 100644 index 00000000000000..661048527fa668 --- /dev/null +++ b/test/test-runner/test-output-describe-nested.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/describe_nested.js matches test-runner/output/describe_nested.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/describe_nested.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-dot-output-custom-columns.mjs b/test/test-runner/test-output-dot-output-custom-columns.mjs new file mode 100644 index 00000000000000..c8061e6ba27e85 --- /dev/null +++ b/test/test-runner/test-output-dot-output-custom-columns.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/dot_output_custom_columns.js matches +// test-runner/output/dot_output_custom_columns.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/dot_output_custom_columns.js'), + specTransform, + { tty: true }, +); diff --git a/test/test-runner/test-output-dot-reporter.mjs b/test/test-runner/test-output-dot-reporter.mjs new file mode 100644 index 00000000000000..46312203bb46d7 --- /dev/null +++ b/test/test-runner/test-output-dot-reporter.mjs @@ -0,0 +1,10 @@ +// Test that the output of test-runner/output/dot_reporter.js matches test-runner/output/dot_reporter.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/dot_reporter.js'), + specTransform, +); diff --git a/test/test-runner/test-output-eval-dot.mjs b/test/test-runner/test-output-eval-dot.mjs new file mode 100644 index 00000000000000..e31334ac52dd2b --- /dev/null +++ b/test/test-runner/test-output-eval-dot.mjs @@ -0,0 +1,10 @@ +// Test that the output of test-runner/output/eval_dot.js matches test-runner/output/eval_dot.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/eval_dot.js'), + specTransform, +); diff --git a/test/test-runner/test-output-eval-spec.mjs b/test/test-runner/test-output-eval-spec.mjs new file mode 100644 index 00000000000000..86d6677552bdc5 --- /dev/null +++ b/test/test-runner/test-output-eval-spec.mjs @@ -0,0 +1,10 @@ +// Test that the output of test-runner/output/eval_spec.js matches test-runner/output/eval_spec.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/eval_spec.js'), + specTransform, +); diff --git a/test/test-runner/test-output-eval-tap.mjs b/test/test-runner/test-output-eval-tap.mjs new file mode 100644 index 00000000000000..a1902ec92878f4 --- /dev/null +++ b/test/test-runner/test-output-eval-tap.mjs @@ -0,0 +1,10 @@ +// Test that the output of test-runner/output/eval_tap.js matches test-runner/output/eval_tap.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/eval_tap.js'), + defaultTransform, +); diff --git a/test/test-runner/test-output-filtered-suite-delayed-build.mjs b/test/test-runner/test-output-filtered-suite-delayed-build.mjs new file mode 100644 index 00000000000000..c4ec3f3b019731 --- /dev/null +++ b/test/test-runner/test-output-filtered-suite-delayed-build.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/filtered-suite-delayed-build.js matches +// test-runner/output/filtered-suite-delayed-build.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/filtered-suite-delayed-build.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-filtered-suite-order.mjs b/test/test-runner/test-output-filtered-suite-order.mjs new file mode 100644 index 00000000000000..f29c4dcf62bc3f --- /dev/null +++ b/test/test-runner/test-output-filtered-suite-order.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/filtered-suite-order.mjs matches +// test-runner/output/filtered-suite-order.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/filtered-suite-order.mjs'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-filtered-suite-throws.mjs b/test/test-runner/test-output-filtered-suite-throws.mjs new file mode 100644 index 00000000000000..7976e3b63753de --- /dev/null +++ b/test/test-runner/test-output-filtered-suite-throws.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/filtered-suite-throws.js matches +// test-runner/output/filtered-suite-throws.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/filtered-suite-throws.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-force-exit.mjs b/test/test-runner/test-output-force-exit.mjs new file mode 100644 index 00000000000000..5138e3df57da31 --- /dev/null +++ b/test/test-runner/test-output-force-exit.mjs @@ -0,0 +1,10 @@ +// Test that the output of test-runner/output/force_exit.js matches test-runner/output/force_exit.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/force_exit.js'), + specTransform, +); diff --git a/test/test-runner/test-output-global-after-should-fail-the-test.mjs b/test/test-runner/test-output-global-after-should-fail-the-test.mjs new file mode 100644 index 00000000000000..71179d7f15ebfc --- /dev/null +++ b/test/test-runner/test-output-global-after-should-fail-the-test.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/global_after_should_fail_the_test.js matches +// test-runner/output/global_after_should_fail_the_test.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/global_after_should_fail_the_test.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-global-hooks-with-no-tests.mjs b/test/test-runner/test-output-global-hooks-with-no-tests.mjs new file mode 100644 index 00000000000000..361948df103ba2 --- /dev/null +++ b/test/test-runner/test-output-global-hooks-with-no-tests.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/global-hooks-with-no-tests.js matches +// test-runner/output/global-hooks-with-no-tests.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/global-hooks-with-no-tests.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-hooks-spec-reporter.mjs b/test/test-runner/test-output-hooks-spec-reporter.mjs new file mode 100644 index 00000000000000..cc46592fb74c6d --- /dev/null +++ b/test/test-runner/test-output-hooks-spec-reporter.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/hooks_spec_reporter.js matches +// test-runner/output/hooks_spec_reporter.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/hooks_spec_reporter.js'), + specTransform, +); diff --git a/test/test-runner/test-output-hooks-with-no-global-test.mjs b/test/test-runner/test-output-hooks-with-no-global-test.mjs new file mode 100644 index 00000000000000..a0c0327e0f9ec2 --- /dev/null +++ b/test/test-runner/test-output-hooks-with-no-global-test.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/hooks-with-no-global-test.js matches +// test-runner/output/hooks-with-no-global-test.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/hooks-with-no-global-test.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-hooks.mjs b/test/test-runner/test-output-hooks.mjs new file mode 100644 index 00000000000000..b1e1d655df6db8 --- /dev/null +++ b/test/test-runner/test-output-hooks.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/hooks.js matches test-runner/output/hooks.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/hooks.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-junit-reporter.mjs b/test/test-runner/test-output-junit-reporter.mjs new file mode 100644 index 00000000000000..ece14e09ac2e04 --- /dev/null +++ b/test/test-runner/test-output-junit-reporter.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/junit_reporter.js matches +// test-runner/output/junit_reporter.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, junitTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/junit_reporter.js'), + junitTransform, +); diff --git a/test/test-runner/test-output-lcov-reporter.mjs b/test/test-runner/test-output-lcov-reporter.mjs new file mode 100644 index 00000000000000..93aa38fff2bc66 --- /dev/null +++ b/test/test-runner/test-output-lcov-reporter.mjs @@ -0,0 +1,14 @@ +// Test that the output of test-runner/output/lcov_reporter.js matches test-runner/output/lcov_reporter.snapshot +import * as common from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, lcovTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +if (!process.features.inspector) { + common.skip('inspector support required'); +} + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/lcov_reporter.js'), + lcovTransform, +); diff --git a/test/test-runner/test-output-name-and-skip-patterns.mjs b/test/test-runner/test-output-name-and-skip-patterns.mjs new file mode 100644 index 00000000000000..875641a28435c4 --- /dev/null +++ b/test/test-runner/test-output-name-and-skip-patterns.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/name_and_skip_patterns.js matches +// test-runner/output/name_and_skip_patterns.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/name_and_skip_patterns.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-name-pattern-with-only.mjs b/test/test-runner/test-output-name-pattern-with-only.mjs new file mode 100644 index 00000000000000..89b94f8a80a031 --- /dev/null +++ b/test/test-runner/test-output-name-pattern-with-only.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/name_pattern_with_only.js matches +// test-runner/output/name_pattern_with_only.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/name_pattern_with_only.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-name-pattern.mjs b/test/test-runner/test-output-name-pattern.mjs new file mode 100644 index 00000000000000..efaef28ed0f0a9 --- /dev/null +++ b/test/test-runner/test-output-name-pattern.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/name_pattern.js matches test-runner/output/name_pattern.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/name_pattern.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-no-refs.mjs b/test/test-runner/test-output-no-refs.mjs new file mode 100644 index 00000000000000..5e2fbab53b2f54 --- /dev/null +++ b/test/test-runner/test-output-no-refs.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/no_refs.js matches test-runner/output/no_refs.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/no_refs.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-no-tests.mjs b/test/test-runner/test-output-no-tests.mjs new file mode 100644 index 00000000000000..0cff4003e7598c --- /dev/null +++ b/test/test-runner/test-output-no-tests.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/no_tests.js matches test-runner/output/no_tests.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/no_tests.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-non-tty-forced-color-output.mjs b/test/test-runner/test-output-non-tty-forced-color-output.mjs new file mode 100644 index 00000000000000..d630c52e293a35 --- /dev/null +++ b/test/test-runner/test-output-non-tty-forced-color-output.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/non-tty-forced-color-output.js matches +// test-runner/output/non-tty-forced-color-output.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/non-tty-forced-color-output.js'), + specTransform, +); diff --git a/test/test-runner/test-output-only-tests.mjs b/test/test-runner/test-output-only-tests.mjs new file mode 100644 index 00000000000000..93a9097bec15dc --- /dev/null +++ b/test/test-runner/test-output-only-tests.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/only_tests.js matches test-runner/output/only_tests.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/only_tests.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-output-cli.mjs b/test/test-runner/test-output-output-cli.mjs new file mode 100644 index 00000000000000..924b6212e2eae8 --- /dev/null +++ b/test/test-runner/test-output-output-cli.mjs @@ -0,0 +1,10 @@ +// Test that the output of test-runner/output/output_cli.js matches test-runner/output/output_cli.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/output_cli.js'), + defaultTransform, +); diff --git a/test/test-runner/test-output-output.mjs b/test/test-runner/test-output-output.mjs new file mode 100644 index 00000000000000..1eb152324c4063 --- /dev/null +++ b/test/test-runner/test-output-output.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/output.js matches test-runner/output/output.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/output.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-skip-each-hooks.mjs b/test/test-runner/test-output-skip-each-hooks.mjs new file mode 100644 index 00000000000000..a5fb2fb613627b --- /dev/null +++ b/test/test-runner/test-output-skip-each-hooks.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/skip-each-hooks.js matches +// test-runner/output/skip-each-hooks.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/skip-each-hooks.js'), + specTransform, +); diff --git a/test/test-runner/test-output-skip-pattern.mjs b/test/test-runner/test-output-skip-pattern.mjs new file mode 100644 index 00000000000000..852b48e7a2b6a1 --- /dev/null +++ b/test/test-runner/test-output-skip-pattern.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/skip_pattern.js matches test-runner/output/skip_pattern.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/skip_pattern.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-source-mapped-locations.mjs b/test/test-runner/test-output-source-mapped-locations.mjs new file mode 100644 index 00000000000000..a24bed052dc3ad --- /dev/null +++ b/test/test-runner/test-output-source-mapped-locations.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/source_mapped_locations.mjs matches +// test-runner/output/source_mapped_locations.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/source_mapped_locations.mjs'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-spec-reporter-cli.mjs b/test/test-runner/test-output-spec-reporter-cli.mjs new file mode 100644 index 00000000000000..5b44483601c3a5 --- /dev/null +++ b/test/test-runner/test-output-spec-reporter-cli.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/spec_reporter_cli.js matches +// test-runner/output/spec_reporter_cli.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/spec_reporter_cli.js'), + specTransform, +); diff --git a/test/test-runner/test-output-spec-reporter-successful.mjs b/test/test-runner/test-output-spec-reporter-successful.mjs new file mode 100644 index 00000000000000..0308d1e1f01b24 --- /dev/null +++ b/test/test-runner/test-output-spec-reporter-successful.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/spec_reporter_successful.js matches +// test-runner/output/spec_reporter_successful.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/spec_reporter_successful.js'), + specTransform, +); diff --git a/test/test-runner/test-output-spec-reporter.mjs b/test/test-runner/test-output-spec-reporter.mjs new file mode 100644 index 00000000000000..e7233b13da95d1 --- /dev/null +++ b/test/test-runner/test-output-spec-reporter.mjs @@ -0,0 +1,10 @@ +// Test that the output of test-runner/output/spec_reporter.js matches test-runner/output/spec_reporter.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/spec_reporter.js'), + specTransform, +); diff --git a/test/test-runner/test-output-suite-skip-hooks.mjs b/test/test-runner/test-output-suite-skip-hooks.mjs new file mode 100644 index 00000000000000..183c4bb27c5d34 --- /dev/null +++ b/test/test-runner/test-output-suite-skip-hooks.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/suite-skip-hooks.js matches +// test-runner/output/suite-skip-hooks.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/suite-skip-hooks.js'), + specTransform, +); diff --git a/test/test-runner/test-output-tap-escape.mjs b/test/test-runner/test-output-tap-escape.mjs new file mode 100644 index 00000000000000..f0b4471d5158bb --- /dev/null +++ b/test/test-runner/test-output-tap-escape.mjs @@ -0,0 +1,17 @@ +// Test that the output of test-runner/output/tap_escape.js matches test-runner/output/tap_escape.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { + spawnAndAssert, + transform, + replaceWindowsLineEndings, + replaceTestDuration, + ensureCwdIsProjectRoot, +} from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/tap_escape.js'), + transform(replaceWindowsLineEndings, replaceTestDuration), + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-test-diagnostic-warning-without-test-only-flag.mjs b/test/test-runner/test-output-test-diagnostic-warning-without-test-only-flag.mjs new file mode 100644 index 00000000000000..b5f59df53b867d --- /dev/null +++ b/test/test-runner/test-output-test-diagnostic-warning-without-test-only-flag.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/test-diagnostic-warning-without-test-only-flag.js matches +// test-runner/output/test-diagnostic-warning-without-test-only-flag.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/test-diagnostic-warning-without-test-only-flag.js'), + defaultTransform, + { flags: ['--test', '--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-test-runner-plan-timeout.mjs b/test/test-runner/test-output-test-runner-plan-timeout.mjs new file mode 100644 index 00000000000000..6771468d3b9fa9 --- /dev/null +++ b/test/test-runner/test-output-test-runner-plan-timeout.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/test-runner-plan-timeout.js matches +// test-runner/output/test-runner-plan-timeout.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/test-runner-plan-timeout.js'), + defaultTransform, + { flags: ['--test-reporter=tap', '--test-force-exit'] }, +); diff --git a/test/test-runner/test-output-test-runner-plan.mjs b/test/test-runner/test-output-test-runner-plan.mjs new file mode 100644 index 00000000000000..a4533e9a1b1196 --- /dev/null +++ b/test/test-runner/test-output-test-runner-plan.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/test-runner-plan.js matches +// test-runner/output/test-runner-plan.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/test-runner-plan.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-test-runner-watch-spec.mjs b/test/test-runner/test-output-test-runner-watch-spec.mjs new file mode 100644 index 00000000000000..c835b11527a8f0 --- /dev/null +++ b/test/test-runner/test-output-test-runner-watch-spec.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/test-runner-watch-spec.mjs matches +// test-runner/output/test-runner-watch-spec.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/test-runner-watch-spec.mjs'), + specTransform, +); diff --git a/test/test-runner/test-output-test-timeout-flag-with-test.mjs b/test/test-runner/test-output-test-timeout-flag-with-test.mjs new file mode 100644 index 00000000000000..f34db67d0be2c0 --- /dev/null +++ b/test/test-runner/test-output-test-timeout-flag-with-test.mjs @@ -0,0 +1,13 @@ +// Test that the output of test-runner/output/test-timeout-flag.js matches +// test-runner/output/test-timeout-flag.snapshot with --test flag. +// --test-timeout should work with or without --test flag. +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/test-timeout-flag.js'), + defaultTransform, + { flags: ['--test-reporter=tap', '--test-timeout=100', '--test'] }, +); diff --git a/test/test-runner/test-output-test-timeout-flag.mjs b/test/test-runner/test-output-test-timeout-flag.mjs new file mode 100644 index 00000000000000..96ef6c47af00aa --- /dev/null +++ b/test/test-runner/test-output-test-timeout-flag.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/test-timeout-flag.js matches +// test-runner/output/test-timeout-flag.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/test-timeout-flag.js'), + defaultTransform, + { flags: ['--test-reporter=tap', '--test-timeout=100'] }, +); diff --git a/test/test-runner/test-output-timeout-in-before-each.mjs b/test/test-runner/test-output-timeout-in-before-each.mjs new file mode 100644 index 00000000000000..e0efd67155f556 --- /dev/null +++ b/test/test-runner/test-output-timeout-in-before-each.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/timeout_in_before_each_should_not_affect_further_tests.js matches +// test-runner/output/timeout_in_before_each_should_not_affect_further_tests.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/timeout_in_before_each_should_not_affect_further_tests.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-typescript-coverage.mjs b/test/test-runner/test-output-typescript-coverage.mjs new file mode 100644 index 00000000000000..41aa97d194cc20 --- /dev/null +++ b/test/test-runner/test-output-typescript-coverage.mjs @@ -0,0 +1,25 @@ +// Test that the output of test-runner/output/typescript-coverage.mts matches +// test-runner/output/typescript-coverage.snapshot +import * as common from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +if (!process.features.inspector) { + common.skip('inspector support required'); +} + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/typescript-coverage.mts'), + defaultTransform, + { + flags: [ + '--disable-warning=ExperimentalWarning', + '--test-reporter=tap', + '--experimental-transform-types', + '--experimental-test-module-mocks', + '--experimental-test-coverage', + '--test-coverage-exclude=!test/**', + ], + }, +); diff --git a/test/test-runner/test-output-unfinished-suite-async-error.mjs b/test/test-runner/test-output-unfinished-suite-async-error.mjs new file mode 100644 index 00000000000000..b6af0ae9a1170f --- /dev/null +++ b/test/test-runner/test-output-unfinished-suite-async-error.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/unfinished-suite-async-error.js matches +// test-runner/output/unfinished-suite-async-error.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/unfinished-suite-async-error.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-runner.status b/test/test-runner/test-runner.status new file mode 100644 index 00000000000000..65ae96eb9e3726 --- /dev/null +++ b/test/test-runner/test-runner.status @@ -0,0 +1,7 @@ +prefix test-runner + +# To mark a test as flaky, list the test name in the appropriate section +# below, without ".js", followed by ": PASS,FLAKY". Example: +# sample-test : PASS,FLAKY + +[true] # This section applies to all platforms diff --git a/test/test-runner/testcfg.py b/test/test-runner/testcfg.py new file mode 100644 index 00000000000000..fa53433d0dd1e5 --- /dev/null +++ b/test/test-runner/testcfg.py @@ -0,0 +1,6 @@ +import sys, os +sys.path.append(os.path.join(os.path.dirname(__file__), '..')) +import testpy + +def GetConfiguration(context, root): + return testpy.ParallelTestConfiguration(context, root, 'test-runner') From 12773d19c4da016a70fa6cf9e2b617c7c43379fe Mon Sep 17 00:00:00 2001 From: Chengzhong Wu Date: Fri, 24 Oct 2025 10:21:32 -0400 Subject: [PATCH 60/83] test: increase debugger waitFor timeout on macOS PR-URL: https://github.com/nodejs/node/pull/60367 Refs: https://github.com/nodejs/node/actions/runs/18694915575/job/53309761263?pr=60343 Reviewed-By: Colin Ihrig Reviewed-By: Luigi Pinca Reviewed-By: Joyee Cheung --- test/common/debugger.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/test/common/debugger.js b/test/common/debugger.js index 1a258913e00dd7..f5a47cbe06ea71 100644 --- a/test/common/debugger.js +++ b/test/common/debugger.js @@ -7,12 +7,10 @@ const BREAK_MESSAGE = new RegExp('(?:' + [ 'exception', 'other', 'promiseRejection', 'step', ].join('|') + ') in', 'i'); -// Some macOS machines require more time to receive the outputs from the client. let TIMEOUT = common.platformTimeout(10000); -if (common.isWindows) { - // Some of the windows machines in the CI need more time to receive - // the outputs from the client. - // https://github.com/nodejs/build/issues/3014 +// Some macOS and Windows machines require more time to receive the outputs from the client. +// https://github.com/nodejs/build/issues/3014 +if (common.isWindows || common.isMacOS) { TIMEOUT = common.platformTimeout(15000); } From e83dbcba943eb470b3614b4b74831359f37123f3 Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Sat, 25 Oct 2025 13:30:34 +0200 Subject: [PATCH 61/83] test,crypto: sha3 algorithms aren't supported with BoringSSL PR-URL: https://github.com/nodejs/node/pull/60374 Reviewed-By: Filip Skokan Reviewed-By: Richard Lau Reviewed-By: Luigi Pinca --- test/fixtures/crypto/ecdsa.js | 96 +++++----- test/fixtures/crypto/hmac.js | 44 +++-- test/fixtures/crypto/rsa_pkcs.js | 106 +++++------ test/fixtures/crypto/rsa_pss.js | 172 +++++++++--------- .../test-webcrypto-derivebits-hkdf.js | 104 ++++++----- test/parallel/test-webcrypto-derivekey.js | 65 ++++--- test/parallel/test-webcrypto-digest.js | 120 ++++++------ 7 files changed, 380 insertions(+), 327 deletions(-) diff --git a/test/fixtures/crypto/ecdsa.js b/test/fixtures/crypto/ecdsa.js index b8827b24d41965..c3545fb20ec7df 100644 --- a/test/fixtures/crypto/ecdsa.js +++ b/test/fixtures/crypto/ecdsa.js @@ -72,18 +72,20 @@ module.exports = function() { 'b6a0a14d7e4bc6dd2eda82c9234f174b670b60c8f7d101f68fdf5889e02373b025' + 'dcbc4c82f2929b8e06c68535da98e38fe399c53a814b097935581ef21535eb', 'hex'), - 'SHA3-256': Buffer.from( - 'f6a48eb5557f484ed0c3e4b5c78a3cf497cbd346db06a4165d429248aa2cc51a69' + - '747d09f57af145469a8b607a9b8b9709629d74e8f5ca337c6ddc581b6f6103', - 'hex'), - 'SHA3-384': Buffer.from( - '777785978eb59da32888554dc7fd62d1ba1a3033cddaa8c36b8f3dcea8f85e1c8e' + - '6db26f509747bd144dfa9436784bf4abbcaa6abcf1ecc09cea3b921d46738c', - 'hex'), - 'SHA3-512': Buffer.from( - '0f01c2083b5dd7fccb2784563f88cd9a815d570a1690695e426643ab725780760d' + - 'e972e26e18d67f5557be89f17b4cd0065ce2937de299bdb2e972ebf7635084', - 'hex') + ...(!process.features.openssl_is_boringssl ? { + 'SHA3-256': Buffer.from( + 'f6a48eb5557f484ed0c3e4b5c78a3cf497cbd346db06a4165d429248aa2cc51a69' + + '747d09f57af145469a8b607a9b8b9709629d74e8f5ca337c6ddc581b6f6103', + 'hex'), + 'SHA3-384': Buffer.from( + '777785978eb59da32888554dc7fd62d1ba1a3033cddaa8c36b8f3dcea8f85e1c8e' + + '6db26f509747bd144dfa9436784bf4abbcaa6abcf1ecc09cea3b921d46738c', + 'hex'), + 'SHA3-512': Buffer.from( + '0f01c2083b5dd7fccb2784563f88cd9a815d570a1690695e426643ab725780760d' + + 'e972e26e18d67f5557be89f17b4cd0065ce2937de299bdb2e972ebf7635084', + 'hex') + } : {}) }, 'P-384': { 'SHA-1': Buffer.from( @@ -102,18 +104,20 @@ module.exports = function() { '72fbdb369fd34c1c54264d07f4facd69b02e4206f8a8bb259b882a305c56fde2d3' + '5107e493c53cd6b4af0b31306f4d03fd43cfc762a1030e17a3d775453a1212b142' + '9f7b3d93066a5f42a10b138cd177dc09616e827d598822d78d4627b754e6', 'hex'), - 'SHA3-256': Buffer.from( - '0b07c078be30fa5925a307d6fc559c5f398e63fb5d007d6b24a834847f2d3d18d5' + - 'b5e840711c52a7bc6626c3ced93301e873c013a706f6b297c12cc6d47a71e0529e' + - '719f43957de9995621d3cb0217469adaa6fd3135470771d0aa9d05d7a9c6', 'hex'), - 'SHA3-384': Buffer.from( - '2f36e8b04af46f68ef900c2720e3518b06f5440865d44072bbad5d62288c575042' + - 'b183a372acd70328c738668dcecb9866801462d62df3c35450fdc6c95433103fcd' + - 'c77999b640e3f92bd4e9be6e27ab129d1bc4f0b2a4c829388666920892d3', 'hex'), - 'SHA3-512': Buffer.from( - '32a951e886c33ac57a008efe9643bc92aa3ece9521d115e0c7240caecf124d1f7c' + - 'dcba7fabb9ad5202e04f7aa591ab01ed3f060f04f493e4f24430fe8159200612f0' + - '2849108b8be6edc8494c328097ad9265928efe5cb9d91be2f013ee17ee4e', 'hex') + ...(!process.features.openssl_is_boringssl ? { + 'SHA3-256': Buffer.from( + '0b07c078be30fa5925a307d6fc559c5f398e63fb5d007d6b24a834847f2d3d18d5' + + 'b5e840711c52a7bc6626c3ced93301e873c013a706f6b297c12cc6d47a71e0529e' + + '719f43957de9995621d3cb0217469adaa6fd3135470771d0aa9d05d7a9c6', 'hex'), + 'SHA3-384': Buffer.from( + '2f36e8b04af46f68ef900c2720e3518b06f5440865d44072bbad5d62288c575042' + + 'b183a372acd70328c738668dcecb9866801462d62df3c35450fdc6c95433103fcd' + + 'c77999b640e3f92bd4e9be6e27ab129d1bc4f0b2a4c829388666920892d3', 'hex'), + 'SHA3-512': Buffer.from( + '32a951e886c33ac57a008efe9643bc92aa3ece9521d115e0c7240caecf124d1f7c' + + 'dcba7fabb9ad5202e04f7aa591ab01ed3f060f04f493e4f24430fe8159200612f0' + + '2849108b8be6edc8494c328097ad9265928efe5cb9d91be2f013ee17ee4e', 'hex') + } : {}) }, 'P-521': { 'SHA-1': Buffer.from( @@ -140,29 +144,35 @@ module.exports = function() { '01f0071e6a32867fa70f695cd39c4e87e142b9e4134d38740bd6fee354a575167e' + '13524e94832637910fe11e53a85fb21b91adb81bb1779c4e2b8bc87c717dc35084', 'hex'), - 'SHA3-256': Buffer.from( - '00463679f47a4c705e03447360dcf34d1743e0d4b2591cc66832a6bc80d92e538c' + - '169a1fd330f98e7235ca7fec7e16ac44fb13095b8edf2c76b75c4845177d59e425' + - '0127c4359f6a4c9ccb63e7a9ff8122c0b4a8b7408e28c96817ecc3baf8c559c413' + - 'c3bb580447dec9f52139b2afde369cd51730f050bc94137556ae137f0509464219', - 'hex'), - 'SHA3-384': Buffer.from( - '01969a4db0888bc067a68a31fe5d0fc97e0b701f570565f7b25cb27707c6f020ff' + - '680f8553ec5c2d6885e9e91b39262ed1bde375525eb13fdf12089b7939c7689735' + - '0101c8b8d1129a217e8e956bef78cf7b9a0458523b04ac8e0b84ce73d54326f7a8' + - '704ee42fe183f3ef79d83e676f34dc5476e2342641a5b973d3d94e8503676fbbc5', - 'hex'), - 'SHA3-512': Buffer.from( - '000f362e914ee0136663cf57bf4085c25604af6dc198b4818751e1195ee7e41a16' + - '91be909dcbc2bae00b8917f6bb918eae3740ac1b76e0913137c2da1171d6400b55' + - '01ec6e1dc5987a27fe16fc2ce5c8e954088f898a9bbefb176eaa8bbd9ccc264c4c' + - 'cc38c83ac8b5a168f90228daf8405a2b9bf7829c263a646b4e1098e2ace38deec7', - 'hex') + ...(!process.features.openssl_is_boringssl ? { + 'SHA3-256': Buffer.from( + '00463679f47a4c705e03447360dcf34d1743e0d4b2591cc66832a6bc80d92e538c' + + '169a1fd330f98e7235ca7fec7e16ac44fb13095b8edf2c76b75c4845177d59e425' + + '0127c4359f6a4c9ccb63e7a9ff8122c0b4a8b7408e28c96817ecc3baf8c559c413' + + 'c3bb580447dec9f52139b2afde369cd51730f050bc94137556ae137f0509464219', + 'hex'), + 'SHA3-384': Buffer.from( + '01969a4db0888bc067a68a31fe5d0fc97e0b701f570565f7b25cb27707c6f020ff' + + '680f8553ec5c2d6885e9e91b39262ed1bde375525eb13fdf12089b7939c7689735' + + '0101c8b8d1129a217e8e956bef78cf7b9a0458523b04ac8e0b84ce73d54326f7a8' + + '704ee42fe183f3ef79d83e676f34dc5476e2342641a5b973d3d94e8503676fbbc5', + 'hex'), + 'SHA3-512': Buffer.from( + '000f362e914ee0136663cf57bf4085c25604af6dc198b4818751e1195ee7e41a16' + + '91be909dcbc2bae00b8917f6bb918eae3740ac1b76e0913137c2da1171d6400b55' + + '01ec6e1dc5987a27fe16fc2ce5c8e954088f898a9bbefb176eaa8bbd9ccc264c4c' + + 'cc38c83ac8b5a168f90228daf8405a2b9bf7829c263a646b4e1098e2ace38deec7', + 'hex') + } : {}) } } const curves = ['P-256', 'P-384', 'P-521']; - const hashes = ['SHA-1', 'SHA-256', 'SHA-384', 'SHA-512', 'SHA3-256', 'SHA3-384', 'SHA3-512']; + const hashes = ['SHA-1', 'SHA-256', 'SHA-384', 'SHA-512']; + + if (!process.features.openssl_is_boringssl) { + hashes.push('SHA3-256', 'SHA3-384', 'SHA3-512'); + } const vectors = []; curves.forEach((namedCurve) => { diff --git a/test/fixtures/crypto/hmac.js b/test/fixtures/crypto/hmac.js index 6505c6e2ae55b5..acdf3229a4bc7c 100644 --- a/test/fixtures/crypto/hmac.js +++ b/test/fixtures/crypto/hmac.js @@ -22,16 +22,18 @@ module.exports = function () { '5dcc359443aaf652fa1375d6b3e61fdcf29bb4a28bd5d3dcfa40f82f906bb280' + '0455db03b5d31fb972a15a6d0103a24e56d156a119c0e5a1e92a44c3c5657cf9', 'hex'), - 'SHA3-256': Buffer.from( - 'e588ec0811463d767241df1074b47ae4071b51f2ce36537ba69ccdc3fdc2b7a8', - 'hex'), - 'SHA3-384': Buffer.from( - '6b1da28eab1f582ad9718effe05e23d5fd2c9877a2d9443f90bec093bece2ea7' + - 'd2354cd0bdc5e147d2e9009373494488', 'hex'), - 'SHA3-512': Buffer.from( - '5dcc359443aaf652fa1375d6b3e61fdcf29bb4a28bd5d3dcfa40f82f906bb280' + - '0455db03b5d31fb972a15a6d0103a24e56d156a119c0e5a1e92a44c3c5657cf9', - 'hex') + ...(!process.features.openssl_is_boringssl ? { + 'SHA3-256': Buffer.from( + 'e588ec0811463d767241df1074b47ae4071b51f2ce36537ba69ccdc3fdc2b7a8', + 'hex'), + 'SHA3-384': Buffer.from( + '6b1da28eab1f582ad9718effe05e23d5fd2c9877a2d9443f90bec093bece2ea7' + + 'd2354cd0bdc5e147d2e9009373494488', 'hex'), + 'SHA3-512': Buffer.from( + '5dcc359443aaf652fa1375d6b3e61fdcf29bb4a28bd5d3dcfa40f82f906bb280' + + '0455db03b5d31fb972a15a6d0103a24e56d156a119c0e5a1e92a44c3c5657cf9', + 'hex') + } : {}) } const signatures = { @@ -46,16 +48,18 @@ module.exports = function () { '61fb278c3ffb0cce2bf1cf723ddfd8ef1f931c0c618c25907324605939e3f9a2' + 'c6f4af690bda3407dc2f5770f6a0a44b954d64a332e3ee0821abf82b7f3e99c1', 'hex'), - 'SHA3-256': Buffer.from( - 'c1ac5e11fcd50c48bf567f6e296632f5801c4eb07a8a47579b41dee971a3099b', - 'hex'), - 'SHA3-384': Buffer.from( - 'ac8c97f6dd8d9e16101063077c16b23fe291a5e6d149653e9ac7002365159317' + - 'adcfad511996578b0053a5c14b75f16c', 'hex'), - 'SHA3-512': Buffer.from( - '2162c2a8907e6b2f68599a69e81a464d8f076b5eeb555d98b4d20330034df3c7' + - 'cf35b1fa958a074ca12f0d242df39f0da3d4f1dbfb3629057798fe1f883974ee', - 'hex') + ...(!process.features.openssl_is_boringssl ? { + 'SHA3-256': Buffer.from( + 'c1ac5e11fcd50c48bf567f6e296632f5801c4eb07a8a47579b41dee971a3099b', + 'hex'), + 'SHA3-384': Buffer.from( + 'ac8c97f6dd8d9e16101063077c16b23fe291a5e6d149653e9ac7002365159317' + + 'adcfad511996578b0053a5c14b75f16c', 'hex'), + 'SHA3-512': Buffer.from( + '2162c2a8907e6b2f68599a69e81a464d8f076b5eeb555d98b4d20330034df3c7' + + 'cf35b1fa958a074ca12f0d242df39f0da3d4f1dbfb3629057798fe1f883974ee', + 'hex') + } : {}) } const vectors = []; diff --git a/test/fixtures/crypto/rsa_pkcs.js b/test/fixtures/crypto/rsa_pkcs.js index 4630e4af913580..d54c44b6d820d8 100644 --- a/test/fixtures/crypto/rsa_pkcs.js +++ b/test/fixtures/crypto/rsa_pkcs.js @@ -97,33 +97,35 @@ module.exports = function () { '7a6335c70e193235dcda48add6858626bd96311e60f7e5ea4491b6c1e6248afe12b' + 'bbd54f8869b043a5b0444562813f0a98b300356f306e6b783a29f3bec97ca40ea20' + '062cab8926ec5d96aa387cc84821a6d72b8ea126e7d', 'hex'), - 'sha3-256': Buffer.from( - 'be1b476c1911a01d71710fd8a2f3158d6f7839e91443b01bed30dfdd04336d80c6b' + - 'f692c06fad254877901c10a73853e8fb202a29cddefdf16c3adcda1fc123625897d' + - '1b81b32a9dec38957e023be221d8f31e7470ad32e761edce9170eefa37ec19bd0c3' + - 'e0b0ad2a244e98f54a08f873efb63c6fad14d7322b50eb05b6bae767305da92a90a' + - '53cdae52b0d81e158a00003ec626e50423b7377a34a7b28cc7483b55bfde05bd431' + - 'cfa436c38c285531e0d476ee13f151c8ae832ffd51ba00f2ab06f1844e73c0fe0f6' + - 'ce17d966b1e07727af4161368aa0a74a594a6fdb782b46a9ae6098799c366fc0d71' + - '1b2d965cf5eeeed9175b39b1d0bcefdd7df376e8ac9', 'hex'), - 'sha3-384': Buffer.from( - '002eaf5837443f1a33dc03729a308c503888d7a8cc013be424a91bce18105f7334a' + - '499a5eddc5f4fab2fdf80f52988d53bf8bd5e78c3ce1a43abaf3b8146c260b6ce8b' + - 'ffc9857f4b35c190cea85921c46d3ab573113744472d1afb637a0e9ab5021bcb355' + - '7f5b52faf89fa864a7d3bf5799096c54ee53fa139e1bc13842a2a5bf0f1d85f041d' + - 'a4e0e87425b421f22f0240ad62ef77ba6f090e0d48e17c07fd1e477c7e16a3196f5' + - '0142d0f0c5e525a10325569e5a1f50cb4577e782a643972857cc918ae5409587d9e' + - '44e1c1e89540e87deed7dda5005ac63ba609f522fdd92c81d95c1ffa383558a10f3' + - '064f59ca0534bfad31acbf3e2807cb7d3147c59ee4d', 'hex'), - 'sha3-512': Buffer.from( - '561585b621c916453762285c8bb6ede3f303074ad6f2826ca15b3900e49c4d94c07' + - 'aab0b875eaa79049ba2ed97e9a87c44fff9bffe638a1bf8c4db69c627b6adbe8fca' + - '2b38cb8b4c2810a16286bef498327b9db4b53043ed5012c7c58f037edf669baf772' + - '9b58e413e133ebb90a5fcb6dc3936f4f87971c0e85f362189b4279bbb2d9293a427' + - '5653068c1bc8772cebc4733a5d1df0b454d4f628c645c22bb1c8cc601fbc92dc091' + - 'db38fad4a36289ae9ed424c46643a8161a102ae511877d25f2eab7342dff6b92bf3' + - '65951e76ee84c2bd84a595f63d7cc04d00e1589870956491e518b3ba245efc37a28' + - 'ec018d8788a92ab93a90bb314f9ab0788a0b5b50489', 'hex') + ...(!process.features.openssl_is_boringssl ? { + 'sha3-256': Buffer.from( + 'be1b476c1911a01d71710fd8a2f3158d6f7839e91443b01bed30dfdd04336d80c6b' + + 'f692c06fad254877901c10a73853e8fb202a29cddefdf16c3adcda1fc123625897d' + + '1b81b32a9dec38957e023be221d8f31e7470ad32e761edce9170eefa37ec19bd0c3' + + 'e0b0ad2a244e98f54a08f873efb63c6fad14d7322b50eb05b6bae767305da92a90a' + + '53cdae52b0d81e158a00003ec626e50423b7377a34a7b28cc7483b55bfde05bd431' + + 'cfa436c38c285531e0d476ee13f151c8ae832ffd51ba00f2ab06f1844e73c0fe0f6' + + 'ce17d966b1e07727af4161368aa0a74a594a6fdb782b46a9ae6098799c366fc0d71' + + '1b2d965cf5eeeed9175b39b1d0bcefdd7df376e8ac9', 'hex'), + 'sha3-384': Buffer.from( + '002eaf5837443f1a33dc03729a308c503888d7a8cc013be424a91bce18105f7334a' + + '499a5eddc5f4fab2fdf80f52988d53bf8bd5e78c3ce1a43abaf3b8146c260b6ce8b' + + 'ffc9857f4b35c190cea85921c46d3ab573113744472d1afb637a0e9ab5021bcb355' + + '7f5b52faf89fa864a7d3bf5799096c54ee53fa139e1bc13842a2a5bf0f1d85f041d' + + 'a4e0e87425b421f22f0240ad62ef77ba6f090e0d48e17c07fd1e477c7e16a3196f5' + + '0142d0f0c5e525a10325569e5a1f50cb4577e782a643972857cc918ae5409587d9e' + + '44e1c1e89540e87deed7dda5005ac63ba609f522fdd92c81d95c1ffa383558a10f3' + + '064f59ca0534bfad31acbf3e2807cb7d3147c59ee4d', 'hex'), + 'sha3-512': Buffer.from( + '561585b621c916453762285c8bb6ede3f303074ad6f2826ca15b3900e49c4d94c07' + + 'aab0b875eaa79049ba2ed97e9a87c44fff9bffe638a1bf8c4db69c627b6adbe8fca' + + '2b38cb8b4c2810a16286bef498327b9db4b53043ed5012c7c58f037edf669baf772' + + '9b58e413e133ebb90a5fcb6dc3936f4f87971c0e85f362189b4279bbb2d9293a427' + + '5653068c1bc8772cebc4733a5d1df0b454d4f628c645c22bb1c8cc601fbc92dc091' + + 'db38fad4a36289ae9ed424c46643a8161a102ae511877d25f2eab7342dff6b92bf3' + + '65951e76ee84c2bd84a595f63d7cc04d00e1589870956491e518b3ba245efc37a28' + + 'ec018d8788a92ab93a90bb314f9ab0788a0b5b50489', 'hex') + } : {}) } const vectors = [ @@ -159,30 +161,32 @@ module.exports = function () { plaintext, signature: signatures['sha-512'] }, - { - publicKeyBuffer: spki, - privateKeyBuffer: pkcs8, - algorithm: { name: 'RSASSA-PKCS1-v1_5' }, - hash: 'SHA3-256', - plaintext, - signature: signatures['sha3-256'] - }, - { - publicKeyBuffer: spki, - privateKeyBuffer: pkcs8, - algorithm: { name: 'RSASSA-PKCS1-v1_5' }, - hash: 'SHA3-384', - plaintext, - signature: signatures['sha3-384'] - }, - { - publicKeyBuffer: spki, - privateKeyBuffer: pkcs8, - algorithm: { name: 'RSASSA-PKCS1-v1_5' }, - hash: 'SHA3-512', - plaintext, - signature: signatures['sha3-512'] - }, + ...(!process.features.openssl_is_boringssl ? [ + { + publicKeyBuffer: spki, + privateKeyBuffer: pkcs8, + algorithm: { name: 'RSASSA-PKCS1-v1_5' }, + hash: 'SHA3-256', + plaintext, + signature: signatures['sha3-256'] + }, + { + publicKeyBuffer: spki, + privateKeyBuffer: pkcs8, + algorithm: { name: 'RSASSA-PKCS1-v1_5' }, + hash: 'SHA3-384', + plaintext, + signature: signatures['sha3-384'] + }, + { + publicKeyBuffer: spki, + privateKeyBuffer: pkcs8, + algorithm: { name: 'RSASSA-PKCS1-v1_5' }, + hash: 'SHA3-512', + plaintext, + signature: signatures['sha3-512'] + }, + ] : []), ]; return vectors; diff --git a/test/fixtures/crypto/rsa_pss.js b/test/fixtures/crypto/rsa_pss.js index 101122b2ffe31c..423f2c4d77bfc9 100644 --- a/test/fixtures/crypto/rsa_pss.js +++ b/test/fixtures/crypto/rsa_pss.js @@ -150,42 +150,44 @@ module.exports = function() { 'b68c04bfe452c3adc6c10066a915231b7b404727eb6201b4921eb96d9407de2b963' + '3879ceb71d759d9828d7b4d062f6ef100757d8328187caf57dfb859d1555345207c' + '1cce7905c3564c08fec78867a53d5a2cf84810e1ffa', 'hex'), - 'sha3-512, no salt': Buffer.from( - 'd2430dc87abeaa7d13f7cec8510f1a296e1c608f44b1696829c59a99e8eefe9b2ee' + - '6ee8ad6fdc93c24fcba2f04d1da195924b6209717e1992c10ed9f4783478765fe34' + - '3e761203bff9d326bb6dc2061b0a7554c8ce0814b29249136c20c8e30054df0c6bc' + - '656509a82845149368896690e32ff5dd32ef01543686f01d6a69bb438b049e66a8b' + - 'df485a13edcd7dc482da4cc57d0b740aca3e56f0da247794e600afd27b22b6da13b' + - 'cc15dd2059b525f8cb6bcd07540aa843f0ae51d4b0eea27045485914b908bdd01d0' + - 'a9d42379f9f7180f4ad162ff73df5fed0200eb02ad01473975d54a77c15a9c61a3c' + - 'b5e27de5d1eecc363d45506f7123a5ddd115c5e4c9e', 'hex'), - 'sha3-256, salted': Buffer.from( - '59cb9cce6ae838eb20d38d6af4acb9b866b0753bb7df9e441037d788512c03279e8' + - '3d9a9cf5c0921fe1c0b6e8e895a8c0ad24a18b123f809b34ef2a3a1f05974030320' + - '435692ef5d378cef4368c3658c098a25371dfaf1c0b6910f653a4ec15f2c08956c1' + - '405136c2aba7f25a808fa7dbf57a4cb2978bd91af710b27ee239d955c8cac7a76ae' + - '9085cefeda2a585a99cc948f064b5da66a9c4aa4f3f767ac905a9f314b47038e05c' + - '3608fbb7e67a278e4f009a62c3cd3fdf43692e759d9361be1217999a76a69d4d119' + - 'f8791a90e207e46b3f6125721f56fd819292d06a3cdae2c62c9a1dc0d964a06036c' + - '8c18661cc6c873532a3536ab51e1ce210926db299e2', 'hex'), - 'sha3-384, salted': Buffer.from( - '8d1f9297c8169f27f0c58827dba991d862de58c1155f612ad2995d2bf862d051c4a' + - '91b48571849b0412384382e5b77990de6a3c84010046b35c4a504f175a3479483d9' + - '5c58f86bb96d53a27e59d6f67fddaae295ce90610f5086acc711557c2c85aac32d3' + - '24199cff2367ae44e1d91307a98c8cbfb085a8bce6b1c20714711bc15b0eddb7881' + - '823227d4be477ffdad8093663a6a1fc62eb39c49c2c3a821c2b202cf7904b49ca92' + - '3c83819602bb13931577354a80f99309030044935b1cd41f0513160e661db1959fb' + - '1ec15f087f3d288e875d54cbf070ec860b0aeecc951ea65e97cd5460750d4b7de52' + - '22cb9e7466b1f506ecf6a81fc399dfd8334160f9084', 'hex'), - 'sha3-512, salted': Buffer.from( - '7b6d7be418c5d37cc8070698b8b03d818ecd8b673d047d34921913f6d59c69cb496' + - '172d6118207d9ff92b8e1246acf0e03a845d935a70f8a82c3d5d6db6a1a0e337269' + - '4b904372413dcbaa7ac5486bc8ccaf70d7e9470be82b928a90017e272cf9761ed26' + - 'c160fe874a2675a4fb2acad72c50fbfffdd70b5a6f2919553d7ea1829934670f8de' + - 'f2a5c2816404b1aa153323c92c58400622f184b9b0463fa48d6b27091f68c287e3f' + - '6d9ab9eb451711a5d984c547f3d56f14a686a89ddf36c47ce25092b8c6530904de9' + - '5df7fc602fe9394315f1b1847aae304cb5ad71e2cb78acfbc997a87a9d62a6898bb' + - '6d84a81bb89b50186265f4be171a93d837a4bf777c8', 'hex') + ...(!process.features.openssl_is_boringssl ? { + 'sha3-512, no salt': Buffer.from( + 'd2430dc87abeaa7d13f7cec8510f1a296e1c608f44b1696829c59a99e8eefe9b2ee' + + '6ee8ad6fdc93c24fcba2f04d1da195924b6209717e1992c10ed9f4783478765fe34' + + '3e761203bff9d326bb6dc2061b0a7554c8ce0814b29249136c20c8e30054df0c6bc' + + '656509a82845149368896690e32ff5dd32ef01543686f01d6a69bb438b049e66a8b' + + 'df485a13edcd7dc482da4cc57d0b740aca3e56f0da247794e600afd27b22b6da13b' + + 'cc15dd2059b525f8cb6bcd07540aa843f0ae51d4b0eea27045485914b908bdd01d0' + + 'a9d42379f9f7180f4ad162ff73df5fed0200eb02ad01473975d54a77c15a9c61a3c' + + 'b5e27de5d1eecc363d45506f7123a5ddd115c5e4c9e', 'hex'), + 'sha3-256, salted': Buffer.from( + '59cb9cce6ae838eb20d38d6af4acb9b866b0753bb7df9e441037d788512c03279e8' + + '3d9a9cf5c0921fe1c0b6e8e895a8c0ad24a18b123f809b34ef2a3a1f05974030320' + + '435692ef5d378cef4368c3658c098a25371dfaf1c0b6910f653a4ec15f2c08956c1' + + '405136c2aba7f25a808fa7dbf57a4cb2978bd91af710b27ee239d955c8cac7a76ae' + + '9085cefeda2a585a99cc948f064b5da66a9c4aa4f3f767ac905a9f314b47038e05c' + + '3608fbb7e67a278e4f009a62c3cd3fdf43692e759d9361be1217999a76a69d4d119' + + 'f8791a90e207e46b3f6125721f56fd819292d06a3cdae2c62c9a1dc0d964a06036c' + + '8c18661cc6c873532a3536ab51e1ce210926db299e2', 'hex'), + 'sha3-384, salted': Buffer.from( + '8d1f9297c8169f27f0c58827dba991d862de58c1155f612ad2995d2bf862d051c4a' + + '91b48571849b0412384382e5b77990de6a3c84010046b35c4a504f175a3479483d9' + + '5c58f86bb96d53a27e59d6f67fddaae295ce90610f5086acc711557c2c85aac32d3' + + '24199cff2367ae44e1d91307a98c8cbfb085a8bce6b1c20714711bc15b0eddb7881' + + '823227d4be477ffdad8093663a6a1fc62eb39c49c2c3a821c2b202cf7904b49ca92' + + '3c83819602bb13931577354a80f99309030044935b1cd41f0513160e661db1959fb' + + '1ec15f087f3d288e875d54cbf070ec860b0aeecc951ea65e97cd5460750d4b7de52' + + '22cb9e7466b1f506ecf6a81fc399dfd8334160f9084', 'hex'), + 'sha3-512, salted': Buffer.from( + '7b6d7be418c5d37cc8070698b8b03d818ecd8b673d047d34921913f6d59c69cb496' + + '172d6118207d9ff92b8e1246acf0e03a845d935a70f8a82c3d5d6db6a1a0e337269' + + '4b904372413dcbaa7ac5486bc8ccaf70d7e9470be82b928a90017e272cf9761ed26' + + 'c160fe874a2675a4fb2acad72c50fbfffdd70b5a6f2919553d7ea1829934670f8de' + + 'f2a5c2816404b1aa153323c92c58400622f184b9b0463fa48d6b27091f68c287e3f' + + '6d9ab9eb451711a5d984c547f3d56f14a686a89ddf36c47ce25092b8c6530904de9' + + '5df7fc602fe9394315f1b1847aae304cb5ad71e2cb78acfbc997a87a9d62a6898bb' + + '6d84a81bb89b50186265f4be171a93d837a4bf777c8', 'hex') + } : {}) } const vectors = [ @@ -253,54 +255,56 @@ module.exports = function() { plaintext, signature: signatures['sha-512, salted'] }, - { - publicKeyBuffer: spki, - privateKeyBuffer: pkcs8, - algorithm: { name: 'RSA-PSS', saltLength: 0 }, - hash: 'SHA3-256', - plaintext, - signature: signatures['sha3-256, no salt'] - }, - { - publicKeyBuffer: spki, - privateKeyBuffer: pkcs8, - algorithm: { name: 'RSA-PSS', saltLength: 0 }, - hash: 'SHA3-384', - plaintext, - signature: signatures['sha3-384, no salt'] - }, - { - publicKeyBuffer: spki, - privateKeyBuffer: pkcs8, - algorithm: { name: 'RSA-PSS', saltLength: 0 }, - hash: 'SHA3-512', - plaintext, - signature: signatures['sha3-512, no salt'] - }, - { - publicKeyBuffer: spki, - privateKeyBuffer: pkcs8, - algorithm: { name: 'RSA-PSS', saltLength: 32 }, - hash: 'SHA3-256', - plaintext, - signature: signatures['sha3-256, salted'] - }, - { - publicKeyBuffer: spki, - privateKeyBuffer: pkcs8, - algorithm: { name: 'RSA-PSS', saltLength: 48 }, - hash: 'SHA3-384', - plaintext, - signature: signatures['sha3-384, salted'] - }, - { - publicKeyBuffer: spki, - privateKeyBuffer: pkcs8, - algorithm: { name: 'RSA-PSS', saltLength: 64 }, - hash: 'SHA3-512', - plaintext, - signature: signatures['sha3-512, salted'] - } + ...(!process.features.openssl_is_boringssl ? [ + { + publicKeyBuffer: spki, + privateKeyBuffer: pkcs8, + algorithm: { name: 'RSA-PSS', saltLength: 0 }, + hash: 'SHA3-256', + plaintext, + signature: signatures['sha3-256, no salt'] + }, + { + publicKeyBuffer: spki, + privateKeyBuffer: pkcs8, + algorithm: { name: 'RSA-PSS', saltLength: 0 }, + hash: 'SHA3-384', + plaintext, + signature: signatures['sha3-384, no salt'] + }, + { + publicKeyBuffer: spki, + privateKeyBuffer: pkcs8, + algorithm: { name: 'RSA-PSS', saltLength: 0 }, + hash: 'SHA3-512', + plaintext, + signature: signatures['sha3-512, no salt'] + }, + { + publicKeyBuffer: spki, + privateKeyBuffer: pkcs8, + algorithm: { name: 'RSA-PSS', saltLength: 32 }, + hash: 'SHA3-256', + plaintext, + signature: signatures['sha3-256, salted'] + }, + { + publicKeyBuffer: spki, + privateKeyBuffer: pkcs8, + algorithm: { name: 'RSA-PSS', saltLength: 48 }, + hash: 'SHA3-384', + plaintext, + signature: signatures['sha3-384, salted'] + }, + { + publicKeyBuffer: spki, + privateKeyBuffer: pkcs8, + algorithm: { name: 'RSA-PSS', saltLength: 64 }, + hash: 'SHA3-512', + plaintext, + signature: signatures['sha3-512, salted'] + } + ] : []), ]; return vectors; diff --git a/test/parallel/test-webcrypto-derivebits-hkdf.js b/test/parallel/test-webcrypto-derivebits-hkdf.js index 0629f85b0fb538..2759223e76a060 100644 --- a/test/parallel/test-webcrypto-derivebits-hkdf.js +++ b/test/parallel/test-webcrypto-derivebits-hkdf.js @@ -91,18 +91,20 @@ const kDerivations = { empty: '9e4b719033742101e90f1ad61e2ff3b4' + '256863667296d74389f1f02af2c4e6a6' }, - 'SHA3-256': { - normal: '386b0693d7a58c4ddf01b49bfbbd2fa87c6f911991543995170ba20ed28df599', - empty: 'd029bc828b6c6c8bb16ce3d25f5058f19c7d2517745e11c5d65c6d242e82e47f', - }, - 'SHA3-384': { - normal: '8c3b72e659bad40bcd14bdc1f7c3836059d24253795ab046a272973fd0456508', - empty: '3211ff4c676f761494c1ca2683d2d4662fe1d770ae5c58ebf6af6acb181c7d71', - }, - 'SHA3-512': { - normal: '5588c5c70cb3dd2f95323da2e9d5f299ca99c301d920a499330c449d21c645cd', - empty: '2c944b916c2751a71a1b5e57fcb487939c624335683995770b9f7cc7cbbb21f0', - }, + ...(!process.features.openssl_is_boringssl ? { + 'SHA3-256': { + normal: '386b0693d7a58c4ddf01b49bfbbd2fa87c6f911991543995170ba20ed28df599', + empty: 'd029bc828b6c6c8bb16ce3d25f5058f19c7d2517745e11c5d65c6d242e82e47f', + }, + 'SHA3-384': { + normal: '8c3b72e659bad40bcd14bdc1f7c3836059d24253795ab046a272973fd0456508', + empty: '3211ff4c676f761494c1ca2683d2d4662fe1d770ae5c58ebf6af6acb181c7d71', + }, + 'SHA3-512': { + normal: '5588c5c70cb3dd2f95323da2e9d5f299ca99c301d920a499330c449d21c645cd', + empty: '2c944b916c2751a71a1b5e57fcb487939c624335683995770b9f7cc7cbbb21f0', + }, + } : {}), }, empty: { 'SHA-384': { @@ -129,18 +131,20 @@ const kDerivations = { empty: 'c8e12774135305c9147f2cc4766e5ead' + '25d8f457b9a1953d52677361ced558fb' }, - 'SHA3-256': { - normal: '9befc557f5baf4075b5fb38c014b41b92ab7534150baf64201069e8807d0e83d', - empty: '54d1fa1aa7cad99dab0622b772170e775c103756183bac36a228fd817a98a3f6', - }, - 'SHA3-384': { - normal: '46b54c015e368677edf7ac16963bccd9d2ba8246eef0e8beb04d8d188774b91b', - empty: '46eb0b2649bb0f605d70e4818ffc8176ee1be9782396e69fb4d0fd7cfe902b55', - }, - 'SHA3-512': { - normal: 'aa4375c82b5d7a3cac88a0423250b3882f140c253e98e8e7a0f6055b0908e4c2', - empty: '6613003f98602ddb53ac35f5aa256c9f5279d50ee65bb08fdf2ecf65cc5df27f', - }, + ...(!process.features.openssl_is_boringssl ? { + 'SHA3-256': { + normal: '9befc557f5baf4075b5fb38c014b41b92ab7534150baf64201069e8807d0e83d', + empty: '54d1fa1aa7cad99dab0622b772170e775c103756183bac36a228fd817a98a3f6', + }, + 'SHA3-384': { + normal: '46b54c015e368677edf7ac16963bccd9d2ba8246eef0e8beb04d8d188774b91b', + empty: '46eb0b2649bb0f605d70e4818ffc8176ee1be9782396e69fb4d0fd7cfe902b55', + }, + 'SHA3-512': { + normal: 'aa4375c82b5d7a3cac88a0423250b3882f140c253e98e8e7a0f6055b0908e4c2', + empty: '6613003f98602ddb53ac35f5aa256c9f5279d50ee65bb08fdf2ecf65cc5df27f', + }, + } : {}), } }, long: { @@ -169,18 +173,20 @@ const kDerivations = { empty: 'e579d1f9e7f08e6f990ffcfcce1ed201' + 'c5e37e62cdf606f0ba4aca80427fbc44' }, - 'SHA3-256': { - normal: '24f38fd1905554b7cbf8395cc3976292d11ce24a0b3131da0fd4b109832d27e3', - empty: '33d0a5151c0f52e4bb7fb67cf7a17063127624dc3e685903f49ebb07872084d1', - }, - 'SHA3-384': { - normal: '15777581a1ea81ad0baac8a97d954df4142f7260d9e8351aa7f6ef6de2d04632', - empty: 'ada4da4e28dc971633a8760b265b3019db57baf17e7bf7e13cf78b1a676f6d44', - }, - 'SHA3-512': { - normal: '621e4602b07fcba55ed6b976a8bef513b0f7c4ad0c546e0f852993051d887408', - empty: 'f1292af65b05c86cf7146b739bc65785c707450316f3207ee54a3f596a7d0f7b', - }, + ...(!process.features.openssl_is_boringssl ? { + 'SHA3-256': { + normal: '24f38fd1905554b7cbf8395cc3976292d11ce24a0b3131da0fd4b109832d27e3', + empty: '33d0a5151c0f52e4bb7fb67cf7a17063127624dc3e685903f49ebb07872084d1', + }, + 'SHA3-384': { + normal: '15777581a1ea81ad0baac8a97d954df4142f7260d9e8351aa7f6ef6de2d04632', + empty: 'ada4da4e28dc971633a8760b265b3019db57baf17e7bf7e13cf78b1a676f6d44', + }, + 'SHA3-512': { + normal: '621e4602b07fcba55ed6b976a8bef513b0f7c4ad0c546e0f852993051d887408', + empty: 'f1292af65b05c86cf7146b739bc65785c707450316f3207ee54a3f596a7d0f7b', + }, + } : {}), }, empty: { 'SHA-384': { @@ -207,18 +213,20 @@ const kDerivations = { empty: 'b4f7e7557674d501cbfbc0148ad800c0' + '750189fe295a2aca5e1bf4122c85edf9' }, - 'SHA3-256': { - normal: 'fe32459f7339dd2e8df6c6fc874ed9e81e3b7aad669edad9b71196f53ed95b12', - empty: '04519be1eb94079c91306cc5b21946b3de6a78ad35ec83d4f4a37bafbda678d7', - }, - 'SHA3-384': { - normal: 'a474e8289cb4a0511e90b87eaf9ec29cadd74d4c1f2ee1fb8cb5f7d08f91a379', - empty: '726c8c4b39083a7d5755604d3a67e9aa6139db00c08028ac9e69f7fb1525bf1d', - }, - 'SHA3-512': { - normal: 'c7a7f5004d1d595c6896498c169642ac24b946e13296ff53e12b534962a88675', - empty: '7b543480b5696932551abb3100d72e05c18f57fbb63aa44fe020bef1eec3555c', - }, + ...(!process.features.openssl_is_boringssl ? { + 'SHA3-256': { + normal: 'fe32459f7339dd2e8df6c6fc874ed9e81e3b7aad669edad9b71196f53ed95b12', + empty: '04519be1eb94079c91306cc5b21946b3de6a78ad35ec83d4f4a37bafbda678d7', + }, + 'SHA3-384': { + normal: 'a474e8289cb4a0511e90b87eaf9ec29cadd74d4c1f2ee1fb8cb5f7d08f91a379', + empty: '726c8c4b39083a7d5755604d3a67e9aa6139db00c08028ac9e69f7fb1525bf1d', + }, + 'SHA3-512': { + normal: 'c7a7f5004d1d595c6896498c169642ac24b946e13296ff53e12b534962a88675', + empty: '7b543480b5696932551abb3100d72e05c18f57fbb63aa44fe020bef1eec3555c', + }, + } : {}), } }, }; diff --git a/test/parallel/test-webcrypto-derivekey.js b/test/parallel/test-webcrypto-derivekey.js index 422384f4447bda..e04a7eab1bd8ef 100644 --- a/test/parallel/test-webcrypto-derivekey.js +++ b/test/parallel/test-webcrypto-derivekey.js @@ -135,14 +135,21 @@ const { KeyObject } = require('crypto'); '201509b012c9cd2fbe7ea938f0c509b36ecb140f38bf9130e96923f55f46756d'], ['hello', 'there', 5, 'SHA-512', '2e8d981741f98193e0af9c79870af0e985089341221edad9a130d297eae1984b'], - ['hello', 'there', 5, 'SHA3-256', - '0aed29b61b3ca3978aea34a9793276574ea997b69e8d03727438199f90571649'], - ['hello', 'there', 5, 'SHA3-384', - '7aa4a274aa19b4623c5d3091c4b06355de85ff6f25e53a83e3126cbb86ae68df'], - ['hello', 'there', 5, 'SHA3-512', - '4d909c47a81c625f866d1f9406248e6bc3c7ea89225fbccf1f08820254c9ef56'], ]; + if (!process.features.openssl_is_boringssl) { + kTests.push( + ['hello', 'there', 5, 'SHA3-256', + '0aed29b61b3ca3978aea34a9793276574ea997b69e8d03727438199f90571649'], + ['hello', 'there', 5, 'SHA3-384', + '7aa4a274aa19b4623c5d3091c4b06355de85ff6f25e53a83e3126cbb86ae68df'], + ['hello', 'there', 5, 'SHA3-512', + '4d909c47a81c625f866d1f9406248e6bc3c7ea89225fbccf1f08820254c9ef56'] + ); + } else { + common.printSkipMessage('Skipping unsupported SHA-3 test cases'); + } + const tests = Promise.all(kTests.map((args) => test(...args))); tests.then(common.mustCall()); @@ -158,16 +165,23 @@ const { KeyObject } = require('crypto'); // Not long enough secret generated by ECDH [{ name: 'HMAC', hash: 'SHA-384' }, 'sign', 1024], [{ name: 'HMAC', hash: 'SHA-512' }, 'sign', 1024], - [{ name: 'HMAC', hash: 'SHA3-256', length: 256 }, 'sign', 256], - [{ name: 'HMAC', hash: 'SHA3-384', length: 384 }, 'sign', 384], - [{ name: 'HMAC', hash: 'SHA3-512', length: 512 }, 'sign', 512], - // This interaction is not defined for now. - // https://github.com/WICG/webcrypto-modern-algos/issues/23 - // [{ name: 'HMAC', hash: 'SHA3-256' }, 'sign', 256], - // [{ name: 'HMAC', hash: 'SHA3-384' }, 'sign', 384], - // [{ name: 'HMAC', hash: 'SHA3-512' }, 'sign', 512], ]; + if (!process.features.openssl_is_boringssl) { + vectors.push( + [{ name: 'HMAC', hash: 'SHA3-256', length: 256 }, 'sign', 256], + [{ name: 'HMAC', hash: 'SHA3-384', length: 384 }, 'sign', 384], + [{ name: 'HMAC', hash: 'SHA3-512', length: 512 }, 'sign', 512] + // This interaction is not defined for now. + // https://github.com/WICG/webcrypto-modern-algos/issues/23 + // [{ name: 'HMAC', hash: 'SHA3-256' }, 'sign', 256], + // [{ name: 'HMAC', hash: 'SHA3-384' }, 'sign', 384], + // [{ name: 'HMAC', hash: 'SHA3-512' }, 'sign', 512], + ); + } else { + common.printSkipMessage('Skipping unsupported SHA-3 test cases'); + } + if (hasOpenSSL(3)) { vectors.push( ['KMAC128', 'sign', 128], @@ -211,16 +225,23 @@ const { KeyObject } = require('crypto'); [{ name: 'HMAC', hash: 'SHA-256' }, 'sign', 512], [{ name: 'HMAC', hash: 'SHA-384' }, 'sign', 1024], [{ name: 'HMAC', hash: 'SHA-512' }, 'sign', 1024], - [{ name: 'HMAC', hash: 'SHA3-256', length: 256 }, 'sign', 256], - [{ name: 'HMAC', hash: 'SHA3-384', length: 384 }, 'sign', 384], - [{ name: 'HMAC', hash: 'SHA3-512', length: 512 }, 'sign', 512], - // This interaction is not defined for now. - // https://github.com/WICG/webcrypto-modern-algos/issues/23 - // [{ name: 'HMAC', hash: 'SHA3-256' }, 'sign', 256], - // [{ name: 'HMAC', hash: 'SHA3-384' }, 'sign', 384], - // [{ name: 'HMAC', hash: 'SHA3-512' }, 'sign', 512], ]; + if (!process.features.openssl_is_boringssl) { + vectors.push( + [{ name: 'HMAC', hash: 'SHA3-256', length: 256 }, 'sign', 256], + [{ name: 'HMAC', hash: 'SHA3-384', length: 384 }, 'sign', 384], + [{ name: 'HMAC', hash: 'SHA3-512', length: 512 }, 'sign', 512], + // This interaction is not defined for now. + // https://github.com/WICG/webcrypto-modern-algos/issues/23 + // [{ name: 'HMAC', hash: 'SHA3-256' }, 'sign', 256], + // [{ name: 'HMAC', hash: 'SHA3-384' }, 'sign', 384], + // [{ name: 'HMAC', hash: 'SHA3-512' }, 'sign', 512], + ); + } else { + common.printSkipMessage('Skipping unsupported SHA-3 test cases'); + } + if (hasOpenSSL(3)) { vectors.push( ['KMAC128', 'sign', 128], diff --git a/test/parallel/test-webcrypto-digest.js b/test/parallel/test-webcrypto-digest.js index 04507d77b59142..e91214047dea43 100644 --- a/test/parallel/test-webcrypto-digest.js +++ b/test/parallel/test-webcrypto-digest.js @@ -148,65 +148,67 @@ const kDigestedData = { '60b22aab8d36a4c2a3affdb71234f49276737c575ddf7' + '4d14054cbd6fdb98fd0ddcbcb46f91ad76b6ee' }, - 'cshake128': { - empty: '7f9c2ba4e88f827d616045507605853ed73b8093f6e' + - 'fbc88eb1a6eacfa66ef26', - short: 'dea62d73e6b59cf725d0320d660089a4475cbbd3b85' + - '39e36691f150d47556794', - medium: 'b1acd53a03e76a221e52ea578e042f686a68c3d1c9' + - '832ab18285cf4f304ca32d', - long: '3a5bf5676955e5dec87d430e526925558971ca14c370' + - 'ee5d7cf572b94c7c63d7' - }, - 'cshake256': { - empty: '46b9dd2b0ba88d13233b3feb743eeb243fcd52ea62b' + - '81b82b50c27646ed5762fd75dc4ddd8c0f200cb0501' + - '9d67b592f6fc821c49479ab48640292eacb3b7c4be', - short: '1738113f5abb3ee5320ee18aa266c3617a7475dbd8e' + - 'd9a985994fddd6112ad999ec8e2ebdfeafb96e76f6b' + - 'b3a3adba43da60f00cd12496df5af3e28ae6d3de42', - medium: '4146c13d86d9bc186b0b309ab6a124ee0c74ba26b8' + - 'c60dcc7b3ed505969aa8d19028c6317999a085b1e6' + - 'b6a785ce4ff632aeb27493227e44232fb7b3952141' + - '7b', - long: '0c42bfd1e282622fd8144aa29b072fd09fc2bae70885' + - 'd5290933492f9d17411926a613dd0611668c2ac999e8' + - 'c011aabaa9004323425fbad75b0f58ee6e777a94' - }, - 'sha3-256': { - empty: 'a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a', - short: '3059af7aa33b517084e8ad7bbc4fb208a44c28ef32b4698d103dd540e4f91aa1', - medium: '1fa7cd1da74cd8046417508c8314e74a9a4a9d38f9f18e6cb215b8c891a0a80e', - long: 'b2cfc61e0386cdaef5e10a2be189891f5ef52a7624bfcd8edc893acc64fec600' - }, - 'sha3-384': { - empty: '0c63a75b845e4f7d01107d852e4c2485c51a50aaaa9' + - '4fc61995e71bbee983a2ac3713831264adb47fb6bd1' + - 'e058d5f004', - short: '54b8f0e4cf4974de740098f66b3024479b01631315a' + - '6773606c33eadc32556a6e778e08f0225ae79265aec' + - '666cb2390b', - medium: '437b7d8b68b250b5c1739ea4cc86db2033879dfb18' + - 'de292c9c50d9c193a4c79a08a6cae3f4e483c2795e' + - 'a5d1ef7e69d2', - long: '3b39c4c97ad87613305d0ccc987181713e2d5e84b1f9' + - '760011bcce0c297499005bdce8a3d2409b5ad0164f32' + - 'bb8778d0' - }, - 'sha3-512': { - empty: 'a69f73cca23a9ac5c8b567dc185a756e97c982164fe' + - '25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9' + - '402c3ac558f500199d95b6d3e301758586281dcd26', - short: '2dd2e07a62e6ad0498ba84f313c4d4024cb46001f78' + - 'f75db336b0d4d8bd2a9ec152c4ad20878735d82ba08' + - '72ecf59608ef3ced2b2a8669427e7da31e362333d8', - medium: 'e640a21909536640369e9b0a48931c5cb2efcbc91f' + - 'ecf247306bc96a0e4ca33307cb8e1b9af367946dd01' + - 'c243f3907508d04f1692a3161df1f898de8ee25febe', - long: 'bd262cecf565c338032de5ba0138f0aacfe7dde83d27' + - '2d0d37d952829ed25de1a1342d98659ef7d2fa4aca7c' + - 'e2b1aa0784d8fc1dcbf81bcec7a7431a3da36bf7' - } + ...(!process.features.openssl_is_boringssl ? { + 'cshake128': { + empty: '7f9c2ba4e88f827d616045507605853ed73b8093f6e' + + 'fbc88eb1a6eacfa66ef26', + short: 'dea62d73e6b59cf725d0320d660089a4475cbbd3b85' + + '39e36691f150d47556794', + medium: 'b1acd53a03e76a221e52ea578e042f686a68c3d1c9' + + '832ab18285cf4f304ca32d', + long: '3a5bf5676955e5dec87d430e526925558971ca14c370' + + 'ee5d7cf572b94c7c63d7' + }, + 'cshake256': { + empty: '46b9dd2b0ba88d13233b3feb743eeb243fcd52ea62b' + + '81b82b50c27646ed5762fd75dc4ddd8c0f200cb0501' + + '9d67b592f6fc821c49479ab48640292eacb3b7c4be', + short: '1738113f5abb3ee5320ee18aa266c3617a7475dbd8e' + + 'd9a985994fddd6112ad999ec8e2ebdfeafb96e76f6b' + + 'b3a3adba43da60f00cd12496df5af3e28ae6d3de42', + medium: '4146c13d86d9bc186b0b309ab6a124ee0c74ba26b8' + + 'c60dcc7b3ed505969aa8d19028c6317999a085b1e6' + + 'b6a785ce4ff632aeb27493227e44232fb7b3952141' + + '7b', + long: '0c42bfd1e282622fd8144aa29b072fd09fc2bae70885' + + 'd5290933492f9d17411926a613dd0611668c2ac999e8' + + 'c011aabaa9004323425fbad75b0f58ee6e777a94' + }, + 'sha3-256': { + empty: 'a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a', + short: '3059af7aa33b517084e8ad7bbc4fb208a44c28ef32b4698d103dd540e4f91aa1', + medium: '1fa7cd1da74cd8046417508c8314e74a9a4a9d38f9f18e6cb215b8c891a0a80e', + long: 'b2cfc61e0386cdaef5e10a2be189891f5ef52a7624bfcd8edc893acc64fec600' + }, + 'sha3-384': { + empty: '0c63a75b845e4f7d01107d852e4c2485c51a50aaaa9' + + '4fc61995e71bbee983a2ac3713831264adb47fb6bd1' + + 'e058d5f004', + short: '54b8f0e4cf4974de740098f66b3024479b01631315a' + + '6773606c33eadc32556a6e778e08f0225ae79265aec' + + '666cb2390b', + medium: '437b7d8b68b250b5c1739ea4cc86db2033879dfb18' + + 'de292c9c50d9c193a4c79a08a6cae3f4e483c2795e' + + 'a5d1ef7e69d2', + long: '3b39c4c97ad87613305d0ccc987181713e2d5e84b1f9' + + '760011bcce0c297499005bdce8a3d2409b5ad0164f32' + + 'bb8778d0' + }, + 'sha3-512': { + empty: 'a69f73cca23a9ac5c8b567dc185a756e97c982164fe' + + '25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9' + + '402c3ac558f500199d95b6d3e301758586281dcd26', + short: '2dd2e07a62e6ad0498ba84f313c4d4024cb46001f78' + + 'f75db336b0d4d8bd2a9ec152c4ad20878735d82ba08' + + '72ecf59608ef3ced2b2a8669427e7da31e362333d8', + medium: 'e640a21909536640369e9b0a48931c5cb2efcbc91f' + + 'ecf247306bc96a0e4ca33307cb8e1b9af367946dd01' + + 'c243f3907508d04f1692a3161df1f898de8ee25febe', + long: 'bd262cecf565c338032de5ba0138f0aacfe7dde83d27' + + '2d0d37d952829ed25de1a1342d98659ef7d2fa4aca7c' + + 'e2b1aa0784d8fc1dcbf81bcec7a7431a3da36bf7' + } + } : {}), }; async function testDigest(size, alg) { From 8a2053060dfc52ddb3c3206573b5333f6d981d79 Mon Sep 17 00:00:00 2001 From: "Node.js GitHub Bot" Date: Sat, 25 Oct 2025 13:40:15 +0100 Subject: [PATCH 62/83] crypto: update root certificates to NSS 3.116 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is the certdata.txt[0] from NSS 3.116. This is the version of NSS that shipped in Firefox 144.0 on 2025-10-14. [0] https://raw.githubusercontent.com/nss-dev/nss/refs/tags/NSS_3_116_RTM/lib/ckfw/builtins/certdata.txt PR-URL: https://github.com/nodejs/node/pull/59956 Reviewed-By: Luigi Pinca Reviewed-By: Richard Lau Reviewed-By: Yagiz Nizipli Reviewed-By: Michaël Zasso --- tools/certdata.txt | 170 --------------------------------------------- 1 file changed, 170 deletions(-) diff --git a/tools/certdata.txt b/tools/certdata.txt index aeedd56c53b172..1b9af7cd9adc2e 100644 --- a/tools/certdata.txt +++ b/tools/certdata.txt @@ -3195,7 +3195,6 @@ CKA_NSS_SERVER_DISTRUST_AFTER MULTILINE_OCTAL END CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - # Trust for "ePKI Root Certification Authority" # Issuer: OU=ePKI Root Certification Authority,O="Chunghwa Telecom Co., Ltd.",C=TW # Serial Number:15:c8:bd:65:47:5c:af:b8:97:00:5e:e4:06:d2:bc:9d @@ -5240,175 +5239,6 @@ CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "Explicitly Distrust DigiNotar Root CA" -# -# Issuer: E=info@diginotar.nl,CN=DigiNotar Root CA,O=DigiNotar,C=NL -# Serial Number:0f:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff -# Subject: E=info@diginotar.nl,CN=DigiNotar Root CA,O=DigiNotar,C=NL -# Not Valid Before: Fri Jul 27 17:19:37 2007 -# Not Valid After : Mon Mar 31 18:19:22 2025 -# Fingerprint (MD5): 0A:A4:D5:CC:BA:B4:FB:A3:59:E3:E6:01:DD:53:D9:4E -# Fingerprint (SHA1): C1:77:CB:4B:E0:B4:26:8E:F5:C7:CF:45:99:22:B9:B0:CE:BA:21:2F -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Explicitly Distrust DigiNotar Root CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\137\061\013\060\011\006\003\125\004\006\023\002\116\114\061 -\022\060\020\006\003\125\004\012\023\011\104\151\147\151\116\157 -\164\141\162\061\032\060\030\006\003\125\004\003\023\021\104\151 -\147\151\116\157\164\141\162\040\122\157\157\164\040\103\101\061 -\040\060\036\006\011\052\206\110\206\367\015\001\011\001\026\021 -\151\156\146\157\100\144\151\147\151\156\157\164\141\162\056\156 -\154 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\137\061\013\060\011\006\003\125\004\006\023\002\116\114\061 -\022\060\020\006\003\125\004\012\023\011\104\151\147\151\116\157 -\164\141\162\061\032\060\030\006\003\125\004\003\023\021\104\151 -\147\151\116\157\164\141\162\040\122\157\157\164\040\103\101\061 -\040\060\036\006\011\052\206\110\206\367\015\001\011\001\026\021 -\151\156\146\157\100\144\151\147\151\156\157\164\141\162\056\156 -\154 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\017\377\377\377\377\377\377\377\377\377\377\377\377\377 -\377\377 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\212\060\202\003\162\240\003\002\001\002\002\020\017 -\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\060 -\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060\137 -\061\013\060\011\006\003\125\004\006\023\002\116\114\061\022\060 -\020\006\003\125\004\012\023\011\104\151\147\151\116\157\164\141 -\162\061\032\060\030\006\003\125\004\003\023\021\104\151\147\151 -\116\157\164\141\162\040\122\157\157\164\040\103\101\061\040\060 -\036\006\011\052\206\110\206\367\015\001\011\001\026\021\151\156 -\146\157\100\144\151\147\151\156\157\164\141\162\056\156\154\060 -\036\027\015\060\067\060\067\062\067\061\067\061\071\063\067\132 -\027\015\062\065\060\063\063\061\061\070\061\071\062\062\132\060 -\137\061\013\060\011\006\003\125\004\006\023\002\116\114\061\022 -\060\020\006\003\125\004\012\023\011\104\151\147\151\116\157\164 -\141\162\061\032\060\030\006\003\125\004\003\023\021\104\151\147 -\151\116\157\164\141\162\040\122\157\157\164\040\103\101\061\040 -\060\036\006\011\052\206\110\206\367\015\001\011\001\026\021\151 -\156\146\157\100\144\151\147\151\156\157\164\141\162\056\156\154 -\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001\001 -\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002\001 -\000\254\260\130\301\000\275\330\041\010\013\053\232\376\156\126 -\060\005\237\033\167\220\020\101\134\303\015\207\021\167\216\201 -\361\312\174\351\214\152\355\070\164\065\273\332\337\371\273\300 -\011\067\264\226\163\201\175\063\032\230\071\367\223\157\225\177 -\075\271\261\165\207\272\121\110\350\213\160\076\225\004\305\330 -\266\303\026\331\210\260\261\207\035\160\332\206\264\017\024\213 -\172\317\020\321\164\066\242\022\173\167\206\112\171\346\173\337 -\002\021\150\245\116\206\256\064\130\233\044\023\170\126\042\045 -\036\001\213\113\121\161\373\202\314\131\226\151\210\132\150\123 -\305\271\015\002\067\313\113\274\146\112\220\176\052\013\005\007 -\355\026\137\125\220\165\330\106\311\033\203\342\010\276\361\043 -\314\231\035\326\052\017\203\040\025\130\047\202\056\372\342\042 -\302\111\261\271\001\201\152\235\155\235\100\167\150\166\116\041 -\052\155\204\100\205\116\166\231\174\202\363\363\267\002\131\324 -\046\001\033\216\337\255\123\006\321\256\030\335\342\262\072\313 -\327\210\070\216\254\133\051\271\031\323\230\371\030\003\317\110 -\202\206\146\013\033\151\017\311\353\070\210\172\046\032\005\114 -\222\327\044\324\226\362\254\122\055\243\107\325\122\366\077\376 -\316\204\006\160\246\252\076\242\362\266\126\064\030\127\242\344 -\201\155\347\312\360\152\323\307\221\153\002\203\101\174\025\357 -\153\232\144\136\343\320\074\345\261\353\173\135\206\373\313\346 -\167\111\315\243\145\334\367\271\234\270\344\013\137\223\317\314 -\060\032\062\034\316\034\143\225\245\371\352\341\164\213\236\351 -\053\251\060\173\240\030\037\016\030\013\345\133\251\323\321\154 -\036\007\147\217\221\113\251\212\274\322\146\252\223\001\210\262 -\221\372\061\134\325\246\301\122\010\011\315\012\143\242\323\042 -\246\350\241\331\071\006\227\365\156\215\002\220\214\024\173\077 -\200\315\033\234\272\304\130\162\043\257\266\126\237\306\172\102 -\063\051\007\077\202\311\346\037\005\015\315\114\050\066\213\323 -\310\076\034\306\210\357\136\356\211\144\351\035\353\332\211\176 -\062\246\151\321\335\314\210\237\321\320\311\146\041\334\006\147 -\305\224\172\232\155\142\114\175\314\340\144\200\262\236\107\216 -\243\002\003\001\000\001\243\102\060\100\060\017\006\003\125\035 -\023\001\001\377\004\005\060\003\001\001\377\060\016\006\003\125 -\035\017\001\001\377\004\004\003\002\001\006\060\035\006\003\125 -\035\016\004\026\004\024\210\150\277\340\216\065\304\073\070\153 -\142\367\050\073\204\201\310\014\327\115\060\015\006\011\052\206 -\110\206\367\015\001\001\005\005\000\003\202\002\001\000\073\002 -\215\313\074\060\350\156\240\255\362\163\263\137\236\045\023\004 -\005\323\366\343\213\273\013\171\316\123\336\344\226\305\321\257 -\163\274\325\303\320\100\125\174\100\177\315\033\137\011\325\362 -\174\237\150\035\273\135\316\172\071\302\214\326\230\173\305\203 -\125\250\325\175\100\312\340\036\367\211\136\143\135\241\023\302 -\135\212\266\212\174\000\363\043\303\355\205\137\161\166\360\150 -\143\252\105\041\071\110\141\170\066\334\361\103\223\324\045\307 -\362\200\145\341\123\002\165\121\374\172\072\357\067\253\204\050 -\127\014\330\324\324\231\126\154\343\242\376\131\204\264\061\350 -\063\370\144\224\224\121\227\253\071\305\113\355\332\335\200\013 -\157\174\051\015\304\216\212\162\015\347\123\024\262\140\101\075 -\204\221\061\150\075\047\104\333\345\336\364\372\143\105\310\114 -\076\230\365\077\101\272\116\313\067\015\272\146\230\361\335\313 -\237\134\367\124\066\202\153\054\274\023\141\227\102\370\170\273 -\314\310\242\237\312\360\150\275\153\035\262\337\215\157\007\235 -\332\216\147\307\107\036\312\271\277\052\102\221\267\143\123\146 -\361\102\243\341\364\132\115\130\153\265\344\244\063\255\134\160 -\035\334\340\362\353\163\024\221\232\003\301\352\000\145\274\007 -\374\317\022\021\042\054\256\240\275\072\340\242\052\330\131\351 -\051\323\030\065\244\254\021\137\031\265\265\033\377\042\112\134 -\306\172\344\027\357\040\251\247\364\077\255\212\247\232\004\045 -\235\016\312\067\346\120\375\214\102\051\004\232\354\271\317\113 -\162\275\342\010\066\257\043\057\142\345\312\001\323\160\333\174 -\202\043\054\026\061\014\306\066\007\220\172\261\037\147\130\304 -\073\130\131\211\260\214\214\120\263\330\206\313\150\243\304\012 -\347\151\113\040\316\301\036\126\113\225\251\043\150\330\060\330 -\303\353\260\125\121\315\345\375\053\270\365\273\021\237\123\124 -\366\064\031\214\171\011\066\312\141\027\045\027\013\202\230\163 -\014\167\164\303\325\015\307\250\022\114\307\247\124\161\107\056 -\054\032\175\311\343\053\073\110\336\047\204\247\143\066\263\175 -\217\240\144\071\044\015\075\173\207\257\146\134\164\033\113\163 -\262\345\214\360\206\231\270\345\305\337\204\301\267\353 -END - -# Trust for Certificate "Explicitly Distrust DigiNotar Root CA" -# Issuer: E=info@diginotar.nl,CN=DigiNotar Root CA,O=DigiNotar,C=NL -# Serial Number:0f:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff -# Subject: E=info@diginotar.nl,CN=DigiNotar Root CA,O=DigiNotar,C=NL -# Not Valid Before: Fri Jul 27 17:19:37 2007 -# Not Valid After : Mon Mar 31 18:19:22 2025 -# Fingerprint (MD5): 0A:A4:D5:CC:BA:B4:FB:A3:59:E3:E6:01:DD:53:D9:4E -# Fingerprint (SHA1): C1:77:CB:4B:E0:B4:26:8E:F5:C7:CF:45:99:22:B9:B0:CE:BA:21:2F -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Explicitly Distrust DigiNotar Root CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\301\167\313\113\340\264\046\216\365\307\317\105\231\042\271\260 -\316\272\041\057 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\012\244\325\314\272\264\373\243\131\343\346\001\335\123\331\116 -END -CKA_ISSUER MULTILINE_OCTAL -\060\137\061\013\060\011\006\003\125\004\006\023\002\116\114\061 -\022\060\020\006\003\125\004\012\023\011\104\151\147\151\116\157 -\164\141\162\061\032\060\030\006\003\125\004\003\023\021\104\151 -\147\151\116\157\164\141\162\040\122\157\157\164\040\103\101\061 -\040\060\036\006\011\052\206\110\206\367\015\001\011\001\026\021 -\151\156\146\157\100\144\151\147\151\156\157\164\141\162\056\156 -\154 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\017\377\377\377\377\377\377\377\377\377\377\377\377\377 -\377\377 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_NOT_TRUSTED -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_NOT_TRUSTED -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_NOT_TRUSTED -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - # # Certificate "Security Communication RootCA2" # From e5559f3be35bc2b748f746c67c9c834a36a7c76a Mon Sep 17 00:00:00 2001 From: Jiawen Geng Date: Sat, 25 Oct 2025 07:15:57 -0700 Subject: [PATCH 63/83] win: upgrade Visual Studio workload from 2019 to 2022 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/60318 Fixes: https://github.com/nodejs/node/issues/59031 Reviewed-By: Colin Ihrig Reviewed-By: Luigi Pinca Reviewed-By: Michaël Zasso Reviewed-By: Ulises Gascón Reviewed-By: Stefan Stojanovic Reviewed-By: Marco Ippolito Reviewed-By: Yagiz Nizipli --- tools/msvs/install_tools/install_tools.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/msvs/install_tools/install_tools.bat b/tools/msvs/install_tools/install_tools.bat index c3f7a287bfd071..9d759f6398118f 100644 --- a/tools/msvs/install_tools/install_tools.bat +++ b/tools/msvs/install_tools/install_tools.bat @@ -61,6 +61,6 @@ cls -ArgumentList '-NoProfile -InputFormat None -ExecutionPolicy Bypass -Command ^ [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; ^ iex ((New-Object System.Net.WebClient).DownloadString(''https://chocolatey.org/install.ps1'')); ^ - choco upgrade -y python visualstudio2019-workload-vctools; ^ + choco upgrade -y python visualstudio2022-workload-vctools; ^ Read-Host ''Type ENTER to exit'' ' ^ -Verb RunAs From 3d183e3e9f0727337c9ab67e76015729ebadbbc9 Mon Sep 17 00:00:00 2001 From: Filip Skokan Date: Sat, 25 Oct 2025 17:13:30 +0200 Subject: [PATCH 64/83] test,crypto: fix conditional SHA3-* skip on BoringSSL PR-URL: https://github.com/nodejs/node/pull/60379 Reviewed-By: Shelley Vohr Reviewed-By: Luigi Pinca Reviewed-By: Colin Ihrig --- test/parallel/test-webcrypto-sign-verify-rsa.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/parallel/test-webcrypto-sign-verify-rsa.js b/test/parallel/test-webcrypto-sign-verify-rsa.js index 7e90388cc4c270..7dd5637b12f702 100644 --- a/test/parallel/test-webcrypto-sign-verify-rsa.js +++ b/test/parallel/test-webcrypto-sign-verify-rsa.js @@ -241,13 +241,13 @@ async function testSaltLength(keyLength, hash, hLen) { ['SHA-256', 32], ['SHA-384', 48], ['SHA-512', 64], - ['SHA3-256', 32], - ['SHA3-384', 48], - ['SHA3-512', 64], + ...(!process.features.openssl_is_boringssl ? [ + ['SHA3-256', 32], + ['SHA3-384', 48], + ['SHA3-512', 64], + ] : []), ]) { - if (hash.startsWith('SHA-3') && !process.features.openssl_is_boringssl) { - variations.push(testSaltLength(keyLength, hash, hLen)); - } + variations.push(testSaltLength(keyLength, hash, hLen)); } } From 29a5855a4ff59c991152860fdd40d6f9dfb6ae0e Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Sat, 25 Oct 2025 20:44:28 +0200 Subject: [PATCH 65/83] test: ensure assertions are reachable in `test/addons` PR-URL: https://github.com/nodejs/node/pull/60142 Reviewed-By: Colin Ihrig --- test/addons/async-resource/test.js | 7 ++-- test/addons/cppgc-object/test.js | 4 +-- test/addons/make-callback-recurse/test.js | 4 +-- test/addons/no-addons/permission.js | 42 +++++------------------ test/addons/no-addons/test-worker.js | 12 +++---- test/addons/no-addons/test.js | 42 +++++------------------ test/addons/null-buffer-neuter/test.js | 4 +-- test/addons/symlinked-module/submodule.js | 6 ++-- test/eslint.config_partial.mjs | 16 ++++++++- 9 files changed, 51 insertions(+), 86 deletions(-) diff --git a/test/addons/async-resource/test.js b/test/addons/async-resource/test.js index 86cbb38e1cf2df..d7bc44a92be827 100644 --- a/test/addons/async-resource/test.js +++ b/test/addons/async-resource/test.js @@ -17,7 +17,7 @@ let after = 0; let destroy = 0; async_hooks.createHook({ - init(id, type, triggerAsyncId, resource) { + init: common.mustCall((id, type, triggerAsyncId, resource) => { assert.strictEqual(typeof id, 'number'); assert.strictEqual(typeof resource, 'object'); assert(id > 1); @@ -26,7 +26,7 @@ async_hooks.createHook({ assert.strictEqual(triggerAsyncId, expectedTriggerId); bindingUids.push(id); } - }, + }, 7), before(id) { if (bindingUids.includes(id)) before++; @@ -48,8 +48,11 @@ for (const call of [binding.callViaFunction, let uid; const object = { methöd(arg) { + // eslint-disable-next-line node-core/must-call-assert assert.strictEqual(this, object); + // eslint-disable-next-line node-core/must-call-assert assert.strictEqual(arg, 42); + // eslint-disable-next-line node-core/must-call-assert assert.strictEqual(async_hooks.executionAsyncId(), uid); return 'baz'; }, diff --git a/test/addons/cppgc-object/test.js b/test/addons/cppgc-object/test.js index e18b6e17b88df9..acdb145ae721c4 100644 --- a/test/addons/cppgc-object/test.js +++ b/test/addons/cppgc-object/test.js @@ -23,7 +23,7 @@ for (let i = 0; i < count; ++i) { globalThis.gc(); -setTimeout(async function() { +setTimeout(common.mustCall(() => (async function() { // GC should have invoked Trace() on at least some of the CppGCed objects, // but they should all be alive at this point. assert.strictEqual(states[kDestructCount], 0); @@ -48,4 +48,4 @@ setTimeout(async function() { 'All old CppGCed are destroyed', () => states[kDestructCount] === count * 2, ); -}, 1); +})().then(common.mustCall())), 1); diff --git a/test/addons/make-callback-recurse/test.js b/test/addons/make-callback-recurse/test.js index 4a540003acd8d1..6b927ffbfdba48 100644 --- a/test/addons/make-callback-recurse/test.js +++ b/test/addons/make-callback-recurse/test.js @@ -71,11 +71,11 @@ assert.throws(() => { if (arg === 1) { // The tests are first run on bootstrap during LoadEnvironment() in // src/node.cc. Now run the tests through node::MakeCallback(). - setImmediate(() => { + setImmediate(common.mustCall(() => { makeCallback({}, common.mustCall(() => { verifyExecutionOrder(2); })); - }); + })); } else if (arg === 2) { // Make sure there are no conflicts using node::MakeCallback() // within timers. diff --git a/test/addons/no-addons/permission.js b/test/addons/no-addons/permission.js index 1d1bbf6e95468e..a487c8a6c9b2af 100644 --- a/test/addons/no-addons/permission.js +++ b/test/addons/no-addons/permission.js @@ -7,37 +7,11 @@ const assert = require('assert'); const bindingPath = require.resolve(`./build/${common.buildType}/binding`); -const assertError = (error) => { - assert(error instanceof Error); - assert.strictEqual(error.code, 'ERR_DLOPEN_DISABLED'); - assert.strictEqual( - error.message, - 'Cannot load native addon because loading addons is disabled.', - ); -}; - -{ - let threw = false; - - try { - require(bindingPath); - } catch (error) { - assertError(error); - threw = true; - } - - assert(threw); -} - -{ - let threw = false; - - try { - process.dlopen({ exports: {} }, bindingPath); - } catch (error) { - assertError(error); - threw = true; - } - - assert(threw); -} +assert.throws(() => require(bindingPath), { + code: 'ERR_DLOPEN_DISABLED', + message: 'Cannot load native addon because loading addons is disabled.', +}); +assert.throws(() => process.dlopen({ exports: {} }, bindingPath), { + code: 'ERR_DLOPEN_DISABLED', + message: 'Cannot load native addon because loading addons is disabled.', +}); diff --git a/test/addons/no-addons/test-worker.js b/test/addons/no-addons/test-worker.js index 25e893ca33aea7..fd932d64f440aa 100644 --- a/test/addons/no-addons/test-worker.js +++ b/test/addons/no-addons/test-worker.js @@ -9,13 +9,13 @@ const { Worker } = require('worker_threads'); const binding = path.resolve(__dirname, `./build/${common.buildType}/binding`); -const assertError = (error) => { +const assertError = common.mustCall((error) => { assert.strictEqual(error.code, 'ERR_DLOPEN_DISABLED'); assert.strictEqual( error.message, 'Cannot load native addon because loading addons is disabled.', ); -}; +}, 4); { // Flags should be inherited @@ -23,7 +23,7 @@ const assertError = (error) => { eval: true, }); - worker.on('error', common.mustCall(assertError)); + worker.on('error', assertError); } { @@ -35,7 +35,7 @@ const assertError = (error) => { }, ); - worker.on('error', common.mustCall(assertError)); + worker.on('error', assertError); } { @@ -45,7 +45,7 @@ const assertError = (error) => { execArgv: ['--no-addons'], }); - worker.on('error', common.mustCall(assertError)); + worker.on('error', assertError); } { @@ -55,5 +55,5 @@ const assertError = (error) => { execArgv: [], }); - worker.on('error', common.mustCall(assertError)); + worker.on('error', assertError); } diff --git a/test/addons/no-addons/test.js b/test/addons/no-addons/test.js index 485fad4a8bc643..7b93806d6db046 100644 --- a/test/addons/no-addons/test.js +++ b/test/addons/no-addons/test.js @@ -7,37 +7,11 @@ const assert = require('assert'); const bindingPath = require.resolve(`./build/${common.buildType}/binding`); -const assertError = (error) => { - assert(error instanceof Error); - assert.strictEqual(error.code, 'ERR_DLOPEN_DISABLED'); - assert.strictEqual( - error.message, - 'Cannot load native addon because loading addons is disabled.', - ); -}; - -{ - let threw = false; - - try { - require(bindingPath); - } catch (error) { - assertError(error); - threw = true; - } - - assert(threw); -} - -{ - let threw = false; - - try { - process.dlopen({ exports: {} }, bindingPath); - } catch (error) { - assertError(error); - threw = true; - } - - assert(threw); -} +assert.throws(() => require(bindingPath), { + code: 'ERR_DLOPEN_DISABLED', + message: 'Cannot load native addon because loading addons is disabled.', +}); +assert.throws(() => process.dlopen({ exports: {} }, bindingPath), { + code: 'ERR_DLOPEN_DISABLED', + message: 'Cannot load native addon because loading addons is disabled.', +}); diff --git a/test/addons/null-buffer-neuter/test.js b/test/addons/null-buffer-neuter/test.js index d99690542a4d84..7a3ba1535ec9da 100644 --- a/test/addons/null-buffer-neuter/test.js +++ b/test/addons/null-buffer-neuter/test.js @@ -6,6 +6,6 @@ const binding = require(`./build/${common.buildType}/binding`); binding.run(); global.gc(); -setImmediate(() => { +setImmediate(common.mustCall(() => { assert.strictEqual(binding.isAlive(), 0); -}); +})); diff --git a/test/addons/symlinked-module/submodule.js b/test/addons/symlinked-module/submodule.js index d4b59e9efa4f5e..79400ecf4c10c8 100644 --- a/test/addons/symlinked-module/submodule.js +++ b/test/addons/symlinked-module/submodule.js @@ -1,13 +1,13 @@ 'use strict'; -require('../../common'); +const common = require('../../common'); const path = require('path'); const assert = require('assert'); // This is a subtest of symlinked-module/test.js. This is not // intended to be run directly. -module.exports.test = function test(bindingDir) { +module.exports.test = common.mustCall(function test(bindingDir) { const mod = require(path.join(bindingDir, 'binding.node')); assert.notStrictEqual(mod, null); assert.strictEqual(mod.hello(), 'world'); -}; +}, require.main === module ? 0 : 2); diff --git a/test/eslint.config_partial.mjs b/test/eslint.config_partial.mjs index 915a8b97b347ef..0980ffac7a28a1 100644 --- a/test/eslint.config_partial.mjs +++ b/test/eslint.config_partial.mjs @@ -156,7 +156,21 @@ export default [ }, { files: [ - 'test/{async-hooks,benchmark,cctest,client-proxy,message,module-hooks,node-api,pummel,pseudo-tty,v8-updates,wasi}/**/*.{js,mjs,cjs}', + `test/{${[ + 'abort', + 'addons', + 'async-hooks', + 'benchmark', + 'cctest', + 'client-proxy', + 'message', + 'module-hooks', + 'node-api', + 'pummel', + 'pseudo-tty', + 'v8-updates', + 'wasi', + ].join(',')}}/**/*.{js,mjs,cjs}`, ], rules: { 'node-core/must-call-assert': 'error', From 4a5d7a4c2adf92409b54c23859985fb338355fae Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Sun, 26 Oct 2025 08:27:57 +0100 Subject: [PATCH 66/83] src: conditionally disable source phase imports by default MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/60364 Refs: https://chromium-review.googlesource.com/c/v8/v8/+/7003082 Reviewed-By: Guy Bedford Reviewed-By: Michaël Zasso Reviewed-By: Chengzhong Wu --- src/node.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/node.cc b/src/node.cc index 72d6973723a637..a18660d388be9d 100644 --- a/src/node.cc +++ b/src/node.cc @@ -780,7 +780,10 @@ static ExitCode ProcessGlobalArgsInternal(std::vector* args, env_opts->abort_on_uncaught_exception = true; } - v8_args.emplace_back("--js-source-phase-imports"); + if (std::ranges::find(v8_args, "--no-js-source-phase-imports") == + v8_args.end()) { + v8_args.emplace_back("--js-source-phase-imports"); + } #ifdef __POSIX__ // Block SIGPROF signals when sleeping in epoll_wait/kevent/etc. Avoids the From 377e8ce85ac26a3008275928552143151fd885cf Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Sun, 26 Oct 2025 17:29:49 +0100 Subject: [PATCH 67/83] tls: avoid external memory leak on invalid protocol versions PR-URL: https://github.com/nodejs/node/pull/60390 Reviewed-By: Luigi Pinca Reviewed-By: Ethan Arrowood Reviewed-By: Colin Ihrig Reviewed-By: Matteo Collina --- lib/internal/tls/common.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/internal/tls/common.js b/lib/internal/tls/common.js index 66331d2d9999e9..0f7fd0747ea779 100644 --- a/lib/internal/tls/common.js +++ b/lib/internal/tls/common.js @@ -82,10 +82,11 @@ function SecureContext(secureProtocol, secureOptions, minVersion, maxVersion) { throw new ERR_TLS_PROTOCOL_VERSION_CONFLICT(maxVersion, secureProtocol); } + const minV = toV('minimum', minVersion, tls.DEFAULT_MIN_VERSION); + const maxV = toV('maximum', maxVersion, tls.DEFAULT_MAX_VERSION); + this.context = new NativeSecureContext(); - this.context.init(secureProtocol, - toV('minimum', minVersion, tls.DEFAULT_MIN_VERSION), - toV('maximum', maxVersion, tls.DEFAULT_MAX_VERSION)); + this.context.init(secureProtocol, minV, maxV); if (secureOptions) { validateInteger(secureOptions, 'secureOptions'); From 7a6542c20550842580852faedbda9ad1effb3621 Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Sun, 26 Oct 2025 19:24:02 +0100 Subject: [PATCH 68/83] test: skip failing test on macOS 15.7+ PR-URL: https://github.com/nodejs/node/pull/60419 Refs: https://github.com/nodejs/node/issues/60050 Reviewed-By: Moshe Atlow Reviewed-By: Richard Lau Reviewed-By: Jake Yuesong Li Reviewed-By: Colin Ihrig --- test/parallel/parallel.status | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/parallel/parallel.status b/test/parallel/parallel.status index 5cb15393e42d4f..bf040bf2ee9c72 100644 --- a/test/parallel/parallel.status +++ b/test/parallel/parallel.status @@ -60,6 +60,8 @@ test-http-server-headers-timeout-keepalive: PASS,FLAKY test-http-server-request-timeout-keepalive: PASS,FLAKY # https://github.com/nodejs/node/issues/54534 test-runner-run-watch: PASS, FLAKY +# https://github.com/nodejs/node/issues/60050 +test-cluster-dgram-1: SKIP [$arch==arm || $arch==arm64] # https://github.com/nodejs/node/pull/31178 From 5d5c8483fba4e3bc44a27487359a8c07470c9f3d Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Fri, 17 Oct 2025 14:33:45 +0200 Subject: [PATCH 69/83] tools: run CI with shared libs on GHA PR-URL: https://github.com/nodejs/node/pull/60121 Reviewed-By: Yagiz Nizipli Reviewed-By: Chengzhong Wu --- .github/workflows/linters.yml | 16 +++ .github/workflows/test-linux.yml | 2 + .github/workflows/test-macos.yml | 2 + .github/workflows/test-shared.yml | 83 ++++++++++++ .github/workflows/tools.yml | 12 ++ BUILDING.md | 71 ++++++++++- .../writing-and-running-benchmarks.md | 4 + shell.nix | 120 ++++++++++++++++++ tools/dep_updaters/update-nixpkgs-pin.sh | 40 ++++++ tools/nix/pkgs.nix | 10 ++ 10 files changed, 359 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/test-shared.yml create mode 100644 shell.nix create mode 100755 tools/dep_updaters/update-nixpkgs-pin.sh create mode 100644 tools/nix/pkgs.nix diff --git a/.github/workflows/linters.yml b/.github/workflows/linters.yml index 4f987182cd8dcf..8add850f9128ce 100644 --- a/.github/workflows/linters.yml +++ b/.github/workflows/linters.yml @@ -140,6 +140,22 @@ jobs: NODE=$(command -v node) make lint-md env: NODE_RELEASED_VERSIONS: ${{ steps.get-released-versions.outputs.NODE_RELEASED_VERSIONS }} + lint-nix: + if: github.event.pull_request.draft == false + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + persist-credentials: false + sparse-checkout: '*.nix' + sparse-checkout-cone-mode: false + - uses: cachix/install-nix-action@7be5dee1421f63d07e71ce6e0a9f8a4b07c2a487 # v31.6.1 + - name: Lint Nix files + run: nix-shell -I nixpkgs=./tools/nix/pkgs.nix -p 'nixfmt-tree' --run 'treefmt --quiet --fail-on-change' + - if: ${{ failure() }} + name: Show diff + run: git --no-pager diff + lint-py: if: github.event.pull_request.draft == false runs-on: ubuntu-latest diff --git a/.github/workflows/test-linux.yml b/.github/workflows/test-linux.yml index cf2b0e1a0833b2..53329ca37c126d 100644 --- a/.github/workflows/test-linux.yml +++ b/.github/workflows/test-linux.yml @@ -5,6 +5,7 @@ on: paths-ignore: - .mailmap - README.md + - '*.nix' - .github/** - '!.github/workflows/test-linux.yml' types: [opened, synchronize, reopened, ready_for_review] @@ -17,6 +18,7 @@ on: paths-ignore: - .mailmap - README.md + - '*.nix' - .github/** - '!.github/workflows/test-linux.yml' diff --git a/.github/workflows/test-macos.yml b/.github/workflows/test-macos.yml index 80f0cba37ff16d..157994c1a022f6 100644 --- a/.github/workflows/test-macos.yml +++ b/.github/workflows/test-macos.yml @@ -6,6 +6,7 @@ on: paths-ignore: - .mailmap - '**.md' + - '*.nix' - AUTHORS - doc/** - .github/** @@ -19,6 +20,7 @@ on: paths-ignore: - .mailmap - '**.md' + - '*.nix' - AUTHORS - doc/** - .github/** diff --git a/.github/workflows/test-shared.yml b/.github/workflows/test-shared.yml new file mode 100644 index 00000000000000..8cf5bb2419a5a2 --- /dev/null +++ b/.github/workflows/test-shared.yml @@ -0,0 +1,83 @@ +name: Test Shared librairies + +on: + pull_request: + paths-ignore: + - .mailmap + - '**.md' + - AUTHORS + - doc/** + - .github/** + - '!.github/workflows/test-shared.yml' + types: [opened, synchronize, reopened, ready_for_review] + push: + branches: + - main + - canary + - v[0-9]+.x-staging + - v[0-9]+.x + paths-ignore: + - .mailmap + - '**.md' + - AUTHORS + - doc/** + - .github/** + - '!.github/workflows/test-shared.yml' + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +env: + FLAKY_TESTS: keep_retrying + +permissions: + contents: read + +jobs: + build: + strategy: + fail-fast: false + matrix: + include: + - runner: ubuntu-24.04 + system: x86_64-linux + - runner: ubuntu-24.04-arm + system: aarch64-linux + - runner: macos-13 + system: x86_64-darwin + - runner: macos-latest + system: aarch64-darwin + name: '${{ matrix.system }}: with shared libraries' + runs-on: ${{ matrix.runner }} + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: false + + - uses: cachix/install-nix-action@7be5dee1421f63d07e71ce6e0a9f8a4b07c2a487 # v31.6.1 + with: + extra_nix_config: sandbox = true + + - name: Configure sccache + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + script: | + core.exportVariable('SCCACHE_GHA_VERSION', 'on'); + core.exportVariable('ACTIONS_CACHE_SERVICE_V2', 'on'); + core.exportVariable('ACTIONS_RESULTS_URL', process.env.ACTIONS_RESULTS_URL || ''); + core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); + + - name: Build Node.js and run tests + run: | + nix-shell \ + -I nixpkgs=./tools/nix/pkgs.nix \ + --pure --keep FLAKY_TESTS \ + --keep SCCACHE_GHA_VERSION --keep ACTIONS_CACHE_SERVICE_V2 --keep ACTIONS_RESULTS_URL --keep ACTIONS_RUNTIME_TOKEN \ + --arg loadJSBuiltinsDynamically false \ + --arg ccache '(import {}).sccache' \ + --arg devTools '[]' \ + --arg benchmarkTools '[]' \ + --run ' + make run-ci -j4 V=1 TEST_CI_ARGS="-p actions --measure-flakiness 9 --skip-tests=$CI_SKIP_TESTS" + ' diff --git a/.github/workflows/tools.yml b/.github/workflows/tools.yml index bb7adcd29e345a..3a6987837eec74 100644 --- a/.github/workflows/tools.yml +++ b/.github/workflows/tools.yml @@ -30,6 +30,7 @@ on: - llhttp - minimatch - nbytes + - nixpkgs-unstable - nghttp2 - nghttp3 - ngtcp2 @@ -190,6 +191,14 @@ jobs: cat temp-output tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true rm temp-output + - id: nixpkgs-unstable + subsystem: tools + label: tools + run: | + ./tools/dep_updaters/update-nixpkgs-pin.sh > temp-output + cat temp-output + tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true + rm temp-output - id: nghttp2 subsystem: deps label: dependencies @@ -292,6 +301,9 @@ jobs: with: python-version: ${{ env.PYTHON_VERSION }} allow-prereleases: true + - name: Set up Nix + if: matrix.id == 'nixpkgs-unstable' && (github.event_name == 'schedule' || inputs.id == 'all' || inputs.id == matrix.id) + uses: cachix/install-nix-action@7be5dee1421f63d07e71ce6e0a9f8a4b07c2a487 # v31.6.1 - run: ${{ matrix.run }} if: github.event_name == 'schedule' || inputs.id == 'all' || inputs.id == matrix.id env: diff --git a/BUILDING.md b/BUILDING.md index 29b57085916acc..292b71a3fb8cf9 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -239,6 +239,7 @@ Consult previous versions of this document for older versions of Node.js: Installation via Linux package manager can be achieved with: +* Nix, NixOS: `nix-shell` * Ubuntu, Debian: `sudo apt-get install python3 g++-12 gcc-12 make python3-pip` * Fedora: `sudo dnf install python3 gcc-c++ make python3-pip` * CentOS and RHEL: `sudo yum install python3 gcc-c++ make python3-pip` @@ -259,6 +260,75 @@ installed, you can find them under the menu `Xcode -> Open Developer Tool -> More Developer Tools...`. This step will install `clang`, `clang++`, and `make`. +#### Nix integration + +If you are using Nix and direnv, you can use the following to get started: + +```bash +echo 'use_nix --arg sharedLibDeps {} --argstr icu small' > .envrc +direnv allow . +make build-ci -j12 +``` + +The use of `make build-ci` is to ensure you are using the `CONFIG_FLAGS` +environment variable. You can also specify it manually: + +```bash +./configure $CONFIG_FLAGS +make -j12 +``` + +Passing the `--arg sharedLibDeps {}` instructs direnv and Nix to generate an +environment that uses the vendored-in native dependencies. Using the vendored-in +dependencies result in a result closer to the official binaries, the tradeoff +being the build will take longer to complete as you'd have to build those +dependencies instead of using the cached ones from the Nix cache. You can omit +that flag to use all the shared dependencies, or specify only some dependencies: + +```bash +cat -> .envrc <<'EOF' +use nix --arg sharedLibDeps '{ + inherit (import {}) + openssl + zlib + ; +}' +EOF +``` + +Passing the `--argstr icu small` instructs direnv and Nix to pass `--with-intl=small` in +the `CONFIG_FLAGS` environment variable. If you omit this, the prebuilt ICU from Nix cache +will be used, which should speed up greatly compilation time. + +The use of `direnv` is completely optional, you can also use `nix-shell` directly, +e.g. here's a command you can use to build a binary for benchmarking purposes: + +```bash +# Passing `--arg loadJSBuiltinsDynamically false` to instruct the compiler to +# embed the JS core files so it is no longer affected by local changes +# (necessary for getting useful benchmark results). +# Passing `--arg devTools '[]' --arg benchmarkTools '[]'` since we don't need +# those to build node. +nix-shell \ + --arg loadJSBuiltinsDynamically false \ + --arg devTools '[]' --arg benchmarkTools '[]' \ + --run 'make build-ci -j12' + +mv out/Release/node ./node_old + +# ... +# Make your local changes, and re-build node + +nix-shell \ + --arg loadJSBuiltinsDynamically false \ + --arg devTools '[]' --arg benchmarkTools '[]' \ + --run 'make build-ci -j12' + +nix-shell --pure --run './node benchmark/compare.js --old ./node_old --new ./node http | Rscript benchmark/compare.R' +``` + +There are additional attributes you can pass, see `shell.nix` file for more details. + #### Building Node.js If the path to your build directory contains a space, the build will likely @@ -267,7 +337,6 @@ fail. To build Node.js: ```bash -export CXX=g++-12 ./configure make -j4 ``` diff --git a/doc/contributing/writing-and-running-benchmarks.md b/doc/contributing/writing-and-running-benchmarks.md index a60a06b695f242..1dcb2a62a952bb 100644 --- a/doc/contributing/writing-and-running-benchmarks.md +++ b/doc/contributing/writing-and-running-benchmarks.md @@ -26,6 +26,10 @@ Basic Unix tools are required for some benchmarks. [Git for Windows][git-for-windows] includes Git Bash and the necessary tools, which need to be included in the global Windows `PATH`. +If you are using Nix, all the required tools are already listed in the +`benchmarkTools` argument of the `shell.nix` file, so you can skip those +prerequesites. + ### HTTP benchmark requirements Most of the HTTP benchmarks require a benchmarker to be installed. This can be diff --git a/shell.nix b/shell.nix new file mode 100644 index 00000000000000..5b66e922d12ca8 --- /dev/null +++ b/shell.nix @@ -0,0 +1,120 @@ +{ + pkgs ? import "${./tools/nix/pkgs.nix}" { }, + loadJSBuiltinsDynamically ? true, # Load `lib/**.js` from disk instead of embedding + ncu-path ? null, # Provide this if you want to use a local version of NCU + icu ? pkgs.icu, + sharedLibDeps ? { + inherit (pkgs) + ada + brotli + c-ares + libuv + nghttp2 + nghttp3 + ngtcp2 + openssl + simdjson + simdutf + sqlite + uvwasi + zlib + zstd + ; + http-parser = pkgs.llhttp; + }, + ccache ? pkgs.ccache, + ninja ? pkgs.ninja, + devTools ? [ + pkgs.curl + pkgs.gh + pkgs.git + pkgs.jq + pkgs.shellcheck + ] + ++ ( + if (ncu-path == null) then + [ pkgs.node-core-utils ] + else + [ + (pkgs.writeShellScriptBin "git-node" "exec \"${ncu-path}/bin/git-node.js\" \"$@\"") + (pkgs.writeShellScriptBin "ncu-ci" "exec \"${ncu-path}/bin/ncu-ci.js\" \"$@\"") + (pkgs.writeShellScriptBin "ncu-config" "exec \"${ncu-path}/bin/ncu-config.js\" \"$@\"") + ] + ), + benchmarkTools ? [ + pkgs.R + pkgs.rPackages.ggplot2 + pkgs.rPackages.plyr + pkgs.wrk + ], + extraConfigFlags ? [ + "--without-npm" + "--debug-node" + ], +}: + +let + useSharedICU = if builtins.isString icu then icu == "system" else icu != null; + useSharedAda = builtins.hasAttr "ada" sharedLibDeps; + useSharedOpenSSL = builtins.hasAttr "openssl" sharedLibDeps; +in +pkgs.mkShell { + inherit (pkgs.nodejs_latest) nativeBuildInputs; + + buildInputs = builtins.attrValues sharedLibDeps ++ pkgs.lib.optionals useSharedICU [ icu ]; + + packages = [ + ccache + ] + ++ devTools + ++ benchmarkTools; + + shellHook = + if (ccache != null) then + '' + export CC="${pkgs.lib.getExe ccache} $CC" + export CXX="${pkgs.lib.getExe ccache} $CXX" + '' + else + ""; + + BUILD_WITH = if (ninja != null) then "ninja" else "make"; + NINJA = if (ninja != null) then "${pkgs.lib.getExe ninja}" else ""; + CI_SKIP_TESTS = pkgs.lib.concatStringsSep "," ( + [ ] + ++ pkgs.lib.optionals useSharedAda [ + # Different versions of Ada affect the WPT tests + "test-url" + ] + ++ pkgs.lib.optionals useSharedOpenSSL [ + # Path to the openssl.cnf is different from the expected one + "test-strace-openat-openssl" + ] + ); + CONFIG_FLAGS = builtins.toString ( + [ + ( + if icu == null then + "--without-intl" + else + "--with-intl=${if useSharedICU then "system" else icu}-icu" + ) + ] + ++ extraConfigFlags + ++ pkgs.lib.optionals (ninja != null) [ + "--ninja" + ] + ++ pkgs.lib.optionals loadJSBuiltinsDynamically [ + "--node-builtin-modules-path=${builtins.toString ./.}" + ] + ++ pkgs.lib.concatMap (name: [ + "--shared-${builtins.replaceStrings [ "c-ares" ] [ "cares" ] name}" + "--shared-${builtins.replaceStrings [ "c-ares" ] [ "cares" ] name}-libpath=${ + pkgs.lib.getLib sharedLibDeps.${name} + }/lib" + "--shared-${builtins.replaceStrings [ "c-ares" ] [ "cares" ] name}-include=${ + pkgs.lib.getInclude sharedLibDeps.${name} + }/include" + ]) (builtins.attrNames sharedLibDeps) + ); +} diff --git a/tools/dep_updaters/update-nixpkgs-pin.sh b/tools/dep_updaters/update-nixpkgs-pin.sh new file mode 100755 index 00000000000000..97d6cde29d8ba7 --- /dev/null +++ b/tools/dep_updaters/update-nixpkgs-pin.sh @@ -0,0 +1,40 @@ +#!/bin/sh +set -ex +# Shell script to update Nixpkgs pin in the source tree to the most recent +# version on the unstable channel. + +BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) +NIXPKGS_PIN_FILE="$BASE_DIR/tools/nix/pkgs.nix" + +NIXPKGS_REPO=$(grep 'repo =' "$NIXPKGS_PIN_FILE" | awk -F'"' '{ print $2 }') +CURRENT_VERSION_SHA1=$(grep 'rev =' "$NIXPKGS_PIN_FILE" | awk -F'"' '{ print $2 }') +CURRENT_VERSION=$(echo "$CURRENT_VERSION_SHA1" | head -c 7) + +NEW_UPSTREAM_SHA1=$(git ls-remote "$NIXPKGS_REPO.git" nixpkgs-unstable | awk '{print $1}') +NEW_VERSION=$(echo "$NEW_UPSTREAM_SHA1" | head -c 7) + + +# shellcheck disable=SC1091 +. "$BASE_DIR/tools/dep_updaters/utils.sh" + +compare_dependency_version "nixpkgs-unstable" "$NEW_VERSION" "$CURRENT_VERSION" + +CURRENT_TARBALL_HASH=$(grep 'sha256 =' "$NIXPKGS_PIN_FILE" | awk -F'"' '{ print $2 }') +NEW_TARBALL_HASH=$(nix-prefetch-url --unpack "$NIXPKGS_REPO/archive/$NEW_UPSTREAM_SHA1.tar.gz") + +TMP_FILE=$(mktemp) +sed "s/$CURRENT_VERSION_SHA1/$NEW_UPSTREAM_SHA1/;s/$CURRENT_TARBALL_HASH/$NEW_TARBALL_HASH/" "$NIXPKGS_PIN_FILE" > "$TMP_FILE" +mv "$TMP_FILE" "$NIXPKGS_PIN_FILE" + +cat -< Date: Mon, 20 Oct 2025 00:49:11 +0200 Subject: [PATCH 70/83] tools: show diff alongside the error in Nix linter PR-URL: https://github.com/nodejs/node/pull/60301 Reviewed-By: Yagiz Nizipli Reviewed-By: Colin Ihrig Reviewed-By: Luigi Pinca Reviewed-By: Benjamin Gruenbaum --- .github/workflows/linters.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/linters.yml b/.github/workflows/linters.yml index 8add850f9128ce..f0404da2b804e8 100644 --- a/.github/workflows/linters.yml +++ b/.github/workflows/linters.yml @@ -151,10 +151,10 @@ jobs: sparse-checkout-cone-mode: false - uses: cachix/install-nix-action@7be5dee1421f63d07e71ce6e0a9f8a4b07c2a487 # v31.6.1 - name: Lint Nix files - run: nix-shell -I nixpkgs=./tools/nix/pkgs.nix -p 'nixfmt-tree' --run 'treefmt --quiet --fail-on-change' - - if: ${{ failure() }} - name: Show diff - run: git --no-pager diff + run: | + nix-shell -I nixpkgs=./tools/nix/pkgs.nix -p 'nixfmt-tree' --run ' + treefmt --quiet --fail-on-change + ' || git --no-pager diff --exit-code lint-py: if: github.event.pull_request.draft == false From ffec5927fd595b839eb0b888daf85f133045a3db Mon Sep 17 00:00:00 2001 From: Ronit Sabhaya Date: Sun, 19 Oct 2025 17:57:02 -0500 Subject: [PATCH 71/83] meta: fix typo in test-shared workflow name Changed 'librairies' to 'libraries' in the workflow name. PR-URL: https://github.com/nodejs/node/pull/60321 Reviewed-By: Colin Ihrig Reviewed-By: Marco Ippolito --- .github/workflows/test-shared.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-shared.yml b/.github/workflows/test-shared.yml index 8cf5bb2419a5a2..3f0491bd739306 100644 --- a/.github/workflows/test-shared.yml +++ b/.github/workflows/test-shared.yml @@ -1,4 +1,4 @@ -name: Test Shared librairies +name: Test Shared libraries on: pull_request: From 03b034731e74a68d9dd6850c453c767e37d1c5cf Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Tue, 21 Oct 2025 19:45:46 +0200 Subject: [PATCH 72/83] tools: disable inspector on macOS-shared to reduce flakiness PR-URL: https://github.com/nodejs/node/pull/60320 Reviewed-By: Chengzhong Wu Reviewed-By: Joyee Cheung Reviewed-By: Marco Ippolito Reviewed-By: Yagiz Nizipli --- .github/workflows/test-shared.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test-shared.yml b/.github/workflows/test-shared.yml index 3f0491bd739306..fe5ac5abb115c2 100644 --- a/.github/workflows/test-shared.yml +++ b/.github/workflows/test-shared.yml @@ -78,6 +78,7 @@ jobs: --arg ccache '(import {}).sccache' \ --arg devTools '[]' \ --arg benchmarkTools '[]' \ + ${{ endsWith(matrix.system, '-darwin') && '--arg extraConfigFlags ''["--without-inspector"]'' \' || '\' }} --run ' make run-ci -j4 V=1 TEST_CI_ARGS="-p actions --measure-flakiness 9 --skip-tests=$CI_SKIP_TESTS" ' From cb615b1a2ee4673e66c53608724d932a47a77019 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Zasso?= Date: Fri, 24 Oct 2025 15:13:13 +0200 Subject: [PATCH 73/83] tools: skip test-shared workflow for draft PRs PR-URL: https://github.com/nodejs/node/pull/60365 Reviewed-By: Antoine du Hamel Reviewed-By: Chengzhong Wu Reviewed-By: Colin Ihrig Reviewed-By: Luigi Pinca --- .github/workflows/test-shared.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test-shared.yml b/.github/workflows/test-shared.yml index fe5ac5abb115c2..d198cca069fcea 100644 --- a/.github/workflows/test-shared.yml +++ b/.github/workflows/test-shared.yml @@ -36,6 +36,7 @@ permissions: jobs: build: + if: github.event.pull_request.draft == false strategy: fail-fast: false matrix: From ae4858c1f6bfa968f5997018ee80d580bb8ee32f Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Mon, 8 Sep 2025 11:59:34 +0200 Subject: [PATCH 74/83] tools: add an option to generate lighter archives PR-URL: https://github.com/nodejs/node/pull/60294 Reviewed-By: Yagiz Nizipli --- .github/workflows/test-shared.yml | 52 ++++++++++++++++++++++++++++--- Makefile | 26 +++++++++++++++- 2 files changed, 72 insertions(+), 6 deletions(-) diff --git a/.github/workflows/test-shared.yml b/.github/workflows/test-shared.yml index d198cca069fcea..a1ab5bba2f7edc 100644 --- a/.github/workflows/test-shared.yml +++ b/.github/workflows/test-shared.yml @@ -35,8 +35,35 @@ permissions: contents: read jobs: - build: + build-tarball: if: github.event.pull_request.draft == false + name: ${{ github.event_name == 'workflow_dispatch' && 'Skipped job' || 'Build slim tarball' }} + runs-on: ubuntu-24.04-arm + steps: + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + if: ${{ github.event_name != 'workflow_dispatch' }} + with: + persist-credentials: false + + - name: Make tarball + if: ${{ github.event_name != 'workflow_dispatch' }} + run: | + export DATESTRING=$(date "+%Y-%m-%d") + export COMMIT=$(git rev-parse --short=10 "$GITHUB_SHA") + ./configure && make tar -j4 SKIP_XZ=1 SKIP_SHARED_DEPS=1 + env: + DISTTYPE: nightly + + - name: Upload tarball artifact + if: ${{ github.event_name != 'workflow_dispatch' }} + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + with: + name: tarballs + path: '*.tar.gz' + compression-level: 0 + + build: + needs: build-tarball strategy: fail-fast: false matrix: @@ -52,9 +79,17 @@ jobs: name: '${{ matrix.system }}: with shared libraries' runs-on: ${{ matrix.runner }} steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 + if: ${{ github.event_name != 'workflow_dispatch' }} with: - persist-credentials: false + name: tarballs + path: tarballs + + - name: Extract tarball + if: ${{ github.event_name != 'workflow_dispatch' }} + run: | + tar xzf tarballs/*.tar.gz -C "$RUNNER_TEMP" + echo "TAR_DIR=$RUNNER_TEMP/$(basename tarballs/*.tar.gz .tar.gz)" >> "$GITHUB_ENV" - uses: cachix/install-nix-action@7be5dee1421f63d07e71ce6e0a9f8a4b07c2a487 # v31.6.1 with: @@ -69,11 +104,18 @@ jobs: core.exportVariable('ACTIONS_RESULTS_URL', process.env.ACTIONS_RESULTS_URL || ''); core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); + - name: Load shell.nix + if: github.event_name != 'workflow_dispatch' + run: | + mv "$TAR_DIR"/*.nix . + mkdir tools + mv "$TAR_DIR"/tools/nix tools/. + - name: Build Node.js and run tests run: | nix-shell \ -I nixpkgs=./tools/nix/pkgs.nix \ - --pure --keep FLAKY_TESTS \ + --pure --keep TAR_DIR --keep FLAKY_TESTS \ --keep SCCACHE_GHA_VERSION --keep ACTIONS_CACHE_SERVICE_V2 --keep ACTIONS_RESULTS_URL --keep ACTIONS_RUNTIME_TOKEN \ --arg loadJSBuiltinsDynamically false \ --arg ccache '(import {}).sccache' \ @@ -81,5 +123,5 @@ jobs: --arg benchmarkTools '[]' \ ${{ endsWith(matrix.system, '-darwin') && '--arg extraConfigFlags ''["--without-inspector"]'' \' || '\' }} --run ' - make run-ci -j4 V=1 TEST_CI_ARGS="-p actions --measure-flakiness 9 --skip-tests=$CI_SKIP_TESTS" + make -C "$TAR_DIR" run-ci -j4 V=1 TEST_CI_ARGS="-p actions --measure-flakiness 9 --skip-tests=$CI_SKIP_TESTS" ' diff --git a/Makefile b/Makefile index 34f3ed11bfa9a9..bccbac90bca748 100644 --- a/Makefile +++ b/Makefile @@ -399,7 +399,7 @@ ADDONS_HEADERS_PREREQS := tools/install.py \ $(wildcard deps/uv/include/*/*.h) \ $(wildcard deps/v8/include/*.h) \ $(wildcard deps/v8/include/*/*.h) \ - deps/zlib/zconf.h deps/zlib/zlib.h \ + $(wildcard deps/zlib/z*.h) \ src/node.h src/node_api.h src/js_native_api.h src/js_native_api_types.h \ src/node_api_types.h src/node_buffer.h src/node_object_wrap.h \ src/node_version.h @@ -1032,6 +1032,11 @@ override DESTCPU=x86 endif TARNAME=node-$(FULLVERSION) +# Supply SKIP_SHARED_DEPS=1 to explicitly skip all dependencies that can be included as shared deps +SKIP_SHARED_DEPS ?= 0 +ifeq ($(SKIP_SHARED_DEPS), 1) +TARNAME:=$(TARNAME)-slim +endif TARBALL=$(TARNAME).tar # Custom user-specified variation, use it directly ifdef VARIATION @@ -1215,12 +1220,31 @@ $(TARBALL): release-only doc-only $(RM) -r $(TARNAME)/.mailmap $(RM) -r $(TARNAME)/deps/corepack $(RM) $(TARNAME)/test/parallel/test-corepack-version.js +ifeq ($(SKIP_SHARED_DEPS), 1) + $(RM) -r $(TARNAME)/deps/ada + $(RM) -r $(TARNAME)/deps/brotli + $(RM) -r $(TARNAME)/deps/cares + $(RM) -r $(TARNAME)/deps/icu-small + $(RM) -r $(TARNAME)/deps/icu-tmp + $(RM) -r $(TARNAME)/deps/llhttp + $(RM) -r $(TARNAME)/deps/nghttp2 + $(RM) -r $(TARNAME)/deps/ngtcp2 + find $(TARNAME)/deps/openssl -maxdepth 1 -type f ! -name 'nodejs-openssl.cnf' -exec $(RM) {} + + find $(TARNAME)/deps/openssl -mindepth 1 -maxdepth 1 -type d -exec $(RM) -r {} + + $(RM) -r $(TARNAME)/deps/simdjson + $(RM) -r $(TARNAME)/deps/sqlite + $(RM) -r $(TARNAME)/deps/uv + $(RM) -r $(TARNAME)/deps/uvwasi + $(RM) -r $(TARNAME)/deps/zlib + $(RM) -r $(TARNAME)/deps/zstd +else $(RM) -r $(TARNAME)/deps/openssl/openssl/demos $(RM) -r $(TARNAME)/deps/openssl/openssl/doc $(RM) -r $(TARNAME)/deps/openssl/openssl/test $(RM) -r $(TARNAME)/deps/uv/docs $(RM) -r $(TARNAME)/deps/uv/samples $(RM) -r $(TARNAME)/deps/uv/test +endif $(RM) -r $(TARNAME)/deps/v8/samples $(RM) -r $(TARNAME)/deps/v8/tools/profviz $(RM) -r $(TARNAME)/deps/v8/tools/run-tests.py From 425a1879b1b69fbc7b2915f40f7fc2ff00ff78fc Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Mon, 27 Oct 2025 14:54:31 +0100 Subject: [PATCH 75/83] doc: mention more codemods in `deprecations.md` PR-URL: https://github.com/nodejs/node/pull/60243 Reviewed-By: Colin Ihrig Reviewed-By: Luigi Pinca Reviewed-By: Jacob Smith --- doc/api/deprecations.md | 126 +++++++++++++++++++++++++++++++++++++++- doc/api/globals.md | 6 ++ doc/api/url.md | 12 ++++ 3 files changed, 141 insertions(+), 3 deletions(-) diff --git a/doc/api/deprecations.md b/doc/api/deprecations.md index 9a524be6290d92..610bcc4f7302a1 100644 --- a/doc/api/deprecations.md +++ b/doc/api/deprecations.md @@ -551,7 +551,7 @@ Type: End-of-Life The `os.tmpDir()` API was deprecated in Node.js 7.0.0 and has since been removed. Please use [`os.tmpdir()`][] instead. -An automated migration is available ([source](https://github.com/nodejs/userland-migrations/tree/main/recipes/tmpDir-to-tmpdir)): +An automated migration is available ([source](https://github.com/nodejs/userland-migrations/tree/main/recipes/tmpdir-to-tmpdir)): ```bash npx codemod@latest @nodejs/tmpDir-to-tmpdir @@ -688,10 +688,10 @@ Type: End-of-Life `util.debug()` has been removed. Please use [`console.error()`][] instead. -An automated migration is available ([source](https://github.com/nodejs/userland-migrations/tree/main/recipes/util-debug-to-console-error)): +An automated migration is available ([source](https://github.com/nodejs/userland-migrations/tree/main/recipes/util-print-to-console-log)): ```bash -npx codemod@latest @nodejs/util-debug-to-console-error +npx codemod@latest @nodejs/util-print-to-console-log ``` ### DEP0029: `util.error()` @@ -1061,6 +1061,12 @@ Type: End-of-Life The `util.isBoolean()` API has been removed. Please use `typeof arg === 'boolean'` instead. +An automated migration is available ([source](https://github.com/nodejs/userland-migrations/tree/main/recipes/util-is)): + +```bash +npx codemod@latest @nodejs/util-is +``` + ### DEP0046: `util.isBuffer()` + +* `active` {boolean} Whether to set the defensive flag. + +Enables or disables the defensive flag. When the defensive flag is active, +language features that allow ordinary SQL to deliberately corrupt the database file are disabled. +See [`SQLITE_DBCONFIG_DEFENSIVE`][] in the SQLite documentation for details. + ### `database.location([dbName])` * `active` {boolean} Whether to set the defensive flag. diff --git a/doc/changelogs/CHANGELOG_V25.md b/doc/changelogs/CHANGELOG_V25.md index 4e9201ab1d8e90..1e9d018a4cc417 100644 --- a/doc/changelogs/CHANGELOG_V25.md +++ b/doc/changelogs/CHANGELOG_V25.md @@ -8,6 +8,7 @@ +25.1.0
25.0.0
@@ -40,6 +41,101 @@ * [io.js](CHANGELOG_IOJS.md) * [Archive](CHANGELOG_ARCHIVE.md) + + +## 2025-10-28, Version 25.1.0 (Current), @aduh95 + +### Notable Changes + +* \[[`4395fe14b9`](https://github.com/nodejs/node/commit/4395fe14b9)] - **(SEMVER-MINOR)** **http**: add optimizeEmptyRequests server option (Rafael Gonzaga) [#59778](https://github.com/nodejs/node/pull/59778) +* \[[`2e55c6ad04`](https://github.com/nodejs/node/commit/2e55c6ad04)] - **(SEMVER-MINOR)** **sqlite**: allow setting defensive flag (Bart Louwers) [#60217](https://github.com/nodejs/node/pull/60217) +* \[[`f437204491`](https://github.com/nodejs/node/commit/f437204491)] - **(SEMVER-MINOR)** **src**: add watch config namespace (Marco Ippolito) [#60178](https://github.com/nodejs/node/pull/60178) + +### Commits + +* \[[`bb27766bd5`](https://github.com/nodejs/node/commit/bb27766bd5)] - **benchmark**: improve cpu.sh for safety and usability (Nam Yooseong) [#60162](https://github.com/nodejs/node/pull/60162) +* \[[`e600711c20`](https://github.com/nodejs/node/commit/e600711c20)] - **benchmark**: add benchmark for leaf source text modules (Joyee Cheung) [#60205](https://github.com/nodejs/node/pull/60205) +* \[[`1bbcdf9039`](https://github.com/nodejs/node/commit/1bbcdf9039)] - **benchmark**: add vm.SourceTextModule benchmark (Joyee Cheung) [#59396](https://github.com/nodejs/node/pull/59396) +* \[[`22fa6bd28b`](https://github.com/nodejs/node/commit/22fa6bd28b)] - **build**: ibmi follow aix visibility (SRAVANI GUNDEPALLI) [#60360](https://github.com/nodejs/node/pull/60360) +* \[[`931028400e`](https://github.com/nodejs/node/commit/931028400e)] - **build**: use call command when calling python configure (Jacob Nichols) [#60098](https://github.com/nodejs/node/pull/60098) +* \[[`17fde3f3d1`](https://github.com/nodejs/node/commit/17fde3f3d1)] - **build**: build v8 with -fvisibility=hidden -fvisibility-inlines-hidden (Joyee Cheung) [#56290](https://github.com/nodejs/node/pull/56290) +* \[[`04cc7aae5e`](https://github.com/nodejs/node/commit/04cc7aae5e)] - **build**: remove V8\_COMPRESS\_POINTERS\_IN\_ISOLATE\_CAGE defs (Joyee Cheung) [#60296](https://github.com/nodejs/node/pull/60296) +* \[[`8a2053060d`](https://github.com/nodejs/node/commit/8a2053060d)] - **crypto**: update root certificates to NSS 3.116 (Node.js GitHub Bot) [#59956](https://github.com/nodejs/node/pull/59956) +* \[[`fe91c0f755`](https://github.com/nodejs/node/commit/fe91c0f755)] - **deps**: update simdjson to 4.0.7 (Node.js GitHub Bot) [#59883](https://github.com/nodejs/node/pull/59883) +* \[[`aacfc0d212`](https://github.com/nodejs/node/commit/aacfc0d212)] - **deps**: update corepack to 0.34.1 (Node.js GitHub Bot) [#60314](https://github.com/nodejs/node/pull/60314) +* \[[`8596891a71`](https://github.com/nodejs/node/commit/8596891a71)] - **deps**: update inspector\_protocol to af7f5a8173fdbc29f0835ec94395932e328b (Node.js GitHub Bot) [#60312](https://github.com/nodejs/node/pull/60312) +* \[[`21bcd0eb2f`](https://github.com/nodejs/node/commit/21bcd0eb2f)] - **deps**: V8: cherry-pick 3d0f462a17ff (Joyee Cheung) [#59396](https://github.com/nodejs/node/pull/59396) +* \[[`673558501c`](https://github.com/nodejs/node/commit/673558501c)] - **deps**: update googletest to 279f847 (Node.js GitHub Bot) [#60219](https://github.com/nodejs/node/pull/60219) +* \[[`425a1879b1`](https://github.com/nodejs/node/commit/425a1879b1)] - **doc**: mention more codemods in `deprecations.md` (Augustin Mauroy) [#60243](https://github.com/nodejs/node/pull/60243) +* \[[`563e1317f3`](https://github.com/nodejs/node/commit/563e1317f3)] - **doc**: remove unnecessary statement of web storage (Deokjin Kim) [#60363](https://github.com/nodejs/node/pull/60363) +* \[[`064c8c5cfd`](https://github.com/nodejs/node/commit/064c8c5cfd)] - **doc**: add missing CAA type to dns.resolveAny() & dnsPromises.resolveAny() (Jimmy Leung) [#58899](https://github.com/nodejs/node/pull/58899) +* \[[`99e357af35`](https://github.com/nodejs/node/commit/99e357af35)] - **doc**: use `any` for `worker_threads.Worker` 'error' event argument `err` (Jonas Geiler) [#60300](https://github.com/nodejs/node/pull/60300) +* \[[`8ccff0d934`](https://github.com/nodejs/node/commit/8ccff0d934)] - **doc**: update decorator documentation to reflect actual policy (Muhammad Salman Aziz) [#60288](https://github.com/nodejs/node/pull/60288) +* \[[`bac70c6ef3`](https://github.com/nodejs/node/commit/bac70c6ef3)] - **doc**: document wildcard supported by tools/test.py (Joyee Cheung) [#60265](https://github.com/nodejs/node/pull/60265) +* \[[`8492bc6a88`](https://github.com/nodejs/node/commit/8492bc6a88)] - **doc**: add --heap-snapshot-on-oom to useful v8 flag (jakecastelli) [#60260](https://github.com/nodejs/node/pull/60260) +* \[[`0f0d3c0e47`](https://github.com/nodejs/node/commit/0f0d3c0e47)] - **doc**: fix `blob.bytes()` heading level (XTY) [#60252](https://github.com/nodejs/node/pull/60252) +* \[[`8c8525cf93`](https://github.com/nodejs/node/commit/8c8525cf93)] - **doc**: fix not working code example in vm docs (Artur Gawlik) [#60224](https://github.com/nodejs/node/pull/60224) +* \[[`8a6de3866c`](https://github.com/nodejs/node/commit/8a6de3866c)] - **doc, assert**: correct order of changes entries (Gerhard Stöbich) [#60304](https://github.com/nodejs/node/pull/60304) +* \[[`6bacb6555a`](https://github.com/nodejs/node/commit/6bacb6555a)] - **doc, module**: change async customization hooks to experimental (Gerhard Stöbich) [#60302](https://github.com/nodejs/node/pull/60302) +* \[[`6f3b16df16`](https://github.com/nodejs/node/commit/6f3b16df16)] - **esm**: use index-based resolution callbacks (Joyee Cheung) [#59396](https://github.com/nodejs/node/pull/59396) +* \[[`95644a432c`](https://github.com/nodejs/node/commit/95644a432c)] - **http**: lazy allocate cookies array (Robert Nagy) [#59734](https://github.com/nodejs/node/pull/59734) +* \[[`4395fe14b9`](https://github.com/nodejs/node/commit/4395fe14b9)] - **(SEMVER-MINOR)** **http**: add optimizeEmptyRequests server option (Rafael Gonzaga) [#59778](https://github.com/nodejs/node/pull/59778) +* \[[`f1aa1eaaf5`](https://github.com/nodejs/node/commit/f1aa1eaaf5)] - **inspector**: add network payload buffer size limits (Chengzhong Wu) [#60236](https://github.com/nodejs/node/pull/60236) +* \[[`64fc625bf9`](https://github.com/nodejs/node/commit/64fc625bf9)] - **inspector**: support handshake response for websocket inspection (Shima Ryuhei) [#60225](https://github.com/nodejs/node/pull/60225) +* \[[`0ecbb806a8`](https://github.com/nodejs/node/commit/0ecbb806a8)] - **lib**: fix typo in createBlobReaderStream (SeokHun) [#60132](https://github.com/nodejs/node/pull/60132) +* \[[`ffec5927fd`](https://github.com/nodejs/node/commit/ffec5927fd)] - **meta**: fix typo in test-shared workflow name (Ronit Sabhaya) [#60321](https://github.com/nodejs/node/pull/60321) +* \[[`a02897e157`](https://github.com/nodejs/node/commit/a02897e157)] - **meta**: move one or more collaborators to emeritus (Node.js GitHub Bot) [#60325](https://github.com/nodejs/node/pull/60325) +* \[[`59223a7831`](https://github.com/nodejs/node/commit/59223a7831)] - **meta**: loop userland-migrations in deprecations (Chengzhong Wu) [#60299](https://github.com/nodejs/node/pull/60299) +* \[[`2d48d17696`](https://github.com/nodejs/node/commit/2d48d17696)] - **module**: refactor and clarify async loader hook customizations (Joyee Cheung) [#60278](https://github.com/nodejs/node/pull/60278) +* \[[`be1b84fd93`](https://github.com/nodejs/node/commit/be1b84fd93)] - **module**: handle null source from async loader hooks in sync hooks (Joyee Cheung) [#59929](https://github.com/nodejs/node/pull/59929) +* \[[`063fbd87d3`](https://github.com/nodejs/node/commit/063fbd87d3)] - **msi**: fix WiX warnings (Stefan Stojanovic) [#60251](https://github.com/nodejs/node/pull/60251) +* \[[`2e55c6ad04`](https://github.com/nodejs/node/commit/2e55c6ad04)] - **(SEMVER-MINOR)** **sqlite**: allow setting defensive flag (Bart Louwers) [#60217](https://github.com/nodejs/node/pull/60217) +* \[[`dc93d6988a`](https://github.com/nodejs/node/commit/dc93d6988a)] - **src**: fix timing of snapshot serialize callback (Joyee Cheung) [#60434](https://github.com/nodejs/node/pull/60434) +* \[[`267e1b3817`](https://github.com/nodejs/node/commit/267e1b3817)] - **src**: add COUNT\_GENERIC\_USAGE utility for tests (Joyee Cheung) [#60434](https://github.com/nodejs/node/pull/60434) +* \[[`4a5d7a4c2a`](https://github.com/nodejs/node/commit/4a5d7a4c2a)] - **src**: conditionally disable source phase imports by default (Shelley Vohr) [#60364](https://github.com/nodejs/node/pull/60364) +* \[[`f437204491`](https://github.com/nodejs/node/commit/f437204491)] - **(SEMVER-MINOR)** **src**: add watch config namespace (Marco Ippolito) [#60178](https://github.com/nodejs/node/pull/60178) +* \[[`36837fa0f9`](https://github.com/nodejs/node/commit/36837fa0f9)] - **src**: use cached primordials\_string (Sohyeon Kim) [#60255](https://github.com/nodejs/node/pull/60255) +* \[[`df8396ad37`](https://github.com/nodejs/node/commit/df8396ad37)] - **src**: replace Environment::GetCurrent with args.GetIsolate (Sohyeon Kim) [#60256](https://github.com/nodejs/node/pull/60256) +* \[[`5dd670b2b9`](https://github.com/nodejs/node/commit/5dd670b2b9)] - **src**: initial enablement of IsolateGroups (James M Snell) [#60254](https://github.com/nodejs/node/pull/60254) +* \[[`afdb362933`](https://github.com/nodejs/node/commit/afdb362933)] - **src**: use `Utf8Value` and `TwoByteValue` instead of V8 helpers (Anna Henningsen) [#60244](https://github.com/nodejs/node/pull/60244) +* \[[`a40e533e72`](https://github.com/nodejs/node/commit/a40e533e72)] - **src**: add a default branch for module phase (Chengzhong Wu) [#60261](https://github.com/nodejs/node/pull/60261) +* \[[`42729f07ee`](https://github.com/nodejs/node/commit/42729f07ee)] - **src**: stop using deprecated v8::Context::GetIsolate (Michaël Zasso) [#60223](https://github.com/nodejs/node/pull/60223) +* \[[`7a6542c205`](https://github.com/nodejs/node/commit/7a6542c205)] - **test**: skip failing test on macOS 15.7+ (Antoine du Hamel) [#60419](https://github.com/nodejs/node/pull/60419) +* \[[`29a5855a4f`](https://github.com/nodejs/node/commit/29a5855a4f)] - **test**: ensure assertions are reachable in `test/addons` (Antoine du Hamel) [#60142](https://github.com/nodejs/node/pull/60142) +* \[[`12773d19c4`](https://github.com/nodejs/node/commit/12773d19c4)] - **test**: increase debugger waitFor timeout on macOS (Chengzhong Wu) [#60367](https://github.com/nodejs/node/pull/60367) +* \[[`0b38de3e9e`](https://github.com/nodejs/node/commit/0b38de3e9e)] - **test**: put helper in test-runner-output into common (Joyee Cheung) [#60330](https://github.com/nodejs/node/pull/60330) +* \[[`6de2407c44`](https://github.com/nodejs/node/commit/6de2407c44)] - **test**: fix small compile warning in test\_network\_requests\_buffer.cc (xiaocainiao633) [#60281](https://github.com/nodejs/node/pull/60281) +* \[[`4b23ac8613`](https://github.com/nodejs/node/commit/4b23ac8613)] - **test**: fix status when compiled without inspector (Antoine du Hamel) [#60289](https://github.com/nodejs/node/pull/60289) +* \[[`a07f32e326`](https://github.com/nodejs/node/commit/a07f32e326)] - **test**: split test-runner-watch-mode-kill-signal (Joyee Cheung) [#60298](https://github.com/nodejs/node/pull/60298) +* \[[`30451d32d7`](https://github.com/nodejs/node/commit/30451d32d7)] - **test**: fix incorrect calculation in test-perf-hooks.js (Joyee Cheung) [#60271](https://github.com/nodejs/node/pull/60271) +* \[[`e3c3b48f1c`](https://github.com/nodejs/node/commit/e3c3b48f1c)] - **test**: ignore EPIPE errors in https proxy invalid URL test (Joyee Cheung) [#60269](https://github.com/nodejs/node/pull/60269) +* \[[`405a9c4c5f`](https://github.com/nodejs/node/commit/405a9c4c5f)] - **test**: parallelize test-without-async-context-frame correctly (Joyee Cheung) [#60273](https://github.com/nodejs/node/pull/60273) +* \[[`ffeebebc71`](https://github.com/nodejs/node/commit/ffeebebc71)] - **test**: make test-worker-prof more tolerant (Joyee Cheung) [#60272](https://github.com/nodejs/node/pull/60272) +* \[[`26b01bf170`](https://github.com/nodejs/node/commit/26b01bf170)] - **test**: skip sea tests on x64 macOS (Joyee Cheung) [#60250](https://github.com/nodejs/node/pull/60250) +* \[[`8caae1a05b`](https://github.com/nodejs/node/commit/8caae1a05b)] - **test**: move sea tests into test/sea (Joyee Cheung) [#60250](https://github.com/nodejs/node/pull/60250) +* \[[`3d183e3e9f`](https://github.com/nodejs/node/commit/3d183e3e9f)] - **test,crypto**: fix conditional SHA3-\* skip on BoringSSL (Filip Skokan) [#60379](https://github.com/nodejs/node/pull/60379) +* \[[`e83dbcba94`](https://github.com/nodejs/node/commit/e83dbcba94)] - **test,crypto**: sha3 algorithms aren't supported with BoringSSL (Shelley Vohr) [#60374](https://github.com/nodejs/node/pull/60374) +* \[[`3d89331496`](https://github.com/nodejs/node/commit/3d89331496)] - **test\_runner**: use module.registerHooks in module mocks (Joyee Cheung) [#60326](https://github.com/nodejs/node/pull/60326) +* \[[`377e8ce85a`](https://github.com/nodejs/node/commit/377e8ce85a)] - **tls**: avoid external memory leak on invalid protocol versions (Shelley Vohr) [#60390](https://github.com/nodejs/node/pull/60390) +* \[[`ae4858c1f6`](https://github.com/nodejs/node/commit/ae4858c1f6)] - **tools**: add an option to generate lighter archives (Antoine du Hamel) [#60294](https://github.com/nodejs/node/pull/60294) +* \[[`cb615b1a2e`](https://github.com/nodejs/node/commit/cb615b1a2e)] - **tools**: skip test-shared workflow for draft PRs (Michaël Zasso) [#60365](https://github.com/nodejs/node/pull/60365) +* \[[`03b034731e`](https://github.com/nodejs/node/commit/03b034731e)] - **tools**: disable inspector on macOS-shared to reduce flakiness (Antoine du Hamel) [#60320](https://github.com/nodejs/node/pull/60320) +* \[[`f402b4e1d1`](https://github.com/nodejs/node/commit/f402b4e1d1)] - **tools**: show diff alongside the error in Nix linter (Antoine du Hamel) [#60301](https://github.com/nodejs/node/pull/60301) +* \[[`5d5c8483fb`](https://github.com/nodejs/node/commit/5d5c8483fb)] - **tools**: run CI with shared libs on GHA (Antoine du Hamel) [#60121](https://github.com/nodejs/node/pull/60121) +* \[[`e8fdd8d2e8`](https://github.com/nodejs/node/commit/e8fdd8d2e8)] - **tools**: update gyp-next to 0.20.5 (Node.js GitHub Bot) [#60313](https://github.com/nodejs/node/pull/60313) +* \[[`6e8b029a21`](https://github.com/nodejs/node/commit/6e8b029a21)] - **tools**: limit inspector protocol PR title length (Chengzhong Wu) [#60324](https://github.com/nodejs/node/pull/60324) +* \[[`a5073086c6`](https://github.com/nodejs/node/commit/a5073086c6)] - **tools**: fix inspector\_protocol updater (Chengzhong Wu) [#60277](https://github.com/nodejs/node/pull/60277) +* \[[`47fa765bff`](https://github.com/nodejs/node/commit/47fa765bff)] - **tools**: optimize wildcard execution in tools/test.py (Joyee Cheung) [#60266](https://github.com/nodejs/node/pull/60266) +* \[[`11ebb0447d`](https://github.com/nodejs/node/commit/11ebb0447d)] - **tools**: add C++ lint rule to avoid using `String::Utf8Value` (Anna Henningsen) [#60244](https://github.com/nodejs/node/pull/60244) +* \[[`14f3189670`](https://github.com/nodejs/node/commit/14f3189670)] - **tools**: add inspector\_protocol updater (Chengzhong Wu) [#60245](https://github.com/nodejs/node/pull/60245) +* \[[`ef4c596fc6`](https://github.com/nodejs/node/commit/ef4c596fc6)] - **typings**: add missing properties and method in Worker (Woohyun Sung) [#60257](https://github.com/nodejs/node/pull/60257) +* \[[`09ae6fc065`](https://github.com/nodejs/node/commit/09ae6fc065)] - **typings**: add missing properties in HTTPParser (Woohyun Sung) [#60257](https://github.com/nodejs/node/pull/60257) +* \[[`9ecaf41f8e`](https://github.com/nodejs/node/commit/9ecaf41f8e)] - **typings**: delete undefined property in ConfigBinding (Woohyun Sung) [#60257](https://github.com/nodejs/node/pull/60257) +* \[[`4a86016e86`](https://github.com/nodejs/node/commit/4a86016e86)] - **util**: use more defensive code when inspecting error objects (Antoine du Hamel) [#60139](https://github.com/nodejs/node/pull/60139) +* \[[`9e6d6cec59`](https://github.com/nodejs/node/commit/9e6d6cec59)] - **util**: mark special properties when inspecting them (Ruben Bridgewater) [#60131](https://github.com/nodejs/node/pull/60131) +* \[[`79b2387fd9`](https://github.com/nodejs/node/commit/79b2387fd9)] - **vm**: make vm.Module.evaluate() conditionally synchronous (Joyee Cheung) [#60205](https://github.com/nodejs/node/pull/60205) +* \[[`e5559f3be3`](https://github.com/nodejs/node/commit/e5559f3be3)] - **win**: upgrade Visual Studio workload from 2019 to 2022 (Jiawen Geng) [#60318](https://github.com/nodejs/node/pull/60318) + ## 2025-10-15, Version 25.0.0 (Current), @RafaelGSS diff --git a/src/node_version.h b/src/node_version.h index 8698b9e1829ce5..c7f5bdd8a2cdb2 100644 --- a/src/node_version.h +++ b/src/node_version.h @@ -23,13 +23,13 @@ #define SRC_NODE_VERSION_H_ #define NODE_MAJOR_VERSION 25 -#define NODE_MINOR_VERSION 0 -#define NODE_PATCH_VERSION 1 +#define NODE_MINOR_VERSION 1 +#define NODE_PATCH_VERSION 0 #define NODE_VERSION_IS_LTS 0 #define NODE_VERSION_LTS_CODENAME "" -#define NODE_VERSION_IS_RELEASE 0 +#define NODE_VERSION_IS_RELEASE 1 #ifndef NODE_STRINGIFY #define NODE_STRINGIFY(n) NODE_STRINGIFY_HELPER(n)