test: setup unit tests for bun runtime (#7971)

**Motivation**

Make our codebase compatible with Bun runtime

**Description**

- Configure Vitest to work along Bun
- Add CI workflow to test Unit tests for Bun

**Steps to test or reproduce**

Run all tests
This commit is contained in:
Nazar Hussain
2025-07-21 13:35:25 +02:00
committed by GitHub
parent f3e21c7679
commit ce27087f34
16 changed files with 324 additions and 173 deletions

38
.github/workflows/test-bun.yml vendored Normal file
View File

@@ -0,0 +1,38 @@
name: Bun Tests
# only one can run at a time
concurrency:
# If PR, cancel prev commits. head_ref = source branch name on pull_request, null if push
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
on:
push:
# We intentionally don't run push on feature branches. See PR for rational.
branches: [unstable, stable]
pull_request:
workflow_dispatch:
jobs:
unit-tests-bun:
name: Unit Tests (Bun)
runs-on: buildjet-4vcpu-ubuntu-2204
steps:
- uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 22
cache: yarn
- uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- name: Install Yarn
run: bun install -g npm:yarn
- name: Install
run: yarn install --frozen-lockfile
- name: Build
run: yarn build
- name: Unit Tests
# These packages are not testable yet in Bun because of `@chainsafe/blst` dependency.
run: excluded=(beacon-node prover light-client cli); for pkg in packages/*/; do [[ ! " ${excluded[@]} " =~ " $(basename "$pkg") " ]] && echo "Testing $(basename "$pkg")" && (cd "$pkg" && bun run --bun test:unit); done
shell: bash

View File

@@ -2,10 +2,11 @@
import path from "node:path";
import {nodePolyfills} from "vite-plugin-node-polyfills";
import topLevelAwait from "vite-plugin-top-level-await";
import {defineProject} from "vitest/config";
import {blsBrowserPlugin} from "../scripts/vite/plugins/blsBrowserPlugin.js";
const isBun = "bun" in process.versions;
export const browserTestProject = defineProject({
test: {
name: "browser",
@@ -47,7 +48,10 @@ export const browserTestProject = defineProject({
},
},
plugins: [
topLevelAwait(),
// Bun does allow commonjs to be in pipeline and `vite-plugin-top-level-await` is using it
// So we convert it to the dynamic import so bun unit tests does not load these
// when the `import` called on top of the config file
...(isBun ? [] : [import("vite-plugin-top-level-await").then((p) => p.default())]),
blsBrowserPlugin(),
nodePolyfills({
include: ["buffer", "process", "util", "string_decoder", "url", "querystring", "events"],

View File

@@ -7,12 +7,19 @@ const setupFiles = [
path.join(import.meta.dirname, "../scripts/vitest/setupFiles/lodestarPreset.ts"),
];
const isBun = "bun" in process.versions;
export const unitTestMinimalProject = defineProject({
test: {
name: "unit-minimal",
include: ["**/test/unit-minimal/**/*.test.ts"],
setupFiles,
pool: "forks",
// Current vitest `forks` pool is not yet supported with Bun
// so we conditionally switch to our custom pool which run tests in main process
pool: isBun ? "vitest-in-process-pool" : "forks",
poolOptions: {
forks: isBun ? {singleFork: true} : {},
},
env: {
LODESTAR_PRESET: "minimal",
},
@@ -32,7 +39,12 @@ export const unitTestMainnetProject = defineProject({
// for now I tried to identify such tests an increase the limit a bit higher
testTimeout: 20_000,
hookTimeout: 20_000,
pool: "forks",
// Current vitest `forks` pool is not yet supported with Bun
// so we conditionally switch to our custom pool which run tests in main process
pool: isBun ? "vitest-in-process-pool" : "forks",
poolOptions: {
forks: isBun ? {singleFork: true} : {},
},
env: {
LODESTAR_PRESET: "mainnet",
},

View File

@@ -46,8 +46,8 @@
"@chainsafe/biomejs-config": "^0.1.2",
"@biomejs/biome": "^1.9.4",
"@types/node": "^20.12.8",
"@vitest/browser": "^3.0.6",
"@vitest/coverage-v8": "^3.0.6",
"@vitest/browser": "3.0.9",
"@vitest/coverage-v8": "3.0.9",
"crypto-browserify": "^3.12.0",
"dotenv": "^16.4.5",
"electron": "^26.2.2",
@@ -71,14 +71,16 @@
"vite-plugin-dts": "^4.5.0",
"vite-plugin-node-polyfills": "^0.23.0",
"vite-plugin-top-level-await": "^1.5.0",
"vitest": "^3.0.6",
"vitest-when": "^0.6.0",
"vitest": "3.0.9",
"vitest-in-process-pool": "2.0.1",
"vitest-when": "^0.6.1",
"wait-port": "^1.1.0",
"webdriverio": "^9.7.2"
},
"resolutions": {
"dns-over-http-resolver": "^2.1.1",
"loupe": "^2.3.6",
"testcontainers/**/nan": "^2.19.0"
"testcontainers/**/nan": "^2.19.0",
"vitest": "3.0.9"
}
}

View File

@@ -65,9 +65,9 @@
"@lodestar/utils": "^1.32.0",
"rimraf": "^4.4.1",
"snappyjs": "^0.7.0",
"vitest": "^3.0.6"
"vitest": "3.0.9"
},
"peerDependencies": {
"vitest": "^3.0.6"
"vitest": "3.0.9"
}
}

View File

@@ -19,7 +19,6 @@ import {
computeCommitteeCount,
computeEpochAtSlot,
createCachedBeaconState,
getActiveValidatorIndices,
interopSecretKey,
newFilledArray,
} from "../../src/index.js";
@@ -32,6 +31,7 @@ import {
CachedBeaconStatePhase0,
} from "../../src/types.js";
import {getNextSyncCommittee} from "../../src/util/syncCommittee.js";
import {getActiveValidatorIndices} from "../../src/util/validator.js";
import {interopPubkeysCached} from "../utils/interop.js";
let phase0State: BeaconStatePhase0 | null = null;

