mirror of
https://github.com/ChainSafe/lodestar.git
synced 2026-01-09 15:48:08 -05:00
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:
38
.github/workflows/test-bun.yml
vendored
Normal file
38
.github/workflows/test-bun.yml
vendored
Normal 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
|
||||
@@ -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"],
|
||||
|
||||
@@ -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",
|
||||
},
|
||||
|
||||
12
package.json
12
package.json
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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", () => {
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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());
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
262
yarn.lock
@@ -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==
|
||||
|
||||
Reference in New Issue
Block a user