From 6809a88b0bc331206ba8af37aaace38b3cfd8b38 Mon Sep 17 00:00:00 2001 From: Mohammad Bagher Abiat Date: Sat, 10 Sep 2022 04:55:25 +0430 Subject: [PATCH] fix(bench): do not group benchmarks (#2016) Co-authored-by: Anthony Fu --- packages/vitest/src/runtime/map.ts | 16 +- packages/vitest/src/runtime/run.ts | 58 ++++-- packages/vitest/src/types/benchmark.ts | 1 + pnpm-lock.yaml | 244 +++++++++++++++++++++---- 4 files changed, 244 insertions(+), 75 deletions(-) diff --git a/packages/vitest/src/runtime/map.ts b/packages/vitest/src/runtime/map.ts index 6fd2262ef96d..8accceecf7e1 100644 --- a/packages/vitest/src/runtime/map.ts +++ b/packages/vitest/src/runtime/map.ts @@ -1,9 +1,8 @@ -import type { Awaitable, BenchFactory, BenchFunction, Benchmark, Suite, SuiteHooks, Test } from '../types' +import type { Awaitable, BenchFunction, Benchmark, Suite, SuiteHooks, Test } from '../types' // use WeakMap here to make the Test and Suite object serializable const fnMap = new WeakMap() const hooksMap = new WeakMap() -const benchmarkMap = new WeakMap() export function setFn(key: Test | Benchmark, fn: (() => Awaitable) | BenchFunction) { fnMap.set(key, fn) @@ -24,16 +23,3 @@ export function getHooks(key: Suite): SuiteHooks { export function isTest(task: Test | Benchmark): task is Test { return task.type === 'test' } - -export async function getBenchmarkFactory(key: Suite): Promise { - let benchmark = benchmarkMap.get(key) - if (!benchmark) { - if (!globalThis.EventTarget) - await import('event-target-polyfill' as any) - - const Bench = (await import('tinybench')).default - benchmark = new Bench({}) - benchmarkMap.set(key, benchmark) - } - return benchmark -} diff --git a/packages/vitest/src/runtime/run.ts b/packages/vitest/src/runtime/run.ts index ed7a62ad750a..44e747b6b427 100644 --- a/packages/vitest/src/runtime/run.ts +++ b/packages/vitest/src/runtime/run.ts @@ -1,16 +1,23 @@ import { performance } from 'perf_hooks' import limit from 'p-limit' -import type { Benchmark, BenchmarkResult, File, HookCleanupCallback, HookListener, ResolvedConfig, Suite, SuiteHooks, Task, TaskResult, TaskState, Test } from '../types' +import type { BenchTask, Benchmark, BenchmarkResult, File, HookCleanupCallback, HookListener, ResolvedConfig, Suite, SuiteHooks, Task, TaskResult, TaskState, Test } from '../types' import { vi } from '../integrations/vi' import { clearTimeout, createDefer, getFullName, getWorkerState, hasFailed, hasTests, isBrowser, isNode, isRunningInBenchmark, partitionSuiteChildren, setTimeout, shuffle } from '../utils' import { getState, setState } from '../integrations/chai/jest-expect' import { GLOBAL_EXPECT } from '../integrations/chai/constants' import { takeCoverageInsideWorker } from '../integrations/coverage' -import { getBenchmarkFactory, getFn, getHooks } from './map' +import { getFn, getHooks } from './map' import { rpc } from './rpc' import { collectTests } from './collect' import { processError } from './error' +async function importTinybench() { + if (!globalThis.EventTarget) + await import('event-target-polyfill' as any) + + return (await import('tinybench')) +} + const now = Date.now function updateSuiteHookState(suite: Task, name: keyof SuiteHooks, state: TaskState) { @@ -295,6 +302,7 @@ function createBenchmarkResult(name: string): BenchmarkResult { } async function runBenchmarkSuit(suite: Suite) { + const { Task, Bench } = await importTinybench() const start = performance.now() const benchmarkGroup = [] @@ -310,7 +318,6 @@ async function runBenchmarkSuit(suite: Suite) { await Promise.all(benchmarkSuiteGroup.map(subSuite => runBenchmarkSuit(subSuite))) if (benchmarkGroup.length) { - const benchmarkInstance = await getBenchmarkFactory(suite) const defer = createDefer() const benchmarkMap: Record = {} suite.result = { @@ -320,7 +327,10 @@ async function runBenchmarkSuit(suite: Suite) { } updateTask(suite) benchmarkGroup.forEach((benchmark, idx) => { + const benchmarkInstance = new Bench(benchmark.options) + const benchmarkFn = getFn(benchmark) + benchmark.result = { state: 'run', startTime: start, @@ -328,25 +338,38 @@ async function runBenchmarkSuit(suite: Suite) { } const id = idx.toString() benchmarkMap[id] = benchmark - benchmarkInstance.add(id, benchmarkFn) + + const task = new Task(benchmarkInstance, id, benchmarkFn) + benchmark.task = task updateTask(benchmark) }) - benchmarkInstance.addEventListener('cycle', (e) => { - const task = e.task - const benchmark = benchmarkMap[task.name || ''] - if (benchmark) { - const taskRes = task.result! - const result = benchmark.result!.benchmark! - Object.assign(result, taskRes) - updateTask(benchmark) - } + + benchmarkGroup.forEach((benchmark) => { + benchmark.task!.addEventListener('complete', (e) => { + const task = e.task + const _benchmark = benchmarkMap[task.name || ''] + if (_benchmark) { + const taskRes = task.result! + const result = _benchmark.result!.benchmark! + Object.assign(result, taskRes) + updateTask(_benchmark) + } + }) + benchmark.task!.addEventListener('error', (e) => { + defer.reject(e) + }) }) - benchmarkInstance.addEventListener('complete', () => { + Promise.all(benchmarkGroup.map(async (benchmark) => { + await benchmark.task!.warmup() + return await new Promise(resolve => setTimeout(async () => { + resolve(await benchmark.task!.run()) + })) + })).then((tasks) => { suite.result!.duration = performance.now() - start suite.result!.state = 'pass' - benchmarkInstance.tasks + tasks .sort((a, b) => a.result!.mean - b.result!.mean) .forEach((cycle, idx) => { const benchmark = benchmarkMap[cycle.name || ''] @@ -361,11 +384,6 @@ async function runBenchmarkSuit(suite: Suite) { defer.resolve(null) }) - benchmarkInstance.addEventListener('error', (e) => { - defer.reject(e) - }) - - benchmarkInstance.run() await defer } } diff --git a/packages/vitest/src/types/benchmark.ts b/packages/vitest/src/types/benchmark.ts index 9d8a1af98e88..13bf3e3233a1 100644 --- a/packages/vitest/src/types/benchmark.ts +++ b/packages/vitest/src/types/benchmark.ts @@ -36,6 +36,7 @@ export interface Benchmark extends TaskBase { suite: Suite result?: TaskResult fails?: boolean + task?: BenchTask options: BenchOptions } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6f4d984a5b77..76f01bae5e3c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -93,7 +93,7 @@ importers: typescript: 4.8.2 vite: 3.0.9 vitest: link:packages/vitest - vue: 3.2.38 + vue: 3.2.39 docs: specifiers: @@ -113,20 +113,20 @@ importers: vue: latest workbox-window: ^6.5.4 dependencies: - '@vueuse/core': 9.1.1_vue@3.2.38 + '@vueuse/core': 9.1.1_vue@3.2.39 jiti: 1.14.0 - vue: 3.2.38 + vue: 3.2.39 devDependencies: '@iconify-json/carbon': 1.1.7 '@unocss/reset': 0.45.15 - '@vitejs/plugin-vue': 3.1.0_vite@3.0.9+vue@3.2.38 + '@vitejs/plugin-vue': 3.1.0_vite@3.0.9+vue@3.2.39 esno: 0.16.3 fast-glob: 3.2.11 https-localhost: 4.7.1 unocss: 0.45.15_vite@3.0.9 - unplugin-vue-components: 0.22.4_vite@3.0.9+vue@3.2.38 + unplugin-vue-components: 0.22.4_vite@3.0.9+vue@3.2.39 vite: 3.0.9 - vite-plugin-pwa: 0.12.6_f7se6o6eqkwcix4u3svh6mkvda + vite-plugin-pwa: 0.12.6_vite@3.0.9 vitepress: 1.0.0-alpha.13 workbox-window: 6.5.4 @@ -237,7 +237,7 @@ importers: react-dom: 18.0.0_react@18.0.0 devDependencies: '@testing-library/react': 13.3.0_zpnidt7m3osuk7shl3s4oenomq - '@types/node': 18.7.15 + '@types/node': 18.7.16 '@types/react': 18.0.18 '@vitejs/plugin-react': 2.1.0 jsdom: 20.0.0 @@ -494,13 +494,13 @@ importers: vitest: workspace:* vue: latest devDependencies: - '@vitejs/plugin-vue': 3.1.0_vite@3.0.9+vue@3.2.38 - '@vue/test-utils': 2.0.2_vue@3.2.38 + '@vitejs/plugin-vue': 3.1.0_vite@3.0.9+vue@3.2.39 + '@vue/test-utils': 2.0.2_vue@3.2.39 jsdom: 20.0.0 vite: 3.0.9 vite-plugin-ruby: 3.1.2_vite@3.0.9 vitest: link:../../packages/vitest - vue: 3.2.38 + vue: 3.2.39 examples/solid: specifiers: @@ -546,13 +546,13 @@ importers: vitest: workspace:* vue: latest dependencies: - vue: 3.2.38 + vue: 3.2.39 devDependencies: - '@vitejs/plugin-vue': 3.1.0_vite@3.0.9+vue@3.2.38 - '@vue/test-utils': 2.0.2_vue@3.2.38 + '@vitejs/plugin-vue': 3.1.0_vite@3.0.9+vue@3.2.39 + '@vue/test-utils': 2.0.2_vue@3.2.39 jsdom: 20.0.0 unplugin-auto-import: 0.11.2_vite@3.0.9 - unplugin-vue-components: 0.22.4_vite@3.0.9+vue@3.2.38 + unplugin-vue-components: 0.22.4_vite@3.0.9+vue@3.2.39 vite: 3.0.9 vitest: link:../../packages/vitest @@ -565,10 +565,10 @@ importers: vitest: workspace:* vue: latest dependencies: - vue: 3.2.38 + vue: 3.2.39 devDependencies: - '@vitejs/plugin-vue': 3.1.0_vite@3.0.9+vue@3.2.38 - '@vue/test-utils': 2.0.0_vue@3.2.38 + '@vitejs/plugin-vue': 3.1.0_vite@3.0.9+vue@3.2.39 + '@vue/test-utils': 2.0.0_vue@3.2.39 jsdom: 20.0.0 vite: 3.0.9 vitest: link:../../packages/vitest @@ -583,13 +583,13 @@ importers: vitest: workspace:* vue: latest devDependencies: - '@vitejs/plugin-vue': 3.1.0_vite@3.0.9+vue@3.2.38 - '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38 - '@vue/test-utils': 2.0.2_vue@3.2.38 + '@vitejs/plugin-vue': 3.1.0_vite@3.0.9+vue@3.2.39 + '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.39 + '@vue/test-utils': 2.0.2_vue@3.2.39 jsdom: 20.0.0 vite: 3.0.9 vitest: link:../../packages/vitest - vue: 3.2.38 + vue: 3.2.39 examples/vue2: specifiers: @@ -952,12 +952,12 @@ importers: vitest: workspace:* vue: latest devDependencies: - '@vitejs/plugin-vue': 3.1.0_vite@3.0.9+vue@3.2.38 - '@vue/test-utils': 2.0.2_vue@3.2.38 + '@vitejs/plugin-vue': 3.1.0_vite@3.0.9+vue@3.2.39 + '@vue/test-utils': 2.0.2_vue@3.2.39 happy-dom: 6.0.4 vite: 3.0.9 vitest: link:../../packages/vitest - vue: 3.2.38 + vue: 3.2.39 test/css: specifiers: @@ -5635,7 +5635,7 @@ packages: /@types/concat-stream/1.6.1: resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==} dependencies: - '@types/node': 18.7.15 + '@types/node': 18.7.16 dev: true /@types/cookie/0.4.1: @@ -5693,9 +5693,9 @@ packages: dev: true /@types/form-data/0.0.33: - resolution: {integrity: sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=} + resolution: {integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==} dependencies: - '@types/node': 18.7.15 + '@types/node': 18.7.16 dev: true /@types/fs-extra/9.0.13: @@ -5849,6 +5849,10 @@ packages: resolution: {integrity: sha512-XnjpaI8Bgc3eBag2Aw4t2Uj/49lLBSStHWfqKvIuXD7FIrZyMLWp8KuAFHAqxMZYTF9l08N1ctUn9YNybZJVmQ==} dev: true + /@types/node/18.7.16: + resolution: {integrity: sha512-EQHhixfu+mkqHMZl1R2Ovuvn47PUw18azMJOTwSZr9/fhzHNGXAJ0ma0dayRVchprpCj0Kc1K1xKoWaATWF1qg==} + dev: true + /@types/node/8.10.66: resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} dev: true @@ -6406,6 +6410,23 @@ packages: - supports-color dev: true + /@vitejs/plugin-vue-jsx/2.0.1_vite@3.0.9+vue@3.2.39: + resolution: {integrity: sha512-lmiR1k9+lrF7LMczO0pxtQ8mOn6XeppJDHxnpxkJQpT5SiKz4SKhKdeNstXaTNuR8qZhUo5X0pJlcocn72Y4Jg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^3.0.0 + vue: ^3.0.0 + dependencies: + '@babel/core': 7.18.13 + '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.18.13 + '@babel/plugin-transform-typescript': 7.18.12_@babel+core@7.18.13 + '@vue/babel-plugin-jsx': 1.1.1_@babel+core@7.18.13 + vite: 3.0.9 + vue: 3.2.39 + transitivePeerDependencies: + - supports-color + dev: true + /@vitejs/plugin-vue/3.0.3_vite@3.0.9+vue@3.2.38: resolution: {integrity: sha512-U4zNBlz9mg+TA+i+5QPc3N5lQvdUXENZLO2h0Wdzp56gI1MWhqJOv+6R+d4kOzoaSSq6TnGPBdZAXKOe4lXy6g==} engines: {node: ^14.18.0 || >=16.0.0} @@ -6417,7 +6438,7 @@ packages: vue: 3.2.38 dev: true - /@vitejs/plugin-vue/3.1.0_vite@3.0.9+vue@3.2.38: + /@vitejs/plugin-vue/3.1.0_vite@3.0.9+vue@3.2.39: resolution: {integrity: sha512-fmxtHPjSOEIRg6vHYDaem+97iwCUg/uSIaTzp98lhELt2ISOQuDo2hbkBdXod0g15IhfPMQmAxh4heUks2zvDA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -6425,7 +6446,7 @@ packages: vue: ^3.2.25 dependencies: vite: 3.0.9 - vue: 3.2.38 + vue: 3.2.39 dev: true /@vitejs/plugin-vue2/1.1.2_vite@3.0.9+vue@2.7.10: @@ -6467,12 +6488,28 @@ packages: '@vue/shared': 3.2.38 estree-walker: 2.0.2 source-map: 0.6.1 + dev: true + + /@vue/compiler-core/3.2.39: + resolution: {integrity: sha512-mf/36OWXqWn0wsC40nwRRGheR/qoID+lZXbIuLnr4/AngM0ov8Xvv8GHunC0rKRIkh60bTqydlqTeBo49rlbqw==} + dependencies: + '@babel/parser': 7.18.13 + '@vue/shared': 3.2.39 + estree-walker: 2.0.2 + source-map: 0.6.1 /@vue/compiler-dom/3.2.38: resolution: {integrity: sha512-zqX4FgUbw56kzHlgYuEEJR8mefFiiyR3u96498+zWPsLeh1WKvgIReoNE+U7gG8bCUdvsrJ0JRmev0Ky6n2O0g==} dependencies: '@vue/compiler-core': 3.2.38 '@vue/shared': 3.2.38 + dev: true + + /@vue/compiler-dom/3.2.39: + resolution: {integrity: sha512-HMFI25Be1C8vLEEv1hgEO1dWwG9QQ8LTTPmCkblVJY/O3OvWx6r1+zsox5mKPMGvqYEZa6l8j+xgOfUspgo7hw==} + dependencies: + '@vue/compiler-core': 3.2.39 + '@vue/shared': 3.2.39 /@vue/compiler-sfc/2.7.10: resolution: {integrity: sha512-55Shns6WPxlYsz4WX7q9ZJBL77sKE1ZAYNYStLs6GbhIOMrNtjMvzcob6gu3cGlfpCR4bT7NXgyJ3tly2+Hx8Q==} @@ -6494,12 +6531,34 @@ packages: magic-string: 0.25.9 postcss: 8.4.16 source-map: 0.6.1 + dev: true + + /@vue/compiler-sfc/3.2.39: + resolution: {integrity: sha512-fqAQgFs1/BxTUZkd0Vakn3teKUt//J3c420BgnYgEOoVdTwYpBTSXCMJ88GOBCylmUBbtquGPli9tVs7LzsWIA==} + dependencies: + '@babel/parser': 7.18.13 + '@vue/compiler-core': 3.2.39 + '@vue/compiler-dom': 3.2.39 + '@vue/compiler-ssr': 3.2.39 + '@vue/reactivity-transform': 3.2.39 + '@vue/shared': 3.2.39 + estree-walker: 2.0.2 + magic-string: 0.25.9 + postcss: 8.4.16 + source-map: 0.6.1 /@vue/compiler-ssr/3.2.38: resolution: {integrity: sha512-bm9jOeyv1H3UskNm4S6IfueKjUNFmi2kRweFIGnqaGkkRePjwEcfCVqyS3roe7HvF4ugsEkhf4+kIvDhip6XzQ==} dependencies: '@vue/compiler-dom': 3.2.38 '@vue/shared': 3.2.38 + dev: true + + /@vue/compiler-ssr/3.2.39: + resolution: {integrity: sha512-EoGCJ6lincKOZGW+0Ky4WOKsSmqL7hp1ZYgen8M7u/mlvvEQUaO9tKKOy7K43M9U2aA3tPv0TuYYQFrEbK2eFQ==} + dependencies: + '@vue/compiler-dom': 3.2.39 + '@vue/shared': 3.2.39 /@vue/devtools-api/6.2.1: resolution: {integrity: sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ==} @@ -6513,17 +6572,40 @@ packages: '@vue/shared': 3.2.38 estree-walker: 2.0.2 magic-string: 0.25.9 + dev: true + + /@vue/reactivity-transform/3.2.39: + resolution: {integrity: sha512-HGuWu864zStiWs9wBC6JYOP1E00UjMdDWIG5W+FpUx28hV3uz9ODOKVNm/vdOy/Pvzg8+OcANxAVC85WFBbl3A==} + dependencies: + '@babel/parser': 7.18.13 + '@vue/compiler-core': 3.2.39 + '@vue/shared': 3.2.39 + estree-walker: 2.0.2 + magic-string: 0.25.9 /@vue/reactivity/3.2.38: resolution: {integrity: sha512-6L4myYcH9HG2M25co7/BSo0skKFHpAN8PhkNPM4xRVkyGl1K5M3Jx4rp5bsYhvYze2K4+l+pioN4e6ZwFLUVtw==} dependencies: '@vue/shared': 3.2.38 + dev: true + + /@vue/reactivity/3.2.39: + resolution: {integrity: sha512-vlaYX2a3qMhIZfrw3Mtfd+BuU+TZmvDrPMa+6lpfzS9k/LnGxkSuf0fhkP0rMGfiOHPtyKoU9OJJJFGm92beVQ==} + dependencies: + '@vue/shared': 3.2.39 /@vue/runtime-core/3.2.38: resolution: {integrity: sha512-kk0qiSiXUU/IKxZw31824rxmFzrLr3TL6ZcbrxWTKivadoKupdlzbQM4SlGo4MU6Zzrqv4fzyUasTU1jDoEnzg==} dependencies: '@vue/reactivity': 3.2.38 '@vue/shared': 3.2.38 + dev: true + + /@vue/runtime-core/3.2.39: + resolution: {integrity: sha512-xKH5XP57JW5JW+8ZG1khBbuLakINTgPuINKL01hStWLTTGFOrM49UfCFXBcFvWmSbci3gmJyLl2EAzCaZWsx8g==} + dependencies: + '@vue/reactivity': 3.2.39 + '@vue/shared': 3.2.39 /@vue/runtime-dom/3.2.38: resolution: {integrity: sha512-4PKAb/ck2TjxdMSzMsnHViOrrwpudk4/A56uZjhzvusoEU9xqa5dygksbzYepdZeB5NqtRw5fRhWIiQlRVK45A==} @@ -6531,6 +6613,14 @@ packages: '@vue/runtime-core': 3.2.38 '@vue/shared': 3.2.38 csstype: 2.6.20 + dev: true + + /@vue/runtime-dom/3.2.39: + resolution: {integrity: sha512-4G9AEJP+sLhsqf5wXcyKVWQKUhI+iWfy0hWQgea+CpaTD7BR0KdQzvoQdZhwCY6B3oleSyNLkLAQwm0ya/wNoA==} + dependencies: + '@vue/runtime-core': 3.2.39 + '@vue/shared': 3.2.39 + csstype: 2.6.20 /@vue/server-renderer/3.2.38_vue@3.2.38: resolution: {integrity: sha512-pg+JanpbOZ5kEfOZzO2bt02YHd+ELhYP8zPeLU1H0e7lg079NtuuSB8fjLdn58c4Ou8UQ6C1/P+528nXnLPAhA==} @@ -6540,9 +6630,23 @@ packages: '@vue/compiler-ssr': 3.2.38 '@vue/shared': 3.2.38 vue: 3.2.38 + dev: true + + /@vue/server-renderer/3.2.39_vue@3.2.39: + resolution: {integrity: sha512-1yn9u2YBQWIgytFMjz4f/t0j43awKytTGVptfd3FtBk76t1pd8mxbek0G/DrnjJhd2V7mSTb5qgnxMYt8Z5iSQ==} + peerDependencies: + vue: 3.2.39 + dependencies: + '@vue/compiler-ssr': 3.2.39 + '@vue/shared': 3.2.39 + vue: 3.2.39 /@vue/shared/3.2.38: resolution: {integrity: sha512-dTyhTIRmGXBjxJE+skC8tTWCGLCVc4wQgRRLt8+O9p5ewBAjoBwtCAkLPrtToSr1xltoe3st21Pv953aOZ7alg==} + dev: true + + /@vue/shared/3.2.39: + resolution: {integrity: sha512-D3dl2ZB9qE6mTuWPk9RlhDeP1dgNRUKC3NJxji74A4yL8M2MwlhLKUC/49WHjrNzSPug58fWx/yFbaTzGAQSBw==} /@vue/test-utils/1.3.0_42puyn3dcxirnpdjnosl7pbb6a: resolution: {integrity: sha512-Xk2Xiyj2k5dFb8eYUKkcN9PzqZSppTlx7LaQWBbdA8tqh3jHr/KHX2/YLhNFc/xwDrgeLybqd+4ZCPJSGPIqeA==} @@ -6557,20 +6661,20 @@ packages: vue-template-compiler: 2.7.10 dev: true - /@vue/test-utils/2.0.0_vue@3.2.38: + /@vue/test-utils/2.0.0_vue@3.2.39: resolution: {integrity: sha512-zL5kygNq7hONrO1CzaUGprEAklAX+pH8J1MPMCU3Rd2xtSYkZ+PmKU3oEDRg8VAGdL5lNJHzDgrud5amFPtirw==} peerDependencies: vue: ^3.0.1 dependencies: - vue: 3.2.38 + vue: 3.2.39 dev: true - /@vue/test-utils/2.0.2_vue@3.2.38: + /@vue/test-utils/2.0.2_vue@3.2.39: resolution: {integrity: sha512-E2P4oXSaWDqTZNbmKZFVLrNN/siVN78YkEqs7pHryWerrlZR9bBFLWdJwRoguX45Ru6HxIflzKl4vQvwRMwm5g==} peerDependencies: vue: ^3.0.1 dependencies: - vue: 3.2.38 + vue: 3.2.39 dev: true /@vueuse/core/8.9.4: @@ -6600,6 +6704,18 @@ packages: transitivePeerDependencies: - '@vue/composition-api' - vue + dev: true + + /@vueuse/core/9.1.1_vue@3.2.39: + resolution: {integrity: sha512-QfuaNWRDMQcCUwXylCyYhPC3ScS9Tiiz4J0chdwr3vOemBwRToSywq8MP+ZegKYFnbETzRY8G/5zC+ca30wrRQ==} + dependencies: + '@types/web-bluetooth': 0.0.15 + '@vueuse/metadata': 9.1.1 + '@vueuse/shared': 9.1.1_vue@3.2.39 + vue-demi: 0.12.5_vue@3.2.39 + transitivePeerDependencies: + - '@vue/composition-api' + - vue /@vueuse/integrations/8.9.4_axios@0.26.1: resolution: {integrity: sha512-Nk7mH0ThTdiuiiuB+1lyC+5ihnywrr+9h9IA4R4Ry8Mli/cZL38zc3qZWIsCVPm66Lr+7kEp3nnHdSxKi7ivrg==} @@ -6673,6 +6789,15 @@ packages: transitivePeerDependencies: - '@vue/composition-api' - vue + dev: true + + /@vueuse/shared/9.1.1_vue@3.2.39: + resolution: {integrity: sha512-c+IfcOYmHiHqoEa3ED1Tbpue5GHmoUmTp8PtO4YbczthtY155Rt6DmWhjxMLXBF1Bcidagxljmp/7xtAzEHXLw==} + dependencies: + vue-demi: 0.13.11_vue@3.2.39 + transitivePeerDependencies: + - '@vue/composition-api' + - vue /@webassemblyjs/ast/1.11.1: resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==} @@ -18419,7 +18544,7 @@ packages: - webpack dev: true - /unplugin-vue-components/0.22.4_vite@3.0.9+vue@3.2.38: + /unplugin-vue-components/0.22.4_vite@3.0.9+vue@3.2.39: resolution: {integrity: sha512-2rRZcM9OnJGXnYxQNfaceEYuPeVACcWySIjy8WBwIiN3onr980TmA3XE5pRJFt8zoQrUA+c46oyIq96noLqrEQ==} engines: {node: '>=14'} peerDependencies: @@ -18439,7 +18564,7 @@ packages: minimatch: 5.1.0 resolve: 1.22.1 unplugin: 0.9.5_vite@3.0.9 - vue: 3.2.38 + vue: 3.2.39 transitivePeerDependencies: - esbuild - rollup @@ -18717,11 +18842,10 @@ packages: - supports-color dev: true - /vite-plugin-pwa/0.12.6_f7se6o6eqkwcix4u3svh6mkvda: + /vite-plugin-pwa/0.12.6_vite@3.0.9: resolution: {integrity: sha512-qRxx1zUlwKq2QD20nDZVL449wV+dflRVeDMLa2k4LZiHfWRfHWwmdhnDZOlMEgni0Zss1DkhyTmuzLYuO6aO3A==} peerDependencies: vite: ^2.0.0 || ^3.0.0-0 - workbox-window: ^6.4.0 dependencies: debug: 4.3.4 fast-glob: 3.2.11 @@ -18795,13 +18919,13 @@ packages: dependencies: '@docsearch/css': 3.2.1 '@docsearch/js': 3.2.1 - '@vitejs/plugin-vue': 3.1.0_vite@3.0.9+vue@3.2.38 + '@vitejs/plugin-vue': 3.1.0_vite@3.0.9+vue@3.2.39 '@vue/devtools-api': 6.2.1 - '@vueuse/core': 9.1.1_vue@3.2.38 + '@vueuse/core': 9.1.1_vue@3.2.39 body-scroll-lock: 4.0.0-beta.0 shiki: 0.11.1 vite: 3.0.9 - vue: 3.2.38 + vue: 3.2.39 transitivePeerDependencies: - '@algolia/client-search' - '@types/react' @@ -18839,6 +18963,21 @@ packages: optional: true dependencies: vue: 3.2.38 + dev: true + + /vue-demi/0.12.5_vue@3.2.39: + resolution: {integrity: sha512-BREuTgTYlUr0zw0EZn3hnhC3I6gPWv+Kwh4MCih6QcAeaTlaIX0DwOVN0wHej7hSvDPecz4jygy/idsgKfW58Q==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + vue: 3.2.39 /vue-demi/0.13.11: resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==} @@ -18866,6 +19005,21 @@ packages: optional: true dependencies: vue: 3.2.38 + dev: true + + /vue-demi/0.13.11_vue@3.2.39: + resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + vue: 3.2.39 /vue-eslint-parser/9.0.3_eslint@8.23.0: resolution: {integrity: sha512-yL+ZDb+9T0ELG4VIFo/2anAOz8SvBdlqEnQnvJ3M7Scq56DvtjY0VY88bByRZB0D4J0u8olBcfrXTVONXsh4og==} @@ -18924,6 +19078,16 @@ packages: '@vue/runtime-dom': 3.2.38 '@vue/server-renderer': 3.2.38_vue@3.2.38 '@vue/shared': 3.2.38 + dev: true + + /vue/3.2.39: + resolution: {integrity: sha512-tRkguhRTw9NmIPXhzk21YFBqXHT2t+6C6wPOgQ50fcFVWnPdetmRqbmySRHznrYjX2E47u0cGlKGcxKZJ38R/g==} + dependencies: + '@vue/compiler-dom': 3.2.39 + '@vue/compiler-sfc': 3.2.39 + '@vue/runtime-dom': 3.2.39 + '@vue/server-renderer': 3.2.39_vue@3.2.39 + '@vue/shared': 3.2.39 /w3c-hr-time/1.0.2: resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==}