diff --git a/.github/workflows/codspeed.yml b/.github/workflows/codspeed.yml index 4e90e3a9..4fbcd0d6 100644 --- a/.github/workflows/codspeed.yml +++ b/.github/workflows/codspeed.yml @@ -61,5 +61,6 @@ jobs: with: # Only tinybench supports walltime for now run: | - pnpm moon run tinybench-plugin:bench + pnpm moon run --concurrency 1 :bench pnpm --workspace-concurrency 1 -r bench-tinybench + pnpm --workspace-concurrency 1 -r bench-vitest diff --git a/examples/with-typescript-esm/package.json b/examples/with-typescript-esm/package.json index ec23d502..5643424d 100644 --- a/examples/with-typescript-esm/package.json +++ b/examples/with-typescript-esm/package.json @@ -16,6 +16,6 @@ "esbuild-register": "^3.4.2", "tinybench": "^4.0.1", "typescript": "^5.1.3", - "vitest": "^1.2.2" + "vitest": "^3.2.4" } } diff --git a/examples/with-typescript-esm/src/fibonacci.bench.ts b/examples/with-typescript-esm/src/fibonacci.bench.ts index dd6877ce..ad7264d0 100644 --- a/examples/with-typescript-esm/src/fibonacci.bench.ts +++ b/examples/with-typescript-esm/src/fibonacci.bench.ts @@ -1,8 +1,8 @@ import { bench, describe } from "vitest"; -import { iterativeFibonacci } from "./fibonacci"; +import { recursiveFibonacci } from "./fibonacci"; -describe("iterativeFibonacci", () => { - bench("fibo 10", () => { - iterativeFibonacci(10); +describe("recursiveFibonacci", () => { + bench("fibo 30", () => { + recursiveFibonacci(30); }); }); diff --git a/packages/tinybench-plugin/package.json b/packages/tinybench-plugin/package.json index 3958c31e..6c8b0006 100644 --- a/packages/tinybench-plugin/package.json +++ b/packages/tinybench-plugin/package.json @@ -28,7 +28,7 @@ "@types/stack-trace": "^0.0.30", "esbuild-register": "^3.4.2", "tinybench": "^4.0.1", - "vitest": "^1.2.2" + "vitest": "^3.2.4" }, "dependencies": { "@codspeed/core": "workspace:^4.0.1", diff --git a/packages/vitest-plugin/benches/hooks.bench.ts b/packages/vitest-plugin/benches/hooks.bench.ts index db57d360..d790ca3c 100644 --- a/packages/vitest-plugin/benches/hooks.bench.ts +++ b/packages/vitest-plugin/benches/hooks.bench.ts @@ -8,85 +8,30 @@ import { expect, } from "vitest"; -let count = -1; - -beforeAll(() => { - count += 1; -}); - -beforeEach(() => { - count += 1; -}); - -// the count is multiplied by 2 because the bench function is called twice with codspeed (once for the optimization and once for the actual measurement) -bench("one", () => { - expect(count).toBe(1 * 2); -}); - -describe("level1", () => { - bench("two", () => { - expect(count).toBe(2 * 2); - }); - - bench("three", () => { - expect(count).toBe(3 * 2); - }); - - describe("level 2", () => { - beforeEach(() => { - count += 1; - }); - - bench("five", () => { - expect(count).toBe(5 * 2); - }); - - describe("level 3", () => { - bench("seven", () => { - expect(count).toBe(7 * 2); - }); - }); - }); - - describe("level 2 bench nested beforeAll", () => { - beforeAll(() => { - count = 0; - }); - - bench("one", () => { - expect(count).toBe(1 * 2); - }); - }); - - bench("two", () => { - expect(count).toBe(2 * 2); - }); -}); - -describe("hooks cleanup", () => { - let cleanUpCount = 0; +describe("hooks", () => { + let count = 0; describe("run", () => { beforeAll(() => { - cleanUpCount += 10; + count += 10; }); beforeEach(() => { - cleanUpCount += 1; + count += 1; }); afterEach(() => { - cleanUpCount -= 1; + count -= 1; }); afterAll(() => { - cleanUpCount -= 10; + count -= 10; }); bench("one", () => { - expect(cleanUpCount).toBe(11); + expect(count).toBe(11); }); bench("two", () => { - expect(cleanUpCount).toBe(11); + expect(count).toBe(11); }); }); bench("end", () => { - expect(cleanUpCount).toBe(0); + expect(count).toBe(0); }); }); diff --git a/packages/vitest-plugin/benches/timing.bench.ts b/packages/vitest-plugin/benches/timing.bench.ts new file mode 100644 index 00000000..eb451a50 --- /dev/null +++ b/packages/vitest-plugin/benches/timing.bench.ts @@ -0,0 +1,39 @@ +import { bench, describe, type BenchOptions } from "vitest"; + +const busySleep = (ms: number): void => { + const end = performance.now() + ms; + while (performance.now() < end) { + // Busy wait + } +}; + +const timingBenchOptions: BenchOptions = { + iterations: 5, + warmupIterations: 0, +}; + +describe("timing tests", () => { + bench( + "wait 1ms", + async () => { + busySleep(1); + }, + timingBenchOptions + ); + + bench( + "wait 500ms", + async () => { + busySleep(500); + }, + timingBenchOptions + ); + + bench( + "wait 1sec", + async () => { + busySleep(1_000); + }, + timingBenchOptions + ); +}); diff --git a/packages/vitest-plugin/moon.yml b/packages/vitest-plugin/moon.yml index 64f92547..cf23e215 100644 --- a/packages/vitest-plugin/moon.yml +++ b/packages/vitest-plugin/moon.yml @@ -6,6 +6,8 @@ tasks: local: true options: cache: false + deps: + - build test: command: vitest --run diff --git a/packages/vitest-plugin/package.json b/packages/vitest-plugin/package.json index 2784f0d3..e8e29f2b 100644 --- a/packages/vitest-plugin/package.json +++ b/packages/vitest-plugin/package.json @@ -31,13 +31,13 @@ "@codspeed/core": "workspace:^4.0.1" }, "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0", - "vitest": ">=1.2.2" + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "vitest": ">=3.2" }, "devDependencies": { "@total-typescript/shoehorn": "^0.1.1", "execa": "^8.0.1", "vite": "^5.0.0", - "vitest": "^1.2.2" + "vitest": "^3.2.4" } } diff --git a/packages/vitest-plugin/rollup.config.ts b/packages/vitest-plugin/rollup.config.ts index b5c8bf43..03e611ec 100644 --- a/packages/vitest-plugin/rollup.config.ts +++ b/packages/vitest-plugin/rollup.config.ts @@ -21,8 +21,14 @@ export default defineConfig([ external: ["@codspeed/core", /^vitest/], }, { - input: "src/runner.ts", - output: { file: "dist/runner.mjs", format: "es" }, + input: "src/instrumented.ts", + output: { file: "dist/instrumented.mjs", format: "es" }, + plugins: jsPlugins(pkg.version), + external: ["@codspeed/core", /^vitest/], + }, + { + input: "src/walltime.ts", + output: { file: "dist/walltime.mjs", format: "es" }, plugins: jsPlugins(pkg.version), external: ["@codspeed/core", /^vitest/], }, diff --git a/packages/vitest-plugin/src/__tests__/index.test.ts b/packages/vitest-plugin/src/__tests__/index.test.ts index 30c8c17a..648095c2 100644 --- a/packages/vitest-plugin/src/__tests__/index.test.ts +++ b/packages/vitest-plugin/src/__tests__/index.test.ts @@ -1,5 +1,5 @@ import { fromPartial } from "@total-typescript/shoehorn"; -import { describe, expect, it, vi } from "vitest"; +import { afterAll, beforeAll, describe, expect, it, vi } from "vitest"; import codspeedPlugin from "../index"; const coreMocks = vi.hoisted(() => { @@ -25,6 +25,18 @@ vi.mock("@codspeed/core", async (importOriginal) => { console.warn = vi.fn(); describe("codSpeedPlugin", () => { + beforeAll(() => { + // Set environment variables to trigger instrumented mode + process.env.CODSPEED_ENV = "1"; + process.env.CODSPEED_RUNNER_MODE = "instrumentation"; + }); + + afterAll(() => { + // Clean up environment variables + delete process.env.CODSPEED_ENV; + delete process.env.CODSPEED_RUNNER_MODE; + }); + it("should have a name", async () => { expect(resolvedCodSpeedPlugin.name).toBe("codspeed:vitest"); }); @@ -96,7 +108,9 @@ describe("codSpeedPlugin", () => { ], }, }, - runner: expect.stringContaining("packages/vitest-plugin/src/runner.ts"), + runner: expect.stringContaining( + "packages/vitest-plugin/src/instrumented.ts" + ), }, }); }); diff --git a/packages/vitest-plugin/src/__tests__/runner.test.ts b/packages/vitest-plugin/src/__tests__/instrumented.test.ts similarity index 75% rename from packages/vitest-plugin/src/__tests__/runner.test.ts rename to packages/vitest-plugin/src/__tests__/instrumented.test.ts index 32c04713..6e5e125e 100644 --- a/packages/vitest-plugin/src/__tests__/runner.test.ts +++ b/packages/vitest-plugin/src/__tests__/instrumented.test.ts @@ -1,7 +1,7 @@ import { fromPartial } from "@total-typescript/shoehorn"; -import { describe, expect, it, Suite, vi } from "vitest"; +import { describe, expect, it, vi, type RunnerTestSuite } from "vitest"; import { getBenchFn } from "vitest/suite"; -import CodSpeedRunner from "../runner"; +import { InstrumentedRunner as CodSpeedRunner } from "../instrumented"; const coreMocks = vi.hoisted(() => { return { @@ -37,40 +37,46 @@ vi.mock("vitest/suite", async (importOriginal) => { const mockedGetBenchFn = vi.mocked(getBenchFn); describe("CodSpeedRunner", () => { - it("should run the bench functions only twice", async () => { + it("should run the bench function", async () => { const benchFn = vi.fn(); mockedGetBenchFn.mockReturnValue(benchFn); const runner = new CodSpeedRunner(fromPartial({})); - const suite = fromPartial({ - filepath: __filename, + const suite = fromPartial({ + file: { filepath: __filename }, name: "test suite", - tasks: [{ mode: "run", meta: { benchmark: true }, name: "test bench" }], + tasks: [ + { + type: "test", + mode: "run", + meta: { benchmark: true }, + name: "test bench", + }, + ], }); - suite.tasks[0].suite = suite; await runner.runSuite(suite); // setup expect(coreMocks.setupCore).toHaveBeenCalledTimes(1); expect(console.log).toHaveBeenCalledWith( - "[CodSpeed] running suite packages/vitest-plugin/src/__tests__/runner.test.ts" + "[CodSpeed] running suite packages/vitest-plugin/src/__tests__/instrumented.test.ts" ); // run expect(coreMocks.mongoMeasurement.start).toHaveBeenCalledWith( - "packages/vitest-plugin/src/__tests__/runner.test.ts::test bench" + "packages/vitest-plugin/src/__tests__/instrumented.test.ts::test bench" ); expect(coreMocks.Measurement.startInstrumentation).toHaveBeenCalledTimes(1); expect(benchFn).toHaveBeenCalledTimes(8); expect(coreMocks.Measurement.stopInstrumentation).toHaveBeenCalledTimes(1); expect(coreMocks.mongoMeasurement.stop).toHaveBeenCalledTimes(1); expect(console.log).toHaveBeenCalledWith( - "[CodSpeed] packages/vitest-plugin/src/__tests__/runner.test.ts::test bench done" + "[CodSpeed] packages/vitest-plugin/src/__tests__/instrumented.test.ts::test bench done" ); // teardown expect(console.log).toHaveBeenCalledWith( - "[CodSpeed] running suite packages/vitest-plugin/src/__tests__/runner.test.ts done" + "[CodSpeed] running suite packages/vitest-plugin/src/__tests__/instrumented.test.ts done" ); expect(coreMocks.teardownCore).toHaveBeenCalledTimes(1); }); @@ -80,8 +86,8 @@ describe("CodSpeedRunner", () => { mockedGetBenchFn.mockReturnValue(benchFn); const runner = new CodSpeedRunner(fromPartial({})); - const rootSuite = fromPartial({ - filepath: __filename, + const rootSuite = fromPartial({ + file: { filepath: __filename }, name: "test suite", tasks: [ { @@ -90,6 +96,7 @@ describe("CodSpeedRunner", () => { mode: "run", tasks: [ { + type: "test", mode: "run", meta: { benchmark: true }, name: "test bench", @@ -98,33 +105,30 @@ describe("CodSpeedRunner", () => { }, ], }); - rootSuite.tasks[0].suite = rootSuite; - // @ts-expect-error type is not narrow enough, but it is fine - rootSuite.tasks[0].tasks[0].suite = rootSuite.tasks[0]; await runner.runSuite(rootSuite); // setup expect(coreMocks.setupCore).toHaveBeenCalledTimes(1); expect(console.log).toHaveBeenCalledWith( - "[CodSpeed] running suite packages/vitest-plugin/src/__tests__/runner.test.ts" + "[CodSpeed] running suite packages/vitest-plugin/src/__tests__/instrumented.test.ts" ); // run expect(coreMocks.mongoMeasurement.start).toHaveBeenCalledWith( - "packages/vitest-plugin/src/__tests__/runner.test.ts::nested suite::test bench" + "packages/vitest-plugin/src/__tests__/instrumented.test.ts::nested suite::test bench" ); expect(coreMocks.Measurement.startInstrumentation).toHaveBeenCalledTimes(1); expect(benchFn).toHaveBeenCalledTimes(8); expect(coreMocks.Measurement.stopInstrumentation).toHaveBeenCalledTimes(1); expect(coreMocks.mongoMeasurement.stop).toHaveBeenCalledTimes(1); expect(console.log).toHaveBeenCalledWith( - "[CodSpeed] packages/vitest-plugin/src/__tests__/runner.test.ts::nested suite::test bench done" + "[CodSpeed] packages/vitest-plugin/src/__tests__/instrumented.test.ts::nested suite::test bench done" ); // teardown expect(console.log).toHaveBeenCalledWith( - "[CodSpeed] running suite packages/vitest-plugin/src/__tests__/runner.test.ts done" + "[CodSpeed] running suite packages/vitest-plugin/src/__tests__/instrumented.test.ts done" ); expect(coreMocks.teardownCore).toHaveBeenCalledTimes(1); }); diff --git a/packages/vitest-plugin/src/common.ts b/packages/vitest-plugin/src/common.ts new file mode 100644 index 00000000..9aa5ea0d --- /dev/null +++ b/packages/vitest-plugin/src/common.ts @@ -0,0 +1,40 @@ +import { getGitDir } from "@codspeed/core"; +import path from "path"; +import { Benchmark, type RunnerTask, type RunnerTestSuite } from "vitest"; +import { getHooks } from "vitest/suite"; +type SuiteHooks = ReturnType; + +function getSuiteHooks(suite: RunnerTestSuite, name: keyof SuiteHooks) { + return getHooks(suite)?.[name] ?? []; +} + +export async function callSuiteHook( + suite: RunnerTestSuite, + currentTask: RunnerTask, + name: T +): Promise { + if (name === "beforeEach" && suite?.suite) { + await callSuiteHook(suite.suite, currentTask, name); + } + + const hooks = getSuiteHooks(suite, name); + + // @ts-expect-error TODO: add support for hooks parameters + await Promise.all(hooks.map((fn) => fn())); + + if (name === "afterEach" && suite?.suite) { + await callSuiteHook(suite.suite, currentTask, name); + } +} + +export function patchRootSuiteWithFullFilePath(suite: RunnerTestSuite) { + const gitDir = getGitDir(suite.file.filepath); + if (gitDir === undefined) { + throw new Error("Could not find a git repository"); + } + suite.name = path.relative(gitDir, suite.file.filepath); +} + +export function isVitestTaskBenchmark(task: RunnerTask): task is Benchmark { + return task.type === "test" && task.meta.benchmark === true; +} diff --git a/packages/vitest-plugin/src/index.ts b/packages/vitest-plugin/src/index.ts index 12b55676..b07915df 100644 --- a/packages/vitest-plugin/src/index.ts +++ b/packages/vitest-plugin/src/index.ts @@ -1,4 +1,5 @@ import { + getCodspeedRunnerMode, getV8Flags, Measurement, mongoMeasurement, @@ -7,7 +8,7 @@ import { } from "@codspeed/core"; import { join } from "path"; import { Plugin } from "vite"; -import { UserConfig } from "vitest/config"; +import { type ViteUserConfig } from "vitest/config"; // get this file's directory path from import.meta.url const __dirname = new URL(".", import.meta.url).pathname; @@ -19,6 +20,15 @@ function getCodSpeedFileFromName(name: string) { return join(__dirname, `${name}.${fileExtension}`); } +function getRunnerFile(): string | undefined { + const codspeedRunnerMode = getCodspeedRunnerMode(); + if (codspeedRunnerMode === "disabled") { + return undefined; + } + + return getCodSpeedFileFromName(codspeedRunnerMode); +} + export default function codspeedPlugin(): Plugin { return { name: "codspeed:vitest", @@ -26,14 +36,20 @@ export default function codspeedPlugin(): Plugin { if (mode !== "benchmark") { return false; } - if (!Measurement.isInstrumented()) { + if ( + getCodspeedRunnerMode() == "instrumented" && + !Measurement.isInstrumented() + ) { console.warn("[CodSpeed] bench detected but no instrumentation found"); } return true; }, enforce: "post", - config(): UserConfig { - return { + config(): ViteUserConfig { + const runnerFile = getRunnerFile(); + const runnerMode = getCodspeedRunnerMode(); + + const config: ViteUserConfig = { test: { pool: "forks", poolOptions: { @@ -41,10 +57,19 @@ export default function codspeedPlugin(): Plugin { execArgv: getV8Flags(), }, }, - runner: getCodSpeedFileFromName("runner"), globalSetup: [getCodSpeedFileFromName("globalSetup")], + ...(runnerFile && { + runner: runnerFile, + }), + ...(runnerMode === "walltime" && { + benchmark: { + includeSamples: true, + }, + }), }, }; + + return config; }, }; } diff --git a/packages/vitest-plugin/src/instrumented.ts b/packages/vitest-plugin/src/instrumented.ts new file mode 100644 index 00000000..5c173536 --- /dev/null +++ b/packages/vitest-plugin/src/instrumented.ts @@ -0,0 +1,100 @@ +import { + logDebug, + Measurement, + mongoMeasurement, + optimizeFunction, + setupCore, + teardownCore, +} from "@codspeed/core"; +import { Benchmark, type RunnerTestSuite } from "vitest"; +import { NodeBenchmarkRunner } from "vitest/runners"; +import { getBenchFn } from "vitest/suite"; +import { + callSuiteHook, + isVitestTaskBenchmark, + patchRootSuiteWithFullFilePath, +} from "./common"; + +const currentFileName = + typeof __filename === "string" + ? __filename + : new URL("instrumented.mjs", import.meta.url).pathname; + +/** + * @deprecated + * TODO: try to use something like `updateTask` from `@vitest/runner` instead to use the output + * of vitest instead console.log but at the moment, `updateTask` is not exposed + */ +function logCodSpeed(message: string) { + console.log(`[CodSpeed] ${message}`); +} + +async function runInstrumentedBench( + benchmark: Benchmark, + suite: RunnerTestSuite, + currentSuiteName: string +) { + const uri = `${currentSuiteName}::${benchmark.name}`; + const fn = getBenchFn(benchmark); + + await optimizeFunction(async () => { + await callSuiteHook(suite, benchmark, "beforeEach"); + // @ts-expect-error we do not need to bind the function to an instance of tinybench's Bench + await fn(); + await callSuiteHook(suite, benchmark, "afterEach"); + }); + + await callSuiteHook(suite, benchmark, "beforeEach"); + await mongoMeasurement.start(uri); + global.gc?.(); + await (async function __codspeed_root_frame__() { + Measurement.startInstrumentation(); + // @ts-expect-error we do not need to bind the function to an instance of tinybench's Bench + await fn(); + Measurement.stopInstrumentation(uri); + })(); + await mongoMeasurement.stop(uri); + await callSuiteHook(suite, benchmark, "afterEach"); + + logCodSpeed(`${uri} done`); +} + +async function runInstrumentedBenchmarkSuite( + suite: RunnerTestSuite, + parentSuiteName?: string +) { + const currentSuiteName = parentSuiteName + ? parentSuiteName + "::" + suite.name + : suite.name; + + await callSuiteHook(suite, suite, "beforeAll"); + + for (const task of suite.tasks) { + if (task.mode !== "run") continue; + + if (isVitestTaskBenchmark(task)) { + await runInstrumentedBench(task, suite, currentSuiteName); + } else if (task.type === "suite") { + await runInstrumentedBenchmarkSuite(task, currentSuiteName); + } + } + + await callSuiteHook(suite, suite, "afterAll"); +} + +export class InstrumentedRunner extends NodeBenchmarkRunner { + async runSuite(suite: RunnerTestSuite): Promise { + logDebug(`PROCESS PID: ${process.pid} in ${currentFileName}`); + setupCore(); + + patchRootSuiteWithFullFilePath(suite); + + logCodSpeed(`running suite ${suite.name}`); + await runInstrumentedBenchmarkSuite(suite); + logCodSpeed(`running suite ${suite.name} done`); + + teardownCore(); + } +} + +export default InstrumentedRunner; diff --git a/packages/vitest-plugin/src/runner.ts b/packages/vitest-plugin/src/runner.ts index 780b3482..9177b400 100644 --- a/packages/vitest-plugin/src/runner.ts +++ b/packages/vitest-plugin/src/runner.ts @@ -1,140 +1,3 @@ -import { - getGitDir, - logDebug, - Measurement, - mongoMeasurement, - optimizeFunction, - setupCore, - teardownCore, -} from "@codspeed/core"; -import path from "path"; -import { Benchmark, chai, Suite, Task } from "vitest"; -import { NodeBenchmarkRunner } from "vitest/runners"; -import { getBenchFn, getHooks } from "vitest/suite"; +import { InstrumentedRunner } from "./instrumented"; -type SuiteHooks = ReturnType; - -function getSuiteHooks(suite: Suite, name: keyof SuiteHooks) { - return getHooks(suite)?.[name] ?? []; -} - -export async function callSuiteHook( - suite: Suite, - currentTask: Task, - name: T -): Promise { - if (name === "beforeEach" && suite?.suite) { - await callSuiteHook(suite.suite, currentTask, name); - } - - const hooks = getSuiteHooks(suite, name); - - await Promise.all(hooks.map((fn) => fn())); - - if (name === "afterEach" && suite?.suite) { - await callSuiteHook(suite.suite, currentTask, name); - } -} - -const currentFileName = - typeof __filename === "string" - ? __filename - : new URL("runner.mjs", import.meta.url).pathname; - -/** - * @deprecated - * TODO: try to use something like `updateTask` from `@vitest/runner` instead to use the output - * of vitest instead console.log but at the moment, `updateTask` is not exposed - */ -function logCodSpeed(message: string) { - console.log(`[CodSpeed] ${message}`); -} - -async function runBench(benchmark: Benchmark, currentSuiteName: string) { - const uri = `${currentSuiteName}::${benchmark.name}`; - const fn = getBenchFn(benchmark); - - await callSuiteHook(benchmark.suite, benchmark, "beforeEach"); - try { - await optimizeFunction(fn); - } catch (e) { - // if the error is not an assertion error, we want to fail the run - // we allow assertion errors because we want to be able to use `expect` in the benchmark to allow for better authoring - // assertions are allowed to fail in the optimization phase since it might be linked to stateful code - if (!(e instanceof chai.AssertionError)) { - throw e; - } - } - await callSuiteHook(benchmark.suite, benchmark, "afterEach"); - - await callSuiteHook(benchmark.suite, benchmark, "beforeEach"); - await mongoMeasurement.start(uri); - global.gc?.(); - await (async function __codspeed_root_frame__() { - Measurement.startInstrumentation(); - // @ts-expect-error we do not need to bind the function to an instance of tinybench's Bench - await fn(); - Measurement.stopInstrumentation(uri); - })(); - await mongoMeasurement.stop(uri); - await callSuiteHook(benchmark.suite, benchmark, "afterEach"); - - logCodSpeed(`${uri} done`); -} - -async function runBenchmarkSuite(suite: Suite, parentSuiteName?: string) { - const currentSuiteName = parentSuiteName - ? parentSuiteName + "::" + suite.name - : suite.name; - - // do not call `beforeAll` if we are in the root suite, since it is already called by vitest - // see https://github.com/vitest-dev/vitest/blob/1fee63f2598edc228017f18eca325f85ee54aee0/packages/runner/src/run.ts#L293 - if (parentSuiteName !== undefined) { - await callSuiteHook(suite, suite, "beforeAll"); - } - - for (const task of suite.tasks) { - if (task.mode !== "run") continue; - - if (task.meta?.benchmark) { - await runBench(task as Benchmark, currentSuiteName); - } else if (task.type === "suite") { - await runBenchmarkSuite(task, currentSuiteName); - } - } - - // do not call `afterAll` if we are in the root suite, since it is already called by vitest - // see https://github.com/vitest-dev/vitest/blob/1fee63f2598edc228017f18eca325f85ee54aee0/packages/runner/src/run.ts#L324 - if (parentSuiteName !== undefined) { - await callSuiteHook(suite, suite, "afterAll"); - } -} - -function patchRootSuiteWithFullFilePath(suite: Suite) { - if (suite.filepath === undefined) { - throw new Error("filepath is undefined is the root suite"); - } - const gitDir = getGitDir(suite.filepath); - if (gitDir === undefined) { - throw new Error("Could not find a git repository"); - } - suite.name = path.relative(gitDir, suite.filepath); -} - -class CodSpeedRunner extends NodeBenchmarkRunner { - async runSuite(suite: Suite): Promise { - logDebug(`PROCESS PID: ${process.pid} in ${currentFileName}`); - setupCore(); - - patchRootSuiteWithFullFilePath(suite); - - logCodSpeed(`running suite ${suite.name}`); - - await runBenchmarkSuite(suite); - logCodSpeed(`running suite ${suite.name} done`); - - teardownCore(); - } -} - -export default CodSpeedRunner; +export default InstrumentedRunner; diff --git a/packages/vitest-plugin/src/walltime.ts b/packages/vitest-plugin/src/walltime.ts new file mode 100644 index 00000000..9eda348b --- /dev/null +++ b/packages/vitest-plugin/src/walltime.ts @@ -0,0 +1,186 @@ +import { + calculateQuantiles, + msToNs, + msToS, + writeWalltimeResults, + type Benchmark, + type BenchmarkStats, +} from "@codspeed/core"; +import { + type Benchmark as VitestBenchmark, + type RunnerTaskResult, + type RunnerTestSuite, +} from "vitest"; +import { NodeBenchmarkRunner } from "vitest/runners"; +import { getBenchOptions } from "vitest/suite"; +import { + isVitestTaskBenchmark, + patchRootSuiteWithFullFilePath, +} from "./common"; + +declare const __VERSION__: string; + +/** + * WalltimeRunner uses Vitest's default benchmark execution + * and extracts results from the suite after completion + */ +export class WalltimeRunner extends NodeBenchmarkRunner { + async runSuite(suite: RunnerTestSuite): Promise { + patchRootSuiteWithFullFilePath(suite); + + console.log( + `[CodSpeed] running with @codspeed/vitest-plugin v${__VERSION__} (walltime mode)` + ); + + // Let Vitest's default benchmark runner handle execution + await super.runSuite(suite); + + // Extract benchmark results from the completed suite + const benchmarks = await this.extractBenchmarkResults(suite); + + if (benchmarks.length > 0) { + writeWalltimeResults(benchmarks); + console.log( + `[CodSpeed] Done collecting walltime data for ${benchmarks.length} benches.` + ); + } else { + console.warn( + `[CodSpeed] No benchmark results found after suite execution` + ); + } + } + + private async extractBenchmarkResults( + suite: RunnerTestSuite, + parentPath = "" + ): Promise { + const benchmarks: Benchmark[] = []; + const currentPath = parentPath + ? `${parentPath}::${suite.name}` + : suite.name; + + for (const task of suite.tasks) { + if (isVitestTaskBenchmark(task) && task.result?.state === "pass") { + const benchmark = await this.processBenchmarkTask(task, currentPath); + if (benchmark) { + benchmarks.push(benchmark); + } + } else if (task.type === "suite") { + const nestedBenchmarks = await this.extractBenchmarkResults( + task, + currentPath + ); + benchmarks.push(...nestedBenchmarks); + } + } + + return benchmarks; + } + + private async processBenchmarkTask( + task: VitestBenchmark, + suitePath: string + ): Promise { + const uri = `${suitePath}::${task.name}`; + + const result = task.result; + if (!result) { + console.warn(` ⚠ No result data available for ${uri}`); + return null; + } + + try { + // Get tinybench configuration options from vitest + const benchOptions = getBenchOptions(task); + + const stats = this.convertVitestResultToBenchmarkStats( + result, + benchOptions + ); + + if (stats === null) { + console.log(` ✔ No walltime data to collect for ${uri}`); + return null; + } + + const coreBenchmark: Benchmark = { + name: task.name, + uri, + config: { + max_rounds: benchOptions.iterations ?? null, + max_time_ns: benchOptions.time ? msToNs(benchOptions.time) : null, + min_round_time_ns: null, // tinybench does not have an option for this + warmup_time_ns: + benchOptions.warmupIterations !== 0 && benchOptions.warmupTime + ? msToNs(benchOptions.warmupTime) + : null, + }, + stats, + }; + + console.log(` ✔ Collected walltime data for ${uri}`); + return coreBenchmark; + } catch (error) { + console.warn( + ` ⚠ Failed to process benchmark result for ${uri}:`, + error + ); + return null; + } + } + + private convertVitestResultToBenchmarkStats( + result: RunnerTaskResult, + benchOptions: { + time?: number; + warmupTime?: number; + warmupIterations?: number; + iterations?: number; + } + ): BenchmarkStats | null { + const benchmark = result.benchmark; + + if (!benchmark) { + throw new Error("No benchmark data available in result"); + } + + const { totalTime, min, max, mean, sd, samples } = benchmark; + + // Get individual sample times in nanoseconds and sort them + const sortedTimesNs = samples.map(msToNs).sort((a, b) => a - b); + const meanNs = msToNs(mean); + const stdevNs = msToNs(sd); + + if (sortedTimesNs.length == 0) { + // Sometimes the benchmarks can be completely optimized out and not even run, but its beforeEach and afterEach hooks are still executed, and the task is still considered a success. + // This is the case for the hooks.bench.ts example in this package + return null; + } + + const { + q1_ns, + q3_ns, + median_ns, + iqr_outlier_rounds, + stdev_outlier_rounds, + } = calculateQuantiles({ meanNs, stdevNs, sortedTimesNs }); + + return { + min_ns: msToNs(min), + max_ns: msToNs(max), + mean_ns: meanNs, + stdev_ns: stdevNs, + q1_ns, + median_ns, + q3_ns, + total_time: msToS(totalTime), + iter_per_round: 1, // as there is only one round in tinybench, we define that there were n rounds of 1 iteration + rounds: sortedTimesNs.length, + iqr_outlier_rounds, + stdev_outlier_rounds, + warmup_iters: benchOptions.warmupIterations ?? 0, + }; + } +} + +export default WalltimeRunner; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2b91edaf..e0e3c372 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -37,7 +37,7 @@ importers: version: 18.15.11 '@typescript-eslint/eslint-plugin': specifier: ^5.58.0 - version: 5.58.0(@typescript-eslint/parser@5.58.0)(eslint@7.32.0)(typescript@4.9.4) + version: 5.58.0(@typescript-eslint/parser@5.58.0(eslint@7.32.0)(typescript@4.9.4))(eslint@7.32.0)(typescript@4.9.4) '@typescript-eslint/parser': specifier: ^5.58.0 version: 5.58.0(eslint@7.32.0)(typescript@4.9.4) @@ -52,22 +52,22 @@ importers: version: 7.32.0 eslint-import-resolver-typescript: specifier: ^3.5.5 - version: 3.5.5(@typescript-eslint/parser@5.58.0)(eslint-plugin-import@2.27.5)(eslint@7.32.0) + version: 3.5.5(@typescript-eslint/parser@5.58.0(eslint@7.32.0)(typescript@4.9.4))(eslint-plugin-import@2.27.5)(eslint@7.32.0) eslint-plugin-import: specifier: ^2.27.5 - version: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@3.5.5)(eslint@7.32.0) + version: 2.27.5(@typescript-eslint/parser@5.58.0(eslint@7.32.0)(typescript@4.9.4))(eslint-import-resolver-typescript@3.5.5)(eslint@7.32.0) husky: specifier: ^7.0.4 version: 7.0.4 jest: specifier: ^29.5.0 - version: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1) + version: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1(@types/node@18.15.11)(typescript@4.9.4)) jest-config: specifier: ^29.5.0 - version: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1) + version: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1(@types/node@18.15.11)(typescript@4.9.4)) lerna: specifier: ^6.6.1 - version: 6.6.1 + version: 6.6.1(encoding@0.1.13) prettier: specifier: ^2.8.7 version: 2.8.7 @@ -85,7 +85,7 @@ importers: version: 6.1.0(esbuild@0.17.16)(rollup@4.4.1) ts-jest: specifier: ^29.1.0 - version: 29.1.0(@babel/core@7.21.4)(esbuild@0.17.16)(jest@29.5.0)(typescript@4.9.4) + version: 29.1.0(@babel/core@7.21.4)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.21.4))(esbuild@0.17.16)(jest@29.5.0(@types/node@18.15.11)(ts-node@10.9.1(@types/node@18.15.11)(typescript@4.9.4)))(typescript@4.9.4) tslib: specifier: ^2.5.0 version: 2.5.0 @@ -124,7 +124,7 @@ importers: version: 2.1.4 esbuild-register: specifier: ^3.4.2 - version: 3.4.2(esbuild@0.17.16) + version: 3.4.2(esbuild@0.19.5) tinybench: specifier: ^4.0.1 version: 4.0.1 @@ -151,7 +151,7 @@ importers: version: 2.1.4 esbuild-register: specifier: ^3.4.2 - version: 3.4.2(esbuild@0.17.16) + version: 3.4.2(esbuild@0.19.5) tinybench: specifier: ^4.0.1 version: 4.0.1 @@ -159,8 +159,8 @@ importers: specifier: ^5.1.3 version: 5.1.3 vitest: - specifier: ^1.2.2 - version: 1.2.2(@types/node@18.15.11) + specifier: ^3.2.4 + version: 3.2.4(@types/node@18.15.11) examples/with-typescript-simple-cjs: devDependencies: @@ -178,7 +178,7 @@ importers: version: 2.1.4 esbuild-register: specifier: ^3.4.2 - version: 3.4.2(esbuild@0.17.16) + version: 3.4.2(esbuild@0.19.5) tinybench: specifier: ^4.0.1 version: 4.0.1 @@ -202,7 +202,7 @@ importers: version: 2.1.4 esbuild-register: specifier: ^3.4.2 - version: 3.4.2(esbuild@0.17.16) + version: 3.4.2(esbuild@0.19.5) tinybench: specifier: ^4.0.1 version: 4.0.1 @@ -239,7 +239,7 @@ importers: version: 2.1.4 jest-mock-extended: specifier: ^3.0.4 - version: 3.0.4(jest@29.7.0)(typescript@5.8.3) + version: 3.0.4(jest@29.7.0(@types/node@18.15.11)(ts-node@10.9.1(@types/node@18.15.11)(typescript@5.8.3)))(typescript@5.8.3) packages/core: dependencies: @@ -286,13 +286,13 @@ importers: version: 0.0.30 esbuild-register: specifier: ^3.4.2 - version: 3.4.2(esbuild@0.17.16) + version: 3.4.2(esbuild@0.19.5) tinybench: specifier: ^4.0.1 version: 4.0.1 vitest: - specifier: ^1.2.2 - version: 1.2.2(@types/node@18.15.11) + specifier: ^3.2.4 + version: 3.2.4(@types/node@18.15.11) packages/vitest-plugin: dependencies: @@ -310,8 +310,8 @@ importers: specifier: ^5.0.0 version: 5.0.0(@types/node@18.15.11) vitest: - specifier: ^1.2.2 - version: 1.2.2(@types/node@18.15.11) + specifier: ^3.2.4 + version: 3.2.4(@types/node@18.15.11) packages: @@ -2048,6 +2048,12 @@ packages: '@types/benchmark@2.1.2': resolution: {integrity: sha512-EDKtLYNMKrig22jEvhXq8TBFyFgVNSPmDF2b9UzJ7+eylPqdZVo17PCUMkn1jP6/1A/0u78VqYC6VrX6b8pDWA==} + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/estree@1.0.0': resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} @@ -2194,20 +2200,34 @@ packages: resolution: {integrity: sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@vitest/expect@1.2.2': - resolution: {integrity: sha512-3jpcdPAD7LwHUUiT2pZTj2U82I2Tcgg2oVPvKxhn6mDI2On6tfvPQTjAI4628GUGDZrCm4Zna9iQHm5cEexOAg==} + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - '@vitest/runner@1.2.2': - resolution: {integrity: sha512-JctG7QZ4LSDXr5CsUweFgcpEvrcxOV1Gft7uHrvkQ+fsAVylmWQvnaAr/HDp3LAH1fztGMQZugIheTWjaGzYIg==} + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} - '@vitest/snapshot@1.2.2': - resolution: {integrity: sha512-SmGY4saEw1+bwE1th6S/cZmPxz/Q4JWsl7LvbQIky2tKE35US4gd0Mjzqfr84/4OD0tikGWaWdMja/nWL5NIPA==} + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} - '@vitest/spy@1.2.2': - resolution: {integrity: sha512-k9Gcahssw8d7X3pSLq3e3XEu/0L78mUkCjivUqCQeXJm9clfXR/Td8+AP+VC1O6fKPIDLcHDTAmBOINVuv6+7g==} + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} - '@vitest/utils@1.2.2': - resolution: {integrity: sha512-WKITBHLsBHlpjnDQahr+XK6RE7MiAsgrIkr0pGhQ9ygoxBfUeG0lUG5iLlzqjmKSlBv3+j5EGsriBzh+C3Tq9g==} + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} '@yarnpkg/lockfile@1.1.0': resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} @@ -2357,8 +2377,9 @@ packages: resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} engines: {node: '>=8'} - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} @@ -2559,9 +2580,9 @@ packages: caniuse-lite@1.0.30001727: resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} - chai@4.3.10: - resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} - engines: {node: '>=4'} + chai@5.2.1: + resolution: {integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==} + engines: {node: '>=18'} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -2582,8 +2603,9 @@ packages: chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} @@ -2854,8 +2876,8 @@ packages: babel-plugin-macros: optional: true - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} deep-is@0.1.4: @@ -3007,6 +3029,9 @@ packages: es-module-lexer@1.4.1: resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -3188,6 +3213,10 @@ packages: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + engines: {node: '>=12.0.0'} + expect@29.5.0: resolution: {integrity: sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3223,6 +3252,14 @@ packages: fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} @@ -3349,9 +3386,6 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -4122,6 +4156,9 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -4243,10 +4280,6 @@ packages: resolution: {integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==} engines: {node: '>=8'} - local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} - locate-path@2.0.0: resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} engines: {node: '>=4'} @@ -4312,8 +4345,8 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@3.2.0: + resolution: {integrity: sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw==} lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -4330,6 +4363,9 @@ packages: resolution: {integrity: sha512-C8QsKIN1UIXeOs3iWmiZ1lQY+EnKDojWd37fXy1aSbJvH4iSma1uy2OWuoB3m4SYRli5+CUjDv3Dij5DVoetmg==} engines: {node: 14 || >=16.14} + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magic-string@0.30.5: resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} engines: {node: '>=12'} @@ -4495,9 +4531,6 @@ packages: engines: {node: '>=10'} hasBin: true - mlly@1.4.2: - resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} - modify-values@1.0.1: resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} engines: {node: '>=0.10.0'} @@ -4760,10 +4793,6 @@ packages: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} - p-locate@2.0.0: resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} engines: {node: '>=4'} @@ -4887,14 +4916,12 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - pathe@1.1.1: - resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -4903,6 +4930,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -4931,9 +4962,6 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} - pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} - platform@1.3.6: resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} @@ -5404,8 +5432,8 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@3.6.0: - resolution: {integrity: sha512-aFZ19IgVmhdB2uX599ve2kE6BIE3YMnQ6Gp6BURhW/oIzpXGKr878TQfAQZn1+i0Flcc/UKUy1gOlcfaUBCryg==} + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} @@ -5459,8 +5487,8 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@1.3.0: - resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + strip-literal@3.0.0: + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} strong-log-transformer@2.1.0: resolution: {integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==} @@ -5552,12 +5580,23 @@ packages: resolution: {integrity: sha512-Nb1srn7dvzkVx0J5h1vq8f48e3TIcbrS7e/UfAI/cDSef/n8yLh4zsAEsFkfpw6auTY+ZaspEvam/xs8nMnotQ==} engines: {node: '>=18.0.0'} - tinypool@0.8.2: - resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} + + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} - tinyspy@2.2.0: - resolution: {integrity: sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==} + tinyspy@4.0.3: + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} engines: {node: '>=14.0.0'} tmp@0.0.33: @@ -5715,9 +5754,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - ufo@1.3.1: - resolution: {integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==} - uglify-js@3.19.3: resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} @@ -5826,9 +5862,9 @@ packages: resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - vite-node@1.2.2: - resolution: {integrity: sha512-1as4rDTgVWJO3n1uHmUYqq7nsFgINQ9u+mRcXpjeOMJUmviqNKjcZB7UfRZrlM7MjYXMKpuWp5oGkjaFLnjawg==} - engines: {node: ^18.0.0 || >=20.0.0} + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true vite@5.0.0: @@ -5859,20 +5895,23 @@ packages: terser: optional: true - vitest@1.2.2: - resolution: {integrity: sha512-d5Ouvrnms3GD9USIK36KG8OZ5bEvKEkITFtnGv56HFaSlbItJuYr7hv2Lkn903+AvRAgSixiamozUVfORUekjw==} - engines: {node: ^18.0.0 || >=20.0.0} + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': ^1.0.0 - '@vitest/ui': ^1.0.0 + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 happy-dom: '*' jsdom: '*' peerDependenciesMeta: '@edge-runtime/vm': optional: true + '@types/debug': + optional: true '@types/node': optional: true '@vitest/browser': @@ -5916,8 +5955,8 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true - why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} hasBin: true @@ -6380,6 +6419,12 @@ snapshots: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.21.4)': + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 + optional: true + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -6405,6 +6450,12 @@ snapshots: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.21.4)': + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -6500,6 +6551,12 @@ snapshots: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.21.4)': + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 + optional: true + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -7083,12 +7140,12 @@ snapshots: '@types/node': 18.15.11 chalk: 4.1.2 cosmiconfig: 8.1.3 - cosmiconfig-typescript-loader: 4.3.0(@types/node@18.15.11)(cosmiconfig@8.1.3)(ts-node@10.9.1)(typescript@5.2.2) + cosmiconfig-typescript-loader: 4.3.0(@types/node@18.15.11)(cosmiconfig@8.1.3)(ts-node@10.9.1(@types/node@18.15.11)(typescript@4.9.4))(typescript@5.2.2) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1(@types/node@18.15.11)(typescript@4.9.4) + ts-node: 10.9.1(@types/node@18.15.11)(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: - '@swc/core' @@ -7338,7 +7395,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.5.0(ts-node@10.9.1)': + '@jest/core@29.5.0(ts-node@10.9.1(@types/node@18.15.11)(typescript@4.9.4))': dependencies: '@jest/console': 29.5.0 '@jest/reporters': 29.5.0 @@ -7352,7 +7409,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.5.0 - jest-config: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1) + jest-config: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1(@types/node@18.15.11)(typescript@4.9.4)) jest-haste-map: 29.5.0 jest-message-util: 29.5.0 jest-regex-util: 29.4.3 @@ -7372,7 +7429,7 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(ts-node@10.9.1)': + '@jest/core@29.7.0(ts-node@10.9.1(@types/node@18.15.11)(typescript@5.8.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -7386,7 +7443,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.9.1(@types/node@18.15.11)(typescript@5.8.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -7710,12 +7767,12 @@ snapshots: - bluebird - supports-color - '@lerna/legacy-package-management@6.6.1(nx@15.9.2)': + '@lerna/legacy-package-management@6.6.1(encoding@0.1.13)(nx@15.9.2)': dependencies: '@npmcli/arborist': 6.2.3 '@npmcli/run-script': 4.1.7 '@nrwl/devkit': 15.9.2(nx@15.9.2) - '@octokit/rest': 19.0.3 + '@octokit/rest': 19.0.3(encoding@0.1.13) byte-size: 7.0.0 chalk: 4.1.0 clone-deep: 4.0.1 @@ -7746,7 +7803,7 @@ snapshots: make-dir: 3.1.0 minimatch: 3.0.5 multimatch: 5.0.0 - node-fetch: 2.6.7 + node-fetch: 2.6.7(encoding@0.1.13) npm-package-arg: 8.1.1 npm-packlist: 5.1.1 npm-registry-fetch: 14.0.3 @@ -8032,11 +8089,11 @@ snapshots: dependencies: '@octokit/types': 9.0.0 - '@octokit/core@4.2.0': + '@octokit/core@4.2.0(encoding@0.1.13)': dependencies: '@octokit/auth-token': 3.0.3 - '@octokit/graphql': 5.0.5 - '@octokit/request': 6.2.3 + '@octokit/graphql': 5.0.5(encoding@0.1.13) + '@octokit/request': 6.2.3(encoding@0.1.13) '@octokit/request-error': 3.0.3 '@octokit/types': 9.0.0 before-after-hook: 2.2.3 @@ -8050,9 +8107,9 @@ snapshots: is-plain-object: 5.0.0 universal-user-agent: 6.0.0 - '@octokit/graphql@5.0.5': + '@octokit/graphql@5.0.5(encoding@0.1.13)': dependencies: - '@octokit/request': 6.2.3 + '@octokit/request': 6.2.3(encoding@0.1.13) '@octokit/types': 9.0.0 universal-user-agent: 6.0.0 transitivePeerDependencies: @@ -8066,18 +8123,18 @@ snapshots: '@octokit/plugin-enterprise-rest@6.0.1': {} - '@octokit/plugin-paginate-rest@3.1.0(@octokit/core@4.2.0)': + '@octokit/plugin-paginate-rest@3.1.0(@octokit/core@4.2.0(encoding@0.1.13))': dependencies: - '@octokit/core': 4.2.0 + '@octokit/core': 4.2.0(encoding@0.1.13) '@octokit/types': 6.41.0 - '@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.0)': + '@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.0(encoding@0.1.13))': dependencies: - '@octokit/core': 4.2.0 + '@octokit/core': 4.2.0(encoding@0.1.13) - '@octokit/plugin-rest-endpoint-methods@6.8.1(@octokit/core@4.2.0)': + '@octokit/plugin-rest-endpoint-methods@6.8.1(@octokit/core@4.2.0(encoding@0.1.13))': dependencies: - '@octokit/core': 4.2.0 + '@octokit/core': 4.2.0(encoding@0.1.13) '@octokit/types': 8.2.1 deprecation: 2.3.1 @@ -8087,23 +8144,23 @@ snapshots: deprecation: 2.3.1 once: 1.4.0 - '@octokit/request@6.2.3': + '@octokit/request@6.2.3(encoding@0.1.13)': dependencies: '@octokit/endpoint': 7.0.5 '@octokit/request-error': 3.0.3 '@octokit/types': 9.0.0 is-plain-object: 5.0.0 - node-fetch: 2.6.7 + node-fetch: 2.6.7(encoding@0.1.13) universal-user-agent: 6.0.0 transitivePeerDependencies: - encoding - '@octokit/rest@19.0.3': + '@octokit/rest@19.0.3(encoding@0.1.13)': dependencies: - '@octokit/core': 4.2.0 - '@octokit/plugin-paginate-rest': 3.1.0(@octokit/core@4.2.0) - '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.0) - '@octokit/plugin-rest-endpoint-methods': 6.8.1(@octokit/core@4.2.0) + '@octokit/core': 4.2.0(encoding@0.1.13) + '@octokit/plugin-paginate-rest': 3.1.0(@octokit/core@4.2.0(encoding@0.1.13)) + '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.0(encoding@0.1.13)) + '@octokit/plugin-rest-endpoint-methods': 6.8.1(@octokit/core@4.2.0(encoding@0.1.13)) transitivePeerDependencies: - encoding @@ -8141,11 +8198,13 @@ snapshots: glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.30.5 + optionalDependencies: rollup: 4.4.1 '@rollup/plugin-json@6.0.1(rollup@4.4.1)': dependencies: '@rollup/pluginutils': 5.0.2(rollup@4.4.1) + optionalDependencies: rollup: 4.4.1 '@rollup/plugin-node-resolve@15.2.3(rollup@4.4.1)': @@ -8156,21 +8215,24 @@ snapshots: is-builtin-module: 3.2.1 is-module: 1.0.0 resolve: 1.22.2 + optionalDependencies: rollup: 4.4.1 '@rollup/plugin-typescript@11.1.5(rollup@4.4.1)(tslib@2.5.0)(typescript@4.9.4)': dependencies: '@rollup/pluginutils': 5.0.2(rollup@4.4.1) resolve: 1.22.2 + typescript: 4.9.4 + optionalDependencies: rollup: 4.4.1 tslib: 2.5.0 - typescript: 4.9.4 '@rollup/pluginutils@5.0.2(rollup@4.4.1)': dependencies: '@types/estree': 1.0.0 estree-walker: 2.0.2 picomatch: 2.3.1 + optionalDependencies: rollup: 4.4.1 '@rollup/pluginutils@5.0.5(rollup@4.4.1)': @@ -8178,6 +8240,7 @@ snapshots: '@types/estree': 1.0.0 estree-walker: 2.0.2 picomatch: 2.3.1 + optionalDependencies: rollup: 4.4.1 '@rollup/rollup-android-arm-eabi@4.4.1': @@ -8301,6 +8364,12 @@ snapshots: '@types/benchmark@2.1.2': {} + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 + + '@types/deep-eql@4.0.2': {} + '@types/estree@1.0.0': {} '@types/find-up@4.0.0': @@ -8380,7 +8449,7 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@5.58.0(@typescript-eslint/parser@5.58.0)(eslint@7.32.0)(typescript@4.9.4)': + '@typescript-eslint/eslint-plugin@5.58.0(@typescript-eslint/parser@5.58.0(eslint@7.32.0)(typescript@4.9.4))(eslint@7.32.0)(typescript@4.9.4)': dependencies: '@eslint-community/regexpp': 4.5.0 '@typescript-eslint/parser': 5.58.0(eslint@7.32.0)(typescript@4.9.4) @@ -8394,6 +8463,7 @@ snapshots: natural-compare-lite: 1.4.0 semver: 7.4.0 tsutils: 3.21.0(typescript@4.9.4) + optionalDependencies: typescript: 4.9.4 transitivePeerDependencies: - supports-color @@ -8405,6 +8475,7 @@ snapshots: '@typescript-eslint/typescript-estree': 5.58.0(typescript@4.9.4) debug: 4.3.4 eslint: 7.32.0 + optionalDependencies: typescript: 4.9.4 transitivePeerDependencies: - supports-color @@ -8421,6 +8492,7 @@ snapshots: debug: 4.4.1 eslint: 7.32.0 tsutils: 3.21.0(typescript@4.9.4) + optionalDependencies: typescript: 4.9.4 transitivePeerDependencies: - supports-color @@ -8436,6 +8508,7 @@ snapshots: is-glob: 4.0.3 semver: 7.4.0 tsutils: 3.21.0(typescript@4.9.4) + optionalDependencies: typescript: 4.9.4 transitivePeerDependencies: - supports-color @@ -8460,34 +8533,47 @@ snapshots: '@typescript-eslint/types': 5.58.0 eslint-visitor-keys: 3.4.0 - '@vitest/expect@1.2.2': + '@vitest/expect@3.2.4': dependencies: - '@vitest/spy': 1.2.2 - '@vitest/utils': 1.2.2 - chai: 4.3.10 + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.1 + tinyrainbow: 2.0.0 - '@vitest/runner@1.2.2': + '@vitest/mocker@3.2.4(vite@5.0.0(@types/node@18.15.11))': dependencies: - '@vitest/utils': 1.2.2 - p-limit: 5.0.0 - pathe: 1.1.1 + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 5.0.0(@types/node@18.15.11) - '@vitest/snapshot@1.2.2': + '@vitest/pretty-format@3.2.4': dependencies: - magic-string: 0.30.5 - pathe: 1.1.1 - pretty-format: 29.7.0 + tinyrainbow: 2.0.0 - '@vitest/spy@1.2.2': + '@vitest/runner@3.2.4': dependencies: - tinyspy: 2.2.0 + '@vitest/utils': 3.2.4 + pathe: 2.0.3 + strip-literal: 3.0.0 - '@vitest/utils@1.2.2': + '@vitest/snapshot@3.2.4': dependencies: - diff-sequences: 29.6.3 - estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 + '@vitest/pretty-format': 3.2.4 + magic-string: 0.30.17 + pathe: 2.0.3 + + '@vitest/spy@3.2.4': + dependencies: + tinyspy: 4.0.3 + + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.2.0 + tinyrainbow: 2.0.0 '@yarnpkg/lockfile@1.1.0': {} @@ -8638,7 +8724,7 @@ snapshots: arrify@2.0.1: {} - assertion-error@1.1.0: {} + assertion-error@2.0.1: {} astral-regex@2.0.0: {} @@ -8671,6 +8757,20 @@ snapshots: transitivePeerDependencies: - supports-color + babel-jest@29.7.0(@babel/core@7.21.4): + dependencies: + '@babel/core': 7.21.4 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.21.4) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + optional: true + babel-jest@29.7.0(@babel/core@7.28.0): dependencies: '@babel/core': 7.28.0 @@ -8748,6 +8848,26 @@ snapshots: '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.21.4) + babel-preset-current-node-syntax@1.1.0(@babel/core@7.21.4): + dependencies: + '@babel/core': 7.21.4 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.21.4) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.4) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.21.4) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.21.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.4) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.21.4) + optional: true + babel-preset-current-node-syntax@1.1.0(@babel/core@7.28.0): dependencies: '@babel/core': 7.28.0 @@ -8773,6 +8893,13 @@ snapshots: babel-plugin-jest-hoist: 29.5.0 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.4) + babel-preset-jest@29.6.3(@babel/core@7.21.4): + dependencies: + '@babel/core': 7.21.4 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.21.4) + optional: true + babel-preset-jest@29.6.3(@babel/core@7.28.0): dependencies: '@babel/core': 7.28.0 @@ -8935,15 +9062,13 @@ snapshots: caniuse-lite@1.0.30001727: {} - chai@4.3.10: + chai@5.2.1: dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.2.0 + pathval: 2.0.1 chalk@2.4.2: dependencies: @@ -8965,9 +9090,7 @@ snapshots: chardet@0.7.0: {} - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 + check-error@2.1.1: {} chownr@1.1.4: {} @@ -9159,11 +9282,11 @@ snapshots: core-util-is@1.0.3: {} - cosmiconfig-typescript-loader@4.3.0(@types/node@18.15.11)(cosmiconfig@8.1.3)(ts-node@10.9.1)(typescript@5.2.2): + cosmiconfig-typescript-loader@4.3.0(@types/node@18.15.11)(cosmiconfig@8.1.3)(ts-node@10.9.1(@types/node@18.15.11)(typescript@4.9.4))(typescript@5.2.2): dependencies: '@types/node': 18.15.11 cosmiconfig: 8.1.3 - ts-node: 10.9.1(@types/node@18.15.11)(typescript@4.9.4) + ts-node: 10.9.1(@types/node@18.15.11)(typescript@5.2.2) typescript: 5.2.2 cosmiconfig@7.0.0: @@ -9181,13 +9304,13 @@ snapshots: parse-json: 5.2.0 path-type: 4.0.0 - create-jest@29.7.0(@types/node@18.15.11)(ts-node@10.9.1): + create-jest@29.7.0(@types/node@18.15.11)(ts-node@10.9.1(@types/node@18.15.11)(typescript@5.8.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.9.1(@types/node@18.15.11)(typescript@5.8.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -9235,9 +9358,7 @@ snapshots: dedent@1.6.0: {} - deep-eql@4.1.3: - dependencies: - type-detect: 4.0.8 + deep-eql@5.0.2: {} deep-is@0.1.4: {} @@ -9396,6 +9517,8 @@ snapshots: es-module-lexer@1.4.1: {} + es-module-lexer@1.7.0: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -9424,6 +9547,13 @@ snapshots: transitivePeerDependencies: - supports-color + esbuild-register@3.4.2(esbuild@0.19.5): + dependencies: + debug: 4.3.4 + esbuild: 0.19.5 + transitivePeerDependencies: + - supports-color + esbuild@0.17.16: optionalDependencies: '@esbuild/android-arm': 0.17.16 @@ -9492,13 +9622,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.58.0)(eslint-plugin-import@2.27.5)(eslint@7.32.0): + eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.58.0(eslint@7.32.0)(typescript@4.9.4))(eslint-plugin-import@2.27.5)(eslint@7.32.0): dependencies: debug: 4.3.4 enhanced-resolve: 5.12.0 eslint: 7.32.0 - eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@7.32.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@3.5.5)(eslint@7.32.0) + eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.58.0(eslint@7.32.0)(typescript@4.9.4))(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@7.32.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0(eslint@7.32.0)(typescript@4.9.4))(eslint-import-resolver-typescript@3.5.5)(eslint@7.32.0) get-tsconfig: 4.5.0 globby: 13.1.4 is-core-module: 2.12.0 @@ -9510,19 +9640,19 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@7.32.0): + eslint-module-utils@2.7.4(@typescript-eslint/parser@5.58.0(eslint@7.32.0)(typescript@4.9.4))(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@7.32.0): dependencies: - '@typescript-eslint/parser': 5.58.0(eslint@7.32.0)(typescript@4.9.4) debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 5.58.0(eslint@7.32.0)(typescript@4.9.4) eslint: 7.32.0 eslint-import-resolver-node: 0.3.7 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.58.0)(eslint-plugin-import@2.27.5)(eslint@7.32.0) + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.58.0(eslint@7.32.0)(typescript@4.9.4))(eslint-plugin-import@2.27.5)(eslint@7.32.0) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@3.5.5)(eslint@7.32.0): + eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.58.0(eslint@7.32.0)(typescript@4.9.4))(eslint-import-resolver-typescript@3.5.5)(eslint@7.32.0): dependencies: - '@typescript-eslint/parser': 5.58.0(eslint@7.32.0)(typescript@4.9.4) array-includes: 3.1.6 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 @@ -9530,7 +9660,7 @@ snapshots: doctrine: 2.1.0 eslint: 7.32.0 eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@7.32.0) + eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.58.0(eslint@7.32.0)(typescript@4.9.4))(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@7.32.0) has: 1.0.3 is-core-module: 2.12.0 is-glob: 4.0.3 @@ -9539,6 +9669,8 @@ snapshots: resolve: 1.22.2 semver: 6.3.0 tsconfig-paths: 3.14.2 + optionalDependencies: + '@typescript-eslint/parser': 5.58.0(eslint@7.32.0)(typescript@4.9.4) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -9680,6 +9812,8 @@ snapshots: exit@0.1.2: {} + expect-type@1.2.2: {} + expect@29.5.0: dependencies: '@jest/expect-utils': 29.5.0 @@ -9732,6 +9866,10 @@ snapshots: dependencies: bser: 2.1.1 + fdir@6.4.6(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 @@ -9869,8 +10007,6 @@ snapshots: get-caller-file@2.0.5: {} - get-func-name@2.0.2: {} - get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -10484,16 +10620,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.5.0(@types/node@18.15.11)(ts-node@10.9.1): + jest-cli@29.5.0(@types/node@18.15.11)(ts-node@10.9.1(@types/node@18.15.11)(typescript@4.9.4)): dependencies: - '@jest/core': 29.5.0(ts-node@10.9.1) + '@jest/core': 29.5.0(ts-node@10.9.1(@types/node@18.15.11)(typescript@4.9.4)) '@jest/test-result': 29.5.0 '@jest/types': 29.5.0 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.1.0 - jest-config: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1) + jest-config: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1(@types/node@18.15.11)(typescript@4.9.4)) jest-util: 29.5.0 jest-validate: 29.5.0 prompts: 2.4.2 @@ -10503,16 +10639,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@18.15.11)(ts-node@10.9.1): + jest-cli@29.7.0(@types/node@18.15.11)(ts-node@10.9.1(@types/node@18.15.11)(typescript@5.8.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.1) + '@jest/core': 29.7.0(ts-node@10.9.1(@types/node@18.15.11)(typescript@5.8.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.15.11)(ts-node@10.9.1) + create-jest: 29.7.0(@types/node@18.15.11)(ts-node@10.9.1(@types/node@18.15.11)(typescript@5.8.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.9.1(@types/node@18.15.11)(typescript@5.8.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -10522,12 +10658,11 @@ snapshots: - supports-color - ts-node - jest-config@29.5.0(@types/node@18.15.11)(ts-node@10.9.1): + jest-config@29.5.0(@types/node@18.15.11)(ts-node@10.9.1(@types/node@18.15.11)(typescript@4.9.4)): dependencies: '@babel/core': 7.21.4 '@jest/test-sequencer': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 18.15.11 babel-jest: 29.5.0(@babel/core@7.21.4) chalk: 4.1.2 ci-info: 3.8.0 @@ -10547,16 +10682,17 @@ snapshots: pretty-format: 29.5.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1(@types/node@18.15.11)(typescript@4.9.4) + optionalDependencies: + '@types/node': 18.15.11 + ts-node: 10.9.1(@types/node@18.15.11)(typescript@5.2.2) transitivePeerDependencies: - supports-color - jest-config@29.7.0(@types/node@18.15.11)(ts-node@10.9.1): + jest-config@29.7.0(@types/node@18.15.11)(ts-node@10.9.1(@types/node@18.15.11)(typescript@5.8.3)): dependencies: '@babel/core': 7.28.0 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.15.11 babel-jest: 29.7.0(@babel/core@7.28.0) chalk: 4.1.2 ci-info: 3.9.0 @@ -10576,7 +10712,9 @@ snapshots: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1(@types/node@18.15.11)(typescript@4.9.4) + optionalDependencies: + '@types/node': 18.15.11 + ts-node: 10.9.1(@types/node@18.15.11)(typescript@5.8.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -10721,9 +10859,9 @@ snapshots: slash: 3.0.0 stack-utils: 2.0.6 - jest-mock-extended@3.0.4(jest@29.7.0)(typescript@5.8.3): + jest-mock-extended@3.0.4(jest@29.7.0(@types/node@18.15.11)(ts-node@10.9.1(@types/node@18.15.11)(typescript@5.8.3)))(typescript@5.8.3): dependencies: - jest: 29.7.0(@types/node@18.15.11)(ts-node@10.9.1) + jest: 29.7.0(@types/node@18.15.11)(ts-node@10.9.1(@types/node@18.15.11)(typescript@5.8.3)) ts-essentials: 7.0.3(typescript@5.8.3) typescript: 5.8.3 @@ -10740,11 +10878,11 @@ snapshots: jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.5.0): - dependencies: + optionalDependencies: jest-resolve: 29.5.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - dependencies: + optionalDependencies: jest-resolve: 29.7.0 jest-regex-util@29.4.3: {} @@ -11020,23 +11158,23 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.5.0(@types/node@18.15.11)(ts-node@10.9.1): + jest@29.5.0(@types/node@18.15.11)(ts-node@10.9.1(@types/node@18.15.11)(typescript@4.9.4)): dependencies: - '@jest/core': 29.5.0(ts-node@10.9.1) + '@jest/core': 29.5.0(ts-node@10.9.1(@types/node@18.15.11)(typescript@4.9.4)) '@jest/types': 29.5.0 import-local: 3.1.0 - jest-cli: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1) + jest-cli: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1(@types/node@18.15.11)(typescript@4.9.4)) transitivePeerDependencies: - '@types/node' - supports-color - ts-node - jest@29.7.0(@types/node@18.15.11)(ts-node@10.9.1): + jest@29.7.0(@types/node@18.15.11)(ts-node@10.9.1(@types/node@18.15.11)(typescript@5.8.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.1) + '@jest/core': 29.7.0(ts-node@10.9.1(@types/node@18.15.11)(typescript@5.8.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@18.15.11)(ts-node@10.9.1) + jest-cli: 29.7.0(@types/node@18.15.11)(ts-node@10.9.1(@types/node@18.15.11)(typescript@5.8.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -11045,6 +11183,8 @@ snapshots: js-tokens@4.0.0: {} + js-tokens@9.0.1: {} + js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -11104,16 +11244,16 @@ snapshots: kleur@3.0.3: {} - lerna@6.6.1: + lerna@6.6.1(encoding@0.1.13): dependencies: '@lerna/child-process': 6.6.1 '@lerna/create': 6.6.1 - '@lerna/legacy-package-management': 6.6.1(nx@15.9.2) + '@lerna/legacy-package-management': 6.6.1(encoding@0.1.13)(nx@15.9.2) '@npmcli/arborist': 6.2.3 '@npmcli/run-script': 4.1.7 '@nrwl/devkit': 15.9.2(nx@15.9.2) '@octokit/plugin-enterprise-rest': 6.0.1 - '@octokit/rest': 19.0.3 + '@octokit/rest': 19.0.3(encoding@0.1.13) byte-size: 7.0.0 chalk: 4.1.0 clone-deep: 4.0.1 @@ -11148,7 +11288,7 @@ snapshots: make-dir: 3.1.0 minimatch: 3.0.5 multimatch: 5.0.0 - node-fetch: 2.6.7 + node-fetch: 2.6.7(encoding@0.1.13) npm-package-arg: 8.1.1 npm-packlist: 5.1.1 npm-registry-fetch: 14.0.3 @@ -11236,11 +11376,6 @@ snapshots: strip-bom: 4.0.0 type-fest: 0.6.0 - local-pkg@0.5.0: - dependencies: - mlly: 1.4.2 - pkg-types: 1.0.3 - locate-path@2.0.0: dependencies: p-locate: 2.0.0 @@ -11293,9 +11428,7 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 + loupe@3.2.0: {} lru-cache@5.1.1: dependencies: @@ -11309,6 +11442,10 @@ snapshots: lru-cache@9.0.1: {} + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.4 + magic-string@0.30.5: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 @@ -11513,13 +11650,6 @@ snapshots: mkdirp@1.0.4: {} - mlly@1.4.2: - dependencies: - acorn: 8.10.0 - pathe: 1.1.1 - pkg-types: 1.0.3 - ufo: 1.3.1 - modify-values@1.0.1: {} ms@2.1.2: {} @@ -11554,9 +11684,11 @@ snapshots: node-addon-api@5.1.0: {} - node-fetch@2.6.7: + node-fetch@2.6.7(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 node-gyp-build@4.6.0: {} @@ -11873,10 +12005,6 @@ snapshots: dependencies: yocto-queue: 1.0.0 - p-limit@5.0.0: - dependencies: - yocto-queue: 1.0.0 - p-locate@2.0.0: dependencies: p-limit: 1.3.0 @@ -12026,16 +12154,16 @@ snapshots: path-type@4.0.0: {} - pathe@1.1.1: {} - - pathval@1.1.1: {} + pathe@2.0.3: {} - picocolors@1.0.0: {} + pathval@2.0.1: {} picocolors@1.1.1: {} picomatch@2.3.1: {} + picomatch@4.0.3: {} + pify@2.3.0: {} pify@3.0.0: {} @@ -12052,12 +12180,6 @@ snapshots: dependencies: find-up: 4.1.0 - pkg-types@1.0.3: - dependencies: - jsonc-parser: 3.2.0 - mlly: 1.4.2 - pathe: 1.1.1 - platform@1.3.6: {} postcss-selector-parser@6.0.11: @@ -12521,7 +12643,7 @@ snapshots: stackback@0.0.2: {} - std-env@3.6.0: {} + std-env@3.9.0: {} string-length@4.0.2: dependencies: @@ -12578,9 +12700,9 @@ snapshots: strip-json-comments@3.1.1: {} - strip-literal@1.3.0: + strip-literal@3.0.0: dependencies: - acorn: 8.10.0 + js-tokens: 9.0.1 strong-log-transformer@2.1.0: dependencies: @@ -12692,9 +12814,18 @@ snapshots: tinybench@4.0.1: {} - tinypool@0.8.2: {} + tinyexec@0.3.2: {} + + tinyglobby@0.2.14: + dependencies: + fdir: 6.4.6(picomatch@4.0.3) + picomatch: 4.0.3 + + tinypool@1.1.1: {} + + tinyrainbow@2.0.0: {} - tinyspy@2.2.0: {} + tinyspy@4.0.3: {} tmp@0.0.33: dependencies: @@ -12722,13 +12853,11 @@ snapshots: dependencies: typescript: 5.8.3 - ts-jest@29.1.0(@babel/core@7.21.4)(esbuild@0.17.16)(jest@29.5.0)(typescript@4.9.4): + ts-jest@29.1.0(@babel/core@7.21.4)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.21.4))(esbuild@0.17.16)(jest@29.5.0(@types/node@18.15.11)(ts-node@10.9.1(@types/node@18.15.11)(typescript@4.9.4)))(typescript@4.9.4): dependencies: - '@babel/core': 7.21.4 bs-logger: 0.2.6 - esbuild: 0.17.16 fast-json-stable-stringify: 2.1.0 - jest: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1) + jest: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1(@types/node@18.15.11)(typescript@4.9.4)) jest-util: 29.5.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -12736,8 +12865,13 @@ snapshots: semver: 7.4.0 typescript: 4.9.4 yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.21.4 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.21.4) + esbuild: 0.17.16 - ts-node@10.9.1(@types/node@18.15.11)(typescript@4.9.4): + ts-node@10.9.1(@types/node@18.15.11)(typescript@5.2.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.9 @@ -12751,10 +12885,29 @@ snapshots: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 4.9.4 + typescript: 5.2.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + ts-node@10.9.1(@types/node@18.15.11)(typescript@5.8.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + '@types/node': 18.15.11 + acorn: 8.10.0 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.8.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optional: true + tsconfig-paths@3.14.2: dependencies: '@types/json5': 0.0.29 @@ -12821,8 +12974,6 @@ snapshots: typescript@5.8.3: {} - ufo@1.3.1: {} - uglify-js@3.19.3: optional: true @@ -12925,12 +13076,12 @@ snapshots: dependencies: builtins: 5.0.1 - vite-node@1.2.2(@types/node@18.15.11): + vite-node@3.2.4(@types/node@18.15.11): dependencies: cac: 6.7.14 debug: 4.4.1 - pathe: 1.1.1 - picocolors: 1.1.1 + es-module-lexer: 1.7.0 + pathe: 2.0.3 vite: 5.0.0(@types/node@18.15.11) transitivePeerDependencies: - '@types/node' @@ -12944,40 +13095,44 @@ snapshots: vite@5.0.0(@types/node@18.15.11): dependencies: - '@types/node': 18.15.11 esbuild: 0.19.5 postcss: 8.4.31 rollup: 4.4.1 optionalDependencies: + '@types/node': 18.15.11 fsevents: 2.3.3 - vitest@1.2.2(@types/node@18.15.11): - dependencies: - '@types/node': 18.15.11 - '@vitest/expect': 1.2.2 - '@vitest/runner': 1.2.2 - '@vitest/snapshot': 1.2.2 - '@vitest/spy': 1.2.2 - '@vitest/utils': 1.2.2 - acorn-walk: 8.3.2 - cac: 6.7.14 - chai: 4.3.10 - debug: 4.3.4 - execa: 8.0.1 - local-pkg: 0.5.0 - magic-string: 0.30.5 - pathe: 1.1.1 - picocolors: 1.0.0 - std-env: 3.6.0 - strip-literal: 1.3.0 + vitest@3.2.4(@types/node@18.15.11): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@5.0.0(@types/node@18.15.11)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.1 + debug: 4.4.1 + expect-type: 1.2.2 + magic-string: 0.30.17 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.9.0 tinybench: 2.9.0 - tinypool: 0.8.2 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 vite: 5.0.0(@types/node@18.15.11) - vite-node: 1.2.2(@types/node@18.15.11) - why-is-node-running: 2.2.2 + vite-node: 3.2.4(@types/node@18.15.11) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 18.15.11 transitivePeerDependencies: - less - lightningcss + - msw - sass - stylus - sugarss @@ -13026,7 +13181,7 @@ snapshots: dependencies: isexe: 2.0.0 - why-is-node-running@2.2.2: + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2