View File

@@ -2,7 +2,7 @@ import {createChainForkConfig} from "@lodestar/config";
import {MAX_DEPOSITS} from "@lodestar/params";
import {ssz} from "@lodestar/types";
import {describe, expect, it} from "vitest";
import {getEth1DepositCount} from "../../../src/index.js";
import {getEth1DepositCount} from "../../../src/util/deposit.js";
import {createCachedBeaconStateTest} from "../../utils/state.js";
describe("getEth1DepositCount", () => {

View File

@@ -44,6 +44,7 @@
"check-types": "tsc",
"lint": "biome check src/",
"lint:fix": "yarn run lint --write",
"test:unit": "echo 'No unit tests for @lodestar/test-utils'",
"check-readme": "typescript-docs-verifier"
},
"repository": {
@@ -64,12 +65,12 @@
"axios": "^1.3.4",
"testcontainers": "^10.2.1",
"tmp": "^0.2.1",
"vitest": "^3.0.6"
"vitest": "3.0.9"
},
"devDependencies": {
"@types/yargs": "^17.0.24"
},
"peerDependencies": {
"vitest": "^3.0.6"
"vitest": "3.0.9"
}
}

View File

@@ -48,6 +48,30 @@ export class FetchError extends Error {
super(`Request to ${url.toString()} timed out`);
this.type = "timeout";
this.code = "ERR_TIMEOUT";
}
// There are few incompatibilities related to `fetch` with NodeJS
// So we have to wrap those cases here explicitly
// https://github.com/oven-sh/bun/issues/20486
else if (isBunError(e) && e.code === "ConnectionRefused") {
super("TypeError: fetch failed");
this.type = "failed";
this.code = "ENOTFOUND";
this.cause = e as unknown as FetchErrorCause;
} else if (isBunError(e) && e.code === "ECONNRESET") {
super("TypeError: fetch failed");
this.type = "failed";
this.code = "UND_ERR_SOCKET";
this.cause = e as unknown as FetchErrorCause;
} else if (isBun && (e as Error).message.includes("protocol must be")) {
super("fetch failed");
this.type = "failed";
this.code = "ERR_FETCH_FAILED";
this.cause = e as unknown as FetchErrorCause;
} else if ((e as Error).message.includes("URL is invalid")) {
super("Failed to parse URL from invalid-url");
this.type = "input";
this.code = "ERR_INVALID_URL";
this.cause = e as unknown as FetchErrorCause;
} else {
super((e as Error).message);
this.type = "unknown";
@@ -154,3 +178,11 @@ function isNativeFetchAbortError(e: unknown): e is NativeFetchAbortError {
function isNativeFetchTimeoutError(e: unknown): e is NativeFetchTimeoutError {
return e instanceof DOMException && (e as NativeFetchTimeoutError).name === "TimeoutError";
}
const isBun = "bun" in process.versions;
type BunError = {code: string; path: string; errno: number; message: string};
function isBunError(e: unknown): e is BunError {
return isBun && typeof e === "object" && e !== null && "code" in e && "path" in e && "errno" in e && "message" in e;
}

View File

@@ -3,6 +3,8 @@ import http from "node:http";
import {afterEach, describe, expect, it} from "vitest";
import {FetchError, FetchErrorType, fetch} from "../../src/fetch.js";
const isBun = "bun" in process.versions;
describe("FetchError", () => {
const port = 37421;
const randomHex = crypto.randomBytes(32).toString("hex");
@@ -15,6 +17,7 @@ describe("FetchError", () => {
errorType: FetchErrorType;
errorCode: string;
expectCause: boolean;
skip?: string;
}[] = [
{
id: "Bad domain",
@@ -29,7 +32,9 @@ describe("FetchError", () => {
url: `http://localhost:${port + 1}`,
requestListener: (_req, res) => res.end(),
errorType: "failed",
errorCode: "ECONNREFUSED",
// In Bun runtime we cant differentiate if the connection was refused or domain was not found
// We get `Unable to connect. Is the computer able to access the url?` error with code `ConnectionRefused`
errorCode: isBun ? "ENOTFOUND" : "ECONNREFUSED",
expectCause: true,
},
{
@@ -48,6 +53,7 @@ describe("FetchError", () => {
errorType: "failed",
errorCode: "UND_ERR_HEADERS_OVERFLOW",
expectCause: true,
skip: isBun ? "Header overflow is not supported in Bun runtime" : undefined,
},
{
id: "Unknown scheme",
@@ -100,7 +106,9 @@ describe("FetchError", () => {
for (const testCase of testCases) {
const {id, url = `http://localhost:${port}`, requestListener, signalHandler} = testCase;
it(id, async () => {
it(id, async ({skip}) => {
if (testCase.skip) return skip(testCase.skip);
if (requestListener) {
const server = http.createServer(requestListener);
await new Promise<void>((resolve) => server.listen(port, resolve));

View File

@@ -5,7 +5,7 @@ import {ChainConfig, createChainForkConfig} from "@lodestar/config";
import {config as defaultConfig} from "@lodestar/config/default";
import {ForkName} from "@lodestar/params";
import {ssz} from "@lodestar/types";
import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest";
import {afterEach, beforeEach, describe, expect, it, vi} from "vitest";
import {AttestationService, AttestationServiceOpts} from "../../../src/services/attestation.js";
import {AttDutyAndProof} from "../../../src/services/attestationDuties.js";
import {ChainHeaderTracker} from "../../../src/services/chainHeaderTracker.js";
@@ -25,27 +25,33 @@ vi.mock("../../../src/services/syncingStatusTracker.js");
describe("AttestationService", () => {
const api = getApiClientStub();
// @ts-expect-error - Mocked class don't need parameters
const validatorStore = vi.mocked(new ValidatorStore());
const validatorStore = vi.mocked(new ValidatorStore({}, {defaultConfig: {}}));
const emitter = vi.mocked(new ValidatorEventEmitter());
// @ts-expect-error - Mocked class don't need parameters
const chainHeadTracker = vi.mocked(new ChainHeaderTracker());
// @ts-expect-error - Mocked class don't need parameters
const syncingStatusTracker = vi.mocked(new SyncingStatusTracker());
const syncingStatusTracker = vi.mocked(new SyncingStatusTracker({}, api, new ClockMock(), null));
let pubkeys: Uint8Array[]; // Initialize pubkeys in before() so bls is already initialized
beforeAll(() => {
const secretKeys = Array.from({length: 1}, (_, i) => SecretKey.fromBytes(Buffer.alloc(32, i + 1)));
pubkeys = secretKeys.map((sk) => sk.toPublicKey().toBytes());
validatorStore.votingPubkeys.mockReturnValue(pubkeys.map(toHexString));
validatorStore.hasVotingPubkey.mockReturnValue(true);
validatorStore.hasSomeValidators.mockReturnValue(true);
validatorStore.signAttestationSelectionProof.mockResolvedValue(ZERO_HASH);
});
let controller: AbortController; // To stop clock
beforeEach(() => {
controller = new AbortController();
const secretKeys = Array.from({length: 1}, (_, i) => SecretKey.fromBytes(Buffer.alloc(32, i + 1)));
pubkeys = secretKeys.map((sk) => sk.toPublicKey().toBytes());
// vi.mock does not automock all objects in Bun runtime, so we have to explicitly spy on needed methods
vi.spyOn(validatorStore, "votingPubkeys");
vi.spyOn(validatorStore, "hasVotingPubkey");
vi.spyOn(validatorStore, "hasSomeValidators");
vi.spyOn(validatorStore, "signAttestationSelectionProof");
vi.spyOn(validatorStore, "signAttestation");
vi.spyOn(validatorStore, "signAggregateAndProof");
validatorStore.votingPubkeys.mockReturnValue(pubkeys.map(toHexString));
validatorStore.hasVotingPubkey.mockReturnValue(true);
validatorStore.hasSomeValidators.mockReturnValue(true);
validatorStore.signAttestationSelectionProof.mockResolvedValue(ZERO_HASH);
});
afterEach(() => {
controller.abort();

View File

@@ -6,7 +6,7 @@ import {config as mainnetConfig} from "@lodestar/config/default";
import {ForkName} from "@lodestar/params";
import {ProducedBlockSource, ssz} from "@lodestar/types";
import {sleep} from "@lodestar/utils";
import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest";
import {afterEach, beforeEach, describe, expect, it, vi} from "vitest";
import {BlockProposingService} from "../../../src/services/block.js";
import {ValidatorStore} from "../../../src/services/validatorStore.js";
import {getApiClientStub, mockApiResponse} from "../../utils/apiStub.js";
@@ -19,20 +19,27 @@ vi.mock("../../../src/services/validatorStore.js");
describe("BlockDutiesService", () => {
const api = getApiClientStub();
// @ts-expect-error - Mocked class don't need parameters
const validatorStore = vi.mocked(new ValidatorStore());
const validatorStore = vi.mocked(new ValidatorStore({}, {defaultConfig: {}}));
let pubkeys: Uint8Array[]; // Initialize pubkeys in before() so bls is already initialized
const config = createChainForkConfig(mainnetConfig);
beforeAll(() => {
const secretKeys = Array.from({length: 2}, (_, i) => SecretKey.fromBytes(Buffer.alloc(32, i + 1)));
pubkeys = secretKeys.map((sk) => sk.toPublicKey().toBytes());
validatorStore.votingPubkeys.mockReturnValue(pubkeys.map(toHexString));
});
let controller: AbortController; // To stop clock
beforeEach(() => {
controller = new AbortController();
const secretKeys = Array.from({length: 2}, (_, i) => SecretKey.fromBytes(Buffer.alloc(32, i + 1)));
pubkeys = secretKeys.map((sk) => sk.toPublicKey().toBytes());
// vi.mock does not automock all objects in Bun runtime, so we have to explicitly spy on needed methods
vi.spyOn(validatorStore, "votingPubkeys");
vi.spyOn(validatorStore, "signRandao");
vi.spyOn(validatorStore, "signBlock");
vi.spyOn(validatorStore, "getBuilderSelectionParams");
vi.spyOn(validatorStore, "getGraffiti");
vi.spyOn(validatorStore, "getFeeRecipient");
vi.spyOn(validatorStore, "strictFeeRecipientCheck");
validatorStore.votingPubkeys.mockReturnValue(pubkeys.map(toHexString));
});
afterEach(() => controller.abort());

View File

@@ -2,10 +2,10 @@ import {SecretKey} from "@chainsafe/blst";
import {createChainForkConfig} from "@lodestar/config";
import {chainConfig} from "@lodestar/config/default";
import {toBufferBE} from "bigint-buffer";
import {MockedFunction, afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest";
import {MockInstance, afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest";
import {ExternalSignerOptions, pollExternalSignerPubkeys} from "../../../src/services/externalSignerSync.js";
import {SignerRemote, SignerType, ValidatorStore} from "../../../src/services/validatorStore.js";
import {externalSignerGetKeys} from "../../../src/util/externalSignerClient.js";
import * as externalSignerClient from "../../../src/util/externalSignerClient.js";
import {getApiClientStub} from "../../utils/apiStub.js";
import {loggerVc} from "../../utils/logger.js";
import {initValidatorStore} from "../../utils/validatorStore.js";
@@ -27,13 +27,14 @@ describe("External signer sync", () => {
let pubkeys: string[];
let secretKeys: SecretKey[];
let externalSignerGetKeysStub: MockedFunction<typeof externalSignerGetKeys>;
let externalSignerGetKeysStub: MockInstance<typeof externalSignerClient.externalSignerGetKeys>;
beforeAll(() => {
vi.useFakeTimers();
secretKeys = Array.from({length: 3}, (_, i) => SecretKey.fromBytes(toBufferBE(BigInt(i + 1), 32)));
pubkeys = secretKeys.map((sk) => sk.toPublicKey().toHex());
externalSignerGetKeysStub = vi.mocked(externalSignerGetKeys);
// vi.mock does not automock all objects in Bun runtime, so we have to explicitly spy on needed methods
externalSignerGetKeysStub = vi.spyOn(externalSignerClient, "externalSignerGetKeys");
});
let validatorStore: ValidatorStore;

View File

@@ -4,7 +4,7 @@ import {routes} from "@lodestar/api";
import {createChainForkConfig} from "@lodestar/config";
import {config as mainnetConfig} from "@lodestar/config/default";
import {ssz} from "@lodestar/types";
import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest";
import {afterEach, beforeEach, describe, expect, it, vi} from "vitest";
import {ChainHeaderTracker} from "../../../src/services/chainHeaderTracker.js";
import {ValidatorEventEmitter} from "../../../src/services/emitter.js";
import {SyncCommitteeService, SyncCommitteeServiceOpts} from "../../../src/services/syncCommittee.js";
@@ -24,12 +24,12 @@ vi.mock("../../../src/services/syncingStatusTracker.js");
describe("SyncCommitteeService", () => {
const api = getApiClientStub();
// @ts-expect-error - Mocked class don't need parameters
const validatorStore = vi.mocked(new ValidatorStore());
const validatorStore = vi.mocked(new ValidatorStore({}, {defaultConfig: {}}));
const emitter = vi.mocked(new ValidatorEventEmitter());
// @ts-expect-error - Mocked class don't need parameters
const chainHeaderTracker = vi.mocked(new ChainHeaderTracker());
// @ts-expect-error - Mocked class don't need parameters
const syncingStatusTracker = vi.mocked(new SyncingStatusTracker());
const syncingStatusTracker = vi.mocked(new SyncingStatusTracker({}, api, new ClockMock(), null));
let pubkeys: Uint8Array[]; // Initialize pubkeys in before() so bls is already initialized
const config = createChainForkConfig({
@@ -38,19 +38,27 @@ describe("SyncCommitteeService", () => {
ALTAIR_FORK_EPOCH: 0, // Activate Altair immediately
});
beforeAll(() => {
let controller: AbortController; // To stop clock
beforeEach(() => {
controller = new AbortController();
const secretKeys = Array.from({length: 1}, (_, i) => SecretKey.fromBytes(Buffer.alloc(32, i + 1)));
pubkeys = secretKeys.map((sk) => sk.toPublicKey().toBytes());
// vi.mock does not automock all objects in Bun runtime, so we have to explicitly spy on needed methods
vi.spyOn(validatorStore, "votingPubkeys");
vi.spyOn(validatorStore, "hasVotingPubkey");
vi.spyOn(validatorStore, "hasSomeValidators");
vi.spyOn(validatorStore, "signAttestationSelectionProof");
vi.spyOn(validatorStore, "signSyncCommitteeSignature");
vi.spyOn(validatorStore, "signContributionAndProof");
vi.spyOn(chainHeaderTracker, "getCurrentChainHead");
validatorStore.votingPubkeys.mockReturnValue(pubkeys.map(toHexString));
validatorStore.hasVotingPubkey.mockReturnValue(true);
validatorStore.hasSomeValidators.mockReturnValue(true);
validatorStore.signAttestationSelectionProof.mockResolvedValue(ZERO_HASH);
});
let controller: AbortController; // To stop clock
beforeEach(() => {
controller = new AbortController();
});
afterEach(() => {
controller.abort();
vi.resetAllMocks();

View File

@@ -1,11 +1,21 @@
import path from "node:path";
import {defineConfig} from "vitest/config";
import {ViteUserConfig, defineConfig} from "vitest/config";
import {browserTestProject} from "./configs/vitest.config.browser.js";
import {e2eMainnetProject, e2eMinimalProject} from "./configs/vitest.config.e2e.js";
import {specProjectMainnet, specProjectMinimal} from "./configs/vitest.config.spec.js";
import {typesTestProject} from "./configs/vitest.config.types.js";
import {unitTestMainnetProject, unitTestMinimalProject} from "./configs/vitest.config.unit.js";
const isBun = "bun" in process.versions;
export function getReporters(): ViteUserConfig["test"]["reporters"] {
if (isBun) return [["default", {summary: false}]];
if (process.env.GITHUB_ACTIONS) return ["verbose", "hanging-process", "github-actions"];
if (process.env.TEST_COMPACT_OUTPUT) return ["basic", "hanging-process"];
return ["verbose", "hanging-process"];
}
export default defineConfig({
test: {
workspace: [
@@ -60,9 +70,7 @@ export default defineConfig({
teardownTimeout: 5_000,
// We have a few spec tests suits (specially spec tests) which don't have individual tests
passWithNoTests: true,
reporters: process.env.GITHUB_ACTIONS
? ["verbose", "hanging-process", "github-actions"]
: [process.env.TEST_COMPACT_OUTPUT ? "basic" : "verbose", "hanging-process"],
reporters: getReporters(),
diff: process.env.TEST_COMPACT_DIFF
? path.join(import.meta.dirname, "../scripts/vitest/vitest.diff.ts")
: undefined,

262
yarn.lock
View File

@@ -1671,37 +1671,36 @@
integrity sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==
"@inquirer/confirm@^5.0.0":
version "5.1.3"
resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.3.tgz#c1ad57663f54758981811ccb86f823072ddf5c1a"
integrity sha512-fuF9laMmHoOgWapF9h9hv6opA5WvmGFHsTYGCmuFxcghIhEhb3dN0CdQR4BUMqa2H506NCj8cGX4jwMsE4t6dA==
version "5.1.12"
resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.12.tgz#387037889a5a558ceefe52e978228630aa6e7d0e"
integrity sha512-dpq+ielV9/bqgXRUbNH//KsY6WEw9DrGPmipkpmgC1Y46cwuBTNx7PXFWTjc3MQ+urcc0QxoVHcMI0FW4Ok0hg==
dependencies:
"@inquirer/core" "^10.1.4"
"@inquirer/type" "^3.0.2"
"@inquirer/core" "^10.1.13"
"@inquirer/type" "^3.0.7"
"@inquirer/core@^10.1.4":
version "10.1.4"
resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.1.4.tgz#02394e68d894021935caca0d10fc68fd4f3a3ead"
integrity sha512-5y4/PUJVnRb4bwWY67KLdebWOhOc7xj5IP2J80oWXa64mVag24rwQ1VAdnj7/eDY/odhguW0zQ1Mp1pj6fO/2w==
"@inquirer/core@^10.1.13":
version "10.1.13"
resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.1.13.tgz#8f1ecfaba288fd2d705c7ac0690371464cf687b0"
integrity sha512-1viSxebkYN2nJULlzCxES6G9/stgHSepZ9LqqfdIGPHj5OHhiBUXVS0a6R0bEC2A+VL4D9w6QB66ebCr6HGllA==
dependencies:
"@inquirer/figures" "^1.0.9"
"@inquirer/type" "^3.0.2"
"@inquirer/figures" "^1.0.12"
"@inquirer/type" "^3.0.7"
ansi-escapes "^4.3.2"
cli-width "^4.1.0"
mute-stream "^2.0.0"
signal-exit "^4.1.0"
strip-ansi "^6.0.1"
wrap-ansi "^6.2.0"
yoctocolors-cjs "^2.1.2"
"@inquirer/figures@^1.0.9":
version "1.0.9"
resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.9.tgz#9d8128f8274cde4ca009ca8547337cab3f37a4a3"
integrity sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==
"@inquirer/figures@^1.0.12":
version "1.0.12"
resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.12.tgz#667d6254cc7ba3b0c010a323d78024a1d30c6053"
integrity sha512-MJttijd8rMFcKJC8NYmprWr6hD3r9Gd9qUC0XwPNwoEPWSMVJwA2MlXxF+nhZZNMY+HXsWa+o7KY2emWYIn0jQ==
"@inquirer/type@^3.0.2":
version "3.0.2"
resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.2.tgz#baff9f8d70947181deb36772cd9a5b6876d3e60c"
integrity sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==
"@inquirer/type@^3.0.7":
version "3.0.7"
resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.7.tgz#b46bcf377b3172dbc768fdbd053e6492ad801a09"
integrity sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==
"@isaacs/cliui@^8.0.2":
version "8.0.2"
@@ -2173,10 +2172,10 @@
resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz#d4f6937353bc4568292654efb0a0e0532adbcba2"
integrity sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==
"@mswjs/interceptors@^0.37.0":
version "0.37.5"
resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.37.5.tgz#9ce40c56be02b43fcbdb51b63f47e69fc4aaabe6"
integrity sha512-AAwRb5vXFcY4L+FvZ7LZusDuZ0vEe0Zm8ohn1FM6/X7A3bj4mqmkAcGRWuvC2JwSygNwHAAmMnAI73vPHeqsHA==
"@mswjs/interceptors@^0.39.1":
version "0.39.2"
resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.39.2.tgz#de9de0ab23f99d387c7904df7219a92157d1d666"
integrity sha512-RuzCup9Ct91Y7V79xwCb146RaBRHZ7NBbrIUySumd1rpKqHL5OonaqrGIbug5hNwP/fRyxFMA6ISgw4FTtYFYg==
dependencies:
"@open-draft/deferred-promise" "^2.2.0"
"@open-draft/logger" "^0.3.0"
@@ -3621,9 +3620,9 @@
"@types/ssh2-streams" "*"
"@types/statuses@^2.0.4":
version "2.0.5"
resolved "https://registry.yarnpkg.com/@types/statuses/-/statuses-2.0.5.tgz#f61ab46d5352fd73c863a1ea4e1cef3b0b51ae63"
integrity sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==
version "2.0.6"
resolved "https://registry.yarnpkg.com/@types/statuses/-/statuses-2.0.6.tgz#66748315cc9a96d63403baa8671b2c124f8633aa"
integrity sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==
"@types/strip-bom@^3.0.0":
version "3.0.0"
@@ -3696,25 +3695,25 @@
dependencies:
"@types/node" "*"
"@vitest/browser@^3.0.6":
version "3.0.6"
resolved "https://registry.yarnpkg.com/@vitest/browser/-/browser-3.0.6.tgz#8e3247b83712dee64d364a249178b91b1a169950"
integrity sha512-FqKwCAkALZfNzGNx4YvRJa6HCWM2USWTjOdNO2egI/s6+3WkIl4xAlYISOARLJLDAI3yCXcpTtuUUF39K8TQgw==
"@vitest/browser@3.0.9":
version "3.0.9"
resolved "https://registry.yarnpkg.com/@vitest/browser/-/browser-3.0.9.tgz#9927bbd5923341cf83e56508215b614110728c6a"
integrity sha512-P9dcCeMkA3/oYGfUzRFZJLZxiOpApztxhPsQDUiZzAzLoZonWhse2+vPB0xEBP8Q0lX1WCEEmtY7HzBRi4oYBA==
dependencies:
"@testing-library/dom" "^10.4.0"
"@testing-library/user-event" "^14.6.1"
"@vitest/mocker" "3.0.6"
"@vitest/utils" "3.0.6"
"@vitest/mocker" "3.0.9"
"@vitest/utils" "3.0.9"
magic-string "^0.30.17"
msw "^2.7.0"
msw "^2.7.3"
sirv "^3.0.1"
tinyrainbow "^2.0.0"
ws "^8.18.0"
ws "^8.18.1"
"@vitest/coverage-v8@^3.0.6":
version "3.0.6"
resolved "https://registry.yarnpkg.com/@vitest/coverage-v8/-/coverage-v8-3.0.6.tgz#a8ba832ad8b5371a160869bce87424aa4f582f5e"
integrity sha512-JRTlR8Bw+4BcmVTICa7tJsxqphAktakiLsAmibVLAWbu1lauFddY/tXeM6sAyl1cgkPuXtpnUgaCPhTdz1Qapg==
"@vitest/coverage-v8@3.0.9":
version "3.0.9"
resolved "https://registry.yarnpkg.com/@vitest/coverage-v8/-/coverage-v8-3.0.9.tgz#279f54b54e0096ce23fd10dba52087165899b654"
integrity sha512-15OACZcBtQ34keIEn19JYTVuMFTlFrClclwWjHo/IRPg/8ELpkgNTl0o7WLP9WO9XGH6+tip9CPYtEOrIDJvBA==
dependencies:
"@ampproject/remapping" "^2.3.0"
"@bcoe/v8-coverage" "^1.0.2"
@@ -3729,22 +3728,22 @@
test-exclude "^7.0.1"
tinyrainbow "^2.0.0"
"@vitest/expect@3.0.6":
version "3.0.6"
resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-3.0.6.tgz#30993c0841203d2243826ee04fb25463eb86e20d"
integrity sha512-zBduHf/ja7/QRX4HdP1DSq5XrPgdN+jzLOwaTq/0qZjYfgETNFCKf9nOAp2j3hmom3oTbczuUzrzg9Hafh7hNg==
"@vitest/expect@3.0.9":
version "3.0.9"
resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-3.0.9.tgz#b0cb9cd798a131423097cc5a777b699675405fcf"
integrity sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==
dependencies:
"@vitest/spy" "3.0.6"
"@vitest/utils" "3.0.6"
"@vitest/spy" "3.0.9"
"@vitest/utils" "3.0.9"
chai "^5.2.0"
tinyrainbow "^2.0.0"
"@vitest/mocker@3.0.6":
version "3.0.6"
resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-3.0.6.tgz#28287cfdc06a8b0318344e5c240d774e43014cd0"
integrity sha512-KPztr4/tn7qDGZfqlSPQoF2VgJcKxnDNhmfR3VgZ6Fy1bO8T9Fc1stUiTXtqz0yG24VpD00pZP5f8EOFknjNuQ==
"@vitest/mocker@3.0.9":
version "3.0.9"
resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-3.0.9.tgz#75d176745131caf40810d3a3a73491595fce46e6"
integrity sha512-ryERPIBOnvevAkTq+L1lD+DTFBRcjueL9lOUfXsLfwP92h4e+Heb+PjiqS3/OURWPtywfafK0kj++yDFjWUmrA==
dependencies:
"@vitest/spy" "3.0.6"
"@vitest/spy" "3.0.9"
estree-walker "^3.0.3"
magic-string "^0.30.17"
@@ -3755,19 +3754,26 @@
dependencies:
tinyrainbow "^1.2.0"
"@vitest/pretty-format@3.0.6", "@vitest/pretty-format@^3.0.6":
version "3.0.6"
resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-3.0.6.tgz#a828569818b666a6e955c9af8129e6b0d2968ee6"
integrity sha512-Zyctv3dbNL+67qtHfRnUE/k8qxduOamRfAL1BurEIQSyOEFffoMvx2pnDSSbKAAVxY0Ej2J/GH2dQKI0W2JyVg==
"@vitest/pretty-format@3.0.9":
version "3.0.9"
resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-3.0.9.tgz#d9c88fe64b4edcdbc88e5bd92c39f9cc8d40930d"
integrity sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==
dependencies:
tinyrainbow "^2.0.0"
"@vitest/runner@3.0.6":
version "3.0.6"
resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-3.0.6.tgz#a07b54674b1a495424f2ea959a28a6096c17c33b"
integrity sha512-JopP4m/jGoaG1+CBqubV/5VMbi7L+NQCJTu1J1Pf6YaUbk7bZtaq5CX7p+8sY64Sjn1UQ1XJparHfcvTTdu9cA==
"@vitest/pretty-format@^3.0.9":
version "3.2.3"
resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-3.2.3.tgz#ddd30f689fdd8191dbfd0cce8ae769e5de6b7f23"
integrity sha512-yFglXGkr9hW/yEXngO+IKMhP0jxyFw2/qys/CK4fFUZnSltD+MU7dVYGrH8rvPcK/O6feXQA+EU33gjaBBbAng==
dependencies:
"@vitest/utils" "3.0.6"
tinyrainbow "^2.0.0"
"@vitest/runner@3.0.9":
version "3.0.9"
resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-3.0.9.tgz#92b7f37f65825105dbfdc07196b90dd8c20547d8"
integrity sha512-NX9oUXgF9HPfJSwl8tUZCMP1oGx2+Sf+ru6d05QjzQz4OwWg0psEzwY6VexP2tTHWdOkhKHUIZH+fS6nA7jfOw==
dependencies:
"@vitest/utils" "3.0.9"
pathe "^2.0.3"
"@vitest/runner@^2.1.8":
@@ -3778,19 +3784,19 @@
"@vitest/utils" "2.1.8"
pathe "^1.1.2"
"@vitest/snapshot@3.0.6":
version "3.0.6"
resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-3.0.6.tgz#e962319e487b2e8da7ad39322b5e0b39ea639d7a"
integrity sha512-qKSmxNQwT60kNwwJHMVwavvZsMGXWmngD023OHSgn873pV0lylK7dwBTfYP7e4URy5NiBCHHiQGA9DHkYkqRqg==
"@vitest/snapshot@3.0.9":
version "3.0.9"
resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-3.0.9.tgz#2ab878b3590b2daef1798b645a9d9e72a0eb258d"
integrity sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==
dependencies:
"@vitest/pretty-format" "3.0.6"
"@vitest/pretty-format" "3.0.9"
magic-string "^0.30.17"
pathe "^2.0.3"
"@vitest/spy@3.0.6":
version "3.0.6"
resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-3.0.6.tgz#3a50ec0ab11e8f729cdaa938a6d271b12547cea1"
integrity sha512-HfOGx/bXtjy24fDlTOpgiAEJbRfFxoX3zIGagCqACkFKKZ/TTOE6gYMKXlqecvxEndKFuNHcHqP081ggZ2yM0Q==
"@vitest/spy@3.0.9":
version "3.0.9"
resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-3.0.9.tgz#c3e5d47ceff7c1cb9fdfb9b2f168056bbc625534"
integrity sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==
dependencies:
tinyspy "^3.0.2"
@@ -3803,12 +3809,12 @@
loupe "^3.1.2"
tinyrainbow "^1.2.0"
"@vitest/utils@3.0.6":
version "3.0.6"
resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-3.0.6.tgz#be4246ab46a076db1e49b9e0479bdd9a7f65782f"
integrity sha512-18ktZpf4GQFTbf9jK543uspU03Q2qya7ZGya5yiZ0Gx0nnnalBvd5ZBislbl2EhLjM8A8rt4OilqKG7QwcGkvQ==
"@vitest/utils@3.0.9":
version "3.0.9"
resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-3.0.9.tgz#15da261d8cacd6035dc28a8d3ba38ee39545f82b"
integrity sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==
dependencies:
"@vitest/pretty-format" "3.0.6"
"@vitest/pretty-format" "3.0.9"
loupe "^3.1.3"
tinyrainbow "^2.0.0"
@@ -6167,9 +6173,9 @@ es-abstract@^1.18.0-next.2, es-abstract@^1.22.1:
which-typed-array "^1.1.13"
es-module-lexer@^1.6.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.6.0.tgz#da49f587fd9e68ee2404fe4e256c0c7d3a81be21"
integrity sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==
version "1.7.0"
resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz#9159601561880a85f2734560a9099b2c31e5372a"
integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==
es-set-tostringtag@^2.0.1:
version "2.0.1"
@@ -6426,9 +6432,9 @@ execa@^5.0.0:
strip-final-newline "^2.0.0"
expect-type@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.1.0.tgz#a146e414250d13dfc49eafcfd1344a4060fa4c75"
integrity sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==
version "1.2.1"
resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.2.1.tgz#af76d8b357cf5fa76c41c09dafb79c549e75f71f"
integrity sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==
exponential-backoff@^3.1.1:
version "3.1.1"
@@ -7160,9 +7166,9 @@ grapheme-splitter@^1.0.4:
integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==
graphql@^16.8.1:
version "16.9.0"
resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.9.0.tgz#1c310e63f16a49ce1fbb230bd0a000e99f6f115f"
integrity sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==
version "16.11.0"
resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.11.0.tgz#96d17f66370678027fdf59b2d4c20b4efaa8a633"
integrity sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==
handlebars@^4.7.7:
version "4.7.7"
@@ -9100,7 +9106,7 @@ micro-ftch@^0.3.1:
resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f"
integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==
micromatch@^4.0.4:
micromatch@^4.0.4, micromatch@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
@@ -9432,16 +9438,16 @@ ms@^3.0.0-canary.1:
resolved "https://registry.yarnpkg.com/ms/-/ms-3.0.0-canary.1.tgz#c7b34fbce381492fd0b345d1cf56e14d67b77b80"
integrity sha512-kh8ARjh8rMN7Du2igDRO9QJnqCb2xYTJxyQYK7vJJS4TvLLmsbyhiKpSW+t+y26gyOyMd0riphX0GeWKU3ky5g==
msw@^2.7.0:
version "2.7.0"
resolved "https://registry.yarnpkg.com/msw/-/msw-2.7.0.tgz#d13ff87f7e018fc4c359800ff72ba5017033fb56"
integrity sha512-BIodwZ19RWfCbYTxWTUfTXc+sg4OwjCAgxU1ZsgmggX/7S3LdUifsbUPJs61j0rWb19CZRGY5if77duhc0uXzw==
msw@^2.7.3:
version "2.10.2"
resolved "https://registry.yarnpkg.com/msw/-/msw-2.10.2.tgz#e7a56ed0b6865b00a30b4c4a5b59e5388fd48315"
integrity sha512-RCKM6IZseZQCWcSWlutdf590M8nVfRHG1ImwzOtwz8IYxgT4zhUO0rfTcTvDGiaFE0Rhcc+h43lcF3Jc9gFtwQ==
dependencies:
"@bundled-es-modules/cookie" "^2.0.1"
"@bundled-es-modules/statuses" "^1.0.1"
"@bundled-es-modules/tough-cookie" "^0.1.6"
"@inquirer/confirm" "^5.0.0"
"@mswjs/interceptors" "^0.37.0"
"@mswjs/interceptors" "^0.39.1"
"@open-draft/deferred-promise" "^2.2.0"
"@open-draft/until" "^2.1.0"
"@types/cookie" "^0.6.0"
@@ -11759,15 +11765,20 @@ stackback@0.0.2:
resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b"
integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==
statuses@2.0.1, statuses@^2.0.1:
statuses@2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
statuses@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382"
integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==
std-env@^3.8.0:
version "3.8.0"
resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.8.0.tgz#b56ffc1baf1a29dcc80a3bdf11d7fca7c315e7d5"
integrity sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==
version "3.9.0"
resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.9.0.tgz#1a6f7243b339dca4c9fd55e1c7504c77ef23e8f1"
integrity sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==
stdin-discarder@^0.1.0:
version "0.1.0"
@@ -12272,9 +12283,9 @@ tinyexec@^0.3.2:
integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==
tinypool@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.0.2.tgz#706193cc532f4c100f66aa00b01c42173d9051b2"
integrity sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==
version "1.1.1"
resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.1.1.tgz#059f2d042bd37567fbc017d3d426bdd2a2612591"
integrity sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==
tinyrainbow@^1.2.0:
version "1.2.0"
@@ -12541,9 +12552,9 @@ type-fest@^3.0.0:
integrity sha512-f9BHrLjRJ4MYkfOsnC/53PNDzZJcVo14MqLp2+hXE39p5bgwqohxR5hDZztwxlbxmIVuvC2EFAKrAkokq23PLA==
type-fest@^4.26.1:
version "4.33.0"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.33.0.tgz#2da0c135b9afa76cf8b18ecfd4f260ecd414a432"
integrity sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g==
version "4.41.0"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.41.0.tgz#6ae1c8e5731273c2bf1f58ad39cbae2c91a46c58"
integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==
typed-array-buffer@^1.0.0:
version "1.0.0"
@@ -12872,10 +12883,10 @@ validate-npm-package-name@^3.0.0:
dependencies:
builtins "^1.0.3"
vite-node@3.0.6:
version "3.0.6"
resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-3.0.6.tgz#a68c06c08e95c9a83f21993eabb17e0398804b1b"
integrity sha512-s51RzrTkXKJrhNbUzQRsarjmAae7VmMPAsRT7lppVpIg6mK3zGthP9Hgz0YQQKuNcF+Ii7DfYk3Fxz40jRmePw==
vite-node@3.0.9:
version "3.0.9"
resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-3.0.9.tgz#97d0b062d3857fb8eaeb6cc6a1d400f847d4a15d"
integrity sha512-w3Gdx7jDcuT9cNn9jExXgOyKmf5UOTb6WMHz8LGAm54eS1Elf5OuBhCxl6zJxGhEeIkgsE1WbHuoL0mj/UXqXg==
dependencies:
cac "^6.7.14"
debug "^4.4.0"
@@ -12926,25 +12937,33 @@ vite-plugin-top-level-await@^1.5.0:
optionalDependencies:
fsevents "~2.3.3"
vitest-when@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/vitest-when/-/vitest-when-0.6.0.tgz#2944c1cc24b90623e8603b4539eafab8978def09"
integrity sha512-t6RbY1ZYj7ndrlvVPUSbt+SCQkBTET8nyvCqXsaTzGFuRHjoA0qFMmu5qGcJjn/8s9RCjB7od5TOKHezpHE2ow==
vitest-in-process-pool@2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/vitest-in-process-pool/-/vitest-in-process-pool-2.0.1.tgz#b0ffa19df37355ac3cbc96b3a74117129301fd56"
integrity sha512-McquSa/McP22Z4l09PwFAWfERwSa0ogXf78FDBQ2tuXE6qvPj2y5UbTNYwBQG3QtnTUdMDjutoF/zehRRGMF8A==
dependencies:
micromatch "^4.0.8"
vitest "^3.0.6"
vitest-when@^0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/vitest-when/-/vitest-when-0.6.1.tgz#86c0123e80d1d9addfa878733a8881b72f03b24c"
integrity sha512-KLMQaRuMBBpc6xQeDsYi69ypBBU4p9hUq388xq/b/d0xL6+6f9PmOxMs1K1iofqV3Kl8JWV9ym8S/V1oIN6wzg==
dependencies:
pretty-format "^29.7.0"
vitest@^3.0.6:
version "3.0.6"
resolved "https://registry.yarnpkg.com/vitest/-/vitest-3.0.6.tgz#2fd1571a3cc1fa1648e29af73ff2dc85872f3a69"
integrity sha512-/iL1Sc5VeDZKPDe58oGK4HUFLhw6b5XdY1MYawjuSaDA4sEfYlY9HnS6aCEG26fX+MgUi7MwlduTBHHAI/OvMA==
vitest@3.0.9, vitest@^3.0.6:
version "3.0.9"
resolved "https://registry.yarnpkg.com/vitest/-/vitest-3.0.9.tgz#8cf607d27dcaa12b9f21111f001a4e3e92511ba5"
integrity sha512-BbcFDqNyBlfSpATmTtXOAOj71RNKDDvjBM/uPfnxxVGrG+FSH2RQIwgeEngTaTkuU/h0ScFvf+tRcKfYXzBybQ==
dependencies:
"@vitest/expect" "3.0.6"
"@vitest/mocker" "3.0.6"
"@vitest/pretty-format" "^3.0.6"
"@vitest/runner" "3.0.6"
"@vitest/snapshot" "3.0.6"
"@vitest/spy" "3.0.6"
"@vitest/utils" "3.0.6"
"@vitest/expect" "3.0.9"
"@vitest/mocker" "3.0.9"
"@vitest/pretty-format" "^3.0.9"
"@vitest/runner" "3.0.9"
"@vitest/snapshot" "3.0.9"
"@vitest/spy" "3.0.9"
"@vitest/utils" "3.0.9"
chai "^5.2.0"
debug "^4.4.0"
expect-type "^1.1.0"
@@ -12956,7 +12975,7 @@ vitest@^3.0.6:
tinypool "^1.0.2"
tinyrainbow "^2.0.0"
vite "^5.0.0 || ^6.0.0"
vite-node "3.0.6"
vite-node "3.0.9"
why-is-node-running "^2.3.0"
vm-browserify@^1.0.1:
@@ -13546,7 +13565,12 @@ ws@^8.14.2, ws@^8.8.1:
resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4"
integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==
ws@^8.18.0, ws@^8.8.0:
ws@^8.18.1:
version "8.18.2"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.2.tgz#42738b2be57ced85f46154320aabb51ab003705a"
integrity sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==
ws@^8.8.0:
version "8.18.0"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc"
integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